@pierre/diffs 1.0.9 → 1.0.10

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.
@@ -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":";;;;;;;UA2CiB;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,cAWZ,IAXY,CAAA,cAAA,SAAA,CAAA,CAAA;EAEM,OAAA,EAmCX,WAnCW,CAmCC,WAnCD,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;EAaJ,QAAa,cAAA;EA0BmB,QAAA,YAAA;EAAZ,QAAA,YAAA;EAAY,QAAA,aAAA;EAAZ,QAAA,cAAA;EACQ,QAAA,YAAA;EA4BM,QAAA,aAAA;EAAZ,QAAA,iBAAA;EAWI,QAAA,oBAAA;EA8BH,QAAA,kBAAA;EAI8B,QAAA,eAAA;EAAf,QAAA,IAAA;EAIZ,WAAA,CAAA,OAAA,CAAA,EA9EN,WA8EM,CA9EM,WA8EN,CAAA,EAAA,aAAA,CAAA,EA7EE,iBA6EF,GAAA,SAAA,EAAA,kBAAA,CAAA,EAAA,OAAA;EA6BQ,QAAA,qBAAA;EAAjB,QAAA,CAAA,CAAA,EAAA,IAAA;EAsDb,UAAA,CAAA,OAAA,EApIkB,WAoIlB,CApI8B,WAoI9B,CAAA,GAAA,SAAA,CAAA,EAAA,IAAA;EACA,QAAA,YAAA;EACA,YAAA,CAAA,SAAA,EA3HsB,UA2HtB,CAAA,EAAA,IAAA;EACA,cAAA,EAAA,GAAA,GA9FmB,oBA8FnB,CAAA,MAAA,CAAA,GAAA,SAAA;EACA,kBAAA,CAAA,eAAA,EA3FkC,cA2FlC,CA3FiD,WA2FjD,CAAA,EAAA,CAAA,EAAA,IAAA;EACiB,gBAAA,CAAA,KAAA,EAxFK,iBAwFL,GAAA,IAAA,CAAA,EAAA,IAAA;EAAhB,OAAA,CAAA,CAAA,EAAA,IAAA;EAAA,OAAA,CAAA,KAAA,EA3DY,gBA2DZ,CA3D6B,WA2D7B,CAAA,CAAA,EAAA,IAAA;;;;;;;KAAA,gBAAgB"}
1
+ {"version":3,"file":"File.d.ts","names":["options: FileOptions<LAnnotation>","workerManager?: WorkerPoolManager | undefined"],"sources":["../../src/components/File.ts"],"sourcesContent":[],"mappings":";;;;;;;UA2CiB;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,cAqBG,IArBH,CAAA,cAAA,SAAA,CAAA,CAAA;EACN,OAAA,EA8CgB,WA9ChB,CA8C4B,WA9C5B,CAAA;EACA,QAAA,aAAA;EAAA,QAAA,kBAAA;EAmBJ,OAAa,qBAAA,EAAA,OAAA;EA0BmB,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,aAAA;EAI8B,QAAA,cAAA;EAAf,QAAA,YAAA;EAIZ,QAAA,aAAA;EA6BQ,QAAA,iBAAA;EAAjB,QAAA,oBAAA;EAsDb,QAAA,kBAAA;EACA,QAAA,eAAA;EACA,QAAA,IAAA;EACA,WAAA,CAAA,OAAA,CAAA,EApKgB,WAoKhB,CApK4B,WAoK5B,CAAA,EAAA,aAAA,CAAA,EAnKwB,iBAmKxB,GAAA,SAAA,EAAA,kBAAA,CAAA,EAAA,OAAA;EACA,QAAA,qBAAA;EACiB,QAAA,CAAA,CAAA,EAAA,IAAA;EAAhB,UAAA,CAAA,OAAA,EAzIiB,WAyIjB,CAzI6B,WAyI7B,CAAA,GAAA,SAAA,CAAA,EAAA,IAAA;EAAA,QAAA,YAAA;0BA9HqB;wBA8BH;sCAIe,eAAe;0BAI3B;;iBA6BT,iBAAiB;;;;;;;KA2D7B,gBAAgB"}
@@ -155,7 +155,7 @@ var File = class {
155
155
  this.fileRenderer.setOptions(this.options);
156
156
  if (lineAnnotations != null) this.setLineAnnotations(lineAnnotations);
157
157
  this.fileRenderer.setLineAnnotations(this.lineAnnotations);
158
- const { disableFileHeader = false } = this.options;
158
+ const { disableFileHeader = false, disableErrorHandling = false } = this.options;
159
159
  if (disableFileHeader) {
160
160
  if (this.headerElement != null) {
161
161
  this.headerElement.parentNode?.removeChild(this.headerElement);
@@ -175,6 +175,8 @@ var File = class {
175
175
  this.renderAnnotations();
176
176
  this.renderHoverUtility();
177
177
  } catch (error) {
178
+ if (disableErrorHandling) throw error;
179
+ console.error(error);
178
180
  if (error instanceof Error) this.applyErrorToDOM(error, fileContainer);
179
181
  }
180
182
  }
@@ -1 +1 @@
1
- {"version":3,"file":"File.js","names":["options: FileOptions<LAnnotation>","workerManager?: WorkerPoolManager | undefined","error: unknown"],"sources":["../../src/components/File.ts"],"sourcesContent":["import type { Element as HASTElement } from 'hast';\nimport { toHtml } from 'hast-util-to-html';\n\nimport {\n DEFAULT_THEMES,\n DIFFS_TAG_NAME,\n HEADER_METADATA_SLOT_ID,\n UNSAFE_CSS_ATTRIBUTE,\n} from '../constants';\nimport {\n LineSelectionManager,\n type LineSelectionOptions,\n type SelectedLineRange,\n pluckLineSelectionOptions,\n} from '../managers/LineSelectionManager';\nimport {\n type GetHoveredLineResult,\n MouseEventManager,\n type MouseEventManagerBaseOptions,\n pluckMouseEventOptions,\n} from '../managers/MouseEventManager';\nimport { ResizeManager } from '../managers/ResizeManager';\nimport { type FileRenderResult, FileRenderer } from '../renderers/FileRenderer';\nimport { SVGSpriteSheet } from '../sprite';\nimport type {\n BaseCodeOptions,\n FileContents,\n LineAnnotation,\n RenderFileMetadata,\n ThemeTypes,\n} from '../types';\nimport { areFilesEqual } from '../utils/areFilesEqual';\nimport { createAnnotationWrapperNode } from '../utils/createAnnotationWrapperNode';\nimport { createCodeNode } from '../utils/createCodeNode';\nimport { createHoverContentNode } from '../utils/createHoverContentNode';\nimport { createUnsafeCSSStyleNode } from '../utils/createUnsafeCSSStyleNode';\nimport { wrapUnsafeCSS } from '../utils/cssWrappers';\nimport { getLineAnnotationName } from '../utils/getLineAnnotationName';\nimport { prerenderHTMLIfNecessary } from '../utils/prerenderHTMLIfNecessary';\nimport { setPreNodeProperties } from '../utils/setWrapperNodeProps';\nimport type { WorkerPoolManager } from '../worker';\nimport { DiffsContainerLoaded } from './web-components';\n\nexport interface FileRenderProps<LAnnotation> {\n file: FileContents;\n fileContainer?: HTMLElement;\n containerWrapper?: HTMLElement;\n forceRender?: boolean;\n lineAnnotations?: LineAnnotation<LAnnotation>[];\n}\n\nexport interface FileHyrdateProps<LAnnotation>\n extends Omit<FileRenderProps<LAnnotation>, 'fileContainer'> {\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\n\nexport interface FileOptions<LAnnotation>\n extends BaseCodeOptions,\n MouseEventManagerBaseOptions<'file'>,\n LineSelectionOptions {\n disableFileHeader?: boolean;\n renderCustomMetadata?: RenderFileMetadata;\n renderAnnotation?(\n annotation: LineAnnotation<LAnnotation>\n ): HTMLElement | undefined;\n renderHoverUtility?(\n getHoveredRow: () => GetHoveredLineResult<'file'> | undefined\n ): HTMLElement | null;\n}\n\nlet instanceId = -1;\n\nexport class File<LAnnotation = undefined> {\n static LoadedCustomComponent: boolean = DiffsContainerLoaded;\n\n readonly __id: number = ++instanceId;\n private fileContainer: HTMLElement | undefined;\n private spriteSVG: SVGElement | undefined;\n private pre: HTMLPreElement | undefined;\n private code: HTMLElement | undefined;\n private unsafeCSSStyle: HTMLStyleElement | undefined;\n private hoverContent: HTMLElement | undefined;\n private errorWrapper: HTMLElement | undefined;\n\n private headerElement: HTMLElement | undefined;\n private headerMetadata: HTMLElement | undefined;\n\n private fileRenderer: FileRenderer<LAnnotation>;\n private resizeManager: ResizeManager;\n private mouseEventManager: MouseEventManager<'file'>;\n private lineSelectionManager: LineSelectionManager;\n\n private annotationElements: HTMLElement[] = [];\n private lineAnnotations: LineAnnotation<LAnnotation>[] = [];\n\n private file: FileContents | undefined;\n\n constructor(\n public options: FileOptions<LAnnotation> = { theme: DEFAULT_THEMES },\n private workerManager?: WorkerPoolManager | undefined,\n private isContainerManaged = false\n ) {\n this.fileRenderer = new FileRenderer<LAnnotation>(\n options,\n this.handleHighlightRender,\n this.workerManager\n );\n this.resizeManager = new ResizeManager();\n this.mouseEventManager = new MouseEventManager(\n 'file',\n pluckMouseEventOptions(options)\n );\n this.lineSelectionManager = new LineSelectionManager(\n pluckLineSelectionOptions(options)\n );\n this.workerManager?.subscribeToThemeChanges(this);\n }\n\n private handleHighlightRender = (): void => {\n this.rerender();\n };\n\n rerender(): void {\n if (this.file == null) return;\n this.render({ file: this.file, forceRender: true });\n }\n\n setOptions(options: FileOptions<LAnnotation> | undefined): void {\n if (options == null) return;\n this.options = options;\n this.mouseEventManager.setOptions(pluckMouseEventOptions(options));\n this.lineSelectionManager.setOptions(pluckLineSelectionOptions(options));\n }\n\n private mergeOptions(options: Partial<FileOptions<LAnnotation>>): void {\n this.options = { ...this.options, ...options };\n }\n\n setThemeType(themeType: ThemeTypes): void {\n const currentThemeType = this.options.themeType ?? 'system';\n if (currentThemeType === themeType) {\n return;\n }\n this.mergeOptions({ themeType });\n this.fileRenderer.setThemeType(themeType);\n\n if (this.headerElement != null) {\n if (themeType === 'system') {\n delete this.headerElement.dataset.themeType;\n } else {\n this.headerElement.dataset.themeType = themeType;\n }\n }\n\n // Update pre element theme mode\n if (this.pre != null) {\n switch (themeType) {\n case 'system':\n delete this.pre.dataset.themeType;\n break;\n case 'light':\n case 'dark':\n this.pre.dataset.themeType = themeType;\n break;\n }\n }\n }\n\n getHoveredLine = (): GetHoveredLineResult<'file'> | undefined => {\n return this.mouseEventManager.getHoveredLine();\n };\n\n setLineAnnotations(lineAnnotations: LineAnnotation<LAnnotation>[]): void {\n this.lineAnnotations = lineAnnotations;\n }\n\n setSelectedLines(range: SelectedLineRange | null): void {\n this.lineSelectionManager.setSelection(range);\n }\n\n cleanUp(): void {\n this.fileRenderer.cleanUp();\n this.resizeManager.cleanUp();\n this.mouseEventManager.cleanUp();\n this.lineSelectionManager.cleanUp();\n this.workerManager?.unsubscribeToThemeChanges(this);\n this.workerManager = undefined;\n\n // Clean up the data\n this.file = undefined;\n\n // Clean up the elements\n if (!this.isContainerManaged) {\n this.fileContainer?.parentNode?.removeChild(this.fileContainer);\n }\n if (this.fileContainer?.shadowRoot != null) {\n this.fileContainer.shadowRoot.innerHTML = '';\n }\n this.fileContainer = undefined;\n this.pre = undefined;\n this.headerElement = undefined;\n this.errorWrapper = undefined;\n this.unsafeCSSStyle = undefined;\n }\n\n hydrate(props: FileHyrdateProps<LAnnotation>): void {\n const { fileContainer, prerenderedHTML } = props;\n prerenderHTMLIfNecessary(fileContainer, prerenderedHTML);\n for (const element of Array.from(\n fileContainer.shadowRoot?.children ?? []\n )) {\n if (element instanceof SVGElement) {\n this.spriteSVG = element;\n continue;\n }\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (element instanceof HTMLPreElement) {\n this.pre = element;\n continue;\n }\n if (\n element instanceof HTMLStyleElement &&\n element.hasAttribute(UNSAFE_CSS_ATTRIBUTE)\n ) {\n this.unsafeCSSStyle = element;\n continue;\n }\n if ('diffsHeader' in element.dataset) {\n this.headerElement = element;\n continue;\n }\n }\n // If we have no pre tag, then we should render\n if (this.pre == null) {\n this.render(props);\n }\n // Otherwise orchestrate our setup\n else {\n const { file, lineAnnotations } = props;\n this.fileContainer = fileContainer;\n delete this.pre.dataset.dehydrated;\n\n this.lineAnnotations = lineAnnotations ?? this.lineAnnotations;\n this.file = file;\n this.fileRenderer.hydrate(file);\n this.renderAnnotations();\n this.renderHoverUtility();\n this.injectUnsafeCSS();\n this.mouseEventManager.setup(this.pre);\n this.lineSelectionManager.setup(this.pre);\n if ((this.options.overflow ?? 'scroll') === 'scroll') {\n this.resizeManager.setup(this.pre);\n }\n }\n }\n\n render({\n file,\n fileContainer,\n forceRender = false,\n containerWrapper,\n lineAnnotations,\n }: FileRenderProps<LAnnotation>): void {\n const annotationsChanged =\n lineAnnotations != null &&\n (lineAnnotations.length > 0 || this.lineAnnotations.length > 0)\n ? lineAnnotations !== this.lineAnnotations\n : false;\n if (!forceRender && areFilesEqual(this.file, file) && !annotationsChanged) {\n return;\n }\n\n this.file = file;\n this.fileRenderer.setOptions(this.options);\n if (lineAnnotations != null) {\n this.setLineAnnotations(lineAnnotations);\n }\n this.fileRenderer.setLineAnnotations(this.lineAnnotations);\n\n const { disableFileHeader = false } = this.options;\n if (disableFileHeader) {\n // Remove existing header from DOM\n if (this.headerElement != null) {\n this.headerElement.parentNode?.removeChild(this.headerElement);\n this.headerElement = undefined;\n }\n }\n\n fileContainer = this.getOrCreateFileContainerNode(\n fileContainer,\n containerWrapper\n );\n\n try {\n const fileResult = this.fileRenderer.renderFile(file);\n if (fileResult == null) {\n if (this.workerManager != null && !this.workerManager.isInitialized()) {\n void this.workerManager.initialize().then(() => this.rerender());\n }\n return;\n }\n if (fileResult.headerAST != null) {\n this.applyHeaderToDOM(fileResult.headerAST, fileContainer);\n }\n const pre = this.getOrCreatePreNode(fileContainer);\n this.applyHunksToDOM(fileResult, pre);\n this.renderAnnotations();\n this.renderHoverUtility();\n } catch (error: unknown) {\n if (error instanceof Error) {\n this.applyErrorToDOM(error, fileContainer);\n }\n }\n }\n\n private renderAnnotations(): void {\n if (this.isContainerManaged || this.fileContainer == null) {\n return;\n }\n // Handle annotation elements\n for (const element of this.annotationElements) {\n element.parentNode?.removeChild(element);\n }\n this.annotationElements.length = 0;\n\n const { renderAnnotation } = this.options;\n if (renderAnnotation != null && this.lineAnnotations.length > 0) {\n for (const annotation of this.lineAnnotations) {\n const content = renderAnnotation(annotation);\n if (content == null) continue;\n const el = createAnnotationWrapperNode(\n getLineAnnotationName(annotation)\n );\n el.appendChild(content);\n this.annotationElements.push(el);\n this.fileContainer.appendChild(el);\n }\n }\n }\n\n private renderHoverUtility() {\n const { renderHoverUtility } = this.options;\n if (this.fileContainer == null || renderHoverUtility == null) return;\n if (this.hoverContent == null) {\n this.hoverContent = createHoverContentNode();\n this.fileContainer.appendChild(this.hoverContent);\n }\n const element = renderHoverUtility(this.mouseEventManager.getHoveredLine);\n this.hoverContent.innerHTML = '';\n if (element != null) {\n this.hoverContent.appendChild(element);\n }\n }\n\n private injectUnsafeCSS(): void {\n if (this.fileContainer?.shadowRoot == null) {\n return;\n }\n const { unsafeCSS } = this.options;\n\n if (unsafeCSS == null || unsafeCSS === '') {\n if (this.unsafeCSSStyle != null) {\n this.unsafeCSSStyle.parentNode?.removeChild(this.unsafeCSSStyle);\n this.unsafeCSSStyle = undefined;\n }\n return;\n }\n\n // Create or update the style element\n if (this.unsafeCSSStyle == null) {\n this.unsafeCSSStyle = createUnsafeCSSStyleNode();\n this.fileContainer.shadowRoot.appendChild(this.unsafeCSSStyle);\n }\n // Wrap in @layer unsafe to match SSR behavior\n this.unsafeCSSStyle.innerText = wrapUnsafeCSS(unsafeCSS);\n }\n\n private applyHunksToDOM(result: FileRenderResult, pre: HTMLPreElement): void {\n this.cleanupErrorWrapper();\n this.applyPreNodeAttributes(pre, result);\n pre.innerHTML = '';\n // Create code elements and insert HTML content\n this.code = createCodeNode();\n this.code.innerHTML = this.fileRenderer.renderPartialHTML(result.codeAST);\n pre.appendChild(this.code);\n this.injectUnsafeCSS();\n this.mouseEventManager.setup(pre);\n this.lineSelectionManager.setup(pre);\n this.lineSelectionManager.setDirty();\n if ((this.options.overflow ?? 'scroll') === 'scroll') {\n this.resizeManager.setup(pre);\n } else {\n this.resizeManager.cleanUp();\n }\n }\n\n private applyHeaderToDOM(\n headerAST: HASTElement,\n container: HTMLElement\n ): void {\n const { file } = this;\n if (file == null) return;\n this.cleanupErrorWrapper();\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = toHtml(headerAST);\n const newHeader = tempDiv.firstElementChild;\n if (!(newHeader instanceof HTMLElement)) {\n return;\n }\n if (this.headerElement != null) {\n container.shadowRoot?.replaceChild(newHeader, this.headerElement);\n } else {\n container.shadowRoot?.prepend(newHeader);\n }\n this.headerElement = newHeader;\n\n if (this.isContainerManaged) return;\n\n const { renderCustomMetadata } = this.options;\n if (this.headerMetadata != null) {\n this.headerMetadata.parentNode?.removeChild(this.headerMetadata);\n }\n const content = renderCustomMetadata?.(file) ?? undefined;\n if (content != null) {\n this.headerMetadata = document.createElement('div');\n this.headerMetadata.slot = HEADER_METADATA_SLOT_ID;\n if (content instanceof Element) {\n this.headerMetadata.appendChild(content);\n } else {\n this.headerMetadata.innerText = `${content}`;\n }\n container.appendChild(this.headerMetadata);\n }\n }\n\n private getOrCreateFileContainerNode(\n fileContainer?: HTMLElement,\n parentNode?: HTMLElement\n ): HTMLElement {\n this.fileContainer =\n fileContainer ??\n this.fileContainer ??\n document.createElement(DIFFS_TAG_NAME);\n if (parentNode != null && this.fileContainer.parentNode !== parentNode) {\n parentNode.appendChild(this.fileContainer);\n }\n if (this.spriteSVG == null) {\n const fragment = document.createElement('div');\n fragment.innerHTML = SVGSpriteSheet;\n const firstChild = fragment.firstChild;\n if (firstChild instanceof SVGElement) {\n this.spriteSVG = firstChild;\n this.fileContainer.shadowRoot?.appendChild(this.spriteSVG);\n }\n }\n return this.fileContainer;\n }\n\n private getOrCreatePreNode(container: HTMLElement): HTMLPreElement {\n // If we haven't created a pre element yet, lets go ahead and do that\n if (this.pre == null) {\n this.pre = document.createElement('pre');\n container.shadowRoot?.appendChild(this.pre);\n }\n // If we have a new parent container for the pre element, lets go ahead and\n // move it into the new container\n else if (this.pre.parentNode !== container) {\n container.shadowRoot?.appendChild(this.pre);\n }\n return this.pre;\n }\n\n private applyPreNodeAttributes(\n pre: HTMLPreElement,\n { totalLines, themeStyles, baseThemeType }: FileRenderResult\n ): void {\n const {\n overflow = 'scroll',\n themeType = 'system',\n disableLineNumbers = false,\n } = this.options;\n setPreNodeProperties({\n pre,\n split: false,\n themeStyles,\n overflow,\n disableLineNumbers,\n themeType: baseThemeType ?? themeType,\n diffIndicators: 'none',\n disableBackground: true,\n totalLines,\n });\n }\n\n private applyErrorToDOM(error: Error, container: HTMLElement) {\n this.cleanupErrorWrapper();\n const pre = this.getOrCreatePreNode(container);\n pre.innerHTML = '';\n pre.parentNode?.removeChild(pre);\n this.pre = undefined;\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n this.errorWrapper ??= document.createElement('div');\n this.errorWrapper.dataset.errorWrapper = '';\n this.errorWrapper.innerHTML = '';\n shadowRoot.appendChild(this.errorWrapper);\n const errorMessage = document.createElement('div');\n errorMessage.dataset.errorMessage = '';\n errorMessage.innerText = error.message;\n this.errorWrapper.appendChild(errorMessage);\n const errorStack = document.createElement('pre');\n errorStack.dataset.errorStack = '';\n errorStack.innerText = error.stack ?? 'No Error Stack';\n this.errorWrapper.appendChild(errorStack);\n }\n\n private cleanupErrorWrapper() {\n this.errorWrapper?.parentNode?.removeChild(this.errorWrapper);\n this.errorWrapper = undefined;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"File.js","names":["options: FileOptions<LAnnotation>","workerManager?: WorkerPoolManager | undefined","error: unknown"],"sources":["../../src/components/File.ts"],"sourcesContent":["import type { Element as HASTElement } from 'hast';\nimport { toHtml } from 'hast-util-to-html';\n\nimport {\n DEFAULT_THEMES,\n DIFFS_TAG_NAME,\n HEADER_METADATA_SLOT_ID,\n UNSAFE_CSS_ATTRIBUTE,\n} from '../constants';\nimport {\n LineSelectionManager,\n type LineSelectionOptions,\n type SelectedLineRange,\n pluckLineSelectionOptions,\n} from '../managers/LineSelectionManager';\nimport {\n type GetHoveredLineResult,\n MouseEventManager,\n type MouseEventManagerBaseOptions,\n pluckMouseEventOptions,\n} from '../managers/MouseEventManager';\nimport { ResizeManager } from '../managers/ResizeManager';\nimport { type FileRenderResult, FileRenderer } from '../renderers/FileRenderer';\nimport { SVGSpriteSheet } from '../sprite';\nimport type {\n BaseCodeOptions,\n FileContents,\n LineAnnotation,\n RenderFileMetadata,\n ThemeTypes,\n} from '../types';\nimport { areFilesEqual } from '../utils/areFilesEqual';\nimport { createAnnotationWrapperNode } from '../utils/createAnnotationWrapperNode';\nimport { createCodeNode } from '../utils/createCodeNode';\nimport { createHoverContentNode } from '../utils/createHoverContentNode';\nimport { createUnsafeCSSStyleNode } from '../utils/createUnsafeCSSStyleNode';\nimport { wrapUnsafeCSS } from '../utils/cssWrappers';\nimport { getLineAnnotationName } from '../utils/getLineAnnotationName';\nimport { prerenderHTMLIfNecessary } from '../utils/prerenderHTMLIfNecessary';\nimport { setPreNodeProperties } from '../utils/setWrapperNodeProps';\nimport type { WorkerPoolManager } from '../worker';\nimport { DiffsContainerLoaded } from './web-components';\n\nexport interface FileRenderProps<LAnnotation> {\n file: FileContents;\n fileContainer?: HTMLElement;\n containerWrapper?: HTMLElement;\n forceRender?: boolean;\n lineAnnotations?: LineAnnotation<LAnnotation>[];\n}\n\nexport interface FileHyrdateProps<LAnnotation>\n extends Omit<FileRenderProps<LAnnotation>, 'fileContainer'> {\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\n\nexport interface FileOptions<LAnnotation>\n extends BaseCodeOptions,\n MouseEventManagerBaseOptions<'file'>,\n LineSelectionOptions {\n disableFileHeader?: boolean;\n renderCustomMetadata?: RenderFileMetadata;\n /**\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\nlet instanceId = -1;\n\nexport class File<LAnnotation = undefined> {\n static LoadedCustomComponent: boolean = DiffsContainerLoaded;\n\n readonly __id: number = ++instanceId;\n private fileContainer: HTMLElement | undefined;\n private spriteSVG: SVGElement | undefined;\n private pre: HTMLPreElement | undefined;\n private code: HTMLElement | undefined;\n private unsafeCSSStyle: HTMLStyleElement | undefined;\n private hoverContent: HTMLElement | undefined;\n private errorWrapper: HTMLElement | undefined;\n\n private headerElement: HTMLElement | undefined;\n private headerMetadata: HTMLElement | undefined;\n\n private fileRenderer: FileRenderer<LAnnotation>;\n private resizeManager: ResizeManager;\n private mouseEventManager: MouseEventManager<'file'>;\n private lineSelectionManager: LineSelectionManager;\n\n private annotationElements: HTMLElement[] = [];\n private lineAnnotations: LineAnnotation<LAnnotation>[] = [];\n\n private file: FileContents | undefined;\n\n constructor(\n public options: FileOptions<LAnnotation> = { theme: DEFAULT_THEMES },\n private workerManager?: WorkerPoolManager | undefined,\n private isContainerManaged = false\n ) {\n this.fileRenderer = new FileRenderer<LAnnotation>(\n options,\n this.handleHighlightRender,\n this.workerManager\n );\n this.resizeManager = new ResizeManager();\n this.mouseEventManager = new MouseEventManager(\n 'file',\n pluckMouseEventOptions(options)\n );\n this.lineSelectionManager = new LineSelectionManager(\n pluckLineSelectionOptions(options)\n );\n this.workerManager?.subscribeToThemeChanges(this);\n }\n\n private handleHighlightRender = (): void => {\n this.rerender();\n };\n\n rerender(): void {\n if (this.file == null) return;\n this.render({ file: this.file, forceRender: true });\n }\n\n setOptions(options: FileOptions<LAnnotation> | undefined): void {\n if (options == null) return;\n this.options = options;\n this.mouseEventManager.setOptions(pluckMouseEventOptions(options));\n this.lineSelectionManager.setOptions(pluckLineSelectionOptions(options));\n }\n\n private mergeOptions(options: Partial<FileOptions<LAnnotation>>): void {\n this.options = { ...this.options, ...options };\n }\n\n setThemeType(themeType: ThemeTypes): void {\n const currentThemeType = this.options.themeType ?? 'system';\n if (currentThemeType === themeType) {\n return;\n }\n this.mergeOptions({ themeType });\n this.fileRenderer.setThemeType(themeType);\n\n if (this.headerElement != null) {\n if (themeType === 'system') {\n delete this.headerElement.dataset.themeType;\n } else {\n this.headerElement.dataset.themeType = themeType;\n }\n }\n\n // Update pre element theme mode\n if (this.pre != null) {\n switch (themeType) {\n case 'system':\n delete this.pre.dataset.themeType;\n break;\n case 'light':\n case 'dark':\n this.pre.dataset.themeType = themeType;\n break;\n }\n }\n }\n\n getHoveredLine = (): GetHoveredLineResult<'file'> | undefined => {\n return this.mouseEventManager.getHoveredLine();\n };\n\n setLineAnnotations(lineAnnotations: LineAnnotation<LAnnotation>[]): void {\n this.lineAnnotations = lineAnnotations;\n }\n\n setSelectedLines(range: SelectedLineRange | null): void {\n this.lineSelectionManager.setSelection(range);\n }\n\n cleanUp(): void {\n this.fileRenderer.cleanUp();\n this.resizeManager.cleanUp();\n this.mouseEventManager.cleanUp();\n this.lineSelectionManager.cleanUp();\n this.workerManager?.unsubscribeToThemeChanges(this);\n this.workerManager = undefined;\n\n // Clean up the data\n this.file = undefined;\n\n // Clean up the elements\n if (!this.isContainerManaged) {\n this.fileContainer?.parentNode?.removeChild(this.fileContainer);\n }\n if (this.fileContainer?.shadowRoot != null) {\n this.fileContainer.shadowRoot.innerHTML = '';\n }\n this.fileContainer = undefined;\n this.pre = undefined;\n this.headerElement = undefined;\n this.errorWrapper = undefined;\n this.unsafeCSSStyle = undefined;\n }\n\n hydrate(props: FileHyrdateProps<LAnnotation>): void {\n const { fileContainer, prerenderedHTML } = props;\n prerenderHTMLIfNecessary(fileContainer, prerenderedHTML);\n for (const element of Array.from(\n fileContainer.shadowRoot?.children ?? []\n )) {\n if (element instanceof SVGElement) {\n this.spriteSVG = element;\n continue;\n }\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (element instanceof HTMLPreElement) {\n this.pre = element;\n continue;\n }\n if (\n element instanceof HTMLStyleElement &&\n element.hasAttribute(UNSAFE_CSS_ATTRIBUTE)\n ) {\n this.unsafeCSSStyle = element;\n continue;\n }\n if ('diffsHeader' in element.dataset) {\n this.headerElement = element;\n continue;\n }\n }\n // If we have no pre tag, then we should render\n if (this.pre == null) {\n this.render(props);\n }\n // Otherwise orchestrate our setup\n else {\n const { file, lineAnnotations } = props;\n this.fileContainer = fileContainer;\n delete this.pre.dataset.dehydrated;\n\n this.lineAnnotations = lineAnnotations ?? this.lineAnnotations;\n this.file = file;\n this.fileRenderer.hydrate(file);\n this.renderAnnotations();\n this.renderHoverUtility();\n this.injectUnsafeCSS();\n this.mouseEventManager.setup(this.pre);\n this.lineSelectionManager.setup(this.pre);\n if ((this.options.overflow ?? 'scroll') === 'scroll') {\n this.resizeManager.setup(this.pre);\n }\n }\n }\n\n render({\n file,\n fileContainer,\n forceRender = false,\n containerWrapper,\n lineAnnotations,\n }: FileRenderProps<LAnnotation>): void {\n const annotationsChanged =\n lineAnnotations != null &&\n (lineAnnotations.length > 0 || this.lineAnnotations.length > 0)\n ? lineAnnotations !== this.lineAnnotations\n : false;\n if (!forceRender && areFilesEqual(this.file, file) && !annotationsChanged) {\n return;\n }\n\n this.file = file;\n this.fileRenderer.setOptions(this.options);\n if (lineAnnotations != null) {\n this.setLineAnnotations(lineAnnotations);\n }\n this.fileRenderer.setLineAnnotations(this.lineAnnotations);\n\n const { disableFileHeader = false, 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 }\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 return;\n }\n // Handle annotation elements\n for (const element of this.annotationElements) {\n element.parentNode?.removeChild(element);\n }\n this.annotationElements.length = 0;\n\n const { renderAnnotation } = this.options;\n if (renderAnnotation != null && this.lineAnnotations.length > 0) {\n for (const annotation of this.lineAnnotations) {\n const content = renderAnnotation(annotation);\n if (content == null) continue;\n const el = createAnnotationWrapperNode(\n getLineAnnotationName(annotation)\n );\n el.appendChild(content);\n this.annotationElements.push(el);\n this.fileContainer.appendChild(el);\n }\n }\n }\n\n private renderHoverUtility() {\n const { renderHoverUtility } = this.options;\n if (this.fileContainer == null || renderHoverUtility == null) return;\n if (this.hoverContent == null) {\n this.hoverContent = createHoverContentNode();\n this.fileContainer.appendChild(this.hoverContent);\n }\n const element = renderHoverUtility(this.mouseEventManager.getHoveredLine);\n this.hoverContent.innerHTML = '';\n if (element != null) {\n this.hoverContent.appendChild(element);\n }\n }\n\n private injectUnsafeCSS(): void {\n if (this.fileContainer?.shadowRoot == null) {\n return;\n }\n const { unsafeCSS } = this.options;\n\n if (unsafeCSS == null || unsafeCSS === '') {\n if (this.unsafeCSSStyle != null) {\n this.unsafeCSSStyle.parentNode?.removeChild(this.unsafeCSSStyle);\n this.unsafeCSSStyle = undefined;\n }\n return;\n }\n\n // Create or update the style element\n if (this.unsafeCSSStyle == null) {\n this.unsafeCSSStyle = createUnsafeCSSStyleNode();\n this.fileContainer.shadowRoot.appendChild(this.unsafeCSSStyle);\n }\n // Wrap in @layer unsafe to match SSR behavior\n this.unsafeCSSStyle.innerText = wrapUnsafeCSS(unsafeCSS);\n }\n\n private applyHunksToDOM(result: FileRenderResult, pre: HTMLPreElement): void {\n this.cleanupErrorWrapper();\n this.applyPreNodeAttributes(pre, result);\n pre.innerHTML = '';\n // Create code elements and insert HTML content\n this.code = createCodeNode();\n this.code.innerHTML = this.fileRenderer.renderPartialHTML(result.codeAST);\n pre.appendChild(this.code);\n this.injectUnsafeCSS();\n this.mouseEventManager.setup(pre);\n this.lineSelectionManager.setup(pre);\n this.lineSelectionManager.setDirty();\n if ((this.options.overflow ?? 'scroll') === 'scroll') {\n this.resizeManager.setup(pre);\n } else {\n this.resizeManager.cleanUp();\n }\n }\n\n private applyHeaderToDOM(\n headerAST: HASTElement,\n container: HTMLElement\n ): void {\n const { file } = this;\n if (file == null) return;\n this.cleanupErrorWrapper();\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = toHtml(headerAST);\n const newHeader = tempDiv.firstElementChild;\n if (!(newHeader instanceof HTMLElement)) {\n return;\n }\n if (this.headerElement != null) {\n container.shadowRoot?.replaceChild(newHeader, this.headerElement);\n } else {\n container.shadowRoot?.prepend(newHeader);\n }\n this.headerElement = newHeader;\n\n if (this.isContainerManaged) return;\n\n const { renderCustomMetadata } = this.options;\n if (this.headerMetadata != null) {\n this.headerMetadata.parentNode?.removeChild(this.headerMetadata);\n }\n const content = renderCustomMetadata?.(file) ?? undefined;\n if (content != null) {\n this.headerMetadata = document.createElement('div');\n this.headerMetadata.slot = HEADER_METADATA_SLOT_ID;\n if (content instanceof Element) {\n this.headerMetadata.appendChild(content);\n } else {\n this.headerMetadata.innerText = `${content}`;\n }\n container.appendChild(this.headerMetadata);\n }\n }\n\n private getOrCreateFileContainerNode(\n fileContainer?: HTMLElement,\n parentNode?: HTMLElement\n ): HTMLElement {\n this.fileContainer =\n fileContainer ??\n this.fileContainer ??\n document.createElement(DIFFS_TAG_NAME);\n if (parentNode != null && this.fileContainer.parentNode !== parentNode) {\n parentNode.appendChild(this.fileContainer);\n }\n if (this.spriteSVG == null) {\n const fragment = document.createElement('div');\n fragment.innerHTML = SVGSpriteSheet;\n const firstChild = fragment.firstChild;\n if (firstChild instanceof SVGElement) {\n this.spriteSVG = firstChild;\n this.fileContainer.shadowRoot?.appendChild(this.spriteSVG);\n }\n }\n return this.fileContainer;\n }\n\n private getOrCreatePreNode(container: HTMLElement): HTMLPreElement {\n // If we haven't created a pre element yet, lets go ahead and do that\n if (this.pre == null) {\n this.pre = document.createElement('pre');\n container.shadowRoot?.appendChild(this.pre);\n }\n // If we have a new parent container for the pre element, lets go ahead and\n // move it into the new container\n else if (this.pre.parentNode !== container) {\n container.shadowRoot?.appendChild(this.pre);\n }\n return this.pre;\n }\n\n private applyPreNodeAttributes(\n pre: HTMLPreElement,\n { totalLines, themeStyles, baseThemeType }: FileRenderResult\n ): void {\n const {\n overflow = 'scroll',\n themeType = 'system',\n disableLineNumbers = false,\n } = this.options;\n setPreNodeProperties({\n pre,\n split: false,\n themeStyles,\n overflow,\n disableLineNumbers,\n themeType: baseThemeType ?? themeType,\n diffIndicators: 'none',\n disableBackground: true,\n totalLines,\n });\n }\n\n private applyErrorToDOM(error: Error, container: HTMLElement) {\n this.cleanupErrorWrapper();\n const pre = this.getOrCreatePreNode(container);\n pre.innerHTML = '';\n pre.parentNode?.removeChild(pre);\n this.pre = undefined;\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n this.errorWrapper ??= document.createElement('div');\n this.errorWrapper.dataset.errorWrapper = '';\n this.errorWrapper.innerHTML = '';\n shadowRoot.appendChild(this.errorWrapper);\n const errorMessage = document.createElement('div');\n errorMessage.dataset.errorMessage = '';\n errorMessage.innerText = error.message;\n this.errorWrapper.appendChild(errorMessage);\n const errorStack = document.createElement('pre');\n errorStack.dataset.errorStack = '';\n errorStack.innerText = error.stack ?? 'No Error Stack';\n this.errorWrapper.appendChild(errorStack);\n }\n\n private cleanupErrorWrapper() {\n this.errorWrapper?.parentNode?.removeChild(this.errorWrapper);\n this.errorWrapper = undefined;\n }\n}\n"],"mappings":"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"}
@@ -22,6 +22,12 @@ interface FileDiffOptions<LAnnotation> extends Omit<BaseDiffOptions, "hunkSepara
22
22
  hunkSeparators?: Exclude<HunkSeparators, "custom"> | ((hunk: HunkData, instance: FileDiff<LAnnotation>) => HTMLElement | DocumentFragment);
23
23
  disableFileHeader?: boolean;
24
24
  renderHeaderMetadata?: RenderHeaderMetadataCallback;
25
+ /**
26
+ * When true, errors during rendering are rethrown instead of being caught
27
+ * and displayed in the DOM. Useful for testing or when you want to handle
28
+ * errors yourself.
29
+ */
30
+ disableErrorHandling?: boolean;
25
31
  renderAnnotation?(annotation: DiffLineAnnotation<LAnnotation>): HTMLElement | undefined;
26
32
  renderHoverUtility?(getHoveredRow: () => GetHoveredLineResult<"diff"> | undefined): HTMLElement | null;
27
33
  }
@@ -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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"}
@@ -192,7 +192,7 @@ var FileDiff = class {
192
192
  hunkSeparators: typeof this.options.hunkSeparators === "function" ? "custom" : this.options.hunkSeparators
193
193
  });
194
194
  this.hunksRenderer.setLineAnnotations(this.lineAnnotations);
195
- const { disableFileHeader = false } = this.options;
195
+ const { disableFileHeader = false, disableErrorHandling = false } = this.options;
196
196
  if (disableFileHeader) {
197
197
  if (this.headerElement != null) {
198
198
  this.headerElement.parentNode?.removeChild(this.headerElement);
@@ -213,6 +213,8 @@ var FileDiff = class {
213
213
  this.renderAnnotations();
214
214
  this.renderHoverUtility();
215
215
  } catch (error) {
216
+ if (disableErrorHandling) throw error;
217
+ console.error(error);
216
218
  if (error instanceof Error) this.applyErrorToDOM(error, fileContainer);
217
219
  }
218
220
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FileDiff.js","names":["options: FileDiffOptions<LAnnotation>","workerManager?: WorkerPoolManager | undefined","error: unknown","codeDeletions: HTMLElement | undefined","codeAdditions: HTMLElement | undefined"],"sources":["../../src/components/FileDiff.ts"],"sourcesContent":["import type { Element as HASTElement } from 'hast';\nimport { toHtml } from 'hast-util-to-html';\n\nimport {\n DEFAULT_THEMES,\n DIFFS_TAG_NAME,\n HEADER_METADATA_SLOT_ID,\n UNSAFE_CSS_ATTRIBUTE,\n} from '../constants';\nimport {\n LineSelectionManager,\n type LineSelectionOptions,\n type SelectedLineRange,\n pluckLineSelectionOptions,\n} from '../managers/LineSelectionManager';\nimport {\n type GetHoveredLineResult,\n MouseEventManager,\n type MouseEventManagerBaseOptions,\n pluckMouseEventOptions,\n} from '../managers/MouseEventManager';\nimport { ResizeManager } from '../managers/ResizeManager';\nimport { ScrollSyncManager } from '../managers/ScrollSyncManager';\nimport {\n DiffHunksRenderer,\n type HunksRenderResult,\n} from '../renderers/DiffHunksRenderer';\nimport { SVGSpriteSheet } from '../sprite';\nimport type {\n BaseDiffOptions,\n DiffLineAnnotation,\n ExpansionDirections,\n FileContents,\n FileDiffMetadata,\n HunkData,\n HunkSeparators,\n RenderHeaderMetadataCallback,\n ThemeTypes,\n} from '../types';\nimport { areFilesEqual } from '../utils/areFilesEqual';\nimport { createAnnotationWrapperNode } from '../utils/createAnnotationWrapperNode';\nimport { createCodeNode } from '../utils/createCodeNode';\nimport { createHoverContentNode } from '../utils/createHoverContentNode';\nimport { createUnsafeCSSStyleNode } from '../utils/createUnsafeCSSStyleNode';\nimport { wrapUnsafeCSS } from '../utils/cssWrappers';\nimport { getLineAnnotationName } from '../utils/getLineAnnotationName';\nimport { parseDiffFromFile } from '../utils/parseDiffFromFile';\nimport { prerenderHTMLIfNecessary } from '../utils/prerenderHTMLIfNecessary';\nimport { setPreNodeProperties } from '../utils/setWrapperNodeProps';\nimport type { WorkerPoolManager } from '../worker';\nimport { DiffsContainerLoaded } from './web-components';\n\nexport interface FileDiffRenderProps<LAnnotation> {\n fileDiff?: FileDiffMetadata;\n oldFile?: FileContents;\n newFile?: FileContents;\n forceRender?: boolean;\n fileContainer?: HTMLElement;\n containerWrapper?: HTMLElement;\n lineAnnotations?: DiffLineAnnotation<LAnnotation>[];\n}\n\nexport interface FileDiffHydrationProps<LAnnotation>\n extends Omit<FileDiffRenderProps<LAnnotation>, 'fileContainer'> {\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\n\nexport interface FileDiffOptions<LAnnotation>\n extends Omit<BaseDiffOptions, 'hunkSeparators'>,\n MouseEventManagerBaseOptions<'diff'>,\n LineSelectionOptions {\n hunkSeparators?:\n | Exclude<HunkSeparators, 'custom'>\n | ((\n hunk: HunkData,\n instance: FileDiff<LAnnotation>\n ) => HTMLElement | DocumentFragment);\n disableFileHeader?: boolean;\n renderHeaderMetadata?: RenderHeaderMetadataCallback;\n renderAnnotation?(\n annotation: DiffLineAnnotation<LAnnotation>\n ): HTMLElement | undefined;\n renderHoverUtility?(\n getHoveredRow: () => GetHoveredLineResult<'diff'> | undefined\n ): HTMLElement | null;\n}\n\nlet instanceId = -1;\n\nexport class FileDiff<LAnnotation = undefined> {\n // NOTE(amadeus): We sorta need this to ensure the web-component file is\n // properly loaded\n static LoadedCustomComponent: boolean = DiffsContainerLoaded;\n\n readonly __id: number = ++instanceId;\n\n private fileContainer: HTMLElement | undefined;\n private spriteSVG: SVGElement | undefined;\n private pre: HTMLPreElement | undefined;\n private unsafeCSSStyle: HTMLStyleElement | undefined;\n private hoverContent: HTMLElement | undefined;\n\n private headerElement: HTMLElement | undefined;\n private headerMetadata: HTMLElement | undefined;\n private customHunkElements: HTMLElement[] = [];\n private errorWrapper: HTMLElement | undefined;\n\n private hunksRenderer: DiffHunksRenderer<LAnnotation>;\n private resizeManager: ResizeManager;\n private scrollSyncManager: ScrollSyncManager;\n private mouseEventManager: MouseEventManager<'diff'>;\n private lineSelectionManager: LineSelectionManager;\n\n private annotationElements: HTMLElement[] = [];\n private lineAnnotations: DiffLineAnnotation<LAnnotation>[] = [];\n\n private oldFile: FileContents | undefined;\n private newFile: FileContents | undefined;\n private fileDiff: FileDiffMetadata | undefined;\n\n constructor(\n public options: FileDiffOptions<LAnnotation> = { theme: DEFAULT_THEMES },\n private workerManager?: WorkerPoolManager | undefined,\n // NOTE(amadeus): Temp hack while we use this component in a react context\n private isContainerManaged = false\n ) {\n this.hunksRenderer = new DiffHunksRenderer(\n {\n ...options,\n hunkSeparators:\n typeof options.hunkSeparators === 'function'\n ? 'custom'\n : options.hunkSeparators,\n },\n this.handleHighlightRender,\n this.workerManager\n );\n this.resizeManager = new ResizeManager();\n this.scrollSyncManager = new ScrollSyncManager();\n this.mouseEventManager = new MouseEventManager(\n 'diff',\n pluckMouseEventOptions(\n options,\n typeof options.hunkSeparators === 'function' ||\n (options.hunkSeparators ?? 'line-info') === 'line-info'\n ? this.handleExpandHunk\n : undefined\n )\n );\n this.lineSelectionManager = new LineSelectionManager(\n pluckLineSelectionOptions(options)\n );\n this.workerManager?.subscribeToThemeChanges(this);\n }\n\n private handleHighlightRender = (): void => {\n this.rerender();\n };\n\n // FIXME(amadeus): This is a bit of a looming issue that I'll need to resolve:\n // * Do we publicly allow merging of options or do we have individualized setters?\n // * When setting new options, we need to figure out what settings require a\n // re-render and which can just be applied more elegantly\n // * There's also an issue of options that live here on the File class and\n // those that live on the Hunk class, and it's a bit of an issue with passing\n // settings down and mirroring them (not great...)\n setOptions(options: FileDiffOptions<LAnnotation> | undefined): void {\n if (options == null) return;\n this.options = options;\n this.hunksRenderer.setOptions({\n ...this.options,\n hunkSeparators:\n typeof options.hunkSeparators === 'function'\n ? 'custom'\n : options.hunkSeparators,\n });\n this.mouseEventManager.setOptions(\n pluckMouseEventOptions(\n options,\n typeof options.hunkSeparators === 'function' ||\n (options.hunkSeparators ?? 'line-info') === 'line-info'\n ? this.handleExpandHunk\n : undefined\n )\n );\n this.lineSelectionManager.setOptions(pluckLineSelectionOptions(options));\n }\n\n private mergeOptions(options: Partial<FileDiffOptions<LAnnotation>>): void {\n this.options = { ...this.options, ...options };\n }\n\n setThemeType(themeType: ThemeTypes): void {\n if ((this.options.themeType ?? 'system') === themeType) {\n return;\n }\n this.mergeOptions({ themeType });\n this.hunksRenderer.setThemeType(themeType);\n\n if (this.headerElement != null) {\n if (themeType === 'system') {\n delete this.headerElement.dataset.themeType;\n } else {\n this.headerElement.dataset.themeType = themeType;\n }\n }\n\n // Update pre element theme mode\n if (this.pre != null) {\n switch (themeType) {\n case 'system':\n delete this.pre.dataset.themeType;\n break;\n case 'light':\n case 'dark':\n this.pre.dataset.themeType = themeType;\n break;\n }\n }\n }\n\n getHoveredLine = (): GetHoveredLineResult<'diff'> | undefined => {\n return this.mouseEventManager.getHoveredLine();\n };\n\n setLineAnnotations(lineAnnotations: DiffLineAnnotation<LAnnotation>[]): void {\n this.lineAnnotations = lineAnnotations;\n }\n\n setSelectedLines(range: SelectedLineRange | null): void {\n this.lineSelectionManager.setSelection(range);\n }\n\n cleanUp(): void {\n this.hunksRenderer.cleanUp();\n this.resizeManager.cleanUp();\n this.mouseEventManager.cleanUp();\n this.scrollSyncManager.cleanUp();\n this.lineSelectionManager.cleanUp();\n this.workerManager?.unsubscribeToThemeChanges(this);\n this.workerManager = undefined;\n\n // Clean up the data\n this.fileDiff = undefined;\n this.oldFile = undefined;\n this.newFile = undefined;\n\n // Clean up the elements\n if (!this.isContainerManaged) {\n this.fileContainer?.parentNode?.removeChild(this.fileContainer);\n }\n if (this.fileContainer?.shadowRoot != null) {\n this.fileContainer.shadowRoot.innerHTML = '';\n }\n this.fileContainer = undefined;\n this.pre = undefined;\n this.headerElement = undefined;\n this.errorWrapper = undefined;\n }\n\n hydrate(props: FileDiffHydrationProps<LAnnotation>): void {\n const { fileContainer, prerenderedHTML } = props;\n prerenderHTMLIfNecessary(fileContainer, prerenderedHTML);\n for (const element of Array.from(\n fileContainer.shadowRoot?.children ?? []\n )) {\n if (element instanceof SVGElement) {\n this.spriteSVG = element;\n continue;\n }\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (element instanceof HTMLPreElement) {\n this.pre = element;\n continue;\n }\n if ('diffsHeader' in element.dataset) {\n this.headerElement = element;\n continue;\n }\n if (\n element instanceof HTMLStyleElement &&\n element.hasAttribute(UNSAFE_CSS_ATTRIBUTE)\n ) {\n this.unsafeCSSStyle = element;\n continue;\n }\n }\n // If we have no pre tag, then we should render\n if (this.pre == null) {\n this.render(props);\n }\n // Otherwise orchestrate our setup\n else {\n const { lineAnnotations, oldFile, newFile, fileDiff } = props;\n this.fileContainer = fileContainer;\n delete this.pre.dataset.dehydrated;\n\n this.lineAnnotations = lineAnnotations ?? this.lineAnnotations;\n this.newFile = newFile;\n this.oldFile = oldFile;\n this.fileDiff =\n fileDiff ??\n (oldFile != null && newFile != null\n ? parseDiffFromFile(oldFile, newFile)\n : undefined);\n\n this.hunksRenderer.hydrate(this.fileDiff);\n // FIXME(amadeus): not sure how to handle this yet...\n // this.renderSeparators();\n this.renderAnnotations();\n this.renderHoverUtility();\n this.injectUnsafeCSS();\n this.mouseEventManager.setup(this.pre);\n this.lineSelectionManager.setup(this.pre);\n if ((this.options.overflow ?? 'scroll') === 'scroll') {\n this.resizeManager.setup(this.pre);\n if ((this.options.diffStyle ?? 'split') === 'split') {\n this.scrollSyncManager.setup(this.pre);\n }\n }\n }\n }\n\n rerender(): void {\n if (this.fileDiff == null && this.newFile == null && this.oldFile == null) {\n return;\n }\n this.render({\n oldFile: this.oldFile,\n newFile: this.newFile,\n fileDiff: this.fileDiff,\n forceRender: true,\n });\n }\n\n handleExpandHunk = (\n hunkIndex: number,\n direction: ExpansionDirections\n ): void => {\n this.expandHunk(hunkIndex, direction);\n };\n\n expandHunk(hunkIndex: number, direction: ExpansionDirections): void {\n this.hunksRenderer.expandHunk(hunkIndex, direction);\n this.rerender();\n }\n\n render({\n oldFile,\n newFile,\n fileDiff,\n forceRender = false,\n lineAnnotations,\n fileContainer,\n containerWrapper,\n }: FileDiffRenderProps<LAnnotation>): void {\n const filesDidChange =\n oldFile != null &&\n newFile != null &&\n (!areFilesEqual(oldFile, this.oldFile) ||\n !areFilesEqual(newFile, this.newFile));\n const annotationsChanged =\n lineAnnotations != null &&\n (lineAnnotations.length > 0 || this.lineAnnotations.length > 0)\n ? lineAnnotations !== this.lineAnnotations\n : false;\n if (\n !forceRender &&\n !annotationsChanged &&\n // If using the fileDiff API, lets check to see if they are equal to\n // avoid doing work\n ((fileDiff != null && fileDiff === this.fileDiff) ||\n // If using the oldFile/newFile API then lets check to see if they are\n // equal\n (fileDiff == null && !filesDidChange))\n ) {\n return;\n }\n\n this.oldFile = oldFile;\n this.newFile = newFile;\n if (fileDiff != null) {\n this.fileDiff = fileDiff;\n } else if (oldFile != null && newFile != null && filesDidChange) {\n this.fileDiff = parseDiffFromFile(oldFile, newFile);\n }\n\n if (lineAnnotations != null) {\n this.setLineAnnotations(lineAnnotations);\n }\n if (this.fileDiff == null) {\n return;\n }\n this.hunksRenderer.setOptions({\n ...this.options,\n hunkSeparators:\n typeof this.options.hunkSeparators === 'function'\n ? 'custom'\n : this.options.hunkSeparators,\n });\n\n this.hunksRenderer.setLineAnnotations(this.lineAnnotations);\n\n const { disableFileHeader = false } = this.options;\n\n if (disableFileHeader) {\n // Remove existing header from DOM\n if (this.headerElement != null) {\n this.headerElement.parentNode?.removeChild(this.headerElement);\n this.headerElement = undefined;\n }\n }\n fileContainer = this.getOrCreateFileContainer(\n fileContainer,\n containerWrapper\n );\n\n try {\n const hunksResult = this.hunksRenderer.renderDiff(this.fileDiff);\n if (hunksResult == null) {\n if (this.workerManager != null && !this.workerManager.isInitialized()) {\n void this.workerManager.initialize().then(() => this.rerender());\n }\n return;\n }\n\n if (hunksResult.headerElement != null) {\n this.applyHeaderToDOM(hunksResult.headerElement, fileContainer);\n }\n const pre = this.getOrCreatePreNode(fileContainer);\n this.applyHunksToDOM(pre, hunksResult);\n this.renderSeparators(hunksResult.hunkData);\n this.renderAnnotations();\n this.renderHoverUtility();\n } catch (error: unknown) {\n if (error instanceof Error) {\n this.applyErrorToDOM(error, fileContainer);\n }\n }\n }\n\n private renderSeparators(hunkData: HunkData[]): void {\n const { hunkSeparators } = this.options;\n if (\n this.isContainerManaged ||\n this.fileContainer == null ||\n typeof hunkSeparators !== 'function'\n ) {\n return;\n }\n for (const element of this.customHunkElements) {\n element.parentNode?.removeChild(element);\n }\n this.customHunkElements.length = 0;\n for (const hunk of hunkData) {\n const element = document.createElement('div');\n element.style.display = 'contents';\n element.slot = hunk.slotName;\n element.appendChild(hunkSeparators(hunk, this));\n this.fileContainer.appendChild(element);\n this.customHunkElements.push(element);\n }\n }\n\n private renderAnnotations(): void {\n if (this.isContainerManaged || this.fileContainer == null) {\n return;\n }\n // Handle annotation elements\n for (const element of this.annotationElements) {\n element.parentNode?.removeChild(element);\n }\n this.annotationElements.length = 0;\n\n const { renderAnnotation } = this.options;\n if (renderAnnotation != null && this.lineAnnotations.length > 0) {\n for (const annotation of this.lineAnnotations) {\n const content = renderAnnotation(annotation);\n if (content == null) continue;\n const el = createAnnotationWrapperNode(\n getLineAnnotationName(annotation)\n );\n el.appendChild(content);\n this.annotationElements.push(el);\n this.fileContainer.appendChild(el);\n }\n }\n }\n\n private renderHoverUtility() {\n const { renderHoverUtility } = this.options;\n if (this.fileContainer == null || renderHoverUtility == null) return;\n if (this.hoverContent == null) {\n this.hoverContent = createHoverContentNode();\n this.fileContainer.appendChild(this.hoverContent);\n }\n const element = renderHoverUtility(this.mouseEventManager.getHoveredLine);\n this.hoverContent.innerHTML = '';\n if (element != null) {\n this.hoverContent.appendChild(element);\n }\n }\n\n private getOrCreateFileContainer(\n fileContainer?: HTMLElement,\n parentNode?: HTMLElement\n ): HTMLElement {\n this.fileContainer =\n fileContainer ??\n this.fileContainer ??\n document.createElement(DIFFS_TAG_NAME);\n if (parentNode != null && this.fileContainer.parentNode !== parentNode) {\n parentNode.appendChild(this.fileContainer);\n }\n if (this.spriteSVG == null) {\n const fragment = document.createElement('div');\n fragment.innerHTML = SVGSpriteSheet;\n const firstChild = fragment.firstChild;\n if (firstChild instanceof SVGElement) {\n this.spriteSVG = firstChild;\n this.fileContainer.shadowRoot?.appendChild(this.spriteSVG);\n }\n }\n return this.fileContainer;\n }\n\n getFileContainer(): HTMLElement | undefined {\n return this.fileContainer;\n }\n\n private getOrCreatePreNode(container: HTMLElement): HTMLPreElement {\n // If we haven't created a pre element yet, lets go ahead and do that\n if (this.pre == null) {\n this.pre = document.createElement('pre');\n container.shadowRoot?.appendChild(this.pre);\n }\n // If we have a new parent container for the pre element, lets go ahead and\n // move it into the new container\n else if (this.pre.parentNode !== container) {\n container.shadowRoot?.appendChild(this.pre);\n }\n return this.pre;\n }\n\n private applyHeaderToDOM(\n headerAST: HASTElement,\n container: HTMLElement\n ): void {\n this.cleanupErrorWrapper();\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = toHtml(headerAST);\n const newHeader = tempDiv.firstElementChild;\n if (!(newHeader instanceof HTMLElement)) {\n return;\n }\n if (this.headerElement != null) {\n container.shadowRoot?.replaceChild(newHeader, this.headerElement);\n } else {\n container.shadowRoot?.prepend(newHeader);\n }\n this.headerElement = newHeader;\n\n if (this.isContainerManaged) return;\n\n const { renderHeaderMetadata } = this.options;\n if (this.headerMetadata != null) {\n this.headerMetadata.parentNode?.removeChild(this.headerMetadata);\n }\n const content =\n renderHeaderMetadata?.({\n oldFile: this.oldFile,\n newFile: this.newFile,\n fileDiff: this.fileDiff,\n }) ?? undefined;\n if (content != null) {\n this.headerMetadata = document.createElement('div');\n this.headerMetadata.slot = HEADER_METADATA_SLOT_ID;\n if (content instanceof Element) {\n this.headerMetadata.appendChild(content);\n } else {\n this.headerMetadata.innerText = `${content}`;\n }\n container.appendChild(this.headerMetadata);\n }\n }\n\n private injectUnsafeCSS(): void {\n if (this.fileContainer?.shadowRoot == null) {\n return;\n }\n const { unsafeCSS } = this.options;\n\n if (unsafeCSS == null || unsafeCSS === '') {\n return;\n }\n\n // Create or update the style element\n if (this.unsafeCSSStyle == null) {\n this.unsafeCSSStyle = createUnsafeCSSStyleNode();\n this.fileContainer.shadowRoot.appendChild(this.unsafeCSSStyle);\n }\n // Wrap in @layer unsafe to match SSR behavior\n this.unsafeCSSStyle.innerText = wrapUnsafeCSS(unsafeCSS);\n }\n\n private applyHunksToDOM(\n pre: HTMLPreElement,\n result: HunksRenderResult\n ): void {\n this.cleanupErrorWrapper();\n this.applyPreNodeAttributes(pre, result);\n\n // Clear existing content\n pre.innerHTML = '';\n\n let codeDeletions: HTMLElement | undefined;\n let codeAdditions: HTMLElement | undefined;\n // Create code elements and insert HTML content\n if (result.unifiedAST != null) {\n const codeUnified = createCodeNode({ columnType: 'unified' });\n codeUnified.innerHTML = this.hunksRenderer.renderPartialHTML(\n result.unifiedAST\n );\n pre.appendChild(codeUnified);\n } else {\n if (result.deletionsAST != null) {\n codeDeletions = createCodeNode({ columnType: 'deletions' });\n codeDeletions.innerHTML = this.hunksRenderer.renderPartialHTML(\n result.deletionsAST\n );\n pre.appendChild(codeDeletions);\n }\n if (result.additionsAST != null) {\n codeAdditions = createCodeNode({ columnType: 'additions' });\n codeAdditions.innerHTML = this.hunksRenderer.renderPartialHTML(\n result.additionsAST\n );\n pre.appendChild(codeAdditions);\n }\n }\n\n this.injectUnsafeCSS();\n\n this.mouseEventManager.setup(pre);\n this.lineSelectionManager.setup(pre);\n if ((this.options.overflow ?? 'scroll') === 'scroll') {\n this.resizeManager.setup(pre);\n 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 split =\n diffStyle === 'unified'\n ? false\n : additionsAST != null && deletionsAST != null;\n setPreNodeProperties({\n pre,\n diffIndicators,\n disableBackground,\n disableLineNumbers,\n overflow,\n split,\n themeStyles,\n themeType: baseThemeType ?? themeType,\n totalLines,\n });\n }\n\n private applyErrorToDOM(error: Error, container: HTMLElement) {\n this.cleanupErrorWrapper();\n const pre = this.getOrCreatePreNode(container);\n pre.innerHTML = '';\n pre.parentNode?.removeChild(pre);\n this.pre = undefined;\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n this.errorWrapper ??= document.createElement('div');\n this.errorWrapper.dataset.errorWrapper = '';\n this.errorWrapper.innerHTML = '';\n shadowRoot.appendChild(this.errorWrapper);\n const errorMessage = document.createElement('div');\n errorMessage.dataset.errorMessage = '';\n errorMessage.innerText = error.message;\n this.errorWrapper.appendChild(errorMessage);\n const errorStack = document.createElement('pre');\n errorStack.dataset.errorStack = '';\n errorStack.innerText = error.stack ?? 'No Error Stack';\n this.errorWrapper.appendChild(errorStack);\n }\n\n private cleanupErrorWrapper() {\n this.errorWrapper?.parentNode?.removeChild(this.errorWrapper);\n this.errorWrapper = undefined;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"FileDiff.js","names":["options: FileDiffOptions<LAnnotation>","workerManager?: WorkerPoolManager | undefined","error: unknown","codeDeletions: HTMLElement | undefined","codeAdditions: HTMLElement | undefined"],"sources":["../../src/components/FileDiff.ts"],"sourcesContent":["import type { Element as HASTElement } from 'hast';\nimport { toHtml } from 'hast-util-to-html';\n\nimport {\n DEFAULT_THEMES,\n DIFFS_TAG_NAME,\n HEADER_METADATA_SLOT_ID,\n UNSAFE_CSS_ATTRIBUTE,\n} from '../constants';\nimport {\n LineSelectionManager,\n type LineSelectionOptions,\n type SelectedLineRange,\n pluckLineSelectionOptions,\n} from '../managers/LineSelectionManager';\nimport {\n type GetHoveredLineResult,\n MouseEventManager,\n type MouseEventManagerBaseOptions,\n pluckMouseEventOptions,\n} from '../managers/MouseEventManager';\nimport { ResizeManager } from '../managers/ResizeManager';\nimport { ScrollSyncManager } from '../managers/ScrollSyncManager';\nimport {\n DiffHunksRenderer,\n type HunksRenderResult,\n} from '../renderers/DiffHunksRenderer';\nimport { SVGSpriteSheet } from '../sprite';\nimport type {\n BaseDiffOptions,\n DiffLineAnnotation,\n ExpansionDirections,\n FileContents,\n FileDiffMetadata,\n HunkData,\n HunkSeparators,\n RenderHeaderMetadataCallback,\n ThemeTypes,\n} from '../types';\nimport { areFilesEqual } from '../utils/areFilesEqual';\nimport { createAnnotationWrapperNode } from '../utils/createAnnotationWrapperNode';\nimport { createCodeNode } from '../utils/createCodeNode';\nimport { createHoverContentNode } from '../utils/createHoverContentNode';\nimport { createUnsafeCSSStyleNode } from '../utils/createUnsafeCSSStyleNode';\nimport { wrapUnsafeCSS } from '../utils/cssWrappers';\nimport { getLineAnnotationName } from '../utils/getLineAnnotationName';\nimport { parseDiffFromFile } from '../utils/parseDiffFromFile';\nimport { prerenderHTMLIfNecessary } from '../utils/prerenderHTMLIfNecessary';\nimport { setPreNodeProperties } from '../utils/setWrapperNodeProps';\nimport type { WorkerPoolManager } from '../worker';\nimport { DiffsContainerLoaded } from './web-components';\n\nexport interface FileDiffRenderProps<LAnnotation> {\n fileDiff?: FileDiffMetadata;\n oldFile?: FileContents;\n newFile?: FileContents;\n forceRender?: boolean;\n fileContainer?: HTMLElement;\n containerWrapper?: HTMLElement;\n lineAnnotations?: DiffLineAnnotation<LAnnotation>[];\n}\n\nexport interface FileDiffHydrationProps<LAnnotation>\n extends Omit<FileDiffRenderProps<LAnnotation>, 'fileContainer'> {\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\n\nexport interface FileDiffOptions<LAnnotation>\n extends Omit<BaseDiffOptions, 'hunkSeparators'>,\n MouseEventManagerBaseOptions<'diff'>,\n LineSelectionOptions {\n hunkSeparators?:\n | Exclude<HunkSeparators, 'custom'>\n | ((\n hunk: HunkData,\n instance: FileDiff<LAnnotation>\n ) => HTMLElement | DocumentFragment);\n disableFileHeader?: boolean;\n renderHeaderMetadata?: RenderHeaderMetadataCallback;\n /**\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\nlet instanceId = -1;\n\nexport class FileDiff<LAnnotation = undefined> {\n // NOTE(amadeus): We sorta need this to ensure the web-component file is\n // properly loaded\n static LoadedCustomComponent: boolean = DiffsContainerLoaded;\n\n readonly __id: number = ++instanceId;\n\n private fileContainer: HTMLElement | undefined;\n private spriteSVG: SVGElement | undefined;\n private pre: HTMLPreElement | undefined;\n private unsafeCSSStyle: HTMLStyleElement | undefined;\n private hoverContent: HTMLElement | undefined;\n\n private headerElement: HTMLElement | undefined;\n private headerMetadata: HTMLElement | undefined;\n private customHunkElements: HTMLElement[] = [];\n private errorWrapper: HTMLElement | undefined;\n\n private hunksRenderer: DiffHunksRenderer<LAnnotation>;\n private resizeManager: ResizeManager;\n private scrollSyncManager: ScrollSyncManager;\n private mouseEventManager: MouseEventManager<'diff'>;\n private lineSelectionManager: LineSelectionManager;\n\n private annotationElements: HTMLElement[] = [];\n private lineAnnotations: DiffLineAnnotation<LAnnotation>[] = [];\n\n private oldFile: FileContents | undefined;\n private newFile: FileContents | undefined;\n private fileDiff: FileDiffMetadata | undefined;\n\n constructor(\n public options: FileDiffOptions<LAnnotation> = { theme: DEFAULT_THEMES },\n private workerManager?: WorkerPoolManager | undefined,\n // NOTE(amadeus): Temp hack while we use this component in a react context\n private isContainerManaged = false\n ) {\n this.hunksRenderer = new DiffHunksRenderer(\n {\n ...options,\n hunkSeparators:\n typeof options.hunkSeparators === 'function'\n ? 'custom'\n : options.hunkSeparators,\n },\n this.handleHighlightRender,\n this.workerManager\n );\n this.resizeManager = new ResizeManager();\n this.scrollSyncManager = new ScrollSyncManager();\n this.mouseEventManager = new MouseEventManager(\n 'diff',\n pluckMouseEventOptions(\n options,\n typeof options.hunkSeparators === 'function' ||\n (options.hunkSeparators ?? 'line-info') === 'line-info'\n ? this.handleExpandHunk\n : undefined\n )\n );\n this.lineSelectionManager = new LineSelectionManager(\n pluckLineSelectionOptions(options)\n );\n this.workerManager?.subscribeToThemeChanges(this);\n }\n\n private handleHighlightRender = (): void => {\n this.rerender();\n };\n\n // FIXME(amadeus): This is a bit of a looming issue that I'll need to resolve:\n // * Do we publicly allow merging of options or do we have individualized setters?\n // * When setting new options, we need to figure out what settings require a\n // re-render and which can just be applied more elegantly\n // * There's also an issue of options that live here on the File class and\n // those that live on the Hunk class, and it's a bit of an issue with passing\n // settings down and mirroring them (not great...)\n setOptions(options: FileDiffOptions<LAnnotation> | undefined): void {\n if (options == null) return;\n this.options = options;\n this.hunksRenderer.setOptions({\n ...this.options,\n hunkSeparators:\n typeof options.hunkSeparators === 'function'\n ? 'custom'\n : options.hunkSeparators,\n });\n this.mouseEventManager.setOptions(\n pluckMouseEventOptions(\n options,\n typeof options.hunkSeparators === 'function' ||\n (options.hunkSeparators ?? 'line-info') === 'line-info'\n ? this.handleExpandHunk\n : undefined\n )\n );\n this.lineSelectionManager.setOptions(pluckLineSelectionOptions(options));\n }\n\n private mergeOptions(options: Partial<FileDiffOptions<LAnnotation>>): void {\n this.options = { ...this.options, ...options };\n }\n\n setThemeType(themeType: ThemeTypes): void {\n if ((this.options.themeType ?? 'system') === themeType) {\n return;\n }\n this.mergeOptions({ themeType });\n this.hunksRenderer.setThemeType(themeType);\n\n if (this.headerElement != null) {\n if (themeType === 'system') {\n delete this.headerElement.dataset.themeType;\n } else {\n this.headerElement.dataset.themeType = themeType;\n }\n }\n\n // Update pre element theme mode\n if (this.pre != null) {\n switch (themeType) {\n case 'system':\n delete this.pre.dataset.themeType;\n break;\n case 'light':\n case 'dark':\n this.pre.dataset.themeType = themeType;\n break;\n }\n }\n }\n\n getHoveredLine = (): GetHoveredLineResult<'diff'> | undefined => {\n return this.mouseEventManager.getHoveredLine();\n };\n\n setLineAnnotations(lineAnnotations: DiffLineAnnotation<LAnnotation>[]): void {\n this.lineAnnotations = lineAnnotations;\n }\n\n setSelectedLines(range: SelectedLineRange | null): void {\n this.lineSelectionManager.setSelection(range);\n }\n\n cleanUp(): void {\n this.hunksRenderer.cleanUp();\n this.resizeManager.cleanUp();\n this.mouseEventManager.cleanUp();\n this.scrollSyncManager.cleanUp();\n this.lineSelectionManager.cleanUp();\n this.workerManager?.unsubscribeToThemeChanges(this);\n this.workerManager = undefined;\n\n // Clean up the data\n this.fileDiff = undefined;\n this.oldFile = undefined;\n this.newFile = undefined;\n\n // Clean up the elements\n if (!this.isContainerManaged) {\n this.fileContainer?.parentNode?.removeChild(this.fileContainer);\n }\n if (this.fileContainer?.shadowRoot != null) {\n this.fileContainer.shadowRoot.innerHTML = '';\n }\n this.fileContainer = undefined;\n this.pre = undefined;\n this.headerElement = undefined;\n this.errorWrapper = undefined;\n }\n\n hydrate(props: FileDiffHydrationProps<LAnnotation>): void {\n const { fileContainer, prerenderedHTML } = props;\n prerenderHTMLIfNecessary(fileContainer, prerenderedHTML);\n for (const element of Array.from(\n fileContainer.shadowRoot?.children ?? []\n )) {\n if (element instanceof SVGElement) {\n this.spriteSVG = element;\n continue;\n }\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (element instanceof HTMLPreElement) {\n this.pre = element;\n continue;\n }\n if ('diffsHeader' in element.dataset) {\n this.headerElement = element;\n continue;\n }\n if (\n element instanceof HTMLStyleElement &&\n element.hasAttribute(UNSAFE_CSS_ATTRIBUTE)\n ) {\n this.unsafeCSSStyle = element;\n continue;\n }\n }\n // If we have no pre tag, then we should render\n if (this.pre == null) {\n this.render(props);\n }\n // Otherwise orchestrate our setup\n else {\n const { lineAnnotations, oldFile, newFile, fileDiff } = props;\n this.fileContainer = fileContainer;\n delete this.pre.dataset.dehydrated;\n\n this.lineAnnotations = lineAnnotations ?? this.lineAnnotations;\n this.newFile = newFile;\n this.oldFile = oldFile;\n this.fileDiff =\n fileDiff ??\n (oldFile != null && newFile != null\n ? parseDiffFromFile(oldFile, newFile)\n : undefined);\n\n this.hunksRenderer.hydrate(this.fileDiff);\n // FIXME(amadeus): not sure how to handle this yet...\n // this.renderSeparators();\n this.renderAnnotations();\n this.renderHoverUtility();\n this.injectUnsafeCSS();\n this.mouseEventManager.setup(this.pre);\n this.lineSelectionManager.setup(this.pre);\n if ((this.options.overflow ?? 'scroll') === 'scroll') {\n this.resizeManager.setup(this.pre);\n if ((this.options.diffStyle ?? 'split') === 'split') {\n this.scrollSyncManager.setup(this.pre);\n }\n }\n }\n }\n\n rerender(): void {\n if (this.fileDiff == null && this.newFile == null && this.oldFile == null) {\n return;\n }\n this.render({\n oldFile: this.oldFile,\n newFile: this.newFile,\n fileDiff: this.fileDiff,\n forceRender: true,\n });\n }\n\n handleExpandHunk = (\n hunkIndex: number,\n direction: ExpansionDirections\n ): void => {\n this.expandHunk(hunkIndex, direction);\n };\n\n expandHunk(hunkIndex: number, direction: ExpansionDirections): void {\n this.hunksRenderer.expandHunk(hunkIndex, direction);\n this.rerender();\n }\n\n render({\n oldFile,\n newFile,\n fileDiff,\n forceRender = false,\n lineAnnotations,\n fileContainer,\n containerWrapper,\n }: FileDiffRenderProps<LAnnotation>): void {\n const filesDidChange =\n oldFile != null &&\n newFile != null &&\n (!areFilesEqual(oldFile, this.oldFile) ||\n !areFilesEqual(newFile, this.newFile));\n const annotationsChanged =\n lineAnnotations != null &&\n (lineAnnotations.length > 0 || this.lineAnnotations.length > 0)\n ? lineAnnotations !== this.lineAnnotations\n : false;\n if (\n !forceRender &&\n !annotationsChanged &&\n // If using the fileDiff API, lets check to see if they are equal to\n // avoid doing work\n ((fileDiff != null && fileDiff === this.fileDiff) ||\n // If using the oldFile/newFile API then lets check to see if they are\n // equal\n (fileDiff == null && !filesDidChange))\n ) {\n return;\n }\n\n this.oldFile = oldFile;\n this.newFile = newFile;\n if (fileDiff != null) {\n this.fileDiff = fileDiff;\n } else if (oldFile != null && newFile != null && filesDidChange) {\n this.fileDiff = parseDiffFromFile(oldFile, newFile);\n }\n\n if (lineAnnotations != null) {\n this.setLineAnnotations(lineAnnotations);\n }\n if (this.fileDiff == null) {\n return;\n }\n this.hunksRenderer.setOptions({\n ...this.options,\n hunkSeparators:\n typeof this.options.hunkSeparators === 'function'\n ? 'custom'\n : this.options.hunkSeparators,\n });\n\n this.hunksRenderer.setLineAnnotations(this.lineAnnotations);\n\n const { disableFileHeader = false, 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 }\n }\n fileContainer = this.getOrCreateFileContainer(\n fileContainer,\n containerWrapper\n );\n\n try {\n const hunksResult = this.hunksRenderer.renderDiff(this.fileDiff);\n if (hunksResult == null) {\n if (this.workerManager != null && !this.workerManager.isInitialized()) {\n void this.workerManager.initialize().then(() => this.rerender());\n }\n return;\n }\n\n if (hunksResult.headerElement != null) {\n this.applyHeaderToDOM(hunksResult.headerElement, fileContainer);\n }\n const pre = this.getOrCreatePreNode(fileContainer);\n this.applyHunksToDOM(pre, hunksResult);\n this.renderSeparators(hunksResult.hunkData);\n this.renderAnnotations();\n this.renderHoverUtility();\n } catch (error: unknown) {\n if (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 return;\n }\n for (const element of this.customHunkElements) {\n element.parentNode?.removeChild(element);\n }\n this.customHunkElements.length = 0;\n for (const hunk of hunkData) {\n const element = document.createElement('div');\n element.style.display = 'contents';\n element.slot = hunk.slotName;\n element.appendChild(hunkSeparators(hunk, this));\n this.fileContainer.appendChild(element);\n this.customHunkElements.push(element);\n }\n }\n\n private renderAnnotations(): void {\n if (this.isContainerManaged || this.fileContainer == null) {\n return;\n }\n // Handle annotation elements\n for (const element of this.annotationElements) {\n element.parentNode?.removeChild(element);\n }\n this.annotationElements.length = 0;\n\n const { renderAnnotation } = this.options;\n if (renderAnnotation != null && this.lineAnnotations.length > 0) {\n for (const annotation of this.lineAnnotations) {\n const content = renderAnnotation(annotation);\n if (content == null) continue;\n const el = createAnnotationWrapperNode(\n getLineAnnotationName(annotation)\n );\n el.appendChild(content);\n this.annotationElements.push(el);\n this.fileContainer.appendChild(el);\n }\n }\n }\n\n private renderHoverUtility() {\n const { renderHoverUtility } = this.options;\n if (this.fileContainer == null || renderHoverUtility == null) return;\n if (this.hoverContent == null) {\n this.hoverContent = createHoverContentNode();\n this.fileContainer.appendChild(this.hoverContent);\n }\n const element = renderHoverUtility(this.mouseEventManager.getHoveredLine);\n this.hoverContent.innerHTML = '';\n if (element != null) {\n this.hoverContent.appendChild(element);\n }\n }\n\n private getOrCreateFileContainer(\n fileContainer?: HTMLElement,\n parentNode?: HTMLElement\n ): HTMLElement {\n this.fileContainer =\n fileContainer ??\n this.fileContainer ??\n document.createElement(DIFFS_TAG_NAME);\n if (parentNode != null && this.fileContainer.parentNode !== parentNode) {\n parentNode.appendChild(this.fileContainer);\n }\n if (this.spriteSVG == null) {\n const fragment = document.createElement('div');\n fragment.innerHTML = SVGSpriteSheet;\n const firstChild = fragment.firstChild;\n if (firstChild instanceof SVGElement) {\n this.spriteSVG = firstChild;\n this.fileContainer.shadowRoot?.appendChild(this.spriteSVG);\n }\n }\n return this.fileContainer;\n }\n\n getFileContainer(): HTMLElement | undefined {\n return this.fileContainer;\n }\n\n private getOrCreatePreNode(container: HTMLElement): HTMLPreElement {\n // If we haven't created a pre element yet, lets go ahead and do that\n if (this.pre == null) {\n this.pre = document.createElement('pre');\n container.shadowRoot?.appendChild(this.pre);\n }\n // If we have a new parent container for the pre element, lets go ahead and\n // move it into the new container\n else if (this.pre.parentNode !== container) {\n container.shadowRoot?.appendChild(this.pre);\n }\n return this.pre;\n }\n\n private applyHeaderToDOM(\n headerAST: HASTElement,\n container: HTMLElement\n ): void {\n this.cleanupErrorWrapper();\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = toHtml(headerAST);\n const newHeader = tempDiv.firstElementChild;\n if (!(newHeader instanceof HTMLElement)) {\n return;\n }\n if (this.headerElement != null) {\n container.shadowRoot?.replaceChild(newHeader, this.headerElement);\n } else {\n container.shadowRoot?.prepend(newHeader);\n }\n this.headerElement = newHeader;\n\n if (this.isContainerManaged) return;\n\n const { renderHeaderMetadata } = this.options;\n if (this.headerMetadata != null) {\n this.headerMetadata.parentNode?.removeChild(this.headerMetadata);\n }\n const content =\n renderHeaderMetadata?.({\n oldFile: this.oldFile,\n newFile: this.newFile,\n fileDiff: this.fileDiff,\n }) ?? undefined;\n if (content != null) {\n this.headerMetadata = document.createElement('div');\n this.headerMetadata.slot = HEADER_METADATA_SLOT_ID;\n if (content instanceof Element) {\n this.headerMetadata.appendChild(content);\n } else {\n this.headerMetadata.innerText = `${content}`;\n }\n container.appendChild(this.headerMetadata);\n }\n }\n\n private injectUnsafeCSS(): void {\n if (this.fileContainer?.shadowRoot == null) {\n return;\n }\n const { unsafeCSS } = this.options;\n\n if (unsafeCSS == null || unsafeCSS === '') {\n return;\n }\n\n // Create or update the style element\n if (this.unsafeCSSStyle == null) {\n this.unsafeCSSStyle = createUnsafeCSSStyleNode();\n this.fileContainer.shadowRoot.appendChild(this.unsafeCSSStyle);\n }\n // Wrap in @layer unsafe to match SSR behavior\n this.unsafeCSSStyle.innerText = wrapUnsafeCSS(unsafeCSS);\n }\n\n private applyHunksToDOM(\n pre: HTMLPreElement,\n result: HunksRenderResult\n ): void {\n this.cleanupErrorWrapper();\n this.applyPreNodeAttributes(pre, result);\n\n // Clear existing content\n pre.innerHTML = '';\n\n let codeDeletions: HTMLElement | undefined;\n let codeAdditions: HTMLElement | undefined;\n // Create code elements and insert HTML content\n if (result.unifiedAST != null) {\n const codeUnified = createCodeNode({ columnType: 'unified' });\n codeUnified.innerHTML = this.hunksRenderer.renderPartialHTML(\n result.unifiedAST\n );\n pre.appendChild(codeUnified);\n } else {\n if (result.deletionsAST != null) {\n codeDeletions = createCodeNode({ columnType: 'deletions' });\n codeDeletions.innerHTML = this.hunksRenderer.renderPartialHTML(\n result.deletionsAST\n );\n pre.appendChild(codeDeletions);\n }\n if (result.additionsAST != null) {\n codeAdditions = createCodeNode({ columnType: 'additions' });\n codeAdditions.innerHTML = this.hunksRenderer.renderPartialHTML(\n result.additionsAST\n );\n pre.appendChild(codeAdditions);\n }\n }\n\n this.injectUnsafeCSS();\n\n this.mouseEventManager.setup(pre);\n this.lineSelectionManager.setup(pre);\n if ((this.options.overflow ?? 'scroll') === 'scroll') {\n this.resizeManager.setup(pre);\n 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 split =\n diffStyle === 'unified'\n ? false\n : additionsAST != null && deletionsAST != null;\n setPreNodeProperties({\n pre,\n diffIndicators,\n disableBackground,\n disableLineNumbers,\n overflow,\n split,\n themeStyles,\n themeType: baseThemeType ?? themeType,\n totalLines,\n });\n }\n\n private applyErrorToDOM(error: Error, container: HTMLElement) {\n this.cleanupErrorWrapper();\n const pre = this.getOrCreatePreNode(container);\n pre.innerHTML = '';\n pre.parentNode?.removeChild(pre);\n this.pre = undefined;\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n this.errorWrapper ??= document.createElement('div');\n this.errorWrapper.dataset.errorWrapper = '';\n this.errorWrapper.innerHTML = '';\n shadowRoot.appendChild(this.errorWrapper);\n const errorMessage = document.createElement('div');\n errorMessage.dataset.errorMessage = '';\n errorMessage.innerText = error.message;\n this.errorWrapper.appendChild(errorMessage);\n const errorStack = document.createElement('pre');\n errorStack.dataset.errorStack = '';\n errorStack.innerText = error.stack ?? 'No Error Stack';\n this.errorWrapper.appendChild(errorStack);\n }\n\n private cleanupErrorWrapper() {\n this.errorWrapper?.parentNode?.removeChild(this.errorWrapper);\n this.errorWrapper = undefined;\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pierre/diffs",
3
- "version": "1.0.9",
3
+ "version": "1.0.10",
4
4
  "type": "module",
5
5
  "license": "apache-2.0",
6
6
  "scripts": {
@@ -77,7 +77,7 @@
77
77
  "@shikijs/core": "^3.0.0",
78
78
  "@shikijs/engine-javascript": "^3.0.0",
79
79
  "@shikijs/transformers": "^3.0.0",
80
- "diff": "8.0.2",
80
+ "diff": "8.0.3",
81
81
  "hast-util-to-html": "9.0.5",
82
82
  "lru_map": "0.4.1",
83
83
  "shiki": "^3.0.0"