@pierre/diffs 1.5.2 → 1.6.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. package/README.md +4 -3
  2. package/dist/components/CodeView.d.ts.map +1 -1
  3. package/dist/components/CodeView.js +6 -5
  4. package/dist/components/CodeView.js.map +1 -1
  5. package/dist/components/File.d.ts.map +1 -1
  6. package/dist/components/File.js +11 -6
  7. package/dist/components/File.js.map +1 -1
  8. package/dist/components/FileDiff.d.ts.map +1 -1
  9. package/dist/components/FileDiff.js +12 -7
  10. package/dist/components/FileDiff.js.map +1 -1
  11. package/dist/components/FileStream.d.ts +6 -4
  12. package/dist/components/FileStream.d.ts.map +1 -1
  13. package/dist/components/FileStream.js +49 -36
  14. package/dist/components/FileStream.js.map +1 -1
  15. package/dist/constants.d.ts +3 -2
  16. package/dist/constants.d.ts.map +1 -1
  17. package/dist/constants.js +2 -1
  18. package/dist/constants.js.map +1 -1
  19. package/dist/editor/editor.d.ts +2 -1
  20. package/dist/editor/editor.d.ts.map +1 -1
  21. package/dist/editor/editor.js +5 -1
  22. package/dist/editor/editor.js.map +1 -1
  23. package/dist/editor/tokenizer.d.ts +6 -4
  24. package/dist/editor/tokenizer.d.ts.map +1 -1
  25. package/dist/editor/tokenizer.js +25 -470
  26. package/dist/editor/tokenizer.js.map +1 -1
  27. package/dist/highlighter/DiffsEditorTokenizer.d.ts +16 -0
  28. package/dist/highlighter/DiffsEditorTokenizer.d.ts.map +1 -0
  29. package/dist/highlighter/DiffsEditorTokenizer.js +0 -0
  30. package/dist/highlighter/DiffsHighlighter.d.ts +41 -0
  31. package/dist/highlighter/DiffsHighlighter.d.ts.map +1 -0
  32. package/dist/highlighter/DiffsHighlighter.js +39 -0
  33. package/dist/highlighter/DiffsHighlighter.js.map +1 -0
  34. package/dist/highlighter/backends/highlights.d.ts +26 -0
  35. package/dist/highlighter/backends/highlights.d.ts.map +1 -0
  36. package/dist/highlighter/backends/highlights.js +71 -0
  37. package/dist/highlighter/backends/highlights.js.map +1 -0
  38. package/dist/highlighter/backends/shiki.d.ts +27 -0
  39. package/dist/highlighter/backends/shiki.d.ts.map +1 -0
  40. package/dist/highlighter/backends/shiki.js +107 -0
  41. package/dist/highlighter/backends/shiki.js.map +1 -0
  42. package/dist/highlighter/highlighterType.d.ts +13 -0
  43. package/dist/highlighter/highlighterType.d.ts.map +1 -0
  44. package/dist/highlighter/highlighterType.js +32 -0
  45. package/dist/highlighter/highlighterType.js.map +1 -0
  46. package/dist/highlighter/highlights-editor.d.ts +24 -0
  47. package/dist/highlighter/highlights-editor.d.ts.map +1 -0
  48. package/dist/highlighter/highlights-editor.js +166 -0
  49. package/dist/highlighter/highlights-editor.js.map +1 -0
  50. package/dist/highlighter/highlights-stream.d.ts +20 -0
  51. package/dist/highlighter/highlights-stream.d.ts.map +1 -0
  52. package/dist/highlighter/highlights-stream.js +93 -0
  53. package/dist/highlighter/highlights-stream.js.map +1 -0
  54. package/dist/highlighter/languages/areLanguagesAttached.d.ts +2 -1
  55. package/dist/highlighter/languages/areLanguagesAttached.d.ts.map +1 -1
  56. package/dist/highlighter/languages/areLanguagesAttached.js +4 -6
  57. package/dist/highlighter/languages/areLanguagesAttached.js.map +1 -1
  58. package/dist/highlighter/languages/attachResolvedLanguages.d.ts +6 -1
  59. package/dist/highlighter/languages/attachResolvedLanguages.d.ts.map +1 -1
  60. package/dist/highlighter/languages/attachResolvedLanguages.js +6 -11
  61. package/dist/highlighter/languages/attachResolvedLanguages.js.map +1 -1
  62. package/dist/highlighter/languages/constants.d.ts +1 -1
  63. package/dist/highlighter/languages/getResolvedLanguages.d.ts +1 -1
  64. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts +1 -1
  65. package/dist/highlighter/languages/resolveLanguage.d.ts +1 -1
  66. package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -1
  67. package/dist/highlighter/languages/resolveLanguage.js +19 -16
  68. package/dist/highlighter/languages/resolveLanguage.js.map +1 -1
  69. package/dist/highlighter/languages/resolveLanguages.d.ts +1 -1
  70. package/dist/highlighter/shared_highlighter.d.ts +23 -9
  71. package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
  72. package/dist/highlighter/shared_highlighter.js +59 -47
  73. package/dist/highlighter/shared_highlighter.js.map +1 -1
  74. package/dist/highlighter/shiki-editor.d.ts +25 -0
  75. package/dist/highlighter/shiki-editor.d.ts.map +1 -0
  76. package/dist/highlighter/shiki-editor.js +483 -0
  77. package/dist/highlighter/shiki-editor.js.map +1 -0
  78. package/dist/highlighter/shiki-stream.d.ts +20 -0
  79. package/dist/highlighter/shiki-stream.d.ts.map +1 -0
  80. package/dist/highlighter/shiki-stream.js +60 -0
  81. package/dist/highlighter/shiki-stream.js.map +1 -0
  82. package/dist/highlighter/stream-tokenizer.d.ts +40 -0
  83. package/dist/highlighter/stream-tokenizer.d.ts.map +1 -0
  84. package/dist/highlighter/stream-tokenizer.js +70 -0
  85. package/dist/highlighter/stream-tokenizer.js.map +1 -0
  86. package/dist/highlighter/themes/areThemesAttached.d.ts +3 -2
  87. package/dist/highlighter/themes/areThemesAttached.d.ts.map +1 -1
  88. package/dist/highlighter/themes/areThemesAttached.js +5 -4
  89. package/dist/highlighter/themes/areThemesAttached.js.map +1 -1
  90. package/dist/highlighter/themes/attachResolvedThemes.d.ts +5 -2
  91. package/dist/highlighter/themes/attachResolvedThemes.d.ts.map +1 -1
  92. package/dist/highlighter/themes/attachResolvedThemes.js +4 -16
  93. package/dist/highlighter/themes/attachResolvedThemes.js.map +1 -1
  94. package/dist/highlighter/themes/cleanUpResolvedThemes.d.ts +3 -1
  95. package/dist/highlighter/themes/cleanUpResolvedThemes.d.ts.map +1 -1
  96. package/dist/highlighter/themes/cleanUpResolvedThemes.js +8 -5
  97. package/dist/highlighter/themes/cleanUpResolvedThemes.js.map +1 -1
  98. package/dist/highlighter/themes/createCSSVariablesTheme.d.ts +7 -0
  99. package/dist/highlighter/themes/createCSSVariablesTheme.d.ts.map +1 -0
  100. package/dist/highlighter/themes/createCSSVariablesTheme.js +89 -0
  101. package/dist/highlighter/themes/createCSSVariablesTheme.js.map +1 -0
  102. package/dist/highlighter/themes/createCachedLoader.d.ts +5 -0
  103. package/dist/highlighter/themes/createCachedLoader.d.ts.map +1 -0
  104. package/dist/highlighter/themes/createCachedLoader.js +15 -0
  105. package/dist/highlighter/themes/createCachedLoader.js.map +1 -0
  106. package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts +3 -2
  107. package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts.map +1 -1
  108. package/dist/highlighter/themes/getResolvedOrResolveTheme.js +4 -4
  109. package/dist/highlighter/themes/getResolvedOrResolveTheme.js.map +1 -1
  110. package/dist/highlighter/themes/getResolvedThemes.d.ts +3 -2
  111. package/dist/highlighter/themes/getResolvedThemes.d.ts.map +1 -1
  112. package/dist/highlighter/themes/getResolvedThemes.js +4 -3
  113. package/dist/highlighter/themes/getResolvedThemes.js.map +1 -1
  114. package/dist/highlighter/themes/hasResolvedThemes.d.ts +2 -2
  115. package/dist/highlighter/themes/hasResolvedThemes.d.ts.map +1 -1
  116. package/dist/highlighter/themes/hasResolvedThemes.js +4 -3
  117. package/dist/highlighter/themes/hasResolvedThemes.js.map +1 -1
  118. package/dist/highlighter/themes/registerCustomCSSVariableTheme.d.ts.map +1 -1
  119. package/dist/highlighter/themes/registerCustomCSSVariableTheme.js +3 -3
  120. package/dist/highlighter/themes/registerCustomCSSVariableTheme.js.map +1 -1
  121. package/dist/highlighter/themes/registerCustomTheme.d.ts +9 -4
  122. package/dist/highlighter/themes/registerCustomTheme.d.ts.map +1 -1
  123. package/dist/highlighter/themes/registerCustomTheme.js +8 -16
  124. package/dist/highlighter/themes/registerCustomTheme.js.map +1 -1
  125. package/dist/highlighter/themes/resolveTheme.d.ts +3 -2
  126. package/dist/highlighter/themes/resolveTheme.d.ts.map +1 -1
  127. package/dist/highlighter/themes/resolveTheme.js +4 -7
  128. package/dist/highlighter/themes/resolveTheme.js.map +1 -1
  129. package/dist/highlighter/themes/resolveThemes.d.ts +3 -2
  130. package/dist/highlighter/themes/resolveThemes.d.ts.map +1 -1
  131. package/dist/highlighter/themes/resolveThemes.js +4 -7
  132. package/dist/highlighter/themes/resolveThemes.js.map +1 -1
  133. package/dist/highlighter/themes/themeResolver.d.ts +10 -4
  134. package/dist/highlighter/themes/themeResolver.d.ts.map +1 -1
  135. package/dist/highlighter/themes/themeResolver.js +141 -2
  136. package/dist/highlighter/themes/themeResolver.js.map +1 -1
  137. package/dist/highlighter/themes/types.d.ts +23 -0
  138. package/dist/highlighter/themes/types.d.ts.map +1 -0
  139. package/dist/highlighter/themes/types.js +0 -0
  140. package/dist/highlighter/tokenizer-types.d.ts +35 -0
  141. package/dist/highlighter/tokenizer-types.d.ts.map +1 -0
  142. package/dist/highlighter/tokenizer-types.js +0 -0
  143. package/dist/highlighter/types.d.ts +55 -0
  144. package/dist/highlighter/types.d.ts.map +1 -0
  145. package/dist/highlighter/types.js +0 -0
  146. package/dist/index.d.ts +14 -10
  147. package/dist/index.js +16 -18
  148. package/dist/managers/InteractionManager.d.ts.map +1 -1
  149. package/dist/managers/InteractionManager.js +2 -2
  150. package/dist/managers/InteractionManager.js.map +1 -1
  151. package/dist/node_modules/.pnpm/@types_hast@3.0.4/node_modules/@types/hast/index.d.ts +9 -1
  152. package/dist/node_modules/.pnpm/@types_hast@3.0.4/node_modules/@types/hast/index.d.ts.map +1 -1
  153. package/dist/react/CodeView.js +1 -1
  154. package/dist/react/index.d.ts +8 -3
  155. package/dist/renderers/DiffHunksRenderer.d.ts +2 -1
  156. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  157. package/dist/renderers/DiffHunksRenderer.js +31 -22
  158. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  159. package/dist/renderers/FileRenderer.d.ts +2 -1
  160. package/dist/renderers/FileRenderer.d.ts.map +1 -1
  161. package/dist/renderers/FileRenderer.js +33 -24
  162. package/dist/renderers/FileRenderer.js.map +1 -1
  163. package/dist/shiki-stream/index.d.ts +3 -3
  164. package/dist/shiki-stream/index.js +1 -2
  165. package/dist/shiki-stream/stream.d.ts +4 -4
  166. package/dist/shiki-stream/stream.d.ts.map +1 -1
  167. package/dist/shiki-stream/stream.js +20 -9
  168. package/dist/shiki-stream/stream.js.map +1 -1
  169. package/dist/shiki-stream/types.d.ts +7 -38
  170. package/dist/shiki-stream/types.d.ts.map +1 -1
  171. package/dist/ssr/FileDiffReact.js +1 -1
  172. package/dist/ssr/index.d.ts +7 -2
  173. package/dist/ssr/renderHTML.js +2 -2
  174. package/dist/ssr/renderHTML.js.map +1 -1
  175. package/dist/style.js +1 -1
  176. package/dist/style.js.map +1 -1
  177. package/dist/types.d.ts +10 -11
  178. package/dist/types.d.ts.map +1 -1
  179. package/dist/utils/createSpanNodeFromToken.d.ts +3 -2
  180. package/dist/utils/createSpanNodeFromToken.d.ts.map +1 -1
  181. package/dist/utils/createSpanNodeFromToken.js +4 -5
  182. package/dist/utils/createSpanNodeFromToken.js.map +1 -1
  183. package/dist/utils/cssWrappers.d.ts.map +1 -1
  184. package/dist/utils/cssWrappers.js +12 -0
  185. package/dist/utils/cssWrappers.js.map +1 -1
  186. package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
  187. package/dist/utils/getHighlighterOptions.js +3 -2
  188. package/dist/utils/getHighlighterOptions.js.map +1 -1
  189. package/dist/utils/getHighlighterThemeStyles.d.ts +2 -1
  190. package/dist/utils/getHighlighterThemeStyles.d.ts.map +1 -1
  191. package/dist/utils/getHighlighterThemeStyles.js +13 -3
  192. package/dist/utils/getHighlighterThemeStyles.js.map +1 -1
  193. package/dist/utils/getTokenOptions.d.ts +7 -0
  194. package/dist/utils/getTokenOptions.d.ts.map +1 -0
  195. package/dist/utils/getTokenOptions.js +16 -0
  196. package/dist/utils/getTokenOptions.js.map +1 -0
  197. package/dist/utils/hastToHtml.d.ts +10 -0
  198. package/dist/utils/hastToHtml.d.ts.map +1 -0
  199. package/dist/utils/hastToHtml.js +125 -0
  200. package/dist/utils/hastToHtml.js.map +1 -0
  201. package/dist/utils/parseDiffDecorations.d.ts +2 -1
  202. package/dist/utils/parseDiffDecorations.d.ts.map +1 -1
  203. package/dist/utils/renderDiffWithHighlighter.d.ts +3 -2
  204. package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
  205. package/dist/utils/renderDiffWithHighlighter.js +33 -48
  206. package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
  207. package/dist/utils/renderFileWithHighlighter.d.ts +3 -2
  208. package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
  209. package/dist/utils/renderFileWithHighlighter.js +10 -26
  210. package/dist/utils/renderFileWithHighlighter.js.map +1 -1
  211. package/dist/utils/renderTokenLines.d.ts +17 -0
  212. package/dist/utils/renderTokenLines.d.ts.map +1 -0
  213. package/dist/utils/renderTokenLines.js +246 -0
  214. package/dist/utils/renderTokenLines.js.map +1 -0
  215. package/dist/utils/resolvePreferredHighlighter.d.ts +13 -0
  216. package/dist/utils/resolvePreferredHighlighter.d.ts.map +1 -0
  217. package/dist/utils/resolvePreferredHighlighter.js +11 -0
  218. package/dist/utils/resolvePreferredHighlighter.js.map +1 -0
  219. package/dist/utils/setDeferredArrayItem.d.ts +5 -0
  220. package/dist/utils/setDeferredArrayItem.d.ts.map +1 -0
  221. package/dist/utils/setDeferredArrayItem.js +39 -0
  222. package/dist/utils/setDeferredArrayItem.js.map +1 -0
  223. package/dist/utils/tokenStyle.d.ts +7 -0
  224. package/dist/utils/tokenStyle.d.ts.map +1 -0
  225. package/dist/utils/tokenStyle.js +28 -0
  226. package/dist/utils/tokenStyle.js.map +1 -0
  227. package/dist/utils/tokensToHtml.d.ts +8 -0
  228. package/dist/utils/tokensToHtml.d.ts.map +1 -0
  229. package/dist/utils/tokensToHtml.js +45 -0
  230. package/dist/utils/tokensToHtml.js.map +1 -0
  231. package/dist/utils/wrapTokenFragments.js.map +1 -1
  232. package/dist/worker/WorkerPoolManager.d.ts +2 -2
  233. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  234. package/dist/worker/WorkerPoolManager.js +56 -46
  235. package/dist/worker/WorkerPoolManager.js.map +1 -1
  236. package/dist/worker/hastLinesTransport.d.ts +14 -0
  237. package/dist/worker/hastLinesTransport.d.ts.map +1 -0
  238. package/dist/worker/hastLinesTransport.js +156 -0
  239. package/dist/worker/hastLinesTransport.js.map +1 -0
  240. package/dist/worker/highlights-sAHlxqlf.js +317 -0
  241. package/dist/worker/highlights-sAHlxqlf.js.map +1 -0
  242. package/dist/worker/index.d.ts +1 -1
  243. package/dist/worker/shiki-Bx2JpdqZ.js +697 -0
  244. package/dist/worker/shiki-Bx2JpdqZ.js.map +1 -0
  245. package/dist/worker/stream-tokenizer-YZ6M1qSx.js +424 -0
  246. package/dist/worker/stream-tokenizer-YZ6M1qSx.js.map +1 -0
  247. package/dist/worker/types.d.ts +5 -3
  248. package/dist/worker/types.d.ts.map +1 -1
  249. package/dist/worker/worker-portable.js +41 -13337
  250. package/dist/worker/worker-portable.js.map +1 -1
  251. package/dist/worker/worker.js +672 -349
  252. package/dist/worker/worker.js.map +1 -1
  253. package/dist/worker/workerMessage.d.ts +24 -0
  254. package/dist/worker/workerMessage.d.ts.map +1 -0
  255. package/dist/worker/workerMessage.js +0 -0
  256. package/package.json +33 -29
  257. package/dist/highlighter/themes/constants.d.ts +0 -5
  258. package/dist/highlighter/themes/constants.d.ts.map +0 -1
  259. package/dist/highlighter/themes/constants.js +0 -6
  260. package/dist/highlighter/themes/constants.js.map +0 -1
  261. package/dist/highlighter/themes/themeResolution.d.ts +0 -7
  262. package/dist/highlighter/themes/themeResolution.d.ts.map +0 -1
  263. package/dist/highlighter/themes/themeResolution.js +0 -21
  264. package/dist/highlighter/themes/themeResolution.js.map +0 -1
  265. package/dist/shiki-stream/tokenizer.d.ts +0 -23
  266. package/dist/shiki-stream/tokenizer.d.ts.map +0 -1
  267. package/dist/shiki-stream/tokenizer.js +0 -72
  268. package/dist/shiki-stream/tokenizer.js.map +0 -1
  269. package/dist/utils/createTransformerWithState.d.ts +0 -12
  270. package/dist/utils/createTransformerWithState.d.ts.map +0 -1
  271. package/dist/utils/createTransformerWithState.js +0 -89
  272. package/dist/utils/createTransformerWithState.js.map +0 -1
  273. package/dist/worker/wasm-B9ZqxnKj.js +0 -8
  274. package/dist/worker/wasm-B9ZqxnKj.js.map +0 -1
@@ -21,7 +21,19 @@ function wrapThemeCSS(themeCSS, themeType = "system", scrollbarGutter) {
21
21
  const colorSchemeRule = themeType === "system" ? "" : `
22
22
  color-scheme: ${themeType};`;
23
23
  const scrollbarGutterVar = createMeasuredScrollbarGutterDeclaration(scrollbarGutter);
24
+ const tokenFontStyles = (themeType === "system" ? ["light", "dark"] : [themeType]).map((type) => {
25
+ const styles = `
26
+ [data-line] span, [data-edit-prediction-suffix] span {
27
+ font-weight: var(--diffs-token-${type}-font-weight, inherit);
28
+ font-style: var(--diffs-token-${type}-font-style, inherit);
29
+ text-decoration: var(--diffs-token-${type}-text-decoration, inherit);
30
+ }`;
31
+ return themeType === "system" && type === "dark" ? `@media (prefers-color-scheme: dark) {${styles}\n}` : styles;
32
+ }).join("\n");
24
33
  return `${LAYER_ORDER}
34
+ @layer base {
35
+ ${tokenFontStyles}
36
+ }
25
37
  @layer rendered {
26
38
  :host {${colorSchemeRule}
27
39
  ${scrollbarGutterVar}
@@ -1 +1 @@
1
- {"version":3,"file":"cssWrappers.js","names":["rawStyles"],"sources":["../../src/utils/cssWrappers.ts"],"sourcesContent":["import { DIFFS_SCROLLBAR_GUTTER_MEASURED_PROPERTY } from '../constants';\nimport rawStyles from '../style.css?inline';\nimport type { ThemeTypes } from '../types';\nimport { createMeasuredScrollbarGutterDeclaration } from './scrollbarGutter';\n\nconst LAYER_ORDER = `@layer base, theme, rendered, unsafe;`;\nconst SCROLLBAR_GUTTER_DECLARATION_PATTERN = new RegExp(\n `${escapeRegExp(DIFFS_SCROLLBAR_GUTTER_MEASURED_PROPERTY)}\\\\s*:\\\\s*[^;]+;`\n);\n\nexport function wrapCoreCSS(mainCSS: string) {\n return `${LAYER_ORDER}\n${rawStyles}\n@layer theme {\n ${mainCSS}\n}`;\n}\n\nexport function wrapUnsafeCSS(unsafeCSS: string) {\n return `${LAYER_ORDER}\n@layer unsafe {\n ${unsafeCSS}\n}`;\n}\n\nexport function wrapThemeCSS(\n themeCSS: string,\n themeType: ThemeTypes = 'system',\n scrollbarGutter?: number\n) {\n const colorSchemeRule =\n themeType === 'system'\n ? ''\n : `\n color-scheme: ${themeType};`;\n const scrollbarGutterVar =\n createMeasuredScrollbarGutterDeclaration(scrollbarGutter);\n\n return `${LAYER_ORDER}\n@layer rendered {\n :host {${colorSchemeRule}\n ${scrollbarGutterVar}\n ${themeCSS}\n }\n}`;\n}\n\nexport function patchScrollbarGutterSize(\n themeCSS: string,\n scrollbarGutter: number | undefined\n): string {\n const scrollbarGutterRule =\n createMeasuredScrollbarGutterDeclaration(scrollbarGutter);\n return themeCSS.replace(\n SCROLLBAR_GUTTER_DECLARATION_PATTERN,\n scrollbarGutterRule\n );\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n"],"mappings":";;;;AAKA,MAAM,cAAc;AACpB,MAAM,uCAAuC,IAAI,OAC/C,GAAG,aAAa,wCAAwC,EAAE,gBAC5D;AAEA,SAAgB,YAAY,SAAiB;CAC3C,OAAO,GAAG,YAAY;EACtBA,cAAU;;IAER,QAAQ;;AAEZ;AAEA,SAAgB,cAAc,WAAmB;CAC/C,OAAO,GAAG,YAAY;;IAEpB,UAAU;;AAEd;AAEA,SAAgB,aACd,UACA,YAAwB,UACxB,iBACA;CACA,MAAM,kBACJ,cAAc,WACV,KACA;kBACU,UAAU;CAC1B,MAAM,qBACJ,yCAAyC,eAAe;CAE1D,OAAO,GAAG,YAAY;;WAEb,gBAAgB;IACvB,mBAAmB;IACnB,SAAS;;;AAGb;AAEA,SAAgB,yBACd,UACA,iBACQ;CACR,MAAM,sBACJ,yCAAyC,eAAe;CAC1D,OAAO,SAAS,QACd,sCACA,mBACF;AACF;AAEA,SAAS,aAAa,OAAuB;CAC3C,OAAO,MAAM,QAAQ,uBAAuB,MAAM;AACpD"}
1
+ {"version":3,"file":"cssWrappers.js","names":["rawStyles"],"sources":["../../src/utils/cssWrappers.ts"],"sourcesContent":["import { DIFFS_SCROLLBAR_GUTTER_MEASURED_PROPERTY } from '../constants';\nimport rawStyles from '../style.css?inline';\nimport type { ThemeTypes } from '../types';\nimport { createMeasuredScrollbarGutterDeclaration } from './scrollbarGutter';\n\nconst LAYER_ORDER = `@layer base, theme, rendered, unsafe;`;\nconst SCROLLBAR_GUTTER_DECLARATION_PATTERN = new RegExp(\n `${escapeRegExp(DIFFS_SCROLLBAR_GUTTER_MEASURED_PROPERTY)}\\\\s*:\\\\s*[^;]+;`\n);\n\nexport function wrapCoreCSS(mainCSS: string) {\n return `${LAYER_ORDER}\n${rawStyles}\n@layer theme {\n ${mainCSS}\n}`;\n}\n\nexport function wrapUnsafeCSS(unsafeCSS: string) {\n return `${LAYER_ORDER}\n@layer unsafe {\n ${unsafeCSS}\n}`;\n}\n\nexport function wrapThemeCSS(\n themeCSS: string,\n themeType: ThemeTypes = 'system',\n scrollbarGutter?: number\n) {\n const colorSchemeRule =\n themeType === 'system'\n ? ''\n : `\n color-scheme: ${themeType};`;\n const scrollbarGutterVar =\n createMeasuredScrollbarGutterDeclaration(scrollbarGutter);\n const tokenFontStyles = (\n themeType === 'system' ? ['light', 'dark'] : [themeType]\n )\n .map((type) => {\n const styles = `\n [data-line] span, [data-edit-prediction-suffix] span {\n font-weight: var(--diffs-token-${type}-font-weight, inherit);\n font-style: var(--diffs-token-${type}-font-style, inherit);\n text-decoration: var(--diffs-token-${type}-text-decoration, inherit);\n }`;\n return themeType === 'system' && type === 'dark'\n ? `@media (prefers-color-scheme: dark) {${styles}\\n}`\n : styles;\n })\n .join('\\n');\n\n return `${LAYER_ORDER}\n@layer base {\n ${tokenFontStyles}\n}\n@layer rendered {\n :host {${colorSchemeRule}\n ${scrollbarGutterVar}\n ${themeCSS}\n }\n}`;\n}\n\nexport function patchScrollbarGutterSize(\n themeCSS: string,\n scrollbarGutter: number | undefined\n): string {\n const scrollbarGutterRule =\n createMeasuredScrollbarGutterDeclaration(scrollbarGutter);\n return themeCSS.replace(\n SCROLLBAR_GUTTER_DECLARATION_PATTERN,\n scrollbarGutterRule\n );\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n"],"mappings":";;;;AAKA,MAAM,cAAc;AACpB,MAAM,uCAAuC,IAAI,OAC/C,GAAG,aAAa,wCAAwC,EAAE,gBAC5D;AAEA,SAAgB,YAAY,SAAiB;CAC3C,OAAO,GAAG,YAAY;EACtBA,cAAU;;IAER,QAAQ;;AAEZ;AAEA,SAAgB,cAAc,WAAmB;CAC/C,OAAO,GAAG,YAAY;;IAEpB,UAAU;;AAEd;AAEA,SAAgB,aACd,UACA,YAAwB,UACxB,iBACA;CACA,MAAM,kBACJ,cAAc,WACV,KACA;kBACU,UAAU;CAC1B,MAAM,qBACJ,yCAAyC,eAAe;CAC1D,MAAM,mBACJ,cAAc,WAAW,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,EAAA,CAEtD,KAAK,SAAS;EACb,MAAM,SAAS;;qCAEgB,KAAK;oCACN,KAAK;yCACA,KAAK;;EAExC,OAAO,cAAc,YAAY,SAAS,SACtC,wCAAwC,OAAO,OAC/C;CACN,CAAC,CAAC,CACD,KAAK,IAAI;CAEZ,OAAO,GAAG,YAAY;;IAEpB,gBAAgB;;;WAGT,gBAAgB;IACvB,mBAAmB;IACnB,SAAS;;;AAGb;AAEA,SAAgB,yBACd,UACA,iBACQ;CACR,MAAM,sBACJ,yCAAyC,eAAe;CAC1D,OAAO,SAAS,QACd,sCACA,mBACF;AACF;AAEA,SAAS,aAAa,OAAuB;CAC3C,OAAO,MAAM,QAAQ,uBAAuB,MAAM;AACpD"}
@@ -1 +1 @@
1
- {"version":3,"file":"getHighlighterOptions.d.ts","names":[],"sources":["../../src/utils/getHighlighterOptions.ts"],"mappings":";;UAQU;EACR,QAAQ,kBAAkB;EAC1B,uBAAuB;;UAGf;EACR,OAAO;EACP,QAAQ;EACR,sBAAsB;;iBAGR,sBACd,MAAM,qBAAqB,oCACzB,OAAO,wBAAqC,0BAC7C"}
1
+ {"version":3,"file":"getHighlighterOptions.d.ts","names":[],"sources":["../../src/utils/getHighlighterOptions.ts"],"mappings":";;UASU;EACR,QAAQ,kBAAkB;EAC1B,uBAAuB;;UAGf;EACR,OAAO;EACP,QAAQ;EACR,sBAAsB;;iBAGR,sBACd,MAAM,qBAAqB,oCACzB,OAAO,wBAAwB,0BAChC"}
@@ -1,10 +1,11 @@
1
+ import { resolveHighlighterType } from "../highlighter/highlighterType.js";
1
2
  import { getThemes } from "./getThemes.js";
2
3
  //#region src/utils/getHighlighterOptions.ts
3
- function getHighlighterOptions(lang, { theme, preferredHighlighter = "shiki-js" }) {
4
+ function getHighlighterOptions(lang, { theme, preferredHighlighter }) {
4
5
  return {
5
6
  langs: Array.isArray(lang) ? lang : [lang ?? "text"],
6
7
  themes: getThemes(theme),
7
- preferredHighlighter
8
+ preferredHighlighter: resolveHighlighterType(preferredHighlighter)
8
9
  };
9
10
  }
10
11
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"getHighlighterOptions.js","names":[],"sources":["../../src/utils/getHighlighterOptions.ts"],"sourcesContent":["import type {\n DiffsThemeNames,\n HighlighterTypes,\n SupportedLanguages,\n ThemesType,\n} from '../types';\nimport { getThemes } from './getThemes';\n\ninterface HighlighterOptionsShape {\n theme?: DiffsThemeNames | ThemesType;\n preferredHighlighter?: HighlighterTypes;\n}\n\ninterface GetHighlighterOptionsReturn {\n langs: SupportedLanguages[];\n themes: DiffsThemeNames[];\n preferredHighlighter: HighlighterTypes;\n}\n\nexport function getHighlighterOptions(\n lang: SupportedLanguages | SupportedLanguages[] | undefined,\n { theme, preferredHighlighter = 'shiki-js' }: HighlighterOptionsShape\n): GetHighlighterOptionsReturn {\n return {\n langs: Array.isArray(lang) ? lang : [lang ?? 'text'],\n themes: getThemes(theme),\n preferredHighlighter,\n };\n}\n"],"mappings":";;AAmBA,SAAgB,sBACd,MACA,EAAE,OAAO,uBAAuB,cACH;CAC7B,OAAO;EACL,OAAO,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,QAAQ,MAAM;EACnD,QAAQ,UAAU,KAAK;EACvB;CACF;AACF"}
1
+ {"version":3,"file":"getHighlighterOptions.js","names":[],"sources":["../../src/utils/getHighlighterOptions.ts"],"sourcesContent":["import { resolveHighlighterType } from '../highlighter/highlighterType';\nimport type {\n DiffsThemeNames,\n HighlighterTypes,\n SupportedLanguages,\n ThemesType,\n} from '../types';\nimport { getThemes } from './getThemes';\n\ninterface HighlighterOptionsShape {\n theme?: DiffsThemeNames | ThemesType;\n preferredHighlighter?: HighlighterTypes;\n}\n\ninterface GetHighlighterOptionsReturn {\n langs: SupportedLanguages[];\n themes: DiffsThemeNames[];\n preferredHighlighter: HighlighterTypes;\n}\n\nexport function getHighlighterOptions(\n lang: SupportedLanguages | SupportedLanguages[] | undefined,\n { theme, preferredHighlighter }: HighlighterOptionsShape\n): GetHighlighterOptionsReturn {\n return {\n langs: Array.isArray(lang) ? lang : [lang ?? 'text'],\n themes: getThemes(theme),\n preferredHighlighter: resolveHighlighterType(preferredHighlighter),\n };\n}\n"],"mappings":";;;AAoBA,SAAgB,sBACd,MACA,EAAE,OAAO,wBACoB;CAC7B,OAAO;EACL,OAAO,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,QAAQ,MAAM;EACnD,QAAQ,UAAU,KAAK;EACvB,sBAAsB,uBAAuB,oBAAoB;CACnE;AACF"}
@@ -1,4 +1,5 @@
1
- import { DiffsHighlighter, DiffsThemeNames, ThemesType } from "../types.js";
1
+ import { DiffsHighlighter } from "../highlighter/DiffsHighlighter.js";
2
+ import { DiffsThemeNames, ThemesType } from "../types.js";
2
3
  //#region src/utils/getHighlighterThemeStyles.d.ts
3
4
  interface GetHighlighterThemeStylesProps {
4
5
  theme?: DiffsThemeNames | ThemesType;
@@ -1 +1 @@
1
- {"version":3,"file":"getHighlighterThemeStyles.d.ts","names":[],"sources":["../../src/utils/getHighlighterThemeStyles.ts"],"mappings":";;UAWU;EACR,QAAQ,kBAAkB;EAC1B,aAAa;EACb;;iBAac,4BACd,OACA,aACA,UACC"}
1
+ {"version":3,"file":"getHighlighterThemeStyles.d.ts","names":[],"sources":["../../src/utils/getHighlighterThemeStyles.ts"],"mappings":";;;UAWU;EACR,QAAQ,kBAAkB;EAC1B,aAAa;EACb;;iBAGc,4BACd,OACA,aACA,UACC"}
@@ -6,7 +6,7 @@ function getHighlighterThemeStyles({ theme = DEFAULT_THEMES, highlighter, prefix
6
6
  let styles = "";
7
7
  if (typeof theme === "string") {
8
8
  const themeData = highlighter.getTheme(theme);
9
- const normalized = normalizeThemeColors(themeData);
9
+ const normalized = getThemeColors(themeData, highlighter);
10
10
  styles += `color:${normalized.fg};`;
11
11
  styles += `background-color:${normalized.bg};`;
12
12
  styles += `${formatCSSVariablePrefix("global")}fg:${normalized.fg};`;
@@ -14,18 +14,28 @@ function getHighlighterThemeStyles({ theme = DEFAULT_THEMES, highlighter, prefix
14
14
  styles += getGitVariables(themeData, prefix);
15
15
  } else {
16
16
  let themeData = highlighter.getTheme(theme.dark);
17
- let normalized = normalizeThemeColors(themeData);
17
+ let normalized = getThemeColors(themeData, highlighter);
18
18
  styles += `${formatCSSVariablePrefix("global")}dark:${normalized.fg};`;
19
19
  styles += `${formatCSSVariablePrefix("global")}dark-bg:${normalized.bg};`;
20
20
  styles += getGitVariables(themeData, "dark");
21
21
  themeData = highlighter.getTheme(theme.light);
22
- normalized = normalizeThemeColors(themeData);
22
+ normalized = getThemeColors(themeData, highlighter);
23
23
  styles += `${formatCSSVariablePrefix("global")}light:${normalized.fg};`;
24
24
  styles += `${formatCSSVariablePrefix("global")}light-bg:${normalized.bg};`;
25
25
  styles += getGitVariables(themeData, "light");
26
26
  }
27
27
  return styles;
28
28
  }
29
+ function getThemeColors(theme, highlighter) {
30
+ if (highlighter.name === "highlights" && theme.zed?.cssVariables === true) {
31
+ const prefix = formatCSSVariablePrefix("token");
32
+ return {
33
+ fg: `var(${prefix}foreground)`,
34
+ bg: `var(${prefix}background)`
35
+ };
36
+ }
37
+ return normalizeThemeColors(theme);
38
+ }
29
39
  function getGitVariables(themeData, modePrefix) {
30
40
  modePrefix = modePrefix != null ? `${modePrefix}-` : "";
31
41
  let styles = "";
@@ -1 +1 @@
1
- {"version":3,"file":"getHighlighterThemeStyles.js","names":[],"sources":["../../src/utils/getHighlighterThemeStyles.ts"],"sourcesContent":["import { normalizeThemeColors } from '@pierre/theming/color';\n\nimport { DEFAULT_THEMES } from '../constants';\nimport type {\n DiffsHighlighter,\n DiffsThemeNames,\n ThemeRegistrationResolved,\n ThemesType,\n} from '../types';\nimport { formatCSSVariablePrefix } from './formatCSSVariablePrefix';\n\ninterface GetHighlighterThemeStylesProps {\n theme?: DiffsThemeNames | ThemesType;\n highlighter: DiffsHighlighter;\n prefix?: string;\n}\n\n// FIXME(amadeus): We'll probably need to\n// re-think this when it comes to removing inline\n// styles\n//\n// The base foreground/background now flow through @pierre/theming's\n// normalizeThemeColors, which preserves the theme's top-level fg/bg. The git\n// colors deliberately stay on the diffs-local 2-link lookup below (see\n// getGitVariables) to keep this output byte-identical; adopting\n// normalizeThemeColors' longer git chain is a separate, independently verified\n// follow-up rather than a side effect of this migration.\nexport function getHighlighterThemeStyles({\n theme = DEFAULT_THEMES,\n highlighter,\n prefix,\n}: GetHighlighterThemeStylesProps): string {\n let styles = '';\n if (typeof theme === 'string') {\n const themeData = highlighter.getTheme(theme);\n const normalized = normalizeThemeColors(themeData);\n styles += `color:${normalized.fg};`;\n styles += `background-color:${normalized.bg};`;\n styles += `${formatCSSVariablePrefix('global')}fg:${normalized.fg};`;\n styles += `${formatCSSVariablePrefix('global')}bg:${normalized.bg};`;\n styles += getGitVariables(themeData, prefix);\n } else {\n let themeData = highlighter.getTheme(theme.dark);\n let normalized = normalizeThemeColors(themeData);\n styles += `${formatCSSVariablePrefix('global')}dark:${normalized.fg};`;\n styles += `${formatCSSVariablePrefix('global')}dark-bg:${normalized.bg};`;\n styles += getGitVariables(themeData, 'dark');\n\n themeData = highlighter.getTheme(theme.light);\n normalized = normalizeThemeColors(themeData);\n styles += `${formatCSSVariablePrefix('global')}light:${normalized.fg};`;\n styles += `${formatCSSVariablePrefix('global')}light-bg:${normalized.bg};`;\n styles += getGitVariables(themeData, 'light');\n }\n return styles;\n}\n\n// Emits the diffs git-status CSS variables (addition/deletion/modified colors)\n// for a resolved theme. This intentionally uses the diffs-local 2-link lookup\n// (gitDecoration.* → terminal.ansi*) and STOPS before the editorGutter.* tail\n// that @pierre/theming's normalizeThemeColors adds, so the emitted string stays\n// byte-identical to the pre-theming output. Adopting the gutter fallback for\n// diffs is a deliberate follow-up. A variable is omitted entirely when neither\n// source key is present, matching the previous behavior.\nfunction getGitVariables(\n themeData: ThemeRegistrationResolved,\n modePrefix?: string\n) {\n modePrefix = modePrefix != null ? `${modePrefix}-` : '';\n let styles = '';\n const additionGreen =\n themeData.colors?.['gitDecoration.addedResourceForeground'] ??\n themeData.colors?.['terminal.ansiGreen'];\n if (additionGreen != null) {\n styles += `${formatCSSVariablePrefix('global')}${modePrefix}addition-color:${additionGreen};`;\n }\n const deletionRed =\n themeData.colors?.['gitDecoration.deletedResourceForeground'] ??\n themeData.colors?.['terminal.ansiRed'];\n if (deletionRed != null) {\n styles += `${formatCSSVariablePrefix('global')}${modePrefix}deletion-color:${deletionRed};`;\n }\n const modifiedBlue =\n themeData.colors?.['gitDecoration.modifiedResourceForeground'] ??\n themeData.colors?.['terminal.ansiBlue'];\n if (modifiedBlue != null) {\n styles += `${formatCSSVariablePrefix('global')}${modePrefix}modified-color:${modifiedBlue};`;\n }\n return styles;\n}\n"],"mappings":";;;;AA2BA,SAAgB,0BAA0B,EACxC,QAAQ,gBACR,aACA,UACyC;CACzC,IAAI,SAAS;CACb,IAAI,OAAO,UAAU,UAAU;EAC7B,MAAM,YAAY,YAAY,SAAS,KAAK;EAC5C,MAAM,aAAa,qBAAqB,SAAS;EACjD,UAAU,SAAS,WAAW,GAAG;EACjC,UAAU,oBAAoB,WAAW,GAAG;EAC5C,UAAU,GAAG,wBAAwB,QAAQ,EAAE,KAAK,WAAW,GAAG;EAClE,UAAU,GAAG,wBAAwB,QAAQ,EAAE,KAAK,WAAW,GAAG;EAClE,UAAU,gBAAgB,WAAW,MAAM;CAC7C,OAAO;EACL,IAAI,YAAY,YAAY,SAAS,MAAM,IAAI;EAC/C,IAAI,aAAa,qBAAqB,SAAS;EAC/C,UAAU,GAAG,wBAAwB,QAAQ,EAAE,OAAO,WAAW,GAAG;EACpE,UAAU,GAAG,wBAAwB,QAAQ,EAAE,UAAU,WAAW,GAAG;EACvE,UAAU,gBAAgB,WAAW,MAAM;EAE3C,YAAY,YAAY,SAAS,MAAM,KAAK;EAC5C,aAAa,qBAAqB,SAAS;EAC3C,UAAU,GAAG,wBAAwB,QAAQ,EAAE,QAAQ,WAAW,GAAG;EACrE,UAAU,GAAG,wBAAwB,QAAQ,EAAE,WAAW,WAAW,GAAG;EACxE,UAAU,gBAAgB,WAAW,OAAO;CAC9C;CACA,OAAO;AACT;AASA,SAAS,gBACP,WACA,YACA;CACA,aAAa,cAAc,OAAO,GAAG,WAAW,KAAK;CACrD,IAAI,SAAS;CACb,MAAM,gBACJ,UAAU,SAAS,4CACnB,UAAU,SAAS;CACrB,IAAI,iBAAiB,MACnB,UAAU,GAAG,wBAAwB,QAAQ,IAAI,WAAW,iBAAiB,cAAc;CAE7F,MAAM,cACJ,UAAU,SAAS,8CACnB,UAAU,SAAS;CACrB,IAAI,eAAe,MACjB,UAAU,GAAG,wBAAwB,QAAQ,IAAI,WAAW,iBAAiB,YAAY;CAE3F,MAAM,eACJ,UAAU,SAAS,+CACnB,UAAU,SAAS;CACrB,IAAI,gBAAgB,MAClB,UAAU,GAAG,wBAAwB,QAAQ,IAAI,WAAW,iBAAiB,aAAa;CAE5F,OAAO;AACT"}
1
+ {"version":3,"file":"getHighlighterThemeStyles.js","names":[],"sources":["../../src/utils/getHighlighterThemeStyles.ts"],"sourcesContent":["import { normalizeThemeColors } from '@pierre/theming/color';\n\nimport { DEFAULT_THEMES } from '../constants';\nimport type {\n DiffsHighlighter,\n DiffsTheme,\n DiffsThemeNames,\n ThemesType,\n} from '../types';\nimport { formatCSSVariablePrefix } from './formatCSSVariablePrefix';\n\ninterface GetHighlighterThemeStylesProps {\n theme?: DiffsThemeNames | ThemesType;\n highlighter: DiffsHighlighter;\n prefix?: string;\n}\n\nexport function getHighlighterThemeStyles({\n theme = DEFAULT_THEMES,\n highlighter,\n prefix,\n}: GetHighlighterThemeStylesProps): string {\n let styles = '';\n if (typeof theme === 'string') {\n const themeData = highlighter.getTheme(theme);\n const normalized = getThemeColors(themeData, highlighter);\n styles += `color:${normalized.fg};`;\n styles += `background-color:${normalized.bg};`;\n styles += `${formatCSSVariablePrefix('global')}fg:${normalized.fg};`;\n styles += `${formatCSSVariablePrefix('global')}bg:${normalized.bg};`;\n styles += getGitVariables(themeData, prefix);\n } else {\n let themeData = highlighter.getTheme(theme.dark);\n let normalized = getThemeColors(themeData, highlighter);\n styles += `${formatCSSVariablePrefix('global')}dark:${normalized.fg};`;\n styles += `${formatCSSVariablePrefix('global')}dark-bg:${normalized.bg};`;\n styles += getGitVariables(themeData, 'dark');\n\n themeData = highlighter.getTheme(theme.light);\n normalized = getThemeColors(themeData, highlighter);\n styles += `${formatCSSVariablePrefix('global')}light:${normalized.fg};`;\n styles += `${formatCSSVariablePrefix('global')}light-bg:${normalized.bg};`;\n styles += getGitVariables(themeData, 'light');\n }\n return styles;\n}\n\n// cssVariables: true must use the same prefix for backgrounds and tokens.\n// Object palettes already include their configured prefix and defaults.\nfunction getThemeColors(theme: DiffsTheme, highlighter: DiffsHighlighter) {\n if (highlighter.name === 'highlights' && theme.zed?.cssVariables === true) {\n const prefix = formatCSSVariablePrefix('token');\n return { fg: `var(${prefix}foreground)`, bg: `var(${prefix}background)` };\n }\n return normalizeThemeColors(theme);\n}\n\n// Keep the gitDecoration → terminal.ansi fallback; adding editorGutter colors\n// here would change diff backgrounds for existing themes.\nfunction getGitVariables(themeData: DiffsTheme, modePrefix?: string) {\n modePrefix = modePrefix != null ? `${modePrefix}-` : '';\n let styles = '';\n const additionGreen =\n themeData.colors?.['gitDecoration.addedResourceForeground'] ??\n themeData.colors?.['terminal.ansiGreen'];\n if (additionGreen != null) {\n styles += `${formatCSSVariablePrefix('global')}${modePrefix}addition-color:${additionGreen};`;\n }\n const deletionRed =\n themeData.colors?.['gitDecoration.deletedResourceForeground'] ??\n themeData.colors?.['terminal.ansiRed'];\n if (deletionRed != null) {\n styles += `${formatCSSVariablePrefix('global')}${modePrefix}deletion-color:${deletionRed};`;\n }\n const modifiedBlue =\n themeData.colors?.['gitDecoration.modifiedResourceForeground'] ??\n themeData.colors?.['terminal.ansiBlue'];\n if (modifiedBlue != null) {\n styles += `${formatCSSVariablePrefix('global')}${modePrefix}modified-color:${modifiedBlue};`;\n }\n return styles;\n}\n"],"mappings":";;;;AAiBA,SAAgB,0BAA0B,EACxC,QAAQ,gBACR,aACA,UACyC;CACzC,IAAI,SAAS;CACb,IAAI,OAAO,UAAU,UAAU;EAC7B,MAAM,YAAY,YAAY,SAAS,KAAK;EAC5C,MAAM,aAAa,eAAe,WAAW,WAAW;EACxD,UAAU,SAAS,WAAW,GAAG;EACjC,UAAU,oBAAoB,WAAW,GAAG;EAC5C,UAAU,GAAG,wBAAwB,QAAQ,EAAE,KAAK,WAAW,GAAG;EAClE,UAAU,GAAG,wBAAwB,QAAQ,EAAE,KAAK,WAAW,GAAG;EAClE,UAAU,gBAAgB,WAAW,MAAM;CAC7C,OAAO;EACL,IAAI,YAAY,YAAY,SAAS,MAAM,IAAI;EAC/C,IAAI,aAAa,eAAe,WAAW,WAAW;EACtD,UAAU,GAAG,wBAAwB,QAAQ,EAAE,OAAO,WAAW,GAAG;EACpE,UAAU,GAAG,wBAAwB,QAAQ,EAAE,UAAU,WAAW,GAAG;EACvE,UAAU,gBAAgB,WAAW,MAAM;EAE3C,YAAY,YAAY,SAAS,MAAM,KAAK;EAC5C,aAAa,eAAe,WAAW,WAAW;EAClD,UAAU,GAAG,wBAAwB,QAAQ,EAAE,QAAQ,WAAW,GAAG;EACrE,UAAU,GAAG,wBAAwB,QAAQ,EAAE,WAAW,WAAW,GAAG;EACxE,UAAU,gBAAgB,WAAW,OAAO;CAC9C;CACA,OAAO;AACT;AAIA,SAAS,eAAe,OAAmB,aAA+B;CACxE,IAAI,YAAY,SAAS,gBAAgB,MAAM,KAAK,iBAAiB,MAAM;EACzE,MAAM,SAAS,wBAAwB,OAAO;EAC9C,OAAO;GAAE,IAAI,OAAO,OAAO;GAAc,IAAI,OAAO,OAAO;EAAa;CAC1E;CACA,OAAO,qBAAqB,KAAK;AACnC;AAIA,SAAS,gBAAgB,WAAuB,YAAqB;CACnE,aAAa,cAAc,OAAO,GAAG,WAAW,KAAK;CACrD,IAAI,SAAS;CACb,MAAM,gBACJ,UAAU,SAAS,4CACnB,UAAU,SAAS;CACrB,IAAI,iBAAiB,MACnB,UAAU,GAAG,wBAAwB,QAAQ,IAAI,WAAW,iBAAiB,cAAc;CAE7F,MAAM,cACJ,UAAU,SAAS,8CACnB,UAAU,SAAS;CACrB,IAAI,eAAe,MACjB,UAAU,GAAG,wBAAwB,QAAQ,IAAI,WAAW,iBAAiB,YAAY;CAE3F,MAAM,eACJ,UAAU,SAAS,+CACnB,UAAU,SAAS;CACrB,IAAI,gBAAgB,MAClB,UAAU,GAAG,wBAAwB,QAAQ,IAAI,WAAW,iBAAiB,aAAa;CAE5F,OAAO;AACT"}
@@ -0,0 +1,7 @@
1
+ import { CodeToTokensOptions } from "../highlighter/types.js";
2
+ import { DiffsThemeNames, SupportedLanguages, ThemesType } from "../types.js";
3
+ //#region src/utils/getTokenOptions.d.ts
4
+ declare function getTokenOptions(lang: SupportedLanguages, theme: DiffsThemeNames | ThemesType, tokenizeMaxLineLength: number | undefined): CodeToTokensOptions;
5
+ //#endregion
6
+ export { getTokenOptions };
7
+ //# sourceMappingURL=getTokenOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTokenOptions.d.ts","names":[],"sources":["../../src/utils/getTokenOptions.ts"],"mappings":";;;iBAQgB,gBACd,MAAM,oBACN,OAAO,kBAAkB,YACzB,4CACC"}
@@ -0,0 +1,16 @@
1
+ import { formatCSSVariablePrefix } from "./formatCSSVariablePrefix.js";
2
+ //#region src/utils/getTokenOptions.ts
3
+ function getTokenOptions(lang, theme, tokenizeMaxLineLength) {
4
+ return {
5
+ lang,
6
+ ...typeof theme === "string" ? { theme } : { themes: theme },
7
+ defaultColor: false,
8
+ cssVariablePrefix: formatCSSVariablePrefix("token"),
9
+ tokenizeMaxLineLength,
10
+ tokenizeTimeLimit: 0
11
+ };
12
+ }
13
+ //#endregion
14
+ export { getTokenOptions };
15
+
16
+ //# sourceMappingURL=getTokenOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTokenOptions.js","names":[],"sources":["../../src/utils/getTokenOptions.ts"],"sourcesContent":["import type {\n CodeToTokensOptions,\n DiffsThemeNames,\n SupportedLanguages,\n ThemesType,\n} from '../types';\nimport { formatCSSVariablePrefix } from './formatCSSVariablePrefix';\n\nexport function getTokenOptions(\n lang: SupportedLanguages,\n theme: DiffsThemeNames | ThemesType,\n tokenizeMaxLineLength: number | undefined\n): CodeToTokensOptions {\n return {\n lang,\n ...(typeof theme === 'string' ? { theme } : { themes: theme }),\n defaultColor: false,\n cssVariablePrefix: formatCSSVariablePrefix('token'),\n tokenizeMaxLineLength,\n // Timed aborts can leave incomplete tokens; limit line length instead.\n tokenizeTimeLimit: 0,\n };\n}\n"],"mappings":";;AAQA,SAAgB,gBACd,MACA,OACA,uBACqB;CACrB,OAAO;EACL;EACA,GAAI,OAAO,UAAU,WAAW,EAAE,MAAM,IAAI,EAAE,QAAQ,MAAM;EAC5D,cAAc;EACd,mBAAmB,wBAAwB,OAAO;EAClD;EAEA,mBAAmB;CACrB;AACF"}
@@ -0,0 +1,10 @@
1
+ import { Nodes, RootContent } from "../node_modules/.pnpm/@types_hast@3.0.4/node_modules/@types/hast/index.js";
2
+ //#region src/utils/hastToHtml.d.ts
3
+ /**
4
+ * Avoid schema lookups for common token spans; delegate other nodes and
5
+ * attributes to toHtml(). Output must match its default serialization exactly.
6
+ */
7
+ declare function hastToHtml(tree: Nodes | RootContent[]): string;
8
+ //#endregion
9
+ export { hastToHtml };
10
+ //# sourceMappingURL=hastToHtml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hastToHtml.d.ts","names":[],"sources":["../../src/utils/hastToHtml.ts"],"mappings":";;;;;;iBA4DgB,WAAW,MAAM,QAAQ"}
@@ -0,0 +1,125 @@
1
+ import { toHtml } from "hast-util-to-html";
2
+ //#region src/utils/hastToHtml.ts
3
+ const VOID_ELEMENTS = /* @__PURE__ */ new Set([
4
+ "area",
5
+ "base",
6
+ "basefont",
7
+ "bgsound",
8
+ "br",
9
+ "col",
10
+ "command",
11
+ "embed",
12
+ "frame",
13
+ "hr",
14
+ "image",
15
+ "img",
16
+ "input",
17
+ "keygen",
18
+ "link",
19
+ "meta",
20
+ "param",
21
+ "source",
22
+ "track",
23
+ "wbr"
24
+ ]);
25
+ const DELEGATED_TAGS = /* @__PURE__ */ new Set([
26
+ "svg",
27
+ "template",
28
+ "script",
29
+ "style"
30
+ ]);
31
+ const ATTRIBUTE_NAMES = {
32
+ class: "class",
33
+ className: "class",
34
+ id: "id",
35
+ role: "role",
36
+ style: "style",
37
+ tabIndex: "tabindex",
38
+ tabindex: "tabindex",
39
+ title: "title"
40
+ };
41
+ const DATA_ATTRIBUTE = /^data-[\w.:-]+$/;
42
+ const TEXT_ESCAPE = /[<&]/g;
43
+ const ATTRIBUTE_ESCAPE = /[\0"&'`]/g;
44
+ const CHARACTER_REFERENCES = {
45
+ "<": "&#x3C;",
46
+ "&": "&#x26;",
47
+ "\"": "&#x22;",
48
+ "'": "&#x27;",
49
+ "`": "&#x60;",
50
+ "\0": "&#x0;"
51
+ };
52
+ const MAX_CACHED_STYLES = 256;
53
+ /**
54
+ * Avoid schema lookups for common token spans; delegate other nodes and
55
+ * attributes to toHtml(). Output must match its default serialization exactly.
56
+ */
57
+ function hastToHtml(tree) {
58
+ const styles = /* @__PURE__ */ new Map();
59
+ return Array.isArray(tree) ? serializeChildren(tree, styles) : serializeNode(tree, styles);
60
+ }
61
+ function serializeChildren(children, styles) {
62
+ let html = "";
63
+ for (const child of children) html += serializeNode(child, styles);
64
+ return html;
65
+ }
66
+ function serializeNode(node, styles) {
67
+ switch (node.type) {
68
+ case "text": return escapeText(node.value);
69
+ case "element": return serializeElement(node, styles);
70
+ case "root": return serializeChildren(node.children, styles);
71
+ default: return toHtml(node);
72
+ }
73
+ }
74
+ function serializeElement(node, styles) {
75
+ const { tagName } = node;
76
+ if (tagName === "span" && node.children.length === 1 && node.children[0].type === "text" && typeof node.properties?.style === "string") {
77
+ let styleOnly = true;
78
+ for (const key in node.properties) if (key !== "style" && node.properties[key] != null) {
79
+ styleOnly = false;
80
+ break;
81
+ }
82
+ if (styleOnly) return `<span ${serializeStyle(node.properties.style, styles)}>${escapeText(node.children[0].value)}</span>`;
83
+ }
84
+ if (DELEGATED_TAGS.has(tagName)) return toHtml(node);
85
+ const attributes = serializeAttributes(node.properties, styles);
86
+ if (attributes == null) return toHtml(node);
87
+ const open = attributes === "" ? `<${tagName}>` : `<${tagName} ${attributes}>`;
88
+ const content = serializeChildren(node.children, styles);
89
+ if (content === "" && VOID_ELEMENTS.has(tagName.toLowerCase())) return open;
90
+ return `${open}${content}</${tagName}>`;
91
+ }
92
+ function serializeStyle(value, styles) {
93
+ let attribute = styles.get(value);
94
+ if (attribute == null) {
95
+ attribute = `style="${escapeAttribute(value)}"`;
96
+ if (styles.size < MAX_CACHED_STYLES) styles.set(value, attribute);
97
+ }
98
+ return attribute;
99
+ }
100
+ function serializeAttributes(properties, styles) {
101
+ let attributes = "";
102
+ for (const key in properties) {
103
+ const value = properties[key];
104
+ if (value == null) continue;
105
+ const name = ATTRIBUTE_NAMES[key] ?? (DATA_ATTRIBUTE.test(key) ? key : void 0);
106
+ if (name == null) return;
107
+ if (value === false || typeof value === "number" && Number.isNaN(value)) continue;
108
+ const attribute = key === "style" && typeof value === "string" ? serializeStyle(value, styles) : value === true ? name : `${name}="${escapeAttribute(Array.isArray(value) ? value.join(" ").trim() : String(value))}"`;
109
+ attributes += attributes === "" ? attribute : ` ${attribute}`;
110
+ }
111
+ return attributes;
112
+ }
113
+ function escapeText(value) {
114
+ return value.indexOf("<") < 0 && value.indexOf("&") < 0 ? value : value.replace(TEXT_ESCAPE, toCharacterReference);
115
+ }
116
+ function escapeAttribute(value) {
117
+ return value.replace(ATTRIBUTE_ESCAPE, toCharacterReference);
118
+ }
119
+ function toCharacterReference(character) {
120
+ return CHARACTER_REFERENCES[character];
121
+ }
122
+ //#endregion
123
+ export { hastToHtml };
124
+
125
+ //# sourceMappingURL=hastToHtml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hastToHtml.js","names":[],"sources":["../../src/utils/hastToHtml.ts"],"sourcesContent":["import type { Element, Nodes, Properties, RootContent } from 'hast';\nimport { toHtml } from 'hast-util-to-html';\n\n// Must match the html-void-elements list used by toHtml().\nconst VOID_ELEMENTS = new Set([\n 'area',\n 'base',\n 'basefont',\n 'bgsound',\n 'br',\n 'col',\n 'command',\n 'embed',\n 'frame',\n 'hr',\n 'image',\n 'img',\n 'input',\n 'keygen',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n]);\n\n// These elements require schema, fragment or raw-text handling in toHtml().\nconst DELEGATED_TAGS = new Set(['svg', 'template', 'script', 'style']);\n\n// Boolean and comma-separated attributes require the full HTML schema.\nconst ATTRIBUTE_NAMES: Record<string, string | undefined> = {\n class: 'class',\n className: 'class',\n id: 'id',\n role: 'role',\n style: 'style',\n tabIndex: 'tabindex',\n tabindex: 'tabindex',\n title: 'title',\n};\nconst DATA_ATTRIBUTE = /^data-[\\w.:-]+$/;\n\nconst TEXT_ESCAPE = /[<&]/g;\nconst ATTRIBUTE_ESCAPE = /[\\0\"&'`]/g;\n// Must match stringify-entities' default hexadecimal encoding.\nconst CHARACTER_REFERENCES: Record<string, string> = {\n '<': '&#x3C;',\n '&': '&#x26;',\n '\"': '&#x22;',\n \"'\": '&#x27;',\n '`': '&#x60;',\n '\\0': '&#x0;',\n};\nconst MAX_CACHED_STYLES = 256;\n\n/**\n * Avoid schema lookups for common token spans; delegate other nodes and\n * attributes to toHtml(). Output must match its default serialization exactly.\n */\nexport function hastToHtml(tree: Nodes | RootContent[]): string {\n const styles = new Map<string, string>();\n return Array.isArray(tree)\n ? serializeChildren(tree, styles)\n : serializeNode(tree, styles);\n}\n\nfunction serializeChildren(\n children: readonly RootContent[],\n styles: Map<string, string>\n): string {\n let html = '';\n for (const child of children) {\n html += serializeNode(child, styles);\n }\n return html;\n}\n\nfunction serializeNode(node: Nodes, styles: Map<string, string>): string {\n switch (node.type) {\n case 'text':\n return escapeText(node.value);\n case 'element':\n return serializeElement(node, styles);\n case 'root':\n return serializeChildren(node.children, styles);\n default:\n return toHtml(node);\n }\n}\n\nfunction serializeElement(node: Element, styles: Map<string, string>): string {\n const { tagName } = node;\n if (\n tagName === 'span' &&\n node.children.length === 1 &&\n node.children[0].type === 'text' &&\n typeof node.properties?.style === 'string'\n ) {\n let styleOnly = true;\n for (const key in node.properties) {\n if (key !== 'style' && node.properties[key] != null) {\n styleOnly = false;\n break;\n }\n }\n if (styleOnly) {\n return `<span ${serializeStyle(node.properties.style, styles)}>${escapeText(node.children[0].value)}</span>`;\n }\n }\n if (DELEGATED_TAGS.has(tagName)) {\n return toHtml(node);\n }\n const attributes = serializeAttributes(node.properties, styles);\n if (attributes == null) {\n return toHtml(node);\n }\n const open =\n attributes === '' ? `<${tagName}>` : `<${tagName} ${attributes}>`;\n const content = serializeChildren(node.children, styles);\n if (content === '' && VOID_ELEMENTS.has(tagName.toLowerCase())) {\n return open;\n }\n return `${open}${content}</${tagName}>`;\n}\n\n// Cap the per-render cache because custom styles may be unique per token.\nfunction serializeStyle(value: string, styles: Map<string, string>): string {\n let attribute = styles.get(value);\n if (attribute == null) {\n attribute = `style=\"${escapeAttribute(value)}\"`;\n if (styles.size < MAX_CACHED_STYLES) styles.set(value, attribute);\n }\n return attribute;\n}\n\n// Returns undefined when a property needs the HTML schema to serialize.\nfunction serializeAttributes(\n properties: Properties | undefined,\n styles: Map<string, string>\n): string | undefined {\n let attributes = '';\n for (const key in properties) {\n const value = properties[key];\n if (value == null) {\n continue;\n }\n const name =\n ATTRIBUTE_NAMES[key] ?? (DATA_ATTRIBUTE.test(key) ? key : undefined);\n if (name == null) {\n return undefined;\n }\n if (value === false || (typeof value === 'number' && Number.isNaN(value))) {\n continue;\n }\n const attribute =\n key === 'style' && typeof value === 'string'\n ? serializeStyle(value, styles)\n : value === true\n ? name\n : `${name}=\"${escapeAttribute(\n Array.isArray(value) ? value.join(' ').trim() : String(value)\n )}\"`;\n attributes += attributes === '' ? attribute : ` ${attribute}`;\n }\n return attributes;\n}\n\nfunction escapeText(value: string): string {\n return value.indexOf('<') < 0 && value.indexOf('&') < 0\n ? value\n : value.replace(TEXT_ESCAPE, toCharacterReference);\n}\n\nfunction escapeAttribute(value: string): string {\n return value.replace(ATTRIBUTE_ESCAPE, toCharacterReference);\n}\n\nfunction toCharacterReference(character: string): string {\n return CHARACTER_REFERENCES[character];\n}\n"],"mappings":";;AAIA,MAAM,gCAAgB,IAAI,IAAI;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAGD,MAAM,iCAAiB,IAAI,IAAI;CAAC;CAAO;CAAY;CAAU;AAAO,CAAC;AAGrE,MAAM,kBAAsD;CAC1D,OAAO;CACP,WAAW;CACX,IAAI;CACJ,MAAM;CACN,OAAO;CACP,UAAU;CACV,UAAU;CACV,OAAO;AACT;AACA,MAAM,iBAAiB;AAEvB,MAAM,cAAc;AACpB,MAAM,mBAAmB;AAEzB,MAAM,uBAA+C;CACnD,KAAK;CACL,KAAK;CACL,MAAK;CACL,KAAK;CACL,KAAK;CACL,MAAM;AACR;AACA,MAAM,oBAAoB;;;;;AAM1B,SAAgB,WAAW,MAAqC;CAC9D,MAAM,yBAAS,IAAI,IAAoB;CACvC,OAAO,MAAM,QAAQ,IAAI,IACrB,kBAAkB,MAAM,MAAM,IAC9B,cAAc,MAAM,MAAM;AAChC;AAEA,SAAS,kBACP,UACA,QACQ;CACR,IAAI,OAAO;CACX,KAAK,MAAM,SAAS,UAClB,QAAQ,cAAc,OAAO,MAAM;CAErC,OAAO;AACT;AAEA,SAAS,cAAc,MAAa,QAAqC;CACvE,QAAQ,KAAK,MAAb;EACE,KAAK,QACH,OAAO,WAAW,KAAK,KAAK;EAC9B,KAAK,WACH,OAAO,iBAAiB,MAAM,MAAM;EACtC,KAAK,QACH,OAAO,kBAAkB,KAAK,UAAU,MAAM;EAChD,SACE,OAAO,OAAO,IAAI;CACtB;AACF;AAEA,SAAS,iBAAiB,MAAe,QAAqC;CAC5E,MAAM,EAAE,YAAY;CACpB,IACE,YAAY,UACZ,KAAK,SAAS,WAAW,KACzB,KAAK,SAAS,EAAE,CAAC,SAAS,UAC1B,OAAO,KAAK,YAAY,UAAU,UAClC;EACA,IAAI,YAAY;EAChB,KAAK,MAAM,OAAO,KAAK,YACrB,IAAI,QAAQ,WAAW,KAAK,WAAW,QAAQ,MAAM;GACnD,YAAY;GACZ;EACF;EAEF,IAAI,WACF,OAAO,SAAS,eAAe,KAAK,WAAW,OAAO,MAAM,EAAE,GAAG,WAAW,KAAK,SAAS,EAAE,CAAC,KAAK,EAAE;CAExG;CACA,IAAI,eAAe,IAAI,OAAO,GAC5B,OAAO,OAAO,IAAI;CAEpB,MAAM,aAAa,oBAAoB,KAAK,YAAY,MAAM;CAC9D,IAAI,cAAc,MAChB,OAAO,OAAO,IAAI;CAEpB,MAAM,OACJ,eAAe,KAAK,IAAI,QAAQ,KAAK,IAAI,QAAQ,GAAG,WAAW;CACjE,MAAM,UAAU,kBAAkB,KAAK,UAAU,MAAM;CACvD,IAAI,YAAY,MAAM,cAAc,IAAI,QAAQ,YAAY,CAAC,GAC3D,OAAO;CAET,OAAO,GAAG,OAAO,QAAQ,IAAI,QAAQ;AACvC;AAGA,SAAS,eAAe,OAAe,QAAqC;CAC1E,IAAI,YAAY,OAAO,IAAI,KAAK;CAChC,IAAI,aAAa,MAAM;EACrB,YAAY,UAAU,gBAAgB,KAAK,EAAE;EAC7C,IAAI,OAAO,OAAO,mBAAmB,OAAO,IAAI,OAAO,SAAS;CAClE;CACA,OAAO;AACT;AAGA,SAAS,oBACP,YACA,QACoB;CACpB,IAAI,aAAa;CACjB,KAAK,MAAM,OAAO,YAAY;EAC5B,MAAM,QAAQ,WAAW;EACzB,IAAI,SAAS,MACX;EAEF,MAAM,OACJ,gBAAgB,SAAS,eAAe,KAAK,GAAG,IAAI,MAAM,KAAA;EAC5D,IAAI,QAAQ,MACV;EAEF,IAAI,UAAU,SAAU,OAAO,UAAU,YAAY,OAAO,MAAM,KAAK,GACrE;EAEF,MAAM,YACJ,QAAQ,WAAW,OAAO,UAAU,WAChC,eAAe,OAAO,MAAM,IAC5B,UAAU,OACR,OACA,GAAG,KAAK,IAAI,gBACV,MAAM,QAAQ,KAAK,IAAI,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,CAC9D,EAAE;EACV,cAAc,eAAe,KAAK,YAAY,IAAI;CACpD;CACA,OAAO;AACT;AAEA,SAAS,WAAW,OAAuB;CACzC,OAAO,MAAM,QAAQ,GAAG,IAAI,KAAK,MAAM,QAAQ,GAAG,IAAI,IAClD,QACA,MAAM,QAAQ,aAAa,oBAAoB;AACrD;AAEA,SAAS,gBAAgB,OAAuB;CAC9C,OAAO,MAAM,QAAQ,kBAAkB,oBAAoB;AAC7D;AAEA,SAAS,qBAAqB,WAA2B;CACvD,OAAO,qBAAqB;AAC9B"}
@@ -1,4 +1,5 @@
1
- import { DecorationItem } from "../types.js";
1
+ import { DecorationItem } from "../highlighter/types.js";
2
+ import "../types.js";
2
3
  import { ChangeObject } from "diff";
3
4
  //#region src/utils/parseDiffDecorations.d.ts
4
5
  interface CreateDiffSpanDecorationProps {
@@ -1 +1 @@
1
- {"version":3,"file":"parseDiffDecorations.d.ts","names":[],"sources":["../../src/utils/parseDiffDecorations.ts"],"mappings":";;;UAIU;EACR;EACA;EACA;;iBAGc,2BACd,MACA,WACA,cACC,gCAAgC;UASzB;EACR,MAAM;EACN;EACA;EACA;EACA;;iBAQc,iBACd,MACA,KACA,YACA,WACA,cACC"}
1
+ {"version":3,"file":"parseDiffDecorations.d.ts","names":[],"sources":["../../src/utils/parseDiffDecorations.ts"],"mappings":";;;;UAIU;EACR;EACA;EACA;;iBAGc,2BACd,MACA,WACA,cACC,gCAAgC;UASzB;EACR,MAAM;EACN;EACA;EACA;EACA;;iBAQc,iBACd,MACA,KACA,YACA,WACA,cACC"}
@@ -1,6 +1,7 @@
1
- import { DiffsHighlighter, FileDiffMetadata, ForceDiffPlainTextOptions, RenderDiffOptions, ThemedDiffResult } from "../types.js";
1
+ import { DiffsHighlighter } from "../highlighter/DiffsHighlighter.js";
2
+ import { FileDiffMetadata, ForceDiffPlainTextOptions, RenderDiffOptions, ThemedDiffResult } from "../types.js";
2
3
  //#region src/utils/renderDiffWithHighlighter.d.ts
3
- declare function renderDiffWithHighlighter(diff: FileDiffMetadata, highlighter: DiffsHighlighter, options: RenderDiffOptions, { forcePlainText, startingLine, totalLines, expandedHunks, collapsedContextThreshold }?: ForceDiffPlainTextOptions): ThemedDiffResult;
4
+ declare function renderDiffWithHighlighter(diff: FileDiffMetadata, highlighter: DiffsHighlighter, options: RenderDiffOptions, { forcePlainText, lazyLineAST, startingLine, totalLines, expandedHunks, collapsedContextThreshold }?: ForceDiffPlainTextOptions): ThemedDiffResult;
4
5
  //#endregion
5
6
  export { renderDiffWithHighlighter };
6
7
  //# sourceMappingURL=renderDiffWithHighlighter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderDiffWithHighlighter.d.ts","names":[],"sources":["../../src/utils/renderDiffWithHighlighter.ts"],"mappings":";;iBAmCgB,0BACd,MAAM,kBACN,aAAa,kBACb,SAAS,qBAEP,gBACA,cACA,YACA,eACA,8BACC,4BACF"}
1
+ {"version":3,"file":"renderDiffWithHighlighter.d.ts","names":[],"sources":["../../src/utils/renderDiffWithHighlighter.ts"],"mappings":";;;iBAiCgB,0BACd,MAAM,kBACN,aAAa,kBACb,SAAS,qBAEP,gBACA,aACA,cACA,YACA,eACA,8BACC,4BACF"}
@@ -1,17 +1,17 @@
1
1
  import "../constants.js";
2
2
  import { getFiletypeFromFileName } from "./getFiletypeFromFileName.js";
3
3
  import { appendItems } from "./appendItems.js";
4
- import { createTransformerWithState } from "./createTransformerWithState.js";
5
- import { formatCSSVariablePrefix } from "./formatCSSVariablePrefix.js";
6
4
  import { getHighlighterThemeStyles } from "./getHighlighterThemeStyles.js";
7
- import { getLineNodes } from "./getLineNodes.js";
5
+ import { getTokenOptions } from "./getTokenOptions.js";
6
+ import { setDeferredArrayItem } from "./setDeferredArrayItem.js";
7
+ import { renderTokenLines } from "./renderTokenLines.js";
8
8
  import { iterateOverDiff } from "./iterateOverDiff.js";
9
9
  import { cleanLastNewline } from "./cleanLastNewline.js";
10
10
  import { createDiffSpanDecoration, pushOrJoinSpan } from "./parseDiffDecorations.js";
11
11
  import { diffChars, diffWordsWithSpace } from "diff";
12
12
  //#region src/utils/renderDiffWithHighlighter.ts
13
13
  const DEFAULT_PLAIN_TEXT_OPTIONS = { forcePlainText: false };
14
- function renderDiffWithHighlighter(diff, highlighter, options, { forcePlainText, startingLine, totalLines, expandedHunks, collapsedContextThreshold = 1 } = DEFAULT_PLAIN_TEXT_OPTIONS) {
14
+ function renderDiffWithHighlighter(diff, highlighter, options, { forcePlainText, lazyLineAST = false, startingLine, totalLines, expandedHunks, collapsedContextThreshold = 1 } = DEFAULT_PLAIN_TEXT_OPTIONS) {
15
15
  if (forcePlainText) {
16
16
  startingLine ??= 0;
17
17
  totalLines ??= Infinity;
@@ -20,6 +20,7 @@ function renderDiffWithHighlighter(diff, highlighter, options, { forcePlainText,
20
20
  totalLines = Infinity;
21
21
  }
22
22
  const isWindowedHighlight = startingLine > 0 || totalLines < Infinity;
23
+ lazyLineAST &&= !forcePlainText && !options.useTokenTransformer;
23
24
  const baseThemeType = typeof options.theme === "string" ? highlighter.getTheme(options.theme).type : void 0;
24
25
  const themeStyles = getHighlighterThemeStyles({
25
26
  theme: options.theme,
@@ -114,17 +115,27 @@ function renderDiffWithHighlighter(diff, highlighter, options, { forcePlainText,
114
115
  additionDecorations: bucket.additionDecorations,
115
116
  highlighter,
116
117
  options,
117
- languageOverride: forcePlainText ? "text" : diff.lang
118
+ languageOverride: forcePlainText ? "text" : diff.lang,
119
+ lazyLineAST
118
120
  });
119
121
  if (shouldGroupAll) {
120
122
  code.deletionLines = deletionLines;
121
123
  code.additionLines = additionLines;
122
124
  continue;
123
125
  }
124
- if (bucket.deletionSegments.length > 0) for (const seg of bucket.deletionSegments) for (let i = 0; i < seg.count; i++) code.deletionLines[seg.targetIndex + i] = deletionLines[seg.originalOffset + i];
125
- else appendItems(code.deletionLines, deletionLines);
126
- if (bucket.additionSegments.length > 0) for (const seg of bucket.additionSegments) for (let i = 0; i < seg.count; i++) code.additionLines[seg.targetIndex + i] = additionLines[seg.originalOffset + i];
127
- else appendItems(code.additionLines, additionLines);
126
+ for (const [target, lines, segments] of [[
127
+ code.deletionLines,
128
+ deletionLines,
129
+ bucket.deletionSegments
130
+ ], [
131
+ code.additionLines,
132
+ additionLines,
133
+ bucket.additionSegments
134
+ ]]) if (segments.length > 0) for (const segment of segments) for (let index = 0; index < segment.count; index++) target[segment.targetIndex + index] = lines[segment.originalOffset + index];
135
+ else if (lazyLineAST) {
136
+ const offset = target.length;
137
+ for (let index = 0; index < lines.length; index++) setDeferredArrayItem(target, offset + index, () => lines[index]);
138
+ } else appendItems(target, lines);
128
139
  }
129
140
  return {
130
141
  code,
@@ -256,46 +267,20 @@ function createBucket() {
256
267
  additionSegments: []
257
268
  };
258
269
  }
259
- function renderTwoFiles({ deletionFile, additionFile, deletionInfo, additionInfo, highlighter, deletionDecorations, additionDecorations, languageOverride, options: { theme: themeOrThemes, ...options } }) {
260
- const deletionLang = languageOverride ?? getFiletypeFromFileName(deletionFile.name);
261
- const additionLang = languageOverride ?? getFiletypeFromFileName(additionFile.name);
262
- const { state, transformers } = createTransformerWithState(options.useTokenTransformer);
263
- const hastConfig = (() => {
264
- return typeof themeOrThemes === "string" ? {
265
- ...options,
266
- lang: "text",
267
- theme: themeOrThemes,
268
- transformers,
269
- decorations: void 0,
270
- defaultColor: false,
271
- cssVariablePrefix: formatCSSVariablePrefix("token"),
272
- tokenizeTimeLimit: 0
273
- } : {
274
- ...options,
275
- lang: "text",
276
- themes: themeOrThemes,
277
- transformers,
278
- decorations: void 0,
279
- defaultColor: false,
280
- cssVariablePrefix: formatCSSVariablePrefix("token"),
281
- tokenizeTimeLimit: 0
282
- };
283
- })();
270
+ function renderTwoFiles({ lazyLineAST, deletionFile, additionFile, deletionInfo, additionInfo, highlighter, deletionDecorations, additionDecorations, languageOverride, options: { theme, useTokenTransformer, tokenizeMaxLineLength } }) {
271
+ const renderFile = (file, lineInfo, decorations) => {
272
+ if (file.contents === "") return [];
273
+ return renderTokenLines(highlighter.codeToTokens(cleanLastNewline(file.contents), getTokenOptions(languageOverride ?? getFiletypeFromFileName(file.name), theme, tokenizeMaxLineLength)).tokens, {
274
+ state: { lineInfo },
275
+ useTokenTransformer,
276
+ decorations,
277
+ lazyLineAST,
278
+ cacheHtmlStyles: highlighter.name === "highlights"
279
+ });
280
+ };
284
281
  return {
285
- deletionLines: (() => {
286
- if (deletionFile.contents === "") return [];
287
- hastConfig.lang = deletionLang;
288
- state.lineInfo = deletionInfo;
289
- hastConfig.decorations = deletionDecorations;
290
- return getLineNodes(highlighter.codeToHast(cleanLastNewline(deletionFile.contents), hastConfig));
291
- })(),
292
- additionLines: (() => {
293
- if (additionFile.contents === "") return [];
294
- hastConfig.lang = additionLang;
295
- hastConfig.decorations = additionDecorations;
296
- state.lineInfo = additionInfo;
297
- return getLineNodes(highlighter.codeToHast(cleanLastNewline(additionFile.contents), hastConfig));
298
- })()
282
+ deletionLines: renderFile(deletionFile, deletionInfo, deletionDecorations),
283
+ additionLines: renderFile(additionFile, additionInfo, additionDecorations)
299
284
  };
300
285
  }
301
286
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"renderDiffWithHighlighter.js","names":[],"sources":["../../src/utils/renderDiffWithHighlighter.ts"],"sourcesContent":["import { type ChangeObject, diffChars, diffWordsWithSpace } from 'diff';\n\nimport { DEFAULT_COLLAPSED_CONTEXT_THRESHOLD } from '../constants';\nimport type {\n CodeToHastOptions,\n DecorationItem,\n DiffsHighlighter,\n DiffsThemeNames,\n FileContents,\n FileDiffMetadata,\n ForceDiffPlainTextOptions,\n LineDiffTypes,\n LineInfo,\n RenderDiffFilesResult,\n RenderDiffOptions,\n SupportedLanguages,\n ThemedDiffResult,\n} from '../types';\nimport { appendItems } from './appendItems';\nimport { cleanLastNewline } from './cleanLastNewline';\nimport { createTransformerWithState } from './createTransformerWithState';\nimport { formatCSSVariablePrefix } from './formatCSSVariablePrefix';\nimport { getFiletypeFromFileName } from './getFiletypeFromFileName';\nimport { getHighlighterThemeStyles } from './getHighlighterThemeStyles';\nimport { getLineNodes } from './getLineNodes';\nimport { iterateOverDiff } from './iterateOverDiff';\nimport {\n createDiffSpanDecoration,\n pushOrJoinSpan,\n} from './parseDiffDecorations';\n\nconst DEFAULT_PLAIN_TEXT_OPTIONS: ForceDiffPlainTextOptions = {\n forcePlainText: false,\n};\n\nexport function renderDiffWithHighlighter(\n diff: FileDiffMetadata,\n highlighter: DiffsHighlighter,\n options: RenderDiffOptions,\n {\n forcePlainText,\n startingLine,\n totalLines,\n expandedHunks,\n collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD,\n }: ForceDiffPlainTextOptions = DEFAULT_PLAIN_TEXT_OPTIONS\n): ThemedDiffResult {\n if (forcePlainText) {\n startingLine ??= 0;\n totalLines ??= Infinity;\n } else {\n // If we aren't forcing plain text, then we intentionally do not support\n // ranges for highlighting as that could break the syntax highlighting, we\n // we override any values that may have been passed in. Maybe one day we\n // warn about this?\n startingLine = 0;\n totalLines = Infinity;\n }\n const isWindowedHighlight = startingLine > 0 || totalLines < Infinity;\n const baseThemeType =\n typeof options.theme === 'string'\n ? highlighter.getTheme(options.theme).type\n : undefined;\n const themeStyles = getHighlighterThemeStyles({\n theme: options.theme,\n highlighter,\n });\n\n // If we have a large file and we are rendering the WHOLE plain diff ast,\n // then we should remove the lineDiffType to make sure things render quickly.\n // For highlighted ASTs or windowed highlights, we should just inherit the\n // setting\n const lineDiffType =\n forcePlainText &&\n !isWindowedHighlight &&\n (diff.unifiedLineCount > 1000 || diff.splitLineCount > 1000)\n ? 'none'\n : options.lineDiffType;\n\n const code: RenderDiffFilesResult = {\n deletionLines: [],\n additionLines: [],\n };\n\n const { maxLineDiffLength } = options;\n const shouldGroupAll = !forcePlainText && !diff.isPartial;\n const expandedHunksForIteration = forcePlainText ? expandedHunks : undefined;\n const buckets = new Map<number, RenderBucket>();\n function getBucketForHunk(hunkIndex: number) {\n const index = shouldGroupAll ? 0 : hunkIndex;\n const bucket = buckets.get(index) ?? createBucket();\n buckets.set(index, bucket);\n return bucket;\n }\n\n function appendContent(\n lineContent: string,\n lineIndex: number,\n segments: HighlightSegment[],\n contentWrapper: FakeArrayType\n ) {\n if (isWindowedHighlight) {\n let segment = segments.at(-1);\n if (\n segment == null ||\n segment.targetIndex + segment.count !== lineIndex\n ) {\n segment = {\n targetIndex: lineIndex,\n originalOffset: contentWrapper.length,\n count: 0,\n };\n segments.push(segment);\n }\n segment.count++;\n }\n contentWrapper.push(lineContent);\n }\n\n iterateOverDiff({\n diff,\n diffStyle: 'both',\n startingLine,\n totalLines,\n expandedHunks: isWindowedHighlight ? expandedHunksForIteration : true,\n collapsedContextThreshold,\n callback: ({ hunkIndex, additionLine, deletionLine, type }) => {\n const bucket = getBucketForHunk(hunkIndex);\n const splitLineIndex =\n additionLine != null\n ? additionLine.splitLineIndex\n : deletionLine.splitLineIndex;\n\n if (type === 'change' && additionLine != null && deletionLine != null) {\n computeLineDiffDecorations({\n additionLine: diff.additionLines[additionLine.lineIndex],\n deletionLine: diff.deletionLines[deletionLine.lineIndex],\n deletionLineIndex: bucket.deletionContent.length,\n additionLineIndex: bucket.additionContent.length,\n deletionDecorations: bucket.deletionDecorations,\n additionDecorations: bucket.additionDecorations,\n lineDiffType,\n maxLineDiffLength,\n });\n }\n\n if (deletionLine != null) {\n appendContent(\n diff.deletionLines[deletionLine.lineIndex],\n deletionLine.lineIndex,\n bucket.deletionSegments,\n bucket.deletionContent\n );\n bucket.deletionInfo.push({\n type: type === 'change' ? 'change-deletion' : type,\n lineNumber: deletionLine.lineNumber,\n altLineNumber:\n type === 'change'\n ? undefined\n : (additionLine.lineNumber ?? undefined),\n lineIndex: `${deletionLine.unifiedLineIndex},${splitLineIndex}`,\n });\n }\n\n if (additionLine != null) {\n appendContent(\n diff.additionLines[additionLine.lineIndex],\n additionLine.lineIndex,\n bucket.additionSegments,\n bucket.additionContent\n );\n bucket.additionInfo.push({\n type: type === 'change' ? 'change-addition' : type,\n lineNumber: additionLine.lineNumber,\n altLineNumber:\n type === 'change'\n ? undefined\n : (deletionLine.lineNumber ?? undefined),\n lineIndex: `${additionLine.unifiedLineIndex},${splitLineIndex}`,\n });\n }\n },\n });\n\n for (const bucket of buckets.values()) {\n if (\n bucket.deletionContent.length === 0 &&\n bucket.additionContent.length === 0\n ) {\n continue;\n }\n\n const deletionFile = {\n name: diff.prevName ?? diff.name,\n contents: bucket.deletionContent.value,\n };\n const additionFile = {\n name: diff.name,\n contents: bucket.additionContent.value,\n };\n const { deletionLines, additionLines } = renderTwoFiles({\n deletionFile,\n deletionInfo: bucket.deletionInfo,\n deletionDecorations: bucket.deletionDecorations,\n\n additionFile,\n additionInfo: bucket.additionInfo,\n additionDecorations: bucket.additionDecorations,\n\n highlighter,\n options,\n languageOverride: forcePlainText ? 'text' : diff.lang,\n });\n\n if (shouldGroupAll) {\n code.deletionLines = deletionLines;\n code.additionLines = additionLines;\n continue;\n }\n\n if (bucket.deletionSegments.length > 0) {\n for (const seg of bucket.deletionSegments) {\n for (let i = 0; i < seg.count; i++) {\n code.deletionLines[seg.targetIndex + i] =\n deletionLines[seg.originalOffset + i];\n }\n }\n } else {\n appendItems(code.deletionLines, deletionLines);\n }\n if (bucket.additionSegments.length > 0) {\n for (const seg of bucket.additionSegments) {\n for (let i = 0; i < seg.count; i++) {\n code.additionLines[seg.targetIndex + i] =\n additionLines[seg.originalOffset + i];\n }\n }\n } else {\n appendItems(code.additionLines, additionLines);\n }\n }\n\n return { code, themeStyles, baseThemeType };\n}\n\n// The line indexes and decoration arrays a line diff writes its highlights to\ninterface LineDiffDecorationTargets {\n deletionLineIndex: number;\n additionLineIndex: number;\n deletionDecorations: DecorationItem[];\n additionDecorations: DecorationItem[];\n}\n\ninterface ProcessLineDiffProps extends LineDiffDecorationTargets {\n deletionLine: string | undefined;\n additionLine: string | undefined;\n lineDiffType: LineDiffTypes;\n maxLineDiffLength: number;\n}\n\n// Push one decoration per side covering the first through last changed\n// token, so each line only has one highlight. Offsets come straight from the\n// diff items, skipping the span arrays the other word modes build.\nfunction pushWordLineDecorations(\n lineDiff: ChangeObject<string>[],\n {\n deletionLineIndex,\n additionLineIndex,\n deletionDecorations,\n additionDecorations,\n }: LineDiffDecorationTargets\n): void {\n let deletionOffset = 0;\n let additionOffset = 0;\n let deletionStart = -1;\n let deletionEnd = 0;\n let additionStart = -1;\n let additionEnd = 0;\n for (const { value, added, removed } of lineDiff) {\n if (removed) {\n if (deletionStart === -1) deletionStart = deletionOffset;\n deletionOffset += value.length;\n deletionEnd = deletionOffset;\n } else if (added) {\n if (additionStart === -1) additionStart = additionOffset;\n additionOffset += value.length;\n additionEnd = additionOffset;\n } else {\n deletionOffset += value.length;\n additionOffset += value.length;\n }\n }\n if (deletionStart !== -1) {\n deletionDecorations.push(\n createDiffSpanDecoration({\n line: deletionLineIndex,\n spanStart: deletionStart,\n spanLength: deletionEnd - deletionStart,\n })\n );\n }\n if (additionStart !== -1) {\n additionDecorations.push(\n createDiffSpanDecoration({\n line: additionLineIndex,\n spanStart: additionStart,\n spanLength: additionEnd - additionStart,\n })\n );\n }\n}\n\nfunction computeLineDiffDecorations({\n deletionLine,\n additionLine,\n deletionLineIndex,\n additionLineIndex,\n deletionDecorations,\n additionDecorations,\n lineDiffType,\n maxLineDiffLength,\n}: ProcessLineDiffProps) {\n if (deletionLine == null || additionLine == null || lineDiffType === 'none') {\n return;\n }\n deletionLine = cleanLastNewline(deletionLine);\n additionLine = cleanLastNewline(additionLine);\n // If we have really long lines, we probably shouldn't compute diffs on them.\n if (\n deletionLine.length > maxLineDiffLength ||\n additionLine.length > maxLineDiffLength\n ) {\n return;\n }\n // NOTE(amadeus): Because we visually trim trailing newlines when rendering,\n // we also gotta make sure the diff parsing doesn't include the newline\n // character that could be there...\n const lineDiff =\n lineDiffType === 'char'\n ? diffChars(deletionLine, additionLine)\n : diffWordsWithSpace(deletionLine, additionLine);\n if (lineDiffType === 'word-line') {\n pushWordLineDecorations(lineDiff, {\n deletionLineIndex,\n additionLineIndex,\n deletionDecorations,\n additionDecorations,\n });\n return;\n }\n const deletionSpans: [0 | 1, string][] = [];\n const additionSpans: [0 | 1, string][] = [];\n const enableJoin = lineDiffType === 'word-alt';\n const lastItem = lineDiff.at(-1);\n for (const item of lineDiff) {\n const isLastItem = item === lastItem;\n if (!item.added && !item.removed) {\n pushOrJoinSpan({\n item,\n arr: deletionSpans,\n enableJoin,\n isNeutral: true,\n isLastItem,\n });\n pushOrJoinSpan({\n item,\n arr: additionSpans,\n enableJoin,\n isNeutral: true,\n isLastItem,\n });\n } else if (item.removed) {\n pushOrJoinSpan({ item, arr: deletionSpans, enableJoin, isLastItem });\n } else {\n pushOrJoinSpan({ item, arr: additionSpans, enableJoin, isLastItem });\n }\n }\n let spanIndex = 0;\n for (const span of deletionSpans) {\n if (span[0] === 1) {\n deletionDecorations.push(\n createDiffSpanDecoration({\n line: deletionLineIndex,\n spanStart: spanIndex,\n spanLength: span[1].length,\n })\n );\n }\n spanIndex += span[1].length;\n }\n spanIndex = 0;\n for (const span of additionSpans) {\n if (span[0] === 1) {\n additionDecorations.push(\n createDiffSpanDecoration({\n line: additionLineIndex,\n spanStart: spanIndex,\n spanLength: span[1].length,\n })\n );\n }\n spanIndex += span[1].length;\n }\n}\n\ninterface HighlightSegment {\n // The where the highlighted region starts\n originalOffset: number;\n // Where to place the highlighted line in RenderDiffFilesResult\n targetIndex: number;\n // Number of highlighted lines\n count: number;\n}\n\ninterface FakeArrayType {\n push(value: string): void;\n value: string;\n length: number;\n}\n\ninterface RenderBucket {\n deletionContent: FakeArrayType;\n additionContent: FakeArrayType;\n deletionInfo: (LineInfo | undefined)[];\n additionInfo: (LineInfo | undefined)[];\n deletionDecorations: DecorationItem[];\n additionDecorations: DecorationItem[];\n deletionSegments: HighlightSegment[];\n additionSegments: HighlightSegment[];\n}\n\nfunction createBucket(): RenderBucket {\n return {\n deletionContent: {\n push(value: string) {\n this.value += value;\n this.length++;\n },\n value: '',\n length: 0,\n },\n additionContent: {\n push(value: string) {\n this.value += value;\n this.length++;\n },\n value: '',\n length: 0,\n },\n deletionInfo: [],\n additionInfo: [],\n deletionDecorations: [],\n additionDecorations: [],\n deletionSegments: [],\n additionSegments: [],\n };\n}\n\ninterface RenderTwoFilesProps {\n deletionFile: FileContents;\n additionFile: FileContents;\n deletionInfo: (LineInfo | undefined)[];\n additionInfo: (LineInfo | undefined)[];\n deletionDecorations: DecorationItem[];\n additionDecorations: DecorationItem[];\n options: RenderDiffOptions;\n highlighter: DiffsHighlighter;\n languageOverride: SupportedLanguages | undefined;\n}\n\nfunction renderTwoFiles({\n deletionFile,\n additionFile,\n deletionInfo,\n additionInfo,\n highlighter,\n deletionDecorations,\n additionDecorations,\n languageOverride,\n options: { theme: themeOrThemes, ...options },\n}: RenderTwoFilesProps): RenderDiffFilesResult {\n const deletionLang =\n languageOverride ?? getFiletypeFromFileName(deletionFile.name);\n const additionLang =\n languageOverride ?? getFiletypeFromFileName(additionFile.name);\n const { state, transformers } = createTransformerWithState(\n options.useTokenTransformer\n );\n // tokenizeTimeLimit: 0 — never trade silently-wrong token colors for\n // latency; see renderFileWithHighlighter for the full rationale.\n const hastConfig: CodeToHastOptions<DiffsThemeNames> = (() => {\n return typeof themeOrThemes === 'string'\n ? {\n ...options,\n // language will be overwritten for each highlight\n lang: 'text',\n theme: themeOrThemes,\n transformers,\n decorations: undefined,\n defaultColor: false,\n cssVariablePrefix: formatCSSVariablePrefix('token'),\n tokenizeTimeLimit: 0,\n }\n : {\n ...options,\n // language will be overwritten for each highlight\n lang: 'text',\n themes: themeOrThemes,\n transformers,\n decorations: undefined,\n defaultColor: false,\n cssVariablePrefix: formatCSSVariablePrefix('token'),\n tokenizeTimeLimit: 0,\n };\n })();\n\n const deletionLines = (() => {\n if (deletionFile.contents === '') {\n return [];\n }\n hastConfig.lang = deletionLang;\n state.lineInfo = deletionInfo;\n hastConfig.decorations = deletionDecorations;\n return getLineNodes(\n highlighter.codeToHast(\n cleanLastNewline(deletionFile.contents),\n hastConfig\n )\n );\n })();\n const additionLines = (() => {\n if (additionFile.contents === '') {\n return [];\n }\n hastConfig.lang = additionLang;\n hastConfig.decorations = additionDecorations;\n state.lineInfo = additionInfo;\n return getLineNodes(\n highlighter.codeToHast(\n cleanLastNewline(additionFile.contents),\n hastConfig\n )\n );\n })();\n\n return { deletionLines, additionLines };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"renderDiffWithHighlighter.js","names":[],"sources":["../../src/utils/renderDiffWithHighlighter.ts"],"sourcesContent":["import { type ChangeObject, diffChars, diffWordsWithSpace } from 'diff';\n\nimport { DEFAULT_COLLAPSED_CONTEXT_THRESHOLD } from '../constants';\nimport type {\n DecorationItem,\n DiffsHighlighter,\n FileContents,\n FileDiffMetadata,\n ForceDiffPlainTextOptions,\n LineDiffTypes,\n LineInfo,\n RenderDiffFilesResult,\n RenderDiffOptions,\n SupportedLanguages,\n ThemedDiffResult,\n} from '../types';\nimport { appendItems } from './appendItems';\nimport { cleanLastNewline } from './cleanLastNewline';\nimport { getFiletypeFromFileName } from './getFiletypeFromFileName';\nimport { getHighlighterThemeStyles } from './getHighlighterThemeStyles';\nimport { getTokenOptions } from './getTokenOptions';\nimport { iterateOverDiff } from './iterateOverDiff';\nimport {\n createDiffSpanDecoration,\n pushOrJoinSpan,\n} from './parseDiffDecorations';\nimport { renderTokenLines } from './renderTokenLines';\nimport { setDeferredArrayItem } from './setDeferredArrayItem';\n\nconst DEFAULT_PLAIN_TEXT_OPTIONS: ForceDiffPlainTextOptions = {\n forcePlainText: false,\n};\n\nexport function renderDiffWithHighlighter(\n diff: FileDiffMetadata,\n highlighter: DiffsHighlighter,\n options: RenderDiffOptions,\n {\n forcePlainText,\n lazyLineAST = false,\n startingLine,\n totalLines,\n expandedHunks,\n collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD,\n }: ForceDiffPlainTextOptions = DEFAULT_PLAIN_TEXT_OPTIONS\n): ThemedDiffResult {\n if (forcePlainText) {\n startingLine ??= 0;\n totalLines ??= Infinity;\n } else {\n // Tokenization must include preceding lines to preserve lexical state.\n startingLine = 0;\n totalLines = Infinity;\n }\n const isWindowedHighlight = startingLine > 0 || totalLines < Infinity;\n lazyLineAST &&= !forcePlainText && !options.useTokenTransformer;\n const baseThemeType =\n typeof options.theme === 'string'\n ? highlighter.getTheme(options.theme).type\n : undefined;\n const themeStyles = getHighlighterThemeStyles({\n theme: options.theme,\n highlighter,\n });\n\n // If we have a large file and we are rendering the WHOLE plain diff ast,\n // then we should remove the lineDiffType to make sure things render quickly.\n // For highlighted ASTs or windowed highlights, we should just inherit the\n // setting\n const lineDiffType =\n forcePlainText &&\n !isWindowedHighlight &&\n (diff.unifiedLineCount > 1000 || diff.splitLineCount > 1000)\n ? 'none'\n : options.lineDiffType;\n\n const code: RenderDiffFilesResult = {\n deletionLines: [],\n additionLines: [],\n };\n\n const { maxLineDiffLength } = options;\n const shouldGroupAll = !forcePlainText && !diff.isPartial;\n const expandedHunksForIteration = forcePlainText ? expandedHunks : undefined;\n const buckets = new Map<number, RenderBucket>();\n function getBucketForHunk(hunkIndex: number) {\n const index = shouldGroupAll ? 0 : hunkIndex;\n const bucket = buckets.get(index) ?? createBucket();\n buckets.set(index, bucket);\n return bucket;\n }\n\n function appendContent(\n lineContent: string,\n lineIndex: number,\n segments: HighlightSegment[],\n contentWrapper: FakeArrayType\n ) {\n if (isWindowedHighlight) {\n let segment = segments.at(-1);\n if (\n segment == null ||\n segment.targetIndex + segment.count !== lineIndex\n ) {\n segment = {\n targetIndex: lineIndex,\n originalOffset: contentWrapper.length,\n count: 0,\n };\n segments.push(segment);\n }\n segment.count++;\n }\n contentWrapper.push(lineContent);\n }\n\n iterateOverDiff({\n diff,\n diffStyle: 'both',\n startingLine,\n totalLines,\n expandedHunks: isWindowedHighlight ? expandedHunksForIteration : true,\n collapsedContextThreshold,\n callback: ({ hunkIndex, additionLine, deletionLine, type }) => {\n const bucket = getBucketForHunk(hunkIndex);\n const splitLineIndex =\n additionLine != null\n ? additionLine.splitLineIndex\n : deletionLine.splitLineIndex;\n\n if (type === 'change' && additionLine != null && deletionLine != null) {\n computeLineDiffDecorations({\n additionLine: diff.additionLines[additionLine.lineIndex],\n deletionLine: diff.deletionLines[deletionLine.lineIndex],\n deletionLineIndex: bucket.deletionContent.length,\n additionLineIndex: bucket.additionContent.length,\n deletionDecorations: bucket.deletionDecorations,\n additionDecorations: bucket.additionDecorations,\n lineDiffType,\n maxLineDiffLength,\n });\n }\n\n if (deletionLine != null) {\n appendContent(\n diff.deletionLines[deletionLine.lineIndex],\n deletionLine.lineIndex,\n bucket.deletionSegments,\n bucket.deletionContent\n );\n bucket.deletionInfo.push({\n type: type === 'change' ? 'change-deletion' : type,\n lineNumber: deletionLine.lineNumber,\n altLineNumber:\n type === 'change'\n ? undefined\n : (additionLine.lineNumber ?? undefined),\n lineIndex: `${deletionLine.unifiedLineIndex},${splitLineIndex}`,\n });\n }\n\n if (additionLine != null) {\n appendContent(\n diff.additionLines[additionLine.lineIndex],\n additionLine.lineIndex,\n bucket.additionSegments,\n bucket.additionContent\n );\n bucket.additionInfo.push({\n type: type === 'change' ? 'change-addition' : type,\n lineNumber: additionLine.lineNumber,\n altLineNumber:\n type === 'change'\n ? undefined\n : (deletionLine.lineNumber ?? undefined),\n lineIndex: `${additionLine.unifiedLineIndex},${splitLineIndex}`,\n });\n }\n },\n });\n\n for (const bucket of buckets.values()) {\n if (\n bucket.deletionContent.length === 0 &&\n bucket.additionContent.length === 0\n ) {\n continue;\n }\n\n const deletionFile = {\n name: diff.prevName ?? diff.name,\n contents: bucket.deletionContent.value,\n };\n const additionFile = {\n name: diff.name,\n contents: bucket.additionContent.value,\n };\n const { deletionLines, additionLines } = renderTwoFiles({\n deletionFile,\n deletionInfo: bucket.deletionInfo,\n deletionDecorations: bucket.deletionDecorations,\n\n additionFile,\n additionInfo: bucket.additionInfo,\n additionDecorations: bucket.additionDecorations,\n\n highlighter,\n options,\n languageOverride: forcePlainText ? 'text' : diff.lang,\n lazyLineAST,\n });\n\n if (shouldGroupAll) {\n code.deletionLines = deletionLines;\n code.additionLines = additionLines;\n continue;\n }\n\n for (const [target, lines, segments] of [\n [code.deletionLines, deletionLines, bucket.deletionSegments],\n [code.additionLines, additionLines, bucket.additionSegments],\n ] as const) {\n if (segments.length > 0) {\n for (const segment of segments) {\n for (let index = 0; index < segment.count; index++) {\n target[segment.targetIndex + index] =\n lines[segment.originalOffset + index];\n }\n }\n } else if (lazyLineAST) {\n const offset = target.length;\n for (let index = 0; index < lines.length; index++) {\n setDeferredArrayItem(target, offset + index, () => lines[index]);\n }\n } else {\n appendItems(target, lines);\n }\n }\n }\n\n return { code, themeStyles, baseThemeType };\n}\n\n// The line indexes and decoration arrays a line diff writes its highlights to\ninterface LineDiffDecorationTargets {\n deletionLineIndex: number;\n additionLineIndex: number;\n deletionDecorations: DecorationItem[];\n additionDecorations: DecorationItem[];\n}\n\ninterface ProcessLineDiffProps extends LineDiffDecorationTargets {\n deletionLine: string | undefined;\n additionLine: string | undefined;\n lineDiffType: LineDiffTypes;\n maxLineDiffLength: number;\n}\n\n// Push one decoration per side covering the first through last changed\n// token, so each line only has one highlight. Offsets come straight from the\n// diff items, skipping the span arrays the other word modes build.\nfunction pushWordLineDecorations(\n lineDiff: ChangeObject<string>[],\n {\n deletionLineIndex,\n additionLineIndex,\n deletionDecorations,\n additionDecorations,\n }: LineDiffDecorationTargets\n): void {\n let deletionOffset = 0;\n let additionOffset = 0;\n let deletionStart = -1;\n let deletionEnd = 0;\n let additionStart = -1;\n let additionEnd = 0;\n for (const { value, added, removed } of lineDiff) {\n if (removed) {\n if (deletionStart === -1) deletionStart = deletionOffset;\n deletionOffset += value.length;\n deletionEnd = deletionOffset;\n } else if (added) {\n if (additionStart === -1) additionStart = additionOffset;\n additionOffset += value.length;\n additionEnd = additionOffset;\n } else {\n deletionOffset += value.length;\n additionOffset += value.length;\n }\n }\n if (deletionStart !== -1) {\n deletionDecorations.push(\n createDiffSpanDecoration({\n line: deletionLineIndex,\n spanStart: deletionStart,\n spanLength: deletionEnd - deletionStart,\n })\n );\n }\n if (additionStart !== -1) {\n additionDecorations.push(\n createDiffSpanDecoration({\n line: additionLineIndex,\n spanStart: additionStart,\n spanLength: additionEnd - additionStart,\n })\n );\n }\n}\n\nfunction computeLineDiffDecorations({\n deletionLine,\n additionLine,\n deletionLineIndex,\n additionLineIndex,\n deletionDecorations,\n additionDecorations,\n lineDiffType,\n maxLineDiffLength,\n}: ProcessLineDiffProps) {\n if (deletionLine == null || additionLine == null || lineDiffType === 'none') {\n return;\n }\n deletionLine = cleanLastNewline(deletionLine);\n additionLine = cleanLastNewline(additionLine);\n // If we have really long lines, we probably shouldn't compute diffs on them.\n if (\n deletionLine.length > maxLineDiffLength ||\n additionLine.length > maxLineDiffLength\n ) {\n return;\n }\n // NOTE(amadeus): Because we visually trim trailing newlines when rendering,\n // we also gotta make sure the diff parsing doesn't include the newline\n // character that could be there...\n const lineDiff =\n lineDiffType === 'char'\n ? diffChars(deletionLine, additionLine)\n : diffWordsWithSpace(deletionLine, additionLine);\n if (lineDiffType === 'word-line') {\n pushWordLineDecorations(lineDiff, {\n deletionLineIndex,\n additionLineIndex,\n deletionDecorations,\n additionDecorations,\n });\n return;\n }\n const deletionSpans: [0 | 1, string][] = [];\n const additionSpans: [0 | 1, string][] = [];\n const enableJoin = lineDiffType === 'word-alt';\n const lastItem = lineDiff.at(-1);\n for (const item of lineDiff) {\n const isLastItem = item === lastItem;\n if (!item.added && !item.removed) {\n pushOrJoinSpan({\n item,\n arr: deletionSpans,\n enableJoin,\n isNeutral: true,\n isLastItem,\n });\n pushOrJoinSpan({\n item,\n arr: additionSpans,\n enableJoin,\n isNeutral: true,\n isLastItem,\n });\n } else if (item.removed) {\n pushOrJoinSpan({ item, arr: deletionSpans, enableJoin, isLastItem });\n } else {\n pushOrJoinSpan({ item, arr: additionSpans, enableJoin, isLastItem });\n }\n }\n let spanIndex = 0;\n for (const span of deletionSpans) {\n if (span[0] === 1) {\n deletionDecorations.push(\n createDiffSpanDecoration({\n line: deletionLineIndex,\n spanStart: spanIndex,\n spanLength: span[1].length,\n })\n );\n }\n spanIndex += span[1].length;\n }\n spanIndex = 0;\n for (const span of additionSpans) {\n if (span[0] === 1) {\n additionDecorations.push(\n createDiffSpanDecoration({\n line: additionLineIndex,\n spanStart: spanIndex,\n spanLength: span[1].length,\n })\n );\n }\n spanIndex += span[1].length;\n }\n}\n\ninterface HighlightSegment {\n // The where the highlighted region starts\n originalOffset: number;\n // Where to place the highlighted line in RenderDiffFilesResult\n targetIndex: number;\n // Number of highlighted lines\n count: number;\n}\n\ninterface FakeArrayType {\n push(value: string): void;\n value: string;\n length: number;\n}\n\ninterface RenderBucket {\n deletionContent: FakeArrayType;\n additionContent: FakeArrayType;\n deletionInfo: (LineInfo | undefined)[];\n additionInfo: (LineInfo | undefined)[];\n deletionDecorations: DecorationItem[];\n additionDecorations: DecorationItem[];\n deletionSegments: HighlightSegment[];\n additionSegments: HighlightSegment[];\n}\n\nfunction createBucket(): RenderBucket {\n return {\n deletionContent: {\n push(value: string) {\n this.value += value;\n this.length++;\n },\n value: '',\n length: 0,\n },\n additionContent: {\n push(value: string) {\n this.value += value;\n this.length++;\n },\n value: '',\n length: 0,\n },\n deletionInfo: [],\n additionInfo: [],\n deletionDecorations: [],\n additionDecorations: [],\n deletionSegments: [],\n additionSegments: [],\n };\n}\n\ninterface RenderTwoFilesProps {\n lazyLineAST: boolean;\n deletionFile: FileContents;\n additionFile: FileContents;\n deletionInfo: (LineInfo | undefined)[];\n additionInfo: (LineInfo | undefined)[];\n deletionDecorations: DecorationItem[];\n additionDecorations: DecorationItem[];\n options: RenderDiffOptions;\n highlighter: DiffsHighlighter;\n languageOverride: SupportedLanguages | undefined;\n}\n\nfunction renderTwoFiles({\n lazyLineAST,\n deletionFile,\n additionFile,\n deletionInfo,\n additionInfo,\n highlighter,\n deletionDecorations,\n additionDecorations,\n languageOverride,\n options: { theme, useTokenTransformer, tokenizeMaxLineLength },\n}: RenderTwoFilesProps): RenderDiffFilesResult {\n const renderFile = (\n file: FileContents,\n lineInfo: (LineInfo | undefined)[],\n decorations: DecorationItem[]\n ): RenderDiffFilesResult['additionLines'] => {\n if (file.contents === '') return [];\n return renderTokenLines(\n highlighter.codeToTokens(\n cleanLastNewline(file.contents),\n getTokenOptions(\n languageOverride ?? getFiletypeFromFileName(file.name),\n theme,\n tokenizeMaxLineLength\n )\n ).tokens,\n {\n state: { lineInfo },\n useTokenTransformer,\n decorations,\n lazyLineAST,\n cacheHtmlStyles: highlighter.name === 'highlights',\n }\n );\n };\n\n return {\n deletionLines: renderFile(deletionFile, deletionInfo, deletionDecorations),\n additionLines: renderFile(additionFile, additionInfo, additionDecorations),\n };\n}\n"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
- import { DiffsHighlighter, FileContents, ForceFilePlainTextOptions, RenderFileOptions, ThemedFileResult } from "../types.js";
1
+ import { DiffsHighlighter } from "../highlighter/DiffsHighlighter.js";
2
+ import { FileContents, ForceFilePlainTextOptions, RenderFileOptions, ThemedFileResult } from "../types.js";
2
3
  //#region src/utils/renderFileWithHighlighter.d.ts
3
- declare function renderFileWithHighlighter(file: FileContents, highlighter: DiffsHighlighter, { theme, tokenizeMaxLineLength, useTokenTransformer }: RenderFileOptions, { forcePlainText, startingLine, totalLines, lines }?: ForceFilePlainTextOptions): ThemedFileResult;
4
+ declare function renderFileWithHighlighter(file: FileContents, highlighter: DiffsHighlighter, { theme, tokenizeMaxLineLength, useTokenTransformer }: RenderFileOptions, { forcePlainText, lazyLineAST, startingLine, totalLines, lines }?: ForceFilePlainTextOptions): ThemedFileResult;
4
5
  //#endregion
5
6
  export { renderFileWithHighlighter };
6
7
  //# sourceMappingURL=renderFileWithHighlighter.d.ts.map