@pierre/diffs 1.0.6 → 1.1.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/dist/components/File.d.ts +4 -2
  2. package/dist/components/File.d.ts.map +1 -1
  3. package/dist/components/File.js +80 -34
  4. package/dist/components/File.js.map +1 -1
  5. package/dist/components/FileDiff.d.ts +50 -28
  6. package/dist/components/FileDiff.d.ts.map +1 -1
  7. package/dist/components/FileDiff.js +222 -80
  8. package/dist/components/FileDiff.js.map +1 -1
  9. package/dist/components/FileStream.d.ts +1 -0
  10. package/dist/components/FileStream.d.ts.map +1 -1
  11. package/dist/components/FileStream.js +10 -6
  12. package/dist/components/FileStream.js.map +1 -1
  13. package/dist/components/web-components.d.ts.map +1 -1
  14. package/dist/components/web-components.js +1 -1
  15. package/dist/components/web-components.js.map +1 -1
  16. package/dist/constants.d.ts +8 -2
  17. package/dist/constants.d.ts.map +1 -1
  18. package/dist/constants.js +10 -1
  19. package/dist/constants.js.map +1 -1
  20. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts +1 -1
  21. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts.map +1 -1
  22. package/dist/highlighter/languages/getResolvedOrResolveLanguage.js.map +1 -1
  23. package/dist/highlighter/languages/resolveLanguage.d.ts +1 -1
  24. package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -1
  25. package/dist/highlighter/languages/resolveLanguage.js.map +1 -1
  26. package/dist/highlighter/languages/resolveLanguages.js +1 -1
  27. package/dist/highlighter/languages/resolveLanguages.js.map +1 -1
  28. package/dist/highlighter/shared_highlighter.js +1 -1
  29. package/dist/highlighter/shared_highlighter.js.map +1 -1
  30. package/dist/highlighter/themes/registerCustomCSSVariableTheme.js +1 -1
  31. package/dist/highlighter/themes/registerCustomCSSVariableTheme.js.map +1 -1
  32. package/dist/index.d.ts +19 -10
  33. package/dist/index.js +14 -5
  34. package/dist/managers/LineSelectionManager.d.ts.map +1 -1
  35. package/dist/managers/LineSelectionManager.js +8 -9
  36. package/dist/managers/LineSelectionManager.js.map +1 -1
  37. package/dist/managers/ScrollSyncManager.d.ts +1 -0
  38. package/dist/managers/ScrollSyncManager.d.ts.map +1 -1
  39. package/dist/managers/ScrollSyncManager.js +14 -6
  40. package/dist/managers/ScrollSyncManager.js.map +1 -1
  41. package/dist/react/MultiFileDiff.js +2 -2
  42. package/dist/react/MultiFileDiff.js.map +1 -1
  43. package/dist/react/index.d.ts +2 -2
  44. package/dist/react/utils/renderDiffChildren.d.ts +4 -4
  45. package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
  46. package/dist/react/utils/renderDiffChildren.js +3 -3
  47. package/dist/react/utils/renderDiffChildren.js.map +1 -1
  48. package/dist/react/utils/useFileDiffInstance.js.map +1 -1
  49. package/dist/renderers/DiffHunksRenderer.d.ts +7 -6
  50. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  51. package/dist/renderers/DiffHunksRenderer.js +263 -337
  52. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  53. package/dist/renderers/FileRenderer.d.ts +1 -0
  54. package/dist/renderers/FileRenderer.d.ts.map +1 -1
  55. package/dist/renderers/FileRenderer.js +11 -4
  56. package/dist/renderers/FileRenderer.js.map +1 -1
  57. package/dist/ssr/index.d.ts +2 -2
  58. package/dist/style.js +1 -1
  59. package/dist/style.js.map +1 -1
  60. package/dist/types.d.ts +247 -43
  61. package/dist/types.d.ts.map +1 -1
  62. package/dist/utils/areDiffLineAnnotationsEqual.d.ts +7 -0
  63. package/dist/utils/areDiffLineAnnotationsEqual.d.ts.map +1 -0
  64. package/dist/utils/areDiffLineAnnotationsEqual.js +8 -0
  65. package/dist/utils/areDiffLineAnnotationsEqual.js.map +1 -0
  66. package/dist/utils/areHunkDataEqual.d.ts +7 -0
  67. package/dist/utils/areHunkDataEqual.d.ts.map +1 -0
  68. package/dist/utils/areHunkDataEqual.js +8 -0
  69. package/dist/utils/areHunkDataEqual.js.map +1 -0
  70. package/dist/utils/areLineAnnotationsEqual.d.ts +7 -0
  71. package/dist/utils/areLineAnnotationsEqual.d.ts.map +1 -0
  72. package/dist/utils/areLineAnnotationsEqual.js +8 -0
  73. package/dist/utils/areLineAnnotationsEqual.js.map +1 -0
  74. package/dist/utils/arePrePropertiesEqual.d.ts +7 -0
  75. package/dist/utils/arePrePropertiesEqual.d.ts.map +1 -0
  76. package/dist/utils/arePrePropertiesEqual.js +9 -0
  77. package/dist/utils/arePrePropertiesEqual.js.map +1 -0
  78. package/dist/utils/areRenderRangesEqual.d.ts +7 -0
  79. package/dist/utils/areRenderRangesEqual.d.ts.map +1 -0
  80. package/dist/utils/areRenderRangesEqual.js +9 -0
  81. package/dist/utils/areRenderRangesEqual.js.map +1 -0
  82. package/dist/utils/areVirtualWindowSpecsEqual.d.ts +7 -0
  83. package/dist/utils/areVirtualWindowSpecsEqual.d.ts.map +1 -0
  84. package/dist/utils/areVirtualWindowSpecsEqual.js +9 -0
  85. package/dist/utils/areVirtualWindowSpecsEqual.js.map +1 -0
  86. package/dist/utils/areWorkerStatsEqual.d.ts +8 -0
  87. package/dist/utils/areWorkerStatsEqual.d.ts.map +1 -0
  88. package/dist/utils/areWorkerStatsEqual.js +9 -0
  89. package/dist/utils/areWorkerStatsEqual.js.map +1 -0
  90. package/dist/utils/createTransformerWithState.js +1 -1
  91. package/dist/utils/createTransformerWithState.js.map +1 -1
  92. package/dist/utils/createWindowFromScrollPosition.d.ts +22 -0
  93. package/dist/utils/createWindowFromScrollPosition.d.ts.map +1 -0
  94. package/dist/utils/createWindowFromScrollPosition.js +26 -0
  95. package/dist/utils/createWindowFromScrollPosition.js.map +1 -0
  96. package/dist/utils/diffAcceptRejectHunk.js +36 -21
  97. package/dist/utils/diffAcceptRejectHunk.js.map +1 -1
  98. package/dist/utils/formatCSSVariablePrefix.d.ts +1 -1
  99. package/dist/utils/formatCSSVariablePrefix.js +2 -2
  100. package/dist/utils/formatCSSVariablePrefix.js.map +1 -1
  101. package/dist/utils/getHighlighterThemeStyles.js +12 -12
  102. package/dist/utils/getHighlighterThemeStyles.js.map +1 -1
  103. package/dist/utils/getOrCreateCodeNode.d.ts +14 -0
  104. package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -0
  105. package/dist/utils/getOrCreateCodeNode.js +13 -0
  106. package/dist/utils/getOrCreateCodeNode.js.map +1 -0
  107. package/dist/utils/getTotalLineCountFromHunks.js +1 -1
  108. package/dist/utils/getTotalLineCountFromHunks.js.map +1 -1
  109. package/dist/utils/hast_utils.d.ts +2 -1
  110. package/dist/utils/hast_utils.d.ts.map +1 -1
  111. package/dist/utils/hast_utils.js +10 -1
  112. package/dist/utils/hast_utils.js.map +1 -1
  113. package/dist/utils/isDefaultRenderRange.d.ts +7 -0
  114. package/dist/utils/isDefaultRenderRange.d.ts.map +1 -0
  115. package/dist/utils/isDefaultRenderRange.js +8 -0
  116. package/dist/utils/isDefaultRenderRange.js.map +1 -0
  117. package/dist/utils/iterateOverDiff.d.ts +39 -0
  118. package/dist/utils/iterateOverDiff.d.ts.map +1 -0
  119. package/dist/utils/iterateOverDiff.js +356 -0
  120. package/dist/utils/iterateOverDiff.js.map +1 -0
  121. package/dist/utils/parseDiffFromFile.d.ts.map +1 -1
  122. package/dist/utils/parseDiffFromFile.js +8 -6
  123. package/dist/utils/parseDiffFromFile.js.map +1 -1
  124. package/dist/utils/parsePatchFiles.d.ts +15 -3
  125. package/dist/utils/parsePatchFiles.d.ts.map +1 -1
  126. package/dist/utils/parsePatchFiles.js +207 -158
  127. package/dist/utils/parsePatchFiles.js.map +1 -1
  128. package/dist/utils/processLine.js +4 -3
  129. package/dist/utils/processLine.js.map +1 -1
  130. package/dist/utils/renderDiffWithHighlighter.d.ts +7 -2
  131. package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
  132. package/dist/utils/renderDiffWithHighlighter.js +151 -229
  133. package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
  134. package/dist/utils/renderFileWithHighlighter.js +2 -2
  135. package/dist/utils/renderFileWithHighlighter.js.map +1 -1
  136. package/dist/utils/setWrapperNodeProps.d.ts +3 -7
  137. package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
  138. package/dist/utils/setWrapperNodeProps.js +1 -1
  139. package/dist/utils/setWrapperNodeProps.js.map +1 -1
  140. package/dist/worker/WorkerPoolManager.d.ts +9 -2
  141. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  142. package/dist/worker/WorkerPoolManager.js +124 -45
  143. package/dist/worker/WorkerPoolManager.js.map +1 -1
  144. package/dist/worker/types.d.ts +7 -0
  145. package/dist/worker/types.d.ts.map +1 -1
  146. package/dist/worker/worker-portable.js +652 -260
  147. package/dist/worker/worker-portable.js.map +1 -1
  148. package/dist/worker/worker.js +529 -249
  149. package/dist/worker/worker.js.map +1 -1
  150. package/package.json +21 -2
  151. package/dist/utils/createCodeNode.d.ts +0 -12
  152. package/dist/utils/createCodeNode.d.ts.map +0 -1
  153. package/dist/utils/createCodeNode.js +0 -12
  154. package/dist/utils/createCodeNode.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"FileDiff.js","names":["options: FileDiffOptions<LAnnotation>","workerManager?: WorkerPoolManager | undefined","error: unknown","codeDeletions: HTMLElement | undefined","codeAdditions: HTMLElement | undefined"],"sources":["../../src/components/FileDiff.ts"],"sourcesContent":["import type { Element as HASTElement } from 'hast';\nimport { toHtml } from 'hast-util-to-html';\n\nimport {\n DEFAULT_THEMES,\n DIFFS_TAG_NAME,\n HEADER_METADATA_SLOT_ID,\n UNSAFE_CSS_ATTRIBUTE,\n} from '../constants';\nimport {\n LineSelectionManager,\n type LineSelectionOptions,\n type SelectedLineRange,\n pluckLineSelectionOptions,\n} from '../managers/LineSelectionManager';\nimport {\n type GetHoveredLineResult,\n MouseEventManager,\n type MouseEventManagerBaseOptions,\n pluckMouseEventOptions,\n} from '../managers/MouseEventManager';\nimport { ResizeManager } from '../managers/ResizeManager';\nimport { ScrollSyncManager } from '../managers/ScrollSyncManager';\nimport {\n DiffHunksRenderer,\n type HunksRenderResult,\n} from '../renderers/DiffHunksRenderer';\nimport { SVGSpriteSheet } from '../sprite';\nimport type {\n BaseDiffOptions,\n DiffLineAnnotation,\n ExpansionDirections,\n FileContents,\n FileDiffMetadata,\n HunkData,\n HunkSeparators,\n RenderHeaderMetadataCallback,\n ThemeTypes,\n} from '../types';\nimport { areFilesEqual } from '../utils/areFilesEqual';\nimport { createAnnotationWrapperNode } from '../utils/createAnnotationWrapperNode';\nimport { createCodeNode } from '../utils/createCodeNode';\nimport { createHoverContentNode } from '../utils/createHoverContentNode';\nimport { createUnsafeCSSStyleNode } from '../utils/createUnsafeCSSStyleNode';\nimport { wrapUnsafeCSS } from '../utils/cssWrappers';\nimport { getLineAnnotationName } from '../utils/getLineAnnotationName';\nimport { parseDiffFromFile } from '../utils/parseDiffFromFile';\nimport { prerenderHTMLIfNecessary } from '../utils/prerenderHTMLIfNecessary';\nimport { setPreNodeProperties } from '../utils/setWrapperNodeProps';\nimport type { WorkerPoolManager } from '../worker';\nimport { DiffsContainerLoaded } from './web-components';\n\nexport interface FileDiffRenderProps<LAnnotation> {\n fileDiff?: FileDiffMetadata;\n oldFile?: FileContents;\n newFile?: FileContents;\n forceRender?: boolean;\n fileContainer?: HTMLElement;\n containerWrapper?: HTMLElement;\n lineAnnotations?: DiffLineAnnotation<LAnnotation>[];\n}\n\nexport interface FileDiffHydrationProps<LAnnotation>\n extends Omit<FileDiffRenderProps<LAnnotation>, 'fileContainer'> {\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\n\nexport interface FileDiffOptions<LAnnotation>\n extends Omit<BaseDiffOptions, 'hunkSeparators'>,\n MouseEventManagerBaseOptions<'diff'>,\n LineSelectionOptions {\n hunkSeparators?:\n | Exclude<HunkSeparators, 'custom'>\n | ((\n hunk: HunkData,\n instance: FileDiff<LAnnotation>\n ) => HTMLElement | DocumentFragment);\n disableFileHeader?: boolean;\n renderHeaderMetadata?: RenderHeaderMetadataCallback;\n renderAnnotation?(\n annotation: DiffLineAnnotation<LAnnotation>\n ): HTMLElement | undefined;\n renderHoverUtility?(\n getHoveredRow: () => GetHoveredLineResult<'diff'> | undefined\n ): HTMLElement | null;\n}\n\nlet instanceId = -1;\n\nexport class FileDiff<LAnnotation = undefined> {\n // NOTE(amadeus): We sorta need this to ensure the web-component file is\n // properly loaded\n static LoadedCustomComponent: boolean = DiffsContainerLoaded;\n\n readonly __id: number = ++instanceId;\n\n private fileContainer: HTMLElement | undefined;\n private spriteSVG: SVGElement | undefined;\n private pre: HTMLPreElement | undefined;\n private unsafeCSSStyle: HTMLStyleElement | undefined;\n private hoverContent: HTMLElement | undefined;\n\n private headerElement: HTMLElement | undefined;\n private headerMetadata: HTMLElement | undefined;\n private customHunkElements: HTMLElement[] = [];\n private errorWrapper: HTMLElement | undefined;\n\n private hunksRenderer: DiffHunksRenderer<LAnnotation>;\n private resizeManager: ResizeManager;\n private scrollSyncManager: ScrollSyncManager;\n private mouseEventManager: MouseEventManager<'diff'>;\n private lineSelectionManager: LineSelectionManager;\n\n private annotationElements: HTMLElement[] = [];\n private lineAnnotations: DiffLineAnnotation<LAnnotation>[] = [];\n\n private oldFile: FileContents | undefined;\n private newFile: FileContents | undefined;\n private fileDiff: FileDiffMetadata | undefined;\n\n constructor(\n public options: FileDiffOptions<LAnnotation> = { theme: DEFAULT_THEMES },\n private workerManager?: WorkerPoolManager | undefined,\n // NOTE(amadeus): Temp hack while we use this component in a react context\n private isContainerManaged = false\n ) {\n this.hunksRenderer = new DiffHunksRenderer(\n {\n ...options,\n hunkSeparators:\n typeof options.hunkSeparators === 'function'\n ? 'custom'\n : options.hunkSeparators,\n },\n this.handleHighlightRender,\n this.workerManager\n );\n this.resizeManager = new ResizeManager();\n this.scrollSyncManager = new ScrollSyncManager();\n this.mouseEventManager = new MouseEventManager(\n 'diff',\n pluckMouseEventOptions(\n options,\n typeof options.hunkSeparators === 'function' ||\n (options.hunkSeparators ?? 'line-info') === 'line-info'\n ? this.handleExpandHunk\n : undefined\n )\n );\n this.lineSelectionManager = new LineSelectionManager(\n pluckLineSelectionOptions(options)\n );\n this.workerManager?.subscribeToThemeChanges(this);\n }\n\n private handleHighlightRender = (): void => {\n this.rerender();\n };\n\n // FIXME(amadeus): This is a bit of a looming issue that I'll need to resolve:\n // * Do we publicly allow merging of options or do we have individualized setters?\n // * When setting new options, we need to figure out what settings require a\n // re-render and which can just be applied more elegantly\n // * There's also an issue of options that live here on the File class and\n // those that live on the Hunk class, and it's a bit of an issue with passing\n // settings down and mirroring them (not great...)\n setOptions(options: FileDiffOptions<LAnnotation> | undefined): void {\n if (options == null) return;\n this.options = options;\n this.hunksRenderer.setOptions({\n ...this.options,\n hunkSeparators:\n typeof options.hunkSeparators === 'function'\n ? 'custom'\n : options.hunkSeparators,\n });\n this.mouseEventManager.setOptions(\n pluckMouseEventOptions(\n options,\n typeof options.hunkSeparators === 'function' ||\n (options.hunkSeparators ?? 'line-info') === 'line-info'\n ? this.handleExpandHunk\n : undefined\n )\n );\n this.lineSelectionManager.setOptions(pluckLineSelectionOptions(options));\n }\n\n private mergeOptions(options: Partial<FileDiffOptions<LAnnotation>>): void {\n this.options = { ...this.options, ...options };\n }\n\n setThemeType(themeType: ThemeTypes): void {\n if ((this.options.themeType ?? 'system') === themeType) {\n return;\n }\n this.mergeOptions({ themeType });\n this.hunksRenderer.setThemeType(themeType);\n\n if (this.headerElement != null) {\n if (themeType === 'system') {\n delete this.headerElement.dataset.themeType;\n } else {\n this.headerElement.dataset.themeType = themeType;\n }\n }\n\n // Update pre element theme mode\n if (this.pre != null) {\n switch (themeType) {\n case 'system':\n delete this.pre.dataset.themeType;\n break;\n case 'light':\n case 'dark':\n this.pre.dataset.themeType = themeType;\n break;\n }\n }\n }\n\n getHoveredLine = (): GetHoveredLineResult<'diff'> | undefined => {\n return this.mouseEventManager.getHoveredLine();\n };\n\n setLineAnnotations(lineAnnotations: DiffLineAnnotation<LAnnotation>[]): void {\n this.lineAnnotations = lineAnnotations;\n }\n\n setSelectedLines(range: SelectedLineRange | null): void {\n this.lineSelectionManager.setSelection(range);\n }\n\n cleanUp(): void {\n this.hunksRenderer.cleanUp();\n this.resizeManager.cleanUp();\n this.mouseEventManager.cleanUp();\n this.scrollSyncManager.cleanUp();\n this.lineSelectionManager.cleanUp();\n this.workerManager?.unsubscribeToThemeChanges(this);\n this.workerManager = undefined;\n\n // Clean up the data\n this.fileDiff = undefined;\n this.oldFile = undefined;\n this.newFile = undefined;\n\n // Clean up the elements\n if (!this.isContainerManaged) {\n this.fileContainer?.parentNode?.removeChild(this.fileContainer);\n }\n if (this.fileContainer?.shadowRoot != null) {\n this.fileContainer.shadowRoot.innerHTML = '';\n }\n this.fileContainer = undefined;\n this.pre = undefined;\n this.headerElement = undefined;\n this.errorWrapper = undefined;\n }\n\n hydrate(props: FileDiffHydrationProps<LAnnotation>): void {\n const { fileContainer, prerenderedHTML } = props;\n prerenderHTMLIfNecessary(fileContainer, prerenderedHTML);\n for (const element of Array.from(\n fileContainer.shadowRoot?.children ?? []\n )) {\n if (element instanceof SVGElement) {\n this.spriteSVG = element;\n continue;\n }\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (element instanceof HTMLPreElement) {\n this.pre = element;\n continue;\n }\n if ('diffsHeader' in element.dataset) {\n this.headerElement = element;\n continue;\n }\n if (\n element instanceof HTMLStyleElement &&\n element.hasAttribute(UNSAFE_CSS_ATTRIBUTE)\n ) {\n this.unsafeCSSStyle = element;\n continue;\n }\n }\n // If we have no pre tag, then we should render\n if (this.pre == null) {\n this.render(props);\n }\n // Otherwise orchestrate our setup\n else {\n const { lineAnnotations, oldFile, newFile, fileDiff } = props;\n this.fileContainer = fileContainer;\n delete this.pre.dataset.dehydrated;\n\n this.lineAnnotations = lineAnnotations ?? this.lineAnnotations;\n this.newFile = newFile;\n this.oldFile = oldFile;\n this.fileDiff =\n fileDiff ??\n (oldFile != null && newFile != null\n ? parseDiffFromFile(oldFile, newFile)\n : undefined);\n\n this.hunksRenderer.hydrate(this.fileDiff);\n // FIXME(amadeus): not sure how to handle this yet...\n // this.renderSeparators();\n this.renderAnnotations();\n this.renderHoverUtility();\n this.injectUnsafeCSS();\n this.mouseEventManager.setup(this.pre);\n this.lineSelectionManager.setup(this.pre);\n if ((this.options.overflow ?? 'scroll') === 'scroll') {\n this.resizeManager.setup(this.pre);\n this.scrollSyncManager.setup(this.pre);\n }\n }\n }\n\n rerender(): void {\n if (this.fileDiff == null && this.newFile == null && this.oldFile == null) {\n return;\n }\n this.render({\n oldFile: this.oldFile,\n newFile: this.newFile,\n fileDiff: this.fileDiff,\n forceRender: true,\n });\n }\n\n handleExpandHunk = (\n hunkIndex: number,\n direction: ExpansionDirections\n ): void => {\n this.expandHunk(hunkIndex, direction);\n };\n\n expandHunk(hunkIndex: number, direction: ExpansionDirections): void {\n this.hunksRenderer.expandHunk(hunkIndex, direction);\n this.rerender();\n }\n\n render({\n oldFile,\n newFile,\n fileDiff,\n forceRender = false,\n lineAnnotations,\n fileContainer,\n containerWrapper,\n }: FileDiffRenderProps<LAnnotation>): void {\n const filesDidChange =\n oldFile != null &&\n newFile != null &&\n (!areFilesEqual(oldFile, this.oldFile) ||\n !areFilesEqual(newFile, this.newFile));\n const annotationsChanged =\n lineAnnotations != null &&\n (lineAnnotations.length > 0 || this.lineAnnotations.length > 0)\n ? lineAnnotations !== this.lineAnnotations\n : false;\n if (\n !forceRender &&\n !annotationsChanged &&\n // If using the fileDiff API, lets check to see if they are equal to\n // avoid doing work\n ((fileDiff != null && fileDiff === this.fileDiff) ||\n // If using the oldFile/newFile API then lets check to see if they are\n // equal\n (fileDiff == null && !filesDidChange))\n ) {\n return;\n }\n\n this.oldFile = oldFile;\n this.newFile = newFile;\n if (fileDiff != null) {\n this.fileDiff = fileDiff;\n } else if (oldFile != null && newFile != null && filesDidChange) {\n this.fileDiff = parseDiffFromFile(oldFile, newFile);\n }\n\n if (lineAnnotations != null) {\n this.setLineAnnotations(lineAnnotations);\n }\n if (this.fileDiff == null) {\n return;\n }\n this.hunksRenderer.setOptions({\n ...this.options,\n hunkSeparators:\n typeof this.options.hunkSeparators === 'function'\n ? 'custom'\n : this.options.hunkSeparators,\n });\n\n this.hunksRenderer.setLineAnnotations(this.lineAnnotations);\n\n const { disableFileHeader = false } = this.options;\n\n if (disableFileHeader) {\n // Remove existing header from DOM\n if (this.headerElement != null) {\n this.headerElement.parentNode?.removeChild(this.headerElement);\n this.headerElement = undefined;\n }\n }\n fileContainer = this.getOrCreateFileContainer(\n fileContainer,\n containerWrapper\n );\n\n try {\n const hunksResult = this.hunksRenderer.renderDiff(this.fileDiff);\n if (hunksResult == null) {\n if (this.workerManager != null && !this.workerManager.isInitialized()) {\n void this.workerManager.initialize().then(() => this.rerender());\n }\n return;\n }\n\n if (hunksResult.headerElement != null) {\n this.applyHeaderToDOM(hunksResult.headerElement, fileContainer);\n }\n const pre = this.getOrCreatePreNode(fileContainer);\n this.applyHunksToDOM(pre, hunksResult);\n this.renderSeparators(hunksResult.hunkData);\n this.renderAnnotations();\n this.renderHoverUtility();\n } catch (error: unknown) {\n if (error instanceof Error) {\n this.applyErrorToDOM(error, fileContainer);\n }\n }\n }\n\n private renderSeparators(hunkData: HunkData[]): void {\n const { hunkSeparators } = this.options;\n if (\n this.isContainerManaged ||\n this.fileContainer == null ||\n typeof hunkSeparators !== 'function'\n ) {\n return;\n }\n for (const element of this.customHunkElements) {\n element.parentNode?.removeChild(element);\n }\n this.customHunkElements.length = 0;\n for (const hunk of hunkData) {\n const element = document.createElement('div');\n element.style.display = 'contents';\n element.slot = hunk.slotName;\n element.appendChild(hunkSeparators(hunk, this));\n this.fileContainer.appendChild(element);\n this.customHunkElements.push(element);\n }\n }\n\n private renderAnnotations(): void {\n if (this.isContainerManaged || this.fileContainer == null) {\n return;\n }\n // Handle annotation elements\n for (const element of this.annotationElements) {\n element.parentNode?.removeChild(element);\n }\n this.annotationElements.length = 0;\n\n const { renderAnnotation } = this.options;\n if (renderAnnotation != null && this.lineAnnotations.length > 0) {\n for (const annotation of this.lineAnnotations) {\n const content = renderAnnotation(annotation);\n if (content == null) continue;\n const el = createAnnotationWrapperNode(\n getLineAnnotationName(annotation)\n );\n el.appendChild(content);\n this.annotationElements.push(el);\n this.fileContainer.appendChild(el);\n }\n }\n }\n\n private renderHoverUtility() {\n const { renderHoverUtility } = this.options;\n if (this.fileContainer == null || renderHoverUtility == null) return;\n if (this.hoverContent == null) {\n this.hoverContent = createHoverContentNode();\n this.fileContainer.appendChild(this.hoverContent);\n }\n const element = renderHoverUtility(this.mouseEventManager.getHoveredLine);\n this.hoverContent.innerHTML = '';\n if (element != null) {\n this.hoverContent.appendChild(element);\n }\n }\n\n private getOrCreateFileContainer(\n fileContainer?: HTMLElement,\n parentNode?: HTMLElement\n ): HTMLElement {\n this.fileContainer =\n fileContainer ??\n this.fileContainer ??\n document.createElement(DIFFS_TAG_NAME);\n if (parentNode != null && this.fileContainer.parentNode !== parentNode) {\n parentNode.appendChild(this.fileContainer);\n }\n if (this.spriteSVG == null) {\n const fragment = document.createElement('div');\n fragment.innerHTML = SVGSpriteSheet;\n const firstChild = fragment.firstChild;\n if (firstChild instanceof SVGElement) {\n this.spriteSVG = firstChild;\n this.fileContainer.shadowRoot?.appendChild(this.spriteSVG);\n }\n }\n return this.fileContainer;\n }\n\n getFileContainer(): HTMLElement | undefined {\n return this.fileContainer;\n }\n\n private getOrCreatePreNode(container: HTMLElement): HTMLPreElement {\n // If we haven't created a pre element yet, lets go ahead and do that\n if (this.pre == null) {\n this.pre = document.createElement('pre');\n container.shadowRoot?.appendChild(this.pre);\n }\n // If we have a new parent container for the pre element, lets go ahead and\n // move it into the new container\n else if (this.pre.parentNode !== container) {\n container.shadowRoot?.appendChild(this.pre);\n }\n return this.pre;\n }\n\n private applyHeaderToDOM(\n headerAST: HASTElement,\n container: HTMLElement\n ): void {\n this.cleanupErrorWrapper();\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = toHtml(headerAST);\n const newHeader = tempDiv.firstElementChild;\n if (!(newHeader instanceof HTMLElement)) {\n return;\n }\n if (this.headerElement != null) {\n container.shadowRoot?.replaceChild(newHeader, this.headerElement);\n } else {\n container.shadowRoot?.prepend(newHeader);\n }\n this.headerElement = newHeader;\n\n if (this.isContainerManaged) return;\n\n const { renderHeaderMetadata } = this.options;\n if (this.headerMetadata != null) {\n this.headerMetadata.parentNode?.removeChild(this.headerMetadata);\n }\n const content =\n renderHeaderMetadata?.({\n oldFile: this.oldFile,\n newFile: this.newFile,\n fileDiff: this.fileDiff,\n }) ?? undefined;\n if (content != null) {\n this.headerMetadata = document.createElement('div');\n this.headerMetadata.slot = HEADER_METADATA_SLOT_ID;\n if (content instanceof Element) {\n this.headerMetadata.appendChild(content);\n } else {\n this.headerMetadata.innerText = `${content}`;\n }\n container.appendChild(this.headerMetadata);\n }\n }\n\n private injectUnsafeCSS(): void {\n if (this.fileContainer?.shadowRoot == null) {\n return;\n }\n const { unsafeCSS } = this.options;\n\n if (unsafeCSS == null || unsafeCSS === '') {\n return;\n }\n\n // Create or update the style element\n if (this.unsafeCSSStyle == null) {\n this.unsafeCSSStyle = createUnsafeCSSStyleNode();\n this.fileContainer.shadowRoot.appendChild(this.unsafeCSSStyle);\n }\n // Wrap in @layer unsafe to match SSR behavior\n this.unsafeCSSStyle.innerText = wrapUnsafeCSS(unsafeCSS);\n }\n\n private applyHunksToDOM(\n pre: HTMLPreElement,\n result: HunksRenderResult\n ): void {\n this.cleanupErrorWrapper();\n this.applyPreNodeAttributes(pre, result);\n\n // Clear existing content\n pre.innerHTML = '';\n\n let codeDeletions: HTMLElement | undefined;\n let codeAdditions: HTMLElement | undefined;\n // Create code elements and insert HTML content\n if (result.unifiedAST != null) {\n const codeUnified = createCodeNode({ columnType: 'unified' });\n codeUnified.innerHTML = this.hunksRenderer.renderPartialHTML(\n result.unifiedAST\n );\n pre.appendChild(codeUnified);\n } else {\n if (result.deletionsAST != null) {\n codeDeletions = createCodeNode({ columnType: 'deletions' });\n codeDeletions.innerHTML = this.hunksRenderer.renderPartialHTML(\n result.deletionsAST\n );\n pre.appendChild(codeDeletions);\n }\n if (result.additionsAST != null) {\n codeAdditions = createCodeNode({ columnType: 'additions' });\n codeAdditions.innerHTML = this.hunksRenderer.renderPartialHTML(\n result.additionsAST\n );\n pre.appendChild(codeAdditions);\n }\n }\n\n this.injectUnsafeCSS();\n\n this.mouseEventManager.setup(pre);\n this.lineSelectionManager.setup(pre);\n if ((this.options.overflow ?? 'scroll') === 'scroll') {\n this.resizeManager.setup(pre);\n this.scrollSyncManager.setup(pre, codeDeletions, codeAdditions);\n } else {\n this.resizeManager.cleanUp();\n this.scrollSyncManager.cleanUp();\n }\n }\n\n private applyPreNodeAttributes(\n pre: HTMLPreElement,\n {\n themeStyles,\n baseThemeType,\n additionsAST,\n deletionsAST,\n totalLines,\n }: HunksRenderResult\n ): void {\n const {\n diffIndicators = 'bars',\n disableBackground = false,\n disableLineNumbers = false,\n overflow = 'scroll',\n themeType = 'system',\n diffStyle = 'split',\n } = this.options;\n const split =\n diffStyle === 'unified'\n ? false\n : additionsAST != null && deletionsAST != null;\n setPreNodeProperties({\n pre,\n diffIndicators,\n disableBackground,\n disableLineNumbers,\n overflow,\n split,\n themeStyles,\n themeType: baseThemeType ?? themeType,\n totalLines,\n });\n }\n\n private applyErrorToDOM(error: Error, container: HTMLElement) {\n this.cleanupErrorWrapper();\n const pre = this.getOrCreatePreNode(container);\n pre.innerHTML = '';\n pre.parentNode?.removeChild(pre);\n this.pre = undefined;\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n this.errorWrapper ??= document.createElement('div');\n this.errorWrapper.dataset.errorWrapper = '';\n this.errorWrapper.innerHTML = '';\n shadowRoot.appendChild(this.errorWrapper);\n const errorMessage = document.createElement('div');\n errorMessage.dataset.errorMessage = '';\n errorMessage.innerText = error.message;\n this.errorWrapper.appendChild(errorMessage);\n const errorStack = document.createElement('pre');\n errorStack.dataset.errorStack = '';\n errorStack.innerText = error.stack ?? 'No Error Stack';\n this.errorWrapper.appendChild(errorStack);\n }\n\n private cleanupErrorWrapper() {\n this.errorWrapper?.parentNode?.removeChild(this.errorWrapper);\n this.errorWrapper = undefined;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"FileDiff.js","names":["options: FileDiffOptions<LAnnotation>","workerManager?: WorkerPoolManager | undefined","error: unknown","codeDeletions: HTMLElement | undefined","codeAdditions: HTMLElement | undefined","codeElements: HTMLElement[]","preProperties: PrePropertiesConfig"],"sources":["../../src/components/FileDiff.ts"],"sourcesContent":["import type { Element as HASTElement } from 'hast';\nimport { toHtml } from 'hast-util-to-html';\n\nimport {\n DEFAULT_THEMES,\n DIFFS_TAG_NAME,\n HEADER_METADATA_SLOT_ID,\n UNSAFE_CSS_ATTRIBUTE,\n} from '../constants';\nimport {\n LineSelectionManager,\n type LineSelectionOptions,\n type SelectedLineRange,\n pluckLineSelectionOptions,\n} from '../managers/LineSelectionManager';\nimport {\n type GetHoveredLineResult,\n MouseEventManager,\n type MouseEventManagerBaseOptions,\n pluckMouseEventOptions,\n} from '../managers/MouseEventManager';\nimport { ResizeManager } from '../managers/ResizeManager';\nimport { ScrollSyncManager } from '../managers/ScrollSyncManager';\nimport {\n DiffHunksRenderer,\n type HunksRenderResult,\n} from '../renderers/DiffHunksRenderer';\nimport { SVGSpriteSheet } from '../sprite';\nimport type {\n BaseDiffOptions,\n DiffLineAnnotation,\n ExpansionDirections,\n FileContents,\n FileDiffMetadata,\n HunkData,\n HunkSeparators,\n PrePropertiesConfig,\n RenderHeaderMetadataCallback,\n RenderRange,\n ThemeTypes,\n} from '../types';\nimport { areDiffLineAnnotationsEqual } from '../utils/areDiffLineAnnotationsEqual';\nimport { areFilesEqual } from '../utils/areFilesEqual';\nimport { areHunkDataEqual } from '../utils/areHunkDataEqual';\nimport { arePrePropertiesEqual } from '../utils/arePrePropertiesEqual';\nimport { areRenderRangesEqual } from '../utils/areRenderRangesEqual';\nimport { createAnnotationWrapperNode } from '../utils/createAnnotationWrapperNode';\nimport { createHoverContentNode } from '../utils/createHoverContentNode';\nimport { createUnsafeCSSStyleNode } from '../utils/createUnsafeCSSStyleNode';\nimport { wrapUnsafeCSS } from '../utils/cssWrappers';\nimport { getLineAnnotationName } from '../utils/getLineAnnotationName';\nimport { getOrCreateCodeNode } from '../utils/getOrCreateCodeNode';\nimport { parseDiffFromFile } from '../utils/parseDiffFromFile';\nimport { prerenderHTMLIfNecessary } from '../utils/prerenderHTMLIfNecessary';\nimport { setPreNodeProperties } from '../utils/setWrapperNodeProps';\nimport type { WorkerPoolManager } from '../worker';\nimport { DiffsContainerLoaded } from './web-components';\n\nexport interface FileDiffRenderProps<LAnnotation> {\n fileDiff?: FileDiffMetadata;\n oldFile?: FileContents;\n newFile?: FileContents;\n forceRender?: boolean;\n fileContainer?: HTMLElement;\n containerWrapper?: HTMLElement;\n lineAnnotations?: DiffLineAnnotation<LAnnotation>[];\n renderRange?: RenderRange;\n}\n\nexport interface FileDiffHydrationProps<LAnnotation>\n extends Omit<FileDiffRenderProps<LAnnotation>, 'fileContainer'> {\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\n\nexport interface FileDiffOptions<LAnnotation>\n extends Omit<BaseDiffOptions, 'hunkSeparators'>,\n MouseEventManagerBaseOptions<'diff'>,\n LineSelectionOptions {\n hunkSeparators?:\n | Exclude<HunkSeparators, 'custom'>\n | ((\n hunk: HunkData,\n instance: FileDiff<LAnnotation>\n ) => HTMLElement | DocumentFragment);\n disableFileHeader?: boolean;\n renderHeaderMetadata?: RenderHeaderMetadataCallback;\n renderAnnotation?(\n annotation: DiffLineAnnotation<LAnnotation>\n ): HTMLElement | undefined;\n renderHoverUtility?(\n getHoveredRow: () => GetHoveredLineResult<'diff'> | undefined\n ): HTMLElement | null;\n}\n\ninterface AnnotationElementCache<LAnnotation> {\n element: HTMLElement;\n annotation: DiffLineAnnotation<LAnnotation>;\n}\n\ninterface CustomHunkElementCache {\n element: HTMLElement;\n hunkData: HunkData;\n}\n\nlet instanceId = -1;\n\nexport class FileDiff<LAnnotation = undefined> {\n // NOTE(amadeus): We sorta need this to ensure the web-component file is\n // properly loaded\n static LoadedCustomComponent: boolean = DiffsContainerLoaded;\n\n readonly __id: string = `file-diff:${++instanceId}`;\n\n protected fileContainer: HTMLElement | undefined;\n protected spriteSVG: SVGElement | undefined;\n protected pre: HTMLPreElement | undefined;\n protected codeUnified: HTMLElement | undefined;\n protected codeDeletions: HTMLElement | undefined;\n protected codeAdditions: HTMLElement | undefined;\n protected unsafeCSSStyle: HTMLStyleElement | undefined;\n protected hoverContent: HTMLElement | undefined;\n\n protected headerElement: HTMLElement | undefined;\n protected headerMetadata: HTMLElement | undefined;\n protected separatorCache: Map<string, CustomHunkElementCache> = new Map();\n protected errorWrapper: HTMLElement | undefined;\n\n protected hunksRenderer: DiffHunksRenderer<LAnnotation>;\n protected resizeManager: ResizeManager;\n protected scrollSyncManager: ScrollSyncManager;\n protected mouseEventManager: MouseEventManager<'diff'>;\n protected lineSelectionManager: LineSelectionManager;\n\n protected annotationCache: Map<string, AnnotationElementCache<LAnnotation>> =\n new Map();\n protected lineAnnotations: DiffLineAnnotation<LAnnotation>[] = [];\n\n protected deletionFile: FileContents | undefined;\n protected additionFile: FileContents | undefined;\n protected fileDiff: FileDiffMetadata | undefined;\n protected renderRange: RenderRange | undefined;\n protected appliedPreAttributes: PrePropertiesConfig | undefined;\n protected lastRenderedHeaderHTML: string | undefined;\n\n protected enabled = true;\n\n constructor(\n public options: FileDiffOptions<LAnnotation> = { theme: DEFAULT_THEMES },\n protected workerManager?: WorkerPoolManager | undefined,\n protected isContainerManaged = false\n ) {\n this.hunksRenderer = new DiffHunksRenderer(\n {\n ...options,\n hunkSeparators:\n typeof options.hunkSeparators === 'function'\n ? 'custom'\n : options.hunkSeparators,\n },\n this.handleHighlightRender,\n this.workerManager\n );\n this.resizeManager = new ResizeManager();\n this.scrollSyncManager = new ScrollSyncManager();\n this.mouseEventManager = new MouseEventManager(\n 'diff',\n pluckMouseEventOptions(\n options,\n typeof options.hunkSeparators === 'function' ||\n (options.hunkSeparators ?? 'line-info') === 'line-info'\n ? this.handleExpandHunk\n : undefined\n )\n );\n this.lineSelectionManager = new LineSelectionManager(\n pluckLineSelectionOptions(options)\n );\n this.workerManager?.subscribeToThemeChanges(this);\n this.enabled = true;\n }\n\n private handleHighlightRender = (): void => {\n this.rerender();\n };\n\n // FIXME(amadeus): This is a bit of a looming issue that I'll need to resolve:\n // * Do we publicly allow merging of options or do we have individualized setters?\n // * When setting new options, we need to figure out what settings require a\n // re-render and which can just be applied more elegantly\n // * There's also an issue of options that live here on the File class and\n // those that live on the Hunk class, and it's a bit of an issue with passing\n // settings down and mirroring them (not great...)\n setOptions(options: FileDiffOptions<LAnnotation> | undefined): void {\n if (options == null) return;\n this.options = options;\n this.hunksRenderer.setOptions({\n ...this.options,\n hunkSeparators:\n typeof options.hunkSeparators === 'function'\n ? 'custom'\n : options.hunkSeparators,\n });\n this.mouseEventManager.setOptions(\n pluckMouseEventOptions(\n options,\n typeof options.hunkSeparators === 'function' ||\n (options.hunkSeparators ?? 'line-info') === 'line-info'\n ? this.handleExpandHunk\n : undefined\n )\n );\n this.lineSelectionManager.setOptions(pluckLineSelectionOptions(options));\n }\n\n private mergeOptions(options: Partial<FileDiffOptions<LAnnotation>>): void {\n this.options = { ...this.options, ...options };\n }\n\n setThemeType(themeType: ThemeTypes): void {\n if ((this.options.themeType ?? 'system') === themeType) {\n return;\n }\n this.mergeOptions({ themeType });\n this.hunksRenderer.setThemeType(themeType);\n\n if (this.headerElement != null) {\n if (themeType === 'system') {\n delete this.headerElement.dataset.themeType;\n } else {\n this.headerElement.dataset.themeType = themeType;\n }\n }\n\n // Update pre element theme mode\n if (this.pre != null) {\n switch (themeType) {\n case 'system':\n delete this.pre.dataset.themeType;\n break;\n case 'light':\n case 'dark':\n this.pre.dataset.themeType = themeType;\n break;\n }\n }\n }\n\n getHoveredLine = (): GetHoveredLineResult<'diff'> | undefined => {\n return this.mouseEventManager.getHoveredLine();\n };\n\n setLineAnnotations(lineAnnotations: DiffLineAnnotation<LAnnotation>[]): void {\n this.lineAnnotations = lineAnnotations;\n }\n\n setSelectedLines(range: SelectedLineRange | null): void {\n this.lineSelectionManager.setSelection(range);\n }\n\n cleanUp(recycle: boolean = false): void {\n this.resizeManager.cleanUp();\n this.mouseEventManager.cleanUp();\n this.scrollSyncManager.cleanUp();\n this.lineSelectionManager.cleanUp();\n this.workerManager?.unsubscribeToThemeChanges(this);\n this.renderRange = undefined;\n\n // Clean up the elements\n if (!this.isContainerManaged) {\n this.fileContainer?.parentNode?.removeChild(this.fileContainer);\n }\n if (this.fileContainer?.shadowRoot != null) {\n // Manually help garbage collection\n this.fileContainer.shadowRoot.innerHTML = '';\n }\n this.fileContainer = undefined;\n // Manually help garbage collection\n if (this.pre != null) {\n this.pre.innerHTML = '';\n this.pre = undefined;\n }\n this.codeUnified = undefined;\n this.codeDeletions = undefined;\n this.codeAdditions = undefined;\n this.appliedPreAttributes = undefined;\n this.headerElement = undefined;\n this.lastRenderedHeaderHTML = undefined;\n this.errorWrapper = undefined;\n this.spriteSVG = undefined;\n\n if (recycle) {\n this.hunksRenderer.recycle();\n } else {\n this.hunksRenderer.cleanUp();\n this.workerManager = undefined;\n // Clean up the data\n this.fileDiff = undefined;\n this.deletionFile = undefined;\n this.additionFile = undefined;\n }\n\n this.enabled = false;\n }\n\n virtualizedSetup(): void {\n this.enabled = true;\n this.workerManager?.subscribeToThemeChanges(this);\n }\n\n hydrate(props: FileDiffHydrationProps<LAnnotation>): void {\n const { fileContainer, prerenderedHTML } = props;\n prerenderHTMLIfNecessary(fileContainer, prerenderedHTML);\n for (const element of fileContainer.shadowRoot?.children ?? []) {\n if (element instanceof SVGElement) {\n this.spriteSVG = element;\n continue;\n }\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (element instanceof HTMLPreElement) {\n this.pre = element;\n for (const code of element.children) {\n if (\n !(code instanceof HTMLElement) ||\n code.tagName.toLowerCase() !== 'code'\n ) {\n continue;\n }\n if ('deletions' in code.dataset) {\n this.codeDeletions = code;\n }\n if ('additions' in code.dataset) {\n this.codeAdditions = code;\n }\n if ('unified' in code.dataset) {\n this.codeUnified = code;\n }\n }\n continue;\n }\n if ('diffsHeader' in element.dataset) {\n this.headerElement = element;\n continue;\n }\n if (\n element instanceof HTMLStyleElement &&\n element.hasAttribute(UNSAFE_CSS_ATTRIBUTE)\n ) {\n this.unsafeCSSStyle = element;\n continue;\n }\n }\n if (this.pre != null) {\n this.syncCodeNodesFromPre(this.pre);\n }\n // If we have no pre tag, then we should render\n if (this.pre == null) {\n this.render(props);\n }\n // Otherwise orchestrate our setup\n else {\n const { lineAnnotations, oldFile, newFile, fileDiff } = props;\n this.fileContainer = fileContainer;\n delete this.pre.dataset.dehydrated;\n\n this.lineAnnotations = lineAnnotations ?? this.lineAnnotations;\n this.additionFile = newFile;\n this.deletionFile = oldFile;\n this.fileDiff =\n fileDiff ??\n (oldFile != null && newFile != null\n ? parseDiffFromFile(oldFile, newFile)\n : undefined);\n\n this.hunksRenderer.hydrate(this.fileDiff);\n // FIXME(amadeus): not sure how to handle this yet...\n // this.renderSeparators();\n this.renderAnnotations();\n this.renderHoverUtility();\n this.injectUnsafeCSS();\n this.mouseEventManager.setup(this.pre);\n this.lineSelectionManager.setup(this.pre);\n if ((this.options.overflow ?? 'scroll') === 'scroll') {\n this.resizeManager.setup(this.pre);\n if ((this.options.diffStyle ?? 'split') === 'split') {\n this.scrollSyncManager.setup(\n this.pre,\n this.codeDeletions,\n this.codeAdditions\n );\n }\n }\n }\n }\n\n rerender(): void {\n if (\n !this.enabled ||\n (this.fileDiff == null &&\n this.additionFile == null &&\n this.deletionFile == null)\n ) {\n return;\n }\n this.render({\n oldFile: this.deletionFile,\n newFile: this.additionFile,\n fileDiff: this.fileDiff,\n forceRender: true,\n renderRange: this.renderRange,\n });\n }\n\n handleExpandHunk = (\n hunkIndex: number,\n direction: ExpansionDirections\n ): void => {\n this.expandHunk(hunkIndex, direction);\n };\n\n expandHunk(hunkIndex: number, direction: ExpansionDirections): void {\n this.hunksRenderer.expandHunk(hunkIndex, direction);\n this.rerender();\n }\n\n render({\n oldFile,\n newFile,\n fileDiff,\n forceRender = false,\n lineAnnotations,\n fileContainer,\n containerWrapper,\n renderRange,\n }: FileDiffRenderProps<LAnnotation>): void {\n if (!this.enabled) {\n // NOTE(amadeus): May need to be a silent failure? Making it loud for now\n // to better understand it\n throw new Error(\n 'FileDiff.render: attempting to call render after cleaned up'\n );\n }\n const filesDidChange =\n oldFile != null &&\n newFile != null &&\n (!areFilesEqual(oldFile, this.deletionFile) ||\n !areFilesEqual(newFile, this.additionFile));\n const annotationsChanged =\n lineAnnotations != null &&\n (lineAnnotations.length > 0 || this.lineAnnotations.length > 0)\n ? lineAnnotations !== this.lineAnnotations\n : false;\n if (\n areRenderRangesEqual(renderRange, this.renderRange) &&\n !forceRender &&\n !annotationsChanged &&\n // If using the fileDiff API, lets check to see if they are equal to\n // avoid doing work\n ((fileDiff != null && fileDiff === this.fileDiff) ||\n // If using the oldFile/newFile API then lets check to see if they are\n // equal\n (fileDiff == null && !filesDidChange))\n ) {\n return;\n }\n\n this.renderRange = renderRange;\n this.deletionFile = oldFile;\n this.additionFile = newFile;\n if (fileDiff != null) {\n this.fileDiff = fileDiff;\n } else if (oldFile != null && newFile != null && filesDidChange) {\n this.fileDiff = parseDiffFromFile(oldFile, newFile);\n }\n\n if (lineAnnotations != null) {\n this.setLineAnnotations(lineAnnotations);\n }\n if (this.fileDiff == null) {\n return;\n }\n this.hunksRenderer.setOptions({\n ...this.options,\n hunkSeparators:\n typeof this.options.hunkSeparators === 'function'\n ? 'custom'\n : this.options.hunkSeparators,\n });\n\n this.hunksRenderer.setLineAnnotations(this.lineAnnotations);\n\n const { disableFileHeader = false } = this.options;\n\n if (disableFileHeader) {\n // Remove existing header from DOM\n if (this.headerElement != null) {\n this.headerElement.parentNode?.removeChild(this.headerElement);\n this.headerElement = undefined;\n this.lastRenderedHeaderHTML = undefined;\n }\n }\n fileContainer = this.getOrCreateFileContainer(\n fileContainer,\n containerWrapper\n );\n\n try {\n const hunksResult = this.hunksRenderer.renderDiff(\n this.fileDiff,\n renderRange\n );\n if (hunksResult == null) {\n if (this.workerManager != null && !this.workerManager.isInitialized()) {\n void this.workerManager.initialize().then(() => this.rerender());\n }\n return;\n }\n\n if (hunksResult.headerElement != null) {\n this.applyHeaderToDOM(hunksResult.headerElement, fileContainer);\n }\n if (\n hunksResult.additionsAST != null ||\n hunksResult.deletionsAST != null ||\n hunksResult.unifiedAST != null\n ) {\n const pre = this.getOrCreatePreNode(fileContainer);\n this.applyHunksToDOM(pre, hunksResult);\n } else if (this.pre != null) {\n this.pre.parentNode?.removeChild(this.pre);\n this.pre = undefined;\n }\n this.renderSeparators(hunksResult.hunkData);\n this.renderAnnotations();\n this.renderHoverUtility();\n } catch (error: unknown) {\n if (error instanceof Error) {\n console.error(error);\n this.applyErrorToDOM(error, fileContainer);\n }\n }\n }\n\n private renderSeparators(hunkData: HunkData[]): void {\n const { hunkSeparators } = this.options;\n if (\n this.isContainerManaged ||\n this.fileContainer == null ||\n typeof hunkSeparators !== 'function'\n ) {\n for (const { element } of this.separatorCache.values()) {\n element.parentNode?.removeChild(element);\n }\n this.separatorCache.clear();\n return;\n }\n const staleSeparators = new Map(this.separatorCache);\n for (const hunk of hunkData) {\n const id = hunk.slotName;\n let cache = this.separatorCache.get(id);\n if (cache == null || !areHunkDataEqual(hunk, cache.hunkData)) {\n cache?.element.parentNode?.removeChild(cache.element);\n const element = document.createElement('div');\n element.style.display = 'contents';\n element.slot = hunk.slotName;\n element.appendChild(hunkSeparators(hunk, this));\n this.fileContainer.appendChild(element);\n cache = { element, hunkData: hunk };\n this.separatorCache.set(id, cache);\n }\n staleSeparators.delete(id);\n }\n for (const [id, { element }] of staleSeparators.entries()) {\n this.separatorCache.delete(id);\n element.parentNode?.removeChild(element);\n }\n }\n\n private renderAnnotations(): void {\n if (this.isContainerManaged || this.fileContainer == null) {\n for (const { element } of this.annotationCache.values()) {\n element.parentNode?.removeChild(element);\n }\n this.annotationCache.clear();\n return;\n }\n const staleAnnotations = new Map(this.annotationCache);\n const { renderAnnotation } = this.options;\n if (renderAnnotation != null && this.lineAnnotations.length > 0) {\n for (const [index, annotation] of this.lineAnnotations.entries()) {\n const id = `${index}-${getLineAnnotationName(annotation)}`;\n let cache = this.annotationCache.get(id);\n if (\n cache == null ||\n !areDiffLineAnnotationsEqual(annotation, cache.annotation)\n ) {\n cache?.element.parentElement?.removeChild(cache.element);\n const content = renderAnnotation(annotation);\n // If we can't render anything, then we should not render anything\n // and clear the annotation cache if necessary.\n if (content == null) {\n continue;\n }\n cache = {\n element: createAnnotationWrapperNode(\n getLineAnnotationName(annotation)\n ),\n annotation,\n };\n cache.element.appendChild(content);\n this.fileContainer.appendChild(cache.element);\n this.annotationCache.set(id, cache);\n }\n staleAnnotations.delete(id);\n }\n }\n for (const [id, { element }] of staleAnnotations.entries()) {\n this.annotationCache.delete(id);\n element.parentNode?.removeChild(element);\n }\n }\n\n private renderHoverUtility() {\n const { renderHoverUtility } = this.options;\n if (this.fileContainer == null || renderHoverUtility == null) {\n return;\n }\n const element = renderHoverUtility(this.mouseEventManager.getHoveredLine);\n if (element != null && this.hoverContent != null) {\n return;\n } else if (element == null) {\n this.hoverContent?.parentNode?.removeChild(this.hoverContent);\n this.hoverContent = undefined;\n return;\n }\n this.hoverContent = createHoverContentNode();\n this.hoverContent.appendChild(element);\n this.fileContainer.appendChild(this.hoverContent);\n }\n\n getOrCreateFileContainer(\n fileContainer?: HTMLElement,\n parentNode?: HTMLElement\n ): HTMLElement {\n const previousContainer = this.fileContainer;\n this.fileContainer =\n fileContainer ??\n this.fileContainer ??\n document.createElement(DIFFS_TAG_NAME);\n // NOTE(amadeus): If the container changes, we should reset the rendered\n // HTML\n if (previousContainer != null && previousContainer !== this.fileContainer) {\n this.lastRenderedHeaderHTML = undefined;\n this.headerElement = undefined;\n }\n if (parentNode != null && this.fileContainer.parentNode !== parentNode) {\n parentNode.appendChild(this.fileContainer);\n }\n if (this.spriteSVG == null) {\n const fragment = document.createElement('div');\n fragment.innerHTML = SVGSpriteSheet;\n const firstChild = fragment.firstChild;\n if (firstChild instanceof SVGElement) {\n this.spriteSVG = firstChild;\n this.fileContainer.shadowRoot?.appendChild(this.spriteSVG);\n }\n }\n return this.fileContainer;\n }\n\n getFileContainer(): HTMLElement | undefined {\n return this.fileContainer;\n }\n\n private getOrCreatePreNode(container: HTMLElement): HTMLPreElement {\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n // If we haven't created a pre element yet, lets go ahead and do that\n if (this.pre == null) {\n this.pre = document.createElement('pre');\n this.appliedPreAttributes = undefined;\n this.codeUnified = undefined;\n this.codeDeletions = undefined;\n this.codeAdditions = undefined;\n shadowRoot.appendChild(this.pre);\n }\n // If we have a new parent container for the pre element, lets go ahead and\n // move it into the new container\n else if (this.pre.parentNode !== shadowRoot) {\n shadowRoot.appendChild(this.pre);\n this.appliedPreAttributes = undefined;\n }\n return this.pre;\n }\n\n private syncCodeNodesFromPre(pre: HTMLPreElement): void {\n this.codeUnified = undefined;\n this.codeDeletions = undefined;\n this.codeAdditions = undefined;\n for (const child of Array.from(pre.children)) {\n if (!(child instanceof HTMLElement)) {\n continue;\n }\n if ('unified' in child.dataset) {\n this.codeUnified = child;\n } else if ('deletions' in child.dataset) {\n this.codeDeletions = child;\n } else if ('additions' in child.dataset) {\n this.codeAdditions = child;\n }\n }\n }\n\n private applyHeaderToDOM(\n headerAST: HASTElement,\n container: HTMLElement\n ): void {\n this.cleanupErrorWrapper();\n const headerHTML = toHtml(headerAST);\n if (headerHTML !== this.lastRenderedHeaderHTML) {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = headerHTML;\n const newHeader = tempDiv.firstElementChild;\n if (!(newHeader instanceof HTMLElement)) {\n return;\n }\n if (this.headerElement != null) {\n container.shadowRoot?.replaceChild(newHeader, this.headerElement);\n } else {\n container.shadowRoot?.prepend(newHeader);\n }\n this.headerElement = newHeader;\n this.lastRenderedHeaderHTML = headerHTML;\n }\n\n if (this.isContainerManaged) return;\n\n const { renderHeaderMetadata } = this.options;\n if (this.headerMetadata != null) {\n this.headerMetadata.parentNode?.removeChild(this.headerMetadata);\n }\n const content =\n renderHeaderMetadata?.({\n deletionFile: this.deletionFile,\n additionFile: this.additionFile,\n fileDiff: this.fileDiff,\n }) ?? undefined;\n if (content != null) {\n this.headerMetadata = document.createElement('div');\n this.headerMetadata.slot = HEADER_METADATA_SLOT_ID;\n if (content instanceof Element) {\n this.headerMetadata.appendChild(content);\n } else {\n this.headerMetadata.innerText = `${content}`;\n }\n container.appendChild(this.headerMetadata);\n }\n }\n\n private injectUnsafeCSS(): void {\n if (this.fileContainer?.shadowRoot == null) {\n return;\n }\n const { unsafeCSS } = this.options;\n\n if (unsafeCSS == null || unsafeCSS === '') {\n return;\n }\n\n // Create or update the style element\n if (this.unsafeCSSStyle == null) {\n this.unsafeCSSStyle = createUnsafeCSSStyleNode();\n this.fileContainer.shadowRoot.appendChild(this.unsafeCSSStyle);\n }\n // Wrap in @layer unsafe to match SSR behavior\n this.unsafeCSSStyle.innerText = wrapUnsafeCSS(unsafeCSS);\n }\n\n private applyHunksToDOM(\n pre: HTMLPreElement,\n result: HunksRenderResult\n ): void {\n this.cleanupErrorWrapper();\n this.applyPreNodeAttributes(pre, result);\n\n let shouldReplace = false;\n let codeDeletions: HTMLElement | undefined;\n let codeAdditions: HTMLElement | undefined;\n // Create code elements and insert HTML content\n const codeElements: HTMLElement[] = [];\n if (result.unifiedAST != null) {\n shouldReplace =\n this.codeUnified == null ||\n this.codeAdditions != null ||\n this.codeDeletions != null;\n this.codeDeletions = undefined;\n this.codeAdditions = undefined;\n if (result.unifiedAST.length > 0) {\n this.codeUnified = getOrCreateCodeNode({\n code: this.codeUnified,\n columnType: 'unified',\n });\n this.codeUnified.innerHTML = this.hunksRenderer.renderPartialHTML(\n result.unifiedAST\n );\n codeElements.push(this.codeUnified);\n } else {\n this.codeUnified = undefined;\n }\n } else {\n if (result.deletionsAST != null) {\n shouldReplace = this.codeDeletions == null || this.codeUnified != null;\n this.codeUnified = undefined;\n if (result.deletionsAST.length > 0) {\n this.codeDeletions = getOrCreateCodeNode({\n code: this.codeDeletions,\n columnType: 'deletions',\n });\n this.codeDeletions.innerHTML = this.hunksRenderer.renderPartialHTML(\n result.deletionsAST\n );\n codeElements.push(this.codeDeletions);\n } else {\n this.codeDeletions = undefined;\n }\n }\n if (result.additionsAST != null) {\n shouldReplace =\n shouldReplace ||\n this.codeAdditions == null ||\n this.codeUnified != null;\n this.codeUnified = undefined;\n if (result.additionsAST.length > 0) {\n this.codeAdditions = getOrCreateCodeNode({\n code: this.codeAdditions,\n columnType: 'additions',\n });\n this.codeAdditions.innerHTML = this.hunksRenderer.renderPartialHTML(\n result.additionsAST\n );\n codeElements.push(this.codeAdditions);\n } else {\n this.codeAdditions = undefined;\n }\n }\n }\n\n if (codeElements.length === 0) {\n pre.textContent = '';\n } else if (shouldReplace) {\n pre.replaceChildren(...codeElements);\n }\n\n this.injectUnsafeCSS();\n\n this.mouseEventManager.setup(pre);\n this.lineSelectionManager.setup(pre);\n if ((this.options.overflow ?? 'scroll') === 'scroll') {\n this.resizeManager.setup(pre);\n if ((this.options.diffStyle ?? 'split') === 'split') {\n this.scrollSyncManager.setup(pre, codeDeletions, codeAdditions);\n } else {\n this.scrollSyncManager.cleanUp();\n }\n } else {\n this.resizeManager.cleanUp();\n this.scrollSyncManager.cleanUp();\n }\n }\n\n private applyPreNodeAttributes(\n pre: HTMLPreElement,\n {\n themeStyles,\n baseThemeType,\n additionsAST,\n deletionsAST,\n totalLines,\n }: HunksRenderResult\n ): void {\n const {\n diffIndicators = 'bars',\n disableBackground = false,\n disableLineNumbers = false,\n overflow = 'scroll',\n themeType = 'system',\n diffStyle = 'split',\n } = this.options;\n const preProperties: PrePropertiesConfig = {\n diffIndicators,\n disableBackground,\n disableLineNumbers,\n overflow,\n split:\n diffStyle === 'unified'\n ? false\n : additionsAST != null && deletionsAST != null,\n themeStyles,\n themeType: baseThemeType ?? themeType,\n totalLines,\n };\n if (arePrePropertiesEqual(preProperties, this.appliedPreAttributes)) {\n return;\n }\n setPreNodeProperties(pre, preProperties);\n this.appliedPreAttributes = preProperties;\n }\n\n private applyErrorToDOM(error: Error, container: HTMLElement) {\n this.cleanupErrorWrapper();\n const pre = this.getOrCreatePreNode(container);\n pre.innerHTML = '';\n pre.parentNode?.removeChild(pre);\n this.pre = undefined;\n this.appliedPreAttributes = undefined;\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n this.errorWrapper ??= document.createElement('div');\n this.errorWrapper.dataset.errorWrapper = '';\n this.errorWrapper.innerHTML = '';\n shadowRoot.appendChild(this.errorWrapper);\n const errorMessage = document.createElement('div');\n errorMessage.dataset.errorMessage = '';\n errorMessage.innerText = error.message;\n this.errorWrapper.appendChild(errorMessage);\n const errorStack = document.createElement('pre');\n errorStack.dataset.errorStack = '';\n errorStack.innerText = error.stack ?? 'No Error Stack';\n this.errorWrapper.appendChild(errorStack);\n }\n\n private cleanupErrorWrapper() {\n this.errorWrapper?.parentNode?.removeChild(this.errorWrapper);\n this.errorWrapper = undefined;\n }\n}\n"],"mappings":"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"}
@@ -14,6 +14,7 @@ interface FileStreamOptions extends BaseCodeOptions {
14
14
  }
15
15
  declare class FileStream {
16
16
  options: FileStreamOptions;
17
+ readonly __id: string;
17
18
  private highlighter;
18
19
  private stream;
19
20
  private abortController;
@@ -1 +1 @@
1
- {"version":3,"file":"FileStream.d.ts","names":["options: FileStreamOptions"],"sources":["../../src/components/FileStream.ts"],"sourcesContent":[],"mappings":";;;;UAmBiB,iBAAA,SAA0B;SAClC;EADT,iBAAiB,CAAA,EAAA,MAAA;EACR,WAAA,EAAA,QAAA,EAGgB,UAHhB,CAAA,EAAA,OAAA;EAGgB,YAAA,EAAA,QAAA,EACC,UADD,CAAA,EAAA,OAAA;EACC,aAAA,EAAA,UAAA,EAEG,+BAFH,CAAA,EAAA,OAAA;EAEG,aAAA,EAAA,KAAA,EACL,WADK,GACS,WADT,CAAA,EAAA,OAAA;EACL,aAAA,GAAA,EAAA,OAAA;EAAc,aAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,OAAA;;AARK,cAa9B,UAAA,CAb8B;EAa3C,OAAa,EAQiB,iBARjB;EAQiB,QAAA,WAAA;EAHvB,QAAA,MAAA;EAGuB,QAAA,eAAA;EASJ,QAAA,aAAA;EA6Bb,GAAA,EAzCN,cAyCM,GAAA,SAAA;EACC,QAAA,IAAA;EACT,WAAA,CAAA,OAAA,CAAA,EAxCyB,iBAwCzB;EAAA,OAAA,CAAA,CAAA,EAAA,IAAA;0BA/BqB;;;iBA6Bb,kCACC,cACT"}
1
+ {"version":3,"file":"FileStream.d.ts","names":["options: FileStreamOptions"],"sources":["../../src/components/FileStream.ts"],"sourcesContent":[],"mappings":";;;;UAmBiB,iBAAA,SAA0B;SAClC;EADT,iBAAiB,CAAA,EAAA,MAAA;EACR,WAAA,EAAA,QAAA,EAGgB,UAHhB,CAAA,EAAA,OAAA;EAGgB,YAAA,EAAA,QAAA,EACC,UADD,CAAA,EAAA,OAAA;EACC,aAAA,EAAA,UAAA,EAEG,+BAFH,CAAA,EAAA,OAAA;EAEG,aAAA,EAAA,KAAA,EACL,WADK,GACS,WADT,CAAA,EAAA,OAAA;EACL,aAAA,GAAA,EAAA,OAAA;EAAc,aAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,OAAA;;AARK,cAe9B,UAAA,CAf8B;EAe3C,OAAa,EAUiB,iBAVjB;EAUiB,SAAA,IAAA,EAAA,MAAA;EAHvB,QAAA,WAAA;EAGuB,QAAA,MAAA;EASJ,QAAA,eAAA;EA6Bb,QAAA,aAAA;EACC,GAAA,EA1CP,cA0CO,GAAA,SAAA;EACT,QAAA,IAAA;EAAA,WAAA,CAAA,OAAA,CAAA,EAxCyB,iBAwCzB;;0BA/BqB;;;iBA6Bb,kCACC,cACT"}
@@ -3,7 +3,7 @@ import { getSharedHighlighter } from "../highlighter/shared_highlighter.js";
3
3
  import { getHighlighterOptions } from "../utils/getHighlighterOptions.js";
4
4
  import { formatCSSVariablePrefix } from "../utils/formatCSSVariablePrefix.js";
5
5
  import { getHighlighterThemeStyles } from "../utils/getHighlighterThemeStyles.js";
6
- import { createCodeNode } from "../utils/createCodeNode.js";
6
+ import { getOrCreateCodeNode } from "../utils/getOrCreateCodeNode.js";
7
7
  import { setPreNodeProperties } from "../utils/setWrapperNodeProps.js";
8
8
  import { queueRender } from "../managers/UniversalRenderingManager.js";
9
9
  import { CodeToTokenTransformStream } from "../shiki-stream/stream.js";
@@ -11,7 +11,9 @@ import { createRowNodes } from "../utils/createRowNodes.js";
11
11
  import { createSpanFromToken } from "../utils/createSpanNodeFromToken.js";
12
12
 
13
13
  //#region src/components/FileStream.ts
14
+ let instanceId = -1;
14
15
  var FileStream = class {
16
+ __id = `file-stream:${++instanceId}`;
15
17
  highlighter;
16
18
  stream;
17
19
  abortController;
@@ -68,12 +70,11 @@ var FileStream = class {
68
70
  highlighter
69
71
  });
70
72
  const baseThemeType = typeof theme === "string" ? highlighter.getTheme(theme).type : void 0;
71
- const pre = setPreNodeProperties({
73
+ const pre = setPreNodeProperties(this.pre, {
72
74
  diffIndicators: "none",
73
75
  disableBackground: true,
74
76
  disableLineNumbers,
75
77
  overflow,
76
- pre: this.pre,
77
78
  split: false,
78
79
  themeType: baseThemeType ?? themeType,
79
80
  themeStyles,
@@ -81,7 +82,10 @@ var FileStream = class {
81
82
  });
82
83
  pre.innerHTML = "";
83
84
  this.pre = pre;
84
- this.code = createCodeNode({ pre });
85
+ this.code = getOrCreateCodeNode({
86
+ code: this.code,
87
+ pre
88
+ });
85
89
  this.abortController?.abort();
86
90
  this.abortController = new AbortController();
87
91
  const { onStreamStart, onStreamClose, onStreamAbort } = this.options;
@@ -92,14 +96,14 @@ var FileStream = class {
92
96
  highlighter,
93
97
  allowRecalls: true,
94
98
  defaultColor: false,
95
- cssVariablePrefix: formatCSSVariablePrefix()
99
+ cssVariablePrefix: formatCSSVariablePrefix("token")
96
100
  }) : new CodeToTokenTransformStream({
97
101
  ...this.options,
98
102
  themes: theme,
99
103
  highlighter,
100
104
  allowRecalls: true,
101
105
  defaultColor: false,
102
- cssVariablePrefix: formatCSSVariablePrefix()
106
+ cssVariablePrefix: formatCSSVariablePrefix("token")
103
107
  })).pipeTo(new WritableStream({
104
108
  start(controller) {
105
109
  onStreamStart?.(controller);
@@ -1 +1 @@
1
- {"version":3,"file":"FileStream.js","names":["options: FileStreamOptions","linesToAppend: HTMLElement[]"],"sources":["../../src/components/FileStream.ts"],"sourcesContent":["import { DEFAULT_THEMES, DIFFS_TAG_NAME } from '../constants';\nimport { getSharedHighlighter } from '../highlighter/shared_highlighter';\nimport { queueRender } from '../managers/UniversalRenderingManager';\nimport { CodeToTokenTransformStream, type RecallToken } from '../shiki-stream';\nimport type {\n BaseCodeOptions,\n DiffsHighlighter,\n SupportedLanguages,\n ThemeTypes,\n ThemedToken,\n} from '../types';\nimport { createCodeNode } from '../utils/createCodeNode';\nimport { createRowNodes } from '../utils/createRowNodes';\nimport { createSpanFromToken } from '../utils/createSpanNodeFromToken';\nimport { formatCSSVariablePrefix } from '../utils/formatCSSVariablePrefix';\nimport { getHighlighterOptions } from '../utils/getHighlighterOptions';\nimport { getHighlighterThemeStyles } from '../utils/getHighlighterThemeStyles';\nimport { setPreNodeProperties } from '../utils/setWrapperNodeProps';\n\nexport interface FileStreamOptions extends BaseCodeOptions {\n lang?: SupportedLanguages;\n startingLineIndex?: number;\n\n onPreRender?(instance: FileStream): unknown;\n onPostRender?(instance: FileStream): unknown;\n\n onStreamStart?(controller: WritableStreamDefaultController): unknown;\n onStreamWrite?(token: ThemedToken | RecallToken): unknown;\n onStreamClose?(): unknown;\n onStreamAbort?(reason: unknown): unknown;\n}\n\nexport class FileStream {\n private highlighter: DiffsHighlighter | undefined;\n private stream: ReadableStream<string> | undefined;\n private abortController: AbortController | undefined;\n private fileContainer: HTMLElement | undefined;\n pre: HTMLPreElement | undefined;\n private code: HTMLElement | undefined;\n\n constructor(public options: FileStreamOptions = { theme: DEFAULT_THEMES }) {\n this.currentLineIndex = this.options.startingLineIndex ?? 1;\n }\n\n cleanUp(): void {\n this.abortController?.abort();\n this.abortController = undefined;\n }\n\n setThemeType(themeType: ThemeTypes): void {\n if ((this.options.themeType ?? 'system') === themeType) {\n return;\n }\n this.options = { ...this.options, themeType };\n\n // Update pre element theme mode\n if (this.pre != null) {\n switch (themeType) {\n case 'system':\n delete this.pre.dataset.themeType;\n break;\n case 'light':\n case 'dark':\n this.pre.dataset.themeType = themeType;\n break;\n }\n }\n }\n\n private async initializeHighlighter(): Promise<DiffsHighlighter> {\n this.highlighter = await getSharedHighlighter(\n getHighlighterOptions(this.options.lang, this.options)\n );\n return this.highlighter;\n }\n\n private queuedSetupArgs: [ReadableStream<string>, HTMLElement] | undefined;\n async setup(\n _source: ReadableStream<string>,\n _wrapper: HTMLElement\n ): Promise<void> {\n const isSettingUp = this.queuedSetupArgs != null;\n this.queuedSetupArgs = [_source, _wrapper];\n if (isSettingUp) {\n // TODO(amadeus): Make it so that this function can be properly\n // awaitable, maybe?\n return;\n }\n this.highlighter ??= await this.initializeHighlighter();\n\n const [source, wrapper] = this.queuedSetupArgs;\n this.queuedSetupArgs = undefined;\n\n const stream = source;\n\n this.setupStream(stream, wrapper, this.highlighter);\n }\n\n private setupStream(\n stream: ReadableStream<string>,\n wrapper: HTMLElement,\n highlighter: DiffsHighlighter\n ): void {\n const {\n disableLineNumbers = false,\n overflow = 'scroll',\n theme = DEFAULT_THEMES,\n themeType = 'system',\n } = this.options;\n const fileContainer = this.getOrCreateFileContainer();\n if (fileContainer.parentElement == null) {\n wrapper.appendChild(fileContainer);\n }\n this.pre ??= document.createElement('pre');\n if (this.pre.parentElement == null) {\n fileContainer.shadowRoot?.appendChild(this.pre);\n }\n const themeStyles = getHighlighterThemeStyles({ theme, highlighter });\n const baseThemeType =\n typeof theme === 'string' ? highlighter.getTheme(theme).type : undefined;\n const pre = setPreNodeProperties({\n diffIndicators: 'none',\n disableBackground: true,\n disableLineNumbers,\n overflow,\n pre: this.pre,\n split: false,\n themeType: baseThemeType ?? themeType,\n themeStyles,\n totalLines: 0,\n });\n pre.innerHTML = '';\n\n this.pre = pre;\n this.code = createCodeNode({ pre });\n this.abortController?.abort();\n this.abortController = new AbortController();\n const { onStreamStart, onStreamClose, onStreamAbort } = this.options;\n this.stream = stream;\n this.stream\n .pipeThrough(\n typeof theme === 'string'\n ? new CodeToTokenTransformStream({\n ...this.options,\n theme,\n highlighter,\n allowRecalls: true,\n defaultColor: false,\n cssVariablePrefix: formatCSSVariablePrefix(),\n })\n : new CodeToTokenTransformStream({\n ...this.options,\n themes: theme,\n highlighter,\n allowRecalls: true,\n defaultColor: false,\n cssVariablePrefix: formatCSSVariablePrefix(),\n })\n )\n .pipeTo(\n new WritableStream({\n start(controller) {\n onStreamStart?.(controller);\n },\n close() {\n onStreamClose?.();\n },\n abort(reason) {\n onStreamAbort?.(reason);\n },\n write: this.handleWrite,\n }),\n { signal: this.abortController.signal }\n )\n .catch((error) => {\n // Ignore AbortError - it's expected when cleaning up\n if (error.name !== 'AbortError') {\n console.error('FileStream pipe error:', error);\n }\n });\n }\n\n private queuedTokens: (ThemedToken | RecallToken)[] = [];\n private handleWrite = (token: ThemedToken | RecallToken) => {\n // If we've recalled tokens we haven't rendered yet, we can just yeet them\n // and never apply them\n if ('recall' in token && this.queuedTokens.length >= token.recall) {\n this.queuedTokens.length = this.queuedTokens.length - token.recall;\n } else {\n this.queuedTokens.push(token);\n }\n queueRender(this.render);\n this.options.onStreamWrite?.(token);\n };\n\n private currentLineIndex: number;\n private currentLineElement: HTMLElement | undefined;\n private render = () => {\n this.options.onPreRender?.(this);\n const linesToAppend: HTMLElement[] = [];\n for (const token of this.queuedTokens) {\n if ('recall' in token) {\n if (this.currentLineElement == null) {\n throw new Error(\n 'FileStream.render: no current line element, shouldnt be possible to get here'\n );\n }\n if (token.recall > this.currentLineElement.childNodes.length) {\n throw new Error(\n `FileStream.render: Token recall exceed the current line, there's probably a bug...`\n );\n }\n for (let i = 0; i < token.recall; i++) {\n this.currentLineElement.lastChild?.remove();\n }\n } else {\n const span = createSpanFromToken(token);\n if (this.currentLineElement == null) {\n linesToAppend.push(this.createLine());\n }\n this.currentLineElement?.appendChild(span);\n if (token.content === '\\n') {\n this.currentLineIndex++;\n linesToAppend.push(this.createLine());\n }\n }\n }\n for (const line of linesToAppend) {\n this.code?.appendChild(line);\n }\n this.queuedTokens.length = 0;\n this.options.onPostRender?.(this);\n };\n\n private createLine(): HTMLElement {\n const { row, content } = createRowNodes(this.currentLineIndex);\n this.currentLineElement = content;\n return row;\n }\n\n private getOrCreateFileContainer(fileContainer?: HTMLElement): HTMLElement {\n if (\n (fileContainer != null && fileContainer === this.fileContainer) ||\n (fileContainer == null && this.fileContainer != null)\n ) {\n return this.fileContainer;\n }\n this.fileContainer =\n fileContainer ?? document.createElement(DIFFS_TAG_NAME);\n return this.fileContainer;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"FileStream.js","names":["options: FileStreamOptions","linesToAppend: HTMLElement[]"],"sources":["../../src/components/FileStream.ts"],"sourcesContent":["import { DEFAULT_THEMES, DIFFS_TAG_NAME } from '../constants';\nimport { getSharedHighlighter } from '../highlighter/shared_highlighter';\nimport { queueRender } from '../managers/UniversalRenderingManager';\nimport { CodeToTokenTransformStream, type RecallToken } from '../shiki-stream';\nimport type {\n BaseCodeOptions,\n DiffsHighlighter,\n SupportedLanguages,\n ThemeTypes,\n ThemedToken,\n} from '../types';\nimport { createRowNodes } from '../utils/createRowNodes';\nimport { createSpanFromToken } from '../utils/createSpanNodeFromToken';\nimport { formatCSSVariablePrefix } from '../utils/formatCSSVariablePrefix';\nimport { getHighlighterOptions } from '../utils/getHighlighterOptions';\nimport { getHighlighterThemeStyles } from '../utils/getHighlighterThemeStyles';\nimport { getOrCreateCodeNode } from '../utils/getOrCreateCodeNode';\nimport { setPreNodeProperties } from '../utils/setWrapperNodeProps';\n\nexport interface FileStreamOptions extends BaseCodeOptions {\n lang?: SupportedLanguages;\n startingLineIndex?: number;\n\n onPreRender?(instance: FileStream): unknown;\n onPostRender?(instance: FileStream): unknown;\n\n onStreamStart?(controller: WritableStreamDefaultController): unknown;\n onStreamWrite?(token: ThemedToken | RecallToken): unknown;\n onStreamClose?(): unknown;\n onStreamAbort?(reason: unknown): unknown;\n}\n\nlet instanceId = -1;\n\nexport class FileStream {\n readonly __id: string = `file-stream:${++instanceId}`;\n\n private highlighter: DiffsHighlighter | undefined;\n private stream: ReadableStream<string> | undefined;\n private abortController: AbortController | undefined;\n private fileContainer: HTMLElement | undefined;\n pre: HTMLPreElement | undefined;\n private code: HTMLElement | undefined;\n\n constructor(public options: FileStreamOptions = { theme: DEFAULT_THEMES }) {\n this.currentLineIndex = this.options.startingLineIndex ?? 1;\n }\n\n cleanUp(): void {\n this.abortController?.abort();\n this.abortController = undefined;\n }\n\n setThemeType(themeType: ThemeTypes): void {\n if ((this.options.themeType ?? 'system') === themeType) {\n return;\n }\n this.options = { ...this.options, themeType };\n\n // Update pre element theme mode\n if (this.pre != null) {\n switch (themeType) {\n case 'system':\n delete this.pre.dataset.themeType;\n break;\n case 'light':\n case 'dark':\n this.pre.dataset.themeType = themeType;\n break;\n }\n }\n }\n\n private async initializeHighlighter(): Promise<DiffsHighlighter> {\n this.highlighter = await getSharedHighlighter(\n getHighlighterOptions(this.options.lang, this.options)\n );\n return this.highlighter;\n }\n\n private queuedSetupArgs: [ReadableStream<string>, HTMLElement] | undefined;\n async setup(\n _source: ReadableStream<string>,\n _wrapper: HTMLElement\n ): Promise<void> {\n const isSettingUp = this.queuedSetupArgs != null;\n this.queuedSetupArgs = [_source, _wrapper];\n if (isSettingUp) {\n // TODO(amadeus): Make it so that this function can be properly\n // awaitable, maybe?\n return;\n }\n this.highlighter ??= await this.initializeHighlighter();\n\n const [source, wrapper] = this.queuedSetupArgs;\n this.queuedSetupArgs = undefined;\n\n const stream = source;\n\n this.setupStream(stream, wrapper, this.highlighter);\n }\n\n private setupStream(\n stream: ReadableStream<string>,\n wrapper: HTMLElement,\n highlighter: DiffsHighlighter\n ): void {\n const {\n disableLineNumbers = false,\n overflow = 'scroll',\n theme = DEFAULT_THEMES,\n themeType = 'system',\n } = this.options;\n const fileContainer = this.getOrCreateFileContainer();\n if (fileContainer.parentElement == null) {\n wrapper.appendChild(fileContainer);\n }\n this.pre ??= document.createElement('pre');\n if (this.pre.parentElement == null) {\n fileContainer.shadowRoot?.appendChild(this.pre);\n }\n const themeStyles = getHighlighterThemeStyles({ theme, highlighter });\n const baseThemeType =\n typeof theme === 'string' ? highlighter.getTheme(theme).type : undefined;\n const pre = setPreNodeProperties(this.pre, {\n diffIndicators: 'none',\n disableBackground: true,\n disableLineNumbers,\n overflow,\n split: false,\n themeType: baseThemeType ?? themeType,\n themeStyles,\n totalLines: 0,\n });\n pre.innerHTML = '';\n\n this.pre = pre;\n this.code = getOrCreateCodeNode({ code: this.code, pre });\n this.abortController?.abort();\n this.abortController = new AbortController();\n const { onStreamStart, onStreamClose, onStreamAbort } = this.options;\n this.stream = stream;\n this.stream\n .pipeThrough(\n typeof theme === 'string'\n ? new CodeToTokenTransformStream({\n ...this.options,\n theme,\n highlighter,\n allowRecalls: true,\n defaultColor: false,\n cssVariablePrefix: formatCSSVariablePrefix('token'),\n })\n : new CodeToTokenTransformStream({\n ...this.options,\n themes: theme,\n highlighter,\n allowRecalls: true,\n defaultColor: false,\n cssVariablePrefix: formatCSSVariablePrefix('token'),\n })\n )\n .pipeTo(\n new WritableStream({\n start(controller) {\n onStreamStart?.(controller);\n },\n close() {\n onStreamClose?.();\n },\n abort(reason) {\n onStreamAbort?.(reason);\n },\n write: this.handleWrite,\n }),\n { signal: this.abortController.signal }\n )\n .catch((error) => {\n // Ignore AbortError - it's expected when cleaning up\n if (error.name !== 'AbortError') {\n console.error('FileStream pipe error:', error);\n }\n });\n }\n\n private queuedTokens: (ThemedToken | RecallToken)[] = [];\n private handleWrite = (token: ThemedToken | RecallToken) => {\n // If we've recalled tokens we haven't rendered yet, we can just yeet them\n // and never apply them\n if ('recall' in token && this.queuedTokens.length >= token.recall) {\n this.queuedTokens.length = this.queuedTokens.length - token.recall;\n } else {\n this.queuedTokens.push(token);\n }\n queueRender(this.render);\n this.options.onStreamWrite?.(token);\n };\n\n private currentLineIndex: number;\n private currentLineElement: HTMLElement | undefined;\n private render = () => {\n this.options.onPreRender?.(this);\n const linesToAppend: HTMLElement[] = [];\n for (const token of this.queuedTokens) {\n if ('recall' in token) {\n if (this.currentLineElement == null) {\n throw new Error(\n 'FileStream.render: no current line element, shouldnt be possible to get here'\n );\n }\n if (token.recall > this.currentLineElement.childNodes.length) {\n throw new Error(\n `FileStream.render: Token recall exceed the current line, there's probably a bug...`\n );\n }\n for (let i = 0; i < token.recall; i++) {\n this.currentLineElement.lastChild?.remove();\n }\n } else {\n const span = createSpanFromToken(token);\n if (this.currentLineElement == null) {\n linesToAppend.push(this.createLine());\n }\n this.currentLineElement?.appendChild(span);\n if (token.content === '\\n') {\n this.currentLineIndex++;\n linesToAppend.push(this.createLine());\n }\n }\n }\n for (const line of linesToAppend) {\n this.code?.appendChild(line);\n }\n this.queuedTokens.length = 0;\n this.options.onPostRender?.(this);\n };\n\n private createLine(): HTMLElement {\n const { row, content } = createRowNodes(this.currentLineIndex);\n this.currentLineElement = content;\n return row;\n }\n\n private getOrCreateFileContainer(fileContainer?: HTMLElement): HTMLElement {\n if (\n (fileContainer != null && fileContainer === this.fileContainer) ||\n (fileContainer == null && this.fileContainer != null)\n ) {\n return this.fileContainer;\n }\n this.fileContainer =\n fileContainer ?? document.createElement(DIFFS_TAG_NAME);\n return this.fileContainer;\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"web-components.d.ts","names":[],"sources":["../../src/components/web-components.ts"],"sourcesContent":[],"mappings":";cAsCa"}
1
+ {"version":3,"file":"web-components.d.ts","names":[],"sources":["../../src/components/web-components.ts"],"sourcesContent":[],"mappings":";cAmCa"}
@@ -11,7 +11,7 @@ if (typeof HTMLElement !== "undefined" && customElements.get(DIFFS_TAG_NAME) ==
11
11
  const shadowRoot = this.attachShadow({ mode: "open" });
12
12
  if (sheet == null) {
13
13
  sheet = new CSSStyleSheet();
14
- sheet.replaceSync(`@layer base, theme, unsafe;\n@layer base {\n${style_default}\n}`);
14
+ sheet.replaceSync(style_default);
15
15
  }
16
16
  shadowRoot.adoptedStyleSheets = [sheet];
17
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"web-components.js","names":["sheet: CSSStyleSheet | undefined","styles"],"sources":["../../src/components/web-components.ts"],"sourcesContent":["import { DIFFS_TAG_NAME } from '../constants';\nimport styles from '../style.css';\n\n// If HTMLElement is undefined it usually means we are in a server environment\n// so best to just not do anything\nif (\n typeof HTMLElement !== 'undefined' &&\n customElements.get(DIFFS_TAG_NAME) == null\n) {\n let sheet: CSSStyleSheet | undefined;\n\n class FileDiffContainer extends HTMLElement {\n constructor() {\n super();\n // If shadow root is already open, we can sorta assume the\n // CSS is already in place\n if (this.shadowRoot != null) {\n return;\n }\n const shadowRoot = this.attachShadow({ mode: 'open' });\n if (sheet == null) {\n sheet = new CSSStyleSheet();\n // Declare layer order first, then wrap base styles in @layer to match SSR behavior\n sheet.replaceSync(\n `@layer base, theme, unsafe;\\n@layer base {\\n${styles}\\n}`\n );\n }\n shadowRoot.adoptedStyleSheets = [sheet];\n }\n // Not sure if we need to do anything here yet...\n // connectedCallback() {\n // this.dataset.diffsContainer = '';\n // }\n }\n\n customElements.define(DIFFS_TAG_NAME, FileDiffContainer);\n}\n\nexport const DiffsContainerLoaded = true;\n"],"mappings":";;;;AAKA,IACE,OAAO,gBAAgB,eACvB,eAAe,IAAI,eAAe,IAAI,MACtC;CACA,IAAIA;CAEJ,MAAM,0BAA0B,YAAY;EAC1C,cAAc;AACZ,UAAO;AAGP,OAAI,KAAK,cAAc,KACrB;GAEF,MAAM,aAAa,KAAK,aAAa,EAAE,MAAM,QAAQ,CAAC;AACtD,OAAI,SAAS,MAAM;AACjB,YAAQ,IAAI,eAAe;AAE3B,UAAM,YACJ,+CAA+CC,cAAO,KACvD;;AAEH,cAAW,qBAAqB,CAAC,MAAM;;;AAQ3C,gBAAe,OAAO,gBAAgB,kBAAkB;;AAG1D,MAAa,uBAAuB"}
1
+ {"version":3,"file":"web-components.js","names":["sheet: CSSStyleSheet | undefined","styles"],"sources":["../../src/components/web-components.ts"],"sourcesContent":["import { DIFFS_TAG_NAME } from '../constants';\nimport styles from '../style.css';\n\n// If HTMLElement is undefined it usually means we are in a server environment\n// so best to just not do anything\nif (\n typeof HTMLElement !== 'undefined' &&\n customElements.get(DIFFS_TAG_NAME) == null\n) {\n let sheet: CSSStyleSheet | undefined;\n\n class FileDiffContainer extends HTMLElement {\n constructor() {\n super();\n // If shadow root is already open, we can sorta assume the\n // CSS is already in place\n if (this.shadowRoot != null) {\n return;\n }\n const shadowRoot = this.attachShadow({ mode: 'open' });\n if (sheet == null) {\n sheet = new CSSStyleSheet();\n sheet.replaceSync(styles);\n }\n shadowRoot.adoptedStyleSheets = [sheet];\n }\n // Not sure if we need to do anything here yet...\n // connectedCallback() {\n // this.dataset.diffsContainer = '';\n // }\n }\n\n customElements.define(DIFFS_TAG_NAME, FileDiffContainer);\n}\n\nexport const DiffsContainerLoaded = true;\n"],"mappings":";;;;AAKA,IACE,OAAO,gBAAgB,eACvB,eAAe,IAAI,eAAe,IAAI,MACtC;CACA,IAAIA;CAEJ,MAAM,0BAA0B,YAAY;EAC1C,cAAc;AACZ,UAAO;AAGP,OAAI,KAAK,cAAc,KACrB;GAEF,MAAM,aAAa,KAAK,aAAa,EAAE,MAAM,QAAQ,CAAC;AACtD,OAAI,SAAS,MAAM;AACjB,YAAQ,IAAI,eAAe;AAC3B,UAAM,YAAYC,cAAO;;AAE3B,cAAW,qBAAqB,CAAC,MAAM;;;AAQ3C,gBAAe,OAAO,gBAAgB,kBAAkB;;AAG1D,MAAa,uBAAuB"}
@@ -1,4 +1,4 @@
1
- import { ThemesType } from "./types.js";
1
+ import { HunkExpansionRegion, ThemesType } from "./types.js";
2
2
 
3
3
  //#region src/constants.d.ts
4
4
  declare const DIFFS_TAG_NAME: "diffs-container";
@@ -16,6 +16,12 @@ declare const HEADER_METADATA_SLOT_ID = "header-metadata";
16
16
  declare const DEFAULT_THEMES: ThemesType;
17
17
  declare const UNSAFE_CSS_ATTRIBUTE = "data-unsafe-css";
18
18
  declare const CORE_CSS_ATTRIBUTE = "data-core-css";
19
+ declare const LINE_HUNK_COUNT = 10;
20
+ declare const LINE_HEIGHT = 20;
21
+ declare const DIFF_HEADER_HEIGHT = 44;
22
+ declare const HUNK_SEPARATOR_HEIGHT = 32;
23
+ declare const FILE_GAP = 8;
24
+ declare const DEFAULT_EXPANDED_REGION: HunkExpansionRegion;
19
25
  //#endregion
20
- export { ALTERNATE_FILE_NAMES_GIT, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, DEFAULT_THEMES, DIFFS_TAG_NAME, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, FILE_MODE_FROM_INDEX, GIT_DIFF_FILE_BREAK_REGEX, HEADER_METADATA_SLOT_ID, HUNK_HEADER, SPLIT_WITH_NEWLINES, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE };
26
+ export { ALTERNATE_FILE_NAMES_GIT, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, DEFAULT_EXPANDED_REGION, DEFAULT_THEMES, DIFFS_TAG_NAME, DIFF_HEADER_HEIGHT, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, FILE_GAP, FILE_MODE_FROM_INDEX, GIT_DIFF_FILE_BREAK_REGEX, HEADER_METADATA_SLOT_ID, HUNK_HEADER, HUNK_SEPARATOR_HEIGHT, LINE_HEIGHT, LINE_HUNK_COUNT, SPLIT_WITH_NEWLINES, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE };
21
27
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","names":["COMMIT_METADATA_SPLIT: RegExp","GIT_DIFF_FILE_BREAK_REGEX: RegExp","UNIFIED_DIFF_FILE_BREAK_REGEX: RegExp","FILE_CONTEXT_BLOB: RegExp","HUNK_HEADER: RegExp","SPLIT_WITH_NEWLINES: RegExp","FILENAME_HEADER_REGEX: RegExp","FILENAME_HEADER_REGEX_GIT: RegExp","ALTERNATE_FILE_NAMES_GIT: RegExp","FILE_MODE_FROM_INDEX: RegExp","DEFAULT_THEMES: ThemesType"],"sources":["../src/constants.ts"],"sourcesContent":[],"mappings":";;;cAEa;cAGAA,uBAAuB;AAHvB,cAIAC,yBAJiB,EAIU,MAJV;AAGjBD,cAEAE,6BAFuB,EAEQ,MAFR;AACvBD,cAEAE,iBAF2B,EAER,MAFQ;AAC3BD,cAEAE,WAFAF,EAEa,MAFkB;AAC/BC,cAGAE,mBAHmB,EAGE,MAHF;AACnBD,cAGAE,qBAHa,EAGU,MAHV;AAEbD,cAEAE,yBAFqB,EAEM,MAFN;AACrBD,cAGAE,wBAHuB,EAGG,MAHH;AACvBD,cAIAE,oBAJ2B,EAIL,MAJK;AAE3BD,cAKA,uBAAA,GAL0B,iBAAA;AAE1BC,cAKAC,cALsB,EAKN,UALM;AAGtB,cAOA,oBAAA,GAPA,iBAAA;AAEAA,cAMA,kBAAA,GANgB,eAAA"}
1
+ {"version":3,"file":"constants.d.ts","names":["COMMIT_METADATA_SPLIT: RegExp","GIT_DIFF_FILE_BREAK_REGEX: RegExp","UNIFIED_DIFF_FILE_BREAK_REGEX: RegExp","FILE_CONTEXT_BLOB: RegExp","HUNK_HEADER: RegExp","SPLIT_WITH_NEWLINES: RegExp","FILENAME_HEADER_REGEX: RegExp","FILENAME_HEADER_REGEX_GIT: RegExp","ALTERNATE_FILE_NAMES_GIT: RegExp","FILE_MODE_FROM_INDEX: RegExp","DEFAULT_THEMES: ThemesType","DEFAULT_EXPANDED_REGION: HunkExpansionRegion"],"sources":["../src/constants.ts"],"sourcesContent":[],"mappings":";;;cAEa;cAGAA,uBAAuB;AAHvB,cAIAC,yBAJiB,EAIU,MAJV;AAGjBD,cAEAE,6BAFuB,EAEQ,MAFR;AACvBD,cAEAE,iBAF2B,EAER,MAFQ;AAC3BD,cAEAE,WAFAF,EAEa,MAFkB;AAC/BC,cAGAE,mBAHmB,EAGE,MAHF;AACnBD,cAGAE,qBAHa,EAGU,MAHV;AAEbD,cAEAE,yBAFqB,EAEM,MAFN;AACrBD,cAGAE,wBAHuB,EAGG,MAHH;AACvBD,cAIAE,oBAJ2B,EAIL,MAJK;AAE3BD,cAKA,uBAAA,GAL0B,iBAAA;AAE1BC,cAKAC,cALsB,EAKN,UALM;AAGtB,cAOA,oBAAA,GAPA,iBAAA;AAEAA,cAMA,kBAAA,GANgB,eAAA;AAKhB,cAIA,eAAA,GAJA,EAAA;AACA,cAIA,WAAA,GAJA,EAAA;AAGA,cAEA,kBAAA,GAFA,EAAA;AACA,cAEA,qBAAA,GAFA,EAAA;AACA,cAEA,QAAA,GAFA,CAAA;AACA,cAGAC,uBAHA,EAGyB,mBAHzB"}
package/dist/constants.js CHANGED
@@ -17,7 +17,16 @@ const DEFAULT_THEMES = {
17
17
  };
18
18
  const UNSAFE_CSS_ATTRIBUTE = "data-unsafe-css";
19
19
  const CORE_CSS_ATTRIBUTE = "data-core-css";
20
+ const LINE_HUNK_COUNT = 10;
21
+ const LINE_HEIGHT = 20;
22
+ const DIFF_HEADER_HEIGHT = 44;
23
+ const HUNK_SEPARATOR_HEIGHT = 32;
24
+ const FILE_GAP = 8;
25
+ const DEFAULT_EXPANDED_REGION = Object.freeze({
26
+ fromStart: 0,
27
+ fromEnd: 0
28
+ });
20
29
 
21
30
  //#endregion
22
- export { ALTERNATE_FILE_NAMES_GIT, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, DEFAULT_THEMES, DIFFS_TAG_NAME, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, FILE_MODE_FROM_INDEX, GIT_DIFF_FILE_BREAK_REGEX, HEADER_METADATA_SLOT_ID, HUNK_HEADER, SPLIT_WITH_NEWLINES, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE };
31
+ export { ALTERNATE_FILE_NAMES_GIT, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, DEFAULT_EXPANDED_REGION, DEFAULT_THEMES, DIFFS_TAG_NAME, DIFF_HEADER_HEIGHT, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, FILE_GAP, FILE_MODE_FROM_INDEX, GIT_DIFF_FILE_BREAK_REGEX, HEADER_METADATA_SLOT_ID, HUNK_HEADER, HUNK_SEPARATOR_HEIGHT, LINE_HEIGHT, LINE_HUNK_COUNT, SPLIT_WITH_NEWLINES, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE };
23
32
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","names":["COMMIT_METADATA_SPLIT: RegExp","GIT_DIFF_FILE_BREAK_REGEX: RegExp","UNIFIED_DIFF_FILE_BREAK_REGEX: RegExp","FILE_CONTEXT_BLOB: RegExp","HUNK_HEADER: RegExp","SPLIT_WITH_NEWLINES: RegExp","FILENAME_HEADER_REGEX: RegExp","FILENAME_HEADER_REGEX_GIT: RegExp","ALTERNATE_FILE_NAMES_GIT: RegExp","FILE_MODE_FROM_INDEX: RegExp","DEFAULT_THEMES: ThemesType"],"sources":["../src/constants.ts"],"sourcesContent":["import type { ThemesType } from './types';\n\nexport const DIFFS_TAG_NAME = 'diffs-container' as const;\n\n// Misc patch/content parsing regexes\nexport const COMMIT_METADATA_SPLIT: RegExp = /(?=^From [a-f0-9]+ .+$)/m;\nexport const GIT_DIFF_FILE_BREAK_REGEX: RegExp = /(?=^diff --git)/gm;\nexport const UNIFIED_DIFF_FILE_BREAK_REGEX: RegExp = /(?=^---\\s+\\S)/gm;\nexport const FILE_CONTEXT_BLOB: RegExp = /(?=^@@ )/gm;\nexport const HUNK_HEADER: RegExp =\n /^@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@(?: (.*))?/m;\nexport const SPLIT_WITH_NEWLINES: RegExp = /(?<=\\n)/;\nexport const FILENAME_HEADER_REGEX: RegExp = /^(---|\\+\\+\\+)\\s+([^\\t\\r\\n]+)/;\nexport const FILENAME_HEADER_REGEX_GIT: RegExp =\n /^(---|\\+\\+\\+)\\s+[ab]\\/([^\\t\\r\\n]+)/;\nexport const ALTERNATE_FILE_NAMES_GIT: RegExp =\n /^diff --git (?:\"a\\/(.+?)\"|a\\/(.+?)) (?:\"b\\/(.+?)\"|b\\/(.+?))$/;\nexport const FILE_MODE_FROM_INDEX: RegExp =\n /^index (?:[0-9a-f]+)\\.\\.(?:[0-9a-f]+)(?: (\\d+))?/;\n\nexport const HEADER_METADATA_SLOT_ID = 'header-metadata';\n\nexport const DEFAULT_THEMES: ThemesType = {\n dark: 'pierre-dark',\n light: 'pierre-light',\n};\n\nexport const UNSAFE_CSS_ATTRIBUTE = 'data-unsafe-css';\nexport const CORE_CSS_ATTRIBUTE = 'data-core-css';\n"],"mappings":";AAEA,MAAa,iBAAiB;AAG9B,MAAaA,wBAAgC;AAC7C,MAAaC,4BAAoC;AACjD,MAAaC,gCAAwC;AACrD,MAAaC,oBAA4B;AACzC,MAAaC,cACX;AACF,MAAaC,sBAA8B;AAC3C,MAAaC,wBAAgC;AAC7C,MAAaC,4BACX;AACF,MAAaC,2BACX;AACF,MAAaC,uBACX;AAEF,MAAa,0BAA0B;AAEvC,MAAaC,iBAA6B;CACxC,MAAM;CACN,OAAO;CACR;AAED,MAAa,uBAAuB;AACpC,MAAa,qBAAqB"}
1
+ {"version":3,"file":"constants.js","names":["COMMIT_METADATA_SPLIT: RegExp","GIT_DIFF_FILE_BREAK_REGEX: RegExp","UNIFIED_DIFF_FILE_BREAK_REGEX: RegExp","FILE_CONTEXT_BLOB: RegExp","HUNK_HEADER: RegExp","SPLIT_WITH_NEWLINES: RegExp","FILENAME_HEADER_REGEX: RegExp","FILENAME_HEADER_REGEX_GIT: RegExp","ALTERNATE_FILE_NAMES_GIT: RegExp","FILE_MODE_FROM_INDEX: RegExp","DEFAULT_THEMES: ThemesType","DEFAULT_EXPANDED_REGION: HunkExpansionRegion"],"sources":["../src/constants.ts"],"sourcesContent":["import type { HunkExpansionRegion, ThemesType } from './types';\n\nexport const DIFFS_TAG_NAME = 'diffs-container' as const;\n\n// Misc patch/content parsing regexes\nexport const COMMIT_METADATA_SPLIT: RegExp = /(?=^From [a-f0-9]+ .+$)/m;\nexport const GIT_DIFF_FILE_BREAK_REGEX: RegExp = /(?=^diff --git)/gm;\nexport const UNIFIED_DIFF_FILE_BREAK_REGEX: RegExp = /(?=^---\\s+\\S)/gm;\nexport const FILE_CONTEXT_BLOB: RegExp = /(?=^@@ )/gm;\nexport const HUNK_HEADER: RegExp =\n /^@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@(?: (.*))?/m;\nexport const SPLIT_WITH_NEWLINES: RegExp = /(?<=\\n)/;\nexport const FILENAME_HEADER_REGEX: RegExp = /^(---|\\+\\+\\+)\\s+([^\\t\\r\\n]+)/;\nexport const FILENAME_HEADER_REGEX_GIT: RegExp =\n /^(---|\\+\\+\\+)\\s+[ab]\\/([^\\t\\r\\n]+)/;\nexport const ALTERNATE_FILE_NAMES_GIT: RegExp =\n /^diff --git (?:\"a\\/(.+?)\"|a\\/(.+?)) (?:\"b\\/(.+?)\"|b\\/(.+?))$/;\nexport const FILE_MODE_FROM_INDEX: RegExp =\n /^index (?:[0-9a-f]+)\\.\\.(?:[0-9a-f]+)(?: (\\d+))?/;\n\nexport const HEADER_METADATA_SLOT_ID = 'header-metadata';\n\nexport const DEFAULT_THEMES: ThemesType = {\n dark: 'pierre-dark',\n light: 'pierre-light',\n};\n\nexport const UNSAFE_CSS_ATTRIBUTE = 'data-unsafe-css';\nexport const CORE_CSS_ATTRIBUTE = 'data-core-css';\n\n// FIXME(amadeus): This will need to be configurable\nexport const LINE_HUNK_COUNT = 10;\nexport const LINE_HEIGHT = 20;\nexport const DIFF_HEADER_HEIGHT = 44;\nexport const HUNK_SEPARATOR_HEIGHT = 32;\nexport const FILE_GAP = 8;\n\nexport const DEFAULT_EXPANDED_REGION: HunkExpansionRegion = Object.freeze({\n fromStart: 0,\n fromEnd: 0,\n});\n"],"mappings":";AAEA,MAAa,iBAAiB;AAG9B,MAAaA,wBAAgC;AAC7C,MAAaC,4BAAoC;AACjD,MAAaC,gCAAwC;AACrD,MAAaC,oBAA4B;AACzC,MAAaC,cACX;AACF,MAAaC,sBAA8B;AAC3C,MAAaC,wBAAgC;AAC7C,MAAaC,4BACX;AACF,MAAaC,2BACX;AACF,MAAaC,uBACX;AAEF,MAAa,0BAA0B;AAEvC,MAAaC,iBAA6B;CACxC,MAAM;CACN,OAAO;CACR;AAED,MAAa,uBAAuB;AACpC,MAAa,qBAAqB;AAGlC,MAAa,kBAAkB;AAC/B,MAAa,cAAc;AAC3B,MAAa,qBAAqB;AAClC,MAAa,wBAAwB;AACrC,MAAa,WAAW;AAExB,MAAaC,0BAA+C,OAAO,OAAO;CACxE,WAAW;CACX,SAAS;CACV,CAAC"}
@@ -3,7 +3,7 @@ import { ResolvedLanguage } from "../../worker/types.js";
3
3
  import "../../worker/index.js";
4
4
 
5
5
  //#region src/highlighter/languages/getResolvedOrResolveLanguage.d.ts
6
- declare function getResolvedOrResolveLanguage(language: Exclude<SupportedLanguages, "text">): ResolvedLanguage | Promise<ResolvedLanguage>;
6
+ declare function getResolvedOrResolveLanguage(language: Exclude<SupportedLanguages, "text" | "ansi">): ResolvedLanguage | Promise<ResolvedLanguage>;
7
7
  //#endregion
8
8
  export { getResolvedOrResolveLanguage };
9
9
  //# sourceMappingURL=getResolvedOrResolveLanguage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getResolvedOrResolveLanguage.d.ts","names":[],"sources":["../../../src/highlighter/languages/getResolvedOrResolveLanguage.ts"],"sourcesContent":[],"mappings":";;;;;iBAKgB,4BAAA,WACJ,QAAQ,8BACjB,mBAAmB,QAAQ"}
1
+ {"version":3,"file":"getResolvedOrResolveLanguage.d.ts","names":[],"sources":["../../../src/highlighter/languages/getResolvedOrResolveLanguage.ts"],"sourcesContent":[],"mappings":";;;;;iBAKgB,4BAAA,WACJ,QAAQ,uCACjB,mBAAmB,QAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"getResolvedOrResolveLanguage.js","names":[],"sources":["../../../src/highlighter/languages/getResolvedOrResolveLanguage.ts"],"sourcesContent":["import type { SupportedLanguages } from '../../types';\nimport type { ResolvedLanguage } from '../../worker';\nimport { ResolvedLanguages } from './constants';\nimport { resolveLanguage } from './resolveLanguage';\n\nexport function getResolvedOrResolveLanguage(\n language: Exclude<SupportedLanguages, 'text'>\n): ResolvedLanguage | Promise<ResolvedLanguage> {\n return ResolvedLanguages.get(language) ?? resolveLanguage(language);\n}\n"],"mappings":";;;;AAKA,SAAgB,6BACd,UAC8C;AAC9C,QAAO,kBAAkB,IAAI,SAAS,IAAI,gBAAgB,SAAS"}
1
+ {"version":3,"file":"getResolvedOrResolveLanguage.js","names":[],"sources":["../../../src/highlighter/languages/getResolvedOrResolveLanguage.ts"],"sourcesContent":["import type { SupportedLanguages } from '../../types';\nimport type { ResolvedLanguage } from '../../worker';\nimport { ResolvedLanguages } from './constants';\nimport { resolveLanguage } from './resolveLanguage';\n\nexport function getResolvedOrResolveLanguage(\n language: Exclude<SupportedLanguages, 'text' | 'ansi'>\n): ResolvedLanguage | Promise<ResolvedLanguage> {\n return ResolvedLanguages.get(language) ?? resolveLanguage(language);\n}\n"],"mappings":";;;;AAKA,SAAgB,6BACd,UAC8C;AAC9C,QAAO,kBAAkB,IAAI,SAAS,IAAI,gBAAgB,SAAS"}
@@ -3,7 +3,7 @@ import { ResolvedLanguage } from "../../worker/types.js";
3
3
  import "../../worker/index.js";
4
4
 
5
5
  //#region src/highlighter/languages/resolveLanguage.d.ts
6
- declare function resolveLanguage(lang: Exclude<SupportedLanguages, "text">): Promise<ResolvedLanguage>;
6
+ declare function resolveLanguage(lang: Exclude<SupportedLanguages, "text" | "ansi">): Promise<ResolvedLanguage>;
7
7
  //#endregion
8
8
  export { resolveLanguage };
9
9
  //# sourceMappingURL=resolveLanguage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolveLanguage.d.ts","names":[],"sources":["../../../src/highlighter/languages/resolveLanguage.ts"],"sourcesContent":[],"mappings":";;;;;iBAOsB,eAAA,OACd,QAAQ,8BACb,QAAQ"}
1
+ {"version":3,"file":"resolveLanguage.d.ts","names":[],"sources":["../../../src/highlighter/languages/resolveLanguage.ts"],"sourcesContent":[],"mappings":";;;;;iBAOsB,eAAA,OACd,QAAQ,uCACb,QAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"resolveLanguage.js","names":["resolver"],"sources":["../../../src/highlighter/languages/resolveLanguage.ts"],"sourcesContent":["import { bundledLanguages } from 'shiki';\n\nimport type { SupportedLanguages } from '../../types';\nimport { isWorkerContext } from '../../utils/isWorkerContext';\nimport type { ResolvedLanguage } from '../../worker';\nimport { ResolvedLanguages, ResolvingLanguages } from './constants';\n\nexport async function resolveLanguage(\n lang: Exclude<SupportedLanguages, 'text'>\n): Promise<ResolvedLanguage> {\n // Prevent dynamic imports in worker contexts\n if (isWorkerContext()) {\n throw new Error(\n `resolveLanguage(\"${lang}\") cannot be called from a worker context. ` +\n 'Languages must be pre-resolved on the main thread and passed to the worker via the resolvedLanguages parameter.'\n );\n }\n\n const resolver = ResolvingLanguages.get(lang);\n if (resolver != null) {\n return resolver;\n }\n\n try {\n const loader = bundledLanguages[lang];\n if (loader == null) {\n throw new Error(\n `resolveLanguage: \"${lang}\" not found in bundled languages`\n );\n }\n\n const resolver = loader().then(({ default: data }) => {\n const resolvedLang = { name: lang, data };\n if (!ResolvedLanguages.has(lang)) {\n ResolvedLanguages.set(lang, resolvedLang);\n }\n return resolvedLang;\n });\n ResolvingLanguages.set(lang, resolver);\n return await resolver;\n } finally {\n ResolvingLanguages.delete(lang);\n }\n}\n"],"mappings":";;;;;AAOA,eAAsB,gBACpB,MAC2B;AAE3B,KAAI,iBAAiB,CACnB,OAAM,IAAI,MACR,oBAAoB,KAAK,4JAE1B;CAGH,MAAM,WAAW,mBAAmB,IAAI,KAAK;AAC7C,KAAI,YAAY,KACd,QAAO;AAGT,KAAI;EACF,MAAM,SAAS,iBAAiB;AAChC,MAAI,UAAU,KACZ,OAAM,IAAI,MACR,qBAAqB,KAAK,kCAC3B;EAGH,MAAMA,aAAW,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW;GACpD,MAAM,eAAe;IAAE,MAAM;IAAM;IAAM;AACzC,OAAI,CAAC,kBAAkB,IAAI,KAAK,CAC9B,mBAAkB,IAAI,MAAM,aAAa;AAE3C,UAAO;IACP;AACF,qBAAmB,IAAI,MAAMA,WAAS;AACtC,SAAO,MAAMA;WACL;AACR,qBAAmB,OAAO,KAAK"}
1
+ {"version":3,"file":"resolveLanguage.js","names":["resolver"],"sources":["../../../src/highlighter/languages/resolveLanguage.ts"],"sourcesContent":["import { bundledLanguages } from 'shiki';\n\nimport type { SupportedLanguages } from '../../types';\nimport { isWorkerContext } from '../../utils/isWorkerContext';\nimport type { ResolvedLanguage } from '../../worker';\nimport { ResolvedLanguages, ResolvingLanguages } from './constants';\n\nexport async function resolveLanguage(\n lang: Exclude<SupportedLanguages, 'text' | 'ansi'>\n): Promise<ResolvedLanguage> {\n // Prevent dynamic imports in worker contexts\n if (isWorkerContext()) {\n throw new Error(\n `resolveLanguage(\"${lang}\") cannot be called from a worker context. ` +\n 'Languages must be pre-resolved on the main thread and passed to the worker via the resolvedLanguages parameter.'\n );\n }\n\n const resolver = ResolvingLanguages.get(lang);\n if (resolver != null) {\n return resolver;\n }\n\n try {\n const loader = bundledLanguages[lang];\n if (loader == null) {\n throw new Error(\n `resolveLanguage: \"${lang}\" not found in bundled languages`\n );\n }\n\n const resolver = loader().then(({ default: data }) => {\n const resolvedLang = { name: lang, data };\n if (!ResolvedLanguages.has(lang)) {\n ResolvedLanguages.set(lang, resolvedLang);\n }\n return resolvedLang;\n });\n ResolvingLanguages.set(lang, resolver);\n return await resolver;\n } finally {\n ResolvingLanguages.delete(lang);\n }\n}\n"],"mappings":";;;;;AAOA,eAAsB,gBACpB,MAC2B;AAE3B,KAAI,iBAAiB,CACnB,OAAM,IAAI,MACR,oBAAoB,KAAK,4JAE1B;CAGH,MAAM,WAAW,mBAAmB,IAAI,KAAK;AAC7C,KAAI,YAAY,KACd,QAAO;AAGT,KAAI;EACF,MAAM,SAAS,iBAAiB;AAChC,MAAI,UAAU,KACZ,OAAM,IAAI,MACR,qBAAqB,KAAK,kCAC3B;EAGH,MAAMA,aAAW,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW;GACpD,MAAM,eAAe;IAAE,MAAM;IAAM;IAAM;AACzC,OAAI,CAAC,kBAAkB,IAAI,KAAK,CAC9B,mBAAkB,IAAI,MAAM,aAAa;AAE3C,UAAO;IACP;AACF,qBAAmB,IAAI,MAAMA,WAAS;AACtC,SAAO,MAAMA;WACL;AACR,qBAAmB,OAAO,KAAK"}
@@ -6,7 +6,7 @@ async function resolveLanguages(languages) {
6
6
  const resolvedLanguages = [];
7
7
  const languagesToResolve = [];
8
8
  for (const language of languages) {
9
- if (language === "text") continue;
9
+ if (language === "text" || language === "ansi") continue;
10
10
  const maybeResolvedLanguage = getResolvedOrResolveLanguage(language) ?? resolveLanguage(language);
11
11
  if ("then" in maybeResolvedLanguage) languagesToResolve.push(maybeResolvedLanguage);
12
12
  else resolvedLanguages.push(maybeResolvedLanguage);
@@ -1 +1 @@
1
- {"version":3,"file":"resolveLanguages.js","names":["resolvedLanguages: ResolvedLanguage[]","languagesToResolve: Promise<ResolvedLanguage | undefined>[]"],"sources":["../../../src/highlighter/languages/resolveLanguages.ts"],"sourcesContent":["import type { SupportedLanguages } from '../../types';\nimport type { ResolvedLanguage } from '../../worker';\nimport { getResolvedOrResolveLanguage } from './getResolvedOrResolveLanguage';\nimport { resolveLanguage } from './resolveLanguage';\n\nexport async function resolveLanguages(\n languages: SupportedLanguages[]\n): Promise<ResolvedLanguage[]> {\n const resolvedLanguages: ResolvedLanguage[] = [];\n const languagesToResolve: Promise<ResolvedLanguage | undefined>[] = [];\n for (const language of languages) {\n if (language === 'text') continue;\n const maybeResolvedLanguage =\n getResolvedOrResolveLanguage(language) ?? resolveLanguage(language);\n if ('then' in maybeResolvedLanguage) {\n languagesToResolve.push(maybeResolvedLanguage);\n } else {\n resolvedLanguages.push(maybeResolvedLanguage);\n }\n }\n if (languagesToResolve.length > 0) {\n await Promise.all(languagesToResolve).then((_resolvedLanguages) => {\n for (const resolvedLanguage of _resolvedLanguages) {\n if (resolvedLanguage == null) {\n throw new Error('resolvedLanguages: unable to resolve language');\n }\n resolvedLanguages.push(resolvedLanguage);\n }\n });\n }\n\n return resolvedLanguages;\n}\n"],"mappings":";;;;AAKA,eAAsB,iBACpB,WAC6B;CAC7B,MAAMA,oBAAwC,EAAE;CAChD,MAAMC,qBAA8D,EAAE;AACtE,MAAK,MAAM,YAAY,WAAW;AAChC,MAAI,aAAa,OAAQ;EACzB,MAAM,wBACJ,6BAA6B,SAAS,IAAI,gBAAgB,SAAS;AACrE,MAAI,UAAU,sBACZ,oBAAmB,KAAK,sBAAsB;MAE9C,mBAAkB,KAAK,sBAAsB;;AAGjD,KAAI,mBAAmB,SAAS,EAC9B,OAAM,QAAQ,IAAI,mBAAmB,CAAC,MAAM,uBAAuB;AACjE,OAAK,MAAM,oBAAoB,oBAAoB;AACjD,OAAI,oBAAoB,KACtB,OAAM,IAAI,MAAM,gDAAgD;AAElE,qBAAkB,KAAK,iBAAiB;;GAE1C;AAGJ,QAAO"}
1
+ {"version":3,"file":"resolveLanguages.js","names":["resolvedLanguages: ResolvedLanguage[]","languagesToResolve: Promise<ResolvedLanguage | undefined>[]"],"sources":["../../../src/highlighter/languages/resolveLanguages.ts"],"sourcesContent":["import type { SupportedLanguages } from '../../types';\nimport type { ResolvedLanguage } from '../../worker';\nimport { getResolvedOrResolveLanguage } from './getResolvedOrResolveLanguage';\nimport { resolveLanguage } from './resolveLanguage';\n\nexport async function resolveLanguages(\n languages: SupportedLanguages[]\n): Promise<ResolvedLanguage[]> {\n const resolvedLanguages: ResolvedLanguage[] = [];\n const languagesToResolve: Promise<ResolvedLanguage | undefined>[] = [];\n for (const language of languages) {\n if (language === 'text' || language === 'ansi') continue;\n const maybeResolvedLanguage =\n getResolvedOrResolveLanguage(language) ?? resolveLanguage(language);\n if ('then' in maybeResolvedLanguage) {\n languagesToResolve.push(maybeResolvedLanguage);\n } else {\n resolvedLanguages.push(maybeResolvedLanguage);\n }\n }\n if (languagesToResolve.length > 0) {\n await Promise.all(languagesToResolve).then((_resolvedLanguages) => {\n for (const resolvedLanguage of _resolvedLanguages) {\n if (resolvedLanguage == null) {\n throw new Error('resolvedLanguages: unable to resolve language');\n }\n resolvedLanguages.push(resolvedLanguage);\n }\n });\n }\n\n return resolvedLanguages;\n}\n"],"mappings":";;;;AAKA,eAAsB,iBACpB,WAC6B;CAC7B,MAAMA,oBAAwC,EAAE;CAChD,MAAMC,qBAA8D,EAAE;AACtE,MAAK,MAAM,YAAY,WAAW;AAChC,MAAI,aAAa,UAAU,aAAa,OAAQ;EAChD,MAAM,wBACJ,6BAA6B,SAAS,IAAI,gBAAgB,SAAS;AACrE,MAAI,UAAU,sBACZ,oBAAmB,KAAK,sBAAsB;MAE9C,mBAAkB,KAAK,sBAAsB;;AAGjD,KAAI,mBAAmB,SAAS,EAC9B,OAAM,QAAQ,IAAI,mBAAmB,CAAC,MAAM,uBAAuB;AACjE,OAAK,MAAM,oBAAoB,oBAAoB;AACjD,OAAI,oBAAoB,KACtB,OAAM,IAAI,MAAM,gDAAgD;AAElE,qBAAkB,KAAK,iBAAiB;;GAE1C;AAGJ,QAAO"}
@@ -19,7 +19,7 @@ async function getSharedHighlighter({ themes, langs }) {
19
19
  highlighter = instance;
20
20
  const languageLoaders = [];
21
21
  for (const language of langs) {
22
- if (language === "text") continue;
22
+ if (language === "text" || language === "ansi") continue;
23
23
  const maybeResolvedLanguage = getResolvedOrResolveLanguage(language);
24
24
  if ("then" in maybeResolvedLanguage) languageLoaders.push(maybeResolvedLanguage);
25
25
  else attachResolvedLanguages(maybeResolvedLanguage, instance);
@@ -1 +1 @@
1
- {"version":3,"file":"shared_highlighter.js","names":["highlighter: CachedOrLoadingHighlighterType","languageLoaders: Promise<ResolvedLanguage>[]","themeLoaders: Promise<ThemeRegistrationResolved>[]","themes"],"sources":["../../src/highlighter/shared_highlighter.ts"],"sourcesContent":["import { createHighlighter, createJavaScriptRegexEngine } from 'shiki';\n\nimport type {\n DiffsHighlighter,\n DiffsThemeNames,\n SupportedLanguages,\n ThemeRegistrationResolved,\n} from '../types';\nimport type { ResolvedLanguage } from '../worker/types';\nimport { attachResolvedLanguages } from './languages/attachResolvedLanguages';\nimport { cleanUpResolvedLanguages } from './languages/cleanUpResolvedLanguages';\nimport { getResolvedOrResolveLanguage } from './languages/getResolvedOrResolveLanguage';\nimport { attachResolvedThemes } from './themes/attachResolvedThemes';\nimport { cleanUpResolvedThemes } from './themes/cleanUpResolvedThemes';\nimport { getResolvedOrResolveTheme } from './themes/getResolvedOrResolveTheme';\nimport { registerCustomTheme } from './themes/registerCustomTheme';\n\ntype CachedOrLoadingHighlighterType =\n | Promise<DiffsHighlighter>\n | DiffsHighlighter\n | undefined;\n\nlet highlighter: CachedOrLoadingHighlighterType;\n\ninterface HighlighterOptions {\n themes: DiffsThemeNames[];\n langs: SupportedLanguages[];\n}\n\nexport async function getSharedHighlighter({\n themes,\n langs,\n}: HighlighterOptions): Promise<DiffsHighlighter> {\n highlighter ??= createHighlighter({\n themes: [],\n langs: ['text'],\n engine: createJavaScriptRegexEngine(),\n }) as Promise<DiffsHighlighter>;\n\n const instance = isHighlighterLoading(highlighter)\n ? await highlighter\n : highlighter;\n highlighter = instance;\n\n const languageLoaders: Promise<ResolvedLanguage>[] = [];\n for (const language of langs) {\n if (language === 'text') continue;\n const maybeResolvedLanguage = getResolvedOrResolveLanguage(language);\n if ('then' in maybeResolvedLanguage) {\n languageLoaders.push(maybeResolvedLanguage);\n } else {\n attachResolvedLanguages(maybeResolvedLanguage, instance);\n }\n }\n\n const themeLoaders: Promise<ThemeRegistrationResolved>[] = [];\n for (const themeName of themes) {\n const maybeResolvedTheme = getResolvedOrResolveTheme(themeName);\n if ('then' in maybeResolvedTheme) {\n themeLoaders.push(maybeResolvedTheme);\n } else {\n attachResolvedThemes(maybeResolvedTheme, highlighter);\n }\n }\n\n // If we need to load any languages or themes, lets do that now\n if (languageLoaders.length > 0 || themeLoaders.length > 0) {\n await Promise.all([\n Promise.all(languageLoaders).then((languages) => {\n attachResolvedLanguages(languages, instance);\n }),\n Promise.all(themeLoaders).then((themes) => {\n attachResolvedThemes(themes, instance);\n }),\n ]);\n }\n\n return instance;\n}\n\nexport function isHighlighterLoaded(\n h: CachedOrLoadingHighlighterType = highlighter\n): h is DiffsHighlighter {\n return h != null && !('then' in h);\n}\n\nexport function getHighlighterIfLoaded(): DiffsHighlighter | undefined {\n if (highlighter != null && !('then' in highlighter)) {\n return highlighter;\n }\n return undefined;\n}\n\nexport function isHighlighterLoading(\n h: CachedOrLoadingHighlighterType = highlighter\n): h is Promise<DiffsHighlighter> {\n return h != null && 'then' in h;\n}\n\nexport function isHighlighterNull(\n h: CachedOrLoadingHighlighterType = highlighter\n): h is undefined {\n return h == null;\n}\n\nexport async function preloadHighlighter(\n options: HighlighterOptions\n): Promise<void> {\n return void (await getSharedHighlighter(options));\n}\n\nexport async function disposeHighlighter(): Promise<void> {\n if (highlighter == null) return;\n (await highlighter).dispose();\n cleanUpResolvedLanguages();\n cleanUpResolvedThemes();\n highlighter = undefined;\n}\n\nregisterCustomTheme('pierre-dark', () => {\n return import(\n '../themes/pierre-dark.json'\n ) as unknown as Promise<ThemeRegistrationResolved>;\n});\n\nregisterCustomTheme('pierre-light', () => {\n return import(\n '../themes/pierre-light.json'\n ) as unknown as Promise<ThemeRegistrationResolved>;\n});\n"],"mappings":";;;;;;;;;;AAsBA,IAAIA;AAOJ,eAAsB,qBAAqB,EACzC,QACA,SACgD;AAChD,iBAAgB,kBAAkB;EAChC,QAAQ,EAAE;EACV,OAAO,CAAC,OAAO;EACf,QAAQ,6BAA6B;EACtC,CAAC;CAEF,MAAM,WAAW,qBAAqB,YAAY,GAC9C,MAAM,cACN;AACJ,eAAc;CAEd,MAAMC,kBAA+C,EAAE;AACvD,MAAK,MAAM,YAAY,OAAO;AAC5B,MAAI,aAAa,OAAQ;EACzB,MAAM,wBAAwB,6BAA6B,SAAS;AACpE,MAAI,UAAU,sBACZ,iBAAgB,KAAK,sBAAsB;MAE3C,yBAAwB,uBAAuB,SAAS;;CAI5D,MAAMC,eAAqD,EAAE;AAC7D,MAAK,MAAM,aAAa,QAAQ;EAC9B,MAAM,qBAAqB,0BAA0B,UAAU;AAC/D,MAAI,UAAU,mBACZ,cAAa,KAAK,mBAAmB;MAErC,sBAAqB,oBAAoB,YAAY;;AAKzD,KAAI,gBAAgB,SAAS,KAAK,aAAa,SAAS,EACtD,OAAM,QAAQ,IAAI,CAChB,QAAQ,IAAI,gBAAgB,CAAC,MAAM,cAAc;AAC/C,0BAAwB,WAAW,SAAS;GAC5C,EACF,QAAQ,IAAI,aAAa,CAAC,MAAM,aAAW;AACzC,uBAAqBC,UAAQ,SAAS;GACtC,CACH,CAAC;AAGJ,QAAO;;AAGT,SAAgB,oBACd,IAAoC,aACb;AACvB,QAAO,KAAK,QAAQ,EAAE,UAAU;;AAGlC,SAAgB,yBAAuD;AACrE,KAAI,eAAe,QAAQ,EAAE,UAAU,aACrC,QAAO;;AAKX,SAAgB,qBACd,IAAoC,aACJ;AAChC,QAAO,KAAK,QAAQ,UAAU;;AAGhC,SAAgB,kBACd,IAAoC,aACpB;AAChB,QAAO,KAAK;;AAGd,eAAsB,mBACpB,SACe;AACR,CAAM,MAAM,qBAAqB,QAAQ;;AAGlD,eAAsB,qBAAoC;AACxD,KAAI,eAAe,KAAM;AACzB,EAAC,MAAM,aAAa,SAAS;AAC7B,2BAA0B;AAC1B,wBAAuB;AACvB,eAAc;;AAGhB,oBAAoB,qBAAqB;AACvC,QAAO,OACL;EAEF;AAEF,oBAAoB,sBAAsB;AACxC,QAAO,OACL;EAEF"}
1
+ {"version":3,"file":"shared_highlighter.js","names":["highlighter: CachedOrLoadingHighlighterType","languageLoaders: Promise<ResolvedLanguage>[]","themeLoaders: Promise<ThemeRegistrationResolved>[]","themes"],"sources":["../../src/highlighter/shared_highlighter.ts"],"sourcesContent":["import { createHighlighter, createJavaScriptRegexEngine } from 'shiki';\n\nimport type {\n DiffsHighlighter,\n DiffsThemeNames,\n SupportedLanguages,\n ThemeRegistrationResolved,\n} from '../types';\nimport type { ResolvedLanguage } from '../worker/types';\nimport { attachResolvedLanguages } from './languages/attachResolvedLanguages';\nimport { cleanUpResolvedLanguages } from './languages/cleanUpResolvedLanguages';\nimport { getResolvedOrResolveLanguage } from './languages/getResolvedOrResolveLanguage';\nimport { attachResolvedThemes } from './themes/attachResolvedThemes';\nimport { cleanUpResolvedThemes } from './themes/cleanUpResolvedThemes';\nimport { getResolvedOrResolveTheme } from './themes/getResolvedOrResolveTheme';\nimport { registerCustomTheme } from './themes/registerCustomTheme';\n\ntype CachedOrLoadingHighlighterType =\n | Promise<DiffsHighlighter>\n | DiffsHighlighter\n | undefined;\n\nlet highlighter: CachedOrLoadingHighlighterType;\n\ninterface HighlighterOptions {\n themes: DiffsThemeNames[];\n langs: SupportedLanguages[];\n}\n\nexport async function getSharedHighlighter({\n themes,\n langs,\n}: HighlighterOptions): Promise<DiffsHighlighter> {\n highlighter ??= createHighlighter({\n themes: [],\n langs: ['text'],\n engine: createJavaScriptRegexEngine(),\n }) as Promise<DiffsHighlighter>;\n\n const instance = isHighlighterLoading(highlighter)\n ? await highlighter\n : highlighter;\n highlighter = instance;\n\n const languageLoaders: Promise<ResolvedLanguage>[] = [];\n for (const language of langs) {\n if (language === 'text' || language === 'ansi') continue;\n const maybeResolvedLanguage = getResolvedOrResolveLanguage(language);\n if ('then' in maybeResolvedLanguage) {\n languageLoaders.push(maybeResolvedLanguage);\n } else {\n attachResolvedLanguages(maybeResolvedLanguage, instance);\n }\n }\n\n const themeLoaders: Promise<ThemeRegistrationResolved>[] = [];\n for (const themeName of themes) {\n const maybeResolvedTheme = getResolvedOrResolveTheme(themeName);\n if ('then' in maybeResolvedTheme) {\n themeLoaders.push(maybeResolvedTheme);\n } else {\n attachResolvedThemes(maybeResolvedTheme, highlighter);\n }\n }\n\n // If we need to load any languages or themes, lets do that now\n if (languageLoaders.length > 0 || themeLoaders.length > 0) {\n await Promise.all([\n Promise.all(languageLoaders).then((languages) => {\n attachResolvedLanguages(languages, instance);\n }),\n Promise.all(themeLoaders).then((themes) => {\n attachResolvedThemes(themes, instance);\n }),\n ]);\n }\n\n return instance;\n}\n\nexport function isHighlighterLoaded(\n h: CachedOrLoadingHighlighterType = highlighter\n): h is DiffsHighlighter {\n return h != null && !('then' in h);\n}\n\nexport function getHighlighterIfLoaded(): DiffsHighlighter | undefined {\n if (highlighter != null && !('then' in highlighter)) {\n return highlighter;\n }\n return undefined;\n}\n\nexport function isHighlighterLoading(\n h: CachedOrLoadingHighlighterType = highlighter\n): h is Promise<DiffsHighlighter> {\n return h != null && 'then' in h;\n}\n\nexport function isHighlighterNull(\n h: CachedOrLoadingHighlighterType = highlighter\n): h is undefined {\n return h == null;\n}\n\nexport async function preloadHighlighter(\n options: HighlighterOptions\n): Promise<void> {\n return void (await getSharedHighlighter(options));\n}\n\nexport async function disposeHighlighter(): Promise<void> {\n if (highlighter == null) return;\n (await highlighter).dispose();\n cleanUpResolvedLanguages();\n cleanUpResolvedThemes();\n highlighter = undefined;\n}\n\nregisterCustomTheme('pierre-dark', () => {\n return import(\n '../themes/pierre-dark.json'\n ) as unknown as Promise<ThemeRegistrationResolved>;\n});\n\nregisterCustomTheme('pierre-light', () => {\n return import(\n '../themes/pierre-light.json'\n ) as unknown as Promise<ThemeRegistrationResolved>;\n});\n"],"mappings":";;;;;;;;;;AAsBA,IAAIA;AAOJ,eAAsB,qBAAqB,EACzC,QACA,SACgD;AAChD,iBAAgB,kBAAkB;EAChC,QAAQ,EAAE;EACV,OAAO,CAAC,OAAO;EACf,QAAQ,6BAA6B;EACtC,CAAC;CAEF,MAAM,WAAW,qBAAqB,YAAY,GAC9C,MAAM,cACN;AACJ,eAAc;CAEd,MAAMC,kBAA+C,EAAE;AACvD,MAAK,MAAM,YAAY,OAAO;AAC5B,MAAI,aAAa,UAAU,aAAa,OAAQ;EAChD,MAAM,wBAAwB,6BAA6B,SAAS;AACpE,MAAI,UAAU,sBACZ,iBAAgB,KAAK,sBAAsB;MAE3C,yBAAwB,uBAAuB,SAAS;;CAI5D,MAAMC,eAAqD,EAAE;AAC7D,MAAK,MAAM,aAAa,QAAQ;EAC9B,MAAM,qBAAqB,0BAA0B,UAAU;AAC/D,MAAI,UAAU,mBACZ,cAAa,KAAK,mBAAmB;MAErC,sBAAqB,oBAAoB,YAAY;;AAKzD,KAAI,gBAAgB,SAAS,KAAK,aAAa,SAAS,EACtD,OAAM,QAAQ,IAAI,CAChB,QAAQ,IAAI,gBAAgB,CAAC,MAAM,cAAc;AAC/C,0BAAwB,WAAW,SAAS;GAC5C,EACF,QAAQ,IAAI,aAAa,CAAC,MAAM,aAAW;AACzC,uBAAqBC,UAAQ,SAAS;GACtC,CACH,CAAC;AAGJ,QAAO;;AAGT,SAAgB,oBACd,IAAoC,aACb;AACvB,QAAO,KAAK,QAAQ,EAAE,UAAU;;AAGlC,SAAgB,yBAAuD;AACrE,KAAI,eAAe,QAAQ,EAAE,UAAU,aACrC,QAAO;;AAKX,SAAgB,qBACd,IAAoC,aACJ;AAChC,QAAO,KAAK,QAAQ,UAAU;;AAGhC,SAAgB,kBACd,IAAoC,aACpB;AAChB,QAAO,KAAK;;AAGd,eAAsB,mBACpB,SACe;AACR,CAAM,MAAM,qBAAqB,QAAQ;;AAGlD,eAAsB,qBAAoC;AACxD,KAAI,eAAe,KAAM;AACzB,EAAC,MAAM,aAAa,SAAS;AAC7B,2BAA0B;AAC1B,wBAAuB;AACvB,eAAc;;AAGhB,oBAAoB,qBAAqB;AACvC,QAAO,OACL;EAEF;AAEF,oBAAoB,sBAAsB;AACxC,QAAO,OACL;EAEF"}
@@ -6,7 +6,7 @@ import { createCssVariablesTheme } from "shiki";
6
6
  function registerCustomCSSVariableTheme(name, variableDefaults, fontStyle = false) {
7
7
  const theme = createCssVariablesTheme({
8
8
  name,
9
- variablePrefix: formatCSSVariablePrefix(),
9
+ variablePrefix: formatCSSVariablePrefix("global"),
10
10
  variableDefaults,
11
11
  fontStyle
12
12
  });
@@ -1 +1 @@
1
- {"version":3,"file":"registerCustomCSSVariableTheme.js","names":["createCSSVariablesTheme"],"sources":["../../../src/highlighter/themes/registerCustomCSSVariableTheme.ts"],"sourcesContent":["import { createCssVariablesTheme as createCSSVariablesTheme } from 'shiki';\n\nimport { formatCSSVariablePrefix } from '../../utils/formatCSSVariablePrefix';\nimport { registerCustomTheme } from './registerCustomTheme';\n\nexport function registerCustomCSSVariableTheme(\n name: string,\n variableDefaults: Record<string, string>,\n fontStyle: boolean = false\n): void {\n const theme = createCSSVariablesTheme({\n name,\n variablePrefix: formatCSSVariablePrefix(),\n variableDefaults,\n fontStyle,\n });\n registerCustomTheme(name, () => Promise.resolve(theme));\n}\n"],"mappings":";;;;;AAKA,SAAgB,+BACd,MACA,kBACA,YAAqB,OACf;CACN,MAAM,QAAQA,wBAAwB;EACpC;EACA,gBAAgB,yBAAyB;EACzC;EACA;EACD,CAAC;AACF,qBAAoB,YAAY,QAAQ,QAAQ,MAAM,CAAC"}
1
+ {"version":3,"file":"registerCustomCSSVariableTheme.js","names":["createCSSVariablesTheme"],"sources":["../../../src/highlighter/themes/registerCustomCSSVariableTheme.ts"],"sourcesContent":["import { createCssVariablesTheme as createCSSVariablesTheme } from 'shiki';\n\nimport { formatCSSVariablePrefix } from '../../utils/formatCSSVariablePrefix';\nimport { registerCustomTheme } from './registerCustomTheme';\n\nexport function registerCustomCSSVariableTheme(\n name: string,\n variableDefaults: Record<string, string>,\n fontStyle: boolean = false\n): void {\n const theme = createCSSVariablesTheme({\n name,\n variablePrefix: formatCSSVariablePrefix('global'),\n variableDefaults,\n fontStyle,\n });\n registerCustomTheme(name, () => Promise.resolve(theme));\n}\n"],"mappings":";;;;;AAKA,SAAgB,+BACd,MACA,kBACA,YAAqB,OACf;CACN,MAAM,QAAQA,wBAAwB;EACpC;EACA,gBAAgB,wBAAwB,SAAS;EACjD;EACA;EACD,CAAC;AACF,qBAAoB,YAAY,QAAQ,QAAQ,MAAM,CAAC"}