@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
@@ -1,70 +1,82 @@
1
- import { areLanguagesAttached } from "./languages/areLanguagesAttached.js";
2
- import { attachResolvedLanguages } from "./languages/attachResolvedLanguages.js";
1
+ import { HighlighterDisposedError, acquireHighlighterType, getHighlighterType, releaseHighlighterType, resolveHighlighterType } from "./highlighterType.js";
3
2
  import { cleanUpResolvedLanguages } from "./languages/cleanUpResolvedLanguages.js";
4
- import { getResolvedOrResolveLanguage } from "./languages/getResolvedOrResolveLanguage.js";
5
3
  import { areThemesAttached } from "./themes/areThemesAttached.js";
6
- import { themeResolver } from "./themes/themeResolver.js";
7
- import { attachResolvedThemes } from "./themes/attachResolvedThemes.js";
8
4
  import { cleanUpResolvedThemes } from "./themes/cleanUpResolvedThemes.js";
9
- import { getResolvedOrResolveTheme } from "./themes/getResolvedOrResolveTheme.js";
10
- import { createHighlighter, createJavaScriptRegexEngine, createOnigurumaEngine } from "shiki";
11
- import { pierreThemes } from "@pierre/theming/themes";
12
5
  //#region src/highlighter/shared_highlighter.ts
13
6
  let highlighter;
14
- async function getSharedHighlighter({ themes, langs, preferredHighlighter = "shiki-js" }) {
15
- highlighter ??= createHighlighter({
16
- themes: [],
17
- langs: ["text"],
18
- engine: preferredHighlighter === "shiki-wasm" ? createOnigurumaEngine(import("shiki/wasm")) : createJavaScriptRegexEngine()
19
- });
20
- const instance = isHighlighterLoading(highlighter) ? await highlighter : highlighter;
21
- highlighter = instance;
22
- const languageLoaders = [];
23
- for (const language of Array.from(new Set(langs))) {
24
- if (language === "text" || language === "ansi") continue;
25
- const maybeResolvedLanguage = getResolvedOrResolveLanguage(language);
26
- if ("then" in maybeResolvedLanguage) languageLoaders.push(maybeResolvedLanguage);
27
- else attachResolvedLanguages(maybeResolvedLanguage, instance);
7
+ /**
8
+ * Creates an instance the caller must dispose. Defaults to the active type
9
+ * or DEFAULT_HIGHLIGHTER; rejects if a different type is already active.
10
+ */
11
+ async function createHighlighter(type) {
12
+ const resolvedType = resolveHighlighterType(type);
13
+ acquireHighlighterType(resolvedType);
14
+ try {
15
+ if (resolvedType === "highlights") {
16
+ const { HighlightsHighlighter } = await import("./backends/highlights.js");
17
+ return new HighlightsHighlighter();
18
+ }
19
+ const { ShikiHighlighter } = await import("./backends/shiki.js");
20
+ return await ShikiHighlighter.create(resolvedType);
21
+ } finally {
22
+ releaseHighlighterType();
28
23
  }
29
- const themeLoaders = [];
30
- for (const themeName of themes) {
31
- const maybeResolvedTheme = getResolvedOrResolveTheme(themeName);
32
- if ("then" in maybeResolvedTheme) themeLoaders.push(maybeResolvedTheme);
33
- else attachResolvedThemes(maybeResolvedTheme, highlighter);
24
+ }
25
+ async function getSharedHighlighter({ themes, langs, preferredHighlighter }) {
26
+ dropDisposedHighlighter();
27
+ const cached = highlighter ??= createHighlighter(getHighlighterType() ?? preferredHighlighter);
28
+ let instance;
29
+ try {
30
+ instance = await cached;
31
+ } catch (error) {
32
+ if (highlighter === cached) highlighter = void 0;
33
+ throw error;
34
34
  }
35
- if (languageLoaders.length > 0 || themeLoaders.length > 0) await Promise.all([Promise.all(languageLoaders).then((languages) => {
36
- attachResolvedLanguages(languages, instance);
37
- }), Promise.all(themeLoaders).then((themes) => {
38
- attachResolvedThemes(themes, instance);
39
- })]);
35
+ if (highlighter === cached) highlighter = instance;
36
+ await Promise.all([instance.themeResolver.resolveThemes(themes), instance.loadLanguages(langs)]);
37
+ if (instance.isDisposed) throw new HighlighterDisposedError();
40
38
  return instance;
41
39
  }
42
- function isHighlighterLoaded(h = highlighter) {
43
- return h != null && !("then" in h);
40
+ function dropDisposedHighlighter() {
41
+ if (highlighter != null && !("then" in highlighter) && highlighter.isDisposed) highlighter = void 0;
42
+ }
43
+ function isHighlighterLoaded() {
44
+ dropDisposedHighlighter();
45
+ return highlighter != null && !("then" in highlighter);
44
46
  }
45
- function getHighlighterIfLoaded(withSettings) {
46
- if (highlighter == null || "then" in highlighter) return;
47
- if (withSettings != null && (!areThemesAttached(withSettings.theme) || !areLanguagesAttached(withSettings.lang))) return;
48
- return highlighter;
47
+ /**
48
+ * Returns undefined if the theme or language is not loaded.
49
+ */
50
+ function getHighlighterIfLoaded({ theme, lang } = {}) {
51
+ dropDisposedHighlighter();
52
+ const instance = highlighter;
53
+ if (instance == null || "then" in instance || theme != null && !areThemesAttached(theme, instance) || lang != null && !instance.hasLoadedLanguages([lang])) return;
54
+ return instance;
49
55
  }
50
- function isHighlighterLoading(h = highlighter) {
51
- return h != null && "then" in h;
56
+ function isHighlighterLoading() {
57
+ return highlighter != null && "then" in highlighter;
52
58
  }
53
- function isHighlighterNull(h = highlighter) {
54
- return h == null;
59
+ function isHighlighterNull() {
60
+ dropDisposedHighlighter();
61
+ return highlighter == null;
55
62
  }
56
63
  async function preloadHighlighter(options) {
57
64
  await getSharedHighlighter(options);
58
65
  }
66
+ /**
67
+ * Disposes an already loaded shared instance synchronously and clears caches.
68
+ * Instances from createHighlighter() must be disposed separately before
69
+ * switching types.
70
+ */
59
71
  async function disposeHighlighter() {
60
- if (highlighter == null) return;
61
- (await highlighter).dispose();
72
+ const cached = highlighter;
73
+ highlighter = void 0;
62
74
  cleanUpResolvedLanguages();
63
75
  cleanUpResolvedThemes();
64
- highlighter = void 0;
76
+ if (cached != null && "then" in cached) (await cached.catch(() => void 0))?.dispose();
77
+ else cached?.dispose();
65
78
  }
66
- for (const descriptor of pierreThemes.getThemes()) themeResolver.registerThemeIfAbsent(descriptor.name, descriptor.load);
67
79
  //#endregion
68
- export { disposeHighlighter, getHighlighterIfLoaded, getSharedHighlighter, isHighlighterLoaded, isHighlighterLoading, isHighlighterNull, preloadHighlighter };
80
+ export { HighlighterDisposedError, createHighlighter, disposeHighlighter, getHighlighterIfLoaded, getHighlighterType, getSharedHighlighter, isHighlighterLoaded, isHighlighterLoading, isHighlighterNull, preloadHighlighter };
69
81
 
70
82
  //# sourceMappingURL=shared_highlighter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared_highlighter.js","names":[],"sources":["../../src/highlighter/shared_highlighter.ts"],"sourcesContent":["import type { ThemeLoader } from '@pierre/theming';\nimport { pierreThemes } from '@pierre/theming/themes';\nimport {\n createHighlighter,\n createJavaScriptRegexEngine,\n createOnigurumaEngine,\n} from 'shiki';\n\nimport type {\n DiffsHighlighter,\n DiffsThemeNames,\n HighlighterTypes,\n SupportedLanguages,\n ThemeRegistrationResolved,\n ThemesType,\n} from '../types';\nimport type { ResolvedLanguage } from '../worker/types';\nimport { areLanguagesAttached } from './languages/areLanguagesAttached';\nimport { attachResolvedLanguages } from './languages/attachResolvedLanguages';\nimport { cleanUpResolvedLanguages } from './languages/cleanUpResolvedLanguages';\nimport { getResolvedOrResolveLanguage } from './languages/getResolvedOrResolveLanguage';\nimport { areThemesAttached } from './themes/areThemesAttached';\nimport { attachResolvedThemes } from './themes/attachResolvedThemes';\nimport { cleanUpResolvedThemes } from './themes/cleanUpResolvedThemes';\nimport { getResolvedOrResolveTheme } from './themes/getResolvedOrResolveTheme';\nimport { themeResolver } from './themes/themeResolver';\n\ntype CachedOrLoadingHighlighterType =\n | Promise<DiffsHighlighter>\n | DiffsHighlighter\n | undefined;\n\nlet highlighter: CachedOrLoadingHighlighterType;\n\ninterface HighlighterOptions {\n themes: DiffsThemeNames[];\n langs: SupportedLanguages[];\n preferredHighlighter?: HighlighterTypes;\n}\n\nexport async function getSharedHighlighter({\n themes,\n langs,\n preferredHighlighter = 'shiki-js',\n}: HighlighterOptions): Promise<DiffsHighlighter> {\n highlighter ??= createHighlighter({\n themes: [],\n langs: ['text'],\n engine:\n preferredHighlighter === 'shiki-wasm'\n ? createOnigurumaEngine(import('shiki/wasm'))\n : createJavaScriptRegexEngine(),\n }) as Promise<DiffsHighlighter>;\n\n const instance = isHighlighterLoading(highlighter)\n ? await highlighter\n : highlighter;\n highlighter = instance;\n\n const languageLoaders: Promise<ResolvedLanguage>[] = [];\n for (const language of Array.from(new Set(langs))) {\n if (language === 'text' || language === 'ansi') continue;\n const maybeResolvedLanguage = getResolvedOrResolveLanguage(language);\n if ('then' in maybeResolvedLanguage) {\n languageLoaders.push(maybeResolvedLanguage);\n } else {\n attachResolvedLanguages(maybeResolvedLanguage, instance);\n }\n }\n\n const themeLoaders: Promise<ThemeRegistrationResolved>[] = [];\n for (const themeName of themes) {\n const maybeResolvedTheme = getResolvedOrResolveTheme(themeName);\n if ('then' in maybeResolvedTheme) {\n themeLoaders.push(maybeResolvedTheme);\n } else {\n attachResolvedThemes(maybeResolvedTheme, highlighter);\n }\n }\n\n // If we need to load any languages or themes, lets do that now\n if (languageLoaders.length > 0 || themeLoaders.length > 0) {\n await Promise.all([\n Promise.all(languageLoaders).then((languages) => {\n attachResolvedLanguages(languages, instance);\n }),\n Promise.all(themeLoaders).then((themes) => {\n attachResolvedThemes(themes, instance);\n }),\n ]);\n }\n\n return instance;\n}\n\nexport function isHighlighterLoaded(\n h: CachedOrLoadingHighlighterType = highlighter\n): h is DiffsHighlighter {\n return h != null && !('then' in h);\n}\n\ninterface GetHighlighterIfLoadedProps {\n theme: DiffsThemeNames | ThemesType;\n lang: SupportedLanguages;\n}\n\nexport function getHighlighterIfLoaded(\n withSettings?: GetHighlighterIfLoadedProps\n): DiffsHighlighter | undefined {\n if (highlighter == null || 'then' in highlighter) {\n return undefined;\n }\n if (\n withSettings != null &&\n (!areThemesAttached(withSettings.theme) ||\n !areLanguagesAttached(withSettings.lang))\n ) {\n return undefined;\n }\n return highlighter;\n}\n\nexport function isHighlighterLoading(\n h: CachedOrLoadingHighlighterType = highlighter\n): h is Promise<DiffsHighlighter> {\n return h != null && 'then' in h;\n}\n\nexport function isHighlighterNull(\n h: CachedOrLoadingHighlighterType = highlighter\n): h is undefined {\n return h == null;\n}\n\nexport async function preloadHighlighter(\n options: HighlighterOptions\n): Promise<void> {\n return void (await getSharedHighlighter(options));\n}\n\nexport async function disposeHighlighter(): Promise<void> {\n if (highlighter == null) return;\n (await highlighter).dispose();\n cleanUpResolvedLanguages();\n cleanUpResolvedThemes();\n highlighter = undefined;\n}\n\nfor (const descriptor of pierreThemes.getThemes()) {\n themeResolver.registerThemeIfAbsent(\n descriptor.name,\n descriptor.load as ThemeLoader<ThemeRegistrationResolved>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAgCA,IAAI;AAQJ,eAAsB,qBAAqB,EACzC,QACA,OACA,uBAAuB,cACyB;CAChD,gBAAgB,kBAAkB;EAChC,QAAQ,CAAC;EACT,OAAO,CAAC,MAAM;EACd,QACE,yBAAyB,eACrB,sBAAsB,OAAO,aAAa,IAC1C,4BAA4B;CACpC,CAAC;CAED,MAAM,WAAW,qBAAqB,WAAW,IAC7C,MAAM,cACN;CACJ,cAAc;CAEd,MAAM,kBAA+C,CAAC;CACtD,KAAK,MAAM,YAAY,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG;EACjD,IAAI,aAAa,UAAU,aAAa,QAAQ;EAChD,MAAM,wBAAwB,6BAA6B,QAAQ;EACnE,IAAI,UAAU,uBACZ,gBAAgB,KAAK,qBAAqB;OAE1C,wBAAwB,uBAAuB,QAAQ;CAE3D;CAEA,MAAM,eAAqD,CAAC;CAC5D,KAAK,MAAM,aAAa,QAAQ;EAC9B,MAAM,qBAAqB,0BAA0B,SAAS;EAC9D,IAAI,UAAU,oBACZ,aAAa,KAAK,kBAAkB;OAEpC,qBAAqB,oBAAoB,WAAW;CAExD;CAGA,IAAI,gBAAgB,SAAS,KAAK,aAAa,SAAS,GACtD,MAAM,QAAQ,IAAI,CAChB,QAAQ,IAAI,eAAe,CAAC,CAAC,MAAM,cAAc;EAC/C,wBAAwB,WAAW,QAAQ;CAC7C,CAAC,GACD,QAAQ,IAAI,YAAY,CAAC,CAAC,MAAM,WAAW;EACzC,qBAAqB,QAAQ,QAAQ;CACvC,CAAC,CACH,CAAC;CAGH,OAAO;AACT;AAEA,SAAgB,oBACd,IAAoC,aACb;CACvB,OAAO,KAAK,QAAQ,EAAE,UAAU;AAClC;AAOA,SAAgB,uBACd,cAC8B;CAC9B,IAAI,eAAe,QAAQ,UAAU,aACnC;CAEF,IACE,gBAAgB,SACf,CAAC,kBAAkB,aAAa,KAAK,KACpC,CAAC,qBAAqB,aAAa,IAAI,IAEzC;CAEF,OAAO;AACT;AAEA,SAAgB,qBACd,IAAoC,aACJ;CAChC,OAAO,KAAK,QAAQ,UAAU;AAChC;AAEA,SAAgB,kBACd,IAAoC,aACpB;CAChB,OAAO,KAAK;AACd;AAEA,eAAsB,mBACpB,SACe;CACR,MAAY,qBAAqB,OAAO;AACjD;AAEA,eAAsB,qBAAoC;CACxD,IAAI,eAAe,MAAM;CACzB,CAAC,MAAM,YAAA,CAAa,QAAQ;CAC5B,yBAAyB;CACzB,sBAAsB;CACtB,cAAc,KAAA;AAChB;AAEA,KAAK,MAAM,cAAc,aAAa,UAAU,GAC9C,cAAc,sBACZ,WAAW,MACX,WAAW,IACb"}
1
+ {"version":3,"file":"shared_highlighter.js","names":[],"sources":["../../src/highlighter/shared_highlighter.ts"],"sourcesContent":["import type {\n DiffsHighlighter,\n DiffsThemeNames,\n HighlighterTypes,\n SupportedLanguages,\n ThemesType,\n} from '../types';\nimport {\n acquireHighlighterType,\n getHighlighterType,\n HighlighterDisposedError,\n releaseHighlighterType,\n resolveHighlighterType,\n} from './highlighterType';\nimport { cleanUpResolvedLanguages } from './languages/cleanUpResolvedLanguages';\nimport { areThemesAttached } from './themes/areThemesAttached';\nimport { cleanUpResolvedThemes } from './themes/cleanUpResolvedThemes';\n\nexport {\n getHighlighterType,\n HighlighterDisposedError,\n} from './highlighterType';\n\nlet highlighter: DiffsHighlighter | Promise<DiffsHighlighter> | undefined;\n\nexport interface HighlighterOptions {\n themes: DiffsThemeNames[];\n langs: SupportedLanguages[];\n preferredHighlighter?: HighlighterTypes;\n}\n\n/**\n * Creates an instance the caller must dispose. Defaults to the active type\n * or DEFAULT_HIGHLIGHTER; rejects if a different type is already active.\n */\nexport async function createHighlighter(\n type?: HighlighterTypes\n): Promise<DiffsHighlighter> {\n const resolvedType = resolveHighlighterType(type);\n // Reserve the type before importing to prevent concurrent backend loads.\n acquireHighlighterType(resolvedType);\n try {\n if (resolvedType === 'highlights') {\n const { HighlightsHighlighter } = await import('./backends/highlights');\n return new HighlightsHighlighter();\n }\n const { ShikiHighlighter } = await import('./backends/shiki');\n return await ShikiHighlighter.create(resolvedType);\n } finally {\n releaseHighlighterType();\n }\n}\n\nexport async function getSharedHighlighter({\n themes,\n langs,\n preferredHighlighter,\n}: HighlighterOptions): Promise<DiffsHighlighter> {\n dropDisposedHighlighter();\n const cached = (highlighter ??= createHighlighter(\n getHighlighterType() ?? preferredHighlighter\n ));\n let instance: DiffsHighlighter;\n try {\n instance = await cached;\n } catch (error) {\n // Allow retries without clearing a newer request.\n if (highlighter === cached) {\n highlighter = undefined;\n }\n throw error;\n }\n if (highlighter === cached) {\n highlighter = instance;\n }\n await Promise.all([\n instance.themeResolver.resolveThemes(themes),\n instance.loadLanguages(langs),\n ]);\n // disposeHighlighter() may run while themes and languages load.\n if (instance.isDisposed) {\n throw new HighlighterDisposedError();\n }\n return instance;\n}\n\n// Direct dispose() calls leave the shared reference pointing to a dead instance.\nfunction dropDisposedHighlighter(): void {\n if (\n highlighter != null &&\n !('then' in highlighter) &&\n highlighter.isDisposed\n ) {\n highlighter = undefined;\n }\n}\n\nexport function isHighlighterLoaded(): boolean {\n dropDisposedHighlighter();\n return highlighter != null && !('then' in highlighter);\n}\n\ninterface GetHighlighterIfLoadedProps {\n theme?: DiffsThemeNames | ThemesType;\n lang?: SupportedLanguages;\n}\n\n/**\n * Returns undefined if the theme or language is not loaded.\n */\nexport function getHighlighterIfLoaded({\n theme,\n lang,\n}: GetHighlighterIfLoadedProps = {}): DiffsHighlighter | undefined {\n dropDisposedHighlighter();\n const instance = highlighter;\n if (\n instance == null ||\n 'then' in instance ||\n (theme != null && !areThemesAttached(theme, instance)) ||\n (lang != null && !instance.hasLoadedLanguages([lang]))\n ) {\n return undefined;\n }\n return instance;\n}\n\nexport function isHighlighterLoading(): boolean {\n return highlighter != null && 'then' in highlighter;\n}\n\nexport function isHighlighterNull(): boolean {\n dropDisposedHighlighter();\n return highlighter == null;\n}\n\nexport async function preloadHighlighter(\n options: HighlighterOptions\n): Promise<void> {\n await getSharedHighlighter(options);\n}\n\n/**\n * Disposes an already loaded shared instance synchronously and clears caches.\n * Instances from createHighlighter() must be disposed separately before\n * switching types.\n */\nexport async function disposeHighlighter(): Promise<void> {\n const cached = highlighter;\n highlighter = undefined;\n cleanUpResolvedLanguages();\n cleanUpResolvedThemes();\n if (cached != null && 'then' in cached) {\n // A failed initialization has nothing to dispose.\n (await cached.catch(() => undefined))?.dispose();\n } else {\n cached?.dispose();\n }\n}\n"],"mappings":";;;;;AAuBA,IAAI;;;;;AAYJ,eAAsB,kBACpB,MAC2B;CAC3B,MAAM,eAAe,uBAAuB,IAAI;CAEhD,uBAAuB,YAAY;CACnC,IAAI;EACF,IAAI,iBAAiB,cAAc;GACjC,MAAM,EAAE,0BAA0B,MAAM,OAAO;GAC/C,OAAO,IAAI,sBAAsB;EACnC;EACA,MAAM,EAAE,qBAAqB,MAAM,OAAO;EAC1C,OAAO,MAAM,iBAAiB,OAAO,YAAY;CACnD,UAAU;EACR,uBAAuB;CACzB;AACF;AAEA,eAAsB,qBAAqB,EACzC,QACA,OACA,wBACgD;CAChD,wBAAwB;CACxB,MAAM,SAAU,gBAAgB,kBAC9B,mBAAmB,KAAK,oBAC1B;CACA,IAAI;CACJ,IAAI;EACF,WAAW,MAAM;CACnB,SAAS,OAAO;EAEd,IAAI,gBAAgB,QAClB,cAAc,KAAA;EAEhB,MAAM;CACR;CACA,IAAI,gBAAgB,QAClB,cAAc;CAEhB,MAAM,QAAQ,IAAI,CAChB,SAAS,cAAc,cAAc,MAAM,GAC3C,SAAS,cAAc,KAAK,CAC9B,CAAC;CAED,IAAI,SAAS,YACX,MAAM,IAAI,yBAAyB;CAErC,OAAO;AACT;AAGA,SAAS,0BAAgC;CACvC,IACE,eAAe,QACf,EAAE,UAAU,gBACZ,YAAY,YAEZ,cAAc,KAAA;AAElB;AAEA,SAAgB,sBAA+B;CAC7C,wBAAwB;CACxB,OAAO,eAAe,QAAQ,EAAE,UAAU;AAC5C;;;;AAUA,SAAgB,uBAAuB,EACrC,OACA,SAC+B,CAAC,GAAiC;CACjE,wBAAwB;CACxB,MAAM,WAAW;CACjB,IACE,YAAY,QACZ,UAAU,YACT,SAAS,QAAQ,CAAC,kBAAkB,OAAO,QAAQ,KACnD,QAAQ,QAAQ,CAAC,SAAS,mBAAmB,CAAC,IAAI,CAAC,GAEpD;CAEF,OAAO;AACT;AAEA,SAAgB,uBAAgC;CAC9C,OAAO,eAAe,QAAQ,UAAU;AAC1C;AAEA,SAAgB,oBAA6B;CAC3C,wBAAwB;CACxB,OAAO,eAAe;AACxB;AAEA,eAAsB,mBACpB,SACe;CACf,MAAM,qBAAqB,OAAO;AACpC;;;;;;AAOA,eAAsB,qBAAoC;CACxD,MAAM,SAAS;CACf,cAAc,KAAA;CACd,yBAAyB;CACzB,sBAAsB;CACtB,IAAI,UAAU,QAAQ,UAAU,QAE9B,CAAC,MAAM,OAAO,YAAY,KAAA,CAAS,EAAA,EAAI,QAAQ;MAE/C,QAAQ,QAAQ;AAEpB"}
@@ -0,0 +1,25 @@
1
+ import { DiffsEditorTokenizer } from "./DiffsEditorTokenizer.js";
2
+ import { DiffsEditorTokenizerOptions } from "./tokenizer-types.js";
3
+ import { DiffsHighlighter } from "./DiffsHighlighter.js";
4
+ import "./types.js";
5
+ import { HighlightedToken, RenderRange } from "../types.js";
6
+ import { TextDocumentChange } from "../editor/textDocument.js";
7
+ import { HighlighterCore } from "shiki/core";
8
+ //#region src/highlighter/shiki-editor.d.ts
9
+ /** TextMate state caching and background work for a single editable document. */
10
+ declare class ShikiEditorTokenizer implements DiffsEditorTokenizer {
11
+ #private;
12
+ private readonly backend?;
13
+ getStringCommentRegexpRangesInLine(lineIndex: number): [number, number][] | null;
14
+ constructor(highlighter: HighlighterCore, options: DiffsEditorTokenizerOptions, backend?: Pick<DiffsHighlighter, 'getTheme' | 'loadLanguages'> | undefined);
15
+ setTheme(themeName: string): void;
16
+ dispose(): void;
17
+ tokenize(change: TextDocumentChange, renderRange?: RenderRange, hostRealignsRows?: boolean): Map<number, Array<HighlightedToken>>;
18
+ prebuildStateStack(renderRange?: RenderRange): void;
19
+ stopBackgroundTokenize(): void;
20
+ pauseBackgroundTokenize(): void;
21
+ resumeBackgroundTokenize(): void;
22
+ }
23
+ //#endregion
24
+ export { ShikiEditorTokenizer };
25
+ //# sourceMappingURL=shiki-editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shiki-editor.d.ts","names":[],"sources":["../../src/highlighter/shiki-editor.ts"],"mappings":";;;;;;;;;cAoBa,gCAAgC;;mBAwGxB;EA1BnB,mCACE;EAsBF,YACE,aAAa,iBACb,SAAS,6BACQ,UAAU,KACzB;EAiBJ,SAAS;EA0BT;EAOA,SACE,QAAQ,oBACR,cAAc,aACd,6BACC,YAAY,MAAM;EAwOrB,mBAAmB,cAAc;EAKjC;EAiBA;EAYA"}