@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
@@ -19,6 +19,12 @@ interface FileHyrdateProps<LAnnotation> extends Omit<FileRenderProps<LAnnotation
19
19
  interface FileOptions<LAnnotation> extends BaseCodeOptions, MouseEventManagerBaseOptions<"file">, LineSelectionOptions {
20
20
  disableFileHeader?: boolean;
21
21
  renderCustomMetadata?: RenderFileMetadata;
22
+ /**
23
+ * When true, errors during rendering are rethrown instead of being caught
24
+ * and displayed in the DOM. Useful for testing or when you want to handle
25
+ * errors yourself.
26
+ */
27
+ disableErrorHandling?: boolean;
22
28
  renderAnnotation?(annotation: LineAnnotation<LAnnotation>): HTMLElement | undefined;
23
29
  renderHoverUtility?(getHoveredRow: () => GetHoveredLineResult<"file"> | undefined): HTMLElement | null;
24
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"File.d.ts","names":["options: FileOptions<LAnnotation>","workerManager?: WorkerPoolManager | undefined"],"sources":["../../src/components/File.ts"],"sourcesContent":[],"mappings":";;;;;;;UA8CiB;QACT;kBACU;EAFlB,gBAAiB,CAAA,EAGI,WAHJ;EACT,WAAA,CAAA,EAAA,OAAA;EACU,eAAA,CAAA,EAGE,cAHF,CAGiB,WAHjB,CAAA,EAAA;;AAGiB,UAGlB,gBAHkB,CAAA,WAAA,CAAA,SAIzB,IAJyB,CAIpB,eAJoB,CAIJ,WAJI,CAAA,EAAA,eAAA,CAAA,CAAA;EAAf,aAAA,EAKH,WALG;EAAA,eAAA,CAAA,EAAA,MAAA;AAGpB;AAC+B,UAKd,WALc,CAAA,WAAA,CAAA,SAMrB,eANqB,EAO3B,4BAP2B,CAAA,MAAA,CAAA,EAQ3B,oBAR2B,CAAA;EAAhB,iBAAA,CAAA,EAAA,OAAA;EACE,oBAAA,CAAA,EASQ,kBATR;EADP,gBAAA,EAAA,UAAA,EAYM,cAZN,CAYqB,WAZrB,CAAA,CAAA,EAaL,WAbK,GAAA,SAAA;EAAA,kBAAA,EAAA,aAAA,EAAA,GAAA,GAee,oBAff,CAAA,MAAA,CAAA,GAAA,SAAA,CAAA,EAgBL,WAhBK,GAAA,IAAA;AAKV;AAKyB,cAgBZ,IAhBY,CAAA,cAAA,SAAA,CAAA,CAAA;EAEM,OAAA,EA4CX,WA5CW,CA4CC,WA5CD,CAAA;EAAf,QAAA,aAAA;EACX,QAAA,kBAAA;EAEoB,OAAA,qBAAA,EAAA,OAAA;EACpB,SAAA,IAAA,EAAA,MAAA;EAVK,QAAA,aAAA;EACN,QAAA,SAAA;EACA,QAAA,GAAA;EAAA,QAAA,IAAA;EAkBJ,QAAa,cAAA;EA8BmB,QAAA,YAAA;EAAZ,QAAA,YAAA;EAAY,QAAA,sBAAA;EAAZ,QAAA,oBAAA;EACQ,QAAA,aAAA;EA4BM,QAAA,cAAA;EAAZ,QAAA,YAAA;EAWI,QAAA,aAAA;EA8BH,QAAA,iBAAA;EAI8B,QAAA,oBAAA;EAAf,QAAA,eAAA;EAIZ,QAAA,eAAA;EA+BQ,QAAA,IAAA;EAAjB,WAAA,CAAA,OAAA,CAAA,EA7GG,WA6GH,CA7Ge,WA6Gf,CAAA,EAAA,aAAA,CAAA,EA5GW,iBA4GX,GAAA,SAAA,EAAA,kBAAA,CAAA,EAAA,OAAA;EAwDb,QAAA,qBAAA;EACA,QAAA,CAAA,CAAA,EAAA,IAAA;EACA,UAAA,CAAA,OAAA,EA1IkB,WA0IlB,CA1I8B,WA0I9B,CAAA,GAAA,SAAA,CAAA,EAAA,IAAA;EACA,QAAA,YAAA;EACA,YAAA,CAAA,SAAA,EAjIsB,UAiItB,CAAA,EAAA,IAAA;EACiB,cAAA,EAAA,GAAA,GApGE,oBAoGF,CAAA,MAAA,CAAA,GAAA,SAAA;EAAhB,kBAAA,CAAA,eAAA,EAhGiC,cAgGjC,CAhGgD,WAgGhD,CAAA,EAAA,CAAA,EAAA,IAAA;EAAA,gBAAA,CAAA,KAAA,EA5FqB,iBA4FrB,GAAA,IAAA,CAAA,EAAA,IAAA;;iBA7DY,iBAAiB;;;;;;;KA6D7B,gBAAgB"}
1
+ {"version":3,"file":"File.d.ts","names":["options: FileOptions<LAnnotation>","workerManager?: WorkerPoolManager | undefined"],"sources":["../../src/components/File.ts"],"sourcesContent":[],"mappings":";;;;;;;UA8CiB;QACT;kBACU;EAFlB,gBAAiB,CAAA,EAGI,WAHJ;EACT,WAAA,CAAA,EAAA,OAAA;EACU,eAAA,CAAA,EAGE,cAHF,CAGiB,WAHjB,CAAA,EAAA;;AAGiB,UAGlB,gBAHkB,CAAA,WAAA,CAAA,SAIzB,IAJyB,CAIpB,eAJoB,CAIJ,WAJI,CAAA,EAAA,eAAA,CAAA,CAAA;EAAf,aAAA,EAKH,WALG;EAAA,eAAA,CAAA,EAAA,MAAA;AAGpB;AAC+B,UAKd,WALc,CAAA,WAAA,CAAA,SAMrB,eANqB,EAO3B,4BAP2B,CAAA,MAAA,CAAA,EAQ3B,oBAR2B,CAAA;EAAhB,iBAAA,CAAA,EAAA,OAAA;EACE,oBAAA,CAAA,EASQ,kBATR;EADP;;AAKV;;;EAagB,oBAAA,CAAA,EAAA,OAAA;EACX,gBAAA,EAAA,UAAA,EADW,cACX,CAD0B,WAC1B,CAAA,CAAA,EAAA,WAAA,GAAA,SAAA;EAEoB,kBAAA,EAAA,aAAA,EAAA,GAAA,GAAA,oBAAA,CAAA,MAAA,CAAA,GAAA,SAAA,CAAA,EACpB,WADoB,GAAA,IAAA;;AAff,cA0BG,IA1BH,CAAA,cAAA,SAAA,CAAA,CAAA;EACN,OAAA,EAuDgB,WAvDhB,CAuD4B,WAvD5B,CAAA;EACA,QAAA,aAAA;EAAA,QAAA,kBAAA;EAwBJ,OAAa,qBAAA,EAAA,OAAA;EA8BmB,SAAA,IAAA,EAAA,MAAA;EAAZ,QAAA,aAAA;EAAY,QAAA,SAAA;EAAZ,QAAA,GAAA;EACQ,QAAA,IAAA;EA4BM,QAAA,cAAA;EAAZ,QAAA,YAAA;EAWI,QAAA,YAAA;EA8BH,QAAA,sBAAA;EAI8B,QAAA,oBAAA;EAAf,QAAA,aAAA;EAIZ,QAAA,cAAA;EA+BQ,QAAA,YAAA;EAAjB,QAAA,aAAA;EAwDb,QAAA,iBAAA;EACA,QAAA,oBAAA;EACA,QAAA,eAAA;EACA,QAAA,eAAA;EACA,QAAA,IAAA;EACiB,WAAA,CAAA,OAAA,CAAA,EA1KD,WA0KC,CA1KW,WA0KX,CAAA,EAAA,aAAA,CAAA,EAzKO,iBAyKP,GAAA,SAAA,EAAA,kBAAA,CAAA,EAAA,OAAA;EAAhB,QAAA,qBAAA;EAAA,QAAA,CAAA,CAAA,EAAA,IAAA;sBA7IiB,YAAY;;0BAWR;wBA8BH;sCAIe,eAAe;0BAI3B;;iBA+BT,iBAAiB;;;;;;;KA6D7B,gBAAgB"}
@@ -163,7 +163,7 @@ var File = class {
163
163
  this.fileRenderer.setOptions(this.options);
164
164
  if (lineAnnotations != null) this.setLineAnnotations(lineAnnotations);
165
165
  this.fileRenderer.setLineAnnotations(this.lineAnnotations);
166
- const { disableFileHeader = false } = this.options;
166
+ const { disableFileHeader = false, disableErrorHandling = false } = this.options;
167
167
  if (disableFileHeader) {
168
168
  if (this.headerElement != null) {
169
169
  this.headerElement.parentNode?.removeChild(this.headerElement);
@@ -184,10 +184,9 @@ var File = class {
184
184
  this.renderAnnotations();
185
185
  this.renderHoverUtility();
186
186
  } catch (error) {
187
- if (error instanceof Error) {
188
- console.error(error);
189
- this.applyErrorToDOM(error, fileContainer);
190
- }
187
+ if (disableErrorHandling) throw error;
188
+ console.error(error);
189
+ if (error instanceof Error) this.applyErrorToDOM(error, fileContainer);
191
190
  }
192
191
  }
193
192
  renderAnnotations() {
@@ -1 +1 @@
1
- {"version":3,"file":"File.js","names":["options: FileOptions<LAnnotation>","workerManager?: WorkerPoolManager | undefined","error: unknown","preProperties: PrePropertiesConfig"],"sources":["../../src/components/File.ts"],"sourcesContent":["import type { Element as HASTElement } from 'hast';\nimport { toHtml } from 'hast-util-to-html';\n\nimport {\n DEFAULT_THEMES,\n DIFFS_TAG_NAME,\n HEADER_METADATA_SLOT_ID,\n UNSAFE_CSS_ATTRIBUTE,\n} from '../constants';\nimport {\n LineSelectionManager,\n type LineSelectionOptions,\n type SelectedLineRange,\n pluckLineSelectionOptions,\n} from '../managers/LineSelectionManager';\nimport {\n type GetHoveredLineResult,\n MouseEventManager,\n type MouseEventManagerBaseOptions,\n pluckMouseEventOptions,\n} from '../managers/MouseEventManager';\nimport { ResizeManager } from '../managers/ResizeManager';\nimport { type FileRenderResult, FileRenderer } from '../renderers/FileRenderer';\nimport { SVGSpriteSheet } from '../sprite';\nimport type {\n BaseCodeOptions,\n FileContents,\n LineAnnotation,\n PrePropertiesConfig,\n RenderFileMetadata,\n ThemeTypes,\n} from '../types';\nimport { areFilesEqual } from '../utils/areFilesEqual';\nimport { areLineAnnotationsEqual } from '../utils/areLineAnnotationsEqual';\nimport { arePrePropertiesEqual } from '../utils/arePrePropertiesEqual';\nimport { createAnnotationWrapperNode } from '../utils/createAnnotationWrapperNode';\nimport { createHoverContentNode } from '../utils/createHoverContentNode';\nimport { createUnsafeCSSStyleNode } from '../utils/createUnsafeCSSStyleNode';\nimport { wrapUnsafeCSS } from '../utils/cssWrappers';\nimport { getLineAnnotationName } from '../utils/getLineAnnotationName';\nimport { getOrCreateCodeNode } from '../utils/getOrCreateCodeNode';\nimport { prerenderHTMLIfNecessary } from '../utils/prerenderHTMLIfNecessary';\nimport { setPreNodeProperties } from '../utils/setWrapperNodeProps';\nimport type { WorkerPoolManager } from '../worker';\nimport { DiffsContainerLoaded } from './web-components';\n\nexport interface FileRenderProps<LAnnotation> {\n file: FileContents;\n fileContainer?: HTMLElement;\n containerWrapper?: HTMLElement;\n forceRender?: boolean;\n lineAnnotations?: LineAnnotation<LAnnotation>[];\n}\n\nexport interface FileHyrdateProps<LAnnotation>\n extends Omit<FileRenderProps<LAnnotation>, 'fileContainer'> {\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\n\nexport interface FileOptions<LAnnotation>\n extends BaseCodeOptions,\n MouseEventManagerBaseOptions<'file'>,\n LineSelectionOptions {\n disableFileHeader?: boolean;\n renderCustomMetadata?: RenderFileMetadata;\n renderAnnotation?(\n annotation: LineAnnotation<LAnnotation>\n ): HTMLElement | undefined;\n renderHoverUtility?(\n getHoveredRow: () => GetHoveredLineResult<'file'> | undefined\n ): HTMLElement | null;\n}\n\ninterface AnnotationElementCache<LAnnotation> {\n element: HTMLElement;\n annotation: LineAnnotation<LAnnotation>;\n}\n\nlet instanceId = -1;\n\nexport class File<LAnnotation = undefined> {\n static LoadedCustomComponent: boolean = DiffsContainerLoaded;\n\n readonly __id: string = `file:${++instanceId}`;\n\n private fileContainer: HTMLElement | undefined;\n private spriteSVG: SVGElement | undefined;\n private pre: HTMLPreElement | undefined;\n private code: HTMLElement | undefined;\n private unsafeCSSStyle: HTMLStyleElement | undefined;\n private hoverContent: HTMLElement | undefined;\n private errorWrapper: HTMLElement | undefined;\n private lastRenderedHeaderHTML: string | undefined;\n private appliedPreAttributes: PrePropertiesConfig | undefined;\n\n private headerElement: HTMLElement | undefined;\n private headerMetadata: HTMLElement | undefined;\n\n private fileRenderer: FileRenderer<LAnnotation>;\n private resizeManager: ResizeManager;\n private mouseEventManager: MouseEventManager<'file'>;\n private lineSelectionManager: LineSelectionManager;\n\n private annotationCache: Map<string, AnnotationElementCache<LAnnotation>> =\n new Map();\n private lineAnnotations: LineAnnotation<LAnnotation>[] = [];\n\n private file: FileContents | undefined;\n\n constructor(\n public options: FileOptions<LAnnotation> = { theme: DEFAULT_THEMES },\n private workerManager?: WorkerPoolManager | undefined,\n private isContainerManaged = false\n ) {\n this.fileRenderer = new FileRenderer<LAnnotation>(\n options,\n this.handleHighlightRender,\n this.workerManager\n );\n this.resizeManager = new ResizeManager();\n this.mouseEventManager = new MouseEventManager(\n 'file',\n pluckMouseEventOptions(options)\n );\n this.lineSelectionManager = new LineSelectionManager(\n pluckLineSelectionOptions(options)\n );\n this.workerManager?.subscribeToThemeChanges(this);\n }\n\n private handleHighlightRender = (): void => {\n this.rerender();\n };\n\n rerender(): void {\n if (this.file == null) return;\n this.render({ file: this.file, forceRender: true });\n }\n\n setOptions(options: FileOptions<LAnnotation> | undefined): void {\n if (options == null) return;\n this.options = options;\n this.mouseEventManager.setOptions(pluckMouseEventOptions(options));\n this.lineSelectionManager.setOptions(pluckLineSelectionOptions(options));\n }\n\n private mergeOptions(options: Partial<FileOptions<LAnnotation>>): void {\n this.options = { ...this.options, ...options };\n }\n\n setThemeType(themeType: ThemeTypes): void {\n const currentThemeType = this.options.themeType ?? 'system';\n if (currentThemeType === themeType) {\n return;\n }\n this.mergeOptions({ themeType });\n this.fileRenderer.setThemeType(themeType);\n\n if (this.headerElement != null) {\n if (themeType === 'system') {\n delete this.headerElement.dataset.themeType;\n } else {\n this.headerElement.dataset.themeType = themeType;\n }\n }\n\n // Update pre element theme mode\n if (this.pre != null) {\n switch (themeType) {\n case 'system':\n delete this.pre.dataset.themeType;\n break;\n case 'light':\n case 'dark':\n this.pre.dataset.themeType = themeType;\n break;\n }\n }\n }\n\n getHoveredLine = (): GetHoveredLineResult<'file'> | undefined => {\n return this.mouseEventManager.getHoveredLine();\n };\n\n setLineAnnotations(lineAnnotations: LineAnnotation<LAnnotation>[]): void {\n this.lineAnnotations = lineAnnotations;\n }\n\n setSelectedLines(range: SelectedLineRange | null): void {\n this.lineSelectionManager.setSelection(range);\n }\n\n cleanUp(): void {\n this.fileRenderer.cleanUp();\n this.resizeManager.cleanUp();\n this.mouseEventManager.cleanUp();\n this.lineSelectionManager.cleanUp();\n this.workerManager?.unsubscribeToThemeChanges(this);\n this.workerManager = undefined;\n\n // Clean up the data\n this.file = undefined;\n\n // Clean up the elements\n if (!this.isContainerManaged) {\n this.fileContainer?.parentNode?.removeChild(this.fileContainer);\n }\n if (this.fileContainer?.shadowRoot != null) {\n this.fileContainer.shadowRoot.innerHTML = '';\n }\n this.fileContainer = undefined;\n this.pre = undefined;\n this.appliedPreAttributes = undefined;\n this.headerElement = undefined;\n this.lastRenderedHeaderHTML = undefined;\n this.errorWrapper = undefined;\n this.unsafeCSSStyle = undefined;\n }\n\n hydrate(props: FileHyrdateProps<LAnnotation>): void {\n const { fileContainer, prerenderedHTML } = props;\n prerenderHTMLIfNecessary(fileContainer, prerenderedHTML);\n for (const element of Array.from(\n fileContainer.shadowRoot?.children ?? []\n )) {\n if (element instanceof SVGElement) {\n this.spriteSVG = element;\n continue;\n }\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (element instanceof HTMLPreElement) {\n this.pre = element;\n this.appliedPreAttributes = undefined;\n continue;\n }\n if (\n element instanceof HTMLStyleElement &&\n element.hasAttribute(UNSAFE_CSS_ATTRIBUTE)\n ) {\n this.unsafeCSSStyle = element;\n continue;\n }\n if ('diffsHeader' in element.dataset) {\n this.headerElement = element;\n this.lastRenderedHeaderHTML = undefined;\n continue;\n }\n }\n // If we have no pre tag, then we should render\n if (this.pre == null) {\n this.render(props);\n }\n // Otherwise orchestrate our setup\n else {\n const { file, lineAnnotations } = props;\n this.fileContainer = fileContainer;\n delete this.pre.dataset.dehydrated;\n\n this.lineAnnotations = lineAnnotations ?? this.lineAnnotations;\n this.file = file;\n this.fileRenderer.hydrate(file);\n this.renderAnnotations();\n this.renderHoverUtility();\n this.injectUnsafeCSS();\n this.mouseEventManager.setup(this.pre);\n this.lineSelectionManager.setup(this.pre);\n if ((this.options.overflow ?? 'scroll') === 'scroll') {\n this.resizeManager.setup(this.pre);\n }\n }\n }\n\n render({\n file,\n fileContainer,\n forceRender = false,\n containerWrapper,\n lineAnnotations,\n }: FileRenderProps<LAnnotation>): void {\n const annotationsChanged =\n lineAnnotations != null &&\n (lineAnnotations.length > 0 || this.lineAnnotations.length > 0)\n ? lineAnnotations !== this.lineAnnotations\n : false;\n if (!forceRender && areFilesEqual(this.file, file) && !annotationsChanged) {\n return;\n }\n\n this.file = file;\n this.fileRenderer.setOptions(this.options);\n if (lineAnnotations != null) {\n this.setLineAnnotations(lineAnnotations);\n }\n this.fileRenderer.setLineAnnotations(this.lineAnnotations);\n\n const { disableFileHeader = false } = this.options;\n if (disableFileHeader) {\n // Remove existing header from DOM\n if (this.headerElement != null) {\n this.headerElement.parentNode?.removeChild(this.headerElement);\n this.headerElement = undefined;\n this.lastRenderedHeaderHTML = undefined;\n }\n }\n\n fileContainer = this.getOrCreateFileContainerNode(\n fileContainer,\n containerWrapper\n );\n\n try {\n const fileResult = this.fileRenderer.renderFile(file);\n if (fileResult == null) {\n if (this.workerManager != null && !this.workerManager.isInitialized()) {\n void this.workerManager.initialize().then(() => this.rerender());\n }\n return;\n }\n if (fileResult.headerAST != null) {\n this.applyHeaderToDOM(fileResult.headerAST, fileContainer);\n }\n const pre = this.getOrCreatePreNode(fileContainer);\n this.applyHunksToDOM(fileResult, pre);\n this.renderAnnotations();\n this.renderHoverUtility();\n } catch (error: unknown) {\n if (error instanceof Error) {\n console.error(error);\n this.applyErrorToDOM(error, fileContainer);\n }\n }\n }\n\n private renderAnnotations(): void {\n if (this.isContainerManaged || this.fileContainer == null) {\n for (const { element } of this.annotationCache.values()) {\n element.parentNode?.removeChild(element);\n }\n this.annotationCache.clear();\n return;\n }\n const staleAnnotations = new Map(this.annotationCache);\n const { renderAnnotation } = this.options;\n if (renderAnnotation != null && this.lineAnnotations.length > 0) {\n for (const [index, annotation] of this.lineAnnotations.entries()) {\n const id = `${index}-${getLineAnnotationName(annotation)}`;\n let cache = this.annotationCache.get(id);\n if (\n cache == null ||\n !areLineAnnotationsEqual(annotation, cache.annotation)\n ) {\n cache?.element.parentElement?.removeChild(cache.element);\n const content = renderAnnotation(annotation);\n // If we can't render anything, then we should not render anything\n // and clear the annotation cache if necessary.\n if (content == null) {\n continue;\n }\n cache = {\n element: createAnnotationWrapperNode(\n getLineAnnotationName(annotation)\n ),\n annotation,\n };\n cache.element.appendChild(content);\n this.fileContainer.appendChild(cache.element);\n this.annotationCache.set(id, cache);\n }\n staleAnnotations.delete(id);\n }\n }\n for (const [id, { element }] of staleAnnotations.entries()) {\n this.annotationCache.delete(id);\n element.parentNode?.removeChild(element);\n }\n }\n\n private renderHoverUtility() {\n const { renderHoverUtility } = this.options;\n if (this.fileContainer == null || renderHoverUtility == null) {\n return;\n }\n const element = renderHoverUtility(this.mouseEventManager.getHoveredLine);\n if (element != null && this.hoverContent != null) {\n return;\n } else if (element == null) {\n this.hoverContent?.parentNode?.removeChild(this.hoverContent);\n this.hoverContent = undefined;\n return;\n }\n this.hoverContent = createHoverContentNode();\n this.hoverContent.appendChild(element);\n this.fileContainer.appendChild(this.hoverContent);\n }\n\n private injectUnsafeCSS(): void {\n if (this.fileContainer?.shadowRoot == null) {\n return;\n }\n const { unsafeCSS } = this.options;\n\n if (unsafeCSS == null || unsafeCSS === '') {\n if (this.unsafeCSSStyle != null) {\n this.unsafeCSSStyle.parentNode?.removeChild(this.unsafeCSSStyle);\n this.unsafeCSSStyle = undefined;\n }\n return;\n }\n\n // Create or update the style element\n if (this.unsafeCSSStyle == null) {\n this.unsafeCSSStyle = createUnsafeCSSStyleNode();\n this.fileContainer.shadowRoot.appendChild(this.unsafeCSSStyle);\n }\n // Wrap in @layer unsafe to match SSR behavior\n this.unsafeCSSStyle.innerText = wrapUnsafeCSS(unsafeCSS);\n }\n\n private applyHunksToDOM(result: FileRenderResult, pre: HTMLPreElement): void {\n this.cleanupErrorWrapper();\n this.applyPreNodeAttributes(pre, result);\n // Create code elements and insert HTML content\n this.code = getOrCreateCodeNode({ code: this.code });\n this.code.innerHTML = this.fileRenderer.renderPartialHTML(result.codeAST);\n pre.replaceChildren(this.code);\n this.injectUnsafeCSS();\n this.mouseEventManager.setup(pre);\n this.lineSelectionManager.setup(pre);\n this.lineSelectionManager.setDirty();\n if ((this.options.overflow ?? 'scroll') === 'scroll') {\n this.resizeManager.setup(pre);\n } else {\n this.resizeManager.cleanUp();\n }\n }\n\n private applyHeaderToDOM(\n headerAST: HASTElement,\n container: HTMLElement\n ): void {\n const { file } = this;\n if (file == null) return;\n this.cleanupErrorWrapper();\n const headerHTML = toHtml(headerAST);\n if (headerHTML !== this.lastRenderedHeaderHTML) {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = headerHTML;\n const newHeader = tempDiv.firstElementChild;\n if (!(newHeader instanceof HTMLElement)) {\n return;\n }\n if (this.headerElement != null) {\n container.shadowRoot?.replaceChild(newHeader, this.headerElement);\n } else {\n container.shadowRoot?.prepend(newHeader);\n }\n this.headerElement = newHeader;\n this.lastRenderedHeaderHTML = headerHTML;\n }\n\n if (this.isContainerManaged) return;\n\n const { renderCustomMetadata } = this.options;\n if (this.headerMetadata != null) {\n this.headerMetadata.parentNode?.removeChild(this.headerMetadata);\n }\n const content = renderCustomMetadata?.(file) ?? undefined;\n if (content != null) {\n this.headerMetadata = document.createElement('div');\n this.headerMetadata.slot = HEADER_METADATA_SLOT_ID;\n if (content instanceof Element) {\n this.headerMetadata.appendChild(content);\n } else {\n this.headerMetadata.innerText = `${content}`;\n }\n container.appendChild(this.headerMetadata);\n }\n }\n\n private getOrCreateFileContainerNode(\n fileContainer?: HTMLElement,\n parentNode?: HTMLElement\n ): HTMLElement {\n const previousContainer = this.fileContainer;\n this.fileContainer =\n fileContainer ??\n this.fileContainer ??\n document.createElement(DIFFS_TAG_NAME);\n if (previousContainer != null && previousContainer !== this.fileContainer) {\n this.lastRenderedHeaderHTML = undefined;\n this.headerElement = undefined;\n }\n if (parentNode != null && this.fileContainer.parentNode !== parentNode) {\n parentNode.appendChild(this.fileContainer);\n }\n if (this.spriteSVG == null) {\n const fragment = document.createElement('div');\n fragment.innerHTML = SVGSpriteSheet;\n const firstChild = fragment.firstChild;\n if (firstChild instanceof SVGElement) {\n this.spriteSVG = firstChild;\n this.fileContainer.shadowRoot?.appendChild(this.spriteSVG);\n }\n }\n return this.fileContainer;\n }\n\n private getOrCreatePreNode(container: HTMLElement): HTMLPreElement {\n // If we haven't created a pre element yet, lets go ahead and do that\n if (this.pre == null) {\n this.pre = document.createElement('pre');\n container.shadowRoot?.appendChild(this.pre);\n this.appliedPreAttributes = undefined;\n }\n // If we have a new parent container for the pre element, lets go ahead and\n // move it into the new container\n else if (this.pre.parentNode !== container) {\n container.shadowRoot?.appendChild(this.pre);\n this.appliedPreAttributes = undefined;\n }\n return this.pre;\n }\n\n private applyPreNodeAttributes(\n pre: HTMLPreElement,\n { totalLines, themeStyles, baseThemeType }: FileRenderResult\n ): void {\n const {\n overflow = 'scroll',\n themeType = 'system',\n disableLineNumbers = false,\n } = this.options;\n const preProperties: PrePropertiesConfig = {\n split: false,\n themeStyles,\n overflow,\n disableLineNumbers,\n themeType: baseThemeType ?? themeType,\n diffIndicators: 'none',\n disableBackground: true,\n totalLines,\n };\n if (arePrePropertiesEqual(preProperties, this.appliedPreAttributes)) {\n return;\n }\n setPreNodeProperties(pre, preProperties);\n this.appliedPreAttributes = preProperties;\n }\n\n private applyErrorToDOM(error: Error, container: HTMLElement) {\n this.cleanupErrorWrapper();\n const pre = this.getOrCreatePreNode(container);\n pre.innerHTML = '';\n pre.parentNode?.removeChild(pre);\n this.pre = undefined;\n this.appliedPreAttributes = undefined;\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n this.errorWrapper ??= document.createElement('div');\n this.errorWrapper.dataset.errorWrapper = '';\n this.errorWrapper.innerHTML = '';\n shadowRoot.appendChild(this.errorWrapper);\n const errorMessage = document.createElement('div');\n errorMessage.dataset.errorMessage = '';\n errorMessage.innerText = error.message;\n this.errorWrapper.appendChild(errorMessage);\n const errorStack = document.createElement('pre');\n errorStack.dataset.errorStack = '';\n errorStack.innerText = error.stack ?? 'No Error Stack';\n this.errorWrapper.appendChild(errorStack);\n }\n\n private cleanupErrorWrapper() {\n this.errorWrapper?.parentNode?.removeChild(this.errorWrapper);\n this.errorWrapper = undefined;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"File.js","names":["options: FileOptions<LAnnotation>","workerManager?: WorkerPoolManager | undefined","error: unknown","preProperties: PrePropertiesConfig"],"sources":["../../src/components/File.ts"],"sourcesContent":["import type { Element as HASTElement } from 'hast';\nimport { toHtml } from 'hast-util-to-html';\n\nimport {\n DEFAULT_THEMES,\n DIFFS_TAG_NAME,\n HEADER_METADATA_SLOT_ID,\n UNSAFE_CSS_ATTRIBUTE,\n} from '../constants';\nimport {\n LineSelectionManager,\n type LineSelectionOptions,\n type SelectedLineRange,\n pluckLineSelectionOptions,\n} from '../managers/LineSelectionManager';\nimport {\n type GetHoveredLineResult,\n MouseEventManager,\n type MouseEventManagerBaseOptions,\n pluckMouseEventOptions,\n} from '../managers/MouseEventManager';\nimport { ResizeManager } from '../managers/ResizeManager';\nimport { type FileRenderResult, FileRenderer } from '../renderers/FileRenderer';\nimport { SVGSpriteSheet } from '../sprite';\nimport type {\n BaseCodeOptions,\n FileContents,\n LineAnnotation,\n PrePropertiesConfig,\n RenderFileMetadata,\n ThemeTypes,\n} from '../types';\nimport { areFilesEqual } from '../utils/areFilesEqual';\nimport { areLineAnnotationsEqual } from '../utils/areLineAnnotationsEqual';\nimport { arePrePropertiesEqual } from '../utils/arePrePropertiesEqual';\nimport { createAnnotationWrapperNode } from '../utils/createAnnotationWrapperNode';\nimport { createHoverContentNode } from '../utils/createHoverContentNode';\nimport { createUnsafeCSSStyleNode } from '../utils/createUnsafeCSSStyleNode';\nimport { wrapUnsafeCSS } from '../utils/cssWrappers';\nimport { getLineAnnotationName } from '../utils/getLineAnnotationName';\nimport { getOrCreateCodeNode } from '../utils/getOrCreateCodeNode';\nimport { prerenderHTMLIfNecessary } from '../utils/prerenderHTMLIfNecessary';\nimport { setPreNodeProperties } from '../utils/setWrapperNodeProps';\nimport type { WorkerPoolManager } from '../worker';\nimport { DiffsContainerLoaded } from './web-components';\n\nexport interface FileRenderProps<LAnnotation> {\n file: FileContents;\n fileContainer?: HTMLElement;\n containerWrapper?: HTMLElement;\n forceRender?: boolean;\n lineAnnotations?: LineAnnotation<LAnnotation>[];\n}\n\nexport interface FileHyrdateProps<LAnnotation>\n extends Omit<FileRenderProps<LAnnotation>, 'fileContainer'> {\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\n\nexport interface FileOptions<LAnnotation>\n extends BaseCodeOptions,\n MouseEventManagerBaseOptions<'file'>,\n LineSelectionOptions {\n disableFileHeader?: boolean;\n renderCustomMetadata?: RenderFileMetadata;\n /**\n * When true, errors during rendering are rethrown instead of being caught\n * and displayed in the DOM. Useful for testing or when you want to handle\n * errors yourself.\n */\n disableErrorHandling?: boolean;\n renderAnnotation?(\n annotation: LineAnnotation<LAnnotation>\n ): HTMLElement | undefined;\n renderHoverUtility?(\n getHoveredRow: () => GetHoveredLineResult<'file'> | undefined\n ): HTMLElement | null;\n}\n\ninterface AnnotationElementCache<LAnnotation> {\n element: HTMLElement;\n annotation: LineAnnotation<LAnnotation>;\n}\n\nlet instanceId = -1;\n\nexport class File<LAnnotation = undefined> {\n static LoadedCustomComponent: boolean = DiffsContainerLoaded;\n\n readonly __id: string = `file:${++instanceId}`;\n\n private fileContainer: HTMLElement | undefined;\n private spriteSVG: SVGElement | undefined;\n private pre: HTMLPreElement | undefined;\n private code: HTMLElement | undefined;\n private unsafeCSSStyle: HTMLStyleElement | undefined;\n private hoverContent: HTMLElement | undefined;\n private errorWrapper: HTMLElement | undefined;\n private lastRenderedHeaderHTML: string | undefined;\n private appliedPreAttributes: PrePropertiesConfig | undefined;\n\n private headerElement: HTMLElement | undefined;\n private headerMetadata: HTMLElement | undefined;\n\n private fileRenderer: FileRenderer<LAnnotation>;\n private resizeManager: ResizeManager;\n private mouseEventManager: MouseEventManager<'file'>;\n private lineSelectionManager: LineSelectionManager;\n\n private annotationCache: Map<string, AnnotationElementCache<LAnnotation>> =\n new Map();\n private lineAnnotations: LineAnnotation<LAnnotation>[] = [];\n\n private file: FileContents | undefined;\n\n constructor(\n public options: FileOptions<LAnnotation> = { theme: DEFAULT_THEMES },\n private workerManager?: WorkerPoolManager | undefined,\n private isContainerManaged = false\n ) {\n this.fileRenderer = new FileRenderer<LAnnotation>(\n options,\n this.handleHighlightRender,\n this.workerManager\n );\n this.resizeManager = new ResizeManager();\n this.mouseEventManager = new MouseEventManager(\n 'file',\n pluckMouseEventOptions(options)\n );\n this.lineSelectionManager = new LineSelectionManager(\n pluckLineSelectionOptions(options)\n );\n this.workerManager?.subscribeToThemeChanges(this);\n }\n\n private handleHighlightRender = (): void => {\n this.rerender();\n };\n\n rerender(): void {\n if (this.file == null) return;\n this.render({ file: this.file, forceRender: true });\n }\n\n setOptions(options: FileOptions<LAnnotation> | undefined): void {\n if (options == null) return;\n this.options = options;\n this.mouseEventManager.setOptions(pluckMouseEventOptions(options));\n this.lineSelectionManager.setOptions(pluckLineSelectionOptions(options));\n }\n\n private mergeOptions(options: Partial<FileOptions<LAnnotation>>): void {\n this.options = { ...this.options, ...options };\n }\n\n setThemeType(themeType: ThemeTypes): void {\n const currentThemeType = this.options.themeType ?? 'system';\n if (currentThemeType === themeType) {\n return;\n }\n this.mergeOptions({ themeType });\n this.fileRenderer.setThemeType(themeType);\n\n if (this.headerElement != null) {\n if (themeType === 'system') {\n delete this.headerElement.dataset.themeType;\n } else {\n this.headerElement.dataset.themeType = themeType;\n }\n }\n\n // Update pre element theme mode\n if (this.pre != null) {\n switch (themeType) {\n case 'system':\n delete this.pre.dataset.themeType;\n break;\n case 'light':\n case 'dark':\n this.pre.dataset.themeType = themeType;\n break;\n }\n }\n }\n\n getHoveredLine = (): GetHoveredLineResult<'file'> | undefined => {\n return this.mouseEventManager.getHoveredLine();\n };\n\n setLineAnnotations(lineAnnotations: LineAnnotation<LAnnotation>[]): void {\n this.lineAnnotations = lineAnnotations;\n }\n\n setSelectedLines(range: SelectedLineRange | null): void {\n this.lineSelectionManager.setSelection(range);\n }\n\n cleanUp(): void {\n this.fileRenderer.cleanUp();\n this.resizeManager.cleanUp();\n this.mouseEventManager.cleanUp();\n this.lineSelectionManager.cleanUp();\n this.workerManager?.unsubscribeToThemeChanges(this);\n this.workerManager = undefined;\n\n // Clean up the data\n this.file = undefined;\n\n // Clean up the elements\n if (!this.isContainerManaged) {\n this.fileContainer?.parentNode?.removeChild(this.fileContainer);\n }\n if (this.fileContainer?.shadowRoot != null) {\n this.fileContainer.shadowRoot.innerHTML = '';\n }\n this.fileContainer = undefined;\n this.pre = undefined;\n this.appliedPreAttributes = undefined;\n this.headerElement = undefined;\n this.lastRenderedHeaderHTML = undefined;\n this.errorWrapper = undefined;\n this.unsafeCSSStyle = undefined;\n }\n\n hydrate(props: FileHyrdateProps<LAnnotation>): void {\n const { fileContainer, prerenderedHTML } = props;\n prerenderHTMLIfNecessary(fileContainer, prerenderedHTML);\n for (const element of Array.from(\n fileContainer.shadowRoot?.children ?? []\n )) {\n if (element instanceof SVGElement) {\n this.spriteSVG = element;\n continue;\n }\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (element instanceof HTMLPreElement) {\n this.pre = element;\n this.appliedPreAttributes = undefined;\n continue;\n }\n if (\n element instanceof HTMLStyleElement &&\n element.hasAttribute(UNSAFE_CSS_ATTRIBUTE)\n ) {\n this.unsafeCSSStyle = element;\n continue;\n }\n if ('diffsHeader' in element.dataset) {\n this.headerElement = element;\n this.lastRenderedHeaderHTML = undefined;\n continue;\n }\n }\n // If we have no pre tag, then we should render\n if (this.pre == null) {\n this.render(props);\n }\n // Otherwise orchestrate our setup\n else {\n const { file, lineAnnotations } = props;\n this.fileContainer = fileContainer;\n delete this.pre.dataset.dehydrated;\n\n this.lineAnnotations = lineAnnotations ?? this.lineAnnotations;\n this.file = file;\n this.fileRenderer.hydrate(file);\n this.renderAnnotations();\n this.renderHoverUtility();\n this.injectUnsafeCSS();\n this.mouseEventManager.setup(this.pre);\n this.lineSelectionManager.setup(this.pre);\n if ((this.options.overflow ?? 'scroll') === 'scroll') {\n this.resizeManager.setup(this.pre);\n }\n }\n }\n\n render({\n file,\n fileContainer,\n forceRender = false,\n containerWrapper,\n lineAnnotations,\n }: FileRenderProps<LAnnotation>): void {\n const annotationsChanged =\n lineAnnotations != null &&\n (lineAnnotations.length > 0 || this.lineAnnotations.length > 0)\n ? lineAnnotations !== this.lineAnnotations\n : false;\n if (!forceRender && areFilesEqual(this.file, file) && !annotationsChanged) {\n return;\n }\n\n this.file = file;\n this.fileRenderer.setOptions(this.options);\n if (lineAnnotations != null) {\n this.setLineAnnotations(lineAnnotations);\n }\n this.fileRenderer.setLineAnnotations(this.lineAnnotations);\n\n const { disableFileHeader = false, disableErrorHandling = false } =\n this.options;\n if (disableFileHeader) {\n // Remove existing header from DOM\n if (this.headerElement != null) {\n this.headerElement.parentNode?.removeChild(this.headerElement);\n this.headerElement = undefined;\n this.lastRenderedHeaderHTML = undefined;\n }\n }\n\n fileContainer = this.getOrCreateFileContainerNode(\n fileContainer,\n containerWrapper\n );\n\n try {\n const fileResult = this.fileRenderer.renderFile(file);\n if (fileResult == null) {\n if (this.workerManager != null && !this.workerManager.isInitialized()) {\n void this.workerManager.initialize().then(() => this.rerender());\n }\n return;\n }\n if (fileResult.headerAST != null) {\n this.applyHeaderToDOM(fileResult.headerAST, fileContainer);\n }\n const pre = this.getOrCreatePreNode(fileContainer);\n this.applyHunksToDOM(fileResult, pre);\n this.renderAnnotations();\n this.renderHoverUtility();\n } catch (error: unknown) {\n if (disableErrorHandling) {\n throw error;\n }\n console.error(error);\n if (error instanceof Error) {\n this.applyErrorToDOM(error, fileContainer);\n }\n }\n }\n\n private renderAnnotations(): void {\n if (this.isContainerManaged || this.fileContainer == null) {\n for (const { element } of this.annotationCache.values()) {\n element.parentNode?.removeChild(element);\n }\n this.annotationCache.clear();\n return;\n }\n const staleAnnotations = new Map(this.annotationCache);\n const { renderAnnotation } = this.options;\n if (renderAnnotation != null && this.lineAnnotations.length > 0) {\n for (const [index, annotation] of this.lineAnnotations.entries()) {\n const id = `${index}-${getLineAnnotationName(annotation)}`;\n let cache = this.annotationCache.get(id);\n if (\n cache == null ||\n !areLineAnnotationsEqual(annotation, cache.annotation)\n ) {\n cache?.element.parentElement?.removeChild(cache.element);\n const content = renderAnnotation(annotation);\n // If we can't render anything, then we should not render anything\n // and clear the annotation cache if necessary.\n if (content == null) {\n continue;\n }\n cache = {\n element: createAnnotationWrapperNode(\n getLineAnnotationName(annotation)\n ),\n annotation,\n };\n cache.element.appendChild(content);\n this.fileContainer.appendChild(cache.element);\n this.annotationCache.set(id, cache);\n }\n staleAnnotations.delete(id);\n }\n }\n for (const [id, { element }] of staleAnnotations.entries()) {\n this.annotationCache.delete(id);\n element.parentNode?.removeChild(element);\n }\n }\n\n private renderHoverUtility() {\n const { renderHoverUtility } = this.options;\n if (this.fileContainer == null || renderHoverUtility == null) {\n return;\n }\n const element = renderHoverUtility(this.mouseEventManager.getHoveredLine);\n if (element != null && this.hoverContent != null) {\n return;\n } else if (element == null) {\n this.hoverContent?.parentNode?.removeChild(this.hoverContent);\n this.hoverContent = undefined;\n return;\n }\n this.hoverContent = createHoverContentNode();\n this.hoverContent.appendChild(element);\n this.fileContainer.appendChild(this.hoverContent);\n }\n\n private injectUnsafeCSS(): void {\n if (this.fileContainer?.shadowRoot == null) {\n return;\n }\n const { unsafeCSS } = this.options;\n\n if (unsafeCSS == null || unsafeCSS === '') {\n if (this.unsafeCSSStyle != null) {\n this.unsafeCSSStyle.parentNode?.removeChild(this.unsafeCSSStyle);\n this.unsafeCSSStyle = undefined;\n }\n return;\n }\n\n // Create or update the style element\n if (this.unsafeCSSStyle == null) {\n this.unsafeCSSStyle = createUnsafeCSSStyleNode();\n this.fileContainer.shadowRoot.appendChild(this.unsafeCSSStyle);\n }\n // Wrap in @layer unsafe to match SSR behavior\n this.unsafeCSSStyle.innerText = wrapUnsafeCSS(unsafeCSS);\n }\n\n private applyHunksToDOM(result: FileRenderResult, pre: HTMLPreElement): void {\n this.cleanupErrorWrapper();\n this.applyPreNodeAttributes(pre, result);\n // Create code elements and insert HTML content\n this.code = getOrCreateCodeNode({ code: this.code });\n this.code.innerHTML = this.fileRenderer.renderPartialHTML(result.codeAST);\n pre.replaceChildren(this.code);\n this.injectUnsafeCSS();\n this.mouseEventManager.setup(pre);\n this.lineSelectionManager.setup(pre);\n this.lineSelectionManager.setDirty();\n if ((this.options.overflow ?? 'scroll') === 'scroll') {\n this.resizeManager.setup(pre);\n } else {\n this.resizeManager.cleanUp();\n }\n }\n\n private applyHeaderToDOM(\n headerAST: HASTElement,\n container: HTMLElement\n ): void {\n const { file } = this;\n if (file == null) return;\n this.cleanupErrorWrapper();\n const headerHTML = toHtml(headerAST);\n if (headerHTML !== this.lastRenderedHeaderHTML) {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = headerHTML;\n const newHeader = tempDiv.firstElementChild;\n if (!(newHeader instanceof HTMLElement)) {\n return;\n }\n if (this.headerElement != null) {\n container.shadowRoot?.replaceChild(newHeader, this.headerElement);\n } else {\n container.shadowRoot?.prepend(newHeader);\n }\n this.headerElement = newHeader;\n this.lastRenderedHeaderHTML = headerHTML;\n }\n\n if (this.isContainerManaged) return;\n\n const { renderCustomMetadata } = this.options;\n if (this.headerMetadata != null) {\n this.headerMetadata.parentNode?.removeChild(this.headerMetadata);\n }\n const content = renderCustomMetadata?.(file) ?? undefined;\n if (content != null) {\n this.headerMetadata = document.createElement('div');\n this.headerMetadata.slot = HEADER_METADATA_SLOT_ID;\n if (content instanceof Element) {\n this.headerMetadata.appendChild(content);\n } else {\n this.headerMetadata.innerText = `${content}`;\n }\n container.appendChild(this.headerMetadata);\n }\n }\n\n private getOrCreateFileContainerNode(\n fileContainer?: HTMLElement,\n parentNode?: HTMLElement\n ): HTMLElement {\n const previousContainer = this.fileContainer;\n this.fileContainer =\n fileContainer ??\n this.fileContainer ??\n document.createElement(DIFFS_TAG_NAME);\n if (previousContainer != null && previousContainer !== this.fileContainer) {\n this.lastRenderedHeaderHTML = undefined;\n this.headerElement = undefined;\n }\n if (parentNode != null && this.fileContainer.parentNode !== parentNode) {\n parentNode.appendChild(this.fileContainer);\n }\n if (this.spriteSVG == null) {\n const fragment = document.createElement('div');\n fragment.innerHTML = SVGSpriteSheet;\n const firstChild = fragment.firstChild;\n if (firstChild instanceof SVGElement) {\n this.spriteSVG = firstChild;\n this.fileContainer.shadowRoot?.appendChild(this.spriteSVG);\n }\n }\n return this.fileContainer;\n }\n\n private getOrCreatePreNode(container: HTMLElement): HTMLPreElement {\n // If we haven't created a pre element yet, lets go ahead and do that\n if (this.pre == null) {\n this.pre = document.createElement('pre');\n container.shadowRoot?.appendChild(this.pre);\n this.appliedPreAttributes = undefined;\n }\n // If we have a new parent container for the pre element, lets go ahead and\n // move it into the new container\n else if (this.pre.parentNode !== container) {\n container.shadowRoot?.appendChild(this.pre);\n this.appliedPreAttributes = undefined;\n }\n return this.pre;\n }\n\n private applyPreNodeAttributes(\n pre: HTMLPreElement,\n { totalLines, themeStyles, baseThemeType }: FileRenderResult\n ): void {\n const {\n overflow = 'scroll',\n themeType = 'system',\n disableLineNumbers = false,\n } = this.options;\n const preProperties: PrePropertiesConfig = {\n split: false,\n themeStyles,\n overflow,\n disableLineNumbers,\n themeType: baseThemeType ?? themeType,\n diffIndicators: 'none',\n disableBackground: true,\n totalLines,\n };\n if (arePrePropertiesEqual(preProperties, this.appliedPreAttributes)) {\n return;\n }\n setPreNodeProperties(pre, preProperties);\n this.appliedPreAttributes = preProperties;\n }\n\n private applyErrorToDOM(error: Error, container: HTMLElement) {\n this.cleanupErrorWrapper();\n const pre = this.getOrCreatePreNode(container);\n pre.innerHTML = '';\n pre.parentNode?.removeChild(pre);\n this.pre = undefined;\n this.appliedPreAttributes = undefined;\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n this.errorWrapper ??= document.createElement('div');\n this.errorWrapper.dataset.errorWrapper = '';\n this.errorWrapper.innerHTML = '';\n shadowRoot.appendChild(this.errorWrapper);\n const errorMessage = document.createElement('div');\n errorMessage.dataset.errorMessage = '';\n errorMessage.innerText = error.message;\n this.errorWrapper.appendChild(errorMessage);\n const errorStack = document.createElement('pre');\n errorStack.dataset.errorStack = '';\n errorStack.innerText = error.stack ?? 'No Error Stack';\n this.errorWrapper.appendChild(errorStack);\n }\n\n private cleanupErrorWrapper() {\n this.errorWrapper?.parentNode?.removeChild(this.errorWrapper);\n this.errorWrapper = undefined;\n }\n}\n"],"mappings":"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"}
@@ -26,6 +26,12 @@ interface FileDiffOptions<LAnnotation> extends Omit<BaseDiffOptions, "hunkSepara
26
26
  hunkSeparators?: Exclude<HunkSeparators, "custom"> | ((hunk: HunkData, instance: FileDiff<LAnnotation>) => HTMLElement | DocumentFragment);
27
27
  disableFileHeader?: boolean;
28
28
  renderHeaderMetadata?: RenderHeaderMetadataCallback;
29
+ /**
30
+ * When true, errors during rendering are rethrown instead of being caught
31
+ * and displayed in the DOM. Useful for testing or when you want to handle
32
+ * errors yourself.
33
+ */
34
+ disableErrorHandling?: boolean;
29
35
  renderAnnotation?(annotation: DiffLineAnnotation<LAnnotation>): HTMLElement | undefined;
30
36
  renderHoverUtility?(getHoveredRow: () => GetHoveredLineResult<"diff"> | undefined): HTMLElement | null;
31
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FileDiff.d.ts","names":["options: FileDiffOptions<LAnnotation>","workerManager?: WorkerPoolManager | undefined"],"sources":["../../src/components/FileDiff.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"FileDiff.d.ts","names":["options: FileDiffOptions<LAnnotation>","workerManager?: WorkerPoolManager | undefined"],"sources":["../../src/components/FileDiff.ts"],"sourcesContent":[],"mappings":"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"}
@@ -232,7 +232,7 @@ var FileDiff = class {
232
232
  hunkSeparators: typeof this.options.hunkSeparators === "function" ? "custom" : this.options.hunkSeparators
233
233
  });
234
234
  this.hunksRenderer.setLineAnnotations(this.lineAnnotations);
235
- const { disableFileHeader = false } = this.options;
235
+ const { disableFileHeader = false, disableErrorHandling = false } = this.options;
236
236
  if (disableFileHeader) {
237
237
  if (this.headerElement != null) {
238
238
  this.headerElement.parentNode?.removeChild(this.headerElement);
@@ -259,10 +259,9 @@ var FileDiff = class {
259
259
  this.renderAnnotations();
260
260
  this.renderHoverUtility();
261
261
  } catch (error) {
262
- if (error instanceof Error) {
263
- console.error(error);
264
- this.applyErrorToDOM(error, fileContainer);
265
- }
262
+ if (disableErrorHandling) throw error;
263
+ console.error(error);
264
+ if (error instanceof Error) this.applyErrorToDOM(error, fileContainer);
266
265
  }
267
266
  }
268
267
  renderSeparators(hunkData) {
@@ -1 +1 @@
1
- {"version":3,"file":"FileDiff.js","names":["options: FileDiffOptions<LAnnotation>","workerManager?: WorkerPoolManager | undefined","error: unknown","codeDeletions: HTMLElement | undefined","codeAdditions: HTMLElement | undefined","codeElements: HTMLElement[]","preProperties: PrePropertiesConfig"],"sources":["../../src/components/FileDiff.ts"],"sourcesContent":["import type { Element as HASTElement } from 'hast';\nimport { toHtml } from 'hast-util-to-html';\n\nimport {\n DEFAULT_THEMES,\n DIFFS_TAG_NAME,\n HEADER_METADATA_SLOT_ID,\n UNSAFE_CSS_ATTRIBUTE,\n} from '../constants';\nimport {\n LineSelectionManager,\n type LineSelectionOptions,\n type SelectedLineRange,\n pluckLineSelectionOptions,\n} from '../managers/LineSelectionManager';\nimport {\n type GetHoveredLineResult,\n MouseEventManager,\n type MouseEventManagerBaseOptions,\n pluckMouseEventOptions,\n} from '../managers/MouseEventManager';\nimport { ResizeManager } from '../managers/ResizeManager';\nimport { ScrollSyncManager } from '../managers/ScrollSyncManager';\nimport {\n DiffHunksRenderer,\n type HunksRenderResult,\n} from '../renderers/DiffHunksRenderer';\nimport { SVGSpriteSheet } from '../sprite';\nimport type {\n BaseDiffOptions,\n DiffLineAnnotation,\n ExpansionDirections,\n FileContents,\n FileDiffMetadata,\n HunkData,\n HunkSeparators,\n PrePropertiesConfig,\n RenderHeaderMetadataCallback,\n RenderRange,\n ThemeTypes,\n} from '../types';\nimport { areDiffLineAnnotationsEqual } from '../utils/areDiffLineAnnotationsEqual';\nimport { areFilesEqual } from '../utils/areFilesEqual';\nimport { areHunkDataEqual } from '../utils/areHunkDataEqual';\nimport { arePrePropertiesEqual } from '../utils/arePrePropertiesEqual';\nimport { areRenderRangesEqual } from '../utils/areRenderRangesEqual';\nimport { createAnnotationWrapperNode } from '../utils/createAnnotationWrapperNode';\nimport { createHoverContentNode } from '../utils/createHoverContentNode';\nimport { createUnsafeCSSStyleNode } from '../utils/createUnsafeCSSStyleNode';\nimport { wrapUnsafeCSS } from '../utils/cssWrappers';\nimport { getLineAnnotationName } from '../utils/getLineAnnotationName';\nimport { getOrCreateCodeNode } from '../utils/getOrCreateCodeNode';\nimport { parseDiffFromFile } from '../utils/parseDiffFromFile';\nimport { prerenderHTMLIfNecessary } from '../utils/prerenderHTMLIfNecessary';\nimport { setPreNodeProperties } from '../utils/setWrapperNodeProps';\nimport type { WorkerPoolManager } from '../worker';\nimport { DiffsContainerLoaded } from './web-components';\n\nexport interface FileDiffRenderProps<LAnnotation> {\n fileDiff?: FileDiffMetadata;\n oldFile?: FileContents;\n newFile?: FileContents;\n forceRender?: boolean;\n fileContainer?: HTMLElement;\n containerWrapper?: HTMLElement;\n lineAnnotations?: DiffLineAnnotation<LAnnotation>[];\n renderRange?: RenderRange;\n}\n\nexport interface FileDiffHydrationProps<LAnnotation>\n extends Omit<FileDiffRenderProps<LAnnotation>, 'fileContainer'> {\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\n\nexport interface FileDiffOptions<LAnnotation>\n extends Omit<BaseDiffOptions, 'hunkSeparators'>,\n MouseEventManagerBaseOptions<'diff'>,\n LineSelectionOptions {\n hunkSeparators?:\n | Exclude<HunkSeparators, 'custom'>\n | ((\n hunk: HunkData,\n instance: FileDiff<LAnnotation>\n ) => HTMLElement | DocumentFragment);\n disableFileHeader?: boolean;\n renderHeaderMetadata?: RenderHeaderMetadataCallback;\n renderAnnotation?(\n annotation: DiffLineAnnotation<LAnnotation>\n ): HTMLElement | undefined;\n renderHoverUtility?(\n getHoveredRow: () => GetHoveredLineResult<'diff'> | undefined\n ): HTMLElement | null;\n}\n\ninterface AnnotationElementCache<LAnnotation> {\n element: HTMLElement;\n annotation: DiffLineAnnotation<LAnnotation>;\n}\n\ninterface CustomHunkElementCache {\n element: HTMLElement;\n hunkData: HunkData;\n}\n\nlet instanceId = -1;\n\nexport class FileDiff<LAnnotation = undefined> {\n // NOTE(amadeus): We sorta need this to ensure the web-component file is\n // properly loaded\n static LoadedCustomComponent: boolean = DiffsContainerLoaded;\n\n readonly __id: string = `file-diff:${++instanceId}`;\n\n protected fileContainer: HTMLElement | undefined;\n protected spriteSVG: SVGElement | undefined;\n protected pre: HTMLPreElement | undefined;\n protected codeUnified: HTMLElement | undefined;\n protected codeDeletions: HTMLElement | undefined;\n protected codeAdditions: HTMLElement | undefined;\n protected unsafeCSSStyle: HTMLStyleElement | undefined;\n protected hoverContent: HTMLElement | undefined;\n\n protected headerElement: HTMLElement | undefined;\n protected headerMetadata: HTMLElement | undefined;\n protected separatorCache: Map<string, CustomHunkElementCache> = new Map();\n protected errorWrapper: HTMLElement | undefined;\n\n protected hunksRenderer: DiffHunksRenderer<LAnnotation>;\n protected resizeManager: ResizeManager;\n protected scrollSyncManager: ScrollSyncManager;\n protected mouseEventManager: MouseEventManager<'diff'>;\n protected lineSelectionManager: LineSelectionManager;\n\n protected annotationCache: Map<string, AnnotationElementCache<LAnnotation>> =\n new Map();\n protected lineAnnotations: DiffLineAnnotation<LAnnotation>[] = [];\n\n protected deletionFile: FileContents | undefined;\n protected additionFile: FileContents | undefined;\n protected fileDiff: FileDiffMetadata | undefined;\n protected renderRange: RenderRange | undefined;\n protected appliedPreAttributes: PrePropertiesConfig | undefined;\n protected lastRenderedHeaderHTML: string | undefined;\n\n protected enabled = true;\n\n constructor(\n public options: FileDiffOptions<LAnnotation> = { theme: DEFAULT_THEMES },\n protected workerManager?: WorkerPoolManager | undefined,\n protected isContainerManaged = false\n ) {\n this.hunksRenderer = new DiffHunksRenderer(\n {\n ...options,\n hunkSeparators:\n typeof options.hunkSeparators === 'function'\n ? 'custom'\n : options.hunkSeparators,\n },\n this.handleHighlightRender,\n this.workerManager\n );\n this.resizeManager = new ResizeManager();\n this.scrollSyncManager = new ScrollSyncManager();\n this.mouseEventManager = new MouseEventManager(\n 'diff',\n pluckMouseEventOptions(\n options,\n typeof options.hunkSeparators === 'function' ||\n (options.hunkSeparators ?? 'line-info') === 'line-info'\n ? this.handleExpandHunk\n : undefined\n )\n );\n this.lineSelectionManager = new LineSelectionManager(\n pluckLineSelectionOptions(options)\n );\n this.workerManager?.subscribeToThemeChanges(this);\n this.enabled = true;\n }\n\n private handleHighlightRender = (): void => {\n this.rerender();\n };\n\n // FIXME(amadeus): This is a bit of a looming issue that I'll need to resolve:\n // * Do we publicly allow merging of options or do we have individualized setters?\n // * When setting new options, we need to figure out what settings require a\n // re-render and which can just be applied more elegantly\n // * There's also an issue of options that live here on the File class and\n // those that live on the Hunk class, and it's a bit of an issue with passing\n // settings down and mirroring them (not great...)\n setOptions(options: FileDiffOptions<LAnnotation> | undefined): void {\n if (options == null) return;\n this.options = options;\n this.hunksRenderer.setOptions({\n ...this.options,\n hunkSeparators:\n typeof options.hunkSeparators === 'function'\n ? 'custom'\n : options.hunkSeparators,\n });\n this.mouseEventManager.setOptions(\n pluckMouseEventOptions(\n options,\n typeof options.hunkSeparators === 'function' ||\n (options.hunkSeparators ?? 'line-info') === 'line-info'\n ? this.handleExpandHunk\n : undefined\n )\n );\n this.lineSelectionManager.setOptions(pluckLineSelectionOptions(options));\n }\n\n private mergeOptions(options: Partial<FileDiffOptions<LAnnotation>>): void {\n this.options = { ...this.options, ...options };\n }\n\n setThemeType(themeType: ThemeTypes): void {\n if ((this.options.themeType ?? 'system') === themeType) {\n return;\n }\n this.mergeOptions({ themeType });\n this.hunksRenderer.setThemeType(themeType);\n\n if (this.headerElement != null) {\n if (themeType === 'system') {\n delete this.headerElement.dataset.themeType;\n } else {\n this.headerElement.dataset.themeType = themeType;\n }\n }\n\n // Update pre element theme mode\n if (this.pre != null) {\n switch (themeType) {\n case 'system':\n delete this.pre.dataset.themeType;\n break;\n case 'light':\n case 'dark':\n this.pre.dataset.themeType = themeType;\n break;\n }\n }\n }\n\n getHoveredLine = (): GetHoveredLineResult<'diff'> | undefined => {\n return this.mouseEventManager.getHoveredLine();\n };\n\n setLineAnnotations(lineAnnotations: DiffLineAnnotation<LAnnotation>[]): void {\n this.lineAnnotations = lineAnnotations;\n }\n\n setSelectedLines(range: SelectedLineRange | null): void {\n this.lineSelectionManager.setSelection(range);\n }\n\n cleanUp(recycle: boolean = false): void {\n this.resizeManager.cleanUp();\n this.mouseEventManager.cleanUp();\n this.scrollSyncManager.cleanUp();\n this.lineSelectionManager.cleanUp();\n this.workerManager?.unsubscribeToThemeChanges(this);\n this.renderRange = undefined;\n\n // Clean up the elements\n if (!this.isContainerManaged) {\n this.fileContainer?.parentNode?.removeChild(this.fileContainer);\n }\n if (this.fileContainer?.shadowRoot != null) {\n // Manually help garbage collection\n this.fileContainer.shadowRoot.innerHTML = '';\n }\n this.fileContainer = undefined;\n // Manually help garbage collection\n if (this.pre != null) {\n this.pre.innerHTML = '';\n this.pre = undefined;\n }\n this.codeUnified = undefined;\n this.codeDeletions = undefined;\n this.codeAdditions = undefined;\n this.appliedPreAttributes = undefined;\n this.headerElement = undefined;\n this.lastRenderedHeaderHTML = undefined;\n this.errorWrapper = undefined;\n this.spriteSVG = undefined;\n\n if (recycle) {\n this.hunksRenderer.recycle();\n } else {\n this.hunksRenderer.cleanUp();\n this.workerManager = undefined;\n // Clean up the data\n this.fileDiff = undefined;\n this.deletionFile = undefined;\n this.additionFile = undefined;\n }\n\n this.enabled = false;\n }\n\n virtualizedSetup(): void {\n this.enabled = true;\n this.workerManager?.subscribeToThemeChanges(this);\n }\n\n hydrate(props: FileDiffHydrationProps<LAnnotation>): void {\n const { fileContainer, prerenderedHTML } = props;\n prerenderHTMLIfNecessary(fileContainer, prerenderedHTML);\n for (const element of fileContainer.shadowRoot?.children ?? []) {\n if (element instanceof SVGElement) {\n this.spriteSVG = element;\n continue;\n }\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (element instanceof HTMLPreElement) {\n this.pre = element;\n for (const code of element.children) {\n if (\n !(code instanceof HTMLElement) ||\n code.tagName.toLowerCase() !== 'code'\n ) {\n continue;\n }\n if ('deletions' in code.dataset) {\n this.codeDeletions = code;\n }\n if ('additions' in code.dataset) {\n this.codeAdditions = code;\n }\n if ('unified' in code.dataset) {\n this.codeUnified = code;\n }\n }\n continue;\n }\n if ('diffsHeader' in element.dataset) {\n this.headerElement = element;\n continue;\n }\n if (\n element instanceof HTMLStyleElement &&\n element.hasAttribute(UNSAFE_CSS_ATTRIBUTE)\n ) {\n this.unsafeCSSStyle = element;\n continue;\n }\n }\n if (this.pre != null) {\n this.syncCodeNodesFromPre(this.pre);\n }\n // If we have no pre tag, then we should render\n if (this.pre == null) {\n this.render(props);\n }\n // Otherwise orchestrate our setup\n else {\n const { lineAnnotations, oldFile, newFile, fileDiff } = props;\n this.fileContainer = fileContainer;\n delete this.pre.dataset.dehydrated;\n\n this.lineAnnotations = lineAnnotations ?? this.lineAnnotations;\n this.additionFile = newFile;\n this.deletionFile = oldFile;\n this.fileDiff =\n fileDiff ??\n (oldFile != null && newFile != null\n ? parseDiffFromFile(oldFile, newFile)\n : undefined);\n\n this.hunksRenderer.hydrate(this.fileDiff);\n // FIXME(amadeus): not sure how to handle this yet...\n // this.renderSeparators();\n this.renderAnnotations();\n this.renderHoverUtility();\n this.injectUnsafeCSS();\n this.mouseEventManager.setup(this.pre);\n this.lineSelectionManager.setup(this.pre);\n if ((this.options.overflow ?? 'scroll') === 'scroll') {\n this.resizeManager.setup(this.pre);\n if ((this.options.diffStyle ?? 'split') === 'split') {\n this.scrollSyncManager.setup(\n this.pre,\n this.codeDeletions,\n this.codeAdditions\n );\n }\n }\n }\n }\n\n rerender(): void {\n if (\n !this.enabled ||\n (this.fileDiff == null &&\n this.additionFile == null &&\n this.deletionFile == null)\n ) {\n return;\n }\n this.render({\n oldFile: this.deletionFile,\n newFile: this.additionFile,\n fileDiff: this.fileDiff,\n forceRender: true,\n renderRange: this.renderRange,\n });\n }\n\n handleExpandHunk = (\n hunkIndex: number,\n direction: ExpansionDirections\n ): void => {\n this.expandHunk(hunkIndex, direction);\n };\n\n expandHunk(hunkIndex: number, direction: ExpansionDirections): void {\n this.hunksRenderer.expandHunk(hunkIndex, direction);\n this.rerender();\n }\n\n render({\n oldFile,\n newFile,\n fileDiff,\n forceRender = false,\n lineAnnotations,\n fileContainer,\n containerWrapper,\n renderRange,\n }: FileDiffRenderProps<LAnnotation>): void {\n if (!this.enabled) {\n // NOTE(amadeus): May need to be a silent failure? Making it loud for now\n // to better understand it\n throw new Error(\n 'FileDiff.render: attempting to call render after cleaned up'\n );\n }\n const filesDidChange =\n oldFile != null &&\n newFile != null &&\n (!areFilesEqual(oldFile, this.deletionFile) ||\n !areFilesEqual(newFile, this.additionFile));\n const annotationsChanged =\n lineAnnotations != null &&\n (lineAnnotations.length > 0 || this.lineAnnotations.length > 0)\n ? lineAnnotations !== this.lineAnnotations\n : false;\n if (\n areRenderRangesEqual(renderRange, this.renderRange) &&\n !forceRender &&\n !annotationsChanged &&\n // If using the fileDiff API, lets check to see if they are equal to\n // avoid doing work\n ((fileDiff != null && fileDiff === this.fileDiff) ||\n // If using the oldFile/newFile API then lets check to see if they are\n // equal\n (fileDiff == null && !filesDidChange))\n ) {\n return;\n }\n\n this.renderRange = renderRange;\n this.deletionFile = oldFile;\n this.additionFile = newFile;\n if (fileDiff != null) {\n this.fileDiff = fileDiff;\n } else if (oldFile != null && newFile != null && filesDidChange) {\n this.fileDiff = parseDiffFromFile(oldFile, newFile);\n }\n\n if (lineAnnotations != null) {\n this.setLineAnnotations(lineAnnotations);\n }\n if (this.fileDiff == null) {\n return;\n }\n this.hunksRenderer.setOptions({\n ...this.options,\n hunkSeparators:\n typeof this.options.hunkSeparators === 'function'\n ? 'custom'\n : this.options.hunkSeparators,\n });\n\n this.hunksRenderer.setLineAnnotations(this.lineAnnotations);\n\n const { disableFileHeader = false } = this.options;\n\n if (disableFileHeader) {\n // Remove existing header from DOM\n if (this.headerElement != null) {\n this.headerElement.parentNode?.removeChild(this.headerElement);\n this.headerElement = undefined;\n this.lastRenderedHeaderHTML = undefined;\n }\n }\n fileContainer = this.getOrCreateFileContainer(\n fileContainer,\n containerWrapper\n );\n\n try {\n const hunksResult = this.hunksRenderer.renderDiff(\n this.fileDiff,\n renderRange\n );\n if (hunksResult == null) {\n if (this.workerManager != null && !this.workerManager.isInitialized()) {\n void this.workerManager.initialize().then(() => this.rerender());\n }\n return;\n }\n\n if (hunksResult.headerElement != null) {\n this.applyHeaderToDOM(hunksResult.headerElement, fileContainer);\n }\n if (\n hunksResult.additionsAST != null ||\n hunksResult.deletionsAST != null ||\n hunksResult.unifiedAST != null\n ) {\n const pre = this.getOrCreatePreNode(fileContainer);\n this.applyHunksToDOM(pre, hunksResult);\n } else if (this.pre != null) {\n this.pre.parentNode?.removeChild(this.pre);\n this.pre = undefined;\n }\n this.renderSeparators(hunksResult.hunkData);\n this.renderAnnotations();\n this.renderHoverUtility();\n } catch (error: unknown) {\n if (error instanceof Error) {\n console.error(error);\n this.applyErrorToDOM(error, fileContainer);\n }\n }\n }\n\n private renderSeparators(hunkData: HunkData[]): void {\n const { hunkSeparators } = this.options;\n if (\n this.isContainerManaged ||\n this.fileContainer == null ||\n typeof hunkSeparators !== 'function'\n ) {\n for (const { element } of this.separatorCache.values()) {\n element.parentNode?.removeChild(element);\n }\n this.separatorCache.clear();\n return;\n }\n const staleSeparators = new Map(this.separatorCache);\n for (const hunk of hunkData) {\n const id = hunk.slotName;\n let cache = this.separatorCache.get(id);\n if (cache == null || !areHunkDataEqual(hunk, cache.hunkData)) {\n cache?.element.parentNode?.removeChild(cache.element);\n const element = document.createElement('div');\n element.style.display = 'contents';\n element.slot = hunk.slotName;\n element.appendChild(hunkSeparators(hunk, this));\n this.fileContainer.appendChild(element);\n cache = { element, hunkData: hunk };\n this.separatorCache.set(id, cache);\n }\n staleSeparators.delete(id);\n }\n for (const [id, { element }] of staleSeparators.entries()) {\n this.separatorCache.delete(id);\n element.parentNode?.removeChild(element);\n }\n }\n\n private renderAnnotations(): void {\n if (this.isContainerManaged || this.fileContainer == null) {\n for (const { element } of this.annotationCache.values()) {\n element.parentNode?.removeChild(element);\n }\n this.annotationCache.clear();\n return;\n }\n const staleAnnotations = new Map(this.annotationCache);\n const { renderAnnotation } = this.options;\n if (renderAnnotation != null && this.lineAnnotations.length > 0) {\n for (const [index, annotation] of this.lineAnnotations.entries()) {\n const id = `${index}-${getLineAnnotationName(annotation)}`;\n let cache = this.annotationCache.get(id);\n if (\n cache == null ||\n !areDiffLineAnnotationsEqual(annotation, cache.annotation)\n ) {\n cache?.element.parentElement?.removeChild(cache.element);\n const content = renderAnnotation(annotation);\n // If we can't render anything, then we should not render anything\n // and clear the annotation cache if necessary.\n if (content == null) {\n continue;\n }\n cache = {\n element: createAnnotationWrapperNode(\n getLineAnnotationName(annotation)\n ),\n annotation,\n };\n cache.element.appendChild(content);\n this.fileContainer.appendChild(cache.element);\n this.annotationCache.set(id, cache);\n }\n staleAnnotations.delete(id);\n }\n }\n for (const [id, { element }] of staleAnnotations.entries()) {\n this.annotationCache.delete(id);\n element.parentNode?.removeChild(element);\n }\n }\n\n private renderHoverUtility() {\n const { renderHoverUtility } = this.options;\n if (this.fileContainer == null || renderHoverUtility == null) {\n return;\n }\n const element = renderHoverUtility(this.mouseEventManager.getHoveredLine);\n if (element != null && this.hoverContent != null) {\n return;\n } else if (element == null) {\n this.hoverContent?.parentNode?.removeChild(this.hoverContent);\n this.hoverContent = undefined;\n return;\n }\n this.hoverContent = createHoverContentNode();\n this.hoverContent.appendChild(element);\n this.fileContainer.appendChild(this.hoverContent);\n }\n\n getOrCreateFileContainer(\n fileContainer?: HTMLElement,\n parentNode?: HTMLElement\n ): HTMLElement {\n const previousContainer = this.fileContainer;\n this.fileContainer =\n fileContainer ??\n this.fileContainer ??\n document.createElement(DIFFS_TAG_NAME);\n // NOTE(amadeus): If the container changes, we should reset the rendered\n // HTML\n if (previousContainer != null && previousContainer !== this.fileContainer) {\n this.lastRenderedHeaderHTML = undefined;\n this.headerElement = undefined;\n }\n if (parentNode != null && this.fileContainer.parentNode !== parentNode) {\n parentNode.appendChild(this.fileContainer);\n }\n if (this.spriteSVG == null) {\n const fragment = document.createElement('div');\n fragment.innerHTML = SVGSpriteSheet;\n const firstChild = fragment.firstChild;\n if (firstChild instanceof SVGElement) {\n this.spriteSVG = firstChild;\n this.fileContainer.shadowRoot?.appendChild(this.spriteSVG);\n }\n }\n return this.fileContainer;\n }\n\n getFileContainer(): HTMLElement | undefined {\n return this.fileContainer;\n }\n\n private getOrCreatePreNode(container: HTMLElement): HTMLPreElement {\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n // If we haven't created a pre element yet, lets go ahead and do that\n if (this.pre == null) {\n this.pre = document.createElement('pre');\n this.appliedPreAttributes = undefined;\n this.codeUnified = undefined;\n this.codeDeletions = undefined;\n this.codeAdditions = undefined;\n shadowRoot.appendChild(this.pre);\n }\n // If we have a new parent container for the pre element, lets go ahead and\n // move it into the new container\n else if (this.pre.parentNode !== shadowRoot) {\n shadowRoot.appendChild(this.pre);\n this.appliedPreAttributes = undefined;\n }\n return this.pre;\n }\n\n private syncCodeNodesFromPre(pre: HTMLPreElement): void {\n this.codeUnified = undefined;\n this.codeDeletions = undefined;\n this.codeAdditions = undefined;\n for (const child of Array.from(pre.children)) {\n if (!(child instanceof HTMLElement)) {\n continue;\n }\n if ('unified' in child.dataset) {\n this.codeUnified = child;\n } else if ('deletions' in child.dataset) {\n this.codeDeletions = child;\n } else if ('additions' in child.dataset) {\n this.codeAdditions = child;\n }\n }\n }\n\n private applyHeaderToDOM(\n headerAST: HASTElement,\n container: HTMLElement\n ): void {\n this.cleanupErrorWrapper();\n const headerHTML = toHtml(headerAST);\n if (headerHTML !== this.lastRenderedHeaderHTML) {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = headerHTML;\n const newHeader = tempDiv.firstElementChild;\n if (!(newHeader instanceof HTMLElement)) {\n return;\n }\n if (this.headerElement != null) {\n container.shadowRoot?.replaceChild(newHeader, this.headerElement);\n } else {\n container.shadowRoot?.prepend(newHeader);\n }\n this.headerElement = newHeader;\n this.lastRenderedHeaderHTML = headerHTML;\n }\n\n if (this.isContainerManaged) return;\n\n const { renderHeaderMetadata } = this.options;\n if (this.headerMetadata != null) {\n this.headerMetadata.parentNode?.removeChild(this.headerMetadata);\n }\n const content =\n renderHeaderMetadata?.({\n deletionFile: this.deletionFile,\n additionFile: this.additionFile,\n fileDiff: this.fileDiff,\n }) ?? undefined;\n if (content != null) {\n this.headerMetadata = document.createElement('div');\n this.headerMetadata.slot = HEADER_METADATA_SLOT_ID;\n if (content instanceof Element) {\n this.headerMetadata.appendChild(content);\n } else {\n this.headerMetadata.innerText = `${content}`;\n }\n container.appendChild(this.headerMetadata);\n }\n }\n\n private injectUnsafeCSS(): void {\n if (this.fileContainer?.shadowRoot == null) {\n return;\n }\n const { unsafeCSS } = this.options;\n\n if (unsafeCSS == null || unsafeCSS === '') {\n return;\n }\n\n // Create or update the style element\n if (this.unsafeCSSStyle == null) {\n this.unsafeCSSStyle = createUnsafeCSSStyleNode();\n this.fileContainer.shadowRoot.appendChild(this.unsafeCSSStyle);\n }\n // Wrap in @layer unsafe to match SSR behavior\n this.unsafeCSSStyle.innerText = wrapUnsafeCSS(unsafeCSS);\n }\n\n private applyHunksToDOM(\n pre: HTMLPreElement,\n result: HunksRenderResult\n ): void {\n this.cleanupErrorWrapper();\n this.applyPreNodeAttributes(pre, result);\n\n let shouldReplace = false;\n let codeDeletions: HTMLElement | undefined;\n let codeAdditions: HTMLElement | undefined;\n // Create code elements and insert HTML content\n const codeElements: HTMLElement[] = [];\n if (result.unifiedAST != null) {\n shouldReplace =\n this.codeUnified == null ||\n this.codeAdditions != null ||\n this.codeDeletions != null;\n this.codeDeletions = undefined;\n this.codeAdditions = undefined;\n if (result.unifiedAST.length > 0) {\n this.codeUnified = getOrCreateCodeNode({\n code: this.codeUnified,\n columnType: 'unified',\n });\n this.codeUnified.innerHTML = this.hunksRenderer.renderPartialHTML(\n result.unifiedAST\n );\n codeElements.push(this.codeUnified);\n } else {\n this.codeUnified = undefined;\n }\n } else {\n if (result.deletionsAST != null) {\n shouldReplace = this.codeDeletions == null || this.codeUnified != null;\n this.codeUnified = undefined;\n if (result.deletionsAST.length > 0) {\n this.codeDeletions = getOrCreateCodeNode({\n code: this.codeDeletions,\n columnType: 'deletions',\n });\n this.codeDeletions.innerHTML = this.hunksRenderer.renderPartialHTML(\n result.deletionsAST\n );\n codeElements.push(this.codeDeletions);\n } else {\n this.codeDeletions = undefined;\n }\n }\n if (result.additionsAST != null) {\n shouldReplace =\n shouldReplace ||\n this.codeAdditions == null ||\n this.codeUnified != null;\n this.codeUnified = undefined;\n if (result.additionsAST.length > 0) {\n this.codeAdditions = getOrCreateCodeNode({\n code: this.codeAdditions,\n columnType: 'additions',\n });\n this.codeAdditions.innerHTML = this.hunksRenderer.renderPartialHTML(\n result.additionsAST\n );\n codeElements.push(this.codeAdditions);\n } else {\n this.codeAdditions = undefined;\n }\n }\n }\n\n if (codeElements.length === 0) {\n pre.textContent = '';\n } else if (shouldReplace) {\n pre.replaceChildren(...codeElements);\n }\n\n this.injectUnsafeCSS();\n\n this.mouseEventManager.setup(pre);\n this.lineSelectionManager.setup(pre);\n if ((this.options.overflow ?? 'scroll') === 'scroll') {\n this.resizeManager.setup(pre);\n if ((this.options.diffStyle ?? 'split') === 'split') {\n this.scrollSyncManager.setup(pre, codeDeletions, codeAdditions);\n } else {\n this.scrollSyncManager.cleanUp();\n }\n } else {\n this.resizeManager.cleanUp();\n this.scrollSyncManager.cleanUp();\n }\n }\n\n private applyPreNodeAttributes(\n pre: HTMLPreElement,\n {\n themeStyles,\n baseThemeType,\n additionsAST,\n deletionsAST,\n totalLines,\n }: HunksRenderResult\n ): void {\n const {\n diffIndicators = 'bars',\n disableBackground = false,\n disableLineNumbers = false,\n overflow = 'scroll',\n themeType = 'system',\n diffStyle = 'split',\n } = this.options;\n const preProperties: PrePropertiesConfig = {\n diffIndicators,\n disableBackground,\n disableLineNumbers,\n overflow,\n split:\n diffStyle === 'unified'\n ? false\n : additionsAST != null && deletionsAST != null,\n themeStyles,\n themeType: baseThemeType ?? themeType,\n totalLines,\n };\n if (arePrePropertiesEqual(preProperties, this.appliedPreAttributes)) {\n return;\n }\n setPreNodeProperties(pre, preProperties);\n this.appliedPreAttributes = preProperties;\n }\n\n private applyErrorToDOM(error: Error, container: HTMLElement) {\n this.cleanupErrorWrapper();\n const pre = this.getOrCreatePreNode(container);\n pre.innerHTML = '';\n pre.parentNode?.removeChild(pre);\n this.pre = undefined;\n this.appliedPreAttributes = undefined;\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n this.errorWrapper ??= document.createElement('div');\n this.errorWrapper.dataset.errorWrapper = '';\n this.errorWrapper.innerHTML = '';\n shadowRoot.appendChild(this.errorWrapper);\n const errorMessage = document.createElement('div');\n errorMessage.dataset.errorMessage = '';\n errorMessage.innerText = error.message;\n this.errorWrapper.appendChild(errorMessage);\n const errorStack = document.createElement('pre');\n errorStack.dataset.errorStack = '';\n errorStack.innerText = error.stack ?? 'No Error Stack';\n this.errorWrapper.appendChild(errorStack);\n }\n\n private cleanupErrorWrapper() {\n this.errorWrapper?.parentNode?.removeChild(this.errorWrapper);\n this.errorWrapper = undefined;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"FileDiff.js","names":["options: FileDiffOptions<LAnnotation>","workerManager?: WorkerPoolManager | undefined","error: unknown","codeDeletions: HTMLElement | undefined","codeAdditions: HTMLElement | undefined","codeElements: HTMLElement[]","preProperties: PrePropertiesConfig"],"sources":["../../src/components/FileDiff.ts"],"sourcesContent":["import type { Element as HASTElement } from 'hast';\nimport { toHtml } from 'hast-util-to-html';\n\nimport {\n DEFAULT_THEMES,\n DIFFS_TAG_NAME,\n HEADER_METADATA_SLOT_ID,\n UNSAFE_CSS_ATTRIBUTE,\n} from '../constants';\nimport {\n LineSelectionManager,\n type LineSelectionOptions,\n type SelectedLineRange,\n pluckLineSelectionOptions,\n} from '../managers/LineSelectionManager';\nimport {\n type GetHoveredLineResult,\n MouseEventManager,\n type MouseEventManagerBaseOptions,\n pluckMouseEventOptions,\n} from '../managers/MouseEventManager';\nimport { ResizeManager } from '../managers/ResizeManager';\nimport { ScrollSyncManager } from '../managers/ScrollSyncManager';\nimport {\n DiffHunksRenderer,\n type HunksRenderResult,\n} from '../renderers/DiffHunksRenderer';\nimport { SVGSpriteSheet } from '../sprite';\nimport type {\n BaseDiffOptions,\n DiffLineAnnotation,\n ExpansionDirections,\n FileContents,\n FileDiffMetadata,\n HunkData,\n HunkSeparators,\n PrePropertiesConfig,\n RenderHeaderMetadataCallback,\n RenderRange,\n ThemeTypes,\n} from '../types';\nimport { areDiffLineAnnotationsEqual } from '../utils/areDiffLineAnnotationsEqual';\nimport { areFilesEqual } from '../utils/areFilesEqual';\nimport { areHunkDataEqual } from '../utils/areHunkDataEqual';\nimport { arePrePropertiesEqual } from '../utils/arePrePropertiesEqual';\nimport { areRenderRangesEqual } from '../utils/areRenderRangesEqual';\nimport { createAnnotationWrapperNode } from '../utils/createAnnotationWrapperNode';\nimport { createHoverContentNode } from '../utils/createHoverContentNode';\nimport { createUnsafeCSSStyleNode } from '../utils/createUnsafeCSSStyleNode';\nimport { wrapUnsafeCSS } from '../utils/cssWrappers';\nimport { getLineAnnotationName } from '../utils/getLineAnnotationName';\nimport { getOrCreateCodeNode } from '../utils/getOrCreateCodeNode';\nimport { parseDiffFromFile } from '../utils/parseDiffFromFile';\nimport { prerenderHTMLIfNecessary } from '../utils/prerenderHTMLIfNecessary';\nimport { setPreNodeProperties } from '../utils/setWrapperNodeProps';\nimport type { WorkerPoolManager } from '../worker';\nimport { DiffsContainerLoaded } from './web-components';\n\nexport interface FileDiffRenderProps<LAnnotation> {\n fileDiff?: FileDiffMetadata;\n oldFile?: FileContents;\n newFile?: FileContents;\n forceRender?: boolean;\n fileContainer?: HTMLElement;\n containerWrapper?: HTMLElement;\n lineAnnotations?: DiffLineAnnotation<LAnnotation>[];\n renderRange?: RenderRange;\n}\n\nexport interface FileDiffHydrationProps<LAnnotation>\n extends Omit<FileDiffRenderProps<LAnnotation>, 'fileContainer'> {\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\n\nexport interface FileDiffOptions<LAnnotation>\n extends Omit<BaseDiffOptions, 'hunkSeparators'>,\n MouseEventManagerBaseOptions<'diff'>,\n LineSelectionOptions {\n hunkSeparators?:\n | Exclude<HunkSeparators, 'custom'>\n | ((\n hunk: HunkData,\n instance: FileDiff<LAnnotation>\n ) => HTMLElement | DocumentFragment);\n disableFileHeader?: boolean;\n renderHeaderMetadata?: RenderHeaderMetadataCallback;\n /**\n * When true, errors during rendering are rethrown instead of being caught\n * and displayed in the DOM. Useful for testing or when you want to handle\n * errors yourself.\n */\n disableErrorHandling?: boolean;\n renderAnnotation?(\n annotation: DiffLineAnnotation<LAnnotation>\n ): HTMLElement | undefined;\n renderHoverUtility?(\n getHoveredRow: () => GetHoveredLineResult<'diff'> | undefined\n ): HTMLElement | null;\n}\n\ninterface AnnotationElementCache<LAnnotation> {\n element: HTMLElement;\n annotation: DiffLineAnnotation<LAnnotation>;\n}\n\ninterface CustomHunkElementCache {\n element: HTMLElement;\n hunkData: HunkData;\n}\n\nlet instanceId = -1;\n\nexport class FileDiff<LAnnotation = undefined> {\n // NOTE(amadeus): We sorta need this to ensure the web-component file is\n // properly loaded\n static LoadedCustomComponent: boolean = DiffsContainerLoaded;\n\n readonly __id: string = `file-diff:${++instanceId}`;\n\n protected fileContainer: HTMLElement | undefined;\n protected spriteSVG: SVGElement | undefined;\n protected pre: HTMLPreElement | undefined;\n protected codeUnified: HTMLElement | undefined;\n protected codeDeletions: HTMLElement | undefined;\n protected codeAdditions: HTMLElement | undefined;\n protected unsafeCSSStyle: HTMLStyleElement | undefined;\n protected hoverContent: HTMLElement | undefined;\n\n protected headerElement: HTMLElement | undefined;\n protected headerMetadata: HTMLElement | undefined;\n protected separatorCache: Map<string, CustomHunkElementCache> = new Map();\n protected errorWrapper: HTMLElement | undefined;\n\n protected hunksRenderer: DiffHunksRenderer<LAnnotation>;\n protected resizeManager: ResizeManager;\n protected scrollSyncManager: ScrollSyncManager;\n protected mouseEventManager: MouseEventManager<'diff'>;\n protected lineSelectionManager: LineSelectionManager;\n\n protected annotationCache: Map<string, AnnotationElementCache<LAnnotation>> =\n new Map();\n protected lineAnnotations: DiffLineAnnotation<LAnnotation>[] = [];\n\n protected deletionFile: FileContents | undefined;\n protected additionFile: FileContents | undefined;\n protected fileDiff: FileDiffMetadata | undefined;\n protected renderRange: RenderRange | undefined;\n protected appliedPreAttributes: PrePropertiesConfig | undefined;\n protected lastRenderedHeaderHTML: string | undefined;\n\n protected enabled = true;\n\n constructor(\n public options: FileDiffOptions<LAnnotation> = { theme: DEFAULT_THEMES },\n protected workerManager?: WorkerPoolManager | undefined,\n protected isContainerManaged = false\n ) {\n this.hunksRenderer = new DiffHunksRenderer(\n {\n ...options,\n hunkSeparators:\n typeof options.hunkSeparators === 'function'\n ? 'custom'\n : options.hunkSeparators,\n },\n this.handleHighlightRender,\n this.workerManager\n );\n this.resizeManager = new ResizeManager();\n this.scrollSyncManager = new ScrollSyncManager();\n this.mouseEventManager = new MouseEventManager(\n 'diff',\n pluckMouseEventOptions(\n options,\n typeof options.hunkSeparators === 'function' ||\n (options.hunkSeparators ?? 'line-info') === 'line-info'\n ? this.handleExpandHunk\n : undefined\n )\n );\n this.lineSelectionManager = new LineSelectionManager(\n pluckLineSelectionOptions(options)\n );\n this.workerManager?.subscribeToThemeChanges(this);\n this.enabled = true;\n }\n\n private handleHighlightRender = (): void => {\n this.rerender();\n };\n\n // FIXME(amadeus): This is a bit of a looming issue that I'll need to resolve:\n // * Do we publicly allow merging of options or do we have individualized setters?\n // * When setting new options, we need to figure out what settings require a\n // re-render and which can just be applied more elegantly\n // * There's also an issue of options that live here on the File class and\n // those that live on the Hunk class, and it's a bit of an issue with passing\n // settings down and mirroring them (not great...)\n setOptions(options: FileDiffOptions<LAnnotation> | undefined): void {\n if (options == null) return;\n this.options = options;\n this.hunksRenderer.setOptions({\n ...this.options,\n hunkSeparators:\n typeof options.hunkSeparators === 'function'\n ? 'custom'\n : options.hunkSeparators,\n });\n this.mouseEventManager.setOptions(\n pluckMouseEventOptions(\n options,\n typeof options.hunkSeparators === 'function' ||\n (options.hunkSeparators ?? 'line-info') === 'line-info'\n ? this.handleExpandHunk\n : undefined\n )\n );\n this.lineSelectionManager.setOptions(pluckLineSelectionOptions(options));\n }\n\n private mergeOptions(options: Partial<FileDiffOptions<LAnnotation>>): void {\n this.options = { ...this.options, ...options };\n }\n\n setThemeType(themeType: ThemeTypes): void {\n if ((this.options.themeType ?? 'system') === themeType) {\n return;\n }\n this.mergeOptions({ themeType });\n this.hunksRenderer.setThemeType(themeType);\n\n if (this.headerElement != null) {\n if (themeType === 'system') {\n delete this.headerElement.dataset.themeType;\n } else {\n this.headerElement.dataset.themeType = themeType;\n }\n }\n\n // Update pre element theme mode\n if (this.pre != null) {\n switch (themeType) {\n case 'system':\n delete this.pre.dataset.themeType;\n break;\n case 'light':\n case 'dark':\n this.pre.dataset.themeType = themeType;\n break;\n }\n }\n }\n\n getHoveredLine = (): GetHoveredLineResult<'diff'> | undefined => {\n return this.mouseEventManager.getHoveredLine();\n };\n\n setLineAnnotations(lineAnnotations: DiffLineAnnotation<LAnnotation>[]): void {\n this.lineAnnotations = lineAnnotations;\n }\n\n setSelectedLines(range: SelectedLineRange | null): void {\n this.lineSelectionManager.setSelection(range);\n }\n\n cleanUp(recycle: boolean = false): void {\n this.resizeManager.cleanUp();\n this.mouseEventManager.cleanUp();\n this.scrollSyncManager.cleanUp();\n this.lineSelectionManager.cleanUp();\n this.workerManager?.unsubscribeToThemeChanges(this);\n this.renderRange = undefined;\n\n // Clean up the elements\n if (!this.isContainerManaged) {\n this.fileContainer?.parentNode?.removeChild(this.fileContainer);\n }\n if (this.fileContainer?.shadowRoot != null) {\n // Manually help garbage collection\n this.fileContainer.shadowRoot.innerHTML = '';\n }\n this.fileContainer = undefined;\n // Manually help garbage collection\n if (this.pre != null) {\n this.pre.innerHTML = '';\n this.pre = undefined;\n }\n this.codeUnified = undefined;\n this.codeDeletions = undefined;\n this.codeAdditions = undefined;\n this.appliedPreAttributes = undefined;\n this.headerElement = undefined;\n this.lastRenderedHeaderHTML = undefined;\n this.errorWrapper = undefined;\n this.spriteSVG = undefined;\n\n if (recycle) {\n this.hunksRenderer.recycle();\n } else {\n this.hunksRenderer.cleanUp();\n this.workerManager = undefined;\n // Clean up the data\n this.fileDiff = undefined;\n this.deletionFile = undefined;\n this.additionFile = undefined;\n }\n\n this.enabled = false;\n }\n\n virtualizedSetup(): void {\n this.enabled = true;\n this.workerManager?.subscribeToThemeChanges(this);\n }\n\n hydrate(props: FileDiffHydrationProps<LAnnotation>): void {\n const { fileContainer, prerenderedHTML } = props;\n prerenderHTMLIfNecessary(fileContainer, prerenderedHTML);\n for (const element of fileContainer.shadowRoot?.children ?? []) {\n if (element instanceof SVGElement) {\n this.spriteSVG = element;\n continue;\n }\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (element instanceof HTMLPreElement) {\n this.pre = element;\n for (const code of element.children) {\n if (\n !(code instanceof HTMLElement) ||\n code.tagName.toLowerCase() !== 'code'\n ) {\n continue;\n }\n if ('deletions' in code.dataset) {\n this.codeDeletions = code;\n }\n if ('additions' in code.dataset) {\n this.codeAdditions = code;\n }\n if ('unified' in code.dataset) {\n this.codeUnified = code;\n }\n }\n continue;\n }\n if ('diffsHeader' in element.dataset) {\n this.headerElement = element;\n continue;\n }\n if (\n element instanceof HTMLStyleElement &&\n element.hasAttribute(UNSAFE_CSS_ATTRIBUTE)\n ) {\n this.unsafeCSSStyle = element;\n continue;\n }\n }\n if (this.pre != null) {\n this.syncCodeNodesFromPre(this.pre);\n }\n // If we have no pre tag, then we should render\n if (this.pre == null) {\n this.render(props);\n }\n // Otherwise orchestrate our setup\n else {\n const { lineAnnotations, oldFile, newFile, fileDiff } = props;\n this.fileContainer = fileContainer;\n delete this.pre.dataset.dehydrated;\n\n this.lineAnnotations = lineAnnotations ?? this.lineAnnotations;\n this.additionFile = newFile;\n this.deletionFile = oldFile;\n this.fileDiff =\n fileDiff ??\n (oldFile != null && newFile != null\n ? parseDiffFromFile(oldFile, newFile)\n : undefined);\n\n this.hunksRenderer.hydrate(this.fileDiff);\n // FIXME(amadeus): not sure how to handle this yet...\n // this.renderSeparators();\n this.renderAnnotations();\n this.renderHoverUtility();\n this.injectUnsafeCSS();\n this.mouseEventManager.setup(this.pre);\n this.lineSelectionManager.setup(this.pre);\n if ((this.options.overflow ?? 'scroll') === 'scroll') {\n this.resizeManager.setup(this.pre);\n if ((this.options.diffStyle ?? 'split') === 'split') {\n this.scrollSyncManager.setup(\n this.pre,\n this.codeDeletions,\n this.codeAdditions\n );\n }\n }\n }\n }\n\n rerender(): void {\n if (\n !this.enabled ||\n (this.fileDiff == null &&\n this.additionFile == null &&\n this.deletionFile == null)\n ) {\n return;\n }\n this.render({\n oldFile: this.deletionFile,\n newFile: this.additionFile,\n fileDiff: this.fileDiff,\n forceRender: true,\n renderRange: this.renderRange,\n });\n }\n\n handleExpandHunk = (\n hunkIndex: number,\n direction: ExpansionDirections\n ): void => {\n this.expandHunk(hunkIndex, direction);\n };\n\n expandHunk(hunkIndex: number, direction: ExpansionDirections): void {\n this.hunksRenderer.expandHunk(hunkIndex, direction);\n this.rerender();\n }\n\n render({\n oldFile,\n newFile,\n fileDiff,\n forceRender = false,\n lineAnnotations,\n fileContainer,\n containerWrapper,\n renderRange,\n }: FileDiffRenderProps<LAnnotation>): void {\n if (!this.enabled) {\n // NOTE(amadeus): May need to be a silent failure? Making it loud for now\n // to better understand it\n throw new Error(\n 'FileDiff.render: attempting to call render after cleaned up'\n );\n }\n const filesDidChange =\n oldFile != null &&\n newFile != null &&\n (!areFilesEqual(oldFile, this.deletionFile) ||\n !areFilesEqual(newFile, this.additionFile));\n const annotationsChanged =\n lineAnnotations != null &&\n (lineAnnotations.length > 0 || this.lineAnnotations.length > 0)\n ? lineAnnotations !== this.lineAnnotations\n : false;\n if (\n areRenderRangesEqual(renderRange, this.renderRange) &&\n !forceRender &&\n !annotationsChanged &&\n // If using the fileDiff API, lets check to see if they are equal to\n // avoid doing work\n ((fileDiff != null && fileDiff === this.fileDiff) ||\n // If using the oldFile/newFile API then lets check to see if they are\n // equal\n (fileDiff == null && !filesDidChange))\n ) {\n return;\n }\n\n this.renderRange = renderRange;\n this.deletionFile = oldFile;\n this.additionFile = newFile;\n if (fileDiff != null) {\n this.fileDiff = fileDiff;\n } else if (oldFile != null && newFile != null && filesDidChange) {\n this.fileDiff = parseDiffFromFile(oldFile, newFile);\n }\n\n if (lineAnnotations != null) {\n this.setLineAnnotations(lineAnnotations);\n }\n if (this.fileDiff == null) {\n return;\n }\n this.hunksRenderer.setOptions({\n ...this.options,\n hunkSeparators:\n typeof this.options.hunkSeparators === 'function'\n ? 'custom'\n : this.options.hunkSeparators,\n });\n\n this.hunksRenderer.setLineAnnotations(this.lineAnnotations);\n\n const { disableFileHeader = false, disableErrorHandling = false } =\n this.options;\n\n if (disableFileHeader) {\n // Remove existing header from DOM\n if (this.headerElement != null) {\n this.headerElement.parentNode?.removeChild(this.headerElement);\n this.headerElement = undefined;\n this.lastRenderedHeaderHTML = undefined;\n }\n }\n fileContainer = this.getOrCreateFileContainer(\n fileContainer,\n containerWrapper\n );\n\n try {\n const hunksResult = this.hunksRenderer.renderDiff(\n this.fileDiff,\n renderRange\n );\n if (hunksResult == null) {\n if (this.workerManager != null && !this.workerManager.isInitialized()) {\n void this.workerManager.initialize().then(() => this.rerender());\n }\n return;\n }\n\n if (hunksResult.headerElement != null) {\n this.applyHeaderToDOM(hunksResult.headerElement, fileContainer);\n }\n if (\n hunksResult.additionsAST != null ||\n hunksResult.deletionsAST != null ||\n hunksResult.unifiedAST != null\n ) {\n const pre = this.getOrCreatePreNode(fileContainer);\n this.applyHunksToDOM(pre, hunksResult);\n } else if (this.pre != null) {\n this.pre.parentNode?.removeChild(this.pre);\n this.pre = undefined;\n }\n this.renderSeparators(hunksResult.hunkData);\n this.renderAnnotations();\n this.renderHoverUtility();\n } catch (error: unknown) {\n if (disableErrorHandling) {\n throw error;\n }\n console.error(error);\n if (error instanceof Error) {\n this.applyErrorToDOM(error, fileContainer);\n }\n }\n }\n\n private renderSeparators(hunkData: HunkData[]): void {\n const { hunkSeparators } = this.options;\n if (\n this.isContainerManaged ||\n this.fileContainer == null ||\n typeof hunkSeparators !== 'function'\n ) {\n for (const { element } of this.separatorCache.values()) {\n element.parentNode?.removeChild(element);\n }\n this.separatorCache.clear();\n return;\n }\n const staleSeparators = new Map(this.separatorCache);\n for (const hunk of hunkData) {\n const id = hunk.slotName;\n let cache = this.separatorCache.get(id);\n if (cache == null || !areHunkDataEqual(hunk, cache.hunkData)) {\n cache?.element.parentNode?.removeChild(cache.element);\n const element = document.createElement('div');\n element.style.display = 'contents';\n element.slot = hunk.slotName;\n element.appendChild(hunkSeparators(hunk, this));\n this.fileContainer.appendChild(element);\n cache = { element, hunkData: hunk };\n this.separatorCache.set(id, cache);\n }\n staleSeparators.delete(id);\n }\n for (const [id, { element }] of staleSeparators.entries()) {\n this.separatorCache.delete(id);\n element.parentNode?.removeChild(element);\n }\n }\n\n private renderAnnotations(): void {\n if (this.isContainerManaged || this.fileContainer == null) {\n for (const { element } of this.annotationCache.values()) {\n element.parentNode?.removeChild(element);\n }\n this.annotationCache.clear();\n return;\n }\n const staleAnnotations = new Map(this.annotationCache);\n const { renderAnnotation } = this.options;\n if (renderAnnotation != null && this.lineAnnotations.length > 0) {\n for (const [index, annotation] of this.lineAnnotations.entries()) {\n const id = `${index}-${getLineAnnotationName(annotation)}`;\n let cache = this.annotationCache.get(id);\n if (\n cache == null ||\n !areDiffLineAnnotationsEqual(annotation, cache.annotation)\n ) {\n cache?.element.parentElement?.removeChild(cache.element);\n const content = renderAnnotation(annotation);\n // If we can't render anything, then we should not render anything\n // and clear the annotation cache if necessary.\n if (content == null) {\n continue;\n }\n cache = {\n element: createAnnotationWrapperNode(\n getLineAnnotationName(annotation)\n ),\n annotation,\n };\n cache.element.appendChild(content);\n this.fileContainer.appendChild(cache.element);\n this.annotationCache.set(id, cache);\n }\n staleAnnotations.delete(id);\n }\n }\n for (const [id, { element }] of staleAnnotations.entries()) {\n this.annotationCache.delete(id);\n element.parentNode?.removeChild(element);\n }\n }\n\n private renderHoverUtility() {\n const { renderHoverUtility } = this.options;\n if (this.fileContainer == null || renderHoverUtility == null) {\n return;\n }\n const element = renderHoverUtility(this.mouseEventManager.getHoveredLine);\n if (element != null && this.hoverContent != null) {\n return;\n } else if (element == null) {\n this.hoverContent?.parentNode?.removeChild(this.hoverContent);\n this.hoverContent = undefined;\n return;\n }\n this.hoverContent = createHoverContentNode();\n this.hoverContent.appendChild(element);\n this.fileContainer.appendChild(this.hoverContent);\n }\n\n getOrCreateFileContainer(\n fileContainer?: HTMLElement,\n parentNode?: HTMLElement\n ): HTMLElement {\n const previousContainer = this.fileContainer;\n this.fileContainer =\n fileContainer ??\n this.fileContainer ??\n document.createElement(DIFFS_TAG_NAME);\n // NOTE(amadeus): If the container changes, we should reset the rendered\n // HTML\n if (previousContainer != null && previousContainer !== this.fileContainer) {\n this.lastRenderedHeaderHTML = undefined;\n this.headerElement = undefined;\n }\n if (parentNode != null && this.fileContainer.parentNode !== parentNode) {\n parentNode.appendChild(this.fileContainer);\n }\n if (this.spriteSVG == null) {\n const fragment = document.createElement('div');\n fragment.innerHTML = SVGSpriteSheet;\n const firstChild = fragment.firstChild;\n if (firstChild instanceof SVGElement) {\n this.spriteSVG = firstChild;\n this.fileContainer.shadowRoot?.appendChild(this.spriteSVG);\n }\n }\n return this.fileContainer;\n }\n\n getFileContainer(): HTMLElement | undefined {\n return this.fileContainer;\n }\n\n private getOrCreatePreNode(container: HTMLElement): HTMLPreElement {\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n // If we haven't created a pre element yet, lets go ahead and do that\n if (this.pre == null) {\n this.pre = document.createElement('pre');\n this.appliedPreAttributes = undefined;\n this.codeUnified = undefined;\n this.codeDeletions = undefined;\n this.codeAdditions = undefined;\n shadowRoot.appendChild(this.pre);\n }\n // If we have a new parent container for the pre element, lets go ahead and\n // move it into the new container\n else if (this.pre.parentNode !== shadowRoot) {\n shadowRoot.appendChild(this.pre);\n this.appliedPreAttributes = undefined;\n }\n return this.pre;\n }\n\n private syncCodeNodesFromPre(pre: HTMLPreElement): void {\n this.codeUnified = undefined;\n this.codeDeletions = undefined;\n this.codeAdditions = undefined;\n for (const child of Array.from(pre.children)) {\n if (!(child instanceof HTMLElement)) {\n continue;\n }\n if ('unified' in child.dataset) {\n this.codeUnified = child;\n } else if ('deletions' in child.dataset) {\n this.codeDeletions = child;\n } else if ('additions' in child.dataset) {\n this.codeAdditions = child;\n }\n }\n }\n\n private applyHeaderToDOM(\n headerAST: HASTElement,\n container: HTMLElement\n ): void {\n this.cleanupErrorWrapper();\n const headerHTML = toHtml(headerAST);\n if (headerHTML !== this.lastRenderedHeaderHTML) {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = headerHTML;\n const newHeader = tempDiv.firstElementChild;\n if (!(newHeader instanceof HTMLElement)) {\n return;\n }\n if (this.headerElement != null) {\n container.shadowRoot?.replaceChild(newHeader, this.headerElement);\n } else {\n container.shadowRoot?.prepend(newHeader);\n }\n this.headerElement = newHeader;\n this.lastRenderedHeaderHTML = headerHTML;\n }\n\n if (this.isContainerManaged) return;\n\n const { renderHeaderMetadata } = this.options;\n if (this.headerMetadata != null) {\n this.headerMetadata.parentNode?.removeChild(this.headerMetadata);\n }\n const content =\n renderHeaderMetadata?.({\n deletionFile: this.deletionFile,\n additionFile: this.additionFile,\n fileDiff: this.fileDiff,\n }) ?? undefined;\n if (content != null) {\n this.headerMetadata = document.createElement('div');\n this.headerMetadata.slot = HEADER_METADATA_SLOT_ID;\n if (content instanceof Element) {\n this.headerMetadata.appendChild(content);\n } else {\n this.headerMetadata.innerText = `${content}`;\n }\n container.appendChild(this.headerMetadata);\n }\n }\n\n private injectUnsafeCSS(): void {\n if (this.fileContainer?.shadowRoot == null) {\n return;\n }\n const { unsafeCSS } = this.options;\n\n if (unsafeCSS == null || unsafeCSS === '') {\n return;\n }\n\n // Create or update the style element\n if (this.unsafeCSSStyle == null) {\n this.unsafeCSSStyle = createUnsafeCSSStyleNode();\n this.fileContainer.shadowRoot.appendChild(this.unsafeCSSStyle);\n }\n // Wrap in @layer unsafe to match SSR behavior\n this.unsafeCSSStyle.innerText = wrapUnsafeCSS(unsafeCSS);\n }\n\n private applyHunksToDOM(\n pre: HTMLPreElement,\n result: HunksRenderResult\n ): void {\n this.cleanupErrorWrapper();\n this.applyPreNodeAttributes(pre, result);\n\n let shouldReplace = false;\n let codeDeletions: HTMLElement | undefined;\n let codeAdditions: HTMLElement | undefined;\n // Create code elements and insert HTML content\n const codeElements: HTMLElement[] = [];\n if (result.unifiedAST != null) {\n shouldReplace =\n this.codeUnified == null ||\n this.codeAdditions != null ||\n this.codeDeletions != null;\n this.codeDeletions = undefined;\n this.codeAdditions = undefined;\n if (result.unifiedAST.length > 0) {\n this.codeUnified = getOrCreateCodeNode({\n code: this.codeUnified,\n columnType: 'unified',\n });\n this.codeUnified.innerHTML = this.hunksRenderer.renderPartialHTML(\n result.unifiedAST\n );\n codeElements.push(this.codeUnified);\n } else {\n this.codeUnified = undefined;\n }\n } else {\n if (result.deletionsAST != null) {\n shouldReplace = this.codeDeletions == null || this.codeUnified != null;\n this.codeUnified = undefined;\n if (result.deletionsAST.length > 0) {\n this.codeDeletions = getOrCreateCodeNode({\n code: this.codeDeletions,\n columnType: 'deletions',\n });\n this.codeDeletions.innerHTML = this.hunksRenderer.renderPartialHTML(\n result.deletionsAST\n );\n codeElements.push(this.codeDeletions);\n } else {\n this.codeDeletions = undefined;\n }\n }\n if (result.additionsAST != null) {\n shouldReplace =\n shouldReplace ||\n this.codeAdditions == null ||\n this.codeUnified != null;\n this.codeUnified = undefined;\n if (result.additionsAST.length > 0) {\n this.codeAdditions = getOrCreateCodeNode({\n code: this.codeAdditions,\n columnType: 'additions',\n });\n this.codeAdditions.innerHTML = this.hunksRenderer.renderPartialHTML(\n result.additionsAST\n );\n codeElements.push(this.codeAdditions);\n } else {\n this.codeAdditions = undefined;\n }\n }\n }\n\n if (codeElements.length === 0) {\n pre.textContent = '';\n } else if (shouldReplace) {\n pre.replaceChildren(...codeElements);\n }\n\n this.injectUnsafeCSS();\n\n this.mouseEventManager.setup(pre);\n this.lineSelectionManager.setup(pre);\n if ((this.options.overflow ?? 'scroll') === 'scroll') {\n this.resizeManager.setup(pre);\n if ((this.options.diffStyle ?? 'split') === 'split') {\n this.scrollSyncManager.setup(pre, codeDeletions, codeAdditions);\n } else {\n this.scrollSyncManager.cleanUp();\n }\n } else {\n this.resizeManager.cleanUp();\n this.scrollSyncManager.cleanUp();\n }\n }\n\n private applyPreNodeAttributes(\n pre: HTMLPreElement,\n {\n themeStyles,\n baseThemeType,\n additionsAST,\n deletionsAST,\n totalLines,\n }: HunksRenderResult\n ): void {\n const {\n diffIndicators = 'bars',\n disableBackground = false,\n disableLineNumbers = false,\n overflow = 'scroll',\n themeType = 'system',\n diffStyle = 'split',\n } = this.options;\n const preProperties: PrePropertiesConfig = {\n diffIndicators,\n disableBackground,\n disableLineNumbers,\n overflow,\n split:\n diffStyle === 'unified'\n ? false\n : additionsAST != null && deletionsAST != null,\n themeStyles,\n themeType: baseThemeType ?? themeType,\n totalLines,\n };\n if (arePrePropertiesEqual(preProperties, this.appliedPreAttributes)) {\n return;\n }\n setPreNodeProperties(pre, preProperties);\n this.appliedPreAttributes = preProperties;\n }\n\n private applyErrorToDOM(error: Error, container: HTMLElement) {\n this.cleanupErrorWrapper();\n const pre = this.getOrCreatePreNode(container);\n pre.innerHTML = '';\n pre.parentNode?.removeChild(pre);\n this.pre = undefined;\n this.appliedPreAttributes = undefined;\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n this.errorWrapper ??= document.createElement('div');\n this.errorWrapper.dataset.errorWrapper = '';\n this.errorWrapper.innerHTML = '';\n shadowRoot.appendChild(this.errorWrapper);\n const errorMessage = document.createElement('div');\n errorMessage.dataset.errorMessage = '';\n errorMessage.innerText = error.message;\n this.errorWrapper.appendChild(errorMessage);\n const errorStack = document.createElement('pre');\n errorStack.dataset.errorStack = '';\n errorStack.innerText = error.stack ?? 'No Error Stack';\n this.errorWrapper.appendChild(errorStack);\n }\n\n private cleanupErrorWrapper() {\n this.errorWrapper?.parentNode?.removeChild(this.errorWrapper);\n this.errorWrapper = undefined;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA+GA,IAAI,aAAa;AAEjB,IAAa,WAAb,MAA+C;CAG7C,OAAO,wBAAiC;CAExC,AAAS,OAAe,aAAa,EAAE;CAEvC,AAAU;CACV,AAAU;CACV,AAAU;CACV,AAAU;CACV,AAAU;CACV,AAAU;CACV,AAAU;CACV,AAAU;CAEV,AAAU;CACV,AAAU;CACV,AAAU,iCAAsD,IAAI,KAAK;CACzE,AAAU;CAEV,AAAU;CACV,AAAU;CACV,AAAU;CACV,AAAU;CACV,AAAU;CAEV,AAAU,kCACR,IAAI,KAAK;CACX,AAAU,kBAAqD,EAAE;CAEjE,AAAU;CACV,AAAU;CACV,AAAU;CACV,AAAU;CACV,AAAU;CACV,AAAU;CAEV,AAAU,UAAU;CAEpB,YACE,AAAOA,UAAwC,EAAE,OAAO,gBAAgB,EACxE,AAAUC,eACV,AAAU,qBAAqB,OAC/B;EAHO;EACG;EACA;AAEV,OAAK,gBAAgB,IAAI,kBACvB;GACE,GAAG;GACH,gBACE,OAAO,QAAQ,mBAAmB,aAC9B,WACA,QAAQ;GACf,EACD,KAAK,uBACL,KAAK,cACN;AACD,OAAK,gBAAgB,IAAI,eAAe;AACxC,OAAK,oBAAoB,IAAI,mBAAmB;AAChD,OAAK,oBAAoB,IAAI,kBAC3B,QACA,uBACE,SACA,OAAO,QAAQ,mBAAmB,eAC/B,QAAQ,kBAAkB,iBAAiB,cAC1C,KAAK,mBACL,OACL,CACF;AACD,OAAK,uBAAuB,IAAI,qBAC9B,0BAA0B,QAAQ,CACnC;AACD,OAAK,eAAe,wBAAwB,KAAK;AACjD,OAAK,UAAU;;CAGjB,AAAQ,8BAAoC;AAC1C,OAAK,UAAU;;CAUjB,WAAW,SAAyD;AAClE,MAAI,WAAW,KAAM;AACrB,OAAK,UAAU;AACf,OAAK,cAAc,WAAW;GAC5B,GAAG,KAAK;GACR,gBACE,OAAO,QAAQ,mBAAmB,aAC9B,WACA,QAAQ;GACf,CAAC;AACF,OAAK,kBAAkB,WACrB,uBACE,SACA,OAAO,QAAQ,mBAAmB,eAC/B,QAAQ,kBAAkB,iBAAiB,cAC1C,KAAK,mBACL,OACL,CACF;AACD,OAAK,qBAAqB,WAAW,0BAA0B,QAAQ,CAAC;;CAG1E,AAAQ,aAAa,SAAsD;AACzE,OAAK,UAAU;GAAE,GAAG,KAAK;GAAS,GAAG;GAAS;;CAGhD,aAAa,WAA6B;AACxC,OAAK,KAAK,QAAQ,aAAa,cAAc,UAC3C;AAEF,OAAK,aAAa,EAAE,WAAW,CAAC;AAChC,OAAK,cAAc,aAAa,UAAU;AAE1C,MAAI,KAAK,iBAAiB,KACxB,KAAI,cAAc,SAChB,QAAO,KAAK,cAAc,QAAQ;MAElC,MAAK,cAAc,QAAQ,YAAY;AAK3C,MAAI,KAAK,OAAO,KACd,SAAQ,WAAR;GACE,KAAK;AACH,WAAO,KAAK,IAAI,QAAQ;AACxB;GACF,KAAK;GACL,KAAK;AACH,SAAK,IAAI,QAAQ,YAAY;AAC7B;;;CAKR,uBAAiE;AAC/D,SAAO,KAAK,kBAAkB,gBAAgB;;CAGhD,mBAAmB,iBAA0D;AAC3E,OAAK,kBAAkB;;CAGzB,iBAAiB,OAAuC;AACtD,OAAK,qBAAqB,aAAa,MAAM;;CAG/C,QAAQ,UAAmB,OAAa;AACtC,OAAK,cAAc,SAAS;AAC5B,OAAK,kBAAkB,SAAS;AAChC,OAAK,kBAAkB,SAAS;AAChC,OAAK,qBAAqB,SAAS;AACnC,OAAK,eAAe,0BAA0B,KAAK;AACnD,OAAK,cAAc;AAGnB,MAAI,CAAC,KAAK,mBACR,MAAK,eAAe,YAAY,YAAY,KAAK,cAAc;AAEjE,MAAI,KAAK,eAAe,cAAc,KAEpC,MAAK,cAAc,WAAW,YAAY;AAE5C,OAAK,gBAAgB;AAErB,MAAI,KAAK,OAAO,MAAM;AACpB,QAAK,IAAI,YAAY;AACrB,QAAK,MAAM;;AAEb,OAAK,cAAc;AACnB,OAAK,gBAAgB;AACrB,OAAK,gBAAgB;AACrB,OAAK,uBAAuB;AAC5B,OAAK,gBAAgB;AACrB,OAAK,yBAAyB;AAC9B,OAAK,eAAe;AACpB,OAAK,YAAY;AAEjB,MAAI,QACF,MAAK,cAAc,SAAS;OACvB;AACL,QAAK,cAAc,SAAS;AAC5B,QAAK,gBAAgB;AAErB,QAAK,WAAW;AAChB,QAAK,eAAe;AACpB,QAAK,eAAe;;AAGtB,OAAK,UAAU;;CAGjB,mBAAyB;AACvB,OAAK,UAAU;AACf,OAAK,eAAe,wBAAwB,KAAK;;CAGnD,QAAQ,OAAkD;EACxD,MAAM,EAAE,eAAe,oBAAoB;AAC3C,2BAAyB,eAAe,gBAAgB;AACxD,OAAK,MAAM,WAAW,cAAc,YAAY,YAAY,EAAE,EAAE;AAC9D,OAAI,mBAAmB,YAAY;AACjC,SAAK,YAAY;AACjB;;AAEF,OAAI,EAAE,mBAAmB,aACvB;AAEF,OAAI,mBAAmB,gBAAgB;AACrC,SAAK,MAAM;AACX,SAAK,MAAM,QAAQ,QAAQ,UAAU;AACnC,SACE,EAAE,gBAAgB,gBAClB,KAAK,QAAQ,aAAa,KAAK,OAE/B;AAEF,SAAI,eAAe,KAAK,QACtB,MAAK,gBAAgB;AAEvB,SAAI,eAAe,KAAK,QACtB,MAAK,gBAAgB;AAEvB,SAAI,aAAa,KAAK,QACpB,MAAK,cAAc;;AAGvB;;AAEF,OAAI,iBAAiB,QAAQ,SAAS;AACpC,SAAK,gBAAgB;AACrB;;AAEF,OACE,mBAAmB,oBACnB,QAAQ,aAAa,qBAAqB,EAC1C;AACA,SAAK,iBAAiB;AACtB;;;AAGJ,MAAI,KAAK,OAAO,KACd,MAAK,qBAAqB,KAAK,IAAI;AAGrC,MAAI,KAAK,OAAO,KACd,MAAK,OAAO,MAAM;OAGf;GACH,MAAM,EAAE,iBAAiB,SAAS,SAAS,aAAa;AACxD,QAAK,gBAAgB;AACrB,UAAO,KAAK,IAAI,QAAQ;AAExB,QAAK,kBAAkB,mBAAmB,KAAK;AAC/C,QAAK,eAAe;AACpB,QAAK,eAAe;AACpB,QAAK,WACH,aACC,WAAW,QAAQ,WAAW,OAC3B,kBAAkB,SAAS,QAAQ,GACnC;AAEN,QAAK,cAAc,QAAQ,KAAK,SAAS;AAGzC,QAAK,mBAAmB;AACxB,QAAK,oBAAoB;AACzB,QAAK,iBAAiB;AACtB,QAAK,kBAAkB,MAAM,KAAK,IAAI;AACtC,QAAK,qBAAqB,MAAM,KAAK,IAAI;AACzC,QAAK,KAAK,QAAQ,YAAY,cAAc,UAAU;AACpD,SAAK,cAAc,MAAM,KAAK,IAAI;AAClC,SAAK,KAAK,QAAQ,aAAa,aAAa,QAC1C,MAAK,kBAAkB,MACrB,KAAK,KACL,KAAK,eACL,KAAK,cACN;;;;CAMT,WAAiB;AACf,MACE,CAAC,KAAK,WACL,KAAK,YAAY,QAChB,KAAK,gBAAgB,QACrB,KAAK,gBAAgB,KAEvB;AAEF,OAAK,OAAO;GACV,SAAS,KAAK;GACd,SAAS,KAAK;GACd,UAAU,KAAK;GACf,aAAa;GACb,aAAa,KAAK;GACnB,CAAC;;CAGJ,oBACE,WACA,cACS;AACT,OAAK,WAAW,WAAW,UAAU;;CAGvC,WAAW,WAAmB,WAAsC;AAClE,OAAK,cAAc,WAAW,WAAW,UAAU;AACnD,OAAK,UAAU;;CAGjB,OAAO,EACL,SACA,SACA,UACA,cAAc,OACd,iBACA,eACA,kBACA,eACyC;AACzC,MAAI,CAAC,KAAK,QAGR,OAAM,IAAI,MACR,8DACD;EAEH,MAAM,iBACJ,WAAW,QACX,WAAW,SACV,CAAC,cAAc,SAAS,KAAK,aAAa,IACzC,CAAC,cAAc,SAAS,KAAK,aAAa;EAC9C,MAAM,qBACJ,mBAAmB,SAClB,gBAAgB,SAAS,KAAK,KAAK,gBAAgB,SAAS,KACzD,oBAAoB,KAAK,kBACzB;AACN,MACE,qBAAqB,aAAa,KAAK,YAAY,IACnD,CAAC,eACD,CAAC,uBAGC,YAAY,QAAQ,aAAa,KAAK,YAGrC,YAAY,QAAQ,CAAC,gBAExB;AAGF,OAAK,cAAc;AACnB,OAAK,eAAe;AACpB,OAAK,eAAe;AACpB,MAAI,YAAY,KACd,MAAK,WAAW;WACP,WAAW,QAAQ,WAAW,QAAQ,eAC/C,MAAK,WAAW,kBAAkB,SAAS,QAAQ;AAGrD,MAAI,mBAAmB,KACrB,MAAK,mBAAmB,gBAAgB;AAE1C,MAAI,KAAK,YAAY,KACnB;AAEF,OAAK,cAAc,WAAW;GAC5B,GAAG,KAAK;GACR,gBACE,OAAO,KAAK,QAAQ,mBAAmB,aACnC,WACA,KAAK,QAAQ;GACpB,CAAC;AAEF,OAAK,cAAc,mBAAmB,KAAK,gBAAgB;EAE3D,MAAM,EAAE,oBAAoB,OAAO,uBAAuB,UACxD,KAAK;AAEP,MAAI,mBAEF;OAAI,KAAK,iBAAiB,MAAM;AAC9B,SAAK,cAAc,YAAY,YAAY,KAAK,cAAc;AAC9D,SAAK,gBAAgB;AACrB,SAAK,yBAAyB;;;AAGlC,kBAAgB,KAAK,yBACnB,eACA,iBACD;AAED,MAAI;GACF,MAAM,cAAc,KAAK,cAAc,WACrC,KAAK,UACL,YACD;AACD,OAAI,eAAe,MAAM;AACvB,QAAI,KAAK,iBAAiB,QAAQ,CAAC,KAAK,cAAc,eAAe,CACnE,CAAK,KAAK,cAAc,YAAY,CAAC,WAAW,KAAK,UAAU,CAAC;AAElE;;AAGF,OAAI,YAAY,iBAAiB,KAC/B,MAAK,iBAAiB,YAAY,eAAe,cAAc;AAEjE,OACE,YAAY,gBAAgB,QAC5B,YAAY,gBAAgB,QAC5B,YAAY,cAAc,MAC1B;IACA,MAAM,MAAM,KAAK,mBAAmB,cAAc;AAClD,SAAK,gBAAgB,KAAK,YAAY;cAC7B,KAAK,OAAO,MAAM;AAC3B,SAAK,IAAI,YAAY,YAAY,KAAK,IAAI;AAC1C,SAAK,MAAM;;AAEb,QAAK,iBAAiB,YAAY,SAAS;AAC3C,QAAK,mBAAmB;AACxB,QAAK,oBAAoB;WAClBC,OAAgB;AACvB,OAAI,qBACF,OAAM;AAER,WAAQ,MAAM,MAAM;AACpB,OAAI,iBAAiB,MACnB,MAAK,gBAAgB,OAAO,cAAc;;;CAKhD,AAAQ,iBAAiB,UAA4B;EACnD,MAAM,EAAE,mBAAmB,KAAK;AAChC,MACE,KAAK,sBACL,KAAK,iBAAiB,QACtB,OAAO,mBAAmB,YAC1B;AACA,QAAK,MAAM,EAAE,aAAa,KAAK,eAAe,QAAQ,CACpD,SAAQ,YAAY,YAAY,QAAQ;AAE1C,QAAK,eAAe,OAAO;AAC3B;;EAEF,MAAM,kBAAkB,IAAI,IAAI,KAAK,eAAe;AACpD,OAAK,MAAM,QAAQ,UAAU;GAC3B,MAAM,KAAK,KAAK;GAChB,IAAI,QAAQ,KAAK,eAAe,IAAI,GAAG;AACvC,OAAI,SAAS,QAAQ,CAAC,iBAAiB,MAAM,MAAM,SAAS,EAAE;AAC5D,WAAO,QAAQ,YAAY,YAAY,MAAM,QAAQ;IACrD,MAAM,UAAU,SAAS,cAAc,MAAM;AAC7C,YAAQ,MAAM,UAAU;AACxB,YAAQ,OAAO,KAAK;AACpB,YAAQ,YAAY,eAAe,MAAM,KAAK,CAAC;AAC/C,SAAK,cAAc,YAAY,QAAQ;AACvC,YAAQ;KAAE;KAAS,UAAU;KAAM;AACnC,SAAK,eAAe,IAAI,IAAI,MAAM;;AAEpC,mBAAgB,OAAO,GAAG;;AAE5B,OAAK,MAAM,CAAC,IAAI,EAAE,cAAc,gBAAgB,SAAS,EAAE;AACzD,QAAK,eAAe,OAAO,GAAG;AAC9B,WAAQ,YAAY,YAAY,QAAQ;;;CAI5C,AAAQ,oBAA0B;AAChC,MAAI,KAAK,sBAAsB,KAAK,iBAAiB,MAAM;AACzD,QAAK,MAAM,EAAE,aAAa,KAAK,gBAAgB,QAAQ,CACrD,SAAQ,YAAY,YAAY,QAAQ;AAE1C,QAAK,gBAAgB,OAAO;AAC5B;;EAEF,MAAM,mBAAmB,IAAI,IAAI,KAAK,gBAAgB;EACtD,MAAM,EAAE,qBAAqB,KAAK;AAClC,MAAI,oBAAoB,QAAQ,KAAK,gBAAgB,SAAS,EAC5D,MAAK,MAAM,CAAC,OAAO,eAAe,KAAK,gBAAgB,SAAS,EAAE;GAChE,MAAM,KAAK,GAAG,MAAM,GAAG,sBAAsB,WAAW;GACxD,IAAI,QAAQ,KAAK,gBAAgB,IAAI,GAAG;AACxC,OACE,SAAS,QACT,CAAC,4BAA4B,YAAY,MAAM,WAAW,EAC1D;AACA,WAAO,QAAQ,eAAe,YAAY,MAAM,QAAQ;IACxD,MAAM,UAAU,iBAAiB,WAAW;AAG5C,QAAI,WAAW,KACb;AAEF,YAAQ;KACN,SAAS,4BACP,sBAAsB,WAAW,CAClC;KACD;KACD;AACD,UAAM,QAAQ,YAAY,QAAQ;AAClC,SAAK,cAAc,YAAY,MAAM,QAAQ;AAC7C,SAAK,gBAAgB,IAAI,IAAI,MAAM;;AAErC,oBAAiB,OAAO,GAAG;;AAG/B,OAAK,MAAM,CAAC,IAAI,EAAE,cAAc,iBAAiB,SAAS,EAAE;AAC1D,QAAK,gBAAgB,OAAO,GAAG;AAC/B,WAAQ,YAAY,YAAY,QAAQ;;;CAI5C,AAAQ,qBAAqB;EAC3B,MAAM,EAAE,uBAAuB,KAAK;AACpC,MAAI,KAAK,iBAAiB,QAAQ,sBAAsB,KACtD;EAEF,MAAM,UAAU,mBAAmB,KAAK,kBAAkB,eAAe;AACzE,MAAI,WAAW,QAAQ,KAAK,gBAAgB,KAC1C;WACS,WAAW,MAAM;AAC1B,QAAK,cAAc,YAAY,YAAY,KAAK,aAAa;AAC7D,QAAK,eAAe;AACpB;;AAEF,OAAK,eAAe,wBAAwB;AAC5C,OAAK,aAAa,YAAY,QAAQ;AACtC,OAAK,cAAc,YAAY,KAAK,aAAa;;CAGnD,yBACE,eACA,YACa;EACb,MAAM,oBAAoB,KAAK;AAC/B,OAAK,gBACH,iBACA,KAAK,iBACL,SAAS,cAAc,eAAe;AAGxC,MAAI,qBAAqB,QAAQ,sBAAsB,KAAK,eAAe;AACzE,QAAK,yBAAyB;AAC9B,QAAK,gBAAgB;;AAEvB,MAAI,cAAc,QAAQ,KAAK,cAAc,eAAe,WAC1D,YAAW,YAAY,KAAK,cAAc;AAE5C,MAAI,KAAK,aAAa,MAAM;GAC1B,MAAM,WAAW,SAAS,cAAc,MAAM;AAC9C,YAAS,YAAY;GACrB,MAAM,aAAa,SAAS;AAC5B,OAAI,sBAAsB,YAAY;AACpC,SAAK,YAAY;AACjB,SAAK,cAAc,YAAY,YAAY,KAAK,UAAU;;;AAG9D,SAAO,KAAK;;CAGd,mBAA4C;AAC1C,SAAO,KAAK;;CAGd,AAAQ,mBAAmB,WAAwC;EACjE,MAAM,aACJ,UAAU,cAAc,UAAU,aAAa,EAAE,MAAM,QAAQ,CAAC;AAElE,MAAI,KAAK,OAAO,MAAM;AACpB,QAAK,MAAM,SAAS,cAAc,MAAM;AACxC,QAAK,uBAAuB;AAC5B,QAAK,cAAc;AACnB,QAAK,gBAAgB;AACrB,QAAK,gBAAgB;AACrB,cAAW,YAAY,KAAK,IAAI;aAIzB,KAAK,IAAI,eAAe,YAAY;AAC3C,cAAW,YAAY,KAAK,IAAI;AAChC,QAAK,uBAAuB;;AAE9B,SAAO,KAAK;;CAGd,AAAQ,qBAAqB,KAA2B;AACtD,OAAK,cAAc;AACnB,OAAK,gBAAgB;AACrB,OAAK,gBAAgB;AACrB,OAAK,MAAM,SAAS,MAAM,KAAK,IAAI,SAAS,EAAE;AAC5C,OAAI,EAAE,iBAAiB,aACrB;AAEF,OAAI,aAAa,MAAM,QACrB,MAAK,cAAc;YACV,eAAe,MAAM,QAC9B,MAAK,gBAAgB;YACZ,eAAe,MAAM,QAC9B,MAAK,gBAAgB;;;CAK3B,AAAQ,iBACN,WACA,WACM;AACN,OAAK,qBAAqB;EAC1B,MAAM,aAAa,OAAO,UAAU;AACpC,MAAI,eAAe,KAAK,wBAAwB;GAC9C,MAAM,UAAU,SAAS,cAAc,MAAM;AAC7C,WAAQ,YAAY;GACpB,MAAM,YAAY,QAAQ;AAC1B,OAAI,EAAE,qBAAqB,aACzB;AAEF,OAAI,KAAK,iBAAiB,KACxB,WAAU,YAAY,aAAa,WAAW,KAAK,cAAc;OAEjE,WAAU,YAAY,QAAQ,UAAU;AAE1C,QAAK,gBAAgB;AACrB,QAAK,yBAAyB;;AAGhC,MAAI,KAAK,mBAAoB;EAE7B,MAAM,EAAE,yBAAyB,KAAK;AACtC,MAAI,KAAK,kBAAkB,KACzB,MAAK,eAAe,YAAY,YAAY,KAAK,eAAe;EAElE,MAAM,UACJ,uBAAuB;GACrB,cAAc,KAAK;GACnB,cAAc,KAAK;GACnB,UAAU,KAAK;GAChB,CAAC,IAAI;AACR,MAAI,WAAW,MAAM;AACnB,QAAK,iBAAiB,SAAS,cAAc,MAAM;AACnD,QAAK,eAAe,OAAO;AAC3B,OAAI,mBAAmB,QACrB,MAAK,eAAe,YAAY,QAAQ;OAExC,MAAK,eAAe,YAAY,GAAG;AAErC,aAAU,YAAY,KAAK,eAAe;;;CAI9C,AAAQ,kBAAwB;AAC9B,MAAI,KAAK,eAAe,cAAc,KACpC;EAEF,MAAM,EAAE,cAAc,KAAK;AAE3B,MAAI,aAAa,QAAQ,cAAc,GACrC;AAIF,MAAI,KAAK,kBAAkB,MAAM;AAC/B,QAAK,iBAAiB,0BAA0B;AAChD,QAAK,cAAc,WAAW,YAAY,KAAK,eAAe;;AAGhE,OAAK,eAAe,YAAY,cAAc,UAAU;;CAG1D,AAAQ,gBACN,KACA,QACM;AACN,OAAK,qBAAqB;AAC1B,OAAK,uBAAuB,KAAK,OAAO;EAExC,IAAI,gBAAgB;EACpB,IAAIC;EACJ,IAAIC;EAEJ,MAAMC,eAA8B,EAAE;AACtC,MAAI,OAAO,cAAc,MAAM;AAC7B,mBACE,KAAK,eAAe,QACpB,KAAK,iBAAiB,QACtB,KAAK,iBAAiB;AACxB,QAAK,gBAAgB;AACrB,QAAK,gBAAgB;AACrB,OAAI,OAAO,WAAW,SAAS,GAAG;AAChC,SAAK,cAAc,oBAAoB;KACrC,MAAM,KAAK;KACX,YAAY;KACb,CAAC;AACF,SAAK,YAAY,YAAY,KAAK,cAAc,kBAC9C,OAAO,WACR;AACD,iBAAa,KAAK,KAAK,YAAY;SAEnC,MAAK,cAAc;SAEhB;AACL,OAAI,OAAO,gBAAgB,MAAM;AAC/B,oBAAgB,KAAK,iBAAiB,QAAQ,KAAK,eAAe;AAClE,SAAK,cAAc;AACnB,QAAI,OAAO,aAAa,SAAS,GAAG;AAClC,UAAK,gBAAgB,oBAAoB;MACvC,MAAM,KAAK;MACX,YAAY;MACb,CAAC;AACF,UAAK,cAAc,YAAY,KAAK,cAAc,kBAChD,OAAO,aACR;AACD,kBAAa,KAAK,KAAK,cAAc;UAErC,MAAK,gBAAgB;;AAGzB,OAAI,OAAO,gBAAgB,MAAM;AAC/B,oBACE,iBACA,KAAK,iBAAiB,QACtB,KAAK,eAAe;AACtB,SAAK,cAAc;AACnB,QAAI,OAAO,aAAa,SAAS,GAAG;AAClC,UAAK,gBAAgB,oBAAoB;MACvC,MAAM,KAAK;MACX,YAAY;MACb,CAAC;AACF,UAAK,cAAc,YAAY,KAAK,cAAc,kBAChD,OAAO,aACR;AACD,kBAAa,KAAK,KAAK,cAAc;UAErC,MAAK,gBAAgB;;;AAK3B,MAAI,aAAa,WAAW,EAC1B,KAAI,cAAc;WACT,cACT,KAAI,gBAAgB,GAAG,aAAa;AAGtC,OAAK,iBAAiB;AAEtB,OAAK,kBAAkB,MAAM,IAAI;AACjC,OAAK,qBAAqB,MAAM,IAAI;AACpC,OAAK,KAAK,QAAQ,YAAY,cAAc,UAAU;AACpD,QAAK,cAAc,MAAM,IAAI;AAC7B,QAAK,KAAK,QAAQ,aAAa,aAAa,QAC1C,MAAK,kBAAkB,MAAM,KAAK,eAAe,cAAc;OAE/D,MAAK,kBAAkB,SAAS;SAE7B;AACL,QAAK,cAAc,SAAS;AAC5B,QAAK,kBAAkB,SAAS;;;CAIpC,AAAQ,uBACN,KACA,EACE,aACA,eACA,cACA,cACA,cAEI;EACN,MAAM,EACJ,iBAAiB,QACjB,oBAAoB,OACpB,qBAAqB,OACrB,WAAW,UACX,YAAY,UACZ,YAAY,YACV,KAAK;EACT,MAAMC,gBAAqC;GACzC;GACA;GACA;GACA;GACA,OACE,cAAc,YACV,QACA,gBAAgB,QAAQ,gBAAgB;GAC9C;GACA,WAAW,iBAAiB;GAC5B;GACD;AACD,MAAI,sBAAsB,eAAe,KAAK,qBAAqB,CACjE;AAEF,uBAAqB,KAAK,cAAc;AACxC,OAAK,uBAAuB;;CAG9B,AAAQ,gBAAgB,OAAc,WAAwB;AAC5D,OAAK,qBAAqB;EAC1B,MAAM,MAAM,KAAK,mBAAmB,UAAU;AAC9C,MAAI,YAAY;AAChB,MAAI,YAAY,YAAY,IAAI;AAChC,OAAK,MAAM;AACX,OAAK,uBAAuB;EAC5B,MAAM,aACJ,UAAU,cAAc,UAAU,aAAa,EAAE,MAAM,QAAQ,CAAC;AAClE,OAAK,iBAAiB,SAAS,cAAc,MAAM;AACnD,OAAK,aAAa,QAAQ,eAAe;AACzC,OAAK,aAAa,YAAY;AAC9B,aAAW,YAAY,KAAK,aAAa;EACzC,MAAM,eAAe,SAAS,cAAc,MAAM;AAClD,eAAa,QAAQ,eAAe;AACpC,eAAa,YAAY,MAAM;AAC/B,OAAK,aAAa,YAAY,aAAa;EAC3C,MAAM,aAAa,SAAS,cAAc,MAAM;AAChD,aAAW,QAAQ,aAAa;AAChC,aAAW,YAAY,MAAM,SAAS;AACtC,OAAK,aAAa,YAAY,WAAW;;CAG3C,AAAQ,sBAAsB;AAC5B,OAAK,cAAc,YAAY,YAAY,KAAK,aAAa;AAC7D,OAAK,eAAe"}
@@ -21,7 +21,8 @@ declare const LINE_HEIGHT = 20;
21
21
  declare const DIFF_HEADER_HEIGHT = 44;
22
22
  declare const HUNK_SEPARATOR_HEIGHT = 32;
23
23
  declare const FILE_GAP = 8;
24
+ declare const DEFAULT_COLLAPSED_CONTEXT_THRESHOLD = 1;
24
25
  declare const DEFAULT_EXPANDED_REGION: HunkExpansionRegion;
25
26
  //#endregion
26
- export { 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 };
27
+ export { 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 };
27
28
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","names":["COMMIT_METADATA_SPLIT: RegExp","GIT_DIFF_FILE_BREAK_REGEX: RegExp","UNIFIED_DIFF_FILE_BREAK_REGEX: RegExp","FILE_CONTEXT_BLOB: RegExp","HUNK_HEADER: RegExp","SPLIT_WITH_NEWLINES: RegExp","FILENAME_HEADER_REGEX: RegExp","FILENAME_HEADER_REGEX_GIT: RegExp","ALTERNATE_FILE_NAMES_GIT: RegExp","INDEX_LINE_METADATA: RegExp","DEFAULT_THEMES: ThemesType","DEFAULT_EXPANDED_REGION: HunkExpansionRegion"],"sources":["../src/constants.ts"],"sourcesContent":[],"mappings":";;;cAEa;cAGAA,uBAAuB;AAHvB,cAIAC,yBAJiB,EAIU,MAJV;AAGjBD,cAEAE,6BAFuB,EAEQ,MAFR;AACvBD,cAEAE,iBAF2B,EAER,MAFQ;AAC3BD,cAEAE,WAFAF,EAEa,MAFkB;AAC/BC,cAGAE,mBAHmB,EAGE,MAHF;AACnBD,cAGAE,qBAHa,EAGU,MAHV;AAEbD,cAEAE,yBAFqB,EAEM,MAFN;AACrBD,cAGAE,wBAHuB,EAGG,MAHH;AACvBD,cAIAE,mBAJ2B,EAIN,MAJM;AAE3BD,cAKA,uBAAA,GAL0B,iBAAA;AAE1BC,cAKAC,cALqB,EAKL,UALK;AAGrB,cAOA,oBAAA,GAPA,iBAAA;AAEAA,cAMA,kBAAA,GANgB,eAAA;AAKhB,cAIA,eAAA,GAJA,EAAA;AACA,cAIA,WAAA,GAJA,EAAA;AAGA,cAEA,kBAAA,GAFA,EAAA;AACA,cAEA,qBAAA,GAFA,EAAA;AACA,cAEA,QAAA,GAFA,CAAA;AACA,cAGAC,uBAHA,EAGyB,mBAHzB"}
1
+ {"version":3,"file":"constants.d.ts","names":["COMMIT_METADATA_SPLIT: RegExp","GIT_DIFF_FILE_BREAK_REGEX: RegExp","UNIFIED_DIFF_FILE_BREAK_REGEX: RegExp","FILE_CONTEXT_BLOB: RegExp","HUNK_HEADER: RegExp","SPLIT_WITH_NEWLINES: RegExp","FILENAME_HEADER_REGEX: RegExp","FILENAME_HEADER_REGEX_GIT: RegExp","ALTERNATE_FILE_NAMES_GIT: RegExp","INDEX_LINE_METADATA: RegExp","DEFAULT_THEMES: ThemesType","DEFAULT_EXPANDED_REGION: HunkExpansionRegion"],"sources":["../src/constants.ts"],"sourcesContent":[],"mappings":";;;cAEa;cAGAA,uBAAuB;AAHvB,cAIAC,yBAJiB,EAIU,MAJV;AAGjBD,cAEAE,6BAFuB,EAEQ,MAFR;AACvBD,cAEAE,iBAF2B,EAER,MAFQ;AAC3BD,cAEAE,WAFAF,EAEa,MAFkB;AAC/BC,cAGAE,mBAHmB,EAGE,MAHF;AACnBD,cAGAE,qBAHa,EAGU,MAHV;AAEbD,cAEAE,yBAFqB,EAEM,MAFN;AACrBD,cAGAE,wBAHuB,EAGG,MAHH;AACvBD,cAIAE,mBAJ2B,EAIN,MAJM;AAE3BD,cAKA,uBAAA,GAL0B,iBAAA;AAE1BC,cAKAC,cALqB,EAKL,UALK;AAGrB,cAOA,oBAAA,GAPA,iBAAA;AAEAA,cAMA,kBAAA,GANgB,eAAA;AAKhB,cAIA,eAAA,GAJA,EAAA;AACA,cAIA,WAAA,GAJA,EAAA;AAGA,cAEA,kBAAA,GAFA,EAAA;AACA,cAEA,qBAAA,GAFA,EAAA;AACA,cAEA,QAAA,GAFA,CAAA;AACA,cAEA,mCAAA,GAFA,CAAA;AACA,cAGAC,uBAHA,EAGyB,mBAHzB"}
package/dist/constants.js CHANGED
@@ -22,11 +22,12 @@ const LINE_HEIGHT = 20;
22
22
  const DIFF_HEADER_HEIGHT = 44;
23
23
  const HUNK_SEPARATOR_HEIGHT = 32;
24
24
  const FILE_GAP = 8;
25
+ const DEFAULT_COLLAPSED_CONTEXT_THRESHOLD = 1;
25
26
  const DEFAULT_EXPANDED_REGION = Object.freeze({
26
27
  fromStart: 0,
27
28
  fromEnd: 0
28
29
  });
29
30
 
30
31
  //#endregion
31
- export { 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 };
32
+ export { 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 };
32
33
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","names":["COMMIT_METADATA_SPLIT: RegExp","GIT_DIFF_FILE_BREAK_REGEX: RegExp","UNIFIED_DIFF_FILE_BREAK_REGEX: RegExp","FILE_CONTEXT_BLOB: RegExp","HUNK_HEADER: RegExp","SPLIT_WITH_NEWLINES: RegExp","FILENAME_HEADER_REGEX: RegExp","FILENAME_HEADER_REGEX_GIT: RegExp","ALTERNATE_FILE_NAMES_GIT: RegExp","INDEX_LINE_METADATA: RegExp","DEFAULT_THEMES: ThemesType","DEFAULT_EXPANDED_REGION: HunkExpansionRegion"],"sources":["../src/constants.ts"],"sourcesContent":["import type { HunkExpansionRegion, ThemesType } from './types';\n\nexport const DIFFS_TAG_NAME = 'diffs-container' as const;\n\n// Misc patch/content parsing regexes\nexport const COMMIT_METADATA_SPLIT: RegExp = /(?=^From [a-f0-9]+ .+$)/m;\nexport const GIT_DIFF_FILE_BREAK_REGEX: RegExp = /(?=^diff --git)/gm;\nexport const UNIFIED_DIFF_FILE_BREAK_REGEX: RegExp = /(?=^---\\s+\\S)/gm;\nexport const FILE_CONTEXT_BLOB: RegExp = /(?=^@@ )/gm;\nexport const HUNK_HEADER: RegExp =\n /^@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@(?: (.*))?/m;\nexport const SPLIT_WITH_NEWLINES: RegExp = /(?<=\\n)/;\nexport const FILENAME_HEADER_REGEX: RegExp = /^(---|\\+\\+\\+)\\s+([^\\t\\r\\n]+)/;\nexport const FILENAME_HEADER_REGEX_GIT: RegExp =\n /^(---|\\+\\+\\+)\\s+[ab]\\/([^\\t\\r\\n]+)/;\nexport const ALTERNATE_FILE_NAMES_GIT: RegExp =\n /^diff --git (?:\"a\\/(.+?)\"|a\\/(.+?)) (?:\"b\\/(.+?)\"|b\\/(.+?))$/;\nexport const INDEX_LINE_METADATA: RegExp =\n /^index ([0-9a-f]+)\\.\\.([0-9a-f]+)(?: (\\d+))?$/i;\n\nexport const HEADER_METADATA_SLOT_ID = 'header-metadata';\n\nexport const DEFAULT_THEMES: ThemesType = {\n dark: 'pierre-dark',\n light: 'pierre-light',\n};\n\nexport const UNSAFE_CSS_ATTRIBUTE = 'data-unsafe-css';\nexport const CORE_CSS_ATTRIBUTE = 'data-core-css';\n\n// FIXME(amadeus): This will need to be configurable\nexport const LINE_HUNK_COUNT = 10;\nexport const LINE_HEIGHT = 20;\nexport const DIFF_HEADER_HEIGHT = 44;\nexport const HUNK_SEPARATOR_HEIGHT = 32;\nexport const FILE_GAP = 8;\n\nexport const DEFAULT_EXPANDED_REGION: HunkExpansionRegion = Object.freeze({\n fromStart: 0,\n fromEnd: 0,\n});\n"],"mappings":";AAEA,MAAa,iBAAiB;AAG9B,MAAaA,wBAAgC;AAC7C,MAAaC,4BAAoC;AACjD,MAAaC,gCAAwC;AACrD,MAAaC,oBAA4B;AACzC,MAAaC,cACX;AACF,MAAaC,sBAA8B;AAC3C,MAAaC,wBAAgC;AAC7C,MAAaC,4BACX;AACF,MAAaC,2BACX;AACF,MAAaC,sBACX;AAEF,MAAa,0BAA0B;AAEvC,MAAaC,iBAA6B;CACxC,MAAM;CACN,OAAO;CACR;AAED,MAAa,uBAAuB;AACpC,MAAa,qBAAqB;AAGlC,MAAa,kBAAkB;AAC/B,MAAa,cAAc;AAC3B,MAAa,qBAAqB;AAClC,MAAa,wBAAwB;AACrC,MAAa,WAAW;AAExB,MAAaC,0BAA+C,OAAO,OAAO;CACxE,WAAW;CACX,SAAS;CACV,CAAC"}
1
+ {"version":3,"file":"constants.js","names":["COMMIT_METADATA_SPLIT: RegExp","GIT_DIFF_FILE_BREAK_REGEX: RegExp","UNIFIED_DIFF_FILE_BREAK_REGEX: RegExp","FILE_CONTEXT_BLOB: RegExp","HUNK_HEADER: RegExp","SPLIT_WITH_NEWLINES: RegExp","FILENAME_HEADER_REGEX: RegExp","FILENAME_HEADER_REGEX_GIT: RegExp","ALTERNATE_FILE_NAMES_GIT: RegExp","INDEX_LINE_METADATA: RegExp","DEFAULT_THEMES: ThemesType","DEFAULT_EXPANDED_REGION: HunkExpansionRegion"],"sources":["../src/constants.ts"],"sourcesContent":["import type { HunkExpansionRegion, ThemesType } from './types';\n\nexport const DIFFS_TAG_NAME = 'diffs-container' as const;\n\n// Misc patch/content parsing regexes\nexport const COMMIT_METADATA_SPLIT: RegExp = /(?=^From [a-f0-9]+ .+$)/m;\nexport const GIT_DIFF_FILE_BREAK_REGEX: RegExp = /(?=^diff --git)/gm;\nexport const UNIFIED_DIFF_FILE_BREAK_REGEX: RegExp = /(?=^---\\s+\\S)/gm;\nexport const FILE_CONTEXT_BLOB: RegExp = /(?=^@@ )/gm;\nexport const HUNK_HEADER: RegExp =\n /^@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@(?: (.*))?/m;\nexport const SPLIT_WITH_NEWLINES: RegExp = /(?<=\\n)/;\nexport const FILENAME_HEADER_REGEX: RegExp = /^(---|\\+\\+\\+)\\s+([^\\t\\r\\n]+)/;\nexport const FILENAME_HEADER_REGEX_GIT: RegExp =\n /^(---|\\+\\+\\+)\\s+[ab]\\/([^\\t\\r\\n]+)/;\nexport const ALTERNATE_FILE_NAMES_GIT: RegExp =\n /^diff --git (?:\"a\\/(.+?)\"|a\\/(.+?)) (?:\"b\\/(.+?)\"|b\\/(.+?))$/;\nexport const INDEX_LINE_METADATA: RegExp =\n /^index ([0-9a-f]+)\\.\\.([0-9a-f]+)(?: (\\d+))?$/i;\n\nexport const HEADER_METADATA_SLOT_ID = 'header-metadata';\n\nexport const DEFAULT_THEMES: ThemesType = {\n dark: 'pierre-dark',\n light: 'pierre-light',\n};\n\nexport const UNSAFE_CSS_ATTRIBUTE = 'data-unsafe-css';\nexport const CORE_CSS_ATTRIBUTE = 'data-core-css';\n\n// FIXME(amadeus): This will need to be configurable\nexport const LINE_HUNK_COUNT = 10;\nexport const LINE_HEIGHT = 20;\nexport const DIFF_HEADER_HEIGHT = 44;\nexport const HUNK_SEPARATOR_HEIGHT = 32;\nexport const FILE_GAP = 8;\nexport const DEFAULT_COLLAPSED_CONTEXT_THRESHOLD = 1;\n\nexport const DEFAULT_EXPANDED_REGION: HunkExpansionRegion = Object.freeze({\n fromStart: 0,\n fromEnd: 0,\n});\n"],"mappings":";AAEA,MAAa,iBAAiB;AAG9B,MAAaA,wBAAgC;AAC7C,MAAaC,4BAAoC;AACjD,MAAaC,gCAAwC;AACrD,MAAaC,oBAA4B;AACzC,MAAaC,cACX;AACF,MAAaC,sBAA8B;AAC3C,MAAaC,wBAAgC;AAC7C,MAAaC,4BACX;AACF,MAAaC,2BACX;AACF,MAAaC,sBACX;AAEF,MAAa,0BAA0B;AAEvC,MAAaC,iBAA6B;CACxC,MAAM;CACN,OAAO;CACR;AAED,MAAa,uBAAuB;AACpC,MAAa,qBAAqB;AAGlC,MAAa,kBAAkB;AAC/B,MAAa,cAAc;AAC3B,MAAa,qBAAqB;AAClC,MAAa,wBAAwB;AACrC,MAAa,WAAW;AACxB,MAAa,sCAAsC;AAEnD,MAAaC,0BAA+C,OAAO,OAAO;CACxE,WAAW;CACX,SAAS;CACV,CAAC"}
@@ -1,11 +1,13 @@
1
1
  import { SupportedLanguages } from "../../types.js";
2
2
  import { ResolvedLanguage } from "../../worker/types.js";
3
3
  import "../../worker/index.js";
4
+ import { DynamicImportLanguageRegistration } from "shiki";
4
5
 
5
6
  //#region src/highlighter/languages/constants.d.ts
6
7
  declare const ResolvedLanguages: Map<SupportedLanguages, ResolvedLanguage>;
7
8
  declare const ResolvingLanguages: Map<SupportedLanguages, Promise<ResolvedLanguage>>;
9
+ declare const RegisteredCustomLanguages: Map<string, DynamicImportLanguageRegistration>;
8
10
  declare const AttachedLanguages: Set<string>;
9
11
  //#endregion
10
- export { AttachedLanguages, ResolvedLanguages, ResolvingLanguages };
12
+ export { AttachedLanguages, RegisteredCustomLanguages, ResolvedLanguages, ResolvingLanguages };
11
13
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","names":["ResolvedLanguages: Map<SupportedLanguages, ResolvedLanguage>","ResolvingLanguages: Map<\n SupportedLanguages,\n Promise<ResolvedLanguage>\n>","AttachedLanguages: Set<string>"],"sources":["../../../src/highlighter/languages/constants.ts"],"sourcesContent":[],"mappings":";;;;;cAGaA,mBAAmB,IAAI,oBAAoB;cAG3CC,oBAAoB,IAC/B,oBACA,QAAQ;cAGGC,mBAAmB"}
1
+ {"version":3,"file":"constants.d.ts","names":["ResolvedLanguages: Map<SupportedLanguages, ResolvedLanguage>","ResolvingLanguages: Map<\n SupportedLanguages,\n Promise<ResolvedLanguage>\n>","RegisteredCustomLanguages: Map<\n string,\n DynamicImportLanguageRegistration\n>","AttachedLanguages: Set<string>"],"sources":["../../../src/highlighter/languages/constants.ts"],"sourcesContent":[],"mappings":";;;;;;cAKaA,mBAAmB,IAAI,oBAAoB;cAG3CC,oBAAoB,IAC/B,oBACA,QAAQ;cAGGC,2BAA2B,YAEtC;AAVWF,cAaAG,iBAb2C,EAaxB,GAbwB,CAAA,MAAA,CAAA"}
@@ -1,8 +1,9 @@
1
1
  //#region src/highlighter/languages/constants.ts
2
2
  const ResolvedLanguages = /* @__PURE__ */ new Map();
3
3
  const ResolvingLanguages = /* @__PURE__ */ new Map();
4
+ const RegisteredCustomLanguages = /* @__PURE__ */ new Map();
4
5
  const AttachedLanguages = /* @__PURE__ */ new Set();
5
6
 
6
7
  //#endregion
7
- export { AttachedLanguages, ResolvedLanguages, ResolvingLanguages };
8
+ export { AttachedLanguages, RegisteredCustomLanguages, ResolvedLanguages, ResolvingLanguages };
8
9
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","names":["ResolvedLanguages: Map<SupportedLanguages, ResolvedLanguage>","ResolvingLanguages: Map<\n SupportedLanguages,\n Promise<ResolvedLanguage>\n>","AttachedLanguages: Set<string>"],"sources":["../../../src/highlighter/languages/constants.ts"],"sourcesContent":["import type { SupportedLanguages } from '../../types';\nimport type { ResolvedLanguage } from '../../worker';\n\nexport const ResolvedLanguages: Map<SupportedLanguages, ResolvedLanguage> =\n new Map();\n\nexport const ResolvingLanguages: Map<\n SupportedLanguages,\n Promise<ResolvedLanguage>\n> = new Map();\n\nexport const AttachedLanguages: Set<string> = new Set();\n"],"mappings":";AAGA,MAAaA,oCACX,IAAI,KAAK;AAEX,MAAaC,qCAGT,IAAI,KAAK;AAEb,MAAaC,oCAAiC,IAAI,KAAK"}
1
+ {"version":3,"file":"constants.js","names":["ResolvedLanguages: Map<SupportedLanguages, ResolvedLanguage>","ResolvingLanguages: Map<\n SupportedLanguages,\n Promise<ResolvedLanguage>\n>","RegisteredCustomLanguages: Map<\n string,\n DynamicImportLanguageRegistration\n>","AttachedLanguages: Set<string>"],"sources":["../../../src/highlighter/languages/constants.ts"],"sourcesContent":["import type { DynamicImportLanguageRegistration } from 'shiki';\n\nimport type { SupportedLanguages } from '../../types';\nimport type { ResolvedLanguage } from '../../worker';\n\nexport const ResolvedLanguages: Map<SupportedLanguages, ResolvedLanguage> =\n new Map();\n\nexport const ResolvingLanguages: Map<\n SupportedLanguages,\n Promise<ResolvedLanguage>\n> = new Map();\n\nexport const RegisteredCustomLanguages: Map<\n string,\n DynamicImportLanguageRegistration\n> = new Map();\n\nexport const AttachedLanguages: Set<string> = new Set();\n"],"mappings":";AAKA,MAAaA,oCACX,IAAI,KAAK;AAEX,MAAaC,qCAGT,IAAI,KAAK;AAEb,MAAaC,4CAGT,IAAI,KAAK;AAEb,MAAaC,oCAAiC,IAAI,KAAK"}
@@ -0,0 +1,12 @@
1
+ import { DynamicImportLanguageRegistration } from "shiki";
2
+
3
+ //#region src/highlighter/languages/registerCustomLanguage.d.ts
4
+
5
+ /**
6
+ * Register a custom language loader and optionally map it to
7
+ * file names or extensions.
8
+ */
9
+ declare function registerCustomLanguage(lang: string, loader: DynamicImportLanguageRegistration, extensionsOrFilenames?: string[]): void;
10
+ //#endregion
11
+ export { registerCustomLanguage };
12
+ //# sourceMappingURL=registerCustomLanguage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registerCustomLanguage.d.ts","names":[],"sources":["../../../src/highlighter/languages/registerCustomLanguage.ts"],"sourcesContent":[],"mappings":";;;;;;AASA;;iBAAgB,sBAAA,uBAEN"}