@pierre/diffs 1.5.0 → 1.5.2

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 (64) hide show
  1. package/dist/components/CodeView.d.ts +2 -1
  2. package/dist/components/CodeView.d.ts.map +1 -1
  3. package/dist/components/CodeView.js +21 -11
  4. package/dist/components/CodeView.js.map +1 -1
  5. package/dist/components/File.d.ts.map +1 -1
  6. package/dist/components/File.js +3 -1
  7. package/dist/components/File.js.map +1 -1
  8. package/dist/components/FileDiff.d.ts +7 -4
  9. package/dist/components/FileDiff.d.ts.map +1 -1
  10. package/dist/components/FileDiff.js +4 -2
  11. package/dist/components/FileDiff.js.map +1 -1
  12. package/dist/components/VirtualizedFile.d.ts.map +1 -1
  13. package/dist/components/VirtualizedFile.js +10 -5
  14. package/dist/components/VirtualizedFile.js.map +1 -1
  15. package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
  16. package/dist/components/VirtualizedFileDiff.js +3 -4
  17. package/dist/components/VirtualizedFileDiff.js.map +1 -1
  18. package/dist/editor/editor.d.ts.map +1 -1
  19. package/dist/editor/editor.js +7 -4
  20. package/dist/editor/editor.js.map +1 -1
  21. package/dist/editor/editor2.js +1 -1
  22. package/dist/editor/getChangedDocumentLines.d.ts +6 -0
  23. package/dist/editor/getChangedDocumentLines.d.ts.map +1 -0
  24. package/dist/editor/getChangedDocumentLines.js +35 -0
  25. package/dist/editor/getChangedDocumentLines.js.map +1 -0
  26. package/dist/renderers/DiffHunksRenderer.d.ts +1 -1
  27. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  28. package/dist/renderers/DiffHunksRenderer.js +19 -2
  29. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  30. package/dist/style.js +1 -1
  31. package/dist/types.d.ts +4 -3
  32. package/dist/types.d.ts.map +1 -1
  33. package/dist/utils/computeVirtualFileMetrics.d.ts +2 -1
  34. package/dist/utils/computeVirtualFileMetrics.d.ts.map +1 -1
  35. package/dist/utils/computeVirtualFileMetrics.js +5 -3
  36. package/dist/utils/computeVirtualFileMetrics.js.map +1 -1
  37. package/dist/utils/getDiffHunksRendererOptions.js +1 -0
  38. package/dist/utils/getDiffHunksRendererOptions.js.map +1 -1
  39. package/dist/utils/getFiletypeFromFileName.d.ts.map +1 -1
  40. package/dist/utils/getFiletypeFromFileName.js +21 -3
  41. package/dist/utils/getFiletypeFromFileName.js.map +1 -1
  42. package/dist/utils/platform.d.ts +2 -1
  43. package/dist/utils/platform.d.ts.map +1 -1
  44. package/dist/utils/platform.js +6 -1
  45. package/dist/utils/platform.js.map +1 -1
  46. package/dist/utils/renderDiffWithHighlighter.js +39 -0
  47. package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
  48. package/dist/worker/WorkerPoolManager.d.ts +8 -0
  49. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  50. package/dist/worker/WorkerPoolManager.js +29 -14
  51. package/dist/worker/WorkerPoolManager.js.map +1 -1
  52. package/dist/worker/errors.d.ts +35 -0
  53. package/dist/worker/errors.d.ts.map +1 -0
  54. package/dist/worker/errors.js +52 -0
  55. package/dist/worker/errors.js.map +1 -0
  56. package/dist/worker/index.d.ts +2 -1
  57. package/dist/worker/index.js +2 -1
  58. package/dist/worker/types.d.ts +13 -0
  59. package/dist/worker/types.d.ts.map +1 -1
  60. package/dist/worker/worker-portable.js +60 -3
  61. package/dist/worker/worker-portable.js.map +1 -1
  62. package/dist/worker/worker.js +60 -3
  63. package/dist/worker/worker.js.map +1 -1
  64. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"File.d.ts","names":[],"sources":["../../src/components/File.ts"],"mappings":"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"}
1
+ {"version":3,"file":"File.d.ts","names":[],"sources":["../../src/components/File.ts"],"mappings":"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"}
@@ -3,6 +3,7 @@ import { getThemes } from "../utils/getThemes.js";
3
3
  import { getHighlighterIfLoaded, getSharedHighlighter } from "../highlighter/shared_highlighter.js";
4
4
  import { areThemesEqual } from "../utils/areThemesEqual.js";
5
5
  import { isStyleNode } from "../utils/isStyleNode.js";
6
+ import { isSafari } from "../utils/platform.js";
6
7
  import { areFileTargetsEqual } from "../utils/areFileTargetsEqual.js";
7
8
  import { InteractionManager, pluckInteractionOptions } from "../managers/InteractionManager.js";
8
9
  import { ResizeManager } from "../managers/ResizeManager.js";
@@ -24,9 +25,9 @@ import { getFileRendererOptions } from "../utils/getFileRendererOptions.js";
24
25
  import { getOrCreateCodeNode } from "../utils/getOrCreateCodeNode.js";
25
26
  import { guardWebKitScrollDuringRebuild } from "../utils/guardWebKitScrollDuringRebuild.js";
26
27
  import { upsertHostThemeStyle } from "../utils/hostTheme.js";
27
- import { isSafari } from "../utils/platform.js";
28
28
  import { prerenderHTMLIfNecessary } from "../utils/prerenderHTMLIfNecessary.js";
29
29
  import { setPreNodeProperties } from "../utils/setWrapperNodeProps.js";
30
+ import { isHandledWorkerPoolError } from "../worker/errors.js";
30
31
  import "./web-components.js";
31
32
  import { toHtml } from "hast-util-to-html";
32
33
  //#region src/components/File.ts
@@ -653,6 +654,7 @@ var File = class {
653
654
  const tokenizeMaxLength = this.options.tokenizeMaxLength ?? 1e5;
654
655
  if (this.fileRenderer.getOrCreateLineCache(file).length > tokenizeMaxLength) return;
655
656
  await workerManager.primeFileHighlightCache(file).catch((error) => {
657
+ if (isHandledWorkerPoolError(error)) return;
656
658
  console.error(error);
657
659
  });
658
660
  }
@@ -1 +1 @@
1
- {"version":3,"file":"File.js","names":[],"sources":["../../src/components/File.ts"],"sourcesContent":["import type { Element as HASTElement } from 'hast';\nimport { toHtml } from 'hast-util-to-html';\n\nimport {\n CUSTOM_HEADER_SLOT_ID,\n DEFAULT_THEMES,\n DEFAULT_TOKENIZE_MAX_LENGTH,\n DIFFS_TAG_NAME,\n EMPTY_RENDER_RANGE,\n HEADER_FILENAME_SUFFIX_SLOT_ID,\n HEADER_METADATA_SLOT_ID,\n HEADER_PREFIX_SLOT_ID,\n THEME_CSS_ATTRIBUTE,\n UNSAFE_CSS_ATTRIBUTE,\n} from '../constants';\nimport type { Editor } from '../editor/editor';\nimport type { TextDocument } from '../editor/textDocument';\nimport type {\n EditCompletionDecision,\n EditorActiveLineOptions,\n EditorChangeEvent,\n FileEditCompleteEvent,\n} from '../editor/types';\nimport {\n type GetHoveredLineResult,\n InteractionManager,\n type InteractionManagerBaseOptions,\n pluckInteractionOptions,\n type SelectionWriteOptions,\n} from '../managers/InteractionManager';\nimport { ResizeManager } from '../managers/ResizeManager';\nimport { FileRenderer, type FileRenderResult } from '../renderers/FileRenderer';\nimport { SVGSpriteSheet } from '../sprite';\nexport type { FileEditCompleteEvent } from '../editor/types';\nimport {\n getHighlighterIfLoaded,\n getSharedHighlighter,\n} from '../highlighter/shared_highlighter';\nimport type {\n AppliedThemeStyleCache,\n BaseCodeOptions,\n DiffLineAnnotation,\n DiffsHighlighter,\n FileContents,\n HighlightedToken,\n LineAnnotation,\n PostRenderPhase,\n PrePropertiesConfig,\n RenderFileMetadata,\n RenderRange,\n SelectedLineRange,\n ThemeTypes,\n} from '../types';\nimport { areFileTargetsEqual } from '../utils/areFileTargetsEqual';\nimport { areLineAnnotationsEqual } from '../utils/areLineAnnotationsEqual';\nimport { arePrePropertiesEqual } from '../utils/arePrePropertiesEqual';\nimport { areRenderRangesEqual } from '../utils/areRenderRangesEqual';\nimport { areThemesEqual } from '../utils/areThemesEqual';\nimport { createAnnotationWrapperNode } from '../utils/createAnnotationWrapperNode';\nimport { createGutterUtilityContentNode } from '../utils/createGutterUtilityContentNode';\nimport { createUnsafeCSSStyleNode } from '../utils/createUnsafeCSSStyleNode';\nimport {\n patchScrollbarGutterSize,\n wrapThemeCSS,\n wrapUnsafeCSS,\n} from '../utils/cssWrappers';\nimport {\n adoptEditSessionAnnotations,\n type EditSessionAnnotations,\n resolveEditSessionSlotName,\n writeEditSessionAnnotations,\n} from '../utils/editSessionAnnotations';\nimport { getFileRendererOptions } from '../utils/getFileRendererOptions';\nimport { getFiletypeFromFileName } from '../utils/getFiletypeFromFileName';\nimport { getLineAnnotationName } from '../utils/getLineAnnotationName';\nimport { getOrCreateCodeNode } from '../utils/getOrCreateCodeNode';\nimport { getThemes } from '../utils/getThemes';\nimport { guardWebKitScrollDuringRebuild } from '../utils/guardWebKitScrollDuringRebuild';\nimport { upsertHostThemeStyle } from '../utils/hostTheme';\nimport { isFilePlainText } from '../utils/isFilePlainText';\nimport { isStyleNode } from '../utils/isStyleNode';\nimport { isSafari } from '../utils/platform';\nimport { prerenderHTMLIfNecessary } from '../utils/prerenderHTMLIfNecessary';\nimport { getMeasuredScrollbarGutter } from '../utils/scrollbarGutter';\nimport { setPreNodeProperties } from '../utils/setWrapperNodeProps';\nimport type { WorkerPoolManager } from '../worker';\nimport { DiffsContainerLoaded } from './web-components';\n\nconst EMPTY_STRINGS: string[] = [''];\n\nexport interface FileRenderProps<LAnnotation> {\n file: FileContents;\n fileContainer?: HTMLElement;\n containerWrapper?: HTMLElement;\n deferManagers?: boolean;\n forceRender?: boolean;\n preventEmit?: boolean;\n lineAnnotations?: LineAnnotation<LAnnotation>[];\n renderRange?: RenderRange;\n}\n\nexport interface FileHydrateProps<LAnnotation> extends Omit<\n FileRenderProps<LAnnotation>,\n 'fileContainer'\n> {\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\n\nexport type FileEditChangeHandler<LAnnotation, Caret> = (\n event: EditorChangeEvent<'file', LAnnotation, Caret>\n) => void;\n\n/**\n * Decides a completed edit synchronously: return `'accept'` to install the\n * event's `file` and annotations, or `'reject'` to restore the original values.\n * The event is frozen, so re-key the accepted file in place\n * (`event.file.cacheKey = '…'`) before accepting. The event's editor is\n * detached and returns its final state from `getViewState()`. A missing handler\n * rejects.\n */\nexport type FileEditCompleteHandler<LAnnotation, Caret> = (\n event: FileEditCompleteEvent<LAnnotation, Caret>\n) => EditCompletionDecision;\n\nexport interface FileOptions<LAnnotation, Caret>\n extends BaseCodeOptions, InteractionManagerBaseOptions<'file'> {\n disableFileHeader?: boolean;\n renderHeaderPrefix?: RenderFileMetadata;\n renderHeaderFilenameSuffix?: RenderFileMetadata;\n renderHeaderMetadata?: RenderFileMetadata;\n renderCustomHeader?: 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 renderGutterUtility?(\n getHoveredRow: () => GetHoveredLineResult<'file'> | undefined\n ): HTMLElement | null | undefined;\n\n onPostRender?(\n node: HTMLElement,\n instance: File<LAnnotation, Caret>,\n phase: PostRenderPhase\n ): unknown;\n\n /**\n * Fired for every document change of an active edit session on this\n * component, with the same `EditorChangeEvent` the editor reports through\n * its own `onChange`. Do not feed the event's file back into the component\n * while the session is active.\n */\n onEditChange?: FileEditChangeHandler<LAnnotation, Caret>;\n\n /**\n * Fired when `edit` toggles false or a component unmounts, including when the\n * final contents are unchanged. If no callback is provided, the component\n * reverts to the last `file` and annotations passed into it. The callback\n * receives the detached editor with its final pre-detach state.\n */\n onEditComplete?: FileEditCompleteHandler<LAnnotation, Caret>;\n}\n\ninterface AnnotationElementCache<LAnnotation> {\n element: HTMLElement;\n annotation: LineAnnotation<LAnnotation>;\n}\n\ninterface ColumnElements {\n gutter: HTMLElement;\n content: HTMLElement;\n}\n\ninterface HydrationSetup<LAnnotation> {\n file: FileContents;\n lineAnnotations: LineAnnotation<LAnnotation>[] | undefined;\n}\n\ninterface EditSession<LAnnotation> {\n file: FileContents;\n annotations: EditSessionAnnotations<LineAnnotation<LAnnotation>> | undefined;\n /*\n * `externalReplacement` records that the host swapped in a new file\n * mid-session, so the next sync tells the editor to adopt `file` over its\n * own document\n */\n externalReplacement: boolean;\n}\n\nfunction createEditSessionFile(file: FileContents): FileContents {\n const editSessionFile = { ...file };\n delete editSessionFile.cacheKey;\n return editSessionFile;\n}\n\nlet instanceId = -1;\n\nexport class File<LAnnotation = undefined, Caret = undefined> {\n static LoadedCustomComponent: boolean = DiffsContainerLoaded;\n\n readonly __id: string = `file:${++instanceId}`;\n readonly type = 'file';\n\n protected fileContainer: HTMLElement | undefined;\n protected spriteSVG: SVGElement | undefined;\n protected pre: HTMLPreElement | undefined;\n protected code: HTMLElement | undefined;\n protected bufferBefore: HTMLElement | undefined;\n protected bufferAfter: HTMLElement | undefined;\n protected themeCSSStyle: HTMLStyleElement | undefined;\n protected appliedThemeCSS: AppliedThemeStyleCache | undefined;\n protected hasAdoptedThemeCSS = false;\n protected unsafeCSSStyle: HTMLStyleElement | undefined;\n protected appliedUnsafeCSS: string | undefined;\n protected gutterUtilityContent: HTMLElement | undefined;\n protected errorWrapper: HTMLElement | undefined;\n protected placeHolder: HTMLElement | undefined;\n protected lastRenderedHeaderHTML: string | undefined;\n protected cachedHeaderHTML: string | undefined;\n protected appliedPreAttributes: PrePropertiesConfig | undefined;\n protected lastRowCount: number | undefined;\n private mounted = false;\n\n protected headerElement: HTMLElement | undefined;\n protected headerCustom: HTMLElement | undefined;\n protected headerPrefix: HTMLElement | undefined;\n protected headerFilenameSuffix: HTMLElement | undefined;\n protected headerMetadata: HTMLElement | undefined;\n\n protected fileRenderer: FileRenderer<LAnnotation>;\n protected resizeManager: ResizeManager;\n protected interactionManager: InteractionManager<'file'>;\n\n protected annotationCache: Map<string, AnnotationElementCache<LAnnotation>> =\n new Map();\n protected lineAnnotations: LineAnnotation<LAnnotation>[] = [];\n protected managersDirty = false;\n\n public file: FileContents | undefined;\n private editSession: EditSession<LAnnotation> | undefined;\n protected renderedFile: FileContents | undefined;\n protected renderRange: RenderRange | undefined;\n protected enabled = true;\n\n protected editor: Editor<'file', LAnnotation, Caret> | undefined;\n\n constructor(\n public options: FileOptions<LAnnotation, Caret> = {\n theme: DEFAULT_THEMES,\n },\n private workerManager?: WorkerPoolManager | undefined,\n private isContainerManaged = false\n ) {\n this.fileRenderer = new FileRenderer<LAnnotation>(\n options,\n this.getAnnotationSlotName,\n this.handleHighlightRender,\n this.workerManager\n );\n this.resizeManager = new ResizeManager();\n this.interactionManager = new InteractionManager(\n 'file',\n pluckInteractionOptions(options)\n );\n this.workerManager?.subscribeToThemeChanges(this);\n }\n\n public getAnnotationSlotName = (\n annotation: LineAnnotation<LAnnotation> | DiffLineAnnotation<LAnnotation>\n ): string => {\n return resolveEditSessionSlotName(\n this.editSession?.annotations,\n annotation,\n getLineAnnotationName\n );\n };\n\n private handleHighlightRender = (): void => {\n this.rerender();\n };\n\n public rerender(): void {\n if (!this.enabled || this.file == null) return;\n this.render({\n file: this.file,\n forceRender: true,\n renderRange: this.renderRange,\n });\n }\n\n private getTheme() {\n return (\n this.workerManager?.getFileRenderOptions().theme ??\n this.options.theme ??\n DEFAULT_THEMES\n );\n }\n\n // Return the newest file this component intends to display. Once editing\n // starts, the private edit-session file owns that state.\n protected getLatestFile(\n file: FileContents | undefined = this.file\n ): FileContents | undefined {\n return this.editSession?.file ?? file;\n }\n\n // Return the file that produced the DOM currently owned by this instance.\n protected getRenderedFile(): FileContents | undefined {\n return this.renderedFile;\n }\n\n protected getLatestAnnotations(): LineAnnotation<LAnnotation>[] {\n return this.editSession?.annotations?.current ?? this.lineAnnotations;\n }\n\n // Returns true when the caller passed annotations this component has not\n // handled yet. Re-renders often re-pass an annotations array the component\n // already holds — the external one, or one the active session tracks — and\n // treating those repeats as new writes would move annotations, so they are\n // recognized by identity and ignored.\n protected isNewAnnotations(\n lineAnnotations: LineAnnotation<LAnnotation>[]\n ): boolean {\n const session = this.editSession?.annotations;\n const externalAnnotations = this.lineAnnotations;\n if (lineAnnotations === externalAnnotations) {\n return false;\n }\n return (\n session == null ||\n (lineAnnotations !== session.provided &&\n lineAnnotations !== session.current)\n );\n }\n\n // Install a replacement file from the caller; returns false when it is the\n // file already installed. During an edit session the swap re-seeds the\n // session as a host replacement, and the next sync decides whether it keeps\n // or resets undo history.\n protected updateExternalFile(\n incomingFile: FileContents,\n lineAnnotations?: LineAnnotation<LAnnotation>[]\n ): boolean {\n if (areFileTargetsEqual(this.file, incomingFile)) {\n return false;\n }\n\n const hadSession = this.editSession != null;\n this.file = incomingFile;\n\n if (hadSession || this.editor != null) {\n this.installEditSession(\n incomingFile,\n hadSession\n ? undefined\n : this.editor?.__getDocumentContents(incomingFile),\n true\n );\n } else {\n this.editSession = undefined;\n }\n if (this.editSession?.annotations != null && lineAnnotations != null) {\n // These annotations arrived with the new file, so their line numbers\n // describe it. The positions the session tracked for the old document\n // mean nothing now: the session restarts from these annotations, and\n // they also become what renders once the session ends.\n this.lineAnnotations = lineAnnotations;\n this.editSession.annotations = adoptEditSessionAnnotations(\n lineAnnotations,\n getLineAnnotationName,\n this.editSession.annotations\n );\n }\n return true;\n }\n\n // Set up the edit session's working copy — the editable copy of this file that\n // edit mode operates on: create the session if there isn't one, or replace its\n // file if one is already running (its annotations carry over). The working\n // copy's text is normally `externalFile`, but if `retainedDocument` is given\n // and its text differs, the session keeps that content instead so text carried\n // over from an earlier session isn't lost.\n //\n // `hostReplacement` is true only when the host swapped in a new file, not on a\n // plain first attach — the one case where the editor should overwrite whatever\n // it is currently showing with this file. It is recorded on the session for\n // the next sync to act on.\n private installEditSession(\n externalFile: FileContents,\n retainedDocument?: FileContents,\n hostReplacement = false\n ): void {\n const usesExternalDocument =\n retainedDocument == null ||\n (retainedDocument.name === externalFile.name &&\n retainedDocument.lang === externalFile.lang &&\n retainedDocument.contents === externalFile.contents);\n const file = createEditSessionFile(retainedDocument ?? externalFile);\n this.editSession = {\n file,\n externalReplacement: hostReplacement && usesExternalDocument,\n // Seed annotations when the session is created so the adopt-block in\n // updateExternalFile fires on the next external update — this is what an\n // attach-before-hydrate (React) mount relies on, since the session does\n // not exist yet at attach. A live session keeps the ones it tracks.\n annotations:\n this.editSession?.annotations ??\n adoptEditSessionAnnotations(\n this.lineAnnotations,\n getLineAnnotationName\n ),\n };\n this.fileRenderer.beginEditSession(\n file,\n usesExternalDocument ? externalFile : undefined\n );\n }\n\n public onThemeChange(): void {\n this.fileRenderer.clearRenderCache();\n this.rerender();\n }\n\n public setOptions(\n options: FileOptions<LAnnotation, Caret> | undefined\n ): void {\n if (options == null) return;\n this.options = options;\n this.cachedHeaderHTML = undefined;\n this.syncInteractionOptions();\n }\n\n protected syncInteractionOptions(): void {\n this.interactionManager.setOptions(pluckInteractionOptions(this.options));\n }\n\n private mergeOptions(\n options: Partial<FileOptions<LAnnotation, Caret>>\n ): void {\n this.options = { ...this.options, ...options };\n }\n\n public setThemeType(themeType: ThemeTypes): void {\n if ((this.options.themeType ?? 'system') === themeType) {\n return;\n }\n this.mergeOptions({ themeType });\n this.applyCachedThemeState(themeType);\n }\n\n private applyCachedThemeState(themeType: ThemeTypes): boolean {\n if (\n typeof this.options.theme === 'string' ||\n this.fileContainer == null ||\n this.appliedThemeCSS == null\n ) {\n return false;\n }\n const effectiveThemeType = this.appliedThemeCSS.baseThemeType ?? themeType;\n if (this.appliedThemeCSS.themeType === effectiveThemeType) {\n return false;\n }\n this.applyThemeState(\n this.fileContainer,\n this.appliedThemeCSS.themeStyles,\n themeType,\n this.appliedThemeCSS.baseThemeType\n );\n return true;\n }\n\n private hasThemeChanged(): boolean {\n return (\n this.appliedThemeCSS != null &&\n !areThemesEqual(this.appliedThemeCSS.theme, this.getTheme())\n );\n }\n\n public getHoveredLine = (): GetHoveredLineResult<'file'> | undefined => {\n return this.interactionManager.getHoveredLine();\n };\n\n public setLineAnnotations(\n lineAnnotations: LineAnnotation<LAnnotation>[]\n ): void {\n const sessionAnnotations = this.editSession?.annotations;\n if (sessionAnnotations == null) {\n this.lineAnnotations = lineAnnotations;\n return;\n }\n if (!this.isNewAnnotations(lineAnnotations)) {\n return;\n }\n // Externally provided annotations are the source of truth: they become the\n // new external collection and the session renders them at the line numbers\n // given. The caller owns whether those positions still make sense after an\n // edit; a revert renders this collection unchanged rather than moving them.\n this.lineAnnotations = lineAnnotations;\n writeEditSessionAnnotations(\n sessionAnnotations,\n lineAnnotations,\n getLineAnnotationName\n );\n }\n\n // Takes annotations the editor remapped and makes them what the session\n // renders: updates the session, feeds the renderer, and re-renders\n // annotation rows. Returns true when new annotations were adopted —\n // virtualized subclasses override this and refresh their layout on true.\n //\n // The editor delivers annotations through two calls. An edit that changes\n // the line count sends them with the structural rebuild\n // (applyDocumentChange) and again with the change event (__acceptEditorChange);\n // the identity check makes the second call a no-op. An edit that keeps the\n // line count skips the rebuild, so the event is its only path here.\n //\n // The annotations the caller passed in are never touched — stale\n // re-renders keep deduping against them.\n protected syncEditSessionAnnotationsFromEditor(\n lineAnnotations: LineAnnotation<LAnnotation>[]\n ): boolean {\n const session = this.editSession?.annotations;\n if (session == null || lineAnnotations === session.current) {\n return false;\n }\n session.current = lineAnnotations;\n this.fileRenderer.setLineAnnotations(lineAnnotations);\n this.renderAnnotations();\n return true;\n }\n\n public setSelectedLines(\n range: SelectedLineRange | null,\n options?: SelectionWriteOptions\n ): void {\n this.interactionManager.setSelection(range, options);\n }\n\n public setEditorActiveLine(\n lineNumber: number | null,\n options?: EditorActiveLineOptions\n ): void {\n this.interactionManager.setEditorActiveLine(lineNumber, {\n lineNumberOnly: options?.lineNumberOnly,\n side: options?.side ?? 'additions',\n });\n }\n\n public getCodeScrollLeft(): number {\n return this.code?.scrollLeft ?? 0;\n }\n\n public setCodeScrollLeft(position: number): void {\n if (this.code != null) {\n this.code.scrollLeft = position;\n }\n }\n\n public __getEffectiveCodeOptions(): BaseCodeOptions {\n return { ...this.options, ...this.fileRenderer.getEffectiveCodeOptions() };\n }\n\n public flushManagers(): void {\n if (!this.managersDirty || this.pre == null) {\n this.managersDirty = false;\n return;\n }\n\n const { overflow = 'scroll' } = this.options;\n this.interactionManager.setup(this.pre);\n this.resizeManager.setup(this.pre, {\n disableAnnotations: overflow === 'wrap',\n columnVariables: this.shouldApplyColumnVariables(overflow)\n ? 'apply'\n : 'measure',\n });\n this.managersDirty = false;\n }\n\n protected shouldApplyColumnVariables(overflow: 'scroll' | 'wrap'): boolean {\n return overflow === 'scroll' && this.getLatestAnnotations().length > 0;\n }\n\n public cleanUp(recycle = false): void {\n const editor = this.editor;\n this.emitPostRender(true);\n // Tear the editor down while the code scroller still exists. A recycle\n // keeps its document and undo history; a full teardown drops them as the\n // session ends.\n editor?.cleanUp(recycle ? 'recycle' : 'discard');\n if (!recycle) {\n this.editor = undefined;\n }\n this.resizeManager.cleanUp();\n this.interactionManager.cleanUp();\n this.managersDirty = false;\n this.workerManager?.unsubscribeToThemeChanges(this);\n this.renderRange = undefined;\n\n // Clean up the elements\n if (!this.isContainerManaged) {\n this.fileContainer?.remove();\n }\n this.fileContainer = undefined;\n this.mounted = false;\n if (!recycle) {\n this.lineAnnotations = [];\n }\n this.clearAuxiliaryNodes();\n this.pre = undefined;\n this.code = undefined;\n this.bufferBefore?.remove();\n this.bufferBefore = undefined;\n this.bufferAfter?.remove();\n this.bufferAfter = undefined;\n this.appliedPreAttributes = undefined;\n this.lastRowCount = undefined;\n this.headerElement = undefined;\n this.headerPrefix = undefined;\n this.headerFilenameSuffix = undefined;\n this.headerMetadata = undefined;\n this.headerCustom = undefined;\n this.lastRenderedHeaderHTML = undefined;\n if (!recycle) {\n this.cachedHeaderHTML = undefined;\n }\n this.errorWrapper?.remove();\n this.errorWrapper = undefined;\n this.spriteSVG = undefined;\n this.themeCSSStyle = undefined;\n this.appliedThemeCSS = undefined;\n this.hasAdoptedThemeCSS = false;\n this.unsafeCSSStyle = undefined;\n this.appliedUnsafeCSS = undefined;\n this.placeHolder?.remove();\n this.placeHolder = undefined;\n\n if (recycle) {\n this.fileRenderer.recycle();\n } else {\n this.fileRenderer.cleanUp();\n this.workerManager = undefined;\n this.file = undefined;\n this.editSession = undefined;\n this.renderedFile = undefined;\n }\n this.enabled = false;\n }\n\n public virtualizedSetup(): void {\n this.enabled = true;\n this.workerManager?.subscribeToThemeChanges(this);\n }\n\n public hydrate(props: FileHydrateProps<LAnnotation>): void {\n const {\n fileContainer,\n prerenderedHTML,\n preventEmit = false,\n file,\n lineAnnotations,\n } = props;\n if (!this.enabled) {\n throw new Error(\n 'File.hydrate: attempting to call hydrate after cleaned up'\n );\n }\n if (this.fileContainer != null) {\n throw new Error(\n 'File.hydrate: hydrate can only be called before the instance has rendered or hydrated'\n );\n }\n this.hydrateElements(fileContainer, prerenderedHTML);\n // An editor attached before hydration may carry a retained keyed document.\n // Render through the private edit session instead of adopting external\n // markup, so the restored document owns the first hydrated paint.\n const forceEditorRender = this.editor != null;\n if (\n forceEditorRender ||\n shouldRenderCode(this.pre, file, this.options.collapsed) ||\n shouldRenderHeader(\n this.headerElement,\n file,\n this.options.disableFileHeader\n )\n ) {\n this.render({\n ...props,\n forceRender: forceEditorRender || props.forceRender,\n preventEmit: true,\n });\n }\n // Otherwise orchestrate our setup.\n else {\n this.hydrationSetup({ file, lineAnnotations });\n }\n if (!preventEmit) {\n this.emitPostRender();\n }\n }\n\n protected hydrateElements(\n fileContainer: HTMLElement,\n prerenderedHTML: string | undefined\n ): void {\n if (this.fileContainer !== fileContainer) {\n this.emitPostRender(true);\n }\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(THEME_CSS_ATTRIBUTE)\n ) {\n this.themeCSSStyle = element;\n continue;\n }\n if (\n element instanceof HTMLStyleElement &&\n element.hasAttribute(UNSAFE_CSS_ATTRIBUTE)\n ) {\n this.unsafeCSSStyle = element;\n this.appliedUnsafeCSS = element.textContent;\n continue;\n }\n if ('diffsHeader' in element.dataset) {\n this.headerElement = element;\n this.lastRenderedHeaderHTML = undefined;\n continue;\n }\n }\n if (this.pre != null) {\n this.syncCodeNodeFromPre(this.pre);\n this.pre.removeAttribute('data-dehydrated');\n }\n this.fileContainer = fileContainer;\n this.hydrateMeasuredScrollbar();\n }\n\n protected hydrationSetup({\n file,\n lineAnnotations,\n }: HydrationSetup<LAnnotation>): void {\n this.lineAnnotations = lineAnnotations ?? this.lineAnnotations;\n this.file = file;\n this.fileRenderer.setOptions(getFileRendererOptions(this.options));\n this.syncInteractionOptions();\n if (this.pre == null) {\n return;\n }\n this.fileRenderer.hydrate(file);\n this.renderedFile = file;\n this.renderAnnotations();\n this.renderGutterUtility();\n this.injectUnsafeCSS();\n this.managersDirty = true;\n this.flushManagers();\n }\n\n public getOrCreateLineCache(\n file: FileContents | undefined = this.getLatestFile()\n ): string[] {\n return file != null\n ? this.fileRenderer.getOrCreateLineCache(file)\n : EMPTY_STRINGS;\n }\n\n protected updateBuffers(renderRange: RenderRange): void {\n if (this.pre != null) {\n this.applyBuffers(this.pre, renderRange);\n }\n }\n\n private syncRenderViewToEditor(): void {\n const { editor, fileContainer, renderRange } = this;\n const lineAnnotations = this.getLatestAnnotations();\n const file = this.getLatestFile();\n if (editor == null || fileContainer == null || file == null) {\n return;\n }\n const syncEditor = (highlighter: DiffsHighlighter): void => {\n if (\n !this.enabled ||\n this.editor !== editor ||\n this.fileContainer !== fileContainer ||\n this.getLatestFile() !== file\n ) {\n return;\n }\n editor.__syncRenderView({\n highlighter,\n fileContainer,\n file,\n lineAnnotations,\n renderRange,\n externalDocument: this.editSession?.externalReplacement === true,\n });\n };\n\n const theme = this.getTheme();\n const lang = file.lang ?? getFiletypeFromFileName(file.name);\n // Sync editor synchronously whenever the shared highlighter is ready;\n // otherwise load it and sync once it resolves.\n const highlighter = getHighlighterIfLoaded({ theme, lang });\n if (highlighter != null) {\n syncEditor(highlighter);\n } else {\n void getSharedHighlighter({\n themes: getThemes(theme),\n langs: Array.from(new Set(['text', lang])),\n preferredHighlighter:\n this.workerManager?.getPreferredHighlighter() ??\n this.options.preferredHighlighter,\n }).then(syncEditor);\n }\n }\n\n /** @internal The editor applied or edited past the pending external replacement. */\n public __acknowledgeDocumentUpdate(): void {\n if (this.editSession != null) {\n this.editSession.externalReplacement = false;\n }\n }\n\n /** @internal Settle annotations */\n public __acceptEditorChange(\n event: EditorChangeEvent<'file', LAnnotation, Caret>\n ): void {\n const { lineAnnotations } = event;\n if (lineAnnotations != null) {\n this.syncEditSessionAnnotationsFromEditor(lineAnnotations);\n }\n }\n\n public emitEditChange(\n event: EditorChangeEvent<'file', LAnnotation, Caret>\n ): void {\n const { onEditChange } = this.options;\n onEditChange?.(event);\n }\n\n /** @internal Plain files have no component-owned diff session state. */\n public __captureDocumentSessionState(): undefined {\n return undefined;\n }\n\n /** @internal Associate this component with its editor for a render lifecycle. */\n public __attachEditor(\n editor: Editor<'file', LAnnotation, Caret>\n ): () => void {\n if (this.editor != null) {\n throw new Error('File.__attachEditor: an editor is already attached');\n }\n this.editor = editor;\n const detach = () => {\n this.editor = undefined;\n this.fileRenderer.endEditSession();\n };\n try {\n this.resumeEditorRendering(editor);\n return detach;\n } catch (error) {\n detach();\n throw error;\n }\n }\n\n /** @internal Resume rendering for the editor already associated with this component. */\n public __resumeEditor(editor: Editor<'file', LAnnotation, Caret>): void {\n if (this.editor !== editor) {\n throw new Error('File.__resumeEditor: editor association changed');\n }\n this.resumeEditorRendering(editor);\n }\n\n private resumeEditorRendering(\n editor: Editor<'file', LAnnotation, Caret>\n ): void {\n // A retained session just re-starts its render; a fresh attach with a file\n // installs a session seeded from the editor's document. The editor can also\n // attach before the file arrives, there is nothing to begin yet, so the\n // session installs on the later hydrate.\n if (this.editSession != null) {\n this.fileRenderer.beginEditSession(this.editSession.file);\n } else if (this.file != null) {\n this.installEditSession(\n this.file,\n editor.__getDocumentContents(this.file)\n );\n }\n const editSessionFile = this.editSession?.file;\n if (this.fileRenderer.editorRenderReady()) {\n if (this.fileRenderer.fileCache === editSessionFile) {\n this.renderedFile = editSessionFile;\n }\n this.syncRenderViewToEditor();\n } else {\n // The current markup is missing the editor's token metadata, or its\n // highlight is still pending: render through the session, which also\n // syncs the render view once it paints.\n this.rerender();\n }\n }\n\n /**\n * @internal\n *\n * Ends the edit session and settles which file this component renders.\n * Requires the editor to be detached first. Does nothing when no session\n * exists, so callers can invoke it again safely after it has settled.\n *\n * `onEditComplete` receives the completed file, current external file, and\n * both annotation collections even when the final text is unchanged. In\n * `install` mode, accepting installs the completed file and its annotations;\n * rejecting or having no handler restores the external values. `discard`\n * mode always restores the external values. An accepted file cannot reuse\n * the replaced file's `cacheKey`.\n */\n public __completeEditSession(\n editor: Editor<'file', LAnnotation, Caret>,\n mode: 'install' | 'discard'\n ): void {\n this.settleEditSession(mode === 'install', editor);\n }\n\n private settleEditSession(\n installResult: boolean,\n editor: Editor<'file', LAnnotation, Caret> | undefined\n ): void {\n const {\n editSession,\n file: externalFile,\n lineAnnotations: externalAnnotations,\n } = this;\n if (editSession == null || externalFile == null) {\n return;\n }\n const { file: editSessionFile, annotations: editSessionAnnotations } =\n editSession;\n if (this.editor != null) {\n throw new Error(\n 'File.__completeEditSession: detach the editor before completing the session'\n );\n }\n\n const sessionAnnotationsCurrent = editSessionAnnotations?.current;\n let acceptedFile: FileContents | undefined;\n let failed = false;\n let failure: unknown;\n if (editor == null) {\n throw new Error(\n 'File.__completeEditSession: editor is required for completion'\n );\n }\n const completedFile = { ...editSessionFile };\n const event: FileEditCompleteEvent<LAnnotation, Caret> = {\n file: completedFile,\n editor,\n originalFile: externalFile,\n lineAnnotations: sessionAnnotationsCurrent,\n originalLineAnnotations: externalAnnotations,\n };\n // Frozen so a handler cannot swap the event's file/originalFile\n // references; nested mutation (a fresh cacheKey on event.file) still\n // works.\n Object.freeze(event);\n try {\n editor.__emitEditComplete(event);\n const decision = this.options.onEditComplete?.(event);\n if (decision === 'accept') {\n if (\n completedFile.cacheKey != null &&\n completedFile.cacheKey === externalFile.cacheKey\n ) {\n throw new Error(\n 'File.__completeEditSession: an accepted file must not reuse the replaced file cacheKey'\n );\n }\n acceptedFile = completedFile;\n }\n } catch (error) {\n failed = true;\n failure = error;\n }\n\n if (installResult && acceptedFile != null) {\n this.file = acceptedFile;\n if (sessionAnnotationsCurrent != null) {\n this.lineAnnotations = sessionAnnotationsCurrent;\n }\n }\n this.editSession = undefined;\n // Ending the session with the settled file lets the renderer adopt it as\n // the rendered identity when its cache already shows this content, so\n // the next render treats it as current instead of a new file.\n const { renderedFile, file: settledFile } = this;\n this.fileRenderer.endEditSession(settledFile);\n if (\n renderedFile != null &&\n settledFile != null &&\n renderedFile !== settledFile &&\n areFileTargetsEqual(renderedFile, settledFile)\n ) {\n this.renderedFile = settledFile;\n }\n if (installResult && this.fileContainer != null) {\n this.rerender();\n }\n if (failed) {\n throw failure;\n }\n }\n\n // normally triggered by the host when the document line count changes\n public applyDocumentChange(\n textDocument: TextDocument<'file', LAnnotation>,\n newLineAnnotations?: LineAnnotation<LAnnotation>[]\n ): void {\n const editSessionFile = this.editSession?.file;\n if (editSessionFile == null) {\n throw new Error(\n 'File.applyDocumentChange: requires an active edit session'\n );\n }\n this.fileRenderer.beginEditSession(editSessionFile);\n this.fileRenderer.applyDocumentChange(textDocument);\n if (newLineAnnotations != null) {\n this.syncEditSessionAnnotationsFromEditor(newLineAnnotations);\n }\n }\n\n /** Update the session source without editor DOM, then rehighlight on return. */\n public applySuspendedDocumentChange(\n textDocument: TextDocument<'file', LAnnotation>,\n newLineAnnotations?: LineAnnotation<LAnnotation>[]\n ): void {\n if (this.editSession == null) {\n return;\n }\n this.applyDocumentChange(textDocument, newLineAnnotations);\n this.fileRenderer.clearRenderCache();\n }\n\n public updateRenderCache(\n dirtyLines: Map<number, Array<HighlightedToken>>,\n themeType: 'dark' | 'light',\n options?: {\n lineCountChangeInFlight?: boolean;\n }\n ): void {\n const editSessionFile = this.editSession?.file;\n if (editSessionFile == null) {\n throw new Error(\n 'File.updateRenderCache: requires an active edit session'\n );\n }\n this.fileRenderer.beginEditSession(editSessionFile);\n this.fileRenderer.updateRenderCache(\n dirtyLines,\n themeType,\n options?.lineCountChangeInFlight\n );\n }\n\n public render({\n file,\n fileContainer,\n forceRender = false,\n preventEmit = false,\n containerWrapper,\n deferManagers = false,\n lineAnnotations,\n renderRange,\n }: FileRenderProps<LAnnotation>): boolean {\n if (!this.enabled) {\n throw new Error(\n 'File.render: attempting to call render after cleaned up'\n );\n }\n\n // postpone background tokenizing to next frame for avoiding UI freeze\n // during render\n this.editor?.__postponeBgTokenizeToNextFrame();\n\n const { collapsed = false, themeType = 'system' } = this.options;\n const nextRenderRange = collapsed ? undefined : renderRange;\n const previousRenderRange = this.renderRange;\n const themeChanged = this.hasThemeChanged();\n const annotationsChanged =\n lineAnnotations != null &&\n (lineAnnotations.length > 0 || this.getLatestAnnotations().length > 0)\n ? this.isNewAnnotations(lineAnnotations)\n : false;\n const didFileChange = !areFileTargetsEqual(this.file, file);\n if (didFileChange) {\n this.updateExternalFile(file, lineAnnotations);\n }\n const latestFile = this.getLatestFile(file) ?? file;\n if (\n !collapsed &&\n !forceRender &&\n areRenderRangesEqual(nextRenderRange, this.renderRange) &&\n !didFileChange &&\n !annotationsChanged &&\n !themeChanged\n ) {\n const rendered = this.applyCachedThemeState(themeType);\n if (rendered) {\n this.finalizeRender();\n }\n return rendered;\n }\n\n this.renderRange = nextRenderRange;\n if (didFileChange) {\n this.cachedHeaderHTML = undefined;\n }\n this.fileRenderer.setOptions(getFileRendererOptions(this.options));\n this.syncInteractionOptions();\n if (lineAnnotations != null) {\n this.setLineAnnotations(lineAnnotations);\n }\n this.fileRenderer.setLineAnnotations(this.getLatestAnnotations());\n\n const { disableErrorHandling = false, disableFileHeader = false } =\n this.options;\n if (disableFileHeader) {\n // Remove existing header from DOM\n if (this.headerElement != null) {\n this.headerElement.remove();\n this.headerElement = undefined;\n this.lastRenderedHeaderHTML = undefined;\n }\n this.clearHeaderSlots();\n }\n\n fileContainer = this.getOrCreateFileContainerNode(\n fileContainer,\n containerWrapper\n );\n this.applyCachedThemeState(themeType);\n\n if (collapsed) {\n this.removeRenderedCode();\n this.clearAuxiliaryNodes();\n\n try {\n const fileResult = this.fileRenderer.renderFile(\n latestFile,\n EMPTY_RENDER_RANGE\n );\n if (fileResult != null) {\n this.applyThemeState(\n fileContainer,\n fileResult.themeStyles,\n themeType,\n fileResult.baseThemeType\n );\n }\n if (fileResult?.headerAST != null) {\n this.applyHeaderToDOM(\n fileResult.headerAST,\n fileContainer,\n fileResult.file\n );\n }\n this.renderedFile = fileResult?.file ?? latestFile;\n this.injectUnsafeCSS();\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 this.finalizeRender();\n if (!preventEmit) {\n this.emitPostRender();\n }\n return true;\n }\n\n try {\n const pre = this.getOrCreatePreNode(fileContainer);\n if (\n !this.canPartiallyRender(\n forceRender,\n annotationsChanged,\n didFileChange ||\n themeChanged ||\n !areFileTargetsEqual(this.renderedFile, latestFile)\n ) ||\n !this.applyPartialRender(\n latestFile,\n previousRenderRange,\n nextRenderRange\n )\n ) {\n const fileResult = this.fileRenderer.renderFile(\n latestFile,\n nextRenderRange\n );\n if (fileResult == null) {\n if (\n this.workerManager?.isInitialized() === false &&\n this.workerManager.isWorkingPool()\n ) {\n void this.workerManager\n .initialize()\n .catch(() => {})\n .then(() => this.rerender());\n }\n return false;\n }\n this.applyThemeState(\n fileContainer,\n fileResult.themeStyles,\n themeType,\n fileResult.baseThemeType\n );\n if (fileResult.headerAST != null) {\n this.applyHeaderToDOM(\n fileResult.headerAST,\n fileContainer,\n fileResult.file\n );\n }\n this.applyFullRender(fileResult, pre);\n this.renderedFile = fileResult.file;\n }\n\n this.applyBuffers(pre, nextRenderRange);\n this.injectUnsafeCSS();\n this.renderAnnotations();\n this.renderGutterUtility();\n\n this.managersDirty = true;\n if (!deferManagers) {\n this.flushManagers();\n }\n\n this.finalizeRender();\n if (this.editor != null) {\n this.syncRenderViewToEditor();\n }\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 if (!preventEmit) {\n this.emitPostRender();\n }\n return true;\n }\n\n // Finish subclass layout bookkeeping before editor sync or post-render\n // callbacks can synchronously replace or dispose this component.\n protected finalizeRender(): void {}\n\n private emitPostRender(unmount = false) {\n const {\n fileContainer,\n options: { onPostRender },\n } = this;\n\n if (unmount) {\n if (!this.mounted) {\n return;\n }\n this.mounted = false;\n if (fileContainer == null) {\n return;\n }\n onPostRender?.(fileContainer, this, 'unmount');\n return;\n }\n\n if (fileContainer == null) {\n return;\n }\n\n const phase: PostRenderPhase = this.mounted ? 'update' : 'mount';\n this.mounted = true;\n onPostRender?.(fileContainer, this, phase);\n }\n\n private removeRenderedCode(): void {\n this.resizeManager.cleanUp();\n this.interactionManager.cleanUp();\n\n this.bufferBefore?.remove();\n this.bufferBefore = undefined;\n this.bufferAfter?.remove();\n this.bufferAfter = undefined;\n\n this.code?.remove();\n this.code = undefined;\n\n this.pre?.remove();\n this.pre = undefined;\n\n this.appliedPreAttributes = undefined;\n this.lastRowCount = undefined;\n }\n\n private clearAuxiliaryNodes(): void {\n for (const { element } of this.annotationCache.values()) {\n element.remove();\n }\n this.annotationCache.clear();\n\n this.gutterUtilityContent?.remove();\n this.gutterUtilityContent = undefined;\n }\n\n private canPartiallyRender(\n forceRender: boolean,\n annotationsChanged: boolean,\n didContentChange: boolean\n ): boolean {\n if (forceRender || annotationsChanged || didContentChange) {\n return false;\n }\n return true;\n }\n\n public renderPlaceholder(height: number): boolean {\n if (this.fileContainer == null) {\n return false;\n }\n this.emitPostRender(true);\n this.cleanChildNodes();\n\n if (this.placeHolder == null) {\n const shadowRoot =\n this.fileContainer.shadowRoot ??\n this.fileContainer.attachShadow({ mode: 'open' });\n this.placeHolder = document.createElement('div');\n this.placeHolder.dataset.placeholder = '';\n shadowRoot.appendChild(this.placeHolder);\n }\n return this.setPlaceholderHeight(height);\n }\n\n protected setPlaceholderHeight(height: number): boolean {\n if (this.placeHolder == null) {\n return false;\n }\n this.placeHolder.style.setProperty('height', `${height}px`);\n return true;\n }\n\n public async primeHighlightCache(\n file: FileContents | undefined = this.file\n ): Promise<void> {\n const { workerManager } = this;\n if (\n file == null ||\n workerManager == null ||\n !workerManager.isWorkingPool() ||\n file.cacheKey == null ||\n isFilePlainText(file)\n ) {\n return;\n }\n const tokenizeMaxLength =\n this.options.tokenizeMaxLength ?? DEFAULT_TOKENIZE_MAX_LENGTH;\n const lines = this.fileRenderer.getOrCreateLineCache(file);\n if (lines.length > tokenizeMaxLength) {\n return;\n }\n\n await workerManager\n .primeFileHighlightCache(file)\n .catch((error: unknown) => {\n console.error(error);\n });\n }\n\n private cleanChildNodes() {\n this.resizeManager.cleanUp();\n this.interactionManager.cleanUp();\n this.clearAuxiliaryNodes();\n\n this.bufferAfter?.remove();\n this.bufferBefore?.remove();\n this.code?.remove();\n this.errorWrapper?.remove();\n this.headerElement?.remove();\n this.headerPrefix?.remove();\n this.headerFilenameSuffix?.remove();\n this.headerMetadata?.remove();\n this.headerCustom?.remove();\n this.pre?.remove();\n this.spriteSVG?.remove();\n this.themeCSSStyle?.remove();\n this.unsafeCSSStyle?.remove();\n\n this.bufferAfter = undefined;\n this.bufferBefore = undefined;\n this.code = undefined;\n this.errorWrapper = undefined;\n this.headerElement = undefined;\n this.headerPrefix = undefined;\n this.headerFilenameSuffix = undefined;\n this.headerMetadata = undefined;\n this.headerCustom = undefined;\n this.pre = undefined;\n this.spriteSVG = undefined;\n this.themeCSSStyle = undefined;\n this.appliedThemeCSS = undefined;\n this.hasAdoptedThemeCSS = false;\n this.unsafeCSSStyle = undefined;\n this.appliedUnsafeCSS = undefined;\n\n this.lastRenderedHeaderHTML = undefined;\n this.lastRowCount = undefined;\n\n this.mounted = false;\n }\n\n private renderAnnotations(): void {\n if (this.isContainerManaged || this.fileContainer == null) {\n for (const { element } of this.annotationCache.values()) {\n element.remove();\n }\n this.annotationCache.clear();\n return;\n }\n const staleAnnotations = new Map(this.annotationCache);\n const { renderAnnotation } = this.options;\n const lineAnnotations = this.getLatestAnnotations();\n if (renderAnnotation != null && lineAnnotations.length > 0) {\n for (const [index, annotation] of lineAnnotations.entries()) {\n const name = this.getAnnotationSlotName(annotation);\n const id = `${index}-${name}`;\n let cache = this.annotationCache.get(id);\n if (\n cache == null ||\n !areLineAnnotationsEqual(annotation, cache.annotation)\n ) {\n cache?.element.remove();\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(name),\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.remove();\n }\n }\n\n private renderGutterUtility() {\n const { renderGutterUtility } = this.options;\n if (this.fileContainer == null || renderGutterUtility == null) {\n this.gutterUtilityContent?.remove();\n this.gutterUtilityContent = undefined;\n return;\n }\n const element = renderGutterUtility(this.interactionManager.getHoveredLine);\n if (element != null && this.gutterUtilityContent != null) {\n return;\n } else if (element == null) {\n this.gutterUtilityContent?.remove();\n this.gutterUtilityContent = undefined;\n return;\n }\n const gutterUtilityContent = createGutterUtilityContentNode();\n gutterUtilityContent.appendChild(element);\n this.fileContainer.appendChild(gutterUtilityContent);\n this.gutterUtilityContent = gutterUtilityContent;\n }\n\n private injectUnsafeCSS(): void {\n const { unsafeCSS } = this.options;\n const shadowRoot = this.fileContainer?.shadowRoot;\n if (shadowRoot == null) {\n return;\n }\n\n if (unsafeCSS == null || unsafeCSS === '') {\n if (this.unsafeCSSStyle != null) {\n this.unsafeCSSStyle.remove();\n this.unsafeCSSStyle = undefined;\n }\n this.appliedUnsafeCSS = undefined;\n return;\n }\n\n if (\n this.unsafeCSSStyle?.parentNode === shadowRoot &&\n this.appliedUnsafeCSS === unsafeCSS\n ) {\n return;\n }\n\n // Create or update the style element\n this.unsafeCSSStyle ??= createUnsafeCSSStyleNode();\n if (this.unsafeCSSStyle.parentNode !== shadowRoot) {\n shadowRoot.appendChild(this.unsafeCSSStyle);\n }\n // Wrap in @layer unsafe to match SSR behavior\n this.unsafeCSSStyle.textContent = wrapUnsafeCSS(unsafeCSS);\n this.appliedUnsafeCSS = unsafeCSS;\n }\n\n private applyThemeState(\n container: HTMLElement,\n themeStyles: string,\n themeType: ThemeTypes,\n baseThemeType?: 'light' | 'dark'\n ): void {\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n const effectiveThemeType = baseThemeType ?? themeType;\n const currentTheme = this.getTheme();\n const theme =\n typeof currentTheme === 'string' ? currentTheme : { ...currentTheme };\n const scrollbarGutter = getMeasuredScrollbarGutter(shadowRoot);\n if (\n this.themeCSSStyle?.parentNode === shadowRoot &&\n this.appliedThemeCSS?.themeStyles === themeStyles &&\n this.appliedThemeCSS.themeType === effectiveThemeType &&\n this.appliedThemeCSS.scrollbarGutter === scrollbarGutter\n ) {\n this.appliedThemeCSS.theme = theme;\n return;\n }\n if (\n this.hasAdoptedThemeCSS &&\n this.themeCSSStyle?.parentNode === shadowRoot\n ) {\n this.hasAdoptedThemeCSS = false;\n this.appliedThemeCSS = {\n theme,\n themeStyles,\n themeType: effectiveThemeType,\n baseThemeType,\n scrollbarGutter,\n };\n return;\n }\n this.themeCSSStyle = upsertHostThemeStyle({\n shadowRoot,\n currentNode: this.themeCSSStyle,\n themeCSS: wrapThemeCSS(themeStyles, effectiveThemeType, scrollbarGutter),\n });\n this.appliedThemeCSS =\n this.themeCSSStyle != null\n ? {\n theme,\n themeStyles,\n themeType: effectiveThemeType,\n baseThemeType,\n scrollbarGutter,\n }\n : undefined;\n }\n\n private hydrateMeasuredScrollbar(): void {\n const shadowRoot = this.fileContainer?.shadowRoot;\n if (shadowRoot == null || this.themeCSSStyle == null) {\n return;\n }\n this.themeCSSStyle.textContent = patchScrollbarGutterSize(\n this.themeCSSStyle.textContent ?? '',\n getMeasuredScrollbarGutter(shadowRoot)\n );\n }\n\n // A boolean check to ensure that edit mode in WebKit doesn't cause potential\n // scroll jumps to due bugs with WebKit. The workarounds have performance\n // implications so we avoid running the workarounds on browsers or scenarios\n // where they are not applicable\n protected shouldGuardRebuildScroll(): boolean {\n return this.editor != null && isSafari();\n }\n\n private applyFullRender(result: FileRenderResult, pre: HTMLPreElement): void {\n this.cleanupErrorWrapper();\n this.applyPreNodeAttributes(pre, result);\n const code = (this.code = getOrCreateCodeNode({ code: this.code }));\n const codeAst = this.fileRenderer.renderCodeAST(result);\n this.editor?.__captureFocusForDOMReplacement();\n const applyColumns = () => {\n if (code.childElementCount >= 2) {\n for (let i = 0; i < 2; i++) {\n const domEl = code.children[i] as HTMLElement;\n const astEl = codeAst[i] as HASTElement;\n domEl.innerHTML = toHtml(astEl.children);\n domEl.style.cssText = astEl.properties.style as string;\n }\n } else {\n code.innerHTML = toHtml(codeAst);\n }\n if (!pre.contains(code)) {\n pre.replaceChildren(code);\n }\n };\n if (this.shouldGuardRebuildScroll()) {\n guardWebKitScrollDuringRebuild(pre, applyColumns);\n } else {\n applyColumns();\n }\n this.lastRowCount = result.rowCount;\n }\n\n private applyPartialRender(\n file: FileContents,\n previousRenderRange: RenderRange | undefined,\n renderRange: RenderRange | undefined\n ): boolean {\n if (previousRenderRange == null || renderRange == null) {\n return false;\n }\n const { code } = this;\n const columns = code != null ? this.getColumns(code) : undefined;\n if (code == null || columns == null) {\n return false;\n }\n\n const previousStart = previousRenderRange.startingLine;\n const nextStart = renderRange.startingLine;\n const previousEnd =\n previousRenderRange.totalLines === Infinity\n ? Number.POSITIVE_INFINITY\n : previousStart + previousRenderRange.totalLines;\n const nextEnd =\n renderRange.totalLines === Infinity\n ? Number.POSITIVE_INFINITY\n : nextStart + renderRange.totalLines;\n\n const overlapStart = Math.max(previousStart, nextStart);\n const overlapEnd = Math.min(previousEnd, nextEnd);\n if (overlapEnd <= overlapStart) {\n return false;\n }\n\n if (\n !this.trimDOMToOverlap(columns.gutter, overlapStart, overlapEnd) ||\n !this.trimDOMToOverlap(columns.content, overlapStart, overlapEnd)\n ) {\n throw new Error('File.applyPartialRender: failed to trim to overlap');\n }\n\n let { length: rowCount } = columns.content.children;\n\n const renderChunk = (\n startingLine: number,\n totalLines: number\n ): FileRenderResult | undefined => {\n if (totalLines <= 0) {\n return undefined;\n }\n return this.fileRenderer.renderFile(file, {\n startingLine,\n totalLines,\n bufferBefore: 0,\n bufferAfter: 0,\n });\n };\n\n const prependResult =\n nextStart < overlapStart\n ? renderChunk(nextStart, overlapStart - nextStart)\n : undefined;\n if (prependResult === undefined && nextStart < overlapStart) {\n return false;\n }\n\n const appendTotalLines =\n nextEnd === Number.POSITIVE_INFINITY\n ? Number.POSITIVE_INFINITY\n : Math.max(0, nextEnd - overlapEnd);\n const appendResult =\n nextEnd > overlapEnd\n ? renderChunk(overlapEnd, appendTotalLines)\n : undefined;\n if (appendResult === undefined && nextEnd > overlapEnd) {\n return false;\n }\n\n this.cleanupErrorWrapper();\n if (prependResult != null) {\n columns.gutter.insertAdjacentHTML(\n 'afterbegin',\n this.fileRenderer.renderPartialHTML(prependResult.gutterAST)\n );\n columns.content.insertAdjacentHTML(\n 'afterbegin',\n this.fileRenderer.renderPartialHTML(prependResult.contentAST)\n );\n rowCount += prependResult.rowCount;\n }\n\n if (appendResult != null) {\n columns.gutter.insertAdjacentHTML(\n 'beforeend',\n this.fileRenderer.renderPartialHTML(appendResult.gutterAST)\n );\n columns.content.insertAdjacentHTML(\n 'beforeend',\n this.fileRenderer.renderPartialHTML(appendResult.contentAST)\n );\n rowCount += appendResult.rowCount;\n }\n\n if (this.lastRowCount !== rowCount) {\n columns.gutter.style.setProperty('grid-row', `span ${rowCount}`);\n columns.content.style.setProperty('grid-row', `span ${rowCount}`);\n this.lastRowCount = rowCount;\n }\n\n return true;\n }\n\n private getColumns(code: HTMLElement): ColumnElements | undefined {\n const gutter = code.children[0];\n const content = code.children[1];\n if (\n !(gutter instanceof HTMLElement) ||\n !(content instanceof HTMLElement) ||\n gutter.dataset.gutter == null ||\n content.dataset.content == null\n ) {\n return undefined;\n }\n return { gutter, content };\n }\n\n private trimDOMToOverlap(\n container: HTMLElement,\n overlapStart: number,\n overlapEnd: number\n ): boolean {\n const boundaryIndices = this.getDOMBoundaryIndices(container, [\n overlapStart,\n overlapEnd,\n ]);\n const startIndex =\n boundaryIndices.get(overlapStart) ?? container.children.length;\n const endIndex =\n boundaryIndices.get(overlapEnd) ?? container.children.length;\n\n if (startIndex > endIndex) {\n return false;\n }\n\n for (let i = container.children.length - 1; i >= endIndex; i -= 1) {\n container.children[i]?.remove();\n }\n for (let i = startIndex - 1; i >= 0; i -= 1) {\n container.children[i]?.remove();\n }\n return true;\n }\n\n private getDOMBoundaryIndices(\n container: HTMLElement,\n boundaries: number[]\n ): Map<number, number> {\n const sortedBoundaries = [...new Set(boundaries)].sort((a, b) => a - b);\n const boundaryIndices = new Map<number, number>();\n if (sortedBoundaries.length === 0) {\n return boundaryIndices;\n }\n let boundaryIndex = 0;\n let nextBoundary = sortedBoundaries[boundaryIndex];\n const { children } = container;\n\n if (nextBoundary === 0) {\n boundaryIndices.set(0, 0);\n boundaryIndex += 1;\n nextBoundary = sortedBoundaries[boundaryIndex];\n }\n\n for (let i = 0; i < children.length; i += 1) {\n const child = children[i];\n if (!(child instanceof HTMLElement)) {\n continue;\n }\n const lineIndex = this.getLineIndexFromDOMNode(child);\n if (lineIndex == null) {\n continue;\n }\n while (nextBoundary != null && lineIndex >= nextBoundary) {\n boundaryIndices.set(nextBoundary, i);\n boundaryIndex += 1;\n nextBoundary = sortedBoundaries[boundaryIndex];\n }\n if (boundaryIndex >= sortedBoundaries.length) {\n break;\n }\n }\n\n for (const boundary of sortedBoundaries) {\n if (!boundaryIndices.has(boundary)) {\n boundaryIndices.set(boundary, children.length);\n }\n }\n return boundaryIndices;\n }\n\n private getLineIndexFromDOMNode(node: HTMLElement): number | undefined {\n const lineIndexAttr = node.dataset.lineIndex;\n if (lineIndexAttr == null) {\n return undefined;\n }\n const parsed = Number(lineIndexAttr);\n return Number.isNaN(parsed) ? undefined : parsed;\n }\n\n private applyBuffers(\n pre: HTMLPreElement,\n renderRange: RenderRange | undefined\n ) {\n if (renderRange == null || this.shouldDisableVirtualizationBuffers()) {\n if (this.bufferBefore != null) {\n this.bufferBefore.remove();\n this.bufferBefore = undefined;\n }\n if (this.bufferAfter != null) {\n this.bufferAfter.remove();\n this.bufferAfter = undefined;\n }\n return;\n }\n\n if (renderRange.bufferBefore > 0) {\n if (this.bufferBefore == null) {\n this.bufferBefore = document.createElement('div');\n this.bufferBefore.dataset.virtualizerBuffer = 'before';\n pre.before(this.bufferBefore);\n }\n this.bufferBefore.style.setProperty(\n 'height',\n `${renderRange.bufferBefore}px`\n );\n this.bufferBefore.style.setProperty('contain', 'strict');\n } else if (this.bufferBefore != null) {\n this.bufferBefore.remove();\n this.bufferBefore = undefined;\n }\n\n if (renderRange.bufferAfter > 0) {\n if (this.bufferAfter == null) {\n this.bufferAfter = document.createElement('div');\n this.bufferAfter.dataset.virtualizerBuffer = 'after';\n pre.after(this.bufferAfter);\n }\n this.bufferAfter.style.setProperty(\n 'height',\n `${renderRange.bufferAfter}px`\n );\n this.bufferAfter.style.setProperty('contain', 'strict');\n } else if (this.bufferAfter != null) {\n this.bufferAfter.remove();\n this.bufferAfter = undefined;\n }\n }\n\n protected shouldDisableVirtualizationBuffers(): boolean {\n return this.options.disableVirtualizationBuffers ?? false;\n }\n\n private applyHeaderToDOM(\n headerAST: HASTElement,\n container: HTMLElement,\n file: FileContents\n ): void {\n this.cleanupErrorWrapper();\n this.placeHolder?.remove();\n this.placeHolder = undefined;\n const headerHTML = this.cachedHeaderHTML ?? toHtml(headerAST);\n this.cachedHeaderHTML = headerHTML;\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 {\n renderHeaderPrefix,\n renderHeaderFilenameSuffix,\n renderCustomHeader,\n renderHeaderMetadata,\n } = this.options;\n\n if (renderCustomHeader != null) {\n const content = renderCustomHeader(file) ?? undefined;\n this.headerCustom = this.upsertHeaderSlotElement(\n container,\n this.headerCustom,\n CUSTOM_HEADER_SLOT_ID,\n content\n );\n this.headerPrefix?.remove();\n this.headerFilenameSuffix?.remove();\n this.headerMetadata?.remove();\n this.headerPrefix = undefined;\n this.headerFilenameSuffix = undefined;\n this.headerMetadata = undefined;\n } else {\n const prefix = renderHeaderPrefix?.(file) ?? undefined;\n const suffix = renderHeaderFilenameSuffix?.(file) ?? undefined;\n const content = renderHeaderMetadata?.(file) ?? undefined;\n this.headerPrefix = this.upsertHeaderSlotElement(\n container,\n this.headerPrefix,\n HEADER_PREFIX_SLOT_ID,\n prefix\n );\n this.headerFilenameSuffix = this.upsertHeaderSlotElement(\n container,\n this.headerFilenameSuffix,\n HEADER_FILENAME_SUFFIX_SLOT_ID,\n suffix\n );\n this.headerMetadata = this.upsertHeaderSlotElement(\n container,\n this.headerMetadata,\n HEADER_METADATA_SLOT_ID,\n content\n );\n this.headerCustom?.remove();\n this.headerCustom = undefined;\n }\n }\n\n private clearHeaderSlots(): void {\n this.headerPrefix?.remove();\n this.headerFilenameSuffix?.remove();\n this.headerMetadata?.remove();\n this.headerCustom?.remove();\n this.headerPrefix = undefined;\n this.headerFilenameSuffix = undefined;\n this.headerMetadata = undefined;\n this.headerCustom = undefined;\n }\n\n // Header slot callbacks are presence-based render hooks, not reactive views.\n private upsertHeaderSlotElement(\n container: HTMLElement,\n current: HTMLElement | undefined,\n slot: string,\n content: Element | string | number | undefined\n ): HTMLElement | undefined {\n if (content == null) {\n current?.remove();\n return undefined;\n }\n const element = current ?? this.createHeaderSlotElement(slot);\n if (current == null) {\n container.appendChild(element);\n }\n this.replaceHeaderSlotContent(element, content);\n return element;\n }\n\n private replaceHeaderSlotContent(\n element: HTMLElement,\n content: Element | string | number\n ): void {\n element.replaceChildren();\n if (content instanceof Element) {\n element.appendChild(content);\n } else {\n element.innerText = `${content}`;\n }\n }\n\n private createHeaderSlotElement(slot: string): HTMLElement {\n const element = document.createElement('div');\n element.slot = slot;\n return element;\n }\n\n protected getOrCreateFileContainerNode(\n fileContainer?: HTMLElement,\n parentNode?: HTMLElement\n ): HTMLElement {\n const { fileContainer: previousContainer } = this;\n const nextContainer =\n fileContainer ??\n previousContainer ??\n document.createElement(DIFFS_TAG_NAME);\n const containerChanged = previousContainer !== nextContainer;\n if (previousContainer != null && containerChanged) {\n this.editor?.__captureFocusForDOMReplacement();\n }\n if (containerChanged) {\n this.emitPostRender(true);\n }\n this.fileContainer = nextContainer;\n if (previousContainer != null && containerChanged) {\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 (containerChanged) {\n this.adoptReusableShellElements(this.fileContainer);\n }\n this.ensureSpriteSVG(this.fileContainer);\n return this.fileContainer;\n }\n\n // NOTE(amadeus): Technically this method is not safe for use outside of\n // the CodeView component, however I don't think in practice it really\n // should matter, but maybe there's some system we need in place to prevent\n // this from running outside of that environment?\n //\n // It's making very specific assumptions that all the elements will have the\n // correct content based on CodeView global options\n private adoptReusableShellElements(fileContainer: HTMLElement): void {\n const { shadowRoot } = fileContainer;\n if (shadowRoot == null) {\n return;\n }\n\n for (const element of shadowRoot.children) {\n if (element instanceof SVGElement) {\n this.spriteSVG ??= element;\n } else if (\n isStyleNode(element) &&\n element.hasAttribute(THEME_CSS_ATTRIBUTE)\n ) {\n this.themeCSSStyle ??= element;\n this.hasAdoptedThemeCSS = true;\n } else if (\n isStyleNode(element) &&\n element.hasAttribute(UNSAFE_CSS_ATTRIBUTE)\n ) {\n this.unsafeCSSStyle ??= element;\n this.appliedUnsafeCSS ??= this.options.unsafeCSS ?? undefined;\n }\n }\n }\n\n private ensureSpriteSVG(fileContainer: HTMLElement): void {\n const shadowRoot =\n fileContainer.shadowRoot ?? fileContainer.attachShadow({ mode: 'open' });\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 }\n }\n if (this.spriteSVG != null && this.spriteSVG.parentNode !== shadowRoot) {\n shadowRoot.appendChild(this.spriteSVG);\n }\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.code = 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 this.editor?.__captureFocusForDOMReplacement();\n container.shadowRoot?.appendChild(this.pre);\n this.appliedPreAttributes = undefined;\n }\n\n this.placeHolder?.remove();\n this.placeHolder = undefined;\n\n return this.pre;\n }\n\n private syncCodeNodeFromPre(pre: HTMLPreElement): void {\n this.code = undefined;\n for (const child of Array.from(pre.children)) {\n if (!(child instanceof HTMLElement)) {\n continue;\n }\n if (child.hasAttribute('data-code')) {\n this.code = child;\n return;\n }\n }\n }\n\n private applyPreNodeAttributes(\n pre: HTMLPreElement,\n { totalLines }: FileRenderResult\n ): void {\n const { overflow = 'scroll', disableLineNumbers = false } = this.options;\n const preProperties: PrePropertiesConfig = {\n type: 'file',\n split: false,\n overflow,\n disableLineNumbers,\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 this.pre?.remove();\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.textContent = '';\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?.remove();\n this.errorWrapper = undefined;\n }\n}\n\nfunction shouldRenderCode(\n pre: HTMLPreElement | undefined,\n file: FileContents | undefined,\n collapsed = false\n): boolean {\n return !collapsed && pre == null && file != null;\n}\n\nfunction shouldRenderHeader(\n headerElement: HTMLElement | undefined,\n file: FileContents | undefined,\n disableFileHeader: boolean = false\n): boolean {\n return headerElement == null && file != null && !disableFileHeader;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"File.js","names":[],"sources":["../../src/components/File.ts"],"sourcesContent":["import type { Element as HASTElement } from 'hast';\nimport { toHtml } from 'hast-util-to-html';\n\nimport {\n CUSTOM_HEADER_SLOT_ID,\n DEFAULT_THEMES,\n DEFAULT_TOKENIZE_MAX_LENGTH,\n DIFFS_TAG_NAME,\n EMPTY_RENDER_RANGE,\n HEADER_FILENAME_SUFFIX_SLOT_ID,\n HEADER_METADATA_SLOT_ID,\n HEADER_PREFIX_SLOT_ID,\n THEME_CSS_ATTRIBUTE,\n UNSAFE_CSS_ATTRIBUTE,\n} from '../constants';\nimport type { Editor } from '../editor/editor';\nimport type { TextDocument } from '../editor/textDocument';\nimport type {\n EditCompletionDecision,\n EditorActiveLineOptions,\n EditorChangeEvent,\n FileEditCompleteEvent,\n} from '../editor/types';\nimport {\n type GetHoveredLineResult,\n InteractionManager,\n type InteractionManagerBaseOptions,\n pluckInteractionOptions,\n type SelectionWriteOptions,\n} from '../managers/InteractionManager';\nimport { ResizeManager } from '../managers/ResizeManager';\nimport { FileRenderer, type FileRenderResult } from '../renderers/FileRenderer';\nimport { SVGSpriteSheet } from '../sprite';\nexport type { FileEditCompleteEvent } from '../editor/types';\nimport {\n getHighlighterIfLoaded,\n getSharedHighlighter,\n} from '../highlighter/shared_highlighter';\nimport type {\n AppliedThemeStyleCache,\n BaseCodeOptions,\n DiffLineAnnotation,\n DiffsHighlighter,\n FileContents,\n HighlightedToken,\n LineAnnotation,\n PostRenderPhase,\n PrePropertiesConfig,\n RenderFileMetadata,\n RenderRange,\n SelectedLineRange,\n ThemeTypes,\n} from '../types';\nimport { areFileTargetsEqual } from '../utils/areFileTargetsEqual';\nimport { areLineAnnotationsEqual } from '../utils/areLineAnnotationsEqual';\nimport { arePrePropertiesEqual } from '../utils/arePrePropertiesEqual';\nimport { areRenderRangesEqual } from '../utils/areRenderRangesEqual';\nimport { areThemesEqual } from '../utils/areThemesEqual';\nimport { createAnnotationWrapperNode } from '../utils/createAnnotationWrapperNode';\nimport { createGutterUtilityContentNode } from '../utils/createGutterUtilityContentNode';\nimport { createUnsafeCSSStyleNode } from '../utils/createUnsafeCSSStyleNode';\nimport {\n patchScrollbarGutterSize,\n wrapThemeCSS,\n wrapUnsafeCSS,\n} from '../utils/cssWrappers';\nimport {\n adoptEditSessionAnnotations,\n type EditSessionAnnotations,\n resolveEditSessionSlotName,\n writeEditSessionAnnotations,\n} from '../utils/editSessionAnnotations';\nimport { getFileRendererOptions } from '../utils/getFileRendererOptions';\nimport { getFiletypeFromFileName } from '../utils/getFiletypeFromFileName';\nimport { getLineAnnotationName } from '../utils/getLineAnnotationName';\nimport { getOrCreateCodeNode } from '../utils/getOrCreateCodeNode';\nimport { getThemes } from '../utils/getThemes';\nimport { guardWebKitScrollDuringRebuild } from '../utils/guardWebKitScrollDuringRebuild';\nimport { upsertHostThemeStyle } from '../utils/hostTheme';\nimport { isFilePlainText } from '../utils/isFilePlainText';\nimport { isStyleNode } from '../utils/isStyleNode';\nimport { isSafari } from '../utils/platform';\nimport { prerenderHTMLIfNecessary } from '../utils/prerenderHTMLIfNecessary';\nimport { getMeasuredScrollbarGutter } from '../utils/scrollbarGutter';\nimport { setPreNodeProperties } from '../utils/setWrapperNodeProps';\nimport type { WorkerPoolManager } from '../worker';\nimport { isHandledWorkerPoolError } from '../worker/errors';\nimport { DiffsContainerLoaded } from './web-components';\n\nconst EMPTY_STRINGS: string[] = [''];\n\nexport interface FileRenderProps<LAnnotation> {\n file: FileContents;\n fileContainer?: HTMLElement;\n containerWrapper?: HTMLElement;\n deferManagers?: boolean;\n forceRender?: boolean;\n preventEmit?: boolean;\n lineAnnotations?: LineAnnotation<LAnnotation>[];\n renderRange?: RenderRange;\n}\n\nexport interface FileHydrateProps<LAnnotation> extends Omit<\n FileRenderProps<LAnnotation>,\n 'fileContainer'\n> {\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\n\nexport type FileEditChangeHandler<LAnnotation, Caret> = (\n event: EditorChangeEvent<'file', LAnnotation, Caret>\n) => void;\n\n/**\n * Decides a completed edit synchronously: return `'accept'` to install the\n * event's `file` and annotations, or `'reject'` to restore the original values.\n * The event is frozen, so re-key the accepted file in place\n * (`event.file.cacheKey = '…'`) before accepting. The event's editor is\n * detached and returns its final state from `getViewState()`. A missing handler\n * rejects.\n */\nexport type FileEditCompleteHandler<LAnnotation, Caret> = (\n event: FileEditCompleteEvent<LAnnotation, Caret>\n) => EditCompletionDecision;\n\nexport interface FileOptions<LAnnotation, Caret>\n extends BaseCodeOptions, InteractionManagerBaseOptions<'file'> {\n disableFileHeader?: boolean;\n renderHeaderPrefix?: RenderFileMetadata;\n renderHeaderFilenameSuffix?: RenderFileMetadata;\n renderHeaderMetadata?: RenderFileMetadata;\n renderCustomHeader?: 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 renderGutterUtility?(\n getHoveredRow: () => GetHoveredLineResult<'file'> | undefined\n ): HTMLElement | null | undefined;\n\n onPostRender?(\n node: HTMLElement,\n instance: File<LAnnotation, Caret>,\n phase: PostRenderPhase\n ): unknown;\n\n /**\n * Fired for every document change of an active edit session on this\n * component, with the same `EditorChangeEvent` the editor reports through\n * its own `onChange`. Do not feed the event's file back into the component\n * while the session is active.\n */\n onEditChange?: FileEditChangeHandler<LAnnotation, Caret>;\n\n /**\n * Fired when `edit` toggles false or a component unmounts, including when the\n * final contents are unchanged. If no callback is provided, the component\n * reverts to the last `file` and annotations passed into it. The callback\n * receives the detached editor with its final pre-detach state.\n */\n onEditComplete?: FileEditCompleteHandler<LAnnotation, Caret>;\n}\n\ninterface AnnotationElementCache<LAnnotation> {\n element: HTMLElement;\n annotation: LineAnnotation<LAnnotation>;\n}\n\ninterface ColumnElements {\n gutter: HTMLElement;\n content: HTMLElement;\n}\n\ninterface HydrationSetup<LAnnotation> {\n file: FileContents;\n lineAnnotations: LineAnnotation<LAnnotation>[] | undefined;\n}\n\ninterface EditSession<LAnnotation> {\n file: FileContents;\n annotations: EditSessionAnnotations<LineAnnotation<LAnnotation>> | undefined;\n /*\n * `externalReplacement` records that the host swapped in a new file\n * mid-session, so the next sync tells the editor to adopt `file` over its\n * own document\n */\n externalReplacement: boolean;\n}\n\nfunction createEditSessionFile(file: FileContents): FileContents {\n const editSessionFile = { ...file };\n delete editSessionFile.cacheKey;\n return editSessionFile;\n}\n\nlet instanceId = -1;\n\nexport class File<LAnnotation = undefined, Caret = undefined> {\n static LoadedCustomComponent: boolean = DiffsContainerLoaded;\n\n readonly __id: string = `file:${++instanceId}`;\n readonly type = 'file';\n\n protected fileContainer: HTMLElement | undefined;\n protected spriteSVG: SVGElement | undefined;\n protected pre: HTMLPreElement | undefined;\n protected code: HTMLElement | undefined;\n protected bufferBefore: HTMLElement | undefined;\n protected bufferAfter: HTMLElement | undefined;\n protected themeCSSStyle: HTMLStyleElement | undefined;\n protected appliedThemeCSS: AppliedThemeStyleCache | undefined;\n protected hasAdoptedThemeCSS = false;\n protected unsafeCSSStyle: HTMLStyleElement | undefined;\n protected appliedUnsafeCSS: string | undefined;\n protected gutterUtilityContent: HTMLElement | undefined;\n protected errorWrapper: HTMLElement | undefined;\n protected placeHolder: HTMLElement | undefined;\n protected lastRenderedHeaderHTML: string | undefined;\n protected cachedHeaderHTML: string | undefined;\n protected appliedPreAttributes: PrePropertiesConfig | undefined;\n protected lastRowCount: number | undefined;\n private mounted = false;\n\n protected headerElement: HTMLElement | undefined;\n protected headerCustom: HTMLElement | undefined;\n protected headerPrefix: HTMLElement | undefined;\n protected headerFilenameSuffix: HTMLElement | undefined;\n protected headerMetadata: HTMLElement | undefined;\n\n protected fileRenderer: FileRenderer<LAnnotation>;\n protected resizeManager: ResizeManager;\n protected interactionManager: InteractionManager<'file'>;\n\n protected annotationCache: Map<string, AnnotationElementCache<LAnnotation>> =\n new Map();\n protected lineAnnotations: LineAnnotation<LAnnotation>[] = [];\n protected managersDirty = false;\n\n public file: FileContents | undefined;\n private editSession: EditSession<LAnnotation> | undefined;\n protected renderedFile: FileContents | undefined;\n protected renderRange: RenderRange | undefined;\n protected enabled = true;\n\n protected editor: Editor<'file', LAnnotation, Caret> | undefined;\n\n constructor(\n public options: FileOptions<LAnnotation, Caret> = {\n theme: DEFAULT_THEMES,\n },\n private workerManager?: WorkerPoolManager | undefined,\n private isContainerManaged = false\n ) {\n this.fileRenderer = new FileRenderer<LAnnotation>(\n options,\n this.getAnnotationSlotName,\n this.handleHighlightRender,\n this.workerManager\n );\n this.resizeManager = new ResizeManager();\n this.interactionManager = new InteractionManager(\n 'file',\n pluckInteractionOptions(options)\n );\n this.workerManager?.subscribeToThemeChanges(this);\n }\n\n public getAnnotationSlotName = (\n annotation: LineAnnotation<LAnnotation> | DiffLineAnnotation<LAnnotation>\n ): string => {\n return resolveEditSessionSlotName(\n this.editSession?.annotations,\n annotation,\n getLineAnnotationName\n );\n };\n\n private handleHighlightRender = (): void => {\n this.rerender();\n };\n\n public rerender(): void {\n if (!this.enabled || this.file == null) return;\n this.render({\n file: this.file,\n forceRender: true,\n renderRange: this.renderRange,\n });\n }\n\n private getTheme() {\n return (\n this.workerManager?.getFileRenderOptions().theme ??\n this.options.theme ??\n DEFAULT_THEMES\n );\n }\n\n // Return the newest file this component intends to display. Once editing\n // starts, the private edit-session file owns that state.\n protected getLatestFile(\n file: FileContents | undefined = this.file\n ): FileContents | undefined {\n return this.editSession?.file ?? file;\n }\n\n // Return the file that produced the DOM currently owned by this instance.\n protected getRenderedFile(): FileContents | undefined {\n return this.renderedFile;\n }\n\n protected getLatestAnnotations(): LineAnnotation<LAnnotation>[] {\n return this.editSession?.annotations?.current ?? this.lineAnnotations;\n }\n\n // Returns true when the caller passed annotations this component has not\n // handled yet. Re-renders often re-pass an annotations array the component\n // already holds — the external one, or one the active session tracks — and\n // treating those repeats as new writes would move annotations, so they are\n // recognized by identity and ignored.\n protected isNewAnnotations(\n lineAnnotations: LineAnnotation<LAnnotation>[]\n ): boolean {\n const session = this.editSession?.annotations;\n const externalAnnotations = this.lineAnnotations;\n if (lineAnnotations === externalAnnotations) {\n return false;\n }\n return (\n session == null ||\n (lineAnnotations !== session.provided &&\n lineAnnotations !== session.current)\n );\n }\n\n // Install a replacement file from the caller; returns false when it is the\n // file already installed. During an edit session the swap re-seeds the\n // session as a host replacement, and the next sync decides whether it keeps\n // or resets undo history.\n protected updateExternalFile(\n incomingFile: FileContents,\n lineAnnotations?: LineAnnotation<LAnnotation>[]\n ): boolean {\n if (areFileTargetsEqual(this.file, incomingFile)) {\n return false;\n }\n\n const hadSession = this.editSession != null;\n this.file = incomingFile;\n\n if (hadSession || this.editor != null) {\n this.installEditSession(\n incomingFile,\n hadSession\n ? undefined\n : this.editor?.__getDocumentContents(incomingFile),\n true\n );\n } else {\n this.editSession = undefined;\n }\n if (this.editSession?.annotations != null && lineAnnotations != null) {\n // These annotations arrived with the new file, so their line numbers\n // describe it. The positions the session tracked for the old document\n // mean nothing now: the session restarts from these annotations, and\n // they also become what renders once the session ends.\n this.lineAnnotations = lineAnnotations;\n this.editSession.annotations = adoptEditSessionAnnotations(\n lineAnnotations,\n getLineAnnotationName,\n this.editSession.annotations\n );\n }\n return true;\n }\n\n // Set up the edit session's working copy — the editable copy of this file that\n // edit mode operates on: create the session if there isn't one, or replace its\n // file if one is already running (its annotations carry over). The working\n // copy's text is normally `externalFile`, but if `retainedDocument` is given\n // and its text differs, the session keeps that content instead so text carried\n // over from an earlier session isn't lost.\n //\n // `hostReplacement` is true only when the host swapped in a new file, not on a\n // plain first attach — the one case where the editor should overwrite whatever\n // it is currently showing with this file. It is recorded on the session for\n // the next sync to act on.\n private installEditSession(\n externalFile: FileContents,\n retainedDocument?: FileContents,\n hostReplacement = false\n ): void {\n const usesExternalDocument =\n retainedDocument == null ||\n (retainedDocument.name === externalFile.name &&\n retainedDocument.lang === externalFile.lang &&\n retainedDocument.contents === externalFile.contents);\n const file = createEditSessionFile(retainedDocument ?? externalFile);\n this.editSession = {\n file,\n externalReplacement: hostReplacement && usesExternalDocument,\n // Seed annotations when the session is created so the adopt-block in\n // updateExternalFile fires on the next external update — this is what an\n // attach-before-hydrate (React) mount relies on, since the session does\n // not exist yet at attach. A live session keeps the ones it tracks.\n annotations:\n this.editSession?.annotations ??\n adoptEditSessionAnnotations(\n this.lineAnnotations,\n getLineAnnotationName\n ),\n };\n this.fileRenderer.beginEditSession(\n file,\n usesExternalDocument ? externalFile : undefined\n );\n }\n\n public onThemeChange(): void {\n this.fileRenderer.clearRenderCache();\n this.rerender();\n }\n\n public setOptions(\n options: FileOptions<LAnnotation, Caret> | undefined\n ): void {\n if (options == null) return;\n this.options = options;\n this.cachedHeaderHTML = undefined;\n this.syncInteractionOptions();\n }\n\n protected syncInteractionOptions(): void {\n this.interactionManager.setOptions(pluckInteractionOptions(this.options));\n }\n\n private mergeOptions(\n options: Partial<FileOptions<LAnnotation, Caret>>\n ): void {\n this.options = { ...this.options, ...options };\n }\n\n public setThemeType(themeType: ThemeTypes): void {\n if ((this.options.themeType ?? 'system') === themeType) {\n return;\n }\n this.mergeOptions({ themeType });\n this.applyCachedThemeState(themeType);\n }\n\n private applyCachedThemeState(themeType: ThemeTypes): boolean {\n if (\n typeof this.options.theme === 'string' ||\n this.fileContainer == null ||\n this.appliedThemeCSS == null\n ) {\n return false;\n }\n const effectiveThemeType = this.appliedThemeCSS.baseThemeType ?? themeType;\n if (this.appliedThemeCSS.themeType === effectiveThemeType) {\n return false;\n }\n this.applyThemeState(\n this.fileContainer,\n this.appliedThemeCSS.themeStyles,\n themeType,\n this.appliedThemeCSS.baseThemeType\n );\n return true;\n }\n\n private hasThemeChanged(): boolean {\n return (\n this.appliedThemeCSS != null &&\n !areThemesEqual(this.appliedThemeCSS.theme, this.getTheme())\n );\n }\n\n public getHoveredLine = (): GetHoveredLineResult<'file'> | undefined => {\n return this.interactionManager.getHoveredLine();\n };\n\n public setLineAnnotations(\n lineAnnotations: LineAnnotation<LAnnotation>[]\n ): void {\n const sessionAnnotations = this.editSession?.annotations;\n if (sessionAnnotations == null) {\n this.lineAnnotations = lineAnnotations;\n return;\n }\n if (!this.isNewAnnotations(lineAnnotations)) {\n return;\n }\n // Externally provided annotations are the source of truth: they become the\n // new external collection and the session renders them at the line numbers\n // given. The caller owns whether those positions still make sense after an\n // edit; a revert renders this collection unchanged rather than moving them.\n this.lineAnnotations = lineAnnotations;\n writeEditSessionAnnotations(\n sessionAnnotations,\n lineAnnotations,\n getLineAnnotationName\n );\n }\n\n // Takes annotations the editor remapped and makes them what the session\n // renders: updates the session, feeds the renderer, and re-renders\n // annotation rows. Returns true when new annotations were adopted —\n // virtualized subclasses override this and refresh their layout on true.\n //\n // The editor delivers annotations through two calls. An edit that changes\n // the line count sends them with the structural rebuild\n // (applyDocumentChange) and again with the change event (__acceptEditorChange);\n // the identity check makes the second call a no-op. An edit that keeps the\n // line count skips the rebuild, so the event is its only path here.\n //\n // The annotations the caller passed in are never touched — stale\n // re-renders keep deduping against them.\n protected syncEditSessionAnnotationsFromEditor(\n lineAnnotations: LineAnnotation<LAnnotation>[]\n ): boolean {\n const session = this.editSession?.annotations;\n if (session == null || lineAnnotations === session.current) {\n return false;\n }\n session.current = lineAnnotations;\n this.fileRenderer.setLineAnnotations(lineAnnotations);\n this.renderAnnotations();\n return true;\n }\n\n public setSelectedLines(\n range: SelectedLineRange | null,\n options?: SelectionWriteOptions\n ): void {\n this.interactionManager.setSelection(range, options);\n }\n\n public setEditorActiveLine(\n lineNumber: number | null,\n options?: EditorActiveLineOptions\n ): void {\n this.interactionManager.setEditorActiveLine(lineNumber, {\n lineNumberOnly: options?.lineNumberOnly,\n side: options?.side ?? 'additions',\n });\n }\n\n public getCodeScrollLeft(): number {\n return this.code?.scrollLeft ?? 0;\n }\n\n public setCodeScrollLeft(position: number): void {\n if (this.code != null) {\n this.code.scrollLeft = position;\n }\n }\n\n public __getEffectiveCodeOptions(): BaseCodeOptions {\n return { ...this.options, ...this.fileRenderer.getEffectiveCodeOptions() };\n }\n\n public flushManagers(): void {\n if (!this.managersDirty || this.pre == null) {\n this.managersDirty = false;\n return;\n }\n\n const { overflow = 'scroll' } = this.options;\n this.interactionManager.setup(this.pre);\n this.resizeManager.setup(this.pre, {\n disableAnnotations: overflow === 'wrap',\n columnVariables: this.shouldApplyColumnVariables(overflow)\n ? 'apply'\n : 'measure',\n });\n this.managersDirty = false;\n }\n\n protected shouldApplyColumnVariables(overflow: 'scroll' | 'wrap'): boolean {\n return overflow === 'scroll' && this.getLatestAnnotations().length > 0;\n }\n\n public cleanUp(recycle = false): void {\n const editor = this.editor;\n this.emitPostRender(true);\n // Tear the editor down while the code scroller still exists. A recycle\n // keeps its document and undo history; a full teardown drops them as the\n // session ends.\n editor?.cleanUp(recycle ? 'recycle' : 'discard');\n if (!recycle) {\n this.editor = undefined;\n }\n this.resizeManager.cleanUp();\n this.interactionManager.cleanUp();\n this.managersDirty = false;\n this.workerManager?.unsubscribeToThemeChanges(this);\n this.renderRange = undefined;\n\n // Clean up the elements\n if (!this.isContainerManaged) {\n this.fileContainer?.remove();\n }\n this.fileContainer = undefined;\n this.mounted = false;\n if (!recycle) {\n this.lineAnnotations = [];\n }\n this.clearAuxiliaryNodes();\n this.pre = undefined;\n this.code = undefined;\n this.bufferBefore?.remove();\n this.bufferBefore = undefined;\n this.bufferAfter?.remove();\n this.bufferAfter = undefined;\n this.appliedPreAttributes = undefined;\n this.lastRowCount = undefined;\n this.headerElement = undefined;\n this.headerPrefix = undefined;\n this.headerFilenameSuffix = undefined;\n this.headerMetadata = undefined;\n this.headerCustom = undefined;\n this.lastRenderedHeaderHTML = undefined;\n if (!recycle) {\n this.cachedHeaderHTML = undefined;\n }\n this.errorWrapper?.remove();\n this.errorWrapper = undefined;\n this.spriteSVG = undefined;\n this.themeCSSStyle = undefined;\n this.appliedThemeCSS = undefined;\n this.hasAdoptedThemeCSS = false;\n this.unsafeCSSStyle = undefined;\n this.appliedUnsafeCSS = undefined;\n this.placeHolder?.remove();\n this.placeHolder = undefined;\n\n if (recycle) {\n this.fileRenderer.recycle();\n } else {\n this.fileRenderer.cleanUp();\n this.workerManager = undefined;\n this.file = undefined;\n this.editSession = undefined;\n this.renderedFile = undefined;\n }\n this.enabled = false;\n }\n\n public virtualizedSetup(): void {\n this.enabled = true;\n this.workerManager?.subscribeToThemeChanges(this);\n }\n\n public hydrate(props: FileHydrateProps<LAnnotation>): void {\n const {\n fileContainer,\n prerenderedHTML,\n preventEmit = false,\n file,\n lineAnnotations,\n } = props;\n if (!this.enabled) {\n throw new Error(\n 'File.hydrate: attempting to call hydrate after cleaned up'\n );\n }\n if (this.fileContainer != null) {\n throw new Error(\n 'File.hydrate: hydrate can only be called before the instance has rendered or hydrated'\n );\n }\n this.hydrateElements(fileContainer, prerenderedHTML);\n // An editor attached before hydration may carry a retained keyed document.\n // Render through the private edit session instead of adopting external\n // markup, so the restored document owns the first hydrated paint.\n const forceEditorRender = this.editor != null;\n if (\n forceEditorRender ||\n shouldRenderCode(this.pre, file, this.options.collapsed) ||\n shouldRenderHeader(\n this.headerElement,\n file,\n this.options.disableFileHeader\n )\n ) {\n this.render({\n ...props,\n forceRender: forceEditorRender || props.forceRender,\n preventEmit: true,\n });\n }\n // Otherwise orchestrate our setup.\n else {\n this.hydrationSetup({ file, lineAnnotations });\n }\n if (!preventEmit) {\n this.emitPostRender();\n }\n }\n\n protected hydrateElements(\n fileContainer: HTMLElement,\n prerenderedHTML: string | undefined\n ): void {\n if (this.fileContainer !== fileContainer) {\n this.emitPostRender(true);\n }\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(THEME_CSS_ATTRIBUTE)\n ) {\n this.themeCSSStyle = element;\n continue;\n }\n if (\n element instanceof HTMLStyleElement &&\n element.hasAttribute(UNSAFE_CSS_ATTRIBUTE)\n ) {\n this.unsafeCSSStyle = element;\n this.appliedUnsafeCSS = element.textContent;\n continue;\n }\n if ('diffsHeader' in element.dataset) {\n this.headerElement = element;\n this.lastRenderedHeaderHTML = undefined;\n continue;\n }\n }\n if (this.pre != null) {\n this.syncCodeNodeFromPre(this.pre);\n this.pre.removeAttribute('data-dehydrated');\n }\n this.fileContainer = fileContainer;\n this.hydrateMeasuredScrollbar();\n }\n\n protected hydrationSetup({\n file,\n lineAnnotations,\n }: HydrationSetup<LAnnotation>): void {\n this.lineAnnotations = lineAnnotations ?? this.lineAnnotations;\n this.file = file;\n this.fileRenderer.setOptions(getFileRendererOptions(this.options));\n this.syncInteractionOptions();\n if (this.pre == null) {\n return;\n }\n this.fileRenderer.hydrate(file);\n this.renderedFile = file;\n this.renderAnnotations();\n this.renderGutterUtility();\n this.injectUnsafeCSS();\n this.managersDirty = true;\n this.flushManagers();\n }\n\n public getOrCreateLineCache(\n file: FileContents | undefined = this.getLatestFile()\n ): string[] {\n return file != null\n ? this.fileRenderer.getOrCreateLineCache(file)\n : EMPTY_STRINGS;\n }\n\n protected updateBuffers(renderRange: RenderRange): void {\n if (this.pre != null) {\n this.applyBuffers(this.pre, renderRange);\n }\n }\n\n private syncRenderViewToEditor(): void {\n const { editor, fileContainer, renderRange } = this;\n const lineAnnotations = this.getLatestAnnotations();\n const file = this.getLatestFile();\n if (editor == null || fileContainer == null || file == null) {\n return;\n }\n const syncEditor = (highlighter: DiffsHighlighter): void => {\n if (\n !this.enabled ||\n this.editor !== editor ||\n this.fileContainer !== fileContainer ||\n this.getLatestFile() !== file\n ) {\n return;\n }\n editor.__syncRenderView({\n highlighter,\n fileContainer,\n file,\n lineAnnotations,\n renderRange,\n externalDocument: this.editSession?.externalReplacement === true,\n });\n };\n\n const theme = this.getTheme();\n const lang = file.lang ?? getFiletypeFromFileName(file.name);\n // Sync editor synchronously whenever the shared highlighter is ready;\n // otherwise load it and sync once it resolves.\n const highlighter = getHighlighterIfLoaded({ theme, lang });\n if (highlighter != null) {\n syncEditor(highlighter);\n } else {\n void getSharedHighlighter({\n themes: getThemes(theme),\n langs: Array.from(new Set(['text', lang])),\n preferredHighlighter:\n this.workerManager?.getPreferredHighlighter() ??\n this.options.preferredHighlighter,\n }).then(syncEditor);\n }\n }\n\n /** @internal The editor applied or edited past the pending external replacement. */\n public __acknowledgeDocumentUpdate(): void {\n if (this.editSession != null) {\n this.editSession.externalReplacement = false;\n }\n }\n\n /** @internal Settle annotations */\n public __acceptEditorChange(\n event: EditorChangeEvent<'file', LAnnotation, Caret>\n ): void {\n const { lineAnnotations } = event;\n if (lineAnnotations != null) {\n this.syncEditSessionAnnotationsFromEditor(lineAnnotations);\n }\n }\n\n public emitEditChange(\n event: EditorChangeEvent<'file', LAnnotation, Caret>\n ): void {\n const { onEditChange } = this.options;\n onEditChange?.(event);\n }\n\n /** @internal Plain files have no component-owned diff session state. */\n public __captureDocumentSessionState(): undefined {\n return undefined;\n }\n\n /** @internal Associate this component with its editor for a render lifecycle. */\n public __attachEditor(\n editor: Editor<'file', LAnnotation, Caret>\n ): () => void {\n if (this.editor != null) {\n throw new Error('File.__attachEditor: an editor is already attached');\n }\n this.editor = editor;\n const detach = () => {\n this.editor = undefined;\n this.fileRenderer.endEditSession();\n };\n try {\n this.resumeEditorRendering(editor);\n return detach;\n } catch (error) {\n detach();\n throw error;\n }\n }\n\n /** @internal Resume rendering for the editor already associated with this component. */\n public __resumeEditor(editor: Editor<'file', LAnnotation, Caret>): void {\n if (this.editor !== editor) {\n throw new Error('File.__resumeEditor: editor association changed');\n }\n this.resumeEditorRendering(editor);\n }\n\n private resumeEditorRendering(\n editor: Editor<'file', LAnnotation, Caret>\n ): void {\n // A retained session just re-starts its render; a fresh attach with a file\n // installs a session seeded from the editor's document. The editor can also\n // attach before the file arrives, there is nothing to begin yet, so the\n // session installs on the later hydrate.\n if (this.editSession != null) {\n this.fileRenderer.beginEditSession(this.editSession.file);\n } else if (this.file != null) {\n this.installEditSession(\n this.file,\n editor.__getDocumentContents(this.file)\n );\n }\n const editSessionFile = this.editSession?.file;\n if (this.fileRenderer.editorRenderReady()) {\n if (this.fileRenderer.fileCache === editSessionFile) {\n this.renderedFile = editSessionFile;\n }\n this.syncRenderViewToEditor();\n } else {\n // The current markup is missing the editor's token metadata, or its\n // highlight is still pending: render through the session, which also\n // syncs the render view once it paints.\n this.rerender();\n }\n }\n\n /**\n * @internal\n *\n * Ends the edit session and settles which file this component renders.\n * Requires the editor to be detached first. Does nothing when no session\n * exists, so callers can invoke it again safely after it has settled.\n *\n * `onEditComplete` receives the completed file, current external file, and\n * both annotation collections even when the final text is unchanged. In\n * `install` mode, accepting installs the completed file and its annotations;\n * rejecting or having no handler restores the external values. `discard`\n * mode always restores the external values. An accepted file cannot reuse\n * the replaced file's `cacheKey`.\n */\n public __completeEditSession(\n editor: Editor<'file', LAnnotation, Caret>,\n mode: 'install' | 'discard'\n ): void {\n this.settleEditSession(mode === 'install', editor);\n }\n\n private settleEditSession(\n installResult: boolean,\n editor: Editor<'file', LAnnotation, Caret> | undefined\n ): void {\n const {\n editSession,\n file: externalFile,\n lineAnnotations: externalAnnotations,\n } = this;\n if (editSession == null || externalFile == null) {\n return;\n }\n const { file: editSessionFile, annotations: editSessionAnnotations } =\n editSession;\n if (this.editor != null) {\n throw new Error(\n 'File.__completeEditSession: detach the editor before completing the session'\n );\n }\n\n const sessionAnnotationsCurrent = editSessionAnnotations?.current;\n let acceptedFile: FileContents | undefined;\n let failed = false;\n let failure: unknown;\n if (editor == null) {\n throw new Error(\n 'File.__completeEditSession: editor is required for completion'\n );\n }\n const completedFile = { ...editSessionFile };\n const event: FileEditCompleteEvent<LAnnotation, Caret> = {\n file: completedFile,\n editor,\n originalFile: externalFile,\n lineAnnotations: sessionAnnotationsCurrent,\n originalLineAnnotations: externalAnnotations,\n };\n // Frozen so a handler cannot swap the event's file/originalFile\n // references; nested mutation (a fresh cacheKey on event.file) still\n // works.\n Object.freeze(event);\n try {\n editor.__emitEditComplete(event);\n const decision = this.options.onEditComplete?.(event);\n if (decision === 'accept') {\n if (\n completedFile.cacheKey != null &&\n completedFile.cacheKey === externalFile.cacheKey\n ) {\n throw new Error(\n 'File.__completeEditSession: an accepted file must not reuse the replaced file cacheKey'\n );\n }\n acceptedFile = completedFile;\n }\n } catch (error) {\n failed = true;\n failure = error;\n }\n\n if (installResult && acceptedFile != null) {\n this.file = acceptedFile;\n if (sessionAnnotationsCurrent != null) {\n this.lineAnnotations = sessionAnnotationsCurrent;\n }\n }\n this.editSession = undefined;\n // Ending the session with the settled file lets the renderer adopt it as\n // the rendered identity when its cache already shows this content, so\n // the next render treats it as current instead of a new file.\n const { renderedFile, file: settledFile } = this;\n this.fileRenderer.endEditSession(settledFile);\n if (\n renderedFile != null &&\n settledFile != null &&\n renderedFile !== settledFile &&\n areFileTargetsEqual(renderedFile, settledFile)\n ) {\n this.renderedFile = settledFile;\n }\n if (installResult && this.fileContainer != null) {\n this.rerender();\n }\n if (failed) {\n throw failure;\n }\n }\n\n // normally triggered by the host when the document line count changes\n public applyDocumentChange(\n textDocument: TextDocument<'file', LAnnotation>,\n newLineAnnotations?: LineAnnotation<LAnnotation>[]\n ): void {\n const editSessionFile = this.editSession?.file;\n if (editSessionFile == null) {\n throw new Error(\n 'File.applyDocumentChange: requires an active edit session'\n );\n }\n this.fileRenderer.beginEditSession(editSessionFile);\n this.fileRenderer.applyDocumentChange(textDocument);\n if (newLineAnnotations != null) {\n this.syncEditSessionAnnotationsFromEditor(newLineAnnotations);\n }\n }\n\n /** Update the session source without editor DOM, then rehighlight on return. */\n public applySuspendedDocumentChange(\n textDocument: TextDocument<'file', LAnnotation>,\n newLineAnnotations?: LineAnnotation<LAnnotation>[]\n ): void {\n if (this.editSession == null) {\n return;\n }\n this.applyDocumentChange(textDocument, newLineAnnotations);\n this.fileRenderer.clearRenderCache();\n }\n\n public updateRenderCache(\n dirtyLines: Map<number, Array<HighlightedToken>>,\n themeType: 'dark' | 'light',\n options?: {\n lineCountChangeInFlight?: boolean;\n }\n ): void {\n const editSessionFile = this.editSession?.file;\n if (editSessionFile == null) {\n throw new Error(\n 'File.updateRenderCache: requires an active edit session'\n );\n }\n this.fileRenderer.beginEditSession(editSessionFile);\n this.fileRenderer.updateRenderCache(\n dirtyLines,\n themeType,\n options?.lineCountChangeInFlight\n );\n }\n\n public render({\n file,\n fileContainer,\n forceRender = false,\n preventEmit = false,\n containerWrapper,\n deferManagers = false,\n lineAnnotations,\n renderRange,\n }: FileRenderProps<LAnnotation>): boolean {\n if (!this.enabled) {\n throw new Error(\n 'File.render: attempting to call render after cleaned up'\n );\n }\n\n // postpone background tokenizing to next frame for avoiding UI freeze\n // during render\n this.editor?.__postponeBgTokenizeToNextFrame();\n\n const { collapsed = false, themeType = 'system' } = this.options;\n const nextRenderRange = collapsed ? undefined : renderRange;\n const previousRenderRange = this.renderRange;\n const themeChanged = this.hasThemeChanged();\n const annotationsChanged =\n lineAnnotations != null &&\n (lineAnnotations.length > 0 || this.getLatestAnnotations().length > 0)\n ? this.isNewAnnotations(lineAnnotations)\n : false;\n const didFileChange = !areFileTargetsEqual(this.file, file);\n if (didFileChange) {\n this.updateExternalFile(file, lineAnnotations);\n }\n const latestFile = this.getLatestFile(file) ?? file;\n if (\n !collapsed &&\n !forceRender &&\n areRenderRangesEqual(nextRenderRange, this.renderRange) &&\n !didFileChange &&\n !annotationsChanged &&\n !themeChanged\n ) {\n const rendered = this.applyCachedThemeState(themeType);\n if (rendered) {\n this.finalizeRender();\n }\n return rendered;\n }\n\n this.renderRange = nextRenderRange;\n if (didFileChange) {\n this.cachedHeaderHTML = undefined;\n }\n this.fileRenderer.setOptions(getFileRendererOptions(this.options));\n this.syncInteractionOptions();\n if (lineAnnotations != null) {\n this.setLineAnnotations(lineAnnotations);\n }\n this.fileRenderer.setLineAnnotations(this.getLatestAnnotations());\n\n const { disableErrorHandling = false, disableFileHeader = false } =\n this.options;\n if (disableFileHeader) {\n // Remove existing header from DOM\n if (this.headerElement != null) {\n this.headerElement.remove();\n this.headerElement = undefined;\n this.lastRenderedHeaderHTML = undefined;\n }\n this.clearHeaderSlots();\n }\n\n fileContainer = this.getOrCreateFileContainerNode(\n fileContainer,\n containerWrapper\n );\n this.applyCachedThemeState(themeType);\n\n if (collapsed) {\n this.removeRenderedCode();\n this.clearAuxiliaryNodes();\n\n try {\n const fileResult = this.fileRenderer.renderFile(\n latestFile,\n EMPTY_RENDER_RANGE\n );\n if (fileResult != null) {\n this.applyThemeState(\n fileContainer,\n fileResult.themeStyles,\n themeType,\n fileResult.baseThemeType\n );\n }\n if (fileResult?.headerAST != null) {\n this.applyHeaderToDOM(\n fileResult.headerAST,\n fileContainer,\n fileResult.file\n );\n }\n this.renderedFile = fileResult?.file ?? latestFile;\n this.injectUnsafeCSS();\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 this.finalizeRender();\n if (!preventEmit) {\n this.emitPostRender();\n }\n return true;\n }\n\n try {\n const pre = this.getOrCreatePreNode(fileContainer);\n if (\n !this.canPartiallyRender(\n forceRender,\n annotationsChanged,\n didFileChange ||\n themeChanged ||\n !areFileTargetsEqual(this.renderedFile, latestFile)\n ) ||\n !this.applyPartialRender(\n latestFile,\n previousRenderRange,\n nextRenderRange\n )\n ) {\n const fileResult = this.fileRenderer.renderFile(\n latestFile,\n nextRenderRange\n );\n if (fileResult == null) {\n if (\n this.workerManager?.isInitialized() === false &&\n this.workerManager.isWorkingPool()\n ) {\n void this.workerManager\n .initialize()\n .catch(() => {})\n .then(() => this.rerender());\n }\n return false;\n }\n this.applyThemeState(\n fileContainer,\n fileResult.themeStyles,\n themeType,\n fileResult.baseThemeType\n );\n if (fileResult.headerAST != null) {\n this.applyHeaderToDOM(\n fileResult.headerAST,\n fileContainer,\n fileResult.file\n );\n }\n this.applyFullRender(fileResult, pre);\n this.renderedFile = fileResult.file;\n }\n\n this.applyBuffers(pre, nextRenderRange);\n this.injectUnsafeCSS();\n this.renderAnnotations();\n this.renderGutterUtility();\n\n this.managersDirty = true;\n if (!deferManagers) {\n this.flushManagers();\n }\n\n this.finalizeRender();\n if (this.editor != null) {\n this.syncRenderViewToEditor();\n }\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 if (!preventEmit) {\n this.emitPostRender();\n }\n return true;\n }\n\n // Finish subclass layout bookkeeping before editor sync or post-render\n // callbacks can synchronously replace or dispose this component.\n protected finalizeRender(): void {}\n\n private emitPostRender(unmount = false) {\n const {\n fileContainer,\n options: { onPostRender },\n } = this;\n\n if (unmount) {\n if (!this.mounted) {\n return;\n }\n this.mounted = false;\n if (fileContainer == null) {\n return;\n }\n onPostRender?.(fileContainer, this, 'unmount');\n return;\n }\n\n if (fileContainer == null) {\n return;\n }\n\n const phase: PostRenderPhase = this.mounted ? 'update' : 'mount';\n this.mounted = true;\n onPostRender?.(fileContainer, this, phase);\n }\n\n private removeRenderedCode(): void {\n this.resizeManager.cleanUp();\n this.interactionManager.cleanUp();\n\n this.bufferBefore?.remove();\n this.bufferBefore = undefined;\n this.bufferAfter?.remove();\n this.bufferAfter = undefined;\n\n this.code?.remove();\n this.code = undefined;\n\n this.pre?.remove();\n this.pre = undefined;\n\n this.appliedPreAttributes = undefined;\n this.lastRowCount = undefined;\n }\n\n private clearAuxiliaryNodes(): void {\n for (const { element } of this.annotationCache.values()) {\n element.remove();\n }\n this.annotationCache.clear();\n\n this.gutterUtilityContent?.remove();\n this.gutterUtilityContent = undefined;\n }\n\n private canPartiallyRender(\n forceRender: boolean,\n annotationsChanged: boolean,\n didContentChange: boolean\n ): boolean {\n if (forceRender || annotationsChanged || didContentChange) {\n return false;\n }\n return true;\n }\n\n public renderPlaceholder(height: number): boolean {\n if (this.fileContainer == null) {\n return false;\n }\n this.emitPostRender(true);\n this.cleanChildNodes();\n\n if (this.placeHolder == null) {\n const shadowRoot =\n this.fileContainer.shadowRoot ??\n this.fileContainer.attachShadow({ mode: 'open' });\n this.placeHolder = document.createElement('div');\n this.placeHolder.dataset.placeholder = '';\n shadowRoot.appendChild(this.placeHolder);\n }\n return this.setPlaceholderHeight(height);\n }\n\n protected setPlaceholderHeight(height: number): boolean {\n if (this.placeHolder == null) {\n return false;\n }\n this.placeHolder.style.setProperty('height', `${height}px`);\n return true;\n }\n\n public async primeHighlightCache(\n file: FileContents | undefined = this.file\n ): Promise<void> {\n const { workerManager } = this;\n if (\n file == null ||\n workerManager == null ||\n !workerManager.isWorkingPool() ||\n file.cacheKey == null ||\n isFilePlainText(file)\n ) {\n return;\n }\n const tokenizeMaxLength =\n this.options.tokenizeMaxLength ?? DEFAULT_TOKENIZE_MAX_LENGTH;\n const lines = this.fileRenderer.getOrCreateLineCache(file);\n if (lines.length > tokenizeMaxLength) {\n return;\n }\n\n await workerManager\n .primeFileHighlightCache(file)\n .catch((error: unknown) => {\n if (isHandledWorkerPoolError(error)) {\n return;\n }\n console.error(error);\n });\n }\n\n private cleanChildNodes() {\n this.resizeManager.cleanUp();\n this.interactionManager.cleanUp();\n this.clearAuxiliaryNodes();\n\n this.bufferAfter?.remove();\n this.bufferBefore?.remove();\n this.code?.remove();\n this.errorWrapper?.remove();\n this.headerElement?.remove();\n this.headerPrefix?.remove();\n this.headerFilenameSuffix?.remove();\n this.headerMetadata?.remove();\n this.headerCustom?.remove();\n this.pre?.remove();\n this.spriteSVG?.remove();\n this.themeCSSStyle?.remove();\n this.unsafeCSSStyle?.remove();\n\n this.bufferAfter = undefined;\n this.bufferBefore = undefined;\n this.code = undefined;\n this.errorWrapper = undefined;\n this.headerElement = undefined;\n this.headerPrefix = undefined;\n this.headerFilenameSuffix = undefined;\n this.headerMetadata = undefined;\n this.headerCustom = undefined;\n this.pre = undefined;\n this.spriteSVG = undefined;\n this.themeCSSStyle = undefined;\n this.appliedThemeCSS = undefined;\n this.hasAdoptedThemeCSS = false;\n this.unsafeCSSStyle = undefined;\n this.appliedUnsafeCSS = undefined;\n\n this.lastRenderedHeaderHTML = undefined;\n this.lastRowCount = undefined;\n\n this.mounted = false;\n }\n\n private renderAnnotations(): void {\n if (this.isContainerManaged || this.fileContainer == null) {\n for (const { element } of this.annotationCache.values()) {\n element.remove();\n }\n this.annotationCache.clear();\n return;\n }\n const staleAnnotations = new Map(this.annotationCache);\n const { renderAnnotation } = this.options;\n const lineAnnotations = this.getLatestAnnotations();\n if (renderAnnotation != null && lineAnnotations.length > 0) {\n for (const [index, annotation] of lineAnnotations.entries()) {\n const name = this.getAnnotationSlotName(annotation);\n const id = `${index}-${name}`;\n let cache = this.annotationCache.get(id);\n if (\n cache == null ||\n !areLineAnnotationsEqual(annotation, cache.annotation)\n ) {\n cache?.element.remove();\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(name),\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.remove();\n }\n }\n\n private renderGutterUtility() {\n const { renderGutterUtility } = this.options;\n if (this.fileContainer == null || renderGutterUtility == null) {\n this.gutterUtilityContent?.remove();\n this.gutterUtilityContent = undefined;\n return;\n }\n const element = renderGutterUtility(this.interactionManager.getHoveredLine);\n if (element != null && this.gutterUtilityContent != null) {\n return;\n } else if (element == null) {\n this.gutterUtilityContent?.remove();\n this.gutterUtilityContent = undefined;\n return;\n }\n const gutterUtilityContent = createGutterUtilityContentNode();\n gutterUtilityContent.appendChild(element);\n this.fileContainer.appendChild(gutterUtilityContent);\n this.gutterUtilityContent = gutterUtilityContent;\n }\n\n private injectUnsafeCSS(): void {\n const { unsafeCSS } = this.options;\n const shadowRoot = this.fileContainer?.shadowRoot;\n if (shadowRoot == null) {\n return;\n }\n\n if (unsafeCSS == null || unsafeCSS === '') {\n if (this.unsafeCSSStyle != null) {\n this.unsafeCSSStyle.remove();\n this.unsafeCSSStyle = undefined;\n }\n this.appliedUnsafeCSS = undefined;\n return;\n }\n\n if (\n this.unsafeCSSStyle?.parentNode === shadowRoot &&\n this.appliedUnsafeCSS === unsafeCSS\n ) {\n return;\n }\n\n // Create or update the style element\n this.unsafeCSSStyle ??= createUnsafeCSSStyleNode();\n if (this.unsafeCSSStyle.parentNode !== shadowRoot) {\n shadowRoot.appendChild(this.unsafeCSSStyle);\n }\n // Wrap in @layer unsafe to match SSR behavior\n this.unsafeCSSStyle.textContent = wrapUnsafeCSS(unsafeCSS);\n this.appliedUnsafeCSS = unsafeCSS;\n }\n\n private applyThemeState(\n container: HTMLElement,\n themeStyles: string,\n themeType: ThemeTypes,\n baseThemeType?: 'light' | 'dark'\n ): void {\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n const effectiveThemeType = baseThemeType ?? themeType;\n const currentTheme = this.getTheme();\n const theme =\n typeof currentTheme === 'string' ? currentTheme : { ...currentTheme };\n const scrollbarGutter = getMeasuredScrollbarGutter(shadowRoot);\n if (\n this.themeCSSStyle?.parentNode === shadowRoot &&\n this.appliedThemeCSS?.themeStyles === themeStyles &&\n this.appliedThemeCSS.themeType === effectiveThemeType &&\n this.appliedThemeCSS.scrollbarGutter === scrollbarGutter\n ) {\n this.appliedThemeCSS.theme = theme;\n return;\n }\n if (\n this.hasAdoptedThemeCSS &&\n this.themeCSSStyle?.parentNode === shadowRoot\n ) {\n this.hasAdoptedThemeCSS = false;\n this.appliedThemeCSS = {\n theme,\n themeStyles,\n themeType: effectiveThemeType,\n baseThemeType,\n scrollbarGutter,\n };\n return;\n }\n this.themeCSSStyle = upsertHostThemeStyle({\n shadowRoot,\n currentNode: this.themeCSSStyle,\n themeCSS: wrapThemeCSS(themeStyles, effectiveThemeType, scrollbarGutter),\n });\n this.appliedThemeCSS =\n this.themeCSSStyle != null\n ? {\n theme,\n themeStyles,\n themeType: effectiveThemeType,\n baseThemeType,\n scrollbarGutter,\n }\n : undefined;\n }\n\n private hydrateMeasuredScrollbar(): void {\n const shadowRoot = this.fileContainer?.shadowRoot;\n if (shadowRoot == null || this.themeCSSStyle == null) {\n return;\n }\n this.themeCSSStyle.textContent = patchScrollbarGutterSize(\n this.themeCSSStyle.textContent ?? '',\n getMeasuredScrollbarGutter(shadowRoot)\n );\n }\n\n // A boolean check to ensure that edit mode in WebKit doesn't cause potential\n // scroll jumps to due bugs with WebKit. The workarounds have performance\n // implications so we avoid running the workarounds on browsers or scenarios\n // where they are not applicable\n protected shouldGuardRebuildScroll(): boolean {\n return this.editor != null && isSafari();\n }\n\n private applyFullRender(result: FileRenderResult, pre: HTMLPreElement): void {\n this.cleanupErrorWrapper();\n this.applyPreNodeAttributes(pre, result);\n const code = (this.code = getOrCreateCodeNode({ code: this.code }));\n const codeAst = this.fileRenderer.renderCodeAST(result);\n this.editor?.__captureFocusForDOMReplacement();\n const applyColumns = () => {\n if (code.childElementCount >= 2) {\n for (let i = 0; i < 2; i++) {\n const domEl = code.children[i] as HTMLElement;\n const astEl = codeAst[i] as HASTElement;\n domEl.innerHTML = toHtml(astEl.children);\n domEl.style.cssText = astEl.properties.style as string;\n }\n } else {\n code.innerHTML = toHtml(codeAst);\n }\n if (!pre.contains(code)) {\n pre.replaceChildren(code);\n }\n };\n if (this.shouldGuardRebuildScroll()) {\n guardWebKitScrollDuringRebuild(pre, applyColumns);\n } else {\n applyColumns();\n }\n this.lastRowCount = result.rowCount;\n }\n\n private applyPartialRender(\n file: FileContents,\n previousRenderRange: RenderRange | undefined,\n renderRange: RenderRange | undefined\n ): boolean {\n if (previousRenderRange == null || renderRange == null) {\n return false;\n }\n const { code } = this;\n const columns = code != null ? this.getColumns(code) : undefined;\n if (code == null || columns == null) {\n return false;\n }\n\n const previousStart = previousRenderRange.startingLine;\n const nextStart = renderRange.startingLine;\n const previousEnd =\n previousRenderRange.totalLines === Infinity\n ? Number.POSITIVE_INFINITY\n : previousStart + previousRenderRange.totalLines;\n const nextEnd =\n renderRange.totalLines === Infinity\n ? Number.POSITIVE_INFINITY\n : nextStart + renderRange.totalLines;\n\n const overlapStart = Math.max(previousStart, nextStart);\n const overlapEnd = Math.min(previousEnd, nextEnd);\n if (overlapEnd <= overlapStart) {\n return false;\n }\n\n if (\n !this.trimDOMToOverlap(columns.gutter, overlapStart, overlapEnd) ||\n !this.trimDOMToOverlap(columns.content, overlapStart, overlapEnd)\n ) {\n throw new Error('File.applyPartialRender: failed to trim to overlap');\n }\n\n let { length: rowCount } = columns.content.children;\n\n const renderChunk = (\n startingLine: number,\n totalLines: number\n ): FileRenderResult | undefined => {\n if (totalLines <= 0) {\n return undefined;\n }\n return this.fileRenderer.renderFile(file, {\n startingLine,\n totalLines,\n bufferBefore: 0,\n bufferAfter: 0,\n });\n };\n\n const prependResult =\n nextStart < overlapStart\n ? renderChunk(nextStart, overlapStart - nextStart)\n : undefined;\n if (prependResult === undefined && nextStart < overlapStart) {\n return false;\n }\n\n const appendTotalLines =\n nextEnd === Number.POSITIVE_INFINITY\n ? Number.POSITIVE_INFINITY\n : Math.max(0, nextEnd - overlapEnd);\n const appendResult =\n nextEnd > overlapEnd\n ? renderChunk(overlapEnd, appendTotalLines)\n : undefined;\n if (appendResult === undefined && nextEnd > overlapEnd) {\n return false;\n }\n\n this.cleanupErrorWrapper();\n if (prependResult != null) {\n columns.gutter.insertAdjacentHTML(\n 'afterbegin',\n this.fileRenderer.renderPartialHTML(prependResult.gutterAST)\n );\n columns.content.insertAdjacentHTML(\n 'afterbegin',\n this.fileRenderer.renderPartialHTML(prependResult.contentAST)\n );\n rowCount += prependResult.rowCount;\n }\n\n if (appendResult != null) {\n columns.gutter.insertAdjacentHTML(\n 'beforeend',\n this.fileRenderer.renderPartialHTML(appendResult.gutterAST)\n );\n columns.content.insertAdjacentHTML(\n 'beforeend',\n this.fileRenderer.renderPartialHTML(appendResult.contentAST)\n );\n rowCount += appendResult.rowCount;\n }\n\n if (this.lastRowCount !== rowCount) {\n columns.gutter.style.setProperty('grid-row', `span ${rowCount}`);\n columns.content.style.setProperty('grid-row', `span ${rowCount}`);\n this.lastRowCount = rowCount;\n }\n\n return true;\n }\n\n private getColumns(code: HTMLElement): ColumnElements | undefined {\n const gutter = code.children[0];\n const content = code.children[1];\n if (\n !(gutter instanceof HTMLElement) ||\n !(content instanceof HTMLElement) ||\n gutter.dataset.gutter == null ||\n content.dataset.content == null\n ) {\n return undefined;\n }\n return { gutter, content };\n }\n\n private trimDOMToOverlap(\n container: HTMLElement,\n overlapStart: number,\n overlapEnd: number\n ): boolean {\n const boundaryIndices = this.getDOMBoundaryIndices(container, [\n overlapStart,\n overlapEnd,\n ]);\n const startIndex =\n boundaryIndices.get(overlapStart) ?? container.children.length;\n const endIndex =\n boundaryIndices.get(overlapEnd) ?? container.children.length;\n\n if (startIndex > endIndex) {\n return false;\n }\n\n for (let i = container.children.length - 1; i >= endIndex; i -= 1) {\n container.children[i]?.remove();\n }\n for (let i = startIndex - 1; i >= 0; i -= 1) {\n container.children[i]?.remove();\n }\n return true;\n }\n\n private getDOMBoundaryIndices(\n container: HTMLElement,\n boundaries: number[]\n ): Map<number, number> {\n const sortedBoundaries = [...new Set(boundaries)].sort((a, b) => a - b);\n const boundaryIndices = new Map<number, number>();\n if (sortedBoundaries.length === 0) {\n return boundaryIndices;\n }\n let boundaryIndex = 0;\n let nextBoundary = sortedBoundaries[boundaryIndex];\n const { children } = container;\n\n if (nextBoundary === 0) {\n boundaryIndices.set(0, 0);\n boundaryIndex += 1;\n nextBoundary = sortedBoundaries[boundaryIndex];\n }\n\n for (let i = 0; i < children.length; i += 1) {\n const child = children[i];\n if (!(child instanceof HTMLElement)) {\n continue;\n }\n const lineIndex = this.getLineIndexFromDOMNode(child);\n if (lineIndex == null) {\n continue;\n }\n while (nextBoundary != null && lineIndex >= nextBoundary) {\n boundaryIndices.set(nextBoundary, i);\n boundaryIndex += 1;\n nextBoundary = sortedBoundaries[boundaryIndex];\n }\n if (boundaryIndex >= sortedBoundaries.length) {\n break;\n }\n }\n\n for (const boundary of sortedBoundaries) {\n if (!boundaryIndices.has(boundary)) {\n boundaryIndices.set(boundary, children.length);\n }\n }\n return boundaryIndices;\n }\n\n private getLineIndexFromDOMNode(node: HTMLElement): number | undefined {\n const lineIndexAttr = node.dataset.lineIndex;\n if (lineIndexAttr == null) {\n return undefined;\n }\n const parsed = Number(lineIndexAttr);\n return Number.isNaN(parsed) ? undefined : parsed;\n }\n\n private applyBuffers(\n pre: HTMLPreElement,\n renderRange: RenderRange | undefined\n ) {\n if (renderRange == null || this.shouldDisableVirtualizationBuffers()) {\n if (this.bufferBefore != null) {\n this.bufferBefore.remove();\n this.bufferBefore = undefined;\n }\n if (this.bufferAfter != null) {\n this.bufferAfter.remove();\n this.bufferAfter = undefined;\n }\n return;\n }\n\n if (renderRange.bufferBefore > 0) {\n if (this.bufferBefore == null) {\n this.bufferBefore = document.createElement('div');\n this.bufferBefore.dataset.virtualizerBuffer = 'before';\n pre.before(this.bufferBefore);\n }\n this.bufferBefore.style.setProperty(\n 'height',\n `${renderRange.bufferBefore}px`\n );\n this.bufferBefore.style.setProperty('contain', 'strict');\n } else if (this.bufferBefore != null) {\n this.bufferBefore.remove();\n this.bufferBefore = undefined;\n }\n\n if (renderRange.bufferAfter > 0) {\n if (this.bufferAfter == null) {\n this.bufferAfter = document.createElement('div');\n this.bufferAfter.dataset.virtualizerBuffer = 'after';\n pre.after(this.bufferAfter);\n }\n this.bufferAfter.style.setProperty(\n 'height',\n `${renderRange.bufferAfter}px`\n );\n this.bufferAfter.style.setProperty('contain', 'strict');\n } else if (this.bufferAfter != null) {\n this.bufferAfter.remove();\n this.bufferAfter = undefined;\n }\n }\n\n protected shouldDisableVirtualizationBuffers(): boolean {\n return this.options.disableVirtualizationBuffers ?? false;\n }\n\n private applyHeaderToDOM(\n headerAST: HASTElement,\n container: HTMLElement,\n file: FileContents\n ): void {\n this.cleanupErrorWrapper();\n this.placeHolder?.remove();\n this.placeHolder = undefined;\n const headerHTML = this.cachedHeaderHTML ?? toHtml(headerAST);\n this.cachedHeaderHTML = headerHTML;\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 {\n renderHeaderPrefix,\n renderHeaderFilenameSuffix,\n renderCustomHeader,\n renderHeaderMetadata,\n } = this.options;\n\n if (renderCustomHeader != null) {\n const content = renderCustomHeader(file) ?? undefined;\n this.headerCustom = this.upsertHeaderSlotElement(\n container,\n this.headerCustom,\n CUSTOM_HEADER_SLOT_ID,\n content\n );\n this.headerPrefix?.remove();\n this.headerFilenameSuffix?.remove();\n this.headerMetadata?.remove();\n this.headerPrefix = undefined;\n this.headerFilenameSuffix = undefined;\n this.headerMetadata = undefined;\n } else {\n const prefix = renderHeaderPrefix?.(file) ?? undefined;\n const suffix = renderHeaderFilenameSuffix?.(file) ?? undefined;\n const content = renderHeaderMetadata?.(file) ?? undefined;\n this.headerPrefix = this.upsertHeaderSlotElement(\n container,\n this.headerPrefix,\n HEADER_PREFIX_SLOT_ID,\n prefix\n );\n this.headerFilenameSuffix = this.upsertHeaderSlotElement(\n container,\n this.headerFilenameSuffix,\n HEADER_FILENAME_SUFFIX_SLOT_ID,\n suffix\n );\n this.headerMetadata = this.upsertHeaderSlotElement(\n container,\n this.headerMetadata,\n HEADER_METADATA_SLOT_ID,\n content\n );\n this.headerCustom?.remove();\n this.headerCustom = undefined;\n }\n }\n\n private clearHeaderSlots(): void {\n this.headerPrefix?.remove();\n this.headerFilenameSuffix?.remove();\n this.headerMetadata?.remove();\n this.headerCustom?.remove();\n this.headerPrefix = undefined;\n this.headerFilenameSuffix = undefined;\n this.headerMetadata = undefined;\n this.headerCustom = undefined;\n }\n\n // Header slot callbacks are presence-based render hooks, not reactive views.\n private upsertHeaderSlotElement(\n container: HTMLElement,\n current: HTMLElement | undefined,\n slot: string,\n content: Element | string | number | undefined\n ): HTMLElement | undefined {\n if (content == null) {\n current?.remove();\n return undefined;\n }\n const element = current ?? this.createHeaderSlotElement(slot);\n if (current == null) {\n container.appendChild(element);\n }\n this.replaceHeaderSlotContent(element, content);\n return element;\n }\n\n private replaceHeaderSlotContent(\n element: HTMLElement,\n content: Element | string | number\n ): void {\n element.replaceChildren();\n if (content instanceof Element) {\n element.appendChild(content);\n } else {\n element.innerText = `${content}`;\n }\n }\n\n private createHeaderSlotElement(slot: string): HTMLElement {\n const element = document.createElement('div');\n element.slot = slot;\n return element;\n }\n\n protected getOrCreateFileContainerNode(\n fileContainer?: HTMLElement,\n parentNode?: HTMLElement\n ): HTMLElement {\n const { fileContainer: previousContainer } = this;\n const nextContainer =\n fileContainer ??\n previousContainer ??\n document.createElement(DIFFS_TAG_NAME);\n const containerChanged = previousContainer !== nextContainer;\n if (previousContainer != null && containerChanged) {\n this.editor?.__captureFocusForDOMReplacement();\n }\n if (containerChanged) {\n this.emitPostRender(true);\n }\n this.fileContainer = nextContainer;\n if (previousContainer != null && containerChanged) {\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 (containerChanged) {\n this.adoptReusableShellElements(this.fileContainer);\n }\n this.ensureSpriteSVG(this.fileContainer);\n return this.fileContainer;\n }\n\n // NOTE(amadeus): Technically this method is not safe for use outside of\n // the CodeView component, however I don't think in practice it really\n // should matter, but maybe there's some system we need in place to prevent\n // this from running outside of that environment?\n //\n // It's making very specific assumptions that all the elements will have the\n // correct content based on CodeView global options\n private adoptReusableShellElements(fileContainer: HTMLElement): void {\n const { shadowRoot } = fileContainer;\n if (shadowRoot == null) {\n return;\n }\n\n for (const element of shadowRoot.children) {\n if (element instanceof SVGElement) {\n this.spriteSVG ??= element;\n } else if (\n isStyleNode(element) &&\n element.hasAttribute(THEME_CSS_ATTRIBUTE)\n ) {\n this.themeCSSStyle ??= element;\n this.hasAdoptedThemeCSS = true;\n } else if (\n isStyleNode(element) &&\n element.hasAttribute(UNSAFE_CSS_ATTRIBUTE)\n ) {\n this.unsafeCSSStyle ??= element;\n this.appliedUnsafeCSS ??= this.options.unsafeCSS ?? undefined;\n }\n }\n }\n\n private ensureSpriteSVG(fileContainer: HTMLElement): void {\n const shadowRoot =\n fileContainer.shadowRoot ?? fileContainer.attachShadow({ mode: 'open' });\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 }\n }\n if (this.spriteSVG != null && this.spriteSVG.parentNode !== shadowRoot) {\n shadowRoot.appendChild(this.spriteSVG);\n }\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.code = 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 this.editor?.__captureFocusForDOMReplacement();\n container.shadowRoot?.appendChild(this.pre);\n this.appliedPreAttributes = undefined;\n }\n\n this.placeHolder?.remove();\n this.placeHolder = undefined;\n\n return this.pre;\n }\n\n private syncCodeNodeFromPre(pre: HTMLPreElement): void {\n this.code = undefined;\n for (const child of Array.from(pre.children)) {\n if (!(child instanceof HTMLElement)) {\n continue;\n }\n if (child.hasAttribute('data-code')) {\n this.code = child;\n return;\n }\n }\n }\n\n private applyPreNodeAttributes(\n pre: HTMLPreElement,\n { totalLines }: FileRenderResult\n ): void {\n const { overflow = 'scroll', disableLineNumbers = false } = this.options;\n const preProperties: PrePropertiesConfig = {\n type: 'file',\n split: false,\n overflow,\n disableLineNumbers,\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 this.pre?.remove();\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.textContent = '';\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?.remove();\n this.errorWrapper = undefined;\n }\n}\n\nfunction shouldRenderCode(\n pre: HTMLPreElement | undefined,\n file: FileContents | undefined,\n collapsed = false\n): boolean {\n return !collapsed && pre == null && file != null;\n}\n\nfunction shouldRenderHeader(\n headerElement: HTMLElement | undefined,\n file: FileContents | undefined,\n disableFileHeader: boolean = false\n): boolean {\n return headerElement == null && file != null && !disableFileHeader;\n}\n"],"mappings":"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"}
@@ -12,6 +12,12 @@ import { Editor } from "../editor/editor.js";
12
12
  type LoadedPartialDiffContents = Awaited<ReturnType<NonNullable<BaseDiffOptions['loadDiffFiles']>>>;
13
13
  type DeferredSelectedLinesWrite = [range: SelectedLineRange | null, options: SelectionWriteOptions | undefined];
14
14
  type DeferredEditorActiveLineWrite = [lineNumber: number | null, options: EditorActiveLineOptions | undefined];
15
+ interface UpdateRenderCacheOptions {
16
+ shouldRefreshDiffsView?: boolean;
17
+ lineCountChangeInFlight?: boolean;
18
+ changedDocumentLines?: ReadonlyMap<number, string>;
19
+ documentLineCount?: number;
20
+ }
15
21
  interface FileDiffRenderBaseProps<LAnnotation> {
16
22
  fileDiff?: FileDiffMetadata;
17
23
  deferManagers?: boolean;
@@ -264,10 +270,7 @@ declare class FileDiff<LAnnotation = undefined, Caret = undefined> {
264
270
  applyDocumentChange(textDocument: TextDocument<'file-diff', LAnnotation>, newLineAnnotations?: DiffLineAnnotation<LAnnotation>[]): void;
265
271
  /** Update the private diff without editor DOM, then rehighlight on return. */
266
272
  applySuspendedDocumentChange(textDocument: TextDocument<'file-diff', LAnnotation>, newLineAnnotations?: DiffLineAnnotation<LAnnotation>[]): void;
267
- updateRenderCache(dirtyLines: Map<number, Array<HighlightedToken>>, themeType: 'dark' | 'light', options?: {
268
- shouldRefreshDiffsView?: boolean;
269
- lineCountChangeInFlight?: boolean;
270
- }): void;
273
+ updateRenderCache(dirtyLines: Map<number, Array<HighlightedToken>>, themeType: 'dark' | 'light', options?: UpdateRenderCacheOptions): void;
271
274
  private detachAdditionLines;
272
275
  isLineRenderable(lineNumber: number): boolean;
273
276
  getNearestRenderableLine(lineNumber: number, direction: 'up' | 'down'): number | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"FileDiff.d.ts","names":[],"sources":["../../src/components/FileDiff.ts"],"mappings":"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"}
1
+ {"version":3,"file":"FileDiff.d.ts","names":[],"sources":["../../src/components/FileDiff.ts"],"mappings":"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"}
@@ -4,6 +4,7 @@ import { getHighlighterIfLoaded, getSharedHighlighter } from "../highlighter/sha
4
4
  import { dequeueRender, queueRender } from "../managers/UniversalRenderingManager.js";
5
5
  import { areThemesEqual } from "../utils/areThemesEqual.js";
6
6
  import { isStyleNode } from "../utils/isStyleNode.js";
7
+ import { isSafari } from "../utils/platform.js";
7
8
  import { InteractionManager, pluckInteractionOptions } from "../managers/InteractionManager.js";
8
9
  import { ResizeManager } from "../managers/ResizeManager.js";
9
10
  import { areRenderRangesEqual } from "../utils/areRenderRangesEqual.js";
@@ -21,9 +22,9 @@ import { adoptEditSessionAnnotations, resolveEditSessionSlotName, writeEditSessi
21
22
  import { getOrCreateCodeNode } from "../utils/getOrCreateCodeNode.js";
22
23
  import { guardWebKitScrollDuringRebuild } from "../utils/guardWebKitScrollDuringRebuild.js";
23
24
  import { upsertHostThemeStyle } from "../utils/hostTheme.js";
24
- import { isSafari } from "../utils/platform.js";
25
25
  import { prerenderHTMLIfNecessary } from "../utils/prerenderHTMLIfNecessary.js";
26
26
  import { setPreNodeProperties } from "../utils/setWrapperNodeProps.js";
27
+ import { isHandledWorkerPoolError } from "../worker/errors.js";
27
28
  import "./web-components.js";
28
29
  import { areDiffTargetsEqual } from "../utils/areDiffTargetsEqual.js";
29
30
  import { areFilesEqual } from "../utils/areFilesEqual.js";
@@ -1027,7 +1028,7 @@ var FileDiff = class {
1027
1028
  this.detachAdditionLines();
1028
1029
  this.hunksRenderer.beginEditSession(editSessionDiff);
1029
1030
  const { shouldRefreshDiffsView, lineCountChangeInFlight } = options;
1030
- if (this.hunksRenderer.updateRenderCache(dirtyLines, themeType, lineCountChangeInFlight)) {
1031
+ if (this.hunksRenderer.updateRenderCache(dirtyLines, themeType, lineCountChangeInFlight, options.changedDocumentLines, options.documentLineCount)) {
1031
1032
  if (this.refreshViewTimeout != null) {
1032
1033
  clearTimeout(this.refreshViewTimeout);
1033
1034
  this.refreshViewTimeout = void 0;
@@ -1174,6 +1175,7 @@ var FileDiff = class {
1174
1175
  const tokenizeMaxLength = this.options.tokenizeMaxLength ?? 1e5;
1175
1176
  if (Math.max(fileDiff.additionLines.length, fileDiff.deletionLines.length) > tokenizeMaxLength) return;
1176
1177
  await workerManager.primeDiffHighlightCache(fileDiff).catch((error) => {
1178
+ if (isHandledWorkerPoolError(error)) return;
1177
1179
  console.error(error);
1178
1180
  });
1179
1181
  }