@pierre/diffs 1.1.0-beta.9 → 1.1.0

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 (218) hide show
  1. package/README.md +7 -18
  2. package/dist/components/AdvancedVirtualizedFileDiff.d.ts.map +1 -1
  3. package/dist/components/AdvancedVirtualizedFileDiff.js +2 -7
  4. package/dist/components/AdvancedVirtualizedFileDiff.js.map +1 -1
  5. package/dist/components/AdvancedVirtualizer.js +1 -1
  6. package/dist/components/AdvancedVirtualizer.js.map +1 -1
  7. package/dist/components/File.d.ts +17 -7
  8. package/dist/components/File.d.ts.map +1 -1
  9. package/dist/components/File.js +111 -54
  10. package/dist/components/File.js.map +1 -1
  11. package/dist/components/FileDiff.d.ts +32 -14
  12. package/dist/components/FileDiff.d.ts.map +1 -1
  13. package/dist/components/FileDiff.js +156 -81
  14. package/dist/components/FileDiff.js.map +1 -1
  15. package/dist/components/UnresolvedFile.d.ts +60 -0
  16. package/dist/components/UnresolvedFile.d.ts.map +1 -0
  17. package/dist/components/UnresolvedFile.js +280 -0
  18. package/dist/components/UnresolvedFile.js.map +1 -0
  19. package/dist/components/VirtualizedFile.js +8 -5
  20. package/dist/components/VirtualizedFile.js.map +1 -1
  21. package/dist/components/VirtualizedFileDiff.d.ts +1 -1
  22. package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
  23. package/dist/components/VirtualizedFileDiff.js +15 -11
  24. package/dist/components/VirtualizedFileDiff.js.map +1 -1
  25. package/dist/components/Virtualizer.d.ts +3 -1
  26. package/dist/components/Virtualizer.d.ts.map +1 -1
  27. package/dist/components/Virtualizer.js +50 -24
  28. package/dist/components/Virtualizer.js.map +1 -1
  29. package/dist/constants.d.ts +3 -1
  30. package/dist/constants.d.ts.map +1 -1
  31. package/dist/constants.js +8 -1
  32. package/dist/constants.js.map +1 -1
  33. package/dist/highlighter/shared_highlighter.d.ts +4 -2
  34. package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
  35. package/dist/highlighter/shared_highlighter.js +15 -7
  36. package/dist/highlighter/shared_highlighter.js.map +1 -1
  37. package/dist/index.d.ts +9 -7
  38. package/dist/index.js +8 -6
  39. package/dist/managers/InteractionManager.d.ts +146 -0
  40. package/dist/managers/InteractionManager.d.ts.map +1 -0
  41. package/dist/managers/InteractionManager.js +813 -0
  42. package/dist/managers/InteractionManager.js.map +1 -0
  43. package/dist/managers/ResizeManager.d.ts +0 -2
  44. package/dist/managers/ResizeManager.d.ts.map +1 -1
  45. package/dist/managers/ResizeManager.js +43 -32
  46. package/dist/managers/ResizeManager.js.map +1 -1
  47. package/dist/react/File.d.ts +2 -0
  48. package/dist/react/File.d.ts.map +1 -1
  49. package/dist/react/File.js +3 -1
  50. package/dist/react/File.js.map +1 -1
  51. package/dist/react/FileDiff.d.ts +2 -0
  52. package/dist/react/FileDiff.d.ts.map +1 -1
  53. package/dist/react/FileDiff.js +3 -1
  54. package/dist/react/FileDiff.js.map +1 -1
  55. package/dist/react/MultiFileDiff.d.ts +2 -0
  56. package/dist/react/MultiFileDiff.d.ts.map +1 -1
  57. package/dist/react/MultiFileDiff.js +3 -1
  58. package/dist/react/MultiFileDiff.js.map +1 -1
  59. package/dist/react/PatchDiff.d.ts +2 -0
  60. package/dist/react/PatchDiff.d.ts.map +1 -1
  61. package/dist/react/PatchDiff.js +3 -1
  62. package/dist/react/PatchDiff.js.map +1 -1
  63. package/dist/react/UnresolvedFile.d.ts +36 -0
  64. package/dist/react/UnresolvedFile.d.ts.map +1 -0
  65. package/dist/react/UnresolvedFile.js +42 -0
  66. package/dist/react/UnresolvedFile.js.map +1 -0
  67. package/dist/react/constants.d.ts +3 -2
  68. package/dist/react/constants.d.ts.map +1 -1
  69. package/dist/react/constants.js +3 -2
  70. package/dist/react/constants.js.map +1 -1
  71. package/dist/react/index.d.ts +4 -3
  72. package/dist/react/index.js +3 -2
  73. package/dist/react/types.d.ts +11 -2
  74. package/dist/react/types.d.ts.map +1 -1
  75. package/dist/react/utils/renderDiffChildren.d.ts +16 -5
  76. package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
  77. package/dist/react/utils/renderDiffChildren.js +34 -7
  78. package/dist/react/utils/renderDiffChildren.js.map +1 -1
  79. package/dist/react/utils/renderFileChildren.d.ts +5 -1
  80. package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
  81. package/dist/react/utils/renderFileChildren.js +13 -7
  82. package/dist/react/utils/renderFileChildren.js.map +1 -1
  83. package/dist/react/utils/useFileDiffInstance.d.ts +1 -2
  84. package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
  85. package/dist/react/utils/useFileDiffInstance.js +2 -2
  86. package/dist/react/utils/useFileDiffInstance.js.map +1 -1
  87. package/dist/react/utils/useFileInstance.d.ts +1 -2
  88. package/dist/react/utils/useFileInstance.d.ts.map +1 -1
  89. package/dist/react/utils/useFileInstance.js.map +1 -1
  90. package/dist/react/utils/useUnresolvedFileInstance.d.ts +33 -0
  91. package/dist/react/utils/useUnresolvedFileInstance.d.ts.map +1 -0
  92. package/dist/react/utils/useUnresolvedFileInstance.js +87 -0
  93. package/dist/react/utils/useUnresolvedFileInstance.js.map +1 -0
  94. package/dist/renderers/DiffHunksRenderer.d.ts +50 -6
  95. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  96. package/dist/renderers/DiffHunksRenderer.js +145 -45
  97. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  98. package/dist/renderers/FileRenderer.js +1 -1
  99. package/dist/renderers/UnresolvedFileHunksRenderer.d.ts +46 -0
  100. package/dist/renderers/UnresolvedFileHunksRenderer.d.ts.map +1 -0
  101. package/dist/renderers/UnresolvedFileHunksRenderer.js +207 -0
  102. package/dist/renderers/UnresolvedFileHunksRenderer.js.map +1 -0
  103. package/dist/shiki-stream/stream.d.ts +1 -1
  104. package/dist/shiki-stream/stream.d.ts.map +1 -1
  105. package/dist/shiki-stream/stream.js.map +1 -1
  106. package/dist/shiki-stream/tokenizer.d.ts +1 -1
  107. package/dist/shiki-stream/tokenizer.d.ts.map +1 -1
  108. package/dist/shiki-stream/tokenizer.js.map +1 -1
  109. package/dist/shiki-stream/types.d.ts +1 -1
  110. package/dist/shiki-stream/types.d.ts.map +1 -1
  111. package/dist/sprite.d.ts +2 -2
  112. package/dist/sprite.d.ts.map +1 -1
  113. package/dist/sprite.js +3 -0
  114. package/dist/sprite.js.map +1 -1
  115. package/dist/ssr/index.d.ts +3 -3
  116. package/dist/ssr/index.js +2 -2
  117. package/dist/ssr/preloadDiffs.d.ts +23 -14
  118. package/dist/ssr/preloadDiffs.d.ts.map +1 -1
  119. package/dist/ssr/preloadDiffs.js +40 -14
  120. package/dist/ssr/preloadDiffs.js.map +1 -1
  121. package/dist/style.js +1 -1
  122. package/dist/style.js.map +1 -1
  123. package/dist/types.d.ts +29 -2
  124. package/dist/types.d.ts.map +1 -1
  125. package/dist/utils/areMergeConflictActionsEqual.d.ts +7 -0
  126. package/dist/utils/areMergeConflictActionsEqual.d.ts.map +1 -0
  127. package/dist/utils/areMergeConflictActionsEqual.js +11 -0
  128. package/dist/utils/areMergeConflictActionsEqual.js.map +1 -0
  129. package/dist/utils/arePrePropertiesEqual.js +10 -1
  130. package/dist/utils/arePrePropertiesEqual.js.map +1 -1
  131. package/dist/utils/areSelectionPointsEqual.d.ts +7 -0
  132. package/dist/utils/areSelectionPointsEqual.d.ts.map +1 -0
  133. package/dist/utils/areSelectionPointsEqual.js +8 -0
  134. package/dist/utils/areSelectionPointsEqual.js.map +1 -0
  135. package/dist/utils/areSelectionsEqual.d.ts +1 -1
  136. package/dist/utils/areSelectionsEqual.d.ts.map +1 -1
  137. package/dist/utils/areSelectionsEqual.js.map +1 -1
  138. package/dist/utils/createFileHeaderElement.js +5 -2
  139. package/dist/utils/createFileHeaderElement.js.map +1 -1
  140. package/dist/utils/createGutterUtilityContentNode.d.ts +5 -0
  141. package/dist/utils/createGutterUtilityContentNode.d.ts.map +1 -0
  142. package/dist/utils/createGutterUtilityContentNode.js +15 -0
  143. package/dist/utils/createGutterUtilityContentNode.js.map +1 -0
  144. package/dist/utils/createGutterUtilityElement.d.ts +7 -0
  145. package/dist/utils/createGutterUtilityElement.d.ts.map +1 -0
  146. package/dist/utils/createGutterUtilityElement.js +20 -0
  147. package/dist/utils/createGutterUtilityElement.js.map +1 -0
  148. package/dist/utils/createPreElement.d.ts +2 -1
  149. package/dist/utils/createPreElement.d.ts.map +1 -1
  150. package/dist/utils/createPreElement.js +2 -1
  151. package/dist/utils/createPreElement.js.map +1 -1
  152. package/dist/utils/createSeparator.js +1 -1
  153. package/dist/utils/createSeparator.js.map +1 -1
  154. package/dist/utils/createWindowFromScrollPosition.js +12 -11
  155. package/dist/utils/createWindowFromScrollPosition.js.map +1 -1
  156. package/dist/utils/getHighlighterOptions.d.ts +7 -2
  157. package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
  158. package/dist/utils/getHighlighterOptions.js +3 -2
  159. package/dist/utils/getHighlighterOptions.js.map +1 -1
  160. package/dist/utils/getMergeConflictActionSlotName.d.ts +16 -0
  161. package/dist/utils/getMergeConflictActionSlotName.d.ts.map +1 -0
  162. package/dist/utils/getMergeConflictActionSlotName.js +8 -0
  163. package/dist/utils/getMergeConflictActionSlotName.js.map +1 -0
  164. package/dist/utils/getMergeConflictLineTypes.d.ts +15 -0
  165. package/dist/utils/getMergeConflictLineTypes.d.ts.map +1 -0
  166. package/dist/utils/getMergeConflictLineTypes.js +81 -0
  167. package/dist/utils/getMergeConflictLineTypes.js.map +1 -0
  168. package/dist/utils/getOrCreateCodeNode.d.ts +3 -1
  169. package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -1
  170. package/dist/utils/getOrCreateCodeNode.js +5 -3
  171. package/dist/utils/getOrCreateCodeNode.js.map +1 -1
  172. package/dist/utils/hast_utils.d.ts +2 -2
  173. package/dist/utils/hast_utils.d.ts.map +1 -1
  174. package/dist/utils/hast_utils.js +3 -2
  175. package/dist/utils/hast_utils.js.map +1 -1
  176. package/dist/utils/parseMergeConflictDiffFromFile.d.ts +26 -0
  177. package/dist/utils/parseMergeConflictDiffFromFile.d.ts.map +1 -0
  178. package/dist/utils/parseMergeConflictDiffFromFile.js +143 -0
  179. package/dist/utils/parseMergeConflictDiffFromFile.js.map +1 -0
  180. package/dist/utils/resolveMergeConflict.d.ts +7 -0
  181. package/dist/utils/resolveMergeConflict.d.ts.map +1 -0
  182. package/dist/utils/resolveMergeConflict.js +30 -0
  183. package/dist/utils/resolveMergeConflict.js.map +1 -0
  184. package/dist/utils/resolveVirtualFileMetrics.js +1 -0
  185. package/dist/utils/resolveVirtualFileMetrics.js.map +1 -1
  186. package/dist/utils/setWrapperNodeProps.d.ts +2 -1
  187. package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
  188. package/dist/utils/setWrapperNodeProps.js +5 -1
  189. package/dist/utils/setWrapperNodeProps.js.map +1 -1
  190. package/dist/worker/WorkerPoolManager.d.ts +4 -2
  191. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  192. package/dist/worker/WorkerPoolManager.js +16 -9
  193. package/dist/worker/WorkerPoolManager.js.map +1 -1
  194. package/dist/worker/types.d.ts +3 -1
  195. package/dist/worker/types.d.ts.map +1 -1
  196. package/dist/worker/wasm-BlUZCxHM.js +10 -0
  197. package/dist/worker/wasm-BlUZCxHM.js.map +1 -0
  198. package/dist/worker/worker-portable.js +10546 -10106
  199. package/dist/worker/worker-portable.js.map +1 -1
  200. package/dist/worker/worker.js +27 -19
  201. package/dist/worker/worker.js.map +1 -1
  202. package/package.json +3 -7
  203. package/dist/managers/LineSelectionManager.d.ts +0 -64
  204. package/dist/managers/LineSelectionManager.d.ts.map +0 -1
  205. package/dist/managers/LineSelectionManager.js +0 -270
  206. package/dist/managers/LineSelectionManager.js.map +0 -1
  207. package/dist/managers/MouseEventManager.d.ts +0 -71
  208. package/dist/managers/MouseEventManager.d.ts.map +0 -1
  209. package/dist/managers/MouseEventManager.js +0 -358
  210. package/dist/managers/MouseEventManager.js.map +0 -1
  211. package/dist/themes/pierre-dark.js +0 -1328
  212. package/dist/themes/pierre-dark.js.map +0 -1
  213. package/dist/themes/pierre-light.js +0 -1328
  214. package/dist/themes/pierre-light.js.map +0 -1
  215. package/dist/utils/createHoverContentNode.d.ts +0 -5
  216. package/dist/utils/createHoverContentNode.d.ts.map +0 -1
  217. package/dist/utils/createHoverContentNode.js +0 -15
  218. package/dist/utils/createHoverContentNode.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"DiffHunksRenderer.js","names":["options: BaseDiffOptions","onRenderUpdate?: () => unknown","workerManager?: WorkerPoolManager | undefined","options","options: RenderDiffOptions","additionsContentAST: ElementContent[] | undefined","deletionsContentAST: ElementContent[] | undefined","unifiedContentAST: ElementContent[] | undefined","hunkData: HunkData[]","context: ProcessContext","pendingSplitMissing: 'additions' | 'deletions' | undefined","deletionSpan: AnnotationSpan","additionSpan: AnnotationSpan"],"sources":["../../src/renderers/DiffHunksRenderer.ts"],"sourcesContent":["import type { ElementContent, Element as HASTElement } from 'hast';\nimport { toHtml } from 'hast-util-to-html';\n\nimport {\n DEFAULT_COLLAPSED_CONTEXT_THRESHOLD,\n DEFAULT_EXPANDED_REGION,\n DEFAULT_RENDER_RANGE,\n DEFAULT_THEMES,\n} from '../constants';\nimport { areLanguagesAttached } from '../highlighter/languages/areLanguagesAttached';\nimport {\n getHighlighterIfLoaded,\n getSharedHighlighter,\n} from '../highlighter/shared_highlighter';\nimport { areThemesAttached } from '../highlighter/themes/areThemesAttached';\nimport type {\n AnnotationLineMap,\n AnnotationSpan,\n BaseDiffOptions,\n CodeColumnType,\n DiffLineAnnotation,\n DiffsHighlighter,\n ExpansionDirections,\n FileDiffMetadata,\n HunkData,\n HunkExpansionRegion,\n HunkSeparators,\n LineTypes,\n RenderDiffOptions,\n RenderDiffResult,\n RenderedDiffASTCache,\n RenderRange,\n SupportedLanguages,\n ThemedDiffResult,\n ThemeTypes,\n} from '../types';\nimport { areRenderRangesEqual } from '../utils/areRenderRangesEqual';\nimport { areThemesEqual } from '../utils/areThemesEqual';\nimport { createAnnotationElement } from '../utils/createAnnotationElement';\nimport { createContentColumn } from '../utils/createContentColumn';\nimport { createEmptyRowBuffer } from '../utils/createEmptyRowBuffer';\nimport { createFileHeaderElement } from '../utils/createFileHeaderElement';\nimport { createNoNewlineElement } from '../utils/createNoNewlineElement';\nimport { createPreElement } from '../utils/createPreElement';\nimport { createSeparator } from '../utils/createSeparator';\nimport { getFiletypeFromFileName } from '../utils/getFiletypeFromFileName';\nimport { getHighlighterOptions } from '../utils/getHighlighterOptions';\nimport { getHunkSeparatorSlotName } from '../utils/getHunkSeparatorSlotName';\nimport { getLineAnnotationName } from '../utils/getLineAnnotationName';\nimport { getTotalLineCountFromHunks } from '../utils/getTotalLineCountFromHunks';\nimport {\n createGutterGap,\n createGutterItem,\n createGutterWrapper,\n createHastElement,\n} from '../utils/hast_utils';\nimport { isDefaultRenderRange } from '../utils/isDefaultRenderRange';\nimport { iterateOverDiff } from '../utils/iterateOverDiff';\nimport { renderDiffWithHighlighter } from '../utils/renderDiffWithHighlighter';\nimport type { WorkerPoolManager } from '../worker';\n\ninterface PushLineWithAnnotation {\n diffStyle: 'unified' | 'split';\n type: 'context' | 'context-expanded' | 'change';\n\n deletionLine?: ElementContent;\n additionLine?: ElementContent;\n\n unifiedSpan?: AnnotationSpan;\n deletionSpan?: AnnotationSpan;\n additionSpan?: AnnotationSpan;\n\n context: ProcessContext;\n}\n\ninterface GetRenderOptionsReturn {\n options: RenderDiffOptions;\n forceRender: boolean;\n}\n\ninterface PushSeparatorProps {\n hunkIndex: number;\n collapsedLines: number;\n rangeSize: number;\n hunkSpecs: string | undefined;\n isFirstHunk: boolean;\n isLastHunk: boolean;\n isExpandable: boolean;\n}\n\ninterface ProcessContext {\n rowCount: number;\n expansionLineCount: number;\n hunkSeparators: HunkSeparators;\n unifiedContentAST: ElementContent[];\n deletionsContentAST: ElementContent[];\n additionsContentAST: ElementContent[];\n unifiedGutterAST: HASTElement;\n deletionsGutterAST: HASTElement;\n additionsGutterAST: HASTElement;\n hunkData: HunkData[];\n pushToGutter(type: CodeColumnType, element: HASTElement): void;\n incrementRowCount(count?: number): void;\n}\n\ntype OptionsWithDefaults = Required<\n Omit<BaseDiffOptions, 'lang' | 'unsafeCSS'>\n>;\n\nexport interface HunksRenderResult {\n unifiedGutterAST: ElementContent[] | undefined;\n unifiedContentAST: ElementContent[] | undefined;\n deletionsGutterAST: ElementContent[] | undefined;\n deletionsContentAST: ElementContent[] | undefined;\n additionsGutterAST: ElementContent[] | undefined;\n additionsContentAST: ElementContent[] | undefined;\n hunkData: HunkData[];\n css: string;\n preNode: HASTElement;\n headerElement: HASTElement | undefined;\n totalLines: number;\n themeStyles: string;\n baseThemeType: 'light' | 'dark' | undefined;\n rowCount: number;\n bufferBefore: number;\n bufferAfter: number;\n}\n\nlet instanceId = -1;\n\nexport class DiffHunksRenderer<LAnnotation = undefined> {\n readonly __id: string = `diff-hunks-renderer:${++instanceId}`;\n\n private highlighter: DiffsHighlighter | undefined;\n private diff: FileDiffMetadata | undefined;\n\n private expandedHunks = new Map<number, HunkExpansionRegion>();\n\n private deletionAnnotations: AnnotationLineMap<LAnnotation> = {};\n private additionAnnotations: AnnotationLineMap<LAnnotation> = {};\n\n private computedLang: SupportedLanguages = 'text';\n private renderCache: RenderedDiffASTCache | undefined;\n\n constructor(\n public options: BaseDiffOptions = { theme: DEFAULT_THEMES },\n private onRenderUpdate?: () => unknown,\n private workerManager?: WorkerPoolManager | undefined\n ) {\n if (workerManager?.isWorkingPool() !== true) {\n this.highlighter = areThemesAttached(options.theme ?? DEFAULT_THEMES)\n ? getHighlighterIfLoaded()\n : undefined;\n }\n }\n\n public cleanUp(): void {\n this.highlighter = undefined;\n this.diff = undefined;\n this.renderCache = undefined;\n this.workerManager?.cleanUpPendingTasks(this);\n this.workerManager = undefined;\n this.onRenderUpdate = undefined;\n }\n\n public recycle(): void {\n this.highlighter = undefined;\n this.diff = undefined;\n this.renderCache = undefined;\n this.workerManager?.cleanUpPendingTasks(this);\n }\n\n public setOptions(options: BaseDiffOptions): void {\n this.options = options;\n }\n\n private mergeOptions(options: Partial<BaseDiffOptions>) {\n this.options = { ...this.options, ...options };\n }\n\n public setThemeType(themeType: ThemeTypes): void {\n if (this.getOptionsWithDefaults().themeType === themeType) {\n return;\n }\n this.mergeOptions({ themeType });\n }\n\n public expandHunk(index: number, direction: ExpansionDirections): void {\n const { expansionLineCount } = this.getOptionsWithDefaults();\n const region = {\n ...(this.expandedHunks.get(index) ?? {\n fromStart: 0,\n fromEnd: 0,\n }),\n };\n if (direction === 'up' || direction === 'both') {\n region.fromStart += expansionLineCount;\n }\n if (direction === 'down' || direction === 'both') {\n region.fromEnd += expansionLineCount;\n }\n // NOTE(amadeus): If our render cache is not highlighted, we need to clear\n // it, otherwise we won't have the correct AST lines\n if (this.renderCache?.highlighted !== true) {\n this.renderCache = undefined;\n }\n this.expandedHunks.set(index, region);\n }\n\n public getExpandedHunk(hunkIndex: number): HunkExpansionRegion {\n return this.expandedHunks.get(hunkIndex) ?? DEFAULT_EXPANDED_REGION;\n }\n\n public getExpandedHunksMap(): Map<number, HunkExpansionRegion> {\n return this.expandedHunks;\n }\n\n public setLineAnnotations(\n lineAnnotations: DiffLineAnnotation<LAnnotation>[]\n ): void {\n this.additionAnnotations = {};\n this.deletionAnnotations = {};\n for (const annotation of lineAnnotations) {\n const map = ((): AnnotationLineMap<LAnnotation> => {\n switch (annotation.side) {\n case 'deletions':\n return this.deletionAnnotations;\n case 'additions':\n return this.additionAnnotations;\n }\n })();\n const arr = map[annotation.lineNumber] ?? [];\n map[annotation.lineNumber] = arr;\n arr.push(annotation);\n }\n }\n\n private getOptionsWithDefaults(): OptionsWithDefaults {\n const {\n diffIndicators = 'bars',\n diffStyle = 'split',\n disableBackground = false,\n disableFileHeader = false,\n disableLineNumbers = false,\n disableVirtualizationBuffers = false,\n expandUnchanged = false,\n collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD,\n expansionLineCount = 100,\n hunkSeparators = 'line-info',\n lineDiffType = 'word-alt',\n maxLineDiffLength = 1000,\n overflow = 'scroll',\n theme = DEFAULT_THEMES,\n themeType = 'system',\n tokenizeMaxLineLength = 1000,\n useCSSClasses = false,\n } = this.options;\n return {\n diffIndicators,\n diffStyle,\n disableBackground,\n disableFileHeader,\n disableLineNumbers,\n disableVirtualizationBuffers,\n expandUnchanged,\n collapsedContextThreshold,\n expansionLineCount,\n hunkSeparators,\n lineDiffType,\n maxLineDiffLength,\n overflow,\n theme: this.workerManager?.getDiffRenderOptions().theme ?? theme,\n themeType,\n tokenizeMaxLineLength,\n useCSSClasses,\n };\n }\n\n private async initializeHighlighter(): Promise<DiffsHighlighter> {\n this.highlighter = await getSharedHighlighter(\n getHighlighterOptions(this.computedLang, this.options)\n );\n return this.highlighter;\n }\n\n public hydrate(diff: FileDiffMetadata | undefined): void {\n if (diff == null) {\n return;\n }\n this.diff = diff;\n const { options } = this.getRenderOptions(diff);\n let cache = this.workerManager?.getDiffResultCache(diff);\n if (cache != null && !areRenderOptionsEqual(options, cache.options)) {\n cache = undefined;\n }\n this.renderCache ??= {\n diff,\n // NOTE(amadeus): If we're hydrating, we can assume there was\n // pre-rendered HTML, otherwise one should not be hydrating\n highlighted: true,\n options,\n result: cache?.result,\n renderRange: undefined,\n };\n if (\n this.workerManager?.isWorkingPool() === true &&\n this.renderCache.result == null\n ) {\n this.workerManager.highlightDiffAST(this, this.diff);\n } else {\n void this.asyncHighlight(diff).then(({ result, options }) => {\n this.onHighlightSuccess(diff, result, options);\n });\n }\n }\n\n private getRenderOptions(diff: FileDiffMetadata): GetRenderOptionsReturn {\n const options: RenderDiffOptions = (() => {\n if (this.workerManager?.isWorkingPool() === true) {\n return this.workerManager.getDiffRenderOptions();\n }\n const { theme, tokenizeMaxLineLength, lineDiffType } =\n this.getOptionsWithDefaults();\n return { theme, tokenizeMaxLineLength, lineDiffType };\n })();\n this.getOptionsWithDefaults();\n const { renderCache } = this;\n if (renderCache?.result == null) {\n return { options, forceRender: true };\n }\n if (\n diff !== renderCache.diff ||\n !areRenderOptionsEqual(options, renderCache.options)\n ) {\n return { options, forceRender: true };\n }\n return { options, forceRender: false };\n }\n\n public renderDiff(\n diff: FileDiffMetadata | undefined = this.renderCache?.diff,\n renderRange: RenderRange = DEFAULT_RENDER_RANGE\n ): HunksRenderResult | undefined {\n if (diff == null) {\n return undefined;\n }\n const { expandUnchanged = false, collapsedContextThreshold } =\n this.getOptionsWithDefaults();\n const cache = this.workerManager?.getDiffResultCache(diff);\n if (cache != null && this.renderCache == null) {\n this.renderCache = {\n diff,\n highlighted: true,\n renderRange: undefined,\n ...cache,\n };\n }\n const { options, forceRender } = this.getRenderOptions(diff);\n this.renderCache ??= {\n diff,\n highlighted: false,\n options,\n result: undefined,\n renderRange: undefined,\n };\n if (this.workerManager?.isWorkingPool() === true) {\n if (\n this.renderCache.result == null ||\n (!this.renderCache.highlighted &&\n !areRenderRangesEqual(this.renderCache.renderRange, renderRange))\n ) {\n this.renderCache.result = this.workerManager.getPlainDiffAST(\n diff,\n renderRange.startingLine,\n renderRange.totalLines,\n // If we aren't using a windowed render, then we need to render\n // everything\n isDefaultRenderRange(renderRange)\n ? true\n : expandUnchanged\n ? true\n : this.expandedHunks,\n collapsedContextThreshold\n );\n this.renderCache.renderRange = renderRange;\n }\n if (\n // We should only attempt to kick off the worker highlighter if there\n // are lines to render\n renderRange.totalLines > 0 &&\n (!this.renderCache.highlighted || forceRender)\n ) {\n this.workerManager.highlightDiffAST(this, diff);\n }\n } else {\n this.computedLang = diff.lang ?? getFiletypeFromFileName(diff.name);\n const hasThemes =\n this.highlighter != null && areThemesAttached(options.theme);\n const hasLangs =\n this.highlighter != null && areLanguagesAttached(this.computedLang);\n\n // If we have any semblance of a highlighter with the correct theme(s)\n // attached, we can kick off some form of rendering. If we don't have\n // the correct language, then we can render plain text and after kick off\n // an async job to get the highlighted AST\n if (\n this.highlighter != null &&\n hasThemes &&\n (forceRender ||\n (!this.renderCache.highlighted && hasLangs) ||\n this.renderCache.result == null)\n ) {\n const { result, options } = this.renderDiffWithHighlighter(\n diff,\n this.highlighter,\n !hasLangs\n );\n this.renderCache = {\n diff,\n options,\n highlighted: hasLangs,\n result,\n renderRange: undefined,\n };\n }\n\n // If we get in here it means we'll have to kick off an async highlight\n // process which will involve initializing the highlighter with new themes\n // and languages\n if (!hasThemes || !hasLangs) {\n void this.asyncHighlight(diff).then(({ result, options }) => {\n this.onHighlightSuccess(diff, result, options);\n });\n }\n }\n return this.renderCache.result != null\n ? this.processDiffResult(\n this.renderCache.diff,\n renderRange,\n this.renderCache.result\n )\n : undefined;\n }\n\n public async asyncRender(\n diff: FileDiffMetadata,\n renderRange: RenderRange = DEFAULT_RENDER_RANGE\n ): Promise<HunksRenderResult> {\n const { result } = await this.asyncHighlight(diff);\n return this.processDiffResult(diff, renderRange, result);\n }\n\n private createPreElement(\n split: boolean,\n totalLines: number,\n themeStyles: string,\n baseThemeType: 'light' | 'dark' | undefined\n ): HASTElement {\n const {\n diffIndicators,\n disableBackground,\n disableLineNumbers,\n overflow,\n themeType,\n } = this.getOptionsWithDefaults();\n return createPreElement({\n type: 'diff',\n diffIndicators,\n disableBackground,\n disableLineNumbers,\n overflow,\n themeStyles,\n split,\n themeType: baseThemeType ?? themeType,\n totalLines,\n });\n }\n\n private async asyncHighlight(\n diff: FileDiffMetadata\n ): Promise<RenderDiffResult> {\n this.computedLang = diff.lang ?? getFiletypeFromFileName(diff.name);\n const hasThemes =\n this.highlighter != null &&\n areThemesAttached(this.options.theme ?? DEFAULT_THEMES);\n const hasLangs =\n this.highlighter != null && areLanguagesAttached(this.computedLang);\n // If we don't have the required langs or themes, then we need to\n // initialize the highlighter to load the appropriate languages and themes\n if (this.highlighter == null || !hasThemes || !hasLangs) {\n this.highlighter = await this.initializeHighlighter();\n }\n return this.renderDiffWithHighlighter(diff, this.highlighter);\n }\n\n private renderDiffWithHighlighter(\n diff: FileDiffMetadata,\n highlighter: DiffsHighlighter,\n forcePlainText = false\n ): RenderDiffResult {\n const { options } = this.getRenderOptions(diff);\n const { collapsedContextThreshold } = this.getOptionsWithDefaults();\n const result = renderDiffWithHighlighter(diff, highlighter, options, {\n forcePlainText,\n expandedHunks: forcePlainText ? true : undefined,\n collapsedContextThreshold,\n });\n return { result, options };\n }\n\n public onHighlightSuccess(\n diff: FileDiffMetadata,\n result: ThemedDiffResult,\n options: RenderDiffOptions\n ): void {\n // If renderCache was blown away, we can assume we've run cleanUp()\n if (this.renderCache == null) {\n return;\n }\n const triggerRenderUpdate =\n this.renderCache.diff !== diff ||\n !this.renderCache.highlighted ||\n !areRenderOptionsEqual(this.renderCache.options, options);\n\n this.renderCache = {\n diff,\n options,\n highlighted: true,\n result,\n renderRange: undefined,\n };\n if (triggerRenderUpdate) {\n this.onRenderUpdate?.();\n }\n }\n\n public onHighlightError(error: unknown): void {\n console.error(error);\n }\n\n private processDiffResult(\n fileDiff: FileDiffMetadata,\n renderRange: RenderRange,\n { code, themeStyles, baseThemeType }: ThemedDiffResult\n ): HunksRenderResult {\n const {\n diffStyle,\n disableFileHeader,\n expandUnchanged,\n expansionLineCount,\n collapsedContextThreshold,\n hunkSeparators,\n } = this.getOptionsWithDefaults();\n\n this.diff = fileDiff;\n const unified = diffStyle === 'unified';\n\n let additionsContentAST: ElementContent[] | undefined = [];\n let deletionsContentAST: ElementContent[] | undefined = [];\n let unifiedContentAST: ElementContent[] | undefined = [];\n\n const hunkData: HunkData[] = [];\n const { additionLines, deletionLines } = code;\n const context: ProcessContext = {\n rowCount: 0,\n hunkSeparators,\n additionsContentAST,\n deletionsContentAST,\n unifiedContentAST,\n unifiedGutterAST: createGutterWrapper(),\n deletionsGutterAST: createGutterWrapper(),\n additionsGutterAST: createGutterWrapper(),\n expansionLineCount,\n hunkData,\n incrementRowCount(count = 1) {\n context.rowCount += count;\n },\n pushToGutter(type: CodeColumnType, element: HASTElement) {\n switch (type) {\n case 'unified': {\n context.unifiedGutterAST.children.push(element);\n break;\n }\n case 'deletions': {\n context.deletionsGutterAST.children.push(element);\n break;\n }\n case 'additions': {\n context.additionsGutterAST.children.push(element);\n break;\n }\n }\n },\n };\n const trailingRangeSize = calculateTrailingRangeSize(fileDiff);\n let pendingSplitSpanSize = 0;\n let pendingSplitMissing: 'additions' | 'deletions' | undefined;\n\n function pushGutterLineNumber(\n type: CodeColumnType,\n lineType: LineTypes | 'buffer' | 'separator' | 'annotation',\n lineNumber: number,\n lineIndex: string\n ) {\n context.pushToGutter(\n type,\n createGutterItem(lineType, lineNumber, lineIndex)\n );\n }\n\n function flushSplitSpan() {\n if (diffStyle === 'unified') {\n return;\n }\n if (pendingSplitSpanSize <= 0 || pendingSplitMissing == null) {\n pendingSplitSpanSize = 0;\n pendingSplitMissing = undefined;\n return;\n }\n if (pendingSplitMissing === 'additions') {\n context.pushToGutter(\n 'additions',\n createGutterGap(undefined, 'buffer', pendingSplitSpanSize)\n );\n additionsContentAST?.push(createEmptyRowBuffer(pendingSplitSpanSize));\n } else {\n context.pushToGutter(\n 'deletions',\n createGutterGap(undefined, 'buffer', pendingSplitSpanSize)\n );\n deletionsContentAST?.push(createEmptyRowBuffer(pendingSplitSpanSize));\n }\n pendingSplitSpanSize = 0;\n pendingSplitMissing = undefined;\n }\n\n function pushSeparators(props: PushSeparatorProps) {\n flushSplitSpan();\n if (diffStyle === 'unified') {\n pushSeparator('unified', props, context);\n } else {\n pushSeparator('deletions', props, context);\n pushSeparator('additions', props, context);\n }\n }\n\n iterateOverDiff({\n diff: fileDiff,\n diffStyle,\n startingLine: renderRange.startingLine,\n totalLines: renderRange.totalLines,\n expandedHunks: expandUnchanged ? true : this.expandedHunks,\n collapsedContextThreshold,\n callback: ({\n hunkIndex,\n hunk,\n collapsedBefore,\n collapsedAfter,\n additionLine,\n deletionLine,\n type,\n }) => {\n const splitLineIndex =\n deletionLine != null\n ? deletionLine.splitLineIndex\n : additionLine.splitLineIndex;\n const unifiedLineIndex =\n additionLine != null\n ? additionLine.unifiedLineIndex\n : deletionLine.unifiedLineIndex;\n\n if (diffStyle === 'split' && type !== 'change') {\n flushSplitSpan();\n }\n\n if (collapsedBefore > 0) {\n pushSeparators({\n hunkIndex,\n collapsedLines: collapsedBefore,\n rangeSize: Math.max(hunk?.collapsedBefore ?? 0, 0),\n hunkSpecs: hunk?.hunkSpecs,\n isFirstHunk: hunkIndex === 0,\n isLastHunk: false,\n isExpandable: !fileDiff.isPartial,\n });\n }\n\n const lineIndex =\n diffStyle === 'unified' ? unifiedLineIndex : splitLineIndex;\n\n if (diffStyle === 'unified') {\n const deletionLineContent =\n deletionLine != null\n ? deletionLines[deletionLine.lineIndex]\n : undefined;\n const additionLineContent =\n additionLine != null\n ? additionLines[additionLine.lineIndex]\n : undefined;\n\n if (deletionLineContent == null && additionLineContent == null) {\n const errorMessage =\n 'DiffHunksRenderer.processDiffResult: deletionLine and additionLine are null, something is wrong';\n console.error(errorMessage, { file: fileDiff.name });\n throw new Error(errorMessage);\n }\n const lineType =\n type === 'change'\n ? additionLine != null\n ? 'change-addition'\n : 'change-deletion'\n : type;\n pushGutterLineNumber(\n 'unified',\n lineType,\n additionLine != null\n ? additionLine.lineNumber\n : deletionLine.lineNumber,\n `${unifiedLineIndex},${splitLineIndex}`\n );\n pushLineWithAnnotation({\n diffStyle: 'unified',\n type: type,\n deletionLine: deletionLineContent,\n additionLine: additionLineContent,\n unifiedSpan: this.getAnnotations(\n 'unified',\n deletionLine?.lineNumber,\n additionLine?.lineNumber,\n hunkIndex,\n lineIndex\n ),\n context,\n });\n } else {\n const deletionLineContent =\n deletionLine != null\n ? deletionLines[deletionLine.lineIndex]\n : undefined;\n const additionLineContent =\n additionLine != null\n ? additionLines[additionLine.lineIndex]\n : undefined;\n\n if (deletionLineContent == null && additionLineContent == null) {\n const errorMessage =\n 'DiffHunksRenderer.processDiffResult: deletionLine and additionLine are null, something is wrong';\n console.error(errorMessage, { file: fileDiff.name });\n throw new Error(errorMessage);\n }\n\n const missingSide = (() => {\n if (type === 'change') {\n if (additionLineContent == null) {\n return 'additions';\n } else if (deletionLineContent == null) {\n return 'deletions';\n }\n }\n return undefined;\n })();\n if (missingSide != null) {\n if (\n pendingSplitMissing != null &&\n pendingSplitMissing !== missingSide\n ) {\n // NOTE(amadeus): If we see this error, we might need to bring back: flushSplitSpan();\n throw new Error(\n 'DiffHunksRenderer.processDiffResult: iterateOverDiff, invalid pending splits'\n );\n }\n pendingSplitMissing = missingSide;\n pendingSplitSpanSize++;\n }\n\n const annotationSpans = this.getAnnotations(\n 'split',\n deletionLine?.lineNumber,\n additionLine?.lineNumber,\n hunkIndex,\n lineIndex\n );\n if (annotationSpans != null && pendingSplitSpanSize > 0) {\n flushSplitSpan();\n }\n\n if (deletionLine != null) {\n pushGutterLineNumber(\n 'deletions',\n type === 'change' ? 'change-deletion' : type,\n deletionLine.lineNumber,\n `${deletionLine.unifiedLineIndex},${splitLineIndex}`\n );\n }\n if (additionLine != null) {\n pushGutterLineNumber(\n 'additions',\n type === 'change' ? 'change-addition' : type,\n additionLine.lineNumber,\n `${additionLine.unifiedLineIndex},${splitLineIndex}`\n );\n }\n pushLineWithAnnotation({\n diffStyle: 'split',\n type: type,\n additionLine: additionLineContent,\n deletionLine: deletionLineContent,\n ...annotationSpans,\n context,\n });\n }\n\n const noEOFCRDeletion = deletionLine?.noEOFCR ?? false;\n const noEOFCRAddition = additionLine?.noEOFCR ?? false;\n if (noEOFCRAddition || noEOFCRDeletion) {\n if (noEOFCRDeletion) {\n const noEOFType =\n type === 'context' || type === 'context-expanded'\n ? type\n : 'change-deletion';\n if (diffStyle === 'unified') {\n context.unifiedContentAST.push(createNoNewlineElement(noEOFType));\n context.pushToGutter(\n 'unified',\n createGutterGap(noEOFType, 'metadata', 1)\n );\n } else {\n context.deletionsContentAST.push(\n createNoNewlineElement(noEOFType)\n );\n context.pushToGutter(\n 'deletions',\n createGutterGap(noEOFType, 'metadata', 1)\n );\n if (!noEOFCRAddition) {\n context.pushToGutter(\n 'additions',\n createGutterGap(undefined, 'buffer', 1)\n );\n context.additionsContentAST.push(createEmptyRowBuffer(1));\n }\n }\n }\n if (noEOFCRAddition) {\n const noEOFType =\n type === 'context' || type === 'context-expanded'\n ? type\n : 'change-addition';\n if (diffStyle === 'unified') {\n context.unifiedContentAST.push(createNoNewlineElement(noEOFType));\n context.pushToGutter(\n 'unified',\n createGutterGap(noEOFType, 'metadata', 1)\n );\n } else {\n context.additionsContentAST.push(\n createNoNewlineElement(noEOFType)\n );\n context.pushToGutter(\n 'additions',\n createGutterGap(noEOFType, 'metadata', 1)\n );\n if (!noEOFCRDeletion) {\n context.pushToGutter(\n 'deletions',\n createGutterGap(undefined, 'buffer', 1)\n );\n context.deletionsContentAST.push(createEmptyRowBuffer(1));\n }\n }\n }\n context.incrementRowCount(1);\n }\n\n if (collapsedAfter > 0 && hunkSeparators !== 'simple') {\n pushSeparators({\n hunkIndex: type === 'context-expanded' ? hunkIndex : hunkIndex + 1,\n collapsedLines: collapsedAfter,\n rangeSize: trailingRangeSize,\n hunkSpecs: undefined,\n isFirstHunk: false,\n isLastHunk: true,\n isExpandable: !fileDiff.isPartial,\n });\n }\n context.incrementRowCount(1);\n },\n });\n\n if (diffStyle === 'split') {\n flushSplitSpan();\n }\n\n const totalLines = Math.max(\n getTotalLineCountFromHunks(fileDiff.hunks),\n fileDiff.additionLines.length ?? 0,\n fileDiff.deletionLines.length ?? 0\n );\n\n const hasBuffer =\n renderRange.bufferBefore > 0 || renderRange.bufferAfter > 0;\n // Determine which ASTs to include based on diff style and file type\n const shouldIncludeAdditions = !unified && fileDiff.type !== 'deleted';\n const shouldIncludeDeletions = !unified && fileDiff.type !== 'new';\n const hasContent = context.rowCount > 0 || hasBuffer;\n\n additionsContentAST =\n shouldIncludeAdditions && hasContent ? additionsContentAST : undefined;\n deletionsContentAST =\n shouldIncludeDeletions && hasContent ? deletionsContentAST : undefined;\n unifiedContentAST = unified && hasContent ? unifiedContentAST : undefined;\n\n const preNode = this.createPreElement(\n deletionsContentAST != null && additionsContentAST != null,\n totalLines,\n themeStyles,\n baseThemeType\n );\n\n return {\n unifiedGutterAST:\n unified && hasContent ? context.unifiedGutterAST.children : undefined,\n unifiedContentAST,\n deletionsGutterAST:\n shouldIncludeDeletions && hasContent\n ? context.deletionsGutterAST.children\n : undefined,\n deletionsContentAST,\n additionsGutterAST:\n shouldIncludeAdditions && hasContent\n ? context.additionsGutterAST.children\n : undefined,\n additionsContentAST,\n hunkData,\n preNode,\n themeStyles,\n baseThemeType,\n headerElement: !disableFileHeader\n ? this.renderHeader(this.diff, themeStyles, baseThemeType)\n : undefined,\n totalLines,\n rowCount: context.rowCount,\n bufferBefore: renderRange.bufferBefore,\n bufferAfter: renderRange.bufferAfter,\n // FIXME\n css: '',\n };\n }\n\n public renderCodeAST(\n type: 'unified' | 'deletions' | 'additions',\n result: HunksRenderResult\n ): ElementContent[] | undefined {\n const gutterAST =\n type === 'unified'\n ? result.unifiedGutterAST\n : type === 'deletions'\n ? result.deletionsGutterAST\n : result.additionsGutterAST;\n\n const contentAST =\n type === 'unified'\n ? result.unifiedContentAST\n : type === 'deletions'\n ? result.deletionsContentAST\n : result.additionsContentAST;\n\n if (gutterAST == null || contentAST == null) {\n return undefined;\n }\n\n const gutter = createGutterWrapper(gutterAST);\n gutter.properties.style = `grid-row: span ${result.rowCount}`;\n const contentColumn = createContentColumn(contentAST, result.rowCount);\n return [gutter, contentColumn];\n }\n\n public renderFullAST(\n result: HunksRenderResult,\n children: ElementContent[] = []\n ): HASTElement {\n const unifiedAST = this.renderCodeAST('unified', result);\n if (unifiedAST != null) {\n children.push(\n createHastElement({\n tagName: 'code',\n children: unifiedAST,\n properties: {\n 'data-code': '',\n 'data-unified': '',\n },\n })\n );\n return { ...result.preNode, children };\n }\n\n const deletionsAST = this.renderCodeAST('deletions', result);\n if (deletionsAST != null) {\n children.push(\n createHastElement({\n tagName: 'code',\n children: deletionsAST,\n properties: {\n 'data-code': '',\n 'data-deletions': '',\n },\n })\n );\n }\n const additionsAST = this.renderCodeAST('additions', result);\n if (additionsAST != null) {\n children.push(\n createHastElement({\n tagName: 'code',\n children: additionsAST,\n properties: {\n 'data-code': '',\n 'data-additions': '',\n },\n })\n );\n }\n return { ...result.preNode, children };\n }\n\n public renderFullHTML(\n result: HunksRenderResult,\n tempChildren: ElementContent[] = []\n ): string {\n return toHtml(this.renderFullAST(result, tempChildren));\n }\n\n public renderPartialHTML(\n children: ElementContent[],\n columnType?: 'unified' | 'deletions' | 'additions'\n ): string {\n if (columnType == null) {\n return toHtml(children);\n }\n return toHtml(\n createHastElement({\n tagName: 'code',\n children,\n properties: {\n 'data-code': '',\n [`data-${columnType}`]: '',\n },\n })\n );\n }\n\n private getAnnotations(\n type: 'unified',\n deletionLineNumber: number | undefined,\n additionLineNumber: number | undefined,\n hunkIndex: number,\n lineIndex: number\n ): AnnotationSpan | undefined;\n private getAnnotations(\n type: 'split',\n deletionLineNumber: number | undefined,\n additionLineNumber: number | undefined,\n hunkIndex: number,\n lineIndex: number\n ): { deletionSpan: AnnotationSpan; additionSpan: AnnotationSpan } | undefined;\n private getAnnotations(\n type: 'unified' | 'split',\n deletionLineNumber: number | undefined,\n additionLineNumber: number | undefined,\n hunkIndex: number,\n lineIndex: number\n ):\n | AnnotationSpan\n | { deletionSpan: AnnotationSpan; additionSpan: AnnotationSpan }\n | undefined {\n const deletionSpan: AnnotationSpan = {\n type: 'annotation',\n hunkIndex,\n lineIndex,\n annotations: [],\n };\n if (deletionLineNumber != null) {\n for (const anno of this.deletionAnnotations[deletionLineNumber] ?? []) {\n deletionSpan.annotations.push(getLineAnnotationName(anno));\n }\n }\n const additionSpan: AnnotationSpan = {\n type: 'annotation',\n hunkIndex,\n lineIndex,\n annotations: [],\n };\n if (additionLineNumber != null) {\n for (const anno of this.additionAnnotations[additionLineNumber] ?? []) {\n (type === 'unified' ? deletionSpan : additionSpan).annotations.push(\n getLineAnnotationName(anno)\n );\n }\n }\n if (type === 'unified') {\n if (deletionSpan.annotations.length > 0) {\n return deletionSpan;\n }\n return undefined;\n }\n if (\n additionSpan.annotations.length === 0 &&\n deletionSpan.annotations.length === 0\n ) {\n return undefined;\n }\n return { deletionSpan, additionSpan };\n }\n\n private renderHeader(\n diff: FileDiffMetadata,\n themeStyles: string,\n baseThemeType: 'light' | 'dark' | undefined\n ): HASTElement {\n const { themeType } = this.getOptionsWithDefaults();\n return createFileHeaderElement({\n fileOrDiff: diff,\n themeStyles,\n themeType: baseThemeType ?? themeType,\n });\n }\n}\n\nfunction areRenderOptionsEqual(\n optionsA: RenderDiffOptions,\n optionsB: RenderDiffOptions\n): boolean {\n return (\n areThemesEqual(optionsA.theme, optionsB.theme) &&\n optionsA.tokenizeMaxLineLength === optionsB.tokenizeMaxLineLength &&\n optionsA.lineDiffType === optionsB.lineDiffType\n );\n}\n\nfunction getModifiedLinesString(lines: number) {\n return `${lines} unmodified line${lines > 1 ? 's' : ''}`;\n}\n\nfunction pushLineWithAnnotation({\n diffStyle,\n type,\n deletionLine,\n additionLine,\n unifiedSpan,\n deletionSpan,\n additionSpan,\n context,\n}: PushLineWithAnnotation) {\n let hasAnnotationRow = false;\n if (diffStyle === 'unified') {\n if (additionLine != null) {\n context.unifiedContentAST.push(additionLine);\n } else if (deletionLine != null) {\n context.unifiedContentAST.push(deletionLine);\n }\n if (unifiedSpan != null) {\n const lineType =\n type === 'change'\n ? deletionLine != null\n ? 'change-deletion'\n : 'change-addition'\n : type;\n context.unifiedContentAST.push(createAnnotationElement(unifiedSpan));\n context.pushToGutter(\n 'unified',\n createGutterGap(lineType, 'annotation', 1)\n );\n hasAnnotationRow = true;\n }\n } else if (diffStyle === 'split') {\n if (deletionLine != null) {\n context.deletionsContentAST.push(deletionLine);\n }\n if (additionLine != null) {\n context.additionsContentAST.push(additionLine);\n }\n if (deletionSpan != null) {\n const lineType =\n type === 'change'\n ? deletionLine != null\n ? 'change-deletion'\n : 'context'\n : type;\n context.deletionsContentAST.push(createAnnotationElement(deletionSpan));\n context.pushToGutter(\n 'deletions',\n createGutterGap(lineType, 'annotation', 1)\n );\n hasAnnotationRow = true;\n }\n if (additionSpan != null) {\n const lineType =\n type === 'change'\n ? additionLine != null\n ? 'change-addition'\n : 'context'\n : type;\n context.additionsContentAST.push(createAnnotationElement(additionSpan));\n context.pushToGutter(\n 'additions',\n createGutterGap(lineType, 'annotation', 1)\n );\n hasAnnotationRow = true;\n }\n }\n if (hasAnnotationRow) {\n context.incrementRowCount(1);\n }\n}\n\nfunction pushSeparator(\n type: 'additions' | 'deletions' | 'unified',\n {\n hunkIndex,\n collapsedLines,\n rangeSize,\n hunkSpecs,\n isFirstHunk,\n isLastHunk,\n isExpandable,\n }: PushSeparatorProps,\n context: ProcessContext\n) {\n if (collapsedLines <= 0) {\n return;\n }\n const linesAST =\n type === 'unified'\n ? context.unifiedContentAST\n : type === 'deletions'\n ? context.deletionsContentAST\n : context.additionsContentAST;\n\n if (context.hunkSeparators === 'metadata') {\n if (hunkSpecs != null) {\n context.pushToGutter(\n type,\n createSeparator({\n type: 'metadata',\n content: hunkSpecs,\n isFirstHunk,\n isLastHunk,\n })\n );\n linesAST.push(\n createSeparator({\n type: 'metadata',\n content: hunkSpecs,\n isFirstHunk,\n isLastHunk,\n })\n );\n if (type !== 'additions') {\n context.incrementRowCount(1);\n }\n }\n return;\n }\n if (context.hunkSeparators === 'simple') {\n if (hunkIndex > 0) {\n context.pushToGutter(\n type,\n createSeparator({ type: 'simple', isFirstHunk, isLastHunk: false })\n );\n linesAST.push(\n createSeparator({ type: 'simple', isFirstHunk, isLastHunk: false })\n );\n if (type !== 'additions') {\n context.incrementRowCount(1);\n }\n }\n return;\n }\n const slotName = getHunkSeparatorSlotName(type, hunkIndex);\n const chunked = rangeSize > context.expansionLineCount;\n const expandIndex = isExpandable ? hunkIndex : undefined;\n context.pushToGutter(\n type,\n createSeparator({\n type: context.hunkSeparators,\n content: getModifiedLinesString(collapsedLines),\n expandIndex,\n chunked,\n slotName,\n isFirstHunk,\n isLastHunk,\n })\n );\n linesAST.push(\n createSeparator({\n type: context.hunkSeparators,\n content: getModifiedLinesString(collapsedLines),\n expandIndex,\n chunked,\n slotName,\n isFirstHunk,\n isLastHunk,\n })\n );\n if (type !== 'additions') {\n context.incrementRowCount(1);\n }\n context.hunkData.push({\n slotName,\n hunkIndex,\n lines: collapsedLines,\n type,\n expandable: isExpandable\n ? { up: !isFirstHunk, down: !isLastHunk, chunked }\n : undefined,\n });\n}\n\nfunction calculateTrailingRangeSize(fileDiff: FileDiffMetadata): number {\n const lastHunk = fileDiff.hunks.at(-1);\n if (\n lastHunk == null ||\n fileDiff.isPartial ||\n fileDiff.additionLines.length === 0 ||\n fileDiff.deletionLines.length === 0\n ) {\n return 0;\n }\n const additionRemaining =\n fileDiff.additionLines.length -\n (lastHunk.additionLineIndex + lastHunk.additionCount);\n const deletionRemaining =\n fileDiff.deletionLines.length -\n (lastHunk.deletionLineIndex + lastHunk.deletionCount);\n if (additionRemaining !== deletionRemaining) {\n throw new Error(\n `DiffHunksRenderer.processDiffResult: trailing context mismatch (additions=${additionRemaining}, deletions=${deletionRemaining}) for ${fileDiff.name}`\n );\n }\n return Math.min(additionRemaining, deletionRemaining);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DiffHunksRenderer.js","names":["options: BaseDiffOptions","onRenderUpdate?: () => unknown","workerManager?: WorkerPoolManager | undefined","createDefaultAnnotationElement","options","options: RenderDiffOptions","additionsContentAST: ElementContent[] | undefined","deletionsContentAST: ElementContent[] | undefined","unifiedContentAST: ElementContent[] | undefined","hunkData: HunkData[]","context: ProcessContext","pendingSplitContext: PendingSplitContext","renderedLineContext: RenderedLineContext","deletionSpan: AnnotationSpan","additionSpan: AnnotationSpan","createAnnotationElement"],"sources":["../../src/renderers/DiffHunksRenderer.ts"],"sourcesContent":["import type { ElementContent, Element as HASTElement, Properties } from 'hast';\nimport { toHtml } from 'hast-util-to-html';\n\nimport {\n DEFAULT_COLLAPSED_CONTEXT_THRESHOLD,\n DEFAULT_EXPANDED_REGION,\n DEFAULT_RENDER_RANGE,\n DEFAULT_THEMES,\n} from '../constants';\nimport { areLanguagesAttached } from '../highlighter/languages/areLanguagesAttached';\nimport {\n getHighlighterIfLoaded,\n getSharedHighlighter,\n} from '../highlighter/shared_highlighter';\nimport { areThemesAttached } from '../highlighter/themes/areThemesAttached';\nimport type {\n AnnotationLineMap,\n AnnotationSpan,\n BaseDiffOptions,\n BaseDiffOptionsWithDefaults,\n CodeColumnType,\n CustomPreProperties,\n DiffLineAnnotation,\n DiffsHighlighter,\n ExpansionDirections,\n FileDiffMetadata,\n HunkData,\n HunkExpansionRegion,\n HunkSeparators,\n LineTypes,\n RenderDiffOptions,\n RenderDiffResult,\n RenderedDiffASTCache,\n RenderRange,\n SupportedLanguages,\n ThemedDiffResult,\n ThemeTypes,\n} from '../types';\nimport { areRenderRangesEqual } from '../utils/areRenderRangesEqual';\nimport { areThemesEqual } from '../utils/areThemesEqual';\nimport { createAnnotationElement as createDefaultAnnotationElement } from '../utils/createAnnotationElement';\nimport { createContentColumn } from '../utils/createContentColumn';\nimport { createEmptyRowBuffer } from '../utils/createEmptyRowBuffer';\nimport { createFileHeaderElement } from '../utils/createFileHeaderElement';\nimport { createNoNewlineElement } from '../utils/createNoNewlineElement';\nimport { createPreElement } from '../utils/createPreElement';\nimport { createSeparator } from '../utils/createSeparator';\nimport { getFiletypeFromFileName } from '../utils/getFiletypeFromFileName';\nimport { getHighlighterOptions } from '../utils/getHighlighterOptions';\nimport { getHunkSeparatorSlotName } from '../utils/getHunkSeparatorSlotName';\nimport { getLineAnnotationName } from '../utils/getLineAnnotationName';\nimport { getTotalLineCountFromHunks } from '../utils/getTotalLineCountFromHunks';\nimport {\n createGutterGap,\n createGutterItem,\n createGutterWrapper,\n createHastElement,\n} from '../utils/hast_utils';\nimport { isDefaultRenderRange } from '../utils/isDefaultRenderRange';\nimport type { DiffLineMetadata } from '../utils/iterateOverDiff';\nimport { iterateOverDiff } from '../utils/iterateOverDiff';\nimport { renderDiffWithHighlighter } from '../utils/renderDiffWithHighlighter';\nimport type { WorkerPoolManager } from '../worker';\n\ninterface PushLineWithAnnotation {\n diffStyle: 'unified' | 'split';\n type: 'context' | 'context-expanded' | 'change';\n\n deletionLine?: ElementContent;\n additionLine?: ElementContent;\n\n unifiedSpan?: AnnotationSpan;\n deletionSpan?: AnnotationSpan;\n additionSpan?: AnnotationSpan;\n\n createAnnotationElement(span: AnnotationSpan): HASTElement;\n context: ProcessContext;\n}\n\ninterface GetRenderOptionsReturn {\n options: RenderDiffOptions;\n forceRender: boolean;\n}\n\ninterface PushSeparatorProps {\n hunkIndex: number;\n collapsedLines: number;\n rangeSize: number;\n hunkSpecs: string | undefined;\n isFirstHunk: boolean;\n isLastHunk: boolean;\n isExpandable: boolean;\n}\n\ninterface ProcessContext {\n rowCount: number;\n expansionLineCount: number;\n hunkSeparators: HunkSeparators;\n unifiedContentAST: ElementContent[];\n deletionsContentAST: ElementContent[];\n additionsContentAST: ElementContent[];\n unifiedGutterAST: HASTElement;\n deletionsGutterAST: HASTElement;\n additionsGutterAST: HASTElement;\n hunkData: HunkData[];\n pushToGutter(type: CodeColumnType, element: HASTElement): void;\n incrementRowCount(count?: number): void;\n}\n\nexport interface UnifiedLineDecorationProps {\n type: 'context' | 'context-expanded' | 'change';\n lineType: LineTypes;\n additionLineIndex: number | undefined;\n deletionLineIndex: number | undefined;\n}\n\nexport interface SplitLineDecorationProps {\n side: 'deletions' | 'additions';\n type: 'context' | 'context-expanded' | 'change';\n lineIndex: number | undefined;\n}\n\nexport interface LineDecoration {\n gutterLineType: LineTypes;\n gutterProperties?: Properties;\n contentProperties?: Properties;\n}\n\ninterface PendingSplitContext {\n size: number;\n side: 'additions' | 'deletions' | undefined;\n increment(): void;\n flush(): void;\n}\n\nexport interface RenderedLineContext {\n type: 'context' | 'context-expanded' | 'change';\n hunkIndex: number;\n lineIndex: number;\n unifiedLineIndex: number;\n splitLineIndex: number;\n deletionLine?: DiffLineMetadata;\n additionLine?: DiffLineMetadata;\n}\n\nexport interface InlineRow {\n content: HASTElement;\n gutter: HASTElement;\n}\n\nexport interface SplitInlineRow {\n deletion: InlineRow | undefined;\n addition: InlineRow | undefined;\n}\n\nexport interface HunksRenderResult {\n unifiedGutterAST: ElementContent[] | undefined;\n unifiedContentAST: ElementContent[] | undefined;\n deletionsGutterAST: ElementContent[] | undefined;\n deletionsContentAST: ElementContent[] | undefined;\n additionsGutterAST: ElementContent[] | undefined;\n additionsContentAST: ElementContent[] | undefined;\n hunkData: HunkData[];\n css: string;\n preNode: HASTElement;\n headerElement: HASTElement | undefined;\n totalLines: number;\n themeStyles: string;\n baseThemeType: 'light' | 'dark' | undefined;\n rowCount: number;\n bufferBefore: number;\n bufferAfter: number;\n}\n\nlet instanceId = -1;\n\nexport class DiffHunksRenderer<LAnnotation = undefined> {\n readonly __id: string = `diff-hunks-renderer:${++instanceId}`;\n\n private highlighter: DiffsHighlighter | undefined;\n private diff: FileDiffMetadata | undefined;\n\n private expandedHunks = new Map<number, HunkExpansionRegion>();\n\n private deletionAnnotations: AnnotationLineMap<LAnnotation> = {};\n private additionAnnotations: AnnotationLineMap<LAnnotation> = {};\n\n private computedLang: SupportedLanguages = 'text';\n private renderCache: RenderedDiffASTCache | undefined;\n\n constructor(\n public options: BaseDiffOptions = { theme: DEFAULT_THEMES },\n private onRenderUpdate?: () => unknown,\n private workerManager?: WorkerPoolManager | undefined\n ) {\n if (workerManager?.isWorkingPool() !== true) {\n this.highlighter = areThemesAttached(options.theme ?? DEFAULT_THEMES)\n ? getHighlighterIfLoaded()\n : undefined;\n }\n }\n\n public cleanUp(): void {\n this.highlighter = undefined;\n this.diff = undefined;\n this.renderCache = undefined;\n this.workerManager?.cleanUpPendingTasks(this);\n this.workerManager = undefined;\n this.onRenderUpdate = undefined;\n }\n\n public recycle(): void {\n this.highlighter = undefined;\n this.diff = undefined;\n this.renderCache = undefined;\n this.workerManager?.cleanUpPendingTasks(this);\n }\n\n public setOptions(options: BaseDiffOptions): void {\n this.options = options;\n }\n\n private mergeOptions(options: Partial<BaseDiffOptions>) {\n this.options = { ...this.options, ...options };\n }\n\n public setThemeType(themeType: ThemeTypes): void {\n if (this.getOptionsWithDefaults().themeType === themeType) {\n return;\n }\n this.mergeOptions({ themeType });\n }\n\n public expandHunk(\n index: number,\n direction: ExpansionDirections,\n expansionLineCount: number = this.getOptionsWithDefaults()\n .expansionLineCount\n ): void {\n const region = {\n ...(this.expandedHunks.get(index) ?? {\n fromStart: 0,\n fromEnd: 0,\n }),\n };\n if (direction === 'up' || direction === 'both') {\n region.fromStart += expansionLineCount;\n }\n if (direction === 'down' || direction === 'both') {\n region.fromEnd += expansionLineCount;\n }\n // NOTE(amadeus): If our render cache is not highlighted, we need to clear\n // it, otherwise we won't have the correct AST lines\n if (this.renderCache?.highlighted !== true) {\n this.renderCache = undefined;\n }\n this.expandedHunks.set(index, region);\n }\n\n public getExpandedHunk(hunkIndex: number): HunkExpansionRegion {\n return this.expandedHunks.get(hunkIndex) ?? DEFAULT_EXPANDED_REGION;\n }\n\n public getExpandedHunksMap(): Map<number, HunkExpansionRegion> {\n return this.expandedHunks;\n }\n\n public setLineAnnotations(\n lineAnnotations: DiffLineAnnotation<LAnnotation>[]\n ): void {\n this.additionAnnotations = {};\n this.deletionAnnotations = {};\n for (const annotation of lineAnnotations) {\n const map = ((): AnnotationLineMap<LAnnotation> => {\n switch (annotation.side) {\n case 'deletions':\n return this.deletionAnnotations;\n case 'additions':\n return this.additionAnnotations;\n }\n })();\n const arr = map[annotation.lineNumber] ?? [];\n map[annotation.lineNumber] = arr;\n arr.push(annotation);\n }\n }\n\n protected getUnifiedLineDecoration({\n lineType,\n }: UnifiedLineDecorationProps): LineDecoration {\n return { gutterLineType: lineType };\n }\n\n protected getSplitLineDecoration({\n side,\n type,\n }: SplitLineDecorationProps): LineDecoration {\n if (type !== 'change') {\n return { gutterLineType: type };\n }\n return {\n gutterLineType:\n side === 'deletions' ? 'change-deletion' : 'change-addition',\n };\n }\n\n protected createAnnotationElement(span: AnnotationSpan): HASTElement {\n return createDefaultAnnotationElement(span);\n }\n\n // Unified hook returns extra rows for the single rendered column.\n declare protected getUnifiedInlineRowsForLine?: (\n ctx: RenderedLineContext\n ) => InlineRow[] | undefined;\n\n // Split hook returns extra rows per side after the current rendered line.\n declare protected getSplitInlineRowsForLine?: (\n ctx: RenderedLineContext\n ) => SplitInlineRow[] | undefined;\n\n protected getOptionsWithDefaults(): BaseDiffOptionsWithDefaults {\n const {\n diffIndicators = 'bars',\n diffStyle = 'split',\n disableBackground = false,\n disableFileHeader = false,\n disableLineNumbers = false,\n disableVirtualizationBuffers = false,\n collapsed = false,\n expandUnchanged = false,\n collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD,\n expansionLineCount = 100,\n hunkSeparators = 'line-info',\n lineDiffType = 'word-alt',\n maxLineDiffLength = 1000,\n overflow = 'scroll',\n theme = DEFAULT_THEMES,\n themeType = 'system',\n tokenizeMaxLineLength = 1000,\n useCSSClasses = false,\n } = this.options;\n return {\n diffIndicators,\n diffStyle,\n disableBackground,\n disableFileHeader,\n disableLineNumbers,\n disableVirtualizationBuffers,\n collapsed,\n expandUnchanged,\n collapsedContextThreshold,\n expansionLineCount,\n hunkSeparators,\n lineDiffType,\n maxLineDiffLength,\n overflow,\n theme: this.workerManager?.getDiffRenderOptions().theme ?? theme,\n themeType,\n tokenizeMaxLineLength,\n useCSSClasses,\n };\n }\n\n private async initializeHighlighter(): Promise<DiffsHighlighter> {\n this.highlighter = await getSharedHighlighter(\n getHighlighterOptions(this.computedLang, this.options)\n );\n return this.highlighter;\n }\n\n public hydrate(diff: FileDiffMetadata | undefined): void {\n if (diff == null) {\n return;\n }\n this.diff = diff;\n const { options } = this.getRenderOptions(diff);\n let cache = this.workerManager?.getDiffResultCache(diff);\n if (cache != null && !areRenderOptionsEqual(options, cache.options)) {\n cache = undefined;\n }\n this.renderCache ??= {\n diff,\n // NOTE(amadeus): If we're hydrating, we can assume there was\n // pre-rendered HTML, otherwise one should not be hydrating\n highlighted: true,\n options,\n result: cache?.result,\n renderRange: undefined,\n };\n if (\n this.workerManager?.isWorkingPool() === true &&\n this.renderCache.result == null\n ) {\n this.workerManager.highlightDiffAST(this, this.diff);\n } else {\n void this.asyncHighlight(diff).then(({ result, options }) => {\n this.onHighlightSuccess(diff, result, options);\n });\n }\n }\n\n private getRenderOptions(diff: FileDiffMetadata): GetRenderOptionsReturn {\n const options: RenderDiffOptions = (() => {\n if (this.workerManager?.isWorkingPool() === true) {\n return this.workerManager.getDiffRenderOptions();\n }\n const { theme, tokenizeMaxLineLength, lineDiffType } =\n this.getOptionsWithDefaults();\n return { theme, tokenizeMaxLineLength, lineDiffType };\n })();\n this.getOptionsWithDefaults();\n const { renderCache } = this;\n if (renderCache?.result == null) {\n return { options, forceRender: true };\n }\n if (\n diff !== renderCache.diff ||\n !areRenderOptionsEqual(options, renderCache.options)\n ) {\n return { options, forceRender: true };\n }\n return { options, forceRender: false };\n }\n\n public renderDiff(\n diff: FileDiffMetadata | undefined = this.renderCache?.diff,\n renderRange: RenderRange = DEFAULT_RENDER_RANGE\n ): HunksRenderResult | undefined {\n if (diff == null) {\n return undefined;\n }\n const { expandUnchanged = false, collapsedContextThreshold } =\n this.getOptionsWithDefaults();\n const cache = this.workerManager?.getDiffResultCache(diff);\n if (cache != null && this.renderCache == null) {\n this.renderCache = {\n diff,\n highlighted: true,\n renderRange: undefined,\n ...cache,\n };\n }\n const { options, forceRender } = this.getRenderOptions(diff);\n this.renderCache ??= {\n diff,\n highlighted: false,\n options,\n result: undefined,\n renderRange: undefined,\n };\n if (this.workerManager?.isWorkingPool() === true) {\n if (\n this.renderCache.result == null ||\n (!this.renderCache.highlighted &&\n !areRenderRangesEqual(this.renderCache.renderRange, renderRange))\n ) {\n this.renderCache.result = this.workerManager.getPlainDiffAST(\n diff,\n renderRange.startingLine,\n renderRange.totalLines,\n // If we aren't using a windowed render, then we need to render\n // everything\n isDefaultRenderRange(renderRange)\n ? true\n : expandUnchanged\n ? true\n : this.expandedHunks,\n collapsedContextThreshold\n );\n this.renderCache.renderRange = renderRange;\n }\n if (\n // We should only attempt to kick off the worker highlighter if there\n // are lines to render\n renderRange.totalLines > 0 &&\n (!this.renderCache.highlighted || forceRender)\n ) {\n this.workerManager.highlightDiffAST(this, diff);\n }\n } else {\n this.computedLang = diff.lang ?? getFiletypeFromFileName(diff.name);\n const hasThemes =\n this.highlighter != null && areThemesAttached(options.theme);\n const hasLangs =\n this.highlighter != null && areLanguagesAttached(this.computedLang);\n\n // If we have any semblance of a highlighter with the correct theme(s)\n // attached, we can kick off some form of rendering. If we don't have\n // the correct language, then we can render plain text and after kick off\n // an async job to get the highlighted AST\n if (\n this.highlighter != null &&\n hasThemes &&\n (forceRender ||\n (!this.renderCache.highlighted && hasLangs) ||\n this.renderCache.result == null)\n ) {\n const { result, options } = this.renderDiffWithHighlighter(\n diff,\n this.highlighter,\n !hasLangs\n );\n this.renderCache = {\n diff,\n options,\n highlighted: hasLangs,\n result,\n renderRange: undefined,\n };\n }\n\n // If we get in here it means we'll have to kick off an async highlight\n // process which will involve initializing the highlighter with new themes\n // and languages\n if (!hasThemes || !hasLangs) {\n void this.asyncHighlight(diff).then(({ result, options }) => {\n this.onHighlightSuccess(diff, result, options);\n });\n }\n }\n return this.renderCache.result != null\n ? this.processDiffResult(\n this.renderCache.diff,\n renderRange,\n this.renderCache.result\n )\n : undefined;\n }\n\n public async asyncRender(\n diff: FileDiffMetadata,\n renderRange: RenderRange = DEFAULT_RENDER_RANGE\n ): Promise<HunksRenderResult> {\n const { result } = await this.asyncHighlight(diff);\n return this.processDiffResult(diff, renderRange, result);\n }\n\n protected createPreElement(\n split: boolean,\n totalLines: number,\n themeStyles: string,\n baseThemeType: 'light' | 'dark' | undefined,\n customProperties?: CustomPreProperties\n ): HASTElement {\n const {\n diffIndicators,\n disableBackground,\n disableLineNumbers,\n overflow,\n themeType,\n } = this.getOptionsWithDefaults();\n return createPreElement({\n type: 'diff',\n diffIndicators,\n disableBackground,\n disableLineNumbers,\n overflow,\n themeStyles,\n split,\n themeType: baseThemeType ?? themeType,\n totalLines,\n customProperties,\n });\n }\n\n private async asyncHighlight(\n diff: FileDiffMetadata\n ): Promise<RenderDiffResult> {\n this.computedLang = diff.lang ?? getFiletypeFromFileName(diff.name);\n const hasThemes =\n this.highlighter != null &&\n areThemesAttached(this.options.theme ?? DEFAULT_THEMES);\n const hasLangs =\n this.highlighter != null && areLanguagesAttached(this.computedLang);\n // If we don't have the required langs or themes, then we need to\n // initialize the highlighter to load the appropriate languages and themes\n if (this.highlighter == null || !hasThemes || !hasLangs) {\n this.highlighter = await this.initializeHighlighter();\n }\n return this.renderDiffWithHighlighter(diff, this.highlighter);\n }\n\n private renderDiffWithHighlighter(\n diff: FileDiffMetadata,\n highlighter: DiffsHighlighter,\n forcePlainText = false\n ): RenderDiffResult {\n const { options } = this.getRenderOptions(diff);\n const { collapsedContextThreshold } = this.getOptionsWithDefaults();\n const result = renderDiffWithHighlighter(diff, highlighter, options, {\n forcePlainText,\n expandedHunks: forcePlainText ? true : undefined,\n collapsedContextThreshold,\n });\n return { result, options };\n }\n\n public onHighlightSuccess(\n diff: FileDiffMetadata,\n result: ThemedDiffResult,\n options: RenderDiffOptions\n ): void {\n // NOTE(amadeus): This is a bad assumption, and I should figure out\n // something better...\n // If renderCache was blown away, we can assume we've run cleanUp()\n if (this.renderCache == null) {\n return;\n }\n const triggerRenderUpdate =\n this.renderCache.diff !== diff ||\n !this.renderCache.highlighted ||\n !areRenderOptionsEqual(this.renderCache.options, options);\n\n this.renderCache = {\n diff,\n options,\n highlighted: true,\n result,\n renderRange: undefined,\n };\n if (triggerRenderUpdate) {\n this.onRenderUpdate?.();\n }\n }\n\n public onHighlightError(error: unknown): void {\n console.error(error);\n }\n\n private processDiffResult(\n fileDiff: FileDiffMetadata,\n renderRange: RenderRange,\n { code, themeStyles, baseThemeType }: ThemedDiffResult\n ): HunksRenderResult {\n const {\n diffStyle,\n disableFileHeader,\n expandUnchanged,\n expansionLineCount,\n collapsedContextThreshold,\n hunkSeparators,\n } = this.getOptionsWithDefaults();\n\n this.diff = fileDiff;\n const unified = diffStyle === 'unified';\n\n let additionsContentAST: ElementContent[] | undefined = [];\n let deletionsContentAST: ElementContent[] | undefined = [];\n let unifiedContentAST: ElementContent[] | undefined = [];\n\n const hunkData: HunkData[] = [];\n const { additionLines, deletionLines } = code;\n const context: ProcessContext = {\n rowCount: 0,\n hunkSeparators,\n additionsContentAST,\n deletionsContentAST,\n unifiedContentAST,\n unifiedGutterAST: createGutterWrapper(),\n deletionsGutterAST: createGutterWrapper(),\n additionsGutterAST: createGutterWrapper(),\n expansionLineCount,\n hunkData,\n incrementRowCount(count = 1) {\n context.rowCount += count;\n },\n pushToGutter(type: CodeColumnType, element: HASTElement) {\n switch (type) {\n case 'unified': {\n context.unifiedGutterAST.children.push(element);\n break;\n }\n case 'deletions': {\n context.deletionsGutterAST.children.push(element);\n break;\n }\n case 'additions': {\n context.additionsGutterAST.children.push(element);\n break;\n }\n }\n },\n };\n const trailingRangeSize = calculateTrailingRangeSize(fileDiff);\n const pendingSplitContext: PendingSplitContext = {\n size: 0,\n side: undefined,\n increment() {\n this.size += 1;\n },\n flush() {\n if (diffStyle === 'unified') {\n return;\n }\n if (this.size <= 0 || this.side == null) {\n this.side = undefined;\n this.size = 0;\n return;\n }\n if (this.side === 'additions') {\n context.pushToGutter(\n 'additions',\n createGutterGap(undefined, 'buffer', this.size)\n );\n additionsContentAST?.push(createEmptyRowBuffer(this.size));\n } else {\n context.pushToGutter(\n 'deletions',\n createGutterGap(undefined, 'buffer', this.size)\n );\n deletionsContentAST?.push(createEmptyRowBuffer(this.size));\n }\n this.size = 0;\n this.side = undefined;\n },\n };\n\n const pushGutterLineNumber = (\n type: CodeColumnType,\n lineType: LineTypes | 'buffer' | 'separator' | 'annotation',\n lineNumber: number,\n lineIndex: string,\n gutterProperties: Properties | undefined\n ) => {\n context.pushToGutter(\n type,\n createGutterItem(lineType, lineNumber, lineIndex, gutterProperties)\n );\n };\n\n function pushSeparators(props: PushSeparatorProps) {\n pendingSplitContext.flush();\n if (diffStyle === 'unified') {\n pushSeparator('unified', props, context);\n } else {\n pushSeparator('deletions', props, context);\n pushSeparator('additions', props, context);\n }\n }\n\n iterateOverDiff({\n diff: fileDiff,\n diffStyle,\n startingLine: renderRange.startingLine,\n totalLines: renderRange.totalLines,\n expandedHunks: expandUnchanged ? true : this.expandedHunks,\n collapsedContextThreshold,\n callback: ({\n hunkIndex,\n hunk,\n collapsedBefore,\n collapsedAfter,\n additionLine,\n deletionLine,\n type,\n }) => {\n const splitLineIndex =\n deletionLine != null\n ? deletionLine.splitLineIndex\n : additionLine.splitLineIndex;\n const unifiedLineIndex =\n additionLine != null\n ? additionLine.unifiedLineIndex\n : deletionLine.unifiedLineIndex;\n\n if (diffStyle === 'split' && type !== 'change') {\n pendingSplitContext.flush();\n }\n\n if (collapsedBefore > 0) {\n pushSeparators({\n hunkIndex,\n collapsedLines: collapsedBefore,\n rangeSize: Math.max(hunk?.collapsedBefore ?? 0, 0),\n hunkSpecs: hunk?.hunkSpecs,\n isFirstHunk: hunkIndex === 0,\n isLastHunk: false,\n isExpandable: !fileDiff.isPartial,\n });\n }\n\n const lineIndex =\n diffStyle === 'unified' ? unifiedLineIndex : splitLineIndex;\n const renderedLineContext: RenderedLineContext = {\n type,\n hunkIndex,\n lineIndex,\n unifiedLineIndex,\n splitLineIndex,\n deletionLine,\n additionLine,\n };\n\n if (diffStyle === 'unified') {\n let deletionLineContent =\n deletionLine != null\n ? deletionLines[deletionLine.lineIndex]\n : undefined;\n let additionLineContent =\n additionLine != null\n ? additionLines[additionLine.lineIndex]\n : undefined;\n if (deletionLineContent == null && additionLineContent == null) {\n const errorMessage =\n 'DiffHunksRenderer.processDiffResult: deletionLine and additionLine are null, something is wrong';\n console.error(errorMessage, { file: fileDiff.name });\n throw new Error(errorMessage);\n }\n const lineType =\n type === 'change'\n ? additionLine != null\n ? 'change-addition'\n : 'change-deletion'\n : type;\n const lineDecoration = this.getUnifiedLineDecoration({\n // NOTE: This function gets extended so don't remove\n // these extra props\n type,\n lineType,\n additionLineIndex: additionLine?.lineIndex,\n deletionLineIndex: deletionLine?.lineIndex,\n });\n pushGutterLineNumber(\n 'unified',\n lineDecoration.gutterLineType,\n additionLine != null\n ? additionLine.lineNumber\n : deletionLine.lineNumber,\n `${unifiedLineIndex},${splitLineIndex}`,\n lineDecoration.gutterProperties\n );\n if (additionLineContent != null) {\n additionLineContent = withContentProperties(\n additionLineContent,\n lineDecoration.contentProperties\n );\n } else if (deletionLineContent != null) {\n deletionLineContent = withContentProperties(\n deletionLineContent,\n lineDecoration.contentProperties\n );\n }\n pushLineWithAnnotation({\n diffStyle: 'unified',\n type: type,\n deletionLine: deletionLineContent,\n additionLine: additionLineContent,\n unifiedSpan: this.getAnnotations(\n 'unified',\n deletionLine?.lineNumber,\n additionLine?.lineNumber,\n hunkIndex,\n lineIndex\n ),\n createAnnotationElement: (span) =>\n this.createAnnotationElement(span),\n context,\n });\n const inlineRows =\n this.getUnifiedInlineRowsForLine?.(renderedLineContext);\n if (inlineRows != null) {\n pushUnifiedInlineRows(inlineRows, context);\n }\n } else {\n let deletionLineContent =\n deletionLine != null\n ? deletionLines[deletionLine.lineIndex]\n : undefined;\n let additionLineContent =\n additionLine != null\n ? additionLines[additionLine.lineIndex]\n : undefined;\n const deletionLineDecoration = this.getSplitLineDecoration({\n side: 'deletions',\n type,\n lineIndex: deletionLine?.lineIndex,\n });\n const additionLineDecoration = this.getSplitLineDecoration({\n side: 'additions',\n type,\n lineIndex: additionLine?.lineIndex,\n });\n\n if (deletionLineContent == null && additionLineContent == null) {\n const errorMessage =\n 'DiffHunksRenderer.processDiffResult: deletionLine and additionLine are null, something is wrong';\n console.error(errorMessage, { file: fileDiff.name });\n throw new Error(errorMessage);\n }\n\n const missingSide = (() => {\n if (type === 'change') {\n if (additionLineContent == null) {\n return 'additions';\n } else if (deletionLineContent == null) {\n return 'deletions';\n }\n }\n return undefined;\n })();\n if (missingSide != null) {\n if (\n pendingSplitContext.side != null &&\n pendingSplitContext.side !== missingSide\n ) {\n // NOTE(amadeus): If we see this error, we might need to bring back: flushSplitSpan();\n throw new Error(\n 'DiffHunksRenderer.processDiffResult: iterateOverDiff, invalid pending splits'\n );\n }\n pendingSplitContext.side = missingSide;\n pendingSplitContext.increment();\n }\n\n const annotationSpans = this.getAnnotations(\n 'split',\n deletionLine?.lineNumber,\n additionLine?.lineNumber,\n hunkIndex,\n lineIndex\n );\n if (annotationSpans != null && pendingSplitContext.size > 0) {\n pendingSplitContext.flush();\n }\n\n if (deletionLine != null) {\n const deletionLineDecorated = withContentProperties(\n deletionLineContent,\n deletionLineDecoration.contentProperties\n );\n pushGutterLineNumber(\n 'deletions',\n deletionLineDecoration.gutterLineType,\n deletionLine.lineNumber,\n `${deletionLine.unifiedLineIndex},${splitLineIndex}`,\n deletionLineDecoration.gutterProperties\n );\n if (deletionLineDecorated != null) {\n deletionLineContent = deletionLineDecorated;\n }\n }\n if (additionLine != null) {\n const additionLineDecorated = withContentProperties(\n additionLineContent,\n additionLineDecoration.contentProperties\n );\n pushGutterLineNumber(\n 'additions',\n additionLineDecoration.gutterLineType,\n additionLine.lineNumber,\n `${additionLine.unifiedLineIndex},${splitLineIndex}`,\n additionLineDecoration.gutterProperties\n );\n if (additionLineDecorated != null) {\n additionLineContent = additionLineDecorated;\n }\n }\n pushLineWithAnnotation({\n diffStyle: 'split',\n type: type,\n additionLine: additionLineContent,\n deletionLine: deletionLineContent,\n ...annotationSpans,\n createAnnotationElement: (span) =>\n this.createAnnotationElement(span),\n context,\n });\n const inlineRows =\n this.getSplitInlineRowsForLine?.(renderedLineContext);\n if (inlineRows != null) {\n pushSplitInlineRows(inlineRows, context, pendingSplitContext);\n }\n }\n\n const noEOFCRDeletion = deletionLine?.noEOFCR ?? false;\n const noEOFCRAddition = additionLine?.noEOFCR ?? false;\n if (noEOFCRAddition || noEOFCRDeletion) {\n if (noEOFCRDeletion) {\n const noEOFType =\n type === 'context' || type === 'context-expanded'\n ? type\n : 'change-deletion';\n if (diffStyle === 'unified') {\n context.unifiedContentAST.push(createNoNewlineElement(noEOFType));\n context.pushToGutter(\n 'unified',\n createGutterGap(noEOFType, 'metadata', 1)\n );\n } else {\n context.deletionsContentAST.push(\n createNoNewlineElement(noEOFType)\n );\n context.pushToGutter(\n 'deletions',\n createGutterGap(noEOFType, 'metadata', 1)\n );\n if (!noEOFCRAddition) {\n context.pushToGutter(\n 'additions',\n createGutterGap(undefined, 'buffer', 1)\n );\n context.additionsContentAST.push(createEmptyRowBuffer(1));\n }\n }\n }\n if (noEOFCRAddition) {\n const noEOFType =\n type === 'context' || type === 'context-expanded'\n ? type\n : 'change-addition';\n if (diffStyle === 'unified') {\n context.unifiedContentAST.push(createNoNewlineElement(noEOFType));\n context.pushToGutter(\n 'unified',\n createGutterGap(noEOFType, 'metadata', 1)\n );\n } else {\n context.additionsContentAST.push(\n createNoNewlineElement(noEOFType)\n );\n context.pushToGutter(\n 'additions',\n createGutterGap(noEOFType, 'metadata', 1)\n );\n if (!noEOFCRDeletion) {\n context.pushToGutter(\n 'deletions',\n createGutterGap(undefined, 'buffer', 1)\n );\n context.deletionsContentAST.push(createEmptyRowBuffer(1));\n }\n }\n }\n context.incrementRowCount(1);\n }\n\n if (collapsedAfter > 0 && hunkSeparators !== 'simple') {\n pushSeparators({\n hunkIndex: type === 'context-expanded' ? hunkIndex : hunkIndex + 1,\n collapsedLines: collapsedAfter,\n rangeSize: trailingRangeSize,\n hunkSpecs: undefined,\n isFirstHunk: false,\n isLastHunk: true,\n isExpandable: !fileDiff.isPartial,\n });\n }\n context.incrementRowCount(1);\n },\n });\n\n if (diffStyle === 'split') {\n pendingSplitContext.flush();\n }\n\n const totalLines = Math.max(\n getTotalLineCountFromHunks(fileDiff.hunks),\n fileDiff.additionLines.length ?? 0,\n fileDiff.deletionLines.length ?? 0\n );\n\n const hasBuffer =\n renderRange.bufferBefore > 0 || renderRange.bufferAfter > 0;\n // Determine which ASTs to include based on diff style and file type\n const shouldIncludeAdditions = !unified && fileDiff.type !== 'deleted';\n const shouldIncludeDeletions = !unified && fileDiff.type !== 'new';\n const hasContent = context.rowCount > 0 || hasBuffer;\n\n additionsContentAST =\n shouldIncludeAdditions && hasContent ? additionsContentAST : undefined;\n deletionsContentAST =\n shouldIncludeDeletions && hasContent ? deletionsContentAST : undefined;\n unifiedContentAST = unified && hasContent ? unifiedContentAST : undefined;\n\n const preNode = this.createPreElement(\n deletionsContentAST != null && additionsContentAST != null,\n totalLines,\n themeStyles,\n baseThemeType\n );\n\n return {\n unifiedGutterAST:\n unified && hasContent ? context.unifiedGutterAST.children : undefined,\n unifiedContentAST,\n deletionsGutterAST:\n shouldIncludeDeletions && hasContent\n ? context.deletionsGutterAST.children\n : undefined,\n deletionsContentAST,\n additionsGutterAST:\n shouldIncludeAdditions && hasContent\n ? context.additionsGutterAST.children\n : undefined,\n additionsContentAST,\n hunkData,\n preNode,\n themeStyles,\n baseThemeType,\n headerElement: !disableFileHeader\n ? this.renderHeader(this.diff, themeStyles, baseThemeType)\n : undefined,\n totalLines,\n rowCount: context.rowCount,\n bufferBefore: renderRange.bufferBefore,\n bufferAfter: renderRange.bufferAfter,\n // FIXME\n css: '',\n };\n }\n\n public renderCodeAST(\n type: 'unified' | 'deletions' | 'additions',\n result: HunksRenderResult\n ): ElementContent[] | undefined {\n const gutterAST =\n type === 'unified'\n ? result.unifiedGutterAST\n : type === 'deletions'\n ? result.deletionsGutterAST\n : result.additionsGutterAST;\n\n const contentAST =\n type === 'unified'\n ? result.unifiedContentAST\n : type === 'deletions'\n ? result.deletionsContentAST\n : result.additionsContentAST;\n\n if (gutterAST == null || contentAST == null) {\n return undefined;\n }\n\n const gutter = createGutterWrapper(gutterAST);\n gutter.properties.style = `grid-row: span ${result.rowCount}`;\n const contentColumn = createContentColumn(contentAST, result.rowCount);\n return [gutter, contentColumn];\n }\n\n public renderFullAST(\n result: HunksRenderResult,\n children: ElementContent[] = []\n ): HASTElement {\n const containerSize =\n this.getOptionsWithDefaults().hunkSeparators === 'line-info';\n const unifiedAST = this.renderCodeAST('unified', result);\n if (unifiedAST != null) {\n children.push(\n createHastElement({\n tagName: 'code',\n children: unifiedAST,\n properties: {\n 'data-code': '',\n 'data-container-size': containerSize ? '' : undefined,\n 'data-unified': '',\n },\n })\n );\n return { ...result.preNode, children };\n }\n\n const deletionsAST = this.renderCodeAST('deletions', result);\n if (deletionsAST != null) {\n children.push(\n createHastElement({\n tagName: 'code',\n children: deletionsAST,\n properties: {\n 'data-code': '',\n 'data-container-size': containerSize ? '' : undefined,\n 'data-deletions': '',\n },\n })\n );\n }\n const additionsAST = this.renderCodeAST('additions', result);\n if (additionsAST != null) {\n children.push(\n createHastElement({\n tagName: 'code',\n children: additionsAST,\n properties: {\n 'data-code': '',\n 'data-container-size': containerSize ? '' : undefined,\n 'data-additions': '',\n },\n })\n );\n }\n return { ...result.preNode, children };\n }\n\n public renderFullHTML(\n result: HunksRenderResult,\n tempChildren: ElementContent[] = []\n ): string {\n return toHtml(this.renderFullAST(result, tempChildren));\n }\n\n public renderPartialHTML(\n children: ElementContent[],\n columnType?: 'unified' | 'deletions' | 'additions'\n ): string {\n if (columnType == null) {\n return toHtml(children);\n }\n return toHtml(\n createHastElement({\n tagName: 'code',\n children,\n properties: {\n 'data-code': '',\n 'data-container-size':\n this.getOptionsWithDefaults().hunkSeparators === 'line-info'\n ? ''\n : undefined,\n [`data-${columnType}`]: '',\n },\n })\n );\n }\n\n private getAnnotations(\n type: 'unified',\n deletionLineNumber: number | undefined,\n additionLineNumber: number | undefined,\n hunkIndex: number,\n lineIndex: number\n ): AnnotationSpan | undefined;\n private getAnnotations(\n type: 'split',\n deletionLineNumber: number | undefined,\n additionLineNumber: number | undefined,\n hunkIndex: number,\n lineIndex: number\n ): { deletionSpan: AnnotationSpan; additionSpan: AnnotationSpan } | undefined;\n private getAnnotations(\n type: 'unified' | 'split',\n deletionLineNumber: number | undefined,\n additionLineNumber: number | undefined,\n hunkIndex: number,\n lineIndex: number\n ):\n | AnnotationSpan\n | { deletionSpan: AnnotationSpan; additionSpan: AnnotationSpan }\n | undefined {\n const deletionSpan: AnnotationSpan = {\n type: 'annotation',\n hunkIndex,\n lineIndex,\n annotations: [],\n };\n if (deletionLineNumber != null) {\n for (const anno of this.deletionAnnotations[deletionLineNumber] ?? []) {\n deletionSpan.annotations.push(getLineAnnotationName(anno));\n }\n }\n const additionSpan: AnnotationSpan = {\n type: 'annotation',\n hunkIndex,\n lineIndex,\n annotations: [],\n };\n if (additionLineNumber != null) {\n for (const anno of this.additionAnnotations[additionLineNumber] ?? []) {\n (type === 'unified' ? deletionSpan : additionSpan).annotations.push(\n getLineAnnotationName(anno)\n );\n }\n }\n if (type === 'unified') {\n if (deletionSpan.annotations.length > 0) {\n return deletionSpan;\n }\n return undefined;\n }\n if (\n additionSpan.annotations.length === 0 &&\n deletionSpan.annotations.length === 0\n ) {\n return undefined;\n }\n return { deletionSpan, additionSpan };\n }\n\n private renderHeader(\n diff: FileDiffMetadata,\n themeStyles: string,\n baseThemeType: 'light' | 'dark' | undefined\n ): HASTElement {\n const { themeType } = this.getOptionsWithDefaults();\n return createFileHeaderElement({\n fileOrDiff: diff,\n themeStyles,\n themeType: baseThemeType ?? themeType,\n });\n }\n}\n\nfunction areRenderOptionsEqual(\n optionsA: RenderDiffOptions,\n optionsB: RenderDiffOptions\n): boolean {\n return (\n areThemesEqual(optionsA.theme, optionsB.theme) &&\n optionsA.tokenizeMaxLineLength === optionsB.tokenizeMaxLineLength &&\n optionsA.lineDiffType === optionsB.lineDiffType\n );\n}\n\nfunction getModifiedLinesString(lines: number) {\n return `${lines} unmodified line${lines > 1 ? 's' : ''}`;\n}\n\nfunction pushUnifiedInlineRows(\n rows: InlineRow[],\n context: ProcessContext\n): void {\n for (const row of rows) {\n context.unifiedContentAST.push(row.content);\n context.pushToGutter('unified', row.gutter);\n context.incrementRowCount(1);\n }\n}\n\nfunction pushSplitInlineRows(\n rows: SplitInlineRow[],\n context: ProcessContext,\n pendingSplitContext: PendingSplitContext\n): void {\n for (const { deletion, addition } of rows) {\n if (deletion == null && addition == null) {\n continue;\n }\n const missingSide =\n deletion != null && addition != null\n ? undefined\n : deletion == null\n ? 'deletions'\n : 'additions';\n\n if (missingSide == null || pendingSplitContext.side !== missingSide) {\n pendingSplitContext.flush();\n }\n\n if (deletion != null) {\n context.deletionsContentAST.push(deletion.content);\n context.pushToGutter('deletions', deletion.gutter);\n }\n\n if (addition != null) {\n context.additionsContentAST.push(addition.content);\n context.pushToGutter('additions', addition.gutter);\n }\n\n if (missingSide != null) {\n pendingSplitContext.side = missingSide;\n pendingSplitContext.increment();\n }\n\n context.incrementRowCount(1);\n }\n}\n\nfunction pushLineWithAnnotation({\n diffStyle,\n type,\n deletionLine,\n additionLine,\n unifiedSpan,\n deletionSpan,\n additionSpan,\n createAnnotationElement,\n context,\n}: PushLineWithAnnotation) {\n let hasAnnotationRow = false;\n if (diffStyle === 'unified') {\n if (additionLine != null) {\n context.unifiedContentAST.push(additionLine);\n } else if (deletionLine != null) {\n context.unifiedContentAST.push(deletionLine);\n }\n if (unifiedSpan != null) {\n const lineType =\n type === 'change'\n ? deletionLine != null\n ? 'change-deletion'\n : 'change-addition'\n : type;\n context.unifiedContentAST.push(createAnnotationElement(unifiedSpan));\n context.pushToGutter(\n 'unified',\n createGutterGap(lineType, 'annotation', 1)\n );\n hasAnnotationRow = true;\n }\n } else if (diffStyle === 'split') {\n if (deletionLine != null) {\n context.deletionsContentAST.push(deletionLine);\n }\n if (additionLine != null) {\n context.additionsContentAST.push(additionLine);\n }\n if (deletionSpan != null) {\n const lineType =\n type === 'change'\n ? deletionLine != null\n ? 'change-deletion'\n : 'context'\n : type;\n context.deletionsContentAST.push(createAnnotationElement(deletionSpan));\n context.pushToGutter(\n 'deletions',\n createGutterGap(lineType, 'annotation', 1)\n );\n hasAnnotationRow = true;\n }\n if (additionSpan != null) {\n const lineType =\n type === 'change'\n ? additionLine != null\n ? 'change-addition'\n : 'context'\n : type;\n context.additionsContentAST.push(createAnnotationElement(additionSpan));\n context.pushToGutter(\n 'additions',\n createGutterGap(lineType, 'annotation', 1)\n );\n hasAnnotationRow = true;\n }\n }\n if (hasAnnotationRow) {\n context.incrementRowCount(1);\n }\n}\n\nfunction pushSeparator(\n type: 'additions' | 'deletions' | 'unified',\n {\n hunkIndex,\n collapsedLines,\n rangeSize,\n hunkSpecs,\n isFirstHunk,\n isLastHunk,\n isExpandable,\n }: PushSeparatorProps,\n context: ProcessContext\n) {\n if (collapsedLines <= 0) {\n return;\n }\n const linesAST =\n type === 'unified'\n ? context.unifiedContentAST\n : type === 'deletions'\n ? context.deletionsContentAST\n : context.additionsContentAST;\n\n if (context.hunkSeparators === 'metadata') {\n if (hunkSpecs != null) {\n context.pushToGutter(\n type,\n createSeparator({\n type: 'metadata',\n content: hunkSpecs,\n isFirstHunk,\n isLastHunk,\n })\n );\n linesAST.push(\n createSeparator({\n type: 'metadata',\n content: hunkSpecs,\n isFirstHunk,\n isLastHunk,\n })\n );\n if (type !== 'additions') {\n context.incrementRowCount(1);\n }\n }\n return;\n }\n if (context.hunkSeparators === 'simple') {\n if (hunkIndex > 0) {\n context.pushToGutter(\n type,\n createSeparator({ type: 'simple', isFirstHunk, isLastHunk: false })\n );\n linesAST.push(\n createSeparator({ type: 'simple', isFirstHunk, isLastHunk: false })\n );\n if (type !== 'additions') {\n context.incrementRowCount(1);\n }\n }\n return;\n }\n const slotName = getHunkSeparatorSlotName(type, hunkIndex);\n const chunked = rangeSize > context.expansionLineCount;\n const expandIndex = isExpandable ? hunkIndex : undefined;\n context.pushToGutter(\n type,\n createSeparator({\n type: context.hunkSeparators,\n content: getModifiedLinesString(collapsedLines),\n expandIndex,\n chunked,\n slotName,\n isFirstHunk,\n isLastHunk,\n })\n );\n linesAST.push(\n createSeparator({\n type: context.hunkSeparators,\n content: getModifiedLinesString(collapsedLines),\n expandIndex,\n chunked,\n slotName,\n isFirstHunk,\n isLastHunk,\n })\n );\n if (type !== 'additions') {\n context.incrementRowCount(1);\n }\n context.hunkData.push({\n slotName,\n hunkIndex,\n lines: collapsedLines,\n type,\n expandable: isExpandable\n ? { up: !isFirstHunk, down: !isLastHunk, chunked }\n : undefined,\n });\n}\n\nfunction withContentProperties(\n lineNode: ElementContent | undefined,\n contentProperties: Properties | undefined\n): ElementContent | undefined {\n if (\n lineNode == null ||\n lineNode.type !== 'element' ||\n contentProperties == null\n ) {\n return lineNode;\n }\n return {\n ...lineNode,\n properties: {\n ...lineNode.properties,\n ...contentProperties,\n },\n };\n}\n\nfunction calculateTrailingRangeSize(fileDiff: FileDiffMetadata): number {\n const lastHunk = fileDiff.hunks.at(-1);\n if (\n lastHunk == null ||\n fileDiff.isPartial ||\n fileDiff.additionLines.length === 0 ||\n fileDiff.deletionLines.length === 0\n ) {\n return 0;\n }\n const additionRemaining =\n fileDiff.additionLines.length -\n (lastHunk.additionLineIndex + lastHunk.additionCount);\n const deletionRemaining =\n fileDiff.deletionLines.length -\n (lastHunk.deletionLineIndex + lastHunk.deletionCount);\n if (additionRemaining !== deletionRemaining) {\n throw new Error(\n `DiffHunksRenderer.processDiffResult: trailing context mismatch (additions=${additionRemaining}, deletions=${deletionRemaining}) for ${fileDiff.name}`\n );\n }\n return Math.min(additionRemaining, deletionRemaining);\n}\n"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { DEFAULT_RENDER_RANGE, DEFAULT_THEMES } from "../constants.js";
2
+ import { createGutterGap, createGutterItem, createGutterWrapper, createHastElement } from "../utils/hast_utils.js";
2
3
  import { areLanguagesAttached } from "../highlighter/languages/areLanguagesAttached.js";
3
4
  import { getHighlighterIfLoaded, getSharedHighlighter } from "../highlighter/shared_highlighter.js";
4
5
  import { getThemes } from "../utils/getThemes.js";
@@ -6,7 +7,6 @@ import { areThemesAttached } from "../highlighter/themes/areThemesAttached.js";
6
7
  import { hasResolvedThemes } from "../highlighter/themes/hasResolvedThemes.js";
7
8
  import { areRenderRangesEqual } from "../utils/areRenderRangesEqual.js";
8
9
  import { areThemesEqual } from "../utils/areThemesEqual.js";
9
- import { createGutterGap, createGutterItem, createGutterWrapper, createHastElement } from "../utils/hast_utils.js";
10
10
  import { createAnnotationElement } from "../utils/createAnnotationElement.js";
11
11
  import { createContentColumn } from "../utils/createContentColumn.js";
12
12
  import { createFileHeaderElement } from "../utils/createFileHeaderElement.js";
@@ -0,0 +1,46 @@
1
+ import { BaseDiffOptions, BaseDiffOptionsWithDefaults, FileDiffMetadata, RenderRange } from "../types.js";
2
+ import { WorkerPoolManager } from "../worker/WorkerPoolManager.js";
3
+ import "../worker/index.js";
4
+ import { DiffHunksRenderer, HunksRenderResult, InlineRow, LineDecoration, RenderedLineContext, SplitLineDecorationProps, UnifiedLineDecorationProps } from "./DiffHunksRenderer.js";
5
+ import { MergeConflictDiffAction } from "../utils/parseMergeConflictDiffFromFile.js";
6
+ import { Element } from "hast";
7
+
8
+ //#region src/renderers/UnresolvedFileHunksRenderer.d.ts
9
+ interface BaseUnresolvedOptionsWithDefaults extends BaseDiffOptionsWithDefaults {
10
+ mergeConflictActionsType: MergeConflictActionsType;
11
+ }
12
+ type MergeConflictActionsType = 'none' | 'default' | 'custom';
13
+ interface UnresolvedFileHunksRendererOptions extends BaseDiffOptions {
14
+ mergeConflictActionsType?: MergeConflictActionsType;
15
+ }
16
+ declare class UnresolvedFileHunksRenderer<LAnnotation = undefined> extends DiffHunksRenderer<LAnnotation> {
17
+ private cachedAdditionLines;
18
+ private cachedDeletionLines;
19
+ private conflictActions;
20
+ private additionMarkerLookup;
21
+ private deletionMarkerLookup;
22
+ options: UnresolvedFileHunksRendererOptions;
23
+ constructor(options?: UnresolvedFileHunksRendererOptions, onRenderUpdate?: () => unknown, workerManager?: WorkerPoolManager | undefined);
24
+ setConflictActions(conflictActions: MergeConflictDiffAction[]): void;
25
+ renderDiff(diff?: FileDiffMetadata | undefined, renderRange?: RenderRange): HunksRenderResult | undefined;
26
+ asyncRender(diff: FileDiffMetadata, renderRange?: RenderRange): Promise<HunksRenderResult>;
27
+ protected createPreElement(split: boolean, totalLines: number, themeStyles: string, baseThemeType: 'light' | 'dark' | undefined): Element;
28
+ protected getUnifiedLineDecoration({
29
+ type,
30
+ lineType,
31
+ additionLineIndex,
32
+ deletionLineIndex
33
+ }: UnifiedLineDecorationProps): LineDecoration;
34
+ protected getSplitLineDecoration({
35
+ side,
36
+ type,
37
+ lineIndex
38
+ }: SplitLineDecorationProps): LineDecoration;
39
+ protected getUnifiedInlineRowsForLine: (ctx: RenderedLineContext) => InlineRow[] | undefined;
40
+ private prepareMarkerLookups;
41
+ private getMergeConflictMarkerTypeAtIndex;
42
+ protected getOptionsWithDefaults(): BaseUnresolvedOptionsWithDefaults;
43
+ }
44
+ //#endregion
45
+ export { UnresolvedFileHunksRenderer, UnresolvedFileHunksRendererOptions };
46
+ //# sourceMappingURL=UnresolvedFileHunksRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UnresolvedFileHunksRenderer.d.ts","names":["Element","HASTElement","BaseDiffOptions","BaseDiffOptionsWithDefaults","FileDiffMetadata","RenderRange","MergeConflictDiffAction","WorkerPoolManager","DiffHunksRenderer","HunksRenderResult","InlineRow","LineDecoration","RenderedLineContext","SplitLineDecorationProps","UnifiedLineDecorationProps","BaseUnresolvedOptionsWithDefaults","MergeConflictActionsType","UnresolvedFileHunksRendererOptions","UnresolvedFileHunksRenderer","LAnnotation","Promise","type","lineType","additionLineIndex","deletionLineIndex","side","lineIndex"],"sources":["../../src/renderers/UnresolvedFileHunksRenderer.d.ts"],"sourcesContent":["import type { Element as HASTElement } from 'hast';\nimport type { BaseDiffOptions, BaseDiffOptionsWithDefaults, FileDiffMetadata, RenderRange } from '../types';\nimport { type MergeConflictDiffAction } from '../utils/parseMergeConflictDiffFromFile';\nimport type { WorkerPoolManager } from '../worker';\nimport { DiffHunksRenderer, type HunksRenderResult, type InlineRow, type LineDecoration, type RenderedLineContext, type SplitLineDecorationProps, type UnifiedLineDecorationProps } from './DiffHunksRenderer';\ninterface BaseUnresolvedOptionsWithDefaults extends BaseDiffOptionsWithDefaults {\n mergeConflictActionsType: MergeConflictActionsType;\n}\ntype MergeConflictActionsType = 'none' | 'default' | 'custom';\nexport interface UnresolvedFileHunksRendererOptions extends BaseDiffOptions {\n mergeConflictActionsType?: MergeConflictActionsType;\n}\nexport declare class UnresolvedFileHunksRenderer<LAnnotation = undefined> extends DiffHunksRenderer<LAnnotation> {\n private cachedAdditionLines;\n private cachedDeletionLines;\n private conflictActions;\n private additionMarkerLookup;\n private deletionMarkerLookup;\n options: UnresolvedFileHunksRendererOptions;\n constructor(options?: UnresolvedFileHunksRendererOptions, onRenderUpdate?: () => unknown, workerManager?: WorkerPoolManager | undefined);\n setConflictActions(conflictActions: MergeConflictDiffAction[]): void;\n renderDiff(diff?: FileDiffMetadata | undefined, renderRange?: RenderRange): HunksRenderResult | undefined;\n asyncRender(diff: FileDiffMetadata, renderRange?: RenderRange): Promise<HunksRenderResult>;\n protected createPreElement(split: boolean, totalLines: number, themeStyles: string, baseThemeType: 'light' | 'dark' | undefined): HASTElement;\n protected getUnifiedLineDecoration({ type, lineType, additionLineIndex, deletionLineIndex }: UnifiedLineDecorationProps): LineDecoration;\n protected getSplitLineDecoration({ side, type, lineIndex }: SplitLineDecorationProps): LineDecoration;\n protected getUnifiedInlineRowsForLine: (ctx: RenderedLineContext) => InlineRow[] | undefined;\n private prepareMarkerLookups;\n private getMergeConflictMarkerTypeAtIndex;\n protected getOptionsWithDefaults(): BaseUnresolvedOptionsWithDefaults;\n}\nexport {};\n//# sourceMappingURL=UnresolvedFileHunksRenderer.d.ts.map"],"mappings":";;;;;;;;UAKUe,iCAAAA,SAA0CZ;4BACtBa;;AAFiL,KAI1MA,wBAAAA,GAHKD,MAAAA,GAAiC,SAAA,GACbC,QAAAA;AAEzBA,UACYC,kCAAAA,SAA2Cf,eAD/B,CAAA;EACZe,wBAAAA,CAAAA,EACcD,wBAAAA;AAE/B;AAAoGG,cAA/ED,2BAA+EC,CAAAA,cAAAA,SAAAA,CAAAA,SAAlBX,iBAAkBW,CAAAA,WAAAA,CAAAA,CAAAA;EAMvFF,QAAAA,mBAAAA;EACaA,QAAAA,mBAAAA;EAAoFV,QAAAA,eAAAA;EACtED,QAAAA,oBAAAA;EAClBF,QAAAA,oBAAAA;EAA4CC,OAAAA,EAHrDY,kCAGqDZ;EAAcI,WAAAA,CAAAA,OAAAA,CAAAA,EAFtDQ,kCAEsDR,EAAAA,cAAAA,CAAAA,EAAAA,GAAAA,GAAAA,OAAAA,EAAAA,aAAAA,CAAAA,EAF8BF,iBAE9BE,GAAAA,SAAAA;EAC1DL,kBAAAA,CAAAA,eAAAA,EAFkBE,uBAElBF,EAAAA,CAAAA,EAAAA,IAAAA;EAAgCC,UAAAA,CAAAA,IAAAA,CAAAA,EADhCD,gBACgCC,GAAAA,SAAAA,EAAAA,WAAAA,CAAAA,EADYA,WACZA,CAAAA,EAD0BI,iBAC1BJ,GAAAA,SAAAA;EAAsBI,WAAAA,CAAAA,IAAAA,EAAtDL,gBAAsDK,EAAAA,WAAAA,CAAAA,EAAtBJ,WAAsBI,CAAAA,EAARW,OAAQX,CAAAA,iBAAAA,CAAAA;EAARW,UAAAA,gBAAAA,CAAAA,KAAAA,EAAAA,OAAAA,EAAAA,UAAAA,EAAAA,MAAAA,EAAAA,WAAAA,EAAAA,MAAAA,EAAAA,aAAAA,EAAAA,OAAAA,GAAAA,MAAAA,GAAAA,SAAAA,CAAAA,EACkEnB,OADlEmB;EACkEnB,UAAAA,wBAAAA,CAAAA;IAAAA,IAAAA;IAAAA,QAAAA;IAAAA,iBAAAA;IAAAA;EAAAA,CAAAA,EACrCa,0BADqCb,CAAAA,EACRU,cADQV;EAC7FoB,UAAAA,sBAAAA,CAAAA;IAAAA,IAAAA;IAAAA,IAAAA;IAAAA;EAAAA,CAAAA,EACuBR,wBADvBQ,CAAAA,EACkDV,cADlDU;EAAMC,UAAAA,2BAAAA,EAAAA,CAAAA,GAAAA,EAEEV,mBAFFU,EAAAA,GAE0BZ,SAF1BY,EAAAA,GAAAA,SAAAA;EAAUC,QAAAA,oBAAAA;EAAmBC,QAAAA,iCAAAA;EAAqBV,UAAAA,sBAAAA,CAAAA,CAAAA,EAKzDC,iCALyDD"}
@@ -0,0 +1,207 @@
1
+ import { DEFAULT_RENDER_RANGE, DEFAULT_THEMES } from "../constants.js";
2
+ import { createGutterGap, createHastElement, createTextNodeElement } from "../utils/hast_utils.js";
3
+ import { DiffHunksRenderer } from "./DiffHunksRenderer.js";
4
+ import { getMergeConflictActionSlotName } from "../utils/getMergeConflictActionSlotName.js";
5
+ import { getMergeConflictActionAnchor } from "../utils/parseMergeConflictDiffFromFile.js";
6
+
7
+ //#region src/renderers/UnresolvedFileHunksRenderer.ts
8
+ const START_MARKER = /^<{7,}(?:\s.*)?$/;
9
+ const BASE_MARKER = /^\|{7,}(?:\s.*)?$/;
10
+ const SEPARATOR_MARKER = /^={7,}(?:\s.*)?$/;
11
+ const END_MARKER = /^>{7,}(?:\s.*)?$/;
12
+ var UnresolvedFileHunksRenderer = class extends DiffHunksRenderer {
13
+ cachedAdditionLines;
14
+ cachedDeletionLines;
15
+ conflictActions = /* @__PURE__ */ new Map();
16
+ additionMarkerLookup = [];
17
+ deletionMarkerLookup = [];
18
+ options;
19
+ constructor(options = { theme: DEFAULT_THEMES }, onRenderUpdate, workerManager) {
20
+ super(void 0, onRenderUpdate, workerManager);
21
+ this.options = options;
22
+ }
23
+ setConflictActions(conflictActions) {
24
+ this.conflictActions.clear();
25
+ for (const action of conflictActions) {
26
+ const anchor = getMergeConflictActionAnchor(action);
27
+ if (anchor == null) continue;
28
+ const row = {
29
+ side: anchor.side,
30
+ lineNumber: anchor.lineNumber,
31
+ conflictIndex: action.conflictIndex
32
+ };
33
+ const key = `${row.side}:${row.lineNumber}`;
34
+ const rows = this.conflictActions.get(key);
35
+ if (rows == null) this.conflictActions.set(key, [row]);
36
+ else rows.push(row);
37
+ }
38
+ }
39
+ renderDiff(diff, renderRange = DEFAULT_RENDER_RANGE) {
40
+ if (diff != null) this.prepareMarkerLookups(diff);
41
+ return super.renderDiff(diff, renderRange);
42
+ }
43
+ async asyncRender(diff, renderRange = DEFAULT_RENDER_RANGE) {
44
+ this.prepareMarkerLookups(diff);
45
+ return super.asyncRender(diff, renderRange);
46
+ }
47
+ createPreElement(split, totalLines, themeStyles, baseThemeType) {
48
+ return super.createPreElement(split, totalLines, themeStyles, baseThemeType, { "data-has-merge-conflict": "" });
49
+ }
50
+ getUnifiedLineDecoration({ type, lineType, additionLineIndex, deletionLineIndex }) {
51
+ const mergeConflictType = type === "change" ? lineType === "change-deletion" ? "current" : "incoming" : this.getMergeConflictMarkerTypeAtIndex("additions", additionLineIndex) ?? this.getMergeConflictMarkerTypeAtIndex("deletions", deletionLineIndex);
52
+ return {
53
+ gutterLineType: type === "change" ? "context" : lineType,
54
+ gutterProperties: getMergeConflictGutterProperties(mergeConflictType),
55
+ contentProperties: getMergeConflictContentProperties(type, mergeConflictType)
56
+ };
57
+ }
58
+ getSplitLineDecoration({ side, type, lineIndex }) {
59
+ const mergeConflictType = type === "change" ? side === "deletions" ? "current" : "incoming" : this.getMergeConflictMarkerTypeAtIndex(side, lineIndex);
60
+ return {
61
+ gutterLineType: type === "change" ? "context" : type,
62
+ gutterProperties: getMergeConflictGutterProperties(mergeConflictType),
63
+ contentProperties: getMergeConflictContentProperties(type, mergeConflictType)
64
+ };
65
+ }
66
+ getUnifiedInlineRowsForLine = (ctx) => {
67
+ const side = getUnifiedRenderedSide(ctx);
68
+ const lineNumber = side === "deletions" ? ctx.deletionLine?.lineNumber : ctx.additionLine?.lineNumber;
69
+ if (lineNumber == null) return;
70
+ const rows = this.conflictActions.get(`${side}:${lineNumber}`);
71
+ if (rows == null || rows.length === 0) return;
72
+ const { mergeConflictActionsType } = this.getOptionsWithDefaults();
73
+ return rows.map((row) => ({
74
+ content: createMergeConflictActionsRowElement({
75
+ row,
76
+ includeDefaultActions: mergeConflictActionsType === "default",
77
+ includeSlot: true
78
+ }),
79
+ gutter: createMergeConflictGutterGap()
80
+ }));
81
+ };
82
+ prepareMarkerLookups(diff) {
83
+ if (this.cachedAdditionLines !== diff.additionLines) {
84
+ this.cachedAdditionLines = diff.additionLines;
85
+ this.additionMarkerLookup = buildMarkerLookup(diff.additionLines);
86
+ }
87
+ if (this.cachedDeletionLines !== diff.deletionLines) {
88
+ this.cachedDeletionLines = diff.deletionLines;
89
+ this.deletionMarkerLookup = buildMarkerLookup(diff.deletionLines);
90
+ }
91
+ }
92
+ getMergeConflictMarkerTypeAtIndex(side, lineIndex) {
93
+ if (lineIndex == null) return;
94
+ const value = (side === "additions" ? this.additionMarkerLookup : this.deletionMarkerLookup)[lineIndex];
95
+ if (value == null) return;
96
+ return value === "none" ? void 0 : value;
97
+ }
98
+ getOptionsWithDefaults() {
99
+ const options = super.getOptionsWithDefaults();
100
+ options.diffStyle = "unified";
101
+ options.lineDiffType = "none";
102
+ options.mergeConflictActionsType = this.options.mergeConflictActionsType ?? "default";
103
+ return options;
104
+ }
105
+ };
106
+ function getMergeConflictGutterProperties(mergeConflictType) {
107
+ return mergeConflictType != null ? { "data-merge-conflict": mergeConflictType } : void 0;
108
+ }
109
+ function getMergeConflictContentProperties(type, mergeConflictType) {
110
+ if (mergeConflictType == null) return;
111
+ if (type === "change") {
112
+ if (mergeConflictType === "current" || mergeConflictType === "incoming") return {
113
+ "data-line-type": "context",
114
+ "data-merge-conflict": mergeConflictType
115
+ };
116
+ return;
117
+ }
118
+ if (mergeConflictType === "marker-start" || mergeConflictType === "marker-base" || mergeConflictType === "marker-separator" || mergeConflictType === "marker-end") return { "data-merge-conflict": mergeConflictType };
119
+ }
120
+ function getMergeConflictMarkerType(line) {
121
+ if (line == null) return;
122
+ const trimmed = line.replace(/(?:\r\n|\n|\r)$/, "");
123
+ if (START_MARKER.test(trimmed)) return "marker-start";
124
+ if (BASE_MARKER.test(trimmed)) return "marker-base";
125
+ if (SEPARATOR_MARKER.test(trimmed)) return "marker-separator";
126
+ if (END_MARKER.test(trimmed)) return "marker-end";
127
+ }
128
+ function buildMarkerLookup(lines) {
129
+ const markerLookup = new Array(lines.length);
130
+ for (let index = 0; index < lines.length; index++) markerLookup[index] = getMergeConflictMarkerType(lines[index]) ?? "none";
131
+ return markerLookup;
132
+ }
133
+ function getUnifiedRenderedSide(ctx) {
134
+ if (ctx.type === "change" && ctx.deletionLine != null && ctx.additionLine == null) return "deletions";
135
+ return "additions";
136
+ }
137
+ function createMergeConflictGutterGap() {
138
+ const gap = createGutterGap(void 0, "annotation", 1);
139
+ gap.properties["data-gutter-buffer"] = "merge-conflict-action";
140
+ return gap;
141
+ }
142
+ function createMergeConflictActionsRowElement({ row, includeDefaultActions, includeSlot }) {
143
+ const contentChildren = includeDefaultActions ? createMergeConflictActionsContent(row.conflictIndex) : [];
144
+ if (includeSlot) contentChildren.push(createHastElement({
145
+ tagName: "slot",
146
+ properties: {
147
+ name: getMergeConflictActionSlotName({
148
+ side: row.side,
149
+ lineNumber: row.lineNumber,
150
+ conflictIndex: row.conflictIndex
151
+ }),
152
+ "data-merge-conflict-action-slot": ""
153
+ }
154
+ }));
155
+ return createHastElement({
156
+ tagName: "div",
157
+ properties: { "data-merge-conflict-actions": "" },
158
+ children: [createHastElement({
159
+ tagName: "div",
160
+ properties: { "data-merge-conflict-actions-content": "" },
161
+ children: contentChildren
162
+ })]
163
+ });
164
+ }
165
+ function createMergeConflictActionsContent(conflictIndex) {
166
+ return [
167
+ createMergeConflictActionButton({
168
+ resolution: "current",
169
+ label: "Accept current change",
170
+ conflictIndex
171
+ }),
172
+ createMergeConflictActionSeparator(),
173
+ createMergeConflictActionButton({
174
+ resolution: "incoming",
175
+ label: "Accept incoming change",
176
+ conflictIndex
177
+ }),
178
+ createMergeConflictActionSeparator(),
179
+ createMergeConflictActionButton({
180
+ resolution: "both",
181
+ label: "Accept both",
182
+ conflictIndex
183
+ })
184
+ ];
185
+ }
186
+ function createMergeConflictActionButton({ resolution, label, conflictIndex }) {
187
+ return createHastElement({
188
+ tagName: "button",
189
+ properties: {
190
+ type: "button",
191
+ "data-merge-conflict-action": resolution,
192
+ "data-merge-conflict-conflict-index": `${conflictIndex}`
193
+ },
194
+ children: [createTextNodeElement(label)]
195
+ });
196
+ }
197
+ function createMergeConflictActionSeparator() {
198
+ return createHastElement({
199
+ tagName: "span",
200
+ properties: { "data-merge-conflict-action-separator": "" },
201
+ children: [createTextNodeElement("|")]
202
+ });
203
+ }
204
+
205
+ //#endregion
206
+ export { UnresolvedFileHunksRenderer };
207
+ //# sourceMappingURL=UnresolvedFileHunksRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UnresolvedFileHunksRenderer.js","names":["markerLookup: MergeConflictMarkerLookup[]","contentChildren: HASTElement[]"],"sources":["../../src/renderers/UnresolvedFileHunksRenderer.ts"],"sourcesContent":["import type { Element as HASTElement, Properties } from 'hast';\n\nimport { DEFAULT_RENDER_RANGE, DEFAULT_THEMES } from '../constants';\nimport type {\n BaseDiffOptions,\n BaseDiffOptionsWithDefaults,\n DiffLineAnnotation,\n FileDiffMetadata,\n MergeConflictResolution,\n RenderRange,\n} from '../types';\nimport { getMergeConflictActionSlotName } from '../utils/getMergeConflictActionSlotName';\nimport {\n createGutterGap,\n createHastElement,\n createTextNodeElement,\n} from '../utils/hast_utils';\nimport {\n getMergeConflictActionAnchor,\n type MergeConflictDiffAction,\n} from '../utils/parseMergeConflictDiffFromFile';\nimport type { WorkerPoolManager } from '../worker';\nimport {\n DiffHunksRenderer,\n type HunksRenderResult,\n type InlineRow,\n type LineDecoration,\n type RenderedLineContext,\n type SplitLineDecorationProps,\n type UnifiedLineDecorationProps,\n} from './DiffHunksRenderer';\n\ntype MergeConflictMarkerType =\n | 'marker-start'\n | 'marker-base'\n | 'marker-separator'\n | 'marker-end'\n | 'current'\n | 'incoming';\ntype MergeConflictMarkerLookup = MergeConflictMarkerType | 'none';\n\ninterface MergeConflictActionRowData {\n side: DiffLineAnnotation<undefined>['side'];\n lineNumber: number;\n conflictIndex: number;\n}\n\ninterface BaseUnresolvedOptionsWithDefaults extends BaseDiffOptionsWithDefaults {\n mergeConflictActionsType: MergeConflictActionsType;\n}\n\ntype MergeConflictActionsType = 'none' | 'default' | 'custom';\n\nexport interface UnresolvedFileHunksRendererOptions extends BaseDiffOptions {\n mergeConflictActionsType?: MergeConflictActionsType;\n}\n\nconst START_MARKER = /^<{7,}(?:\\s.*)?$/;\nconst BASE_MARKER = /^\\|{7,}(?:\\s.*)?$/;\nconst SEPARATOR_MARKER = /^={7,}(?:\\s.*)?$/;\nconst END_MARKER = /^>{7,}(?:\\s.*)?$/;\n\nexport class UnresolvedFileHunksRenderer<\n LAnnotation = undefined,\n> extends DiffHunksRenderer<LAnnotation> {\n private cachedAdditionLines: string[] | undefined;\n private cachedDeletionLines: string[] | undefined;\n private conflictActions = new Map<string, MergeConflictActionRowData[]>();\n private additionMarkerLookup: MergeConflictMarkerLookup[] = [];\n private deletionMarkerLookup: MergeConflictMarkerLookup[] = [];\n public override options: UnresolvedFileHunksRendererOptions;\n\n constructor(\n options: UnresolvedFileHunksRendererOptions = {\n theme: DEFAULT_THEMES,\n },\n onRenderUpdate?: () => unknown,\n workerManager?: WorkerPoolManager | undefined\n ) {\n super(undefined, onRenderUpdate, workerManager);\n this.options = options;\n }\n\n public setConflictActions(conflictActions: MergeConflictDiffAction[]): void {\n this.conflictActions.clear();\n for (const action of conflictActions) {\n const anchor = getMergeConflictActionAnchor(action);\n if (anchor == null) {\n continue;\n }\n const row = {\n side: anchor.side,\n lineNumber: anchor.lineNumber,\n conflictIndex: action.conflictIndex,\n };\n const key = `${row.side}:${row.lineNumber}`;\n const rows = this.conflictActions.get(key);\n if (rows == null) {\n this.conflictActions.set(key, [row]);\n } else {\n rows.push(row);\n }\n }\n }\n\n public override renderDiff(\n diff?: FileDiffMetadata | undefined,\n renderRange: RenderRange = DEFAULT_RENDER_RANGE\n ): HunksRenderResult | undefined {\n if (diff != null) {\n this.prepareMarkerLookups(diff);\n }\n return super.renderDiff(diff, renderRange);\n }\n\n public override async asyncRender(\n diff: FileDiffMetadata,\n renderRange: RenderRange = DEFAULT_RENDER_RANGE\n ): Promise<HunksRenderResult> {\n this.prepareMarkerLookups(diff);\n return super.asyncRender(diff, renderRange);\n }\n\n protected override createPreElement(\n split: boolean,\n totalLines: number,\n themeStyles: string,\n baseThemeType: 'light' | 'dark' | undefined\n ): HASTElement {\n return super.createPreElement(\n split,\n totalLines,\n themeStyles,\n baseThemeType,\n { 'data-has-merge-conflict': '' }\n );\n }\n\n protected override getUnifiedLineDecoration({\n type,\n lineType,\n additionLineIndex,\n deletionLineIndex,\n }: UnifiedLineDecorationProps): LineDecoration {\n const mergeConflictType =\n type === 'change'\n ? lineType === 'change-deletion'\n ? 'current'\n : 'incoming'\n : (this.getMergeConflictMarkerTypeAtIndex(\n 'additions',\n additionLineIndex\n ) ??\n this.getMergeConflictMarkerTypeAtIndex(\n 'deletions',\n deletionLineIndex\n ));\n return {\n gutterLineType: type === 'change' ? 'context' : lineType,\n gutterProperties: getMergeConflictGutterProperties(mergeConflictType),\n contentProperties: getMergeConflictContentProperties(\n type,\n mergeConflictType\n ),\n };\n }\n\n protected override getSplitLineDecoration({\n side,\n type,\n lineIndex,\n }: SplitLineDecorationProps): LineDecoration {\n const mergeConflictType =\n type === 'change'\n ? side === 'deletions'\n ? 'current'\n : 'incoming'\n : this.getMergeConflictMarkerTypeAtIndex(side, lineIndex);\n return {\n gutterLineType: type === 'change' ? 'context' : type,\n gutterProperties: getMergeConflictGutterProperties(mergeConflictType),\n contentProperties: getMergeConflictContentProperties(\n type,\n mergeConflictType\n ),\n };\n }\n\n protected override getUnifiedInlineRowsForLine = (\n ctx: RenderedLineContext\n ): InlineRow[] | undefined => {\n const side = getUnifiedRenderedSide(ctx);\n const lineNumber =\n side === 'deletions'\n ? ctx.deletionLine?.lineNumber\n : ctx.additionLine?.lineNumber;\n if (lineNumber == null) {\n return undefined;\n }\n const rows = this.conflictActions.get(`${side}:${lineNumber}`);\n if (rows == null || rows.length === 0) {\n return undefined;\n }\n const { mergeConflictActionsType } = this.getOptionsWithDefaults();\n return rows.map((row) => ({\n content: createMergeConflictActionsRowElement({\n row,\n includeDefaultActions: mergeConflictActionsType === 'default',\n includeSlot: true,\n }),\n gutter: createMergeConflictGutterGap(),\n }));\n };\n\n private prepareMarkerLookups(diff: FileDiffMetadata): void {\n if (this.cachedAdditionLines !== diff.additionLines) {\n this.cachedAdditionLines = diff.additionLines;\n this.additionMarkerLookup = buildMarkerLookup(diff.additionLines);\n }\n if (this.cachedDeletionLines !== diff.deletionLines) {\n this.cachedDeletionLines = diff.deletionLines;\n this.deletionMarkerLookup = buildMarkerLookup(diff.deletionLines);\n }\n }\n\n private getMergeConflictMarkerTypeAtIndex(\n side: 'additions' | 'deletions',\n lineIndex: number | undefined\n ): MergeConflictMarkerType | undefined {\n if (lineIndex == null) {\n return undefined;\n }\n const value = (\n side === 'additions'\n ? this.additionMarkerLookup\n : this.deletionMarkerLookup\n )[lineIndex];\n if (value == null) {\n return undefined;\n }\n return value === 'none' ? undefined : value;\n }\n\n protected override getOptionsWithDefaults(): BaseUnresolvedOptionsWithDefaults {\n const options = super.getOptionsWithDefaults();\n options.diffStyle = 'unified';\n options.lineDiffType = 'none';\n // NOTE(amadeus): Aint nobody got time for a spread\n (options as BaseUnresolvedOptionsWithDefaults).mergeConflictActionsType =\n this.options.mergeConflictActionsType ?? 'default';\n return options as BaseUnresolvedOptionsWithDefaults;\n }\n}\n\nfunction getMergeConflictGutterProperties(\n mergeConflictType: MergeConflictMarkerType | undefined\n): Properties | undefined {\n return mergeConflictType != null\n ? { 'data-merge-conflict': mergeConflictType }\n : undefined;\n}\n\nfunction getMergeConflictContentProperties(\n type: 'change' | 'context' | 'context-expanded',\n mergeConflictType: MergeConflictMarkerType | undefined\n): Properties | undefined {\n if (mergeConflictType == null) {\n return undefined;\n }\n if (type === 'change') {\n if (mergeConflictType === 'current' || mergeConflictType === 'incoming') {\n return {\n 'data-line-type': 'context',\n 'data-merge-conflict': mergeConflictType,\n };\n }\n return undefined;\n }\n if (\n mergeConflictType === 'marker-start' ||\n mergeConflictType === 'marker-base' ||\n mergeConflictType === 'marker-separator' ||\n mergeConflictType === 'marker-end'\n ) {\n return { 'data-merge-conflict': mergeConflictType };\n }\n return undefined;\n}\n\nfunction getMergeConflictMarkerType(\n line: string | undefined\n): MergeConflictMarkerType | undefined {\n if (line == null) {\n return undefined;\n }\n const trimmed = line.replace(/(?:\\r\\n|\\n|\\r)$/, '');\n if (START_MARKER.test(trimmed)) return 'marker-start';\n if (BASE_MARKER.test(trimmed)) return 'marker-base';\n if (SEPARATOR_MARKER.test(trimmed)) return 'marker-separator';\n if (END_MARKER.test(trimmed)) return 'marker-end';\n return undefined;\n}\n\nfunction buildMarkerLookup(lines: string[]): MergeConflictMarkerLookup[] {\n const markerLookup: MergeConflictMarkerLookup[] = new Array(lines.length);\n for (let index = 0; index < lines.length; index++) {\n markerLookup[index] = getMergeConflictMarkerType(lines[index]) ?? 'none';\n }\n return markerLookup;\n}\n\nfunction getUnifiedRenderedSide(\n ctx: RenderedLineContext\n): DiffLineAnnotation<undefined>['side'] {\n if (\n ctx.type === 'change' &&\n ctx.deletionLine != null &&\n ctx.additionLine == null\n ) {\n return 'deletions';\n }\n return 'additions';\n}\n\nfunction createMergeConflictGutterGap(): HASTElement {\n const gap = createGutterGap(undefined, 'annotation', 1);\n gap.properties['data-gutter-buffer'] = 'merge-conflict-action';\n return gap;\n}\n\ninterface CreateMergeConflictActionsRowElementProps {\n row: MergeConflictActionRowData;\n includeDefaultActions: boolean;\n includeSlot: boolean;\n}\n\nfunction createMergeConflictActionsRowElement({\n row,\n includeDefaultActions,\n includeSlot,\n}: CreateMergeConflictActionsRowElementProps): HASTElement {\n const contentChildren: HASTElement[] = includeDefaultActions\n ? createMergeConflictActionsContent(row.conflictIndex)\n : [];\n if (includeSlot) {\n contentChildren.push(\n createHastElement({\n tagName: 'slot',\n properties: {\n name: getMergeConflictActionSlotName({\n side: row.side,\n lineNumber: row.lineNumber,\n conflictIndex: row.conflictIndex,\n }),\n 'data-merge-conflict-action-slot': '',\n },\n })\n );\n }\n return createHastElement({\n tagName: 'div',\n properties: {\n 'data-merge-conflict-actions': '',\n },\n children: [\n createHastElement({\n tagName: 'div',\n properties: { 'data-merge-conflict-actions-content': '' },\n children: contentChildren,\n }),\n ],\n });\n}\n\nfunction createMergeConflictActionsContent(\n conflictIndex: number\n): HASTElement[] {\n return [\n createMergeConflictActionButton({\n resolution: 'current',\n label: 'Accept current change',\n conflictIndex,\n }),\n createMergeConflictActionSeparator(),\n createMergeConflictActionButton({\n resolution: 'incoming',\n label: 'Accept incoming change',\n conflictIndex,\n }),\n createMergeConflictActionSeparator(),\n createMergeConflictActionButton({\n resolution: 'both',\n label: 'Accept both',\n conflictIndex,\n }),\n ];\n}\n\ninterface CreateMergeConflictActionButtonProps {\n resolution: MergeConflictResolution;\n label: string;\n conflictIndex: number;\n}\n\nfunction createMergeConflictActionButton({\n resolution,\n label,\n conflictIndex,\n}: CreateMergeConflictActionButtonProps): HASTElement {\n return createHastElement({\n tagName: 'button',\n properties: {\n type: 'button',\n 'data-merge-conflict-action': resolution,\n 'data-merge-conflict-conflict-index': `${conflictIndex}`,\n },\n children: [createTextNodeElement(label)],\n });\n}\n\nfunction createMergeConflictActionSeparator(): HASTElement {\n return createHastElement({\n tagName: 'span',\n properties: { 'data-merge-conflict-action-separator': '' },\n children: [createTextNodeElement('|')],\n });\n}\n"],"mappings":"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"}