@pierre/diffs 1.1.0-beta.4 → 1.1.0-beta.6

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 (56) hide show
  1. package/dist/components/File.d.ts +6 -0
  2. package/dist/components/File.d.ts.map +1 -1
  3. package/dist/components/File.js +4 -5
  4. package/dist/components/File.js.map +1 -1
  5. package/dist/components/FileDiff.d.ts +6 -0
  6. package/dist/components/FileDiff.d.ts.map +1 -1
  7. package/dist/components/FileDiff.js +4 -5
  8. package/dist/components/FileDiff.js.map +1 -1
  9. package/dist/constants.d.ts +2 -1
  10. package/dist/constants.d.ts.map +1 -1
  11. package/dist/constants.js +2 -1
  12. package/dist/constants.js.map +1 -1
  13. package/dist/highlighter/languages/constants.d.ts +3 -1
  14. package/dist/highlighter/languages/constants.d.ts.map +1 -1
  15. package/dist/highlighter/languages/constants.js +2 -1
  16. package/dist/highlighter/languages/constants.js.map +1 -1
  17. package/dist/highlighter/languages/registerCustomLanguage.d.ts +12 -0
  18. package/dist/highlighter/languages/registerCustomLanguage.d.ts.map +1 -0
  19. package/dist/highlighter/languages/registerCustomLanguage.js +21 -0
  20. package/dist/highlighter/languages/registerCustomLanguage.js.map +1 -0
  21. package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -1
  22. package/dist/highlighter/languages/resolveLanguage.js +4 -3
  23. package/dist/highlighter/languages/resolveLanguage.js.map +1 -1
  24. package/dist/index.d.ts +5 -4
  25. package/dist/index.js +5 -4
  26. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  27. package/dist/renderers/DiffHunksRenderer.js +10 -6
  28. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  29. package/dist/style.js +1 -1
  30. package/dist/style.js.map +1 -1
  31. package/dist/types.d.ts +3 -1
  32. package/dist/types.d.ts.map +1 -1
  33. package/dist/utils/getFiletypeFromFileName.d.ts +2 -1
  34. package/dist/utils/getFiletypeFromFileName.d.ts.map +1 -1
  35. package/dist/utils/getFiletypeFromFileName.js +14 -4
  36. package/dist/utils/getFiletypeFromFileName.js.map +1 -1
  37. package/dist/utils/iterateOverDiff.d.ts +2 -0
  38. package/dist/utils/iterateOverDiff.d.ts.map +1 -1
  39. package/dist/utils/iterateOverDiff.js +7 -5
  40. package/dist/utils/iterateOverDiff.js.map +1 -1
  41. package/dist/utils/renderDiffWithHighlighter.d.ts +2 -1
  42. package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
  43. package/dist/utils/renderDiffWithHighlighter.js +3 -2
  44. package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
  45. package/dist/utils/setLanguageOverride.d.ts +2 -1
  46. package/dist/utils/setLanguageOverride.d.ts.map +1 -1
  47. package/dist/utils/setLanguageOverride.js.map +1 -1
  48. package/dist/worker/WorkerPoolManager.d.ts +1 -1
  49. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  50. package/dist/worker/WorkerPoolManager.js +3 -2
  51. package/dist/worker/WorkerPoolManager.js.map +1 -1
  52. package/dist/worker/worker-portable.js +29 -11
  53. package/dist/worker/worker-portable.js.map +1 -1
  54. package/dist/worker/worker.js +17 -8
  55. package/dist/worker/worker.js.map +1 -1
  56. package/package.json +2 -2
@@ -0,0 +1,21 @@
1
+ import { RegisteredCustomLanguages } from "./constants.js";
2
+ import { CUSTOM_EXTENSION_TO_FILE_FORMAT } from "../../utils/getFiletypeFromFileName.js";
3
+
4
+ //#region src/highlighter/languages/registerCustomLanguage.ts
5
+ /**
6
+ * Register a custom language loader and optionally map it to
7
+ * file names or extensions.
8
+ */
9
+ function registerCustomLanguage(lang, loader, extensionsOrFilenames = []) {
10
+ if (lang === "text" || lang === "ansi") throw new Error("registerCustomLanguage: 'text' and 'ansi' are reserved language names");
11
+ if (RegisteredCustomLanguages.has(lang)) {
12
+ console.error(`registerCustomLanguage: lang: ${lang} is already registered`);
13
+ return;
14
+ }
15
+ RegisteredCustomLanguages.set(lang, loader);
16
+ for (const extension of extensionsOrFilenames) CUSTOM_EXTENSION_TO_FILE_FORMAT.set(extension, lang);
17
+ }
18
+
19
+ //#endregion
20
+ export { registerCustomLanguage };
21
+ //# sourceMappingURL=registerCustomLanguage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registerCustomLanguage.js","names":[],"sources":["../../../src/highlighter/languages/registerCustomLanguage.ts"],"sourcesContent":["import type { DynamicImportLanguageRegistration } from 'shiki';\n\nimport { CUSTOM_EXTENSION_TO_FILE_FORMAT } from '../../utils/getFiletypeFromFileName';\nimport { RegisteredCustomLanguages } from './constants';\n\n/**\n * Register a custom language loader and optionally map it to\n * file names or extensions.\n */\nexport function registerCustomLanguage(\n lang: string,\n loader: DynamicImportLanguageRegistration,\n /**\n * File names or extensions to map to this language. Use exact filenames\n * (e.g., \"Dockerfile\", \"CMakeLists.txt\") or extension tokens without a dot\n * (e.g., \"proto\", \"foo\"). Compound extensions are supported\n * (e.g., \"blade.php\").\n */\n extensionsOrFilenames: string[] = []\n): void {\n if (lang === 'text' || lang === 'ansi') {\n throw new Error(\n \"registerCustomLanguage: 'text' and 'ansi' are reserved language names\"\n );\n }\n if (RegisteredCustomLanguages.has(lang)) {\n console.error(\n `registerCustomLanguage: lang: ${lang} is already registered`\n );\n return;\n }\n RegisteredCustomLanguages.set(lang, loader);\n for (const extension of extensionsOrFilenames) {\n CUSTOM_EXTENSION_TO_FILE_FORMAT.set(extension, lang);\n }\n}\n"],"mappings":";;;;;;;;AASA,SAAgB,uBACd,MACA,QAOA,wBAAkC,EAAE,EAC9B;AACN,KAAI,SAAS,UAAU,SAAS,OAC9B,OAAM,IAAI,MACR,wEACD;AAEH,KAAI,0BAA0B,IAAI,KAAK,EAAE;AACvC,UAAQ,MACN,iCAAiC,KAAK,wBACvC;AACD;;AAEF,2BAA0B,IAAI,MAAM,OAAO;AAC3C,MAAK,MAAM,aAAa,sBACtB,iCAAgC,IAAI,WAAW,KAAK"}
@@ -1 +1 @@
1
- {"version":3,"file":"resolveLanguage.d.ts","names":[],"sources":["../../../src/highlighter/languages/resolveLanguage.ts"],"sourcesContent":[],"mappings":";;;;;iBAOsB,eAAA,OACd,QAAQ,uCACb,QAAQ"}
1
+ {"version":3,"file":"resolveLanguage.d.ts","names":[],"sources":["../../../src/highlighter/languages/resolveLanguage.ts"],"sourcesContent":[],"mappings":";;;;;iBAWsB,eAAA,OACd,QAAQ,uCACb,QAAQ"}
@@ -1,4 +1,4 @@
1
- import { ResolvedLanguages, ResolvingLanguages } from "./constants.js";
1
+ import { RegisteredCustomLanguages, ResolvedLanguages, ResolvingLanguages } from "./constants.js";
2
2
  import { isWorkerContext } from "../../utils/isWorkerContext.js";
3
3
  import { bundledLanguages } from "shiki";
4
4
 
@@ -8,8 +8,9 @@ async function resolveLanguage(lang) {
8
8
  const resolver = ResolvingLanguages.get(lang);
9
9
  if (resolver != null) return resolver;
10
10
  try {
11
- const loader = bundledLanguages[lang];
12
- if (loader == null) throw new Error(`resolveLanguage: "${lang}" not found in bundled languages`);
11
+ let loader = RegisteredCustomLanguages.get(lang);
12
+ if (loader == null && Object.prototype.hasOwnProperty.call(bundledLanguages, lang)) loader = bundledLanguages[lang];
13
+ if (loader == null) throw new Error(`resolveLanguage: "${lang}" not found in bundled or custom languages`);
13
14
  const resolver$1 = loader().then(({ default: data }) => {
14
15
  const resolvedLang = {
15
16
  name: lang,
@@ -1 +1 @@
1
- {"version":3,"file":"resolveLanguage.js","names":["resolver"],"sources":["../../../src/highlighter/languages/resolveLanguage.ts"],"sourcesContent":["import { bundledLanguages } from 'shiki';\n\nimport type { SupportedLanguages } from '../../types';\nimport { isWorkerContext } from '../../utils/isWorkerContext';\nimport type { ResolvedLanguage } from '../../worker';\nimport { ResolvedLanguages, ResolvingLanguages } from './constants';\n\nexport async function resolveLanguage(\n lang: Exclude<SupportedLanguages, 'text' | 'ansi'>\n): Promise<ResolvedLanguage> {\n // Prevent dynamic imports in worker contexts\n if (isWorkerContext()) {\n throw new Error(\n `resolveLanguage(\"${lang}\") cannot be called from a worker context. ` +\n 'Languages must be pre-resolved on the main thread and passed to the worker via the resolvedLanguages parameter.'\n );\n }\n\n const resolver = ResolvingLanguages.get(lang);\n if (resolver != null) {\n return resolver;\n }\n\n try {\n const loader = bundledLanguages[lang];\n if (loader == null) {\n throw new Error(\n `resolveLanguage: \"${lang}\" not found in bundled languages`\n );\n }\n\n const resolver = loader().then(({ default: data }) => {\n const resolvedLang = { name: lang, data };\n if (!ResolvedLanguages.has(lang)) {\n ResolvedLanguages.set(lang, resolvedLang);\n }\n return resolvedLang;\n });\n ResolvingLanguages.set(lang, resolver);\n return await resolver;\n } finally {\n ResolvingLanguages.delete(lang);\n }\n}\n"],"mappings":";;;;;AAOA,eAAsB,gBACpB,MAC2B;AAE3B,KAAI,iBAAiB,CACnB,OAAM,IAAI,MACR,oBAAoB,KAAK,4JAE1B;CAGH,MAAM,WAAW,mBAAmB,IAAI,KAAK;AAC7C,KAAI,YAAY,KACd,QAAO;AAGT,KAAI;EACF,MAAM,SAAS,iBAAiB;AAChC,MAAI,UAAU,KACZ,OAAM,IAAI,MACR,qBAAqB,KAAK,kCAC3B;EAGH,MAAMA,aAAW,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW;GACpD,MAAM,eAAe;IAAE,MAAM;IAAM;IAAM;AACzC,OAAI,CAAC,kBAAkB,IAAI,KAAK,CAC9B,mBAAkB,IAAI,MAAM,aAAa;AAE3C,UAAO;IACP;AACF,qBAAmB,IAAI,MAAMA,WAAS;AACtC,SAAO,MAAMA;WACL;AACR,qBAAmB,OAAO,KAAK"}
1
+ {"version":3,"file":"resolveLanguage.js","names":["resolver"],"sources":["../../../src/highlighter/languages/resolveLanguage.ts"],"sourcesContent":["import { bundledLanguages } from 'shiki';\n\nimport type { BundledLanguage, SupportedLanguages } from '../../types';\nimport { isWorkerContext } from '../../utils/isWorkerContext';\nimport type { ResolvedLanguage } from '../../worker';\nimport {\n RegisteredCustomLanguages,\n ResolvedLanguages,\n ResolvingLanguages,\n} from './constants';\n\nexport async function resolveLanguage(\n lang: Exclude<SupportedLanguages, 'text' | 'ansi'>\n): Promise<ResolvedLanguage> {\n // Prevent dynamic imports in worker contexts\n if (isWorkerContext()) {\n throw new Error(\n `resolveLanguage(\"${lang}\") cannot be called from a worker context. ` +\n 'Languages must be pre-resolved on the main thread and passed to the worker via the resolvedLanguages parameter.'\n );\n }\n\n const resolver = ResolvingLanguages.get(lang);\n if (resolver != null) {\n return resolver;\n }\n\n try {\n let loader = RegisteredCustomLanguages.get(lang);\n if (\n loader == null &&\n Object.prototype.hasOwnProperty.call(bundledLanguages, lang)\n ) {\n loader = bundledLanguages[lang as BundledLanguage];\n }\n if (loader == null) {\n throw new Error(\n `resolveLanguage: \"${lang}\" not found in bundled or custom languages`\n );\n }\n\n const resolver = loader().then(({ default: data }) => {\n const resolvedLang = { name: lang, data };\n if (!ResolvedLanguages.has(lang)) {\n ResolvedLanguages.set(lang, resolvedLang);\n }\n return resolvedLang;\n });\n ResolvingLanguages.set(lang, resolver);\n return await resolver;\n } finally {\n ResolvingLanguages.delete(lang);\n }\n}\n"],"mappings":";;;;;AAWA,eAAsB,gBACpB,MAC2B;AAE3B,KAAI,iBAAiB,CACnB,OAAM,IAAI,MACR,oBAAoB,KAAK,4JAE1B;CAGH,MAAM,WAAW,mBAAmB,IAAI,KAAK;AAC7C,KAAI,YAAY,KACd,QAAO;AAGT,KAAI;EACF,IAAI,SAAS,0BAA0B,IAAI,KAAK;AAChD,MACE,UAAU,QACV,OAAO,UAAU,eAAe,KAAK,kBAAkB,KAAK,CAE5D,UAAS,iBAAiB;AAE5B,MAAI,UAAU,KACZ,OAAM,IAAI,MACR,qBAAqB,KAAK,4CAC3B;EAGH,MAAMA,aAAW,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW;GACpD,MAAM,eAAe;IAAE,MAAM;IAAM;IAAM;AACzC,OAAI,CAAC,kBAAkB,IAAI,KAAK,CAC9B,mBAAkB,IAAI,MAAM,aAAa;AAE3C,UAAO;IACP;AACF,qBAAmB,IAAI,MAAMA,WAAS;AACtC,SAAO,MAAMA;WACL;AACR,qBAAmB,OAAO,KAAK"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { AnnotationLineMap, AnnotationSide, AnnotationSpan, BaseCodeOptions, BaseDiffOptions, BundledLanguage, ChangeContent, ChangeTypes, CodeToHastOptions, ContextContent, DecorationItem, DiffLineAnnotation, DiffLineEventBaseProps, DiffsHighlighter, DiffsThemeNames, ExpansionDirections, ExtensionFormatMap, FileContents, FileDiffMetadata, ForcePlainTextOptions, GapSpan, Hunk, HunkData, HunkExpansionRegion, HunkLineType, HunkSeparators, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSpans, LineTypes, ObservedAnnotationNodes, ObservedGridNodes, ParsedPatch, PrePropertiesConfig, RenderDiffFilesResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderMetadataProps, RenderRange, RenderWindow, RenderedDiffASTCache, RenderedFileASTCache, SharedRenderState, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType, VirtualWindowSpecs } from "./types.js";
2
- import { ALTERNATE_FILE_NAMES_GIT, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, DEFAULT_EXPANDED_REGION, DEFAULT_THEMES, DIFFS_TAG_NAME, DIFF_HEADER_HEIGHT, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, FILE_GAP, GIT_DIFF_FILE_BREAK_REGEX, HEADER_METADATA_SLOT_ID, HUNK_HEADER, HUNK_SEPARATOR_HEIGHT, INDEX_LINE_METADATA, LINE_HEIGHT, LINE_HUNK_COUNT, SPLIT_WITH_NEWLINES, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE } from "./constants.js";
2
+ import { ALTERNATE_FILE_NAMES_GIT, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, DEFAULT_COLLAPSED_CONTEXT_THRESHOLD, DEFAULT_EXPANDED_REGION, DEFAULT_THEMES, DIFFS_TAG_NAME, DIFF_HEADER_HEIGHT, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, FILE_GAP, GIT_DIFF_FILE_BREAK_REGEX, HEADER_METADATA_SLOT_ID, HUNK_HEADER, HUNK_SEPARATOR_HEIGHT, INDEX_LINE_METADATA, LINE_HEIGHT, LINE_HUNK_COUNT, SPLIT_WITH_NEWLINES, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE } from "./constants.js";
3
3
  import { LineSelectionManager, LineSelectionOptions, SelectedLineRange, SelectionSide, pluckLineSelectionOptions } from "./managers/LineSelectionManager.js";
4
4
  import { GetHoveredLineResult, LogTypes, MouseEventManager, MouseEventManagerBaseOptions, MouseEventManagerMode, MouseEventManagerOptions, OnDiffLineClickProps, OnDiffLineEnterLeaveProps, OnLineClickProps, OnLineEnterLeaveProps, pluckMouseEventOptions } from "./managers/MouseEventManager.js";
5
5
  import { File, FileHyrdateProps, FileOptions, FileRenderProps } from "./components/File.js";
@@ -14,10 +14,11 @@ import { FileStream, FileStreamOptions } from "./components/FileStream.js";
14
14
  import { areLanguagesAttached } from "./highlighter/languages/areLanguagesAttached.js";
15
15
  import { attachResolvedLanguages } from "./highlighter/languages/attachResolvedLanguages.js";
16
16
  import { cleanUpResolvedLanguages } from "./highlighter/languages/cleanUpResolvedLanguages.js";
17
- import { AttachedLanguages, ResolvedLanguages, ResolvingLanguages } from "./highlighter/languages/constants.js";
17
+ import { AttachedLanguages, RegisteredCustomLanguages, ResolvedLanguages, ResolvingLanguages } from "./highlighter/languages/constants.js";
18
18
  import { getResolvedLanguages } from "./highlighter/languages/getResolvedLanguages.js";
19
19
  import { getResolvedOrResolveLanguage } from "./highlighter/languages/getResolvedOrResolveLanguage.js";
20
20
  import { hasResolvedLanguages } from "./highlighter/languages/hasResolvedLanguages.js";
21
+ import { registerCustomLanguage } from "./highlighter/languages/registerCustomLanguage.js";
21
22
  import { resolveLanguage } from "./highlighter/languages/resolveLanguage.js";
22
23
  import { resolveLanguages } from "./highlighter/languages/resolveLanguages.js";
23
24
  import { disposeHighlighter, getHighlighterIfLoaded, getSharedHighlighter, isHighlighterLoaded, isHighlighterLoading, isHighlighterNull, preloadHighlighter } from "./highlighter/shared_highlighter.js";
@@ -65,7 +66,7 @@ import { createWindowFromScrollPosition } from "./utils/createWindowFromScrollPo
65
66
  import { wrapCoreCSS, wrapUnsafeCSS } from "./utils/cssWrappers.js";
66
67
  import { diffAcceptRejectHunk } from "./utils/diffAcceptRejectHunk.js";
67
68
  import { formatCSSVariablePrefix } from "./utils/formatCSSVariablePrefix.js";
68
- import { EXTENSION_TO_FILE_FORMAT, extendFileFormatMap, getFiletypeFromFileName } from "./utils/getFiletypeFromFileName.js";
69
+ import { CUSTOM_EXTENSION_TO_FILE_FORMAT, EXTENSION_TO_FILE_FORMAT, extendFileFormatMap, getFiletypeFromFileName } from "./utils/getFiletypeFromFileName.js";
69
70
  import { getHighlighterOptions } from "./utils/getHighlighterOptions.js";
70
71
  import { getHighlighterThemeStyles } from "./utils/getHighlighterThemeStyles.js";
71
72
  import { getHunkSeparatorSlotName } from "./utils/getHunkSeparatorSlotName.js";
@@ -92,4 +93,4 @@ import { setLanguageOverride } from "./utils/setLanguageOverride.js";
92
93
  import { setPreNodeProperties } from "./utils/setWrapperNodeProps.js";
93
94
  import { trimPatchContext } from "./utils/trimPatchContext.js";
94
95
  import { codeToHtml, createCssVariablesTheme as createCSSVariablesTheme } from "shiki";
95
- export { ALTERNATE_FILE_NAMES_GIT, AnnotationLineMap, AnnotationSide, AnnotationSpan, AttachedLanguages, AttachedThemes, BaseCodeOptions, BaseDiffOptions, BundledLanguage, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, ChangeContent, ChangeTypes, CodeToHastOptions, CodeToTokenTransformStream, CodeToTokenTransformStreamOptions, ContextContent, CreateFileHeaderElementProps, DEFAULT_EXPANDED_REGION, DEFAULT_THEMES, DIFFS_TAG_NAME, DIFF_HEADER_HEIGHT, DecorationItem, DiffHunksRenderer, DiffLineAnnotation, DiffLineEventBaseProps, DiffsHighlighter, DiffsThemeNames, EXTENSION_TO_FILE_FORMAT, ExpansionDirections, ExtensionFormatMap, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, FILE_GAP, File, FileContents, FileDiff, FileDiffHydrationProps, FileDiffMetadata, FileDiffOptions, FileDiffRenderProps, FileHyrdateProps, FileOptions, FileRenderProps, FileRenderResult, FileRenderer, FileRendererOptions, FileStream, FileStreamOptions, ForcePlainTextOptions, GIT_DIFF_FILE_BREAK_REGEX, GapSpan, GetHoveredLineResult, HEADER_METADATA_SLOT_ID, HUNK_HEADER, HUNK_SEPARATOR_HEIGHT, Hunk, HunkData, HunkExpansionRegion, HunkLineType, HunkSeparators, HunksRenderResult, INDEX_LINE_METADATA, LINE_HEIGHT, LINE_HUNK_COUNT, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSelectionManager, LineSelectionOptions, LineSpans, LineTypes, LogTypes, MouseEventManager, MouseEventManagerBaseOptions, MouseEventManagerMode, MouseEventManagerOptions, ObservedAnnotationNodes, ObservedGridNodes, OnDiffLineClickProps, OnDiffLineEnterLeaveProps, OnLineClickProps, OnLineEnterLeaveProps, ParsedLine, ParsedPatch, PrePropertiesConfig, RecallToken, RegisteredCustomThemes, RenderDiffFilesResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderMetadataProps, RenderRange, RenderWindow, RenderedDiffASTCache, RenderedFileASTCache, ResizeManager, ResolvedLanguages, ResolvedThemes, ResolvingLanguages, ResolvingThemes, SPLIT_WITH_NEWLINES, SVGSpriteNames, SVGSpriteSheet, ScrollSyncManager, SelectedLineRange, SelectionSide, SharedRenderState, ShikiStreamTokenizer, ShikiStreamTokenizerEnqueueResult, ShikiStreamTokenizerOptions, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE, VirtualWindowSpecs, areDiffLineAnnotationsEqual, areFilesEqual, areHunkDataEqual, areLanguagesAttached, areLineAnnotationsEqual, areObjectsEqual, areOptionsEqual, arePrePropertiesEqual, areRenderRangesEqual, areSelectionsEqual, areThemesAttached, areThemesEqual, areVirtualWindowSpecsEqual, areWorkerStatsEqual, attachResolvedLanguages, attachResolvedThemes, cleanLastNewline, cleanUpResolvedLanguages, cleanUpResolvedThemes, codeToHtml, createAnnotationElement, createAnnotationWrapperNode, createBufferElement, createCSSVariablesTheme, createDiffSpanDecoration, createEmptyRowBuffer, createFileHeaderElement, createHastElement, createHoverContentNode, createIconElement, createNoNewlineElement, createPreElement, createPreWrapperProperties, createRowNodes, createSeparator, createSpanFromToken, createStyleElement, createTextNodeElement, createTransformerWithState, createUnsafeCSSStyleNode, createWindowFromScrollPosition, diffAcceptRejectHunk, disposeHighlighter, extendFileFormatMap, findCodeElement, formatCSSVariablePrefix, getFiletypeFromFileName, getHighlighterIfLoaded, getHighlighterOptions, getHighlighterThemeStyles, getHunkSeparatorSlotName, getIconForType, getLineAnnotationName, getLineEndingType, getLineNodes, getOrCreateCodeNode, getResolvedLanguages, getResolvedOrResolveLanguage, getResolvedOrResolveTheme, getResolvedThemes, getSharedHighlighter, getSingularPatch, getThemes, getTotalLineCountFromHunks, hasResolvedLanguages, hasResolvedThemes, isDefaultRenderRange, isHighlighterLoaded, isHighlighterLoading, isHighlighterNull, isWorkerContext, parseDiffFromFile, parseLineType, parsePatchFiles, pluckLineSelectionOptions, pluckMouseEventOptions, preloadHighlighter, prerenderHTMLIfNecessary, processFile, processLine, processPatch, pushOrJoinSpan, queueRender, registerCustomCSSVariableTheme, registerCustomTheme, renderDiffWithHighlighter, renderFileWithHighlighter, resolveLanguage, resolveLanguages, resolveTheme, resolveThemes, setLanguageOverride, setPreNodeProperties, trimPatchContext, wrapCoreCSS, wrapUnsafeCSS };
96
+ export { ALTERNATE_FILE_NAMES_GIT, AnnotationLineMap, AnnotationSide, AnnotationSpan, AttachedLanguages, AttachedThemes, BaseCodeOptions, BaseDiffOptions, BundledLanguage, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, CUSTOM_EXTENSION_TO_FILE_FORMAT, ChangeContent, ChangeTypes, CodeToHastOptions, CodeToTokenTransformStream, CodeToTokenTransformStreamOptions, ContextContent, CreateFileHeaderElementProps, DEFAULT_COLLAPSED_CONTEXT_THRESHOLD, DEFAULT_EXPANDED_REGION, DEFAULT_THEMES, DIFFS_TAG_NAME, DIFF_HEADER_HEIGHT, DecorationItem, DiffHunksRenderer, DiffLineAnnotation, DiffLineEventBaseProps, DiffsHighlighter, DiffsThemeNames, EXTENSION_TO_FILE_FORMAT, ExpansionDirections, ExtensionFormatMap, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, FILE_GAP, File, FileContents, FileDiff, FileDiffHydrationProps, FileDiffMetadata, FileDiffOptions, FileDiffRenderProps, FileHyrdateProps, FileOptions, FileRenderProps, FileRenderResult, FileRenderer, FileRendererOptions, FileStream, FileStreamOptions, ForcePlainTextOptions, GIT_DIFF_FILE_BREAK_REGEX, GapSpan, GetHoveredLineResult, HEADER_METADATA_SLOT_ID, HUNK_HEADER, HUNK_SEPARATOR_HEIGHT, Hunk, HunkData, HunkExpansionRegion, HunkLineType, HunkSeparators, HunksRenderResult, INDEX_LINE_METADATA, LINE_HEIGHT, LINE_HUNK_COUNT, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSelectionManager, LineSelectionOptions, LineSpans, LineTypes, LogTypes, MouseEventManager, MouseEventManagerBaseOptions, MouseEventManagerMode, MouseEventManagerOptions, ObservedAnnotationNodes, ObservedGridNodes, OnDiffLineClickProps, OnDiffLineEnterLeaveProps, OnLineClickProps, OnLineEnterLeaveProps, ParsedLine, ParsedPatch, PrePropertiesConfig, RecallToken, RegisteredCustomLanguages, RegisteredCustomThemes, RenderDiffFilesResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderMetadataProps, RenderRange, RenderWindow, RenderedDiffASTCache, RenderedFileASTCache, ResizeManager, ResolvedLanguages, ResolvedThemes, ResolvingLanguages, ResolvingThemes, SPLIT_WITH_NEWLINES, SVGSpriteNames, SVGSpriteSheet, ScrollSyncManager, SelectedLineRange, SelectionSide, SharedRenderState, ShikiStreamTokenizer, ShikiStreamTokenizerEnqueueResult, ShikiStreamTokenizerOptions, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE, VirtualWindowSpecs, areDiffLineAnnotationsEqual, areFilesEqual, areHunkDataEqual, areLanguagesAttached, areLineAnnotationsEqual, areObjectsEqual, areOptionsEqual, arePrePropertiesEqual, areRenderRangesEqual, areSelectionsEqual, areThemesAttached, areThemesEqual, areVirtualWindowSpecsEqual, areWorkerStatsEqual, attachResolvedLanguages, attachResolvedThemes, cleanLastNewline, cleanUpResolvedLanguages, cleanUpResolvedThemes, codeToHtml, createAnnotationElement, createAnnotationWrapperNode, createBufferElement, createCSSVariablesTheme, createDiffSpanDecoration, createEmptyRowBuffer, createFileHeaderElement, createHastElement, createHoverContentNode, createIconElement, createNoNewlineElement, createPreElement, createPreWrapperProperties, createRowNodes, createSeparator, createSpanFromToken, createStyleElement, createTextNodeElement, createTransformerWithState, createUnsafeCSSStyleNode, createWindowFromScrollPosition, diffAcceptRejectHunk, disposeHighlighter, extendFileFormatMap, findCodeElement, formatCSSVariablePrefix, getFiletypeFromFileName, getHighlighterIfLoaded, getHighlighterOptions, getHighlighterThemeStyles, getHunkSeparatorSlotName, getIconForType, getLineAnnotationName, getLineEndingType, getLineNodes, getOrCreateCodeNode, getResolvedLanguages, getResolvedOrResolveLanguage, getResolvedOrResolveTheme, getResolvedThemes, getSharedHighlighter, getSingularPatch, getThemes, getTotalLineCountFromHunks, hasResolvedLanguages, hasResolvedThemes, isDefaultRenderRange, isHighlighterLoaded, isHighlighterLoading, isHighlighterNull, isWorkerContext, parseDiffFromFile, parseLineType, parsePatchFiles, pluckLineSelectionOptions, pluckMouseEventOptions, preloadHighlighter, prerenderHTMLIfNecessary, processFile, processLine, processPatch, pushOrJoinSpan, queueRender, registerCustomCSSVariableTheme, registerCustomLanguage, registerCustomTheme, renderDiffWithHighlighter, renderFileWithHighlighter, resolveLanguage, resolveLanguages, resolveTheme, resolveThemes, setLanguageOverride, setPreNodeProperties, trimPatchContext, wrapCoreCSS, wrapUnsafeCSS };
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
- import { ALTERNATE_FILE_NAMES_GIT, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, DEFAULT_EXPANDED_REGION, DEFAULT_THEMES, DIFFS_TAG_NAME, DIFF_HEADER_HEIGHT, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, FILE_GAP, GIT_DIFF_FILE_BREAK_REGEX, HEADER_METADATA_SLOT_ID, HUNK_HEADER, HUNK_SEPARATOR_HEIGHT, INDEX_LINE_METADATA, LINE_HEIGHT, LINE_HUNK_COUNT, SPLIT_WITH_NEWLINES, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE } from "./constants.js";
1
+ import { ALTERNATE_FILE_NAMES_GIT, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, DEFAULT_COLLAPSED_CONTEXT_THRESHOLD, DEFAULT_EXPANDED_REGION, DEFAULT_THEMES, DIFFS_TAG_NAME, DIFF_HEADER_HEIGHT, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, FILE_GAP, GIT_DIFF_FILE_BREAK_REGEX, HEADER_METADATA_SLOT_ID, HUNK_HEADER, HUNK_SEPARATOR_HEIGHT, INDEX_LINE_METADATA, LINE_HEIGHT, LINE_HUNK_COUNT, SPLIT_WITH_NEWLINES, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE } from "./constants.js";
2
2
  import { areSelectionsEqual } from "./utils/areSelectionsEqual.js";
3
3
  import { LineSelectionManager, pluckLineSelectionOptions } from "./managers/LineSelectionManager.js";
4
4
  import { MouseEventManager, pluckMouseEventOptions } from "./managers/MouseEventManager.js";
5
5
  import { ResizeManager } from "./managers/ResizeManager.js";
6
- import { AttachedLanguages, ResolvedLanguages, ResolvingLanguages } from "./highlighter/languages/constants.js";
6
+ import { AttachedLanguages, RegisteredCustomLanguages, ResolvedLanguages, ResolvingLanguages } from "./highlighter/languages/constants.js";
7
7
  import { areLanguagesAttached } from "./highlighter/languages/areLanguagesAttached.js";
8
8
  import { attachResolvedLanguages } from "./highlighter/languages/attachResolvedLanguages.js";
9
9
  import { cleanUpResolvedLanguages } from "./highlighter/languages/cleanUpResolvedLanguages.js";
@@ -26,7 +26,7 @@ import { createAnnotationElement } from "./utils/createAnnotationElement.js";
26
26
  import { getIconForType } from "./utils/getIconForType.js";
27
27
  import { createFileHeaderElement } from "./utils/createFileHeaderElement.js";
28
28
  import { createPreElement, createPreWrapperProperties } from "./utils/createPreElement.js";
29
- import { EXTENSION_TO_FILE_FORMAT, extendFileFormatMap, getFiletypeFromFileName } from "./utils/getFiletypeFromFileName.js";
29
+ import { CUSTOM_EXTENSION_TO_FILE_FORMAT, EXTENSION_TO_FILE_FORMAT, extendFileFormatMap, getFiletypeFromFileName } from "./utils/getFiletypeFromFileName.js";
30
30
  import { getHighlighterOptions } from "./utils/getHighlighterOptions.js";
31
31
  import { getLineAnnotationName } from "./utils/getLineAnnotationName.js";
32
32
  import { cleanLastNewline } from "./utils/cleanLastNewline.js";
@@ -74,6 +74,7 @@ import { createSpanFromToken } from "./utils/createSpanNodeFromToken.js";
74
74
  import { FileStream } from "./components/FileStream.js";
75
75
  import { getResolvedLanguages } from "./highlighter/languages/getResolvedLanguages.js";
76
76
  import { hasResolvedLanguages } from "./highlighter/languages/hasResolvedLanguages.js";
77
+ import { registerCustomLanguage } from "./highlighter/languages/registerCustomLanguage.js";
77
78
  import { resolveLanguages } from "./highlighter/languages/resolveLanguages.js";
78
79
  import { getResolvedThemes } from "./highlighter/themes/getResolvedThemes.js";
79
80
  import { registerCustomCSSVariableTheme } from "./highlighter/themes/registerCustomCSSVariableTheme.js";
@@ -91,4 +92,4 @@ import { setLanguageOverride } from "./utils/setLanguageOverride.js";
91
92
  import { trimPatchContext } from "./utils/trimPatchContext.js";
92
93
  import { codeToHtml, createCssVariablesTheme as createCSSVariablesTheme } from "shiki";
93
94
 
94
- export { ALTERNATE_FILE_NAMES_GIT, AttachedLanguages, AttachedThemes, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, CodeToTokenTransformStream, DEFAULT_EXPANDED_REGION, DEFAULT_THEMES, DIFFS_TAG_NAME, DIFF_HEADER_HEIGHT, DiffHunksRenderer, EXTENSION_TO_FILE_FORMAT, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, FILE_GAP, File, FileDiff, FileRenderer, FileStream, GIT_DIFF_FILE_BREAK_REGEX, HEADER_METADATA_SLOT_ID, HUNK_HEADER, HUNK_SEPARATOR_HEIGHT, INDEX_LINE_METADATA, LINE_HEIGHT, LINE_HUNK_COUNT, LineSelectionManager, MouseEventManager, RegisteredCustomThemes, ResizeManager, ResolvedLanguages, ResolvedThemes, ResolvingLanguages, ResolvingThemes, SPLIT_WITH_NEWLINES, SVGSpriteSheet, ScrollSyncManager, ShikiStreamTokenizer, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE, areDiffLineAnnotationsEqual, areFilesEqual, areHunkDataEqual, areLanguagesAttached, areLineAnnotationsEqual, areObjectsEqual, areOptionsEqual, arePrePropertiesEqual, areRenderRangesEqual, areSelectionsEqual, areThemesAttached, areThemesEqual, areVirtualWindowSpecsEqual, areWorkerStatsEqual, attachResolvedLanguages, attachResolvedThemes, cleanLastNewline, cleanUpResolvedLanguages, cleanUpResolvedThemes, codeToHtml, createAnnotationElement, createAnnotationWrapperNode, createBufferElement, createCSSVariablesTheme, createDiffSpanDecoration, createEmptyRowBuffer, createFileHeaderElement, createHastElement, createHoverContentNode, createIconElement, createNoNewlineElement, createPreElement, createPreWrapperProperties, createRowNodes, createSeparator, createSpanFromToken, createStyleElement, createTextNodeElement, createTransformerWithState, createUnsafeCSSStyleNode, createWindowFromScrollPosition, diffAcceptRejectHunk, disposeHighlighter, extendFileFormatMap, findCodeElement, formatCSSVariablePrefix, getFiletypeFromFileName, getHighlighterIfLoaded, getHighlighterOptions, getHighlighterThemeStyles, getHunkSeparatorSlotName, getIconForType, getLineAnnotationName, getLineEndingType, getLineNodes, getOrCreateCodeNode, getResolvedLanguages, getResolvedOrResolveLanguage, getResolvedOrResolveTheme, getResolvedThemes, getSharedHighlighter, getSingularPatch, getThemes, getTotalLineCountFromHunks, hasResolvedLanguages, hasResolvedThemes, isDefaultRenderRange, isHighlighterLoaded, isHighlighterLoading, isHighlighterNull, isWorkerContext, parseDiffFromFile, parseLineType, parsePatchFiles, pluckLineSelectionOptions, pluckMouseEventOptions, preloadHighlighter, prerenderHTMLIfNecessary, processFile, processLine, processPatch, pushOrJoinSpan, queueRender, registerCustomCSSVariableTheme, registerCustomTheme, renderDiffWithHighlighter, renderFileWithHighlighter, resolveLanguage, resolveLanguages, resolveTheme, resolveThemes, setLanguageOverride, setPreNodeProperties, trimPatchContext, wrapCoreCSS, wrapUnsafeCSS };
95
+ export { ALTERNATE_FILE_NAMES_GIT, AttachedLanguages, AttachedThemes, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, CUSTOM_EXTENSION_TO_FILE_FORMAT, CodeToTokenTransformStream, DEFAULT_COLLAPSED_CONTEXT_THRESHOLD, DEFAULT_EXPANDED_REGION, DEFAULT_THEMES, DIFFS_TAG_NAME, DIFF_HEADER_HEIGHT, DiffHunksRenderer, EXTENSION_TO_FILE_FORMAT, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, FILE_GAP, File, FileDiff, FileRenderer, FileStream, GIT_DIFF_FILE_BREAK_REGEX, HEADER_METADATA_SLOT_ID, HUNK_HEADER, HUNK_SEPARATOR_HEIGHT, INDEX_LINE_METADATA, LINE_HEIGHT, LINE_HUNK_COUNT, LineSelectionManager, MouseEventManager, RegisteredCustomLanguages, RegisteredCustomThemes, ResizeManager, ResolvedLanguages, ResolvedThemes, ResolvingLanguages, ResolvingThemes, SPLIT_WITH_NEWLINES, SVGSpriteSheet, ScrollSyncManager, ShikiStreamTokenizer, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE, areDiffLineAnnotationsEqual, areFilesEqual, areHunkDataEqual, areLanguagesAttached, areLineAnnotationsEqual, areObjectsEqual, areOptionsEqual, arePrePropertiesEqual, areRenderRangesEqual, areSelectionsEqual, areThemesAttached, areThemesEqual, areVirtualWindowSpecsEqual, areWorkerStatsEqual, attachResolvedLanguages, attachResolvedThemes, cleanLastNewline, cleanUpResolvedLanguages, cleanUpResolvedThemes, codeToHtml, createAnnotationElement, createAnnotationWrapperNode, createBufferElement, createCSSVariablesTheme, createDiffSpanDecoration, createEmptyRowBuffer, createFileHeaderElement, createHastElement, createHoverContentNode, createIconElement, createNoNewlineElement, createPreElement, createPreWrapperProperties, createRowNodes, createSeparator, createSpanFromToken, createStyleElement, createTextNodeElement, createTransformerWithState, createUnsafeCSSStyleNode, createWindowFromScrollPosition, diffAcceptRejectHunk, disposeHighlighter, extendFileFormatMap, findCodeElement, formatCSSVariablePrefix, getFiletypeFromFileName, getHighlighterIfLoaded, getHighlighterOptions, getHighlighterThemeStyles, getHunkSeparatorSlotName, getIconForType, getLineAnnotationName, getLineEndingType, getLineNodes, getOrCreateCodeNode, getResolvedLanguages, getResolvedOrResolveLanguage, getResolvedOrResolveTheme, getResolvedThemes, getSharedHighlighter, getSingularPatch, getThemes, getTotalLineCountFromHunks, hasResolvedLanguages, hasResolvedThemes, isDefaultRenderRange, isHighlighterLoaded, isHighlighterLoading, isHighlighterNull, isWorkerContext, parseDiffFromFile, parseLineType, parsePatchFiles, pluckLineSelectionOptions, pluckMouseEventOptions, preloadHighlighter, prerenderHTMLIfNecessary, processFile, processLine, processPatch, pushOrJoinSpan, queueRender, registerCustomCSSVariableTheme, registerCustomLanguage, registerCustomTheme, renderDiffWithHighlighter, renderFileWithHighlighter, resolveLanguage, resolveLanguages, resolveTheme, resolveThemes, setLanguageOverride, setPreNodeProperties, trimPatchContext, wrapCoreCSS, wrapUnsafeCSS };
@@ -1 +1 @@
1
- {"version":3,"file":"DiffHunksRenderer.d.ts","names":["options: BaseDiffOptions","onRenderUpdate?: () => unknown","workerManager?: WorkerPoolManager | undefined"],"sources":["../../src/renderers/DiffHunksRenderer.ts"],"sourcesContent":[],"mappings":";;;;;;KA4FK,mBAAA,GAAsB,SACzB,KAAK;UAGU,iBAAA;gBACD;EAnDuB,YA8ClC,EAMW,cANX,EAAA,GAAA,SAAA;EACE,UAAA,EAMO,cANP,EAAA,GAAA,SAAA;EAAL,QAAA,EAOU,QAPV,EAAA;EADyB,GAAA,EAAA,MAAA;EAAA,OAAA,EAUhB,OAVgB;EAI3B,aAAiB,EAOA,OAPA,GAAA,SAAA;EACD,UAAA,EAAA,MAAA;EACA,WAAA,EAAA,MAAA;EACF,aAAA,EAAA,OAAA,GAAA,MAAA,GAAA,SAAA;;AAGH,cASE,iBATF,CAAA,cAAA,SAAA,CAAA,CAAA;EACM,OAAA,EAuBG,eAvBH;EAAA,QAAA,cAAA;EAQjB,QAAa,aAAA;EAeO,SAAA,IAAA,EAAA,MAAA;EAAA,QAAA,WAAA;EAEQ,QAAA,IAAA;EAyBN,QAAA,aAAA;EAQI,QAAA,mBAAA;EAOa,QAAA,mBAAA;EAiBD,QAAA,YAAA;EAID,QAAA,WAAA;EAAZ,WAAA,CAAA,OAAA,CAAA,EA/DL,eA+DK,EAAA,cAAA,CAAA,EAAA,CAAA,GAAA,GAAA,OAAA,CAAA,GAAA,SAAA,EAAA,aAAA,CAAA,EA7DG,iBA6DH,GAAA,SAAA;EAIgC,OAAA,CAAA,CAAA,EAAA,IAAA;EAAnB,OAAA,CAAA,CAAA,EAAA,IAAA;EAkBV,UAAA,CAAA,OAAA,EA1DN,eA0DM,CAAA,EAAA,IAAA;EAuCa,QAAA,YAAA;EAAR,YAAA,CAAA,SAAA,EAzFP,UAyFO,CAAA,EAAA,IAAA;EAOjB,UAAA,CAAA,KAAA,EAAA,MAAA,EAAA,SAAA,EAzFuB,mBAyFvB,CAAA,EAAA,IAAA;EAuDN,eAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EA/H4B,mBA+H5B;EACO,mBAAA,CAAA,CAAA,EA5HQ,GA4HR,CAAA,MAAA,EA5HoB,mBA4HpB,CAAA;EACZ,kBAAA,CAAA,eAAA,EAzHiC,kBAyHjC,CAzHoD,WAyHpD,CAAA,EAAA,CAAA,EAAA,IAAA;EAqGK,sBAAA,CAAA,CAAA,EA5MkB,mBA4MlB;EACO,qBAAA,CAAA,CAAA,EAtKgB,OAsKhB,CAtKwB,gBAsKxB,CAAA;EACJ,OAAA,CAAA,IAAA,EAhKG,gBAgKH,GAAA,SAAA,CAAA,EAAA,IAAA;EAAR,QAAA,gBAAA;EA6DK,UAAA,CAAA,IAAA,CAAA,EAtKA,gBAsKA,GAAA,SAAA,EAAA,WAAA,CAAA,EArKO,WAqKP,CAAA,EApKL,iBAoKK,GAAA,SAAA;EACE,WAAA,CAAA,IAAA,EAhEF,gBAgEE,EAAA,WAAA,CAAA,EA/DK,WA+DL,CAAA,EA9DP,OA8DO,CA9DC,iBA8DD,CAAA;EACC,QAAA,gBAAA;EAqXD,QAAA,cAAA;EACE,QAAA,yBAAA;EACT,kBAAA,CAAA,IAAA,EAzXK,gBAyXL,EAAA,MAAA,EAxXO,gBAwXP,EAAA,OAAA,EAvXQ,iBAuXR,CAAA,EAAA,IAAA;EAyCO,gBAAA,CAAA,KAAA,EAAA,OAAA,CAAA,EAAA,IAAA;EACM,QAAA,iBAAA;EAMJ,aAAA,CAAA,MAAA,EAlDF,iBAkDE,EAAA,QAAA,CAAA,EAjDA,cAiDA,EAAA,CAAA,EAhDT,OAgDS;EAAA,cAAA,CAAA,MAAA,EAPF,iBAOE,EAAA,YAAA,CAAA,EANI,cAMJ,EAAA,CAAA,EAAA,MAAA;8BAAA"}
1
+ {"version":3,"file":"DiffHunksRenderer.d.ts","names":["options: BaseDiffOptions","onRenderUpdate?: () => unknown","workerManager?: WorkerPoolManager | undefined"],"sources":["../../src/renderers/DiffHunksRenderer.ts"],"sourcesContent":[],"mappings":";;;;;;KAgGK,mBAAA,GAAsB,SACzB,KAAK;UAGU,iBAAA;gBACD;EAnDuB,YA8ClC,EAMW,cANX,EAAA,GAAA,SAAA;EACE,UAAA,EAMO,cANP,EAAA,GAAA,SAAA;EAAL,QAAA,EAOU,QAPV,EAAA;EADyB,GAAA,EAAA,MAAA;EAAA,OAAA,EAUhB,OAVgB;EAI3B,aAAiB,EAOA,OAPA,GAAA,SAAA;EACD,UAAA,EAAA,MAAA;EACA,WAAA,EAAA,MAAA;EACF,aAAA,EAAA,OAAA,GAAA,MAAA,GAAA,SAAA;;AAGH,cASE,iBATF,CAAA,cAAA,SAAA,CAAA,CAAA;EACM,OAAA,EAuBG,eAvBH;EAAA,QAAA,cAAA;EAQjB,QAAa,aAAA;EAeO,SAAA,IAAA,EAAA,MAAA;EAAA,QAAA,WAAA;EAEQ,QAAA,IAAA;EAyBN,QAAA,aAAA;EAQI,QAAA,mBAAA;EAOa,QAAA,mBAAA;EAiBD,QAAA,YAAA;EAID,QAAA,WAAA;EAAZ,WAAA,CAAA,OAAA,CAAA,EA/DL,eA+DK,EAAA,cAAA,CAAA,EAAA,CAAA,GAAA,GAAA,OAAA,CAAA,GAAA,SAAA,EAAA,aAAA,CAAA,EA7DG,iBA6DH,GAAA,SAAA;EAIgC,OAAA,CAAA,CAAA,EAAA,IAAA;EAAnB,OAAA,CAAA,CAAA,EAAA,IAAA;EAkBV,UAAA,CAAA,OAAA,EA1DN,eA0DM,CAAA,EAAA,IAAA;EAyCa,QAAA,YAAA;EAAR,YAAA,CAAA,SAAA,EA3FP,UA2FO,CAAA,EAAA,IAAA;EAOjB,UAAA,CAAA,KAAA,EAAA,MAAA,EAAA,SAAA,EA3FuB,mBA2FvB,CAAA,EAAA,IAAA;EAuDN,eAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAjI4B,mBAiI5B;EACO,mBAAA,CAAA,CAAA,EA9HQ,GA8HR,CAAA,MAAA,EA9HoB,mBA8HpB,CAAA;EACZ,kBAAA,CAAA,eAAA,EA3HiC,kBA2HjC,CA3HoD,WA2HpD,CAAA,EAAA,CAAA,EAAA,IAAA;EAuGK,sBAAA,CAAA,CAAA,EAhNkB,mBAgNlB;EACO,qBAAA,CAAA,CAAA,EAxKgB,OAwKhB,CAxKwB,gBAwKxB,CAAA;EACJ,OAAA,CAAA,IAAA,EAlKG,gBAkKH,GAAA,SAAA,CAAA,EAAA,IAAA;EAAR,QAAA,gBAAA;EA+DK,UAAA,CAAA,IAAA,CAAA,EA1KA,gBA0KA,GAAA,SAAA,EAAA,WAAA,CAAA,EAzKO,WAyKP,CAAA,EAxKL,iBAwKK,GAAA,SAAA;EACE,WAAA,CAAA,IAAA,EAlEF,gBAkEE,EAAA,WAAA,CAAA,EAjEK,WAiEL,CAAA,EAhEP,OAgEO,CAhEC,iBAgED,CAAA;EACC,QAAA,gBAAA;EAuXD,QAAA,cAAA;EACE,QAAA,yBAAA;EACT,kBAAA,CAAA,IAAA,EA3XK,gBA2XL,EAAA,MAAA,EA1XO,gBA0XP,EAAA,OAAA,EAzXQ,iBAyXR,CAAA,EAAA,IAAA;EAyCO,gBAAA,CAAA,KAAA,EAAA,OAAA,CAAA,EAAA,IAAA;EACM,QAAA,iBAAA;EAMJ,aAAA,CAAA,MAAA,EAlDF,iBAkDE,EAAA,QAAA,CAAA,EAjDA,cAiDA,EAAA,CAAA,EAhDT,OAgDS;EAAA,cAAA,CAAA,MAAA,EAPF,iBAOE,EAAA,YAAA,CAAA,EANI,cAMJ,EAAA,CAAA,EAAA,MAAA;8BAAA"}
@@ -1,4 +1,4 @@
1
- import { DEFAULT_EXPANDED_REGION, DEFAULT_THEMES } from "../constants.js";
1
+ import { DEFAULT_COLLAPSED_CONTEXT_THRESHOLD, DEFAULT_EXPANDED_REGION, DEFAULT_THEMES } from "../constants.js";
2
2
  import { areLanguagesAttached } from "../highlighter/languages/areLanguagesAttached.js";
3
3
  import { getHighlighterIfLoaded, getSharedHighlighter } from "../highlighter/shared_highlighter.js";
4
4
  import { areThemesAttached } from "../highlighter/themes/areThemesAttached.js";
@@ -103,7 +103,7 @@ var DiffHunksRenderer = class {
103
103
  }
104
104
  }
105
105
  getOptionsWithDefaults() {
106
- const { diffIndicators = "bars", diffStyle = "split", disableBackground = false, disableFileHeader = false, disableLineNumbers = false, disableVirtualizationBuffers = false, expandUnchanged = false, expansionLineCount = 100, hunkSeparators = "line-info", lineDiffType = "word-alt", maxLineDiffLength = 1e3, overflow = "scroll", theme = DEFAULT_THEMES, themeType = "system", tokenizeMaxLineLength = 1e3, useCSSClasses = false } = this.options;
106
+ const { diffIndicators = "bars", diffStyle = "split", disableBackground = false, disableFileHeader = false, disableLineNumbers = false, disableVirtualizationBuffers = false, expandUnchanged = false, collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD, expansionLineCount = 100, hunkSeparators = "line-info", lineDiffType = "word-alt", maxLineDiffLength = 1e3, overflow = "scroll", theme = DEFAULT_THEMES, themeType = "system", tokenizeMaxLineLength = 1e3, useCSSClasses = false } = this.options;
107
107
  return {
108
108
  diffIndicators,
109
109
  diffStyle,
@@ -112,6 +112,7 @@ var DiffHunksRenderer = class {
112
112
  disableLineNumbers,
113
113
  disableVirtualizationBuffers,
114
114
  expandUnchanged,
115
+ collapsedContextThreshold,
115
116
  expansionLineCount,
116
117
  hunkSeparators,
117
118
  lineDiffType,
@@ -172,7 +173,7 @@ var DiffHunksRenderer = class {
172
173
  }
173
174
  renderDiff(diff = this.renderCache?.diff, renderRange = DEFAULT_RENDER_RANGE) {
174
175
  if (diff == null) return;
175
- const { expandUnchanged = false } = this.options;
176
+ const { expandUnchanged = false, collapsedContextThreshold } = this.getOptionsWithDefaults();
176
177
  const cache = this.workerManager?.getDiffResultCache(diff);
177
178
  if (cache != null && this.renderCache == null) this.renderCache = {
178
179
  diff,
@@ -190,7 +191,7 @@ var DiffHunksRenderer = class {
190
191
  };
191
192
  if (this.workerManager?.isWorkingPool() === true) {
192
193
  if (this.renderCache.result == null || !this.renderCache.highlighted && !areRenderRangesEqual(this.renderCache.renderRange, renderRange)) {
193
- this.renderCache.result = this.workerManager.getPlainDiffAST(diff, renderRange.startingLine, renderRange.totalLines, isDefaultRenderRange(renderRange) ? true : expandUnchanged ? true : this.expandedHunks);
194
+ this.renderCache.result = this.workerManager.getPlainDiffAST(diff, renderRange.startingLine, renderRange.totalLines, isDefaultRenderRange(renderRange) ? true : expandUnchanged ? true : this.expandedHunks, collapsedContextThreshold);
194
195
  this.renderCache.renderRange = renderRange;
195
196
  }
196
197
  if (renderRange.totalLines > 0 && (!this.renderCache.highlighted || forceRender)) this.workerManager.highlightDiffAST(this, diff);
@@ -240,10 +241,12 @@ var DiffHunksRenderer = class {
240
241
  }
241
242
  renderDiffWithHighlighter(diff, highlighter, forcePlainText = false) {
242
243
  const { options } = this.getRenderOptions(diff);
244
+ const { collapsedContextThreshold } = this.getOptionsWithDefaults();
243
245
  return {
244
246
  result: renderDiffWithHighlighter(diff, highlighter, options, {
245
247
  forcePlainText,
246
- expandedHunks: forcePlainText ? true : void 0
248
+ expandedHunks: forcePlainText ? true : void 0,
249
+ collapsedContextThreshold
247
250
  }),
248
251
  options
249
252
  };
@@ -264,7 +267,7 @@ var DiffHunksRenderer = class {
264
267
  console.error(error);
265
268
  }
266
269
  processDiffResult(fileDiff, renderRange, { code, themeStyles, baseThemeType }) {
267
- const { diffStyle, disableFileHeader, disableVirtualizationBuffers, expandUnchanged, expansionLineCount, hunkSeparators } = this.getOptionsWithDefaults();
270
+ const { diffStyle, disableFileHeader, disableVirtualizationBuffers, expandUnchanged, expansionLineCount, collapsedContextThreshold, hunkSeparators } = this.getOptionsWithDefaults();
268
271
  this.diff = fileDiff;
269
272
  const unified = diffStyle === "unified";
270
273
  let additionsAST = [];
@@ -316,6 +319,7 @@ var DiffHunksRenderer = class {
316
319
  startingLine: renderRange.startingLine,
317
320
  totalLines: renderRange.totalLines,
318
321
  expandedHunks: expandUnchanged ? true : this.expandedHunks,
322
+ collapsedContextThreshold,
319
323
  callback: ({ hunkIndex, hunk, collapsedBefore, collapsedAfter, unifiedDeletionLineIndex, unifiedAdditionLineIndex, splitLineIndex, additionLineIndex, deletionLineIndex, additionLineNumber, deletionLineNumber, type, noEOFCRAddition, noEOFCRDeletion }) => {
320
324
  if (diffStyle === "split") {
321
325
  if (lastHunkIndex != null && lastHunkIndex !== hunkIndex) flushSplitSpan();
@@ -1 +1 @@
1
- {"version":3,"file":"DiffHunksRenderer.js","names":["DEFAULT_RENDER_RANGE: RenderRange","options: BaseDiffOptions","onRenderUpdate?: () => unknown","workerManager?: WorkerPoolManager | undefined","options","options: RenderDiffOptions","additionsAST: ElementContent[] | undefined","deletionsAST: ElementContent[] | undefined","unifiedAST: ElementContent[] | undefined","hunkData: HunkData[]","separatorContext: PushSeparatorContext","pendingSplitMissing: 'additions' | 'deletions' | undefined","lastHunkIndex: number | undefined","deletionSpan: AnnotationSpan","additionSpan: AnnotationSpan"],"sources":["../../src/renderers/DiffHunksRenderer.ts"],"sourcesContent":["import type { ElementContent, Element as HASTElement } from 'hast';\nimport { toHtml } from 'hast-util-to-html';\n\nimport { DEFAULT_EXPANDED_REGION, DEFAULT_THEMES } from '../constants';\nimport { areLanguagesAttached } from '../highlighter/languages/areLanguagesAttached';\nimport {\n getHighlighterIfLoaded,\n getSharedHighlighter,\n} from '../highlighter/shared_highlighter';\nimport { areThemesAttached } from '../highlighter/themes/areThemesAttached';\nimport type {\n AnnotationLineMap,\n AnnotationSpan,\n BaseDiffOptions,\n DiffLineAnnotation,\n DiffsHighlighter,\n ExpansionDirections,\n FileDiffMetadata,\n HunkData,\n HunkExpansionRegion,\n HunkSeparators,\n RenderDiffOptions,\n RenderDiffResult,\n RenderRange,\n RenderedDiffASTCache,\n SupportedLanguages,\n ThemeTypes,\n ThemedDiffResult,\n} from '../types';\nimport { areRenderRangesEqual } from '../utils/areRenderRangesEqual';\nimport { areThemesEqual } from '../utils/areThemesEqual';\nimport { createAnnotationElement } from '../utils/createAnnotationElement';\nimport { createEmptyRowBuffer } from '../utils/createEmptyRowBuffer';\nimport { createFileHeaderElement } from '../utils/createFileHeaderElement';\nimport { createNoNewlineElement } from '../utils/createNoNewlineElement';\nimport { createPreElement } from '../utils/createPreElement';\nimport { createSeparator } from '../utils/createSeparator';\nimport { getFiletypeFromFileName } from '../utils/getFiletypeFromFileName';\nimport { getHighlighterOptions } from '../utils/getHighlighterOptions';\nimport { getHunkSeparatorSlotName } from '../utils/getHunkSeparatorSlotName';\nimport { getLineAnnotationName } from '../utils/getLineAnnotationName';\nimport { getTotalLineCountFromHunks } from '../utils/getTotalLineCountFromHunks';\nimport { createBufferElement, createHastElement } from '../utils/hast_utils';\nimport { isDefaultRenderRange } from '../utils/isDefaultRenderRange';\nimport { iterateOverDiff } from '../utils/iterateOverDiff';\nimport { renderDiffWithHighlighter } from '../utils/renderDiffWithHighlighter';\nimport type { WorkerPoolManager } from '../worker';\n\ninterface PushLineWithAnnotation {\n deletionLine?: ElementContent;\n additionLine?: ElementContent;\n\n unifiedAST?: ElementContent[];\n deletionsAST?: ElementContent[];\n additionsAST?: ElementContent[];\n\n unifiedSpan?: AnnotationSpan;\n deletionSpan?: AnnotationSpan;\n additionSpan?: AnnotationSpan;\n}\n\nconst DEFAULT_RENDER_RANGE: RenderRange = {\n startingLine: 0,\n totalLines: Infinity,\n bufferBefore: 0,\n bufferAfter: 0,\n};\n\ninterface GetRenderOptionsReturn {\n options: RenderDiffOptions;\n forceRender: boolean;\n}\n\ninterface PushSeparatorProps {\n hunkIndex: number;\n collapsedLines: number;\n rangeSize: number;\n hunkSpecs: string | undefined;\n isFirstHunk: boolean;\n isLastHunk: boolean;\n isExpandable: boolean;\n}\n\ninterface PushSeparatorContext {\n expansionLineCount: number;\n hunkSeparators: HunkSeparators;\n unifiedAST: ElementContent[];\n deletionsAST: ElementContent[];\n additionsAST: ElementContent[];\n hunkData: HunkData[];\n}\n\ntype OptionsWithDefaults = Required<\n Omit<BaseDiffOptions, 'lang' | 'unsafeCSS'>\n>;\n\nexport interface HunksRenderResult {\n additionsAST: ElementContent[] | undefined;\n deletionsAST: ElementContent[] | undefined;\n unifiedAST: ElementContent[] | undefined;\n hunkData: HunkData[];\n css: string;\n preNode: HASTElement;\n headerElement: HASTElement | undefined;\n totalLines: number;\n themeStyles: string;\n baseThemeType: 'light' | 'dark' | undefined;\n}\n\nlet instanceId = -1;\n\nexport class DiffHunksRenderer<LAnnotation = undefined> {\n readonly __id: string = `diff-hunks-renderer:${++instanceId}`;\n\n private highlighter: DiffsHighlighter | undefined;\n private diff: FileDiffMetadata | undefined;\n\n private expandedHunks = new Map<number, HunkExpansionRegion>();\n\n private deletionAnnotations: AnnotationLineMap<LAnnotation> = {};\n private additionAnnotations: AnnotationLineMap<LAnnotation> = {};\n\n private computedLang: SupportedLanguages = 'text';\n private renderCache: RenderedDiffASTCache | undefined;\n\n constructor(\n public options: BaseDiffOptions = { theme: DEFAULT_THEMES },\n private onRenderUpdate?: () => unknown,\n private workerManager?: WorkerPoolManager | undefined\n ) {\n if (workerManager?.isWorkingPool() !== true) {\n this.highlighter = areThemesAttached(options.theme ?? DEFAULT_THEMES)\n ? getHighlighterIfLoaded()\n : undefined;\n }\n }\n\n cleanUp(): void {\n this.highlighter = undefined;\n this.diff = undefined;\n this.renderCache = undefined;\n this.workerManager?.cleanUpPendingTasks(this);\n this.workerManager = undefined;\n this.onRenderUpdate = undefined;\n }\n\n recycle(): void {\n this.highlighter = undefined;\n this.diff = undefined;\n this.renderCache = undefined;\n this.workerManager?.cleanUpPendingTasks(this);\n }\n\n setOptions(options: BaseDiffOptions): void {\n this.options = options;\n }\n\n private mergeOptions(options: Partial<BaseDiffOptions>) {\n this.options = { ...this.options, ...options };\n }\n\n setThemeType(themeType: ThemeTypes): void {\n if (this.getOptionsWithDefaults().themeType === themeType) {\n return;\n }\n this.mergeOptions({ themeType });\n }\n\n expandHunk(index: number, direction: ExpansionDirections): void {\n const { expansionLineCount } = this.getOptionsWithDefaults();\n const region = {\n ...(this.expandedHunks.get(index) ?? {\n fromStart: 0,\n fromEnd: 0,\n }),\n };\n if (direction === 'up' || direction === 'both') {\n region.fromStart += expansionLineCount;\n }\n if (direction === 'down' || direction === 'both') {\n region.fromEnd += expansionLineCount;\n }\n this.expandedHunks.set(index, region);\n }\n\n getExpandedHunk(hunkIndex: number): HunkExpansionRegion {\n return this.expandedHunks.get(hunkIndex) ?? DEFAULT_EXPANDED_REGION;\n }\n\n getExpandedHunksMap(): Map<number, HunkExpansionRegion> {\n return this.expandedHunks;\n }\n\n setLineAnnotations(lineAnnotations: DiffLineAnnotation<LAnnotation>[]): void {\n this.additionAnnotations = {};\n this.deletionAnnotations = {};\n for (const annotation of lineAnnotations) {\n const map = ((): AnnotationLineMap<LAnnotation> => {\n switch (annotation.side) {\n case 'deletions':\n return this.deletionAnnotations;\n case 'additions':\n return this.additionAnnotations;\n }\n })();\n const arr = map[annotation.lineNumber] ?? [];\n map[annotation.lineNumber] = arr;\n arr.push(annotation);\n }\n }\n\n getOptionsWithDefaults(): OptionsWithDefaults {\n const {\n diffIndicators = 'bars',\n diffStyle = 'split',\n disableBackground = false,\n disableFileHeader = false,\n disableLineNumbers = false,\n disableVirtualizationBuffers = false,\n expandUnchanged = false,\n expansionLineCount = 100,\n hunkSeparators = 'line-info',\n lineDiffType = 'word-alt',\n maxLineDiffLength = 1000,\n overflow = 'scroll',\n theme = DEFAULT_THEMES,\n themeType = 'system',\n tokenizeMaxLineLength = 1000,\n useCSSClasses = false,\n } = this.options;\n return {\n diffIndicators,\n diffStyle,\n disableBackground,\n disableFileHeader,\n disableLineNumbers,\n disableVirtualizationBuffers,\n expandUnchanged,\n expansionLineCount,\n hunkSeparators,\n lineDiffType,\n maxLineDiffLength,\n overflow,\n theme: this.workerManager?.getDiffRenderOptions().theme ?? theme,\n themeType,\n tokenizeMaxLineLength,\n useCSSClasses,\n };\n }\n\n async initializeHighlighter(): Promise<DiffsHighlighter> {\n this.highlighter = await getSharedHighlighter(\n getHighlighterOptions(this.computedLang, this.options)\n );\n return this.highlighter;\n }\n\n hydrate(diff: FileDiffMetadata | undefined): void {\n if (diff == null) {\n return;\n }\n this.diff = diff;\n const { options } = this.getRenderOptions(diff);\n let cache = this.workerManager?.getDiffResultCache(diff);\n if (cache != null && !areRenderOptionsEqual(options, cache.options)) {\n cache = undefined;\n }\n this.renderCache ??= {\n diff,\n // NOTE(amadeus): If we're hydrating, we can assume there was\n // pre-rendered HTML, otherwise one should not be hydrating\n highlighted: true,\n options,\n result: cache?.result,\n renderRange: undefined,\n };\n if (\n this.workerManager?.isWorkingPool() === true &&\n this.renderCache.result == null\n ) {\n this.workerManager.highlightDiffAST(this, this.diff);\n } else {\n void this.asyncHighlight(diff).then(({ result, options }) => {\n this.onHighlightSuccess(diff, result, options);\n });\n }\n }\n\n private getRenderOptions(diff: FileDiffMetadata): GetRenderOptionsReturn {\n const options: RenderDiffOptions = (() => {\n if (this.workerManager?.isWorkingPool() === true) {\n return this.workerManager.getDiffRenderOptions();\n }\n const { theme, tokenizeMaxLineLength, lineDiffType } =\n this.getOptionsWithDefaults();\n return { theme, tokenizeMaxLineLength, lineDiffType };\n })();\n this.getOptionsWithDefaults();\n const { renderCache } = this;\n if (renderCache?.result == null) {\n return { options, forceRender: true };\n }\n if (\n diff !== renderCache.diff ||\n !areRenderOptionsEqual(options, renderCache.options)\n ) {\n return { options, forceRender: true };\n }\n return { options, forceRender: false };\n }\n\n renderDiff(\n diff: FileDiffMetadata | undefined = this.renderCache?.diff,\n renderRange: RenderRange = DEFAULT_RENDER_RANGE\n ): HunksRenderResult | undefined {\n if (diff == null) {\n return undefined;\n }\n const { expandUnchanged = false } = this.options;\n const cache = this.workerManager?.getDiffResultCache(diff);\n if (cache != null && this.renderCache == null) {\n this.renderCache = {\n diff,\n highlighted: true,\n renderRange: undefined,\n ...cache,\n };\n }\n const { options, forceRender } = this.getRenderOptions(diff);\n this.renderCache ??= {\n diff,\n highlighted: false,\n options,\n result: undefined,\n renderRange: undefined,\n };\n if (this.workerManager?.isWorkingPool() === true) {\n if (\n this.renderCache.result == null ||\n (!this.renderCache.highlighted &&\n !areRenderRangesEqual(this.renderCache.renderRange, renderRange))\n ) {\n this.renderCache.result = this.workerManager.getPlainDiffAST(\n diff,\n renderRange.startingLine,\n renderRange.totalLines,\n // If we aren't using a windowed render, then we need to render\n // everything\n isDefaultRenderRange(renderRange)\n ? true\n : expandUnchanged\n ? true\n : this.expandedHunks\n );\n this.renderCache.renderRange = renderRange;\n }\n if (\n // We should only attempt to kick off the worker highlighter if there\n // are lines to render\n renderRange.totalLines > 0 &&\n (!this.renderCache.highlighted || forceRender)\n ) {\n this.workerManager.highlightDiffAST(this, diff);\n }\n } else {\n this.computedLang = diff.lang ?? getFiletypeFromFileName(diff.name);\n const hasThemes =\n this.highlighter != null && areThemesAttached(options.theme);\n const hasLangs =\n this.highlighter != null && areLanguagesAttached(this.computedLang);\n\n // If we have any semblance of a highlighter with the correct theme(s)\n // attached, we can kick off some form of rendering. If we don't have\n // the correct language, then we can render plain text and after kick off\n // an async job to get the highlighted AST\n if (\n this.highlighter != null &&\n hasThemes &&\n (forceRender ||\n (!this.renderCache.highlighted && hasLangs) ||\n this.renderCache.result == null)\n ) {\n const { result, options } = this.renderDiffWithHighlighter(\n diff,\n this.highlighter,\n !hasLangs\n );\n this.renderCache = {\n diff,\n options,\n highlighted: hasLangs,\n result,\n renderRange: undefined,\n };\n }\n\n // If we get in here it means we'll have to kick off an async highlight\n // process which will involve initializing the highlighter with new themes\n // and languages\n if (!hasThemes || !hasLangs) {\n void this.asyncHighlight(diff).then(({ result, options }) => {\n this.onHighlightSuccess(diff, result, options);\n });\n }\n }\n return this.renderCache.result != null\n ? this.processDiffResult(\n this.renderCache.diff,\n renderRange,\n this.renderCache.result\n )\n : undefined;\n }\n\n async asyncRender(\n diff: FileDiffMetadata,\n renderRange: RenderRange = DEFAULT_RENDER_RANGE\n ): Promise<HunksRenderResult> {\n const { result } = await this.asyncHighlight(diff);\n return this.processDiffResult(diff, renderRange, result);\n }\n\n private createPreElement(\n split: boolean,\n totalLines: number,\n themeStyles: string,\n baseThemeType: 'light' | 'dark' | undefined\n ): HASTElement {\n const {\n diffIndicators,\n disableBackground,\n disableLineNumbers,\n overflow,\n themeType,\n } = this.getOptionsWithDefaults();\n return createPreElement({\n diffIndicators,\n disableBackground,\n disableLineNumbers,\n overflow,\n themeStyles,\n split,\n themeType: baseThemeType ?? themeType,\n totalLines,\n });\n }\n\n private async asyncHighlight(\n diff: FileDiffMetadata\n ): Promise<RenderDiffResult> {\n this.computedLang = diff.lang ?? getFiletypeFromFileName(diff.name);\n const hasThemes =\n this.highlighter != null &&\n areThemesAttached(this.options.theme ?? DEFAULT_THEMES);\n const hasLangs =\n this.highlighter != null && areLanguagesAttached(this.computedLang);\n // If we don't have the required langs or themes, then we need to\n // initialize the highlighter to load the appropriate languages and themes\n if (this.highlighter == null || !hasThemes || !hasLangs) {\n this.highlighter = await this.initializeHighlighter();\n }\n return this.renderDiffWithHighlighter(diff, this.highlighter);\n }\n\n private renderDiffWithHighlighter(\n diff: FileDiffMetadata,\n highlighter: DiffsHighlighter,\n forcePlainText = false\n ): RenderDiffResult {\n const { options } = this.getRenderOptions(diff);\n const result = renderDiffWithHighlighter(diff, highlighter, options, {\n forcePlainText,\n expandedHunks: forcePlainText ? true : undefined,\n });\n return { result, options };\n }\n\n onHighlightSuccess(\n diff: FileDiffMetadata,\n result: ThemedDiffResult,\n options: RenderDiffOptions\n ): void {\n // If renderCache was blown away, we can assume we've run cleanUp()\n if (this.renderCache == null) {\n return;\n }\n const triggerRenderUpdate =\n this.renderCache.diff !== diff ||\n !this.renderCache.highlighted ||\n !areRenderOptionsEqual(this.renderCache.options, options);\n\n this.renderCache = {\n diff,\n options,\n highlighted: true,\n result,\n renderRange: undefined,\n };\n if (triggerRenderUpdate) {\n this.onRenderUpdate?.();\n }\n }\n\n onHighlightError(error: unknown): void {\n console.error(error);\n }\n\n private processDiffResult(\n fileDiff: FileDiffMetadata,\n renderRange: RenderRange,\n { code, themeStyles, baseThemeType }: ThemedDiffResult\n ): HunksRenderResult {\n const {\n diffStyle,\n disableFileHeader,\n disableVirtualizationBuffers,\n expandUnchanged,\n expansionLineCount,\n hunkSeparators,\n } = this.getOptionsWithDefaults();\n\n this.diff = fileDiff;\n const unified = diffStyle === 'unified';\n\n let additionsAST: ElementContent[] | undefined = [];\n let deletionsAST: ElementContent[] | undefined = [];\n let unifiedAST: ElementContent[] | undefined = [];\n\n const hunkData: HunkData[] = [];\n const { additionLines, deletionLines } = code;\n const separatorContext: PushSeparatorContext = {\n hunkSeparators,\n additionsAST,\n deletionsAST,\n unifiedAST,\n expansionLineCount,\n hunkData,\n };\n const trailingRangeSize = (() => {\n const lastHunk = fileDiff.hunks.at(-1);\n if (\n lastHunk == null ||\n fileDiff.isPartial ||\n fileDiff.additionLines.length === 0 ||\n fileDiff.deletionLines.length === 0\n ) {\n return 0;\n }\n const additionRemaining =\n fileDiff.additionLines.length -\n (lastHunk.additionLineIndex + lastHunk.additionCount);\n const deletionRemaining =\n fileDiff.deletionLines.length -\n (lastHunk.deletionLineIndex + lastHunk.deletionCount);\n if (additionRemaining !== deletionRemaining) {\n throw new Error(\n `DiffHunksRenderer.processDiffResult: trailing context mismatch (additions=${additionRemaining}, deletions=${deletionRemaining}) for ${fileDiff.name}`\n );\n }\n return Math.min(additionRemaining, deletionRemaining);\n })();\n\n let pendingSplitSpanSize = 0;\n let pendingSplitMissing: 'additions' | 'deletions' | undefined;\n let lastHunkIndex: number | undefined;\n\n function flushSplitSpan() {\n if (pendingSplitSpanSize <= 0 || pendingSplitMissing == null) {\n pendingSplitSpanSize = 0;\n pendingSplitMissing = undefined;\n return;\n }\n if (pendingSplitMissing === 'additions') {\n additionsAST?.push(createEmptyRowBuffer(pendingSplitSpanSize));\n } else {\n deletionsAST?.push(createEmptyRowBuffer(pendingSplitSpanSize));\n }\n pendingSplitSpanSize = 0;\n pendingSplitMissing = undefined;\n }\n\n function pushSeparators(props: PushSeparatorProps) {\n // NOTE(amadeus): This should technically never apply,\n // but just in case...\n flushSplitSpan();\n if (diffStyle === 'unified') {\n pushSeparator('unified', props, separatorContext);\n } else {\n pushSeparator('deletions', props, separatorContext);\n pushSeparator('additions', props, separatorContext);\n }\n }\n\n iterateOverDiff({\n diff: fileDiff,\n diffStyle,\n startingLine: renderRange.startingLine,\n totalLines: renderRange.totalLines,\n expandedHunks: expandUnchanged ? true : this.expandedHunks,\n callback: ({\n hunkIndex,\n hunk,\n collapsedBefore,\n collapsedAfter,\n unifiedDeletionLineIndex,\n unifiedAdditionLineIndex,\n splitLineIndex,\n additionLineIndex,\n deletionLineIndex,\n additionLineNumber,\n deletionLineNumber,\n type,\n noEOFCRAddition,\n noEOFCRDeletion,\n }) => {\n if (diffStyle === 'split') {\n if (lastHunkIndex != null && lastHunkIndex !== hunkIndex) {\n flushSplitSpan();\n }\n if (type !== 'change') {\n flushSplitSpan();\n }\n }\n lastHunkIndex = hunkIndex;\n\n if (collapsedBefore > 0) {\n pushSeparators({\n hunkIndex,\n collapsedLines: collapsedBefore,\n rangeSize: Math.max(hunk?.collapsedBefore ?? 0, 0),\n hunkSpecs: hunk?.hunkSpecs,\n isFirstHunk: hunkIndex === 0,\n isLastHunk: false,\n isExpandable: !fileDiff.isPartial,\n });\n }\n\n const lineIndex =\n diffStyle === 'unified'\n ? (unifiedDeletionLineIndex ?? unifiedAdditionLineIndex)\n : splitLineIndex;\n\n if (lineIndex == null) {\n const errorMessage =\n 'DiffHunksRenderer.processDiffResult: iterateOverDiff, no valid line index';\n console.error(errorMessage, { file: fileDiff.name });\n throw new Error(errorMessage);\n }\n\n if (diffStyle === 'unified') {\n const deletionLine =\n additionLineIndex != null\n ? undefined\n : deletionLineIndex != null\n ? deletionLines[deletionLineIndex]\n : undefined;\n const additionLine =\n additionLineIndex != null\n ? additionLines[additionLineIndex]\n : undefined;\n\n if (deletionLine == null && additionLine == null) {\n const errorMessage =\n 'DiffHunksRenderer.processDiffResult: deletionLine and additionLine are null, something is wrong';\n console.error(errorMessage, { file: fileDiff.name });\n throw new Error(errorMessage);\n }\n\n pushLineWithAnnotation({\n deletionLine,\n additionLine,\n unifiedAST,\n unifiedSpan: this.getAnnotations(\n 'unified',\n deletionLineNumber,\n additionLineNumber,\n hunkIndex,\n lineIndex\n ),\n });\n } else {\n const deletionLine =\n deletionLineIndex != null\n ? deletionLines[deletionLineIndex]\n : undefined;\n const additionLine =\n additionLineIndex != null\n ? additionLines[additionLineIndex]\n : undefined;\n\n if (deletionLine == null && additionLine == null) {\n const errorMessage =\n 'DiffHunksRenderer.processDiffResult: deletionLine and additionLine are null, something is wrong';\n console.error(errorMessage, { file: fileDiff.name });\n throw new Error(errorMessage);\n }\n\n const missingSide =\n deletionLine == null\n ? 'deletions'\n : additionLine == null\n ? 'additions'\n : undefined;\n if (missingSide != null) {\n if (\n pendingSplitMissing != null &&\n pendingSplitMissing !== missingSide\n ) {\n // NOTE(amadeus): If we see this error, we might need to bring back: flushSplitSpan();\n throw new Error(\n 'DiffHunksRenderer.processDiffResult: iterateOverDiff, invalid pending splits'\n );\n }\n pendingSplitMissing = missingSide;\n pendingSplitSpanSize++;\n }\n\n const annotationSpans = this.getAnnotations(\n 'split',\n deletionLineNumber,\n additionLineNumber,\n hunkIndex,\n lineIndex\n );\n if (annotationSpans != null && pendingSplitSpanSize > 0) {\n flushSplitSpan();\n }\n pushLineWithAnnotation({\n additionLine,\n deletionLine,\n deletionsAST,\n additionsAST,\n ...annotationSpans,\n });\n }\n\n if (noEOFCRDeletion || noEOFCRAddition) {\n const noEOFType =\n type === 'context' || type === 'context-expanded'\n ? 'context'\n : deletionLineIndex != null\n ? 'change-deletion'\n : 'change-addition';\n if (noEOFCRDeletion) {\n if (diffStyle === 'unified') {\n unifiedAST?.push(createNoNewlineElement(noEOFType));\n } else {\n deletionsAST?.push(createNoNewlineElement('change-deletion'));\n if (!noEOFCRAddition) {\n additionsAST?.push(createEmptyRowBuffer(1));\n }\n }\n }\n if (noEOFCRAddition) {\n if (diffStyle === 'unified') {\n unifiedAST?.push(createNoNewlineElement('change-addition'));\n } else {\n additionsAST?.push(createNoNewlineElement('change-addition'));\n if (!noEOFCRDeletion) {\n deletionsAST?.push(createEmptyRowBuffer(1));\n }\n }\n }\n }\n\n if (collapsedAfter > 0) {\n pushSeparators({\n hunkIndex: type === 'context-expanded' ? hunkIndex : hunkIndex + 1,\n collapsedLines: collapsedAfter,\n rangeSize: trailingRangeSize,\n hunkSpecs: undefined,\n isFirstHunk: false,\n isLastHunk: true,\n isExpandable: !fileDiff.isPartial,\n });\n }\n },\n });\n\n if (diffStyle === 'split') {\n flushSplitSpan();\n }\n\n const totalLines = Math.max(\n getTotalLineCountFromHunks(fileDiff.hunks),\n fileDiff.additionLines.length ?? 0,\n fileDiff.deletionLines.length ?? 0\n );\n\n // Some specialized logic to set our AST lists to be undefinable under\n // certain conditions\n // * If the type of change is a full addition or a full deletion, we don't\n // want to show a split view as that creates wasted space\n // * We'll do some further refinement below if necessary with list length,\n // but first we need to inject buffers if we are virtualized before we can\n // do the length check\n additionsAST =\n !unified && fileDiff.type !== 'deleted' ? additionsAST : undefined;\n deletionsAST =\n !unified && fileDiff.type !== 'new' ? deletionsAST : undefined;\n unifiedAST = unified ? unifiedAST : undefined;\n\n if (!disableVirtualizationBuffers) {\n if (renderRange.bufferBefore > 0) {\n const element = createBufferElement('before', renderRange.bufferBefore);\n unifiedAST?.unshift(element);\n deletionsAST?.unshift(element);\n additionsAST?.unshift(element);\n }\n if (renderRange.bufferAfter > 0) {\n const element = createBufferElement('after', renderRange.bufferAfter);\n unifiedAST?.push(element);\n deletionsAST?.push(element);\n additionsAST?.push(element);\n }\n }\n\n // If any of our arrays are empty, lets null them out to optimize rendering\n if (unifiedAST?.length === 0) {\n unifiedAST = undefined;\n }\n if (deletionsAST?.length === 0) {\n deletionsAST = undefined;\n }\n if (additionsAST?.length === 0) {\n additionsAST = undefined;\n }\n\n const preNode = this.createPreElement(\n deletionsAST != null && additionsAST != null,\n totalLines,\n themeStyles,\n baseThemeType\n );\n\n return {\n additionsAST,\n deletionsAST,\n unifiedAST,\n hunkData,\n preNode,\n themeStyles,\n baseThemeType,\n headerElement: !disableFileHeader\n ? this.renderHeader(this.diff, themeStyles, baseThemeType)\n : undefined,\n totalLines,\n // FIXME\n css: '',\n };\n }\n\n renderFullAST(\n result: HunksRenderResult,\n children: ElementContent[] = []\n ): HASTElement {\n if (result.unifiedAST != null) {\n children.push(\n createHastElement({\n tagName: 'code',\n children: result.unifiedAST,\n properties: {\n 'data-code': '',\n 'data-unified': '',\n },\n })\n );\n }\n if (result.deletionsAST != null) {\n children.push(\n createHastElement({\n tagName: 'code',\n children: result.deletionsAST,\n properties: {\n 'data-code': '',\n 'data-deletions': '',\n },\n })\n );\n }\n if (result.additionsAST != null) {\n children.push(\n createHastElement({\n tagName: 'code',\n children: result.additionsAST,\n properties: {\n 'data-code': '',\n 'data-additions': '',\n },\n })\n );\n }\n return { ...result.preNode, children };\n }\n\n renderFullHTML(\n result: HunksRenderResult,\n tempChildren: ElementContent[] = []\n ): string {\n return toHtml(this.renderFullAST(result, tempChildren));\n }\n\n renderPartialHTML(\n children: ElementContent[],\n columnType?: 'unified' | 'deletions' | 'additions'\n ): string {\n if (columnType == null) {\n return toHtml(children);\n }\n return toHtml(\n createHastElement({\n tagName: 'code',\n children,\n properties: {\n 'data-code': '',\n [`data-${columnType}`]: '',\n },\n })\n );\n }\n\n private getAnnotations(\n type: 'unified',\n deletionLineNumber: number | undefined,\n additionLineNumber: number | undefined,\n hunkIndex: number,\n lineIndex: number\n ): AnnotationSpan | undefined;\n private getAnnotations(\n type: 'split',\n deletionLineNumber: number | undefined,\n additionLineNumber: number | undefined,\n hunkIndex: number,\n lineIndex: number\n ): { deletionSpan: AnnotationSpan; additionSpan: AnnotationSpan } | undefined;\n private getAnnotations(\n type: 'unified' | 'split',\n deletionLineNumber: number | undefined,\n additionLineNumber: number | undefined,\n hunkIndex: number,\n lineIndex: number\n ):\n | AnnotationSpan\n | { deletionSpan: AnnotationSpan; additionSpan: AnnotationSpan }\n | undefined {\n const deletionSpan: AnnotationSpan = {\n type: 'annotation',\n hunkIndex,\n lineIndex,\n annotations: [],\n };\n if (deletionLineNumber != null) {\n for (const anno of this.deletionAnnotations[deletionLineNumber] ?? []) {\n deletionSpan.annotations.push(getLineAnnotationName(anno));\n }\n }\n const additionSpan: AnnotationSpan = {\n type: 'annotation',\n hunkIndex,\n lineIndex,\n annotations: [],\n };\n if (additionLineNumber != null) {\n for (const anno of this.additionAnnotations[additionLineNumber] ?? []) {\n (type === 'unified' ? deletionSpan : additionSpan).annotations.push(\n getLineAnnotationName(anno)\n );\n }\n }\n if (type === 'unified') {\n if (deletionSpan.annotations.length > 0) {\n return deletionSpan;\n }\n return undefined;\n }\n if (\n additionSpan.annotations.length === 0 &&\n deletionSpan.annotations.length === 0\n ) {\n return undefined;\n }\n return { deletionSpan, additionSpan };\n }\n\n private renderHeader(\n diff: FileDiffMetadata,\n themeStyles: string,\n baseThemeType: 'light' | 'dark' | undefined\n ): HASTElement {\n const { themeType } = this.getOptionsWithDefaults();\n return createFileHeaderElement({\n fileOrDiff: diff,\n themeStyles,\n themeType: baseThemeType ?? themeType,\n });\n }\n}\n\nfunction areRenderOptionsEqual(\n optionsA: RenderDiffOptions,\n optionsB: RenderDiffOptions\n): boolean {\n return (\n areThemesEqual(optionsA.theme, optionsB.theme) &&\n optionsA.tokenizeMaxLineLength === optionsB.tokenizeMaxLineLength &&\n optionsA.lineDiffType === optionsB.lineDiffType\n );\n}\n\nfunction getModifiedLinesString(lines: number) {\n return `${lines} unmodified line${lines > 1 ? 's' : ''}`;\n}\n\nfunction pushLineWithAnnotation({\n deletionLine,\n additionLine,\n unifiedAST,\n additionsAST,\n deletionsAST,\n unifiedSpan,\n deletionSpan,\n additionSpan,\n}: PushLineWithAnnotation) {\n if (unifiedAST != null) {\n if (deletionLine != null) {\n unifiedAST.push(deletionLine);\n } else if (additionLine != null) {\n unifiedAST.push(additionLine);\n }\n if (unifiedSpan != null) {\n unifiedAST.push(createAnnotationElement(unifiedSpan));\n }\n } else if (deletionsAST != null && additionsAST != null) {\n if (deletionLine != null) {\n deletionsAST.push(deletionLine);\n }\n if (additionLine != null) {\n additionsAST.push(additionLine);\n }\n if (deletionSpan != null) {\n deletionsAST.push(createAnnotationElement(deletionSpan));\n }\n if (additionSpan != null) {\n additionsAST.push(createAnnotationElement(additionSpan));\n }\n }\n}\n\nfunction pushSeparator(\n type: 'additions' | 'deletions' | 'unified',\n {\n hunkIndex,\n collapsedLines,\n rangeSize,\n hunkSpecs,\n isFirstHunk,\n isLastHunk,\n isExpandable,\n }: PushSeparatorProps,\n {\n expansionLineCount,\n hunkSeparators,\n unifiedAST,\n deletionsAST,\n additionsAST,\n hunkData,\n }: PushSeparatorContext\n) {\n if (collapsedLines <= 0) {\n return;\n }\n const linesAST =\n type === 'unified'\n ? unifiedAST\n : type === 'deletions'\n ? deletionsAST\n : additionsAST;\n\n if (hunkSeparators === 'metadata') {\n if (hunkSpecs != null) {\n linesAST.push(\n createSeparator({\n type: 'metadata',\n content: hunkSpecs,\n isFirstHunk,\n isLastHunk,\n })\n );\n }\n return;\n }\n if (hunkSeparators === 'simple') {\n if (hunkIndex > 0) {\n linesAST.push(\n createSeparator({ type: 'simple', isFirstHunk, isLastHunk: false })\n );\n }\n return;\n }\n const slotName = getHunkSeparatorSlotName(type, hunkIndex);\n const chunked = rangeSize > expansionLineCount;\n const expandIndex = isExpandable ? hunkIndex : undefined;\n linesAST.push(\n createSeparator({\n type: hunkSeparators,\n content: getModifiedLinesString(collapsedLines),\n expandIndex,\n chunked,\n slotName,\n isFirstHunk,\n isLastHunk,\n })\n );\n hunkData.push({\n slotName,\n hunkIndex,\n lines: collapsedLines,\n type,\n expandable: isExpandable\n ? { up: !isFirstHunk, down: !isLastHunk, chunked }\n : undefined,\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DiffHunksRenderer.js","names":["DEFAULT_RENDER_RANGE: RenderRange","options: BaseDiffOptions","onRenderUpdate?: () => unknown","workerManager?: WorkerPoolManager | undefined","options","options: RenderDiffOptions","additionsAST: ElementContent[] | undefined","deletionsAST: ElementContent[] | undefined","unifiedAST: ElementContent[] | undefined","hunkData: HunkData[]","separatorContext: PushSeparatorContext","pendingSplitMissing: 'additions' | 'deletions' | undefined","lastHunkIndex: number | undefined","deletionSpan: AnnotationSpan","additionSpan: AnnotationSpan"],"sources":["../../src/renderers/DiffHunksRenderer.ts"],"sourcesContent":["import type { ElementContent, Element as HASTElement } from 'hast';\nimport { toHtml } from 'hast-util-to-html';\n\nimport {\n DEFAULT_COLLAPSED_CONTEXT_THRESHOLD,\n DEFAULT_EXPANDED_REGION,\n DEFAULT_THEMES,\n} from '../constants';\nimport { areLanguagesAttached } from '../highlighter/languages/areLanguagesAttached';\nimport {\n getHighlighterIfLoaded,\n getSharedHighlighter,\n} from '../highlighter/shared_highlighter';\nimport { areThemesAttached } from '../highlighter/themes/areThemesAttached';\nimport type {\n AnnotationLineMap,\n AnnotationSpan,\n BaseDiffOptions,\n DiffLineAnnotation,\n DiffsHighlighter,\n ExpansionDirections,\n FileDiffMetadata,\n HunkData,\n HunkExpansionRegion,\n HunkSeparators,\n RenderDiffOptions,\n RenderDiffResult,\n RenderRange,\n RenderedDiffASTCache,\n SupportedLanguages,\n ThemeTypes,\n ThemedDiffResult,\n} from '../types';\nimport { areRenderRangesEqual } from '../utils/areRenderRangesEqual';\nimport { areThemesEqual } from '../utils/areThemesEqual';\nimport { createAnnotationElement } from '../utils/createAnnotationElement';\nimport { createEmptyRowBuffer } from '../utils/createEmptyRowBuffer';\nimport { createFileHeaderElement } from '../utils/createFileHeaderElement';\nimport { createNoNewlineElement } from '../utils/createNoNewlineElement';\nimport { createPreElement } from '../utils/createPreElement';\nimport { createSeparator } from '../utils/createSeparator';\nimport { getFiletypeFromFileName } from '../utils/getFiletypeFromFileName';\nimport { getHighlighterOptions } from '../utils/getHighlighterOptions';\nimport { getHunkSeparatorSlotName } from '../utils/getHunkSeparatorSlotName';\nimport { getLineAnnotationName } from '../utils/getLineAnnotationName';\nimport { getTotalLineCountFromHunks } from '../utils/getTotalLineCountFromHunks';\nimport { createBufferElement, createHastElement } from '../utils/hast_utils';\nimport { isDefaultRenderRange } from '../utils/isDefaultRenderRange';\nimport { iterateOverDiff } from '../utils/iterateOverDiff';\nimport { renderDiffWithHighlighter } from '../utils/renderDiffWithHighlighter';\nimport type { WorkerPoolManager } from '../worker';\n\ninterface PushLineWithAnnotation {\n deletionLine?: ElementContent;\n additionLine?: ElementContent;\n\n unifiedAST?: ElementContent[];\n deletionsAST?: ElementContent[];\n additionsAST?: ElementContent[];\n\n unifiedSpan?: AnnotationSpan;\n deletionSpan?: AnnotationSpan;\n additionSpan?: AnnotationSpan;\n}\n\nconst DEFAULT_RENDER_RANGE: RenderRange = {\n startingLine: 0,\n totalLines: Infinity,\n bufferBefore: 0,\n bufferAfter: 0,\n};\n\ninterface GetRenderOptionsReturn {\n options: RenderDiffOptions;\n forceRender: boolean;\n}\n\ninterface PushSeparatorProps {\n hunkIndex: number;\n collapsedLines: number;\n rangeSize: number;\n hunkSpecs: string | undefined;\n isFirstHunk: boolean;\n isLastHunk: boolean;\n isExpandable: boolean;\n}\n\ninterface PushSeparatorContext {\n expansionLineCount: number;\n hunkSeparators: HunkSeparators;\n unifiedAST: ElementContent[];\n deletionsAST: ElementContent[];\n additionsAST: ElementContent[];\n hunkData: HunkData[];\n}\n\ntype OptionsWithDefaults = Required<\n Omit<BaseDiffOptions, 'lang' | 'unsafeCSS'>\n>;\n\nexport interface HunksRenderResult {\n additionsAST: ElementContent[] | undefined;\n deletionsAST: ElementContent[] | undefined;\n unifiedAST: ElementContent[] | undefined;\n hunkData: HunkData[];\n css: string;\n preNode: HASTElement;\n headerElement: HASTElement | undefined;\n totalLines: number;\n themeStyles: string;\n baseThemeType: 'light' | 'dark' | undefined;\n}\n\nlet instanceId = -1;\n\nexport class DiffHunksRenderer<LAnnotation = undefined> {\n readonly __id: string = `diff-hunks-renderer:${++instanceId}`;\n\n private highlighter: DiffsHighlighter | undefined;\n private diff: FileDiffMetadata | undefined;\n\n private expandedHunks = new Map<number, HunkExpansionRegion>();\n\n private deletionAnnotations: AnnotationLineMap<LAnnotation> = {};\n private additionAnnotations: AnnotationLineMap<LAnnotation> = {};\n\n private computedLang: SupportedLanguages = 'text';\n private renderCache: RenderedDiffASTCache | undefined;\n\n constructor(\n public options: BaseDiffOptions = { theme: DEFAULT_THEMES },\n private onRenderUpdate?: () => unknown,\n private workerManager?: WorkerPoolManager | undefined\n ) {\n if (workerManager?.isWorkingPool() !== true) {\n this.highlighter = areThemesAttached(options.theme ?? DEFAULT_THEMES)\n ? getHighlighterIfLoaded()\n : undefined;\n }\n }\n\n cleanUp(): void {\n this.highlighter = undefined;\n this.diff = undefined;\n this.renderCache = undefined;\n this.workerManager?.cleanUpPendingTasks(this);\n this.workerManager = undefined;\n this.onRenderUpdate = undefined;\n }\n\n recycle(): void {\n this.highlighter = undefined;\n this.diff = undefined;\n this.renderCache = undefined;\n this.workerManager?.cleanUpPendingTasks(this);\n }\n\n setOptions(options: BaseDiffOptions): void {\n this.options = options;\n }\n\n private mergeOptions(options: Partial<BaseDiffOptions>) {\n this.options = { ...this.options, ...options };\n }\n\n setThemeType(themeType: ThemeTypes): void {\n if (this.getOptionsWithDefaults().themeType === themeType) {\n return;\n }\n this.mergeOptions({ themeType });\n }\n\n expandHunk(index: number, direction: ExpansionDirections): void {\n const { expansionLineCount } = this.getOptionsWithDefaults();\n const region = {\n ...(this.expandedHunks.get(index) ?? {\n fromStart: 0,\n fromEnd: 0,\n }),\n };\n if (direction === 'up' || direction === 'both') {\n region.fromStart += expansionLineCount;\n }\n if (direction === 'down' || direction === 'both') {\n region.fromEnd += expansionLineCount;\n }\n this.expandedHunks.set(index, region);\n }\n\n getExpandedHunk(hunkIndex: number): HunkExpansionRegion {\n return this.expandedHunks.get(hunkIndex) ?? DEFAULT_EXPANDED_REGION;\n }\n\n getExpandedHunksMap(): Map<number, HunkExpansionRegion> {\n return this.expandedHunks;\n }\n\n setLineAnnotations(lineAnnotations: DiffLineAnnotation<LAnnotation>[]): void {\n this.additionAnnotations = {};\n this.deletionAnnotations = {};\n for (const annotation of lineAnnotations) {\n const map = ((): AnnotationLineMap<LAnnotation> => {\n switch (annotation.side) {\n case 'deletions':\n return this.deletionAnnotations;\n case 'additions':\n return this.additionAnnotations;\n }\n })();\n const arr = map[annotation.lineNumber] ?? [];\n map[annotation.lineNumber] = arr;\n arr.push(annotation);\n }\n }\n\n getOptionsWithDefaults(): OptionsWithDefaults {\n const {\n diffIndicators = 'bars',\n diffStyle = 'split',\n disableBackground = false,\n disableFileHeader = false,\n disableLineNumbers = false,\n disableVirtualizationBuffers = false,\n expandUnchanged = false,\n collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD,\n expansionLineCount = 100,\n hunkSeparators = 'line-info',\n lineDiffType = 'word-alt',\n maxLineDiffLength = 1000,\n overflow = 'scroll',\n theme = DEFAULT_THEMES,\n themeType = 'system',\n tokenizeMaxLineLength = 1000,\n useCSSClasses = false,\n } = this.options;\n return {\n diffIndicators,\n diffStyle,\n disableBackground,\n disableFileHeader,\n disableLineNumbers,\n disableVirtualizationBuffers,\n expandUnchanged,\n collapsedContextThreshold,\n expansionLineCount,\n hunkSeparators,\n lineDiffType,\n maxLineDiffLength,\n overflow,\n theme: this.workerManager?.getDiffRenderOptions().theme ?? theme,\n themeType,\n tokenizeMaxLineLength,\n useCSSClasses,\n };\n }\n\n async initializeHighlighter(): Promise<DiffsHighlighter> {\n this.highlighter = await getSharedHighlighter(\n getHighlighterOptions(this.computedLang, this.options)\n );\n return this.highlighter;\n }\n\n hydrate(diff: FileDiffMetadata | undefined): void {\n if (diff == null) {\n return;\n }\n this.diff = diff;\n const { options } = this.getRenderOptions(diff);\n let cache = this.workerManager?.getDiffResultCache(diff);\n if (cache != null && !areRenderOptionsEqual(options, cache.options)) {\n cache = undefined;\n }\n this.renderCache ??= {\n diff,\n // NOTE(amadeus): If we're hydrating, we can assume there was\n // pre-rendered HTML, otherwise one should not be hydrating\n highlighted: true,\n options,\n result: cache?.result,\n renderRange: undefined,\n };\n if (\n this.workerManager?.isWorkingPool() === true &&\n this.renderCache.result == null\n ) {\n this.workerManager.highlightDiffAST(this, this.diff);\n } else {\n void this.asyncHighlight(diff).then(({ result, options }) => {\n this.onHighlightSuccess(diff, result, options);\n });\n }\n }\n\n private getRenderOptions(diff: FileDiffMetadata): GetRenderOptionsReturn {\n const options: RenderDiffOptions = (() => {\n if (this.workerManager?.isWorkingPool() === true) {\n return this.workerManager.getDiffRenderOptions();\n }\n const { theme, tokenizeMaxLineLength, lineDiffType } =\n this.getOptionsWithDefaults();\n return { theme, tokenizeMaxLineLength, lineDiffType };\n })();\n this.getOptionsWithDefaults();\n const { renderCache } = this;\n if (renderCache?.result == null) {\n return { options, forceRender: true };\n }\n if (\n diff !== renderCache.diff ||\n !areRenderOptionsEqual(options, renderCache.options)\n ) {\n return { options, forceRender: true };\n }\n return { options, forceRender: false };\n }\n\n renderDiff(\n diff: FileDiffMetadata | undefined = this.renderCache?.diff,\n renderRange: RenderRange = DEFAULT_RENDER_RANGE\n ): HunksRenderResult | undefined {\n if (diff == null) {\n return undefined;\n }\n const { expandUnchanged = false, collapsedContextThreshold } =\n this.getOptionsWithDefaults();\n const cache = this.workerManager?.getDiffResultCache(diff);\n if (cache != null && this.renderCache == null) {\n this.renderCache = {\n diff,\n highlighted: true,\n renderRange: undefined,\n ...cache,\n };\n }\n const { options, forceRender } = this.getRenderOptions(diff);\n this.renderCache ??= {\n diff,\n highlighted: false,\n options,\n result: undefined,\n renderRange: undefined,\n };\n if (this.workerManager?.isWorkingPool() === true) {\n if (\n this.renderCache.result == null ||\n (!this.renderCache.highlighted &&\n !areRenderRangesEqual(this.renderCache.renderRange, renderRange))\n ) {\n this.renderCache.result = this.workerManager.getPlainDiffAST(\n diff,\n renderRange.startingLine,\n renderRange.totalLines,\n // If we aren't using a windowed render, then we need to render\n // everything\n isDefaultRenderRange(renderRange)\n ? true\n : expandUnchanged\n ? true\n : this.expandedHunks,\n collapsedContextThreshold\n );\n this.renderCache.renderRange = renderRange;\n }\n if (\n // We should only attempt to kick off the worker highlighter if there\n // are lines to render\n renderRange.totalLines > 0 &&\n (!this.renderCache.highlighted || forceRender)\n ) {\n this.workerManager.highlightDiffAST(this, diff);\n }\n } else {\n this.computedLang = diff.lang ?? getFiletypeFromFileName(diff.name);\n const hasThemes =\n this.highlighter != null && areThemesAttached(options.theme);\n const hasLangs =\n this.highlighter != null && areLanguagesAttached(this.computedLang);\n\n // If we have any semblance of a highlighter with the correct theme(s)\n // attached, we can kick off some form of rendering. If we don't have\n // the correct language, then we can render plain text and after kick off\n // an async job to get the highlighted AST\n if (\n this.highlighter != null &&\n hasThemes &&\n (forceRender ||\n (!this.renderCache.highlighted && hasLangs) ||\n this.renderCache.result == null)\n ) {\n const { result, options } = this.renderDiffWithHighlighter(\n diff,\n this.highlighter,\n !hasLangs\n );\n this.renderCache = {\n diff,\n options,\n highlighted: hasLangs,\n result,\n renderRange: undefined,\n };\n }\n\n // If we get in here it means we'll have to kick off an async highlight\n // process which will involve initializing the highlighter with new themes\n // and languages\n if (!hasThemes || !hasLangs) {\n void this.asyncHighlight(diff).then(({ result, options }) => {\n this.onHighlightSuccess(diff, result, options);\n });\n }\n }\n return this.renderCache.result != null\n ? this.processDiffResult(\n this.renderCache.diff,\n renderRange,\n this.renderCache.result\n )\n : undefined;\n }\n\n async asyncRender(\n diff: FileDiffMetadata,\n renderRange: RenderRange = DEFAULT_RENDER_RANGE\n ): Promise<HunksRenderResult> {\n const { result } = await this.asyncHighlight(diff);\n return this.processDiffResult(diff, renderRange, result);\n }\n\n private createPreElement(\n split: boolean,\n totalLines: number,\n themeStyles: string,\n baseThemeType: 'light' | 'dark' | undefined\n ): HASTElement {\n const {\n diffIndicators,\n disableBackground,\n disableLineNumbers,\n overflow,\n themeType,\n } = this.getOptionsWithDefaults();\n return createPreElement({\n diffIndicators,\n disableBackground,\n disableLineNumbers,\n overflow,\n themeStyles,\n split,\n themeType: baseThemeType ?? themeType,\n totalLines,\n });\n }\n\n private async asyncHighlight(\n diff: FileDiffMetadata\n ): Promise<RenderDiffResult> {\n this.computedLang = diff.lang ?? getFiletypeFromFileName(diff.name);\n const hasThemes =\n this.highlighter != null &&\n areThemesAttached(this.options.theme ?? DEFAULT_THEMES);\n const hasLangs =\n this.highlighter != null && areLanguagesAttached(this.computedLang);\n // If we don't have the required langs or themes, then we need to\n // initialize the highlighter to load the appropriate languages and themes\n if (this.highlighter == null || !hasThemes || !hasLangs) {\n this.highlighter = await this.initializeHighlighter();\n }\n return this.renderDiffWithHighlighter(diff, this.highlighter);\n }\n\n private renderDiffWithHighlighter(\n diff: FileDiffMetadata,\n highlighter: DiffsHighlighter,\n forcePlainText = false\n ): RenderDiffResult {\n const { options } = this.getRenderOptions(diff);\n const { collapsedContextThreshold } = this.getOptionsWithDefaults();\n const result = renderDiffWithHighlighter(diff, highlighter, options, {\n forcePlainText,\n expandedHunks: forcePlainText ? true : undefined,\n collapsedContextThreshold,\n });\n return { result, options };\n }\n\n onHighlightSuccess(\n diff: FileDiffMetadata,\n result: ThemedDiffResult,\n options: RenderDiffOptions\n ): void {\n // If renderCache was blown away, we can assume we've run cleanUp()\n if (this.renderCache == null) {\n return;\n }\n const triggerRenderUpdate =\n this.renderCache.diff !== diff ||\n !this.renderCache.highlighted ||\n !areRenderOptionsEqual(this.renderCache.options, options);\n\n this.renderCache = {\n diff,\n options,\n highlighted: true,\n result,\n renderRange: undefined,\n };\n if (triggerRenderUpdate) {\n this.onRenderUpdate?.();\n }\n }\n\n onHighlightError(error: unknown): void {\n console.error(error);\n }\n\n private processDiffResult(\n fileDiff: FileDiffMetadata,\n renderRange: RenderRange,\n { code, themeStyles, baseThemeType }: ThemedDiffResult\n ): HunksRenderResult {\n const {\n diffStyle,\n disableFileHeader,\n disableVirtualizationBuffers,\n expandUnchanged,\n expansionLineCount,\n collapsedContextThreshold,\n hunkSeparators,\n } = this.getOptionsWithDefaults();\n\n this.diff = fileDiff;\n const unified = diffStyle === 'unified';\n\n let additionsAST: ElementContent[] | undefined = [];\n let deletionsAST: ElementContent[] | undefined = [];\n let unifiedAST: ElementContent[] | undefined = [];\n\n const hunkData: HunkData[] = [];\n const { additionLines, deletionLines } = code;\n const separatorContext: PushSeparatorContext = {\n hunkSeparators,\n additionsAST,\n deletionsAST,\n unifiedAST,\n expansionLineCount,\n hunkData,\n };\n const trailingRangeSize = (() => {\n const lastHunk = fileDiff.hunks.at(-1);\n if (\n lastHunk == null ||\n fileDiff.isPartial ||\n fileDiff.additionLines.length === 0 ||\n fileDiff.deletionLines.length === 0\n ) {\n return 0;\n }\n const additionRemaining =\n fileDiff.additionLines.length -\n (lastHunk.additionLineIndex + lastHunk.additionCount);\n const deletionRemaining =\n fileDiff.deletionLines.length -\n (lastHunk.deletionLineIndex + lastHunk.deletionCount);\n if (additionRemaining !== deletionRemaining) {\n throw new Error(\n `DiffHunksRenderer.processDiffResult: trailing context mismatch (additions=${additionRemaining}, deletions=${deletionRemaining}) for ${fileDiff.name}`\n );\n }\n return Math.min(additionRemaining, deletionRemaining);\n })();\n\n let pendingSplitSpanSize = 0;\n let pendingSplitMissing: 'additions' | 'deletions' | undefined;\n let lastHunkIndex: number | undefined;\n\n function flushSplitSpan() {\n if (pendingSplitSpanSize <= 0 || pendingSplitMissing == null) {\n pendingSplitSpanSize = 0;\n pendingSplitMissing = undefined;\n return;\n }\n if (pendingSplitMissing === 'additions') {\n additionsAST?.push(createEmptyRowBuffer(pendingSplitSpanSize));\n } else {\n deletionsAST?.push(createEmptyRowBuffer(pendingSplitSpanSize));\n }\n pendingSplitSpanSize = 0;\n pendingSplitMissing = undefined;\n }\n\n function pushSeparators(props: PushSeparatorProps) {\n // NOTE(amadeus): This should technically never apply,\n // but just in case...\n flushSplitSpan();\n if (diffStyle === 'unified') {\n pushSeparator('unified', props, separatorContext);\n } else {\n pushSeparator('deletions', props, separatorContext);\n pushSeparator('additions', props, separatorContext);\n }\n }\n\n iterateOverDiff({\n diff: fileDiff,\n diffStyle,\n startingLine: renderRange.startingLine,\n totalLines: renderRange.totalLines,\n expandedHunks: expandUnchanged ? true : this.expandedHunks,\n collapsedContextThreshold,\n callback: ({\n hunkIndex,\n hunk,\n collapsedBefore,\n collapsedAfter,\n unifiedDeletionLineIndex,\n unifiedAdditionLineIndex,\n splitLineIndex,\n additionLineIndex,\n deletionLineIndex,\n additionLineNumber,\n deletionLineNumber,\n type,\n noEOFCRAddition,\n noEOFCRDeletion,\n }) => {\n if (diffStyle === 'split') {\n if (lastHunkIndex != null && lastHunkIndex !== hunkIndex) {\n flushSplitSpan();\n }\n if (type !== 'change') {\n flushSplitSpan();\n }\n }\n lastHunkIndex = hunkIndex;\n\n if (collapsedBefore > 0) {\n pushSeparators({\n hunkIndex,\n collapsedLines: collapsedBefore,\n rangeSize: Math.max(hunk?.collapsedBefore ?? 0, 0),\n hunkSpecs: hunk?.hunkSpecs,\n isFirstHunk: hunkIndex === 0,\n isLastHunk: false,\n isExpandable: !fileDiff.isPartial,\n });\n }\n\n const lineIndex =\n diffStyle === 'unified'\n ? (unifiedDeletionLineIndex ?? unifiedAdditionLineIndex)\n : splitLineIndex;\n\n if (lineIndex == null) {\n const errorMessage =\n 'DiffHunksRenderer.processDiffResult: iterateOverDiff, no valid line index';\n console.error(errorMessage, { file: fileDiff.name });\n throw new Error(errorMessage);\n }\n\n if (diffStyle === 'unified') {\n const deletionLine =\n additionLineIndex != null\n ? undefined\n : deletionLineIndex != null\n ? deletionLines[deletionLineIndex]\n : undefined;\n const additionLine =\n additionLineIndex != null\n ? additionLines[additionLineIndex]\n : undefined;\n\n if (deletionLine == null && additionLine == null) {\n const errorMessage =\n 'DiffHunksRenderer.processDiffResult: deletionLine and additionLine are null, something is wrong';\n console.error(errorMessage, { file: fileDiff.name });\n throw new Error(errorMessage);\n }\n\n pushLineWithAnnotation({\n deletionLine,\n additionLine,\n unifiedAST,\n unifiedSpan: this.getAnnotations(\n 'unified',\n deletionLineNumber,\n additionLineNumber,\n hunkIndex,\n lineIndex\n ),\n });\n } else {\n const deletionLine =\n deletionLineIndex != null\n ? deletionLines[deletionLineIndex]\n : undefined;\n const additionLine =\n additionLineIndex != null\n ? additionLines[additionLineIndex]\n : undefined;\n\n if (deletionLine == null && additionLine == null) {\n const errorMessage =\n 'DiffHunksRenderer.processDiffResult: deletionLine and additionLine are null, something is wrong';\n console.error(errorMessage, { file: fileDiff.name });\n throw new Error(errorMessage);\n }\n\n const missingSide =\n deletionLine == null\n ? 'deletions'\n : additionLine == null\n ? 'additions'\n : undefined;\n if (missingSide != null) {\n if (\n pendingSplitMissing != null &&\n pendingSplitMissing !== missingSide\n ) {\n // NOTE(amadeus): If we see this error, we might need to bring back: flushSplitSpan();\n throw new Error(\n 'DiffHunksRenderer.processDiffResult: iterateOverDiff, invalid pending splits'\n );\n }\n pendingSplitMissing = missingSide;\n pendingSplitSpanSize++;\n }\n\n const annotationSpans = this.getAnnotations(\n 'split',\n deletionLineNumber,\n additionLineNumber,\n hunkIndex,\n lineIndex\n );\n if (annotationSpans != null && pendingSplitSpanSize > 0) {\n flushSplitSpan();\n }\n pushLineWithAnnotation({\n additionLine,\n deletionLine,\n deletionsAST,\n additionsAST,\n ...annotationSpans,\n });\n }\n\n if (noEOFCRDeletion || noEOFCRAddition) {\n const noEOFType =\n type === 'context' || type === 'context-expanded'\n ? 'context'\n : deletionLineIndex != null\n ? 'change-deletion'\n : 'change-addition';\n if (noEOFCRDeletion) {\n if (diffStyle === 'unified') {\n unifiedAST?.push(createNoNewlineElement(noEOFType));\n } else {\n deletionsAST?.push(createNoNewlineElement('change-deletion'));\n if (!noEOFCRAddition) {\n additionsAST?.push(createEmptyRowBuffer(1));\n }\n }\n }\n if (noEOFCRAddition) {\n if (diffStyle === 'unified') {\n unifiedAST?.push(createNoNewlineElement('change-addition'));\n } else {\n additionsAST?.push(createNoNewlineElement('change-addition'));\n if (!noEOFCRDeletion) {\n deletionsAST?.push(createEmptyRowBuffer(1));\n }\n }\n }\n }\n\n if (collapsedAfter > 0) {\n pushSeparators({\n hunkIndex: type === 'context-expanded' ? hunkIndex : hunkIndex + 1,\n collapsedLines: collapsedAfter,\n rangeSize: trailingRangeSize,\n hunkSpecs: undefined,\n isFirstHunk: false,\n isLastHunk: true,\n isExpandable: !fileDiff.isPartial,\n });\n }\n },\n });\n\n if (diffStyle === 'split') {\n flushSplitSpan();\n }\n\n const totalLines = Math.max(\n getTotalLineCountFromHunks(fileDiff.hunks),\n fileDiff.additionLines.length ?? 0,\n fileDiff.deletionLines.length ?? 0\n );\n\n // Some specialized logic to set our AST lists to be undefinable under\n // certain conditions\n // * If the type of change is a full addition or a full deletion, we don't\n // want to show a split view as that creates wasted space\n // * We'll do some further refinement below if necessary with list length,\n // but first we need to inject buffers if we are virtualized before we can\n // do the length check\n additionsAST =\n !unified && fileDiff.type !== 'deleted' ? additionsAST : undefined;\n deletionsAST =\n !unified && fileDiff.type !== 'new' ? deletionsAST : undefined;\n unifiedAST = unified ? unifiedAST : undefined;\n\n if (!disableVirtualizationBuffers) {\n if (renderRange.bufferBefore > 0) {\n const element = createBufferElement('before', renderRange.bufferBefore);\n unifiedAST?.unshift(element);\n deletionsAST?.unshift(element);\n additionsAST?.unshift(element);\n }\n if (renderRange.bufferAfter > 0) {\n const element = createBufferElement('after', renderRange.bufferAfter);\n unifiedAST?.push(element);\n deletionsAST?.push(element);\n additionsAST?.push(element);\n }\n }\n\n // If any of our arrays are empty, lets null them out to optimize rendering\n if (unifiedAST?.length === 0) {\n unifiedAST = undefined;\n }\n if (deletionsAST?.length === 0) {\n deletionsAST = undefined;\n }\n if (additionsAST?.length === 0) {\n additionsAST = undefined;\n }\n\n const preNode = this.createPreElement(\n deletionsAST != null && additionsAST != null,\n totalLines,\n themeStyles,\n baseThemeType\n );\n\n return {\n additionsAST,\n deletionsAST,\n unifiedAST,\n hunkData,\n preNode,\n themeStyles,\n baseThemeType,\n headerElement: !disableFileHeader\n ? this.renderHeader(this.diff, themeStyles, baseThemeType)\n : undefined,\n totalLines,\n // FIXME\n css: '',\n };\n }\n\n renderFullAST(\n result: HunksRenderResult,\n children: ElementContent[] = []\n ): HASTElement {\n if (result.unifiedAST != null) {\n children.push(\n createHastElement({\n tagName: 'code',\n children: result.unifiedAST,\n properties: {\n 'data-code': '',\n 'data-unified': '',\n },\n })\n );\n }\n if (result.deletionsAST != null) {\n children.push(\n createHastElement({\n tagName: 'code',\n children: result.deletionsAST,\n properties: {\n 'data-code': '',\n 'data-deletions': '',\n },\n })\n );\n }\n if (result.additionsAST != null) {\n children.push(\n createHastElement({\n tagName: 'code',\n children: result.additionsAST,\n properties: {\n 'data-code': '',\n 'data-additions': '',\n },\n })\n );\n }\n return { ...result.preNode, children };\n }\n\n renderFullHTML(\n result: HunksRenderResult,\n tempChildren: ElementContent[] = []\n ): string {\n return toHtml(this.renderFullAST(result, tempChildren));\n }\n\n renderPartialHTML(\n children: ElementContent[],\n columnType?: 'unified' | 'deletions' | 'additions'\n ): string {\n if (columnType == null) {\n return toHtml(children);\n }\n return toHtml(\n createHastElement({\n tagName: 'code',\n children,\n properties: {\n 'data-code': '',\n [`data-${columnType}`]: '',\n },\n })\n );\n }\n\n private getAnnotations(\n type: 'unified',\n deletionLineNumber: number | undefined,\n additionLineNumber: number | undefined,\n hunkIndex: number,\n lineIndex: number\n ): AnnotationSpan | undefined;\n private getAnnotations(\n type: 'split',\n deletionLineNumber: number | undefined,\n additionLineNumber: number | undefined,\n hunkIndex: number,\n lineIndex: number\n ): { deletionSpan: AnnotationSpan; additionSpan: AnnotationSpan } | undefined;\n private getAnnotations(\n type: 'unified' | 'split',\n deletionLineNumber: number | undefined,\n additionLineNumber: number | undefined,\n hunkIndex: number,\n lineIndex: number\n ):\n | AnnotationSpan\n | { deletionSpan: AnnotationSpan; additionSpan: AnnotationSpan }\n | undefined {\n const deletionSpan: AnnotationSpan = {\n type: 'annotation',\n hunkIndex,\n lineIndex,\n annotations: [],\n };\n if (deletionLineNumber != null) {\n for (const anno of this.deletionAnnotations[deletionLineNumber] ?? []) {\n deletionSpan.annotations.push(getLineAnnotationName(anno));\n }\n }\n const additionSpan: AnnotationSpan = {\n type: 'annotation',\n hunkIndex,\n lineIndex,\n annotations: [],\n };\n if (additionLineNumber != null) {\n for (const anno of this.additionAnnotations[additionLineNumber] ?? []) {\n (type === 'unified' ? deletionSpan : additionSpan).annotations.push(\n getLineAnnotationName(anno)\n );\n }\n }\n if (type === 'unified') {\n if (deletionSpan.annotations.length > 0) {\n return deletionSpan;\n }\n return undefined;\n }\n if (\n additionSpan.annotations.length === 0 &&\n deletionSpan.annotations.length === 0\n ) {\n return undefined;\n }\n return { deletionSpan, additionSpan };\n }\n\n private renderHeader(\n diff: FileDiffMetadata,\n themeStyles: string,\n baseThemeType: 'light' | 'dark' | undefined\n ): HASTElement {\n const { themeType } = this.getOptionsWithDefaults();\n return createFileHeaderElement({\n fileOrDiff: diff,\n themeStyles,\n themeType: baseThemeType ?? themeType,\n });\n }\n}\n\nfunction areRenderOptionsEqual(\n optionsA: RenderDiffOptions,\n optionsB: RenderDiffOptions\n): boolean {\n return (\n areThemesEqual(optionsA.theme, optionsB.theme) &&\n optionsA.tokenizeMaxLineLength === optionsB.tokenizeMaxLineLength &&\n optionsA.lineDiffType === optionsB.lineDiffType\n );\n}\n\nfunction getModifiedLinesString(lines: number) {\n return `${lines} unmodified line${lines > 1 ? 's' : ''}`;\n}\n\nfunction pushLineWithAnnotation({\n deletionLine,\n additionLine,\n unifiedAST,\n additionsAST,\n deletionsAST,\n unifiedSpan,\n deletionSpan,\n additionSpan,\n}: PushLineWithAnnotation) {\n if (unifiedAST != null) {\n if (deletionLine != null) {\n unifiedAST.push(deletionLine);\n } else if (additionLine != null) {\n unifiedAST.push(additionLine);\n }\n if (unifiedSpan != null) {\n unifiedAST.push(createAnnotationElement(unifiedSpan));\n }\n } else if (deletionsAST != null && additionsAST != null) {\n if (deletionLine != null) {\n deletionsAST.push(deletionLine);\n }\n if (additionLine != null) {\n additionsAST.push(additionLine);\n }\n if (deletionSpan != null) {\n deletionsAST.push(createAnnotationElement(deletionSpan));\n }\n if (additionSpan != null) {\n additionsAST.push(createAnnotationElement(additionSpan));\n }\n }\n}\n\nfunction pushSeparator(\n type: 'additions' | 'deletions' | 'unified',\n {\n hunkIndex,\n collapsedLines,\n rangeSize,\n hunkSpecs,\n isFirstHunk,\n isLastHunk,\n isExpandable,\n }: PushSeparatorProps,\n {\n expansionLineCount,\n hunkSeparators,\n unifiedAST,\n deletionsAST,\n additionsAST,\n hunkData,\n }: PushSeparatorContext\n) {\n if (collapsedLines <= 0) {\n return;\n }\n const linesAST =\n type === 'unified'\n ? unifiedAST\n : type === 'deletions'\n ? deletionsAST\n : additionsAST;\n\n if (hunkSeparators === 'metadata') {\n if (hunkSpecs != null) {\n linesAST.push(\n createSeparator({\n type: 'metadata',\n content: hunkSpecs,\n isFirstHunk,\n isLastHunk,\n })\n );\n }\n return;\n }\n if (hunkSeparators === 'simple') {\n if (hunkIndex > 0) {\n linesAST.push(\n createSeparator({ type: 'simple', isFirstHunk, isLastHunk: false })\n );\n }\n return;\n }\n const slotName = getHunkSeparatorSlotName(type, hunkIndex);\n const chunked = rangeSize > expansionLineCount;\n const expandIndex = isExpandable ? hunkIndex : undefined;\n linesAST.push(\n createSeparator({\n type: hunkSeparators,\n content: getModifiedLinesString(collapsedLines),\n expandIndex,\n chunked,\n slotName,\n isFirstHunk,\n isLastHunk,\n })\n );\n hunkData.push({\n slotName,\n hunkIndex,\n lines: collapsedLines,\n type,\n expandable: isExpandable\n ? { up: !isFirstHunk, down: !isLastHunk, chunked }\n : undefined,\n });\n}\n"],"mappings":"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"}