@pierre/diffs 1.0.6 → 1.1.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/dist/components/File.d.ts +4 -2
  2. package/dist/components/File.d.ts.map +1 -1
  3. package/dist/components/File.js +80 -34
  4. package/dist/components/File.js.map +1 -1
  5. package/dist/components/FileDiff.d.ts +50 -28
  6. package/dist/components/FileDiff.d.ts.map +1 -1
  7. package/dist/components/FileDiff.js +222 -80
  8. package/dist/components/FileDiff.js.map +1 -1
  9. package/dist/components/FileStream.d.ts +1 -0
  10. package/dist/components/FileStream.d.ts.map +1 -1
  11. package/dist/components/FileStream.js +10 -6
  12. package/dist/components/FileStream.js.map +1 -1
  13. package/dist/components/web-components.d.ts.map +1 -1
  14. package/dist/components/web-components.js +1 -1
  15. package/dist/components/web-components.js.map +1 -1
  16. package/dist/constants.d.ts +8 -2
  17. package/dist/constants.d.ts.map +1 -1
  18. package/dist/constants.js +10 -1
  19. package/dist/constants.js.map +1 -1
  20. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts +1 -1
  21. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts.map +1 -1
  22. package/dist/highlighter/languages/getResolvedOrResolveLanguage.js.map +1 -1
  23. package/dist/highlighter/languages/resolveLanguage.d.ts +1 -1
  24. package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -1
  25. package/dist/highlighter/languages/resolveLanguage.js.map +1 -1
  26. package/dist/highlighter/languages/resolveLanguages.js +1 -1
  27. package/dist/highlighter/languages/resolveLanguages.js.map +1 -1
  28. package/dist/highlighter/shared_highlighter.js +1 -1
  29. package/dist/highlighter/shared_highlighter.js.map +1 -1
  30. package/dist/highlighter/themes/registerCustomCSSVariableTheme.js +1 -1
  31. package/dist/highlighter/themes/registerCustomCSSVariableTheme.js.map +1 -1
  32. package/dist/index.d.ts +19 -10
  33. package/dist/index.js +14 -5
  34. package/dist/managers/LineSelectionManager.d.ts.map +1 -1
  35. package/dist/managers/LineSelectionManager.js +8 -9
  36. package/dist/managers/LineSelectionManager.js.map +1 -1
  37. package/dist/managers/ScrollSyncManager.d.ts +1 -0
  38. package/dist/managers/ScrollSyncManager.d.ts.map +1 -1
  39. package/dist/managers/ScrollSyncManager.js +14 -6
  40. package/dist/managers/ScrollSyncManager.js.map +1 -1
  41. package/dist/react/MultiFileDiff.js +2 -2
  42. package/dist/react/MultiFileDiff.js.map +1 -1
  43. package/dist/react/index.d.ts +2 -2
  44. package/dist/react/utils/renderDiffChildren.d.ts +4 -4
  45. package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
  46. package/dist/react/utils/renderDiffChildren.js +3 -3
  47. package/dist/react/utils/renderDiffChildren.js.map +1 -1
  48. package/dist/react/utils/useFileDiffInstance.js.map +1 -1
  49. package/dist/renderers/DiffHunksRenderer.d.ts +7 -6
  50. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  51. package/dist/renderers/DiffHunksRenderer.js +263 -337
  52. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  53. package/dist/renderers/FileRenderer.d.ts +1 -0
  54. package/dist/renderers/FileRenderer.d.ts.map +1 -1
  55. package/dist/renderers/FileRenderer.js +11 -4
  56. package/dist/renderers/FileRenderer.js.map +1 -1
  57. package/dist/ssr/index.d.ts +2 -2
  58. package/dist/style.js +1 -1
  59. package/dist/style.js.map +1 -1
  60. package/dist/types.d.ts +247 -43
  61. package/dist/types.d.ts.map +1 -1
  62. package/dist/utils/areDiffLineAnnotationsEqual.d.ts +7 -0
  63. package/dist/utils/areDiffLineAnnotationsEqual.d.ts.map +1 -0
  64. package/dist/utils/areDiffLineAnnotationsEqual.js +8 -0
  65. package/dist/utils/areDiffLineAnnotationsEqual.js.map +1 -0
  66. package/dist/utils/areHunkDataEqual.d.ts +7 -0
  67. package/dist/utils/areHunkDataEqual.d.ts.map +1 -0
  68. package/dist/utils/areHunkDataEqual.js +8 -0
  69. package/dist/utils/areHunkDataEqual.js.map +1 -0
  70. package/dist/utils/areLineAnnotationsEqual.d.ts +7 -0
  71. package/dist/utils/areLineAnnotationsEqual.d.ts.map +1 -0
  72. package/dist/utils/areLineAnnotationsEqual.js +8 -0
  73. package/dist/utils/areLineAnnotationsEqual.js.map +1 -0
  74. package/dist/utils/arePrePropertiesEqual.d.ts +7 -0
  75. package/dist/utils/arePrePropertiesEqual.d.ts.map +1 -0
  76. package/dist/utils/arePrePropertiesEqual.js +9 -0
  77. package/dist/utils/arePrePropertiesEqual.js.map +1 -0
  78. package/dist/utils/areRenderRangesEqual.d.ts +7 -0
  79. package/dist/utils/areRenderRangesEqual.d.ts.map +1 -0
  80. package/dist/utils/areRenderRangesEqual.js +9 -0
  81. package/dist/utils/areRenderRangesEqual.js.map +1 -0
  82. package/dist/utils/areVirtualWindowSpecsEqual.d.ts +7 -0
  83. package/dist/utils/areVirtualWindowSpecsEqual.d.ts.map +1 -0
  84. package/dist/utils/areVirtualWindowSpecsEqual.js +9 -0
  85. package/dist/utils/areVirtualWindowSpecsEqual.js.map +1 -0
  86. package/dist/utils/areWorkerStatsEqual.d.ts +8 -0
  87. package/dist/utils/areWorkerStatsEqual.d.ts.map +1 -0
  88. package/dist/utils/areWorkerStatsEqual.js +9 -0
  89. package/dist/utils/areWorkerStatsEqual.js.map +1 -0
  90. package/dist/utils/createTransformerWithState.js +1 -1
  91. package/dist/utils/createTransformerWithState.js.map +1 -1
  92. package/dist/utils/createWindowFromScrollPosition.d.ts +22 -0
  93. package/dist/utils/createWindowFromScrollPosition.d.ts.map +1 -0
  94. package/dist/utils/createWindowFromScrollPosition.js +26 -0
  95. package/dist/utils/createWindowFromScrollPosition.js.map +1 -0
  96. package/dist/utils/diffAcceptRejectHunk.js +36 -21
  97. package/dist/utils/diffAcceptRejectHunk.js.map +1 -1
  98. package/dist/utils/formatCSSVariablePrefix.d.ts +1 -1
  99. package/dist/utils/formatCSSVariablePrefix.js +2 -2
  100. package/dist/utils/formatCSSVariablePrefix.js.map +1 -1
  101. package/dist/utils/getHighlighterThemeStyles.js +12 -12
  102. package/dist/utils/getHighlighterThemeStyles.js.map +1 -1
  103. package/dist/utils/getOrCreateCodeNode.d.ts +14 -0
  104. package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -0
  105. package/dist/utils/getOrCreateCodeNode.js +13 -0
  106. package/dist/utils/getOrCreateCodeNode.js.map +1 -0
  107. package/dist/utils/getTotalLineCountFromHunks.js +1 -1
  108. package/dist/utils/getTotalLineCountFromHunks.js.map +1 -1
  109. package/dist/utils/hast_utils.d.ts +2 -1
  110. package/dist/utils/hast_utils.d.ts.map +1 -1
  111. package/dist/utils/hast_utils.js +10 -1
  112. package/dist/utils/hast_utils.js.map +1 -1
  113. package/dist/utils/isDefaultRenderRange.d.ts +7 -0
  114. package/dist/utils/isDefaultRenderRange.d.ts.map +1 -0
  115. package/dist/utils/isDefaultRenderRange.js +8 -0
  116. package/dist/utils/isDefaultRenderRange.js.map +1 -0
  117. package/dist/utils/iterateOverDiff.d.ts +39 -0
  118. package/dist/utils/iterateOverDiff.d.ts.map +1 -0
  119. package/dist/utils/iterateOverDiff.js +356 -0
  120. package/dist/utils/iterateOverDiff.js.map +1 -0
  121. package/dist/utils/parseDiffFromFile.d.ts.map +1 -1
  122. package/dist/utils/parseDiffFromFile.js +8 -6
  123. package/dist/utils/parseDiffFromFile.js.map +1 -1
  124. package/dist/utils/parsePatchFiles.d.ts +15 -3
  125. package/dist/utils/parsePatchFiles.d.ts.map +1 -1
  126. package/dist/utils/parsePatchFiles.js +207 -158
  127. package/dist/utils/parsePatchFiles.js.map +1 -1
  128. package/dist/utils/processLine.js +4 -3
  129. package/dist/utils/processLine.js.map +1 -1
  130. package/dist/utils/renderDiffWithHighlighter.d.ts +7 -2
  131. package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
  132. package/dist/utils/renderDiffWithHighlighter.js +151 -229
  133. package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
  134. package/dist/utils/renderFileWithHighlighter.js +2 -2
  135. package/dist/utils/renderFileWithHighlighter.js.map +1 -1
  136. package/dist/utils/setWrapperNodeProps.d.ts +3 -7
  137. package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
  138. package/dist/utils/setWrapperNodeProps.js +1 -1
  139. package/dist/utils/setWrapperNodeProps.js.map +1 -1
  140. package/dist/worker/WorkerPoolManager.d.ts +9 -2
  141. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  142. package/dist/worker/WorkerPoolManager.js +124 -45
  143. package/dist/worker/WorkerPoolManager.js.map +1 -1
  144. package/dist/worker/types.d.ts +7 -0
  145. package/dist/worker/types.d.ts.map +1 -1
  146. package/dist/worker/worker-portable.js +652 -260
  147. package/dist/worker/worker-portable.js.map +1 -1
  148. package/dist/worker/worker.js +529 -249
  149. package/dist/worker/worker.js.map +1 -1
  150. package/package.json +21 -2
  151. package/dist/utils/createCodeNode.d.ts +0 -12
  152. package/dist/utils/createCodeNode.d.ts.map +0 -1
  153. package/dist/utils/createCodeNode.js +0 -12
  154. package/dist/utils/createCodeNode.js.map +0 -1
package/dist/index.d.ts CHANGED
@@ -1,8 +1,11 @@
1
- import { AnnotationLineMap, AnnotationSide, AnnotationSpan, BaseCodeOptions, BaseDiffOptions, BundledLanguage, ChangeContent, ChangeHunk, ChangeTypes, CodeToHastOptions, ContextContent, DecorationItem, DiffLineAnnotation, DiffLineEventBaseProps, DiffsHighlighter, DiffsThemeNames, ExpansionDirections, ExtensionFormatMap, FileContents, FileDiffMetadata, GapSpan, Hunk, HunkData, HunkLineType, HunkSeparators, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSpans, LineTypes, ObservedAnnotationNodes, ObservedGridNodes, ParsedPatch, PrePropertiesConfig, RenderDiffFilesResult, RenderDiffHunksResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderMetadataProps, RenderedDiffASTCache, RenderedFileASTCache, SharedRenderState, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType } from "./types.js";
2
- import { ALTERNATE_FILE_NAMES_GIT, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, DEFAULT_THEMES, DIFFS_TAG_NAME, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, FILE_MODE_FROM_INDEX, GIT_DIFF_FILE_BREAK_REGEX, HEADER_METADATA_SLOT_ID, HUNK_HEADER, SPLIT_WITH_NEWLINES, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE } from "./constants.js";
1
+ import { AnnotationLineMap, AnnotationSide, AnnotationSpan, BaseCodeOptions, BaseDiffOptions, BundledLanguage, ChangeContent, ChangeTypes, CodeToHastOptions, ContextContent, DecorationItem, DiffLineAnnotation, DiffLineEventBaseProps, DiffsHighlighter, DiffsThemeNames, ExpansionDirections, ExtensionFormatMap, FileContents, FileDiffMetadata, ForcePlainTextOptions, GapSpan, Hunk, HunkData, HunkExpansionRegion, HunkLineType, HunkSeparators, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSpans, LineTypes, ObservedAnnotationNodes, ObservedGridNodes, ParsedPatch, PrePropertiesConfig, RenderDiffFilesResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderMetadataProps, RenderRange, RenderWindow, RenderedDiffASTCache, RenderedFileASTCache, SharedRenderState, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType, VirtualWindowSpecs } from "./types.js";
2
+ import { ALTERNATE_FILE_NAMES_GIT, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, DEFAULT_EXPANDED_REGION, DEFAULT_THEMES, DIFFS_TAG_NAME, DIFF_HEADER_HEIGHT, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, FILE_GAP, FILE_MODE_FROM_INDEX, GIT_DIFF_FILE_BREAK_REGEX, HEADER_METADATA_SLOT_ID, HUNK_HEADER, HUNK_SEPARATOR_HEIGHT, LINE_HEIGHT, LINE_HUNK_COUNT, SPLIT_WITH_NEWLINES, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE } from "./constants.js";
3
3
  import { LineSelectionManager, LineSelectionOptions, SelectedLineRange, SelectionSide, pluckLineSelectionOptions } from "./managers/LineSelectionManager.js";
4
4
  import { GetHoveredLineResult, LogTypes, MouseEventManager, MouseEventManagerBaseOptions, MouseEventManagerMode, MouseEventManagerOptions, OnDiffLineClickProps, OnDiffLineEnterLeaveProps, OnLineClickProps, OnLineEnterLeaveProps, pluckMouseEventOptions } from "./managers/MouseEventManager.js";
5
5
  import { File, FileHyrdateProps, FileOptions, FileRenderProps } from "./components/File.js";
6
+ import { ResizeManager } from "./managers/ResizeManager.js";
7
+ import { ScrollSyncManager } from "./managers/ScrollSyncManager.js";
8
+ import { DiffHunksRenderer, HunksRenderResult } from "./renderers/DiffHunksRenderer.js";
6
9
  import { FileDiff, FileDiffHydrationProps, FileDiffOptions, FileDiffRenderProps } from "./components/FileDiff.js";
7
10
  import { CodeToTokenTransformStreamOptions, RecallToken, ShikiStreamTokenizerEnqueueResult, ShikiStreamTokenizerOptions } from "./shiki-stream/types.js";
8
11
  import { ShikiStreamTokenizer } from "./shiki-stream/tokenizer.js";
@@ -29,21 +32,24 @@ import { registerCustomCSSVariableTheme } from "./highlighter/themes/registerCus
29
32
  import { registerCustomTheme } from "./highlighter/themes/registerCustomTheme.js";
30
33
  import { resolveTheme } from "./highlighter/themes/resolveTheme.js";
31
34
  import { resolveThemes } from "./highlighter/themes/resolveThemes.js";
32
- import { ResizeManager } from "./managers/ResizeManager.js";
33
- import { ScrollSyncManager } from "./managers/ScrollSyncManager.js";
34
35
  import { queueRender } from "./managers/UniversalRenderingManager.js";
35
- import { DiffHunksRenderer, HunksRenderResult } from "./renderers/DiffHunksRenderer.js";
36
36
  import { FileRenderResult, FileRenderer, FileRendererOptions } from "./renderers/FileRenderer.js";
37
37
  import { SVGSpriteNames, SVGSpriteSheet } from "./sprite.js";
38
+ import { areDiffLineAnnotationsEqual } from "./utils/areDiffLineAnnotationsEqual.js";
38
39
  import { areFilesEqual } from "./utils/areFilesEqual.js";
40
+ import { areHunkDataEqual } from "./utils/areHunkDataEqual.js";
41
+ import { areLineAnnotationsEqual } from "./utils/areLineAnnotationsEqual.js";
39
42
  import { areObjectsEqual } from "./utils/areObjectsEqual.js";
40
43
  import { areOptionsEqual } from "./utils/areOptionsEqual.js";
44
+ import { arePrePropertiesEqual } from "./utils/arePrePropertiesEqual.js";
45
+ import { areRenderRangesEqual } from "./utils/areRenderRangesEqual.js";
41
46
  import { areSelectionsEqual } from "./utils/areSelectionsEqual.js";
42
47
  import { areThemesEqual } from "./utils/areThemesEqual.js";
48
+ import { areVirtualWindowSpecsEqual } from "./utils/areVirtualWindowSpecsEqual.js";
49
+ import { areWorkerStatsEqual } from "./utils/areWorkerStatsEqual.js";
43
50
  import { cleanLastNewline } from "./utils/cleanLastNewline.js";
44
51
  import { createAnnotationElement } from "./utils/createAnnotationElement.js";
45
52
  import { createAnnotationWrapperNode } from "./utils/createAnnotationWrapperNode.js";
46
- import { createCodeNode } from "./utils/createCodeNode.js";
47
53
  import { createEmptyRowBuffer } from "./utils/createEmptyRowBuffer.js";
48
54
  import { CreateFileHeaderElementProps, createFileHeaderElement } from "./utils/createFileHeaderElement.js";
49
55
  import { createHoverContentNode } from "./utils/createHoverContentNode.js";
@@ -55,6 +61,7 @@ import { createSpanFromToken } from "./utils/createSpanNodeFromToken.js";
55
61
  import { createStyleElement } from "./utils/createStyleElement.js";
56
62
  import { createTransformerWithState } from "./utils/createTransformerWithState.js";
57
63
  import { createUnsafeCSSStyleNode } from "./utils/createUnsafeCSSStyleNode.js";
64
+ import { createWindowFromScrollPosition } from "./utils/createWindowFromScrollPosition.js";
58
65
  import { wrapCoreCSS, wrapUnsafeCSS } from "./utils/cssWrappers.js";
59
66
  import { diffAcceptRejectHunk } from "./utils/diffAcceptRejectHunk.js";
60
67
  import { formatCSSVariablePrefix } from "./utils/formatCSSVariablePrefix.js";
@@ -66,20 +73,22 @@ import { getIconForType } from "./utils/getIconForType.js";
66
73
  import { getLineAnnotationName } from "./utils/getLineAnnotationName.js";
67
74
  import { getLineEndingType } from "./utils/getLineEndingType.js";
68
75
  import { getLineNodes } from "./utils/getLineNodes.js";
76
+ import { getOrCreateCodeNode } from "./utils/getOrCreateCodeNode.js";
69
77
  import { getSingularPatch } from "./utils/getSingularPatch.js";
70
78
  import { getThemes } from "./utils/getThemes.js";
71
79
  import { getTotalLineCountFromHunks } from "./utils/getTotalLineCountFromHunks.js";
72
- import { createHastElement, createIconElement, createTextNodeElement, findCodeElement } from "./utils/hast_utils.js";
80
+ import { createBufferElement, createHastElement, createIconElement, createTextNodeElement, findCodeElement } from "./utils/hast_utils.js";
81
+ import { isDefaultRenderRange } from "./utils/isDefaultRenderRange.js";
73
82
  import { isWorkerContext } from "./utils/isWorkerContext.js";
74
83
  import { createDiffSpanDecoration, pushOrJoinSpan } from "./utils/parseDiffDecorations.js";
75
84
  import { parseDiffFromFile } from "./utils/parseDiffFromFile.js";
76
85
  import { ParsedLine, parseLineType } from "./utils/parseLineType.js";
77
- import { parsePatchFiles } from "./utils/parsePatchFiles.js";
86
+ import { parsePatchFiles, processFile, processPatch } from "./utils/parsePatchFiles.js";
78
87
  import { prerenderHTMLIfNecessary } from "./utils/prerenderHTMLIfNecessary.js";
79
88
  import { processLine } from "./utils/processLine.js";
80
89
  import { renderDiffWithHighlighter } from "./utils/renderDiffWithHighlighter.js";
81
90
  import { renderFileWithHighlighter } from "./utils/renderFileWithHighlighter.js";
82
91
  import { setLanguageOverride } from "./utils/setLanguageOverride.js";
83
- import { SetPreNodePropertiesProps, setPreNodeProperties } from "./utils/setWrapperNodeProps.js";
92
+ import { setPreNodeProperties } from "./utils/setWrapperNodeProps.js";
84
93
  import { codeToHtml, createCssVariablesTheme as createCSSVariablesTheme } from "shiki";
85
- export { ALTERNATE_FILE_NAMES_GIT, AnnotationLineMap, AnnotationSide, AnnotationSpan, AttachedLanguages, AttachedThemes, BaseCodeOptions, BaseDiffOptions, BundledLanguage, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, ChangeContent, ChangeHunk, ChangeTypes, CodeToHastOptions, CodeToTokenTransformStream, CodeToTokenTransformStreamOptions, ContextContent, CreateFileHeaderElementProps, DEFAULT_THEMES, DIFFS_TAG_NAME, DecorationItem, DiffHunksRenderer, DiffLineAnnotation, DiffLineEventBaseProps, DiffsHighlighter, DiffsThemeNames, EXTENSION_TO_FILE_FORMAT, ExpansionDirections, ExtensionFormatMap, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, FILE_MODE_FROM_INDEX, File, FileContents, FileDiff, FileDiffHydrationProps, FileDiffMetadata, FileDiffOptions, FileDiffRenderProps, FileHyrdateProps, FileOptions, FileRenderProps, FileRenderResult, FileRenderer, FileRendererOptions, FileStream, FileStreamOptions, GIT_DIFF_FILE_BREAK_REGEX, GapSpan, GetHoveredLineResult, HEADER_METADATA_SLOT_ID, HUNK_HEADER, Hunk, HunkData, HunkLineType, HunkSeparators, HunksRenderResult, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSelectionManager, LineSelectionOptions, LineSpans, LineTypes, LogTypes, MouseEventManager, MouseEventManagerBaseOptions, MouseEventManagerMode, MouseEventManagerOptions, ObservedAnnotationNodes, ObservedGridNodes, OnDiffLineClickProps, OnDiffLineEnterLeaveProps, OnLineClickProps, OnLineEnterLeaveProps, ParsedLine, ParsedPatch, PrePropertiesConfig, RecallToken, RegisteredCustomThemes, RenderDiffFilesResult, RenderDiffHunksResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderMetadataProps, RenderedDiffASTCache, RenderedFileASTCache, ResizeManager, ResolvedLanguages, ResolvedThemes, ResolvingLanguages, ResolvingThemes, SPLIT_WITH_NEWLINES, SVGSpriteNames, SVGSpriteSheet, ScrollSyncManager, SelectedLineRange, SelectionSide, SetPreNodePropertiesProps, SharedRenderState, ShikiStreamTokenizer, ShikiStreamTokenizerEnqueueResult, ShikiStreamTokenizerOptions, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE, areFilesEqual, areLanguagesAttached, areObjectsEqual, areOptionsEqual, areSelectionsEqual, areThemesAttached, areThemesEqual, attachResolvedLanguages, attachResolvedThemes, cleanLastNewline, cleanUpResolvedLanguages, cleanUpResolvedThemes, codeToHtml, createAnnotationElement, createAnnotationWrapperNode, createCSSVariablesTheme, createCodeNode, createDiffSpanDecoration, createEmptyRowBuffer, createFileHeaderElement, createHastElement, createHoverContentNode, createIconElement, createNoNewlineElement, createPreElement, createPreWrapperProperties, createRowNodes, createSeparator, createSpanFromToken, createStyleElement, createTextNodeElement, createTransformerWithState, createUnsafeCSSStyleNode, diffAcceptRejectHunk, disposeHighlighter, extendFileFormatMap, findCodeElement, formatCSSVariablePrefix, getFiletypeFromFileName, getHighlighterIfLoaded, getHighlighterOptions, getHighlighterThemeStyles, getHunkSeparatorSlotName, getIconForType, getLineAnnotationName, getLineEndingType, getLineNodes, getResolvedLanguages, getResolvedOrResolveLanguage, getResolvedOrResolveTheme, getResolvedThemes, getSharedHighlighter, getSingularPatch, getThemes, getTotalLineCountFromHunks, hasResolvedLanguages, hasResolvedThemes, isHighlighterLoaded, isHighlighterLoading, isHighlighterNull, isWorkerContext, parseDiffFromFile, parseLineType, parsePatchFiles, pluckLineSelectionOptions, pluckMouseEventOptions, preloadHighlighter, prerenderHTMLIfNecessary, processLine, pushOrJoinSpan, queueRender, registerCustomCSSVariableTheme, registerCustomTheme, renderDiffWithHighlighter, renderFileWithHighlighter, resolveLanguage, resolveLanguages, resolveTheme, resolveThemes, setLanguageOverride, setPreNodeProperties, wrapCoreCSS, wrapUnsafeCSS };
94
+ export { ALTERNATE_FILE_NAMES_GIT, AnnotationLineMap, AnnotationSide, AnnotationSpan, AttachedLanguages, AttachedThemes, BaseCodeOptions, BaseDiffOptions, BundledLanguage, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, ChangeContent, ChangeTypes, CodeToHastOptions, CodeToTokenTransformStream, CodeToTokenTransformStreamOptions, ContextContent, CreateFileHeaderElementProps, DEFAULT_EXPANDED_REGION, DEFAULT_THEMES, DIFFS_TAG_NAME, DIFF_HEADER_HEIGHT, DecorationItem, DiffHunksRenderer, DiffLineAnnotation, DiffLineEventBaseProps, DiffsHighlighter, DiffsThemeNames, EXTENSION_TO_FILE_FORMAT, ExpansionDirections, ExtensionFormatMap, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, FILE_GAP, FILE_MODE_FROM_INDEX, File, FileContents, FileDiff, FileDiffHydrationProps, FileDiffMetadata, FileDiffOptions, FileDiffRenderProps, FileHyrdateProps, FileOptions, FileRenderProps, FileRenderResult, FileRenderer, FileRendererOptions, FileStream, FileStreamOptions, ForcePlainTextOptions, GIT_DIFF_FILE_BREAK_REGEX, GapSpan, GetHoveredLineResult, HEADER_METADATA_SLOT_ID, HUNK_HEADER, HUNK_SEPARATOR_HEIGHT, Hunk, HunkData, HunkExpansionRegion, HunkLineType, HunkSeparators, HunksRenderResult, LINE_HEIGHT, LINE_HUNK_COUNT, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSelectionManager, LineSelectionOptions, LineSpans, LineTypes, LogTypes, MouseEventManager, MouseEventManagerBaseOptions, MouseEventManagerMode, MouseEventManagerOptions, ObservedAnnotationNodes, ObservedGridNodes, OnDiffLineClickProps, OnDiffLineEnterLeaveProps, OnLineClickProps, OnLineEnterLeaveProps, ParsedLine, ParsedPatch, PrePropertiesConfig, RecallToken, RegisteredCustomThemes, RenderDiffFilesResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderMetadataProps, RenderRange, RenderWindow, RenderedDiffASTCache, RenderedFileASTCache, ResizeManager, ResolvedLanguages, ResolvedThemes, ResolvingLanguages, ResolvingThemes, SPLIT_WITH_NEWLINES, SVGSpriteNames, SVGSpriteSheet, ScrollSyncManager, SelectedLineRange, SelectionSide, SharedRenderState, ShikiStreamTokenizer, ShikiStreamTokenizerEnqueueResult, ShikiStreamTokenizerOptions, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE, VirtualWindowSpecs, areDiffLineAnnotationsEqual, areFilesEqual, areHunkDataEqual, areLanguagesAttached, areLineAnnotationsEqual, areObjectsEqual, areOptionsEqual, arePrePropertiesEqual, areRenderRangesEqual, areSelectionsEqual, areThemesAttached, areThemesEqual, areVirtualWindowSpecsEqual, areWorkerStatsEqual, attachResolvedLanguages, attachResolvedThemes, cleanLastNewline, cleanUpResolvedLanguages, cleanUpResolvedThemes, codeToHtml, createAnnotationElement, createAnnotationWrapperNode, createBufferElement, createCSSVariablesTheme, createDiffSpanDecoration, createEmptyRowBuffer, createFileHeaderElement, createHastElement, createHoverContentNode, createIconElement, createNoNewlineElement, createPreElement, createPreWrapperProperties, createRowNodes, createSeparator, createSpanFromToken, createStyleElement, createTextNodeElement, createTransformerWithState, createUnsafeCSSStyleNode, createWindowFromScrollPosition, diffAcceptRejectHunk, disposeHighlighter, extendFileFormatMap, findCodeElement, formatCSSVariablePrefix, getFiletypeFromFileName, getHighlighterIfLoaded, getHighlighterOptions, getHighlighterThemeStyles, getHunkSeparatorSlotName, getIconForType, getLineAnnotationName, getLineEndingType, getLineNodes, getOrCreateCodeNode, getResolvedLanguages, getResolvedOrResolveLanguage, getResolvedOrResolveTheme, getResolvedThemes, getSharedHighlighter, getSingularPatch, getThemes, getTotalLineCountFromHunks, hasResolvedLanguages, hasResolvedThemes, isDefaultRenderRange, isHighlighterLoaded, isHighlighterLoading, isHighlighterNull, isWorkerContext, parseDiffFromFile, parseLineType, parsePatchFiles, pluckLineSelectionOptions, pluckMouseEventOptions, preloadHighlighter, prerenderHTMLIfNecessary, processFile, processLine, processPatch, pushOrJoinSpan, queueRender, registerCustomCSSVariableTheme, registerCustomTheme, renderDiffWithHighlighter, renderFileWithHighlighter, resolveLanguage, resolveLanguages, resolveTheme, resolveThemes, setLanguageOverride, setPreNodeProperties, wrapCoreCSS, wrapUnsafeCSS };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { ALTERNATE_FILE_NAMES_GIT, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, DEFAULT_THEMES, DIFFS_TAG_NAME, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, FILE_MODE_FROM_INDEX, GIT_DIFF_FILE_BREAK_REGEX, HEADER_METADATA_SLOT_ID, HUNK_HEADER, SPLIT_WITH_NEWLINES, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE } from "./constants.js";
1
+ import { ALTERNATE_FILE_NAMES_GIT, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, DEFAULT_EXPANDED_REGION, DEFAULT_THEMES, DIFFS_TAG_NAME, DIFF_HEADER_HEIGHT, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, FILE_GAP, FILE_MODE_FROM_INDEX, GIT_DIFF_FILE_BREAK_REGEX, HEADER_METADATA_SLOT_ID, HUNK_HEADER, HUNK_SEPARATOR_HEIGHT, LINE_HEIGHT, LINE_HUNK_COUNT, SPLIT_WITH_NEWLINES, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE } from "./constants.js";
2
2
  import { areSelectionsEqual } from "./utils/areSelectionsEqual.js";
3
3
  import { LineSelectionManager, pluckLineSelectionOptions } from "./managers/LineSelectionManager.js";
4
4
  import { MouseEventManager, pluckMouseEventOptions } from "./managers/MouseEventManager.js";
@@ -21,7 +21,7 @@ import { getThemes } from "./utils/getThemes.js";
21
21
  import { areThemesAttached } from "./highlighter/themes/areThemesAttached.js";
22
22
  import { hasResolvedThemes } from "./highlighter/themes/hasResolvedThemes.js";
23
23
  import { areThemesEqual } from "./utils/areThemesEqual.js";
24
- import { createHastElement, createIconElement, createTextNodeElement, findCodeElement } from "./utils/hast_utils.js";
24
+ import { createBufferElement, createHastElement, createIconElement, createTextNodeElement, findCodeElement } from "./utils/hast_utils.js";
25
25
  import { createAnnotationElement } from "./utils/createAnnotationElement.js";
26
26
  import { getIconForType } from "./utils/getIconForType.js";
27
27
  import { createFileHeaderElement } from "./utils/createFileHeaderElement.js";
@@ -39,25 +39,31 @@ import { renderFileWithHighlighter } from "./utils/renderFileWithHighlighter.js"
39
39
  import { FileRenderer } from "./renderers/FileRenderer.js";
40
40
  import { SVGSpriteSheet } from "./sprite.js";
41
41
  import { areFilesEqual } from "./utils/areFilesEqual.js";
42
+ import { areLineAnnotationsEqual } from "./utils/areLineAnnotationsEqual.js";
43
+ import { arePrePropertiesEqual } from "./utils/arePrePropertiesEqual.js";
42
44
  import { createAnnotationWrapperNode } from "./utils/createAnnotationWrapperNode.js";
43
- import { createCodeNode } from "./utils/createCodeNode.js";
44
45
  import { createHoverContentNode } from "./utils/createHoverContentNode.js";
45
46
  import { createUnsafeCSSStyleNode } from "./utils/createUnsafeCSSStyleNode.js";
46
47
  import { wrapCoreCSS, wrapUnsafeCSS } from "./utils/cssWrappers.js";
48
+ import { getOrCreateCodeNode } from "./utils/getOrCreateCodeNode.js";
47
49
  import { prerenderHTMLIfNecessary } from "./utils/prerenderHTMLIfNecessary.js";
48
50
  import { setPreNodeProperties } from "./utils/setWrapperNodeProps.js";
49
51
  import { File } from "./components/File.js";
50
52
  import { ScrollSyncManager } from "./managers/ScrollSyncManager.js";
53
+ import { areRenderRangesEqual } from "./utils/areRenderRangesEqual.js";
51
54
  import { createEmptyRowBuffer } from "./utils/createEmptyRowBuffer.js";
52
55
  import { createNoNewlineElement } from "./utils/createNoNewlineElement.js";
53
56
  import { createSeparator } from "./utils/createSeparator.js";
54
57
  import { getHunkSeparatorSlotName } from "./utils/getHunkSeparatorSlotName.js";
55
58
  import { getTotalLineCountFromHunks } from "./utils/getTotalLineCountFromHunks.js";
59
+ import { isDefaultRenderRange } from "./utils/isDefaultRenderRange.js";
56
60
  import { createDiffSpanDecoration, pushOrJoinSpan } from "./utils/parseDiffDecorations.js";
57
61
  import { renderDiffWithHighlighter } from "./utils/renderDiffWithHighlighter.js";
58
62
  import { DiffHunksRenderer } from "./renderers/DiffHunksRenderer.js";
63
+ import { areDiffLineAnnotationsEqual } from "./utils/areDiffLineAnnotationsEqual.js";
64
+ import { areHunkDataEqual } from "./utils/areHunkDataEqual.js";
59
65
  import { parseLineType } from "./utils/parseLineType.js";
60
- import { parsePatchFiles } from "./utils/parsePatchFiles.js";
66
+ import { parsePatchFiles, processFile, processPatch } from "./utils/parsePatchFiles.js";
61
67
  import { parseDiffFromFile } from "./utils/parseDiffFromFile.js";
62
68
  import { FileDiff } from "./components/FileDiff.js";
63
69
  import { queueRender } from "./managers/UniversalRenderingManager.js";
@@ -74,11 +80,14 @@ import { registerCustomCSSVariableTheme } from "./highlighter/themes/registerCus
74
80
  import { resolveThemes } from "./highlighter/themes/resolveThemes.js";
75
81
  import { areObjectsEqual } from "./utils/areObjectsEqual.js";
76
82
  import { areOptionsEqual } from "./utils/areOptionsEqual.js";
83
+ import { areVirtualWindowSpecsEqual } from "./utils/areVirtualWindowSpecsEqual.js";
84
+ import { areWorkerStatsEqual } from "./utils/areWorkerStatsEqual.js";
77
85
  import { createStyleElement } from "./utils/createStyleElement.js";
86
+ import { createWindowFromScrollPosition } from "./utils/createWindowFromScrollPosition.js";
78
87
  import { diffAcceptRejectHunk } from "./utils/diffAcceptRejectHunk.js";
79
88
  import { getLineEndingType } from "./utils/getLineEndingType.js";
80
89
  import { getSingularPatch } from "./utils/getSingularPatch.js";
81
90
  import { setLanguageOverride } from "./utils/setLanguageOverride.js";
82
91
  import { codeToHtml, createCssVariablesTheme as createCSSVariablesTheme } from "shiki";
83
92
 
84
- export { ALTERNATE_FILE_NAMES_GIT, AttachedLanguages, AttachedThemes, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, CodeToTokenTransformStream, DEFAULT_THEMES, DIFFS_TAG_NAME, DiffHunksRenderer, EXTENSION_TO_FILE_FORMAT, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, FILE_MODE_FROM_INDEX, File, FileDiff, FileRenderer, FileStream, GIT_DIFF_FILE_BREAK_REGEX, HEADER_METADATA_SLOT_ID, HUNK_HEADER, LineSelectionManager, MouseEventManager, RegisteredCustomThemes, ResizeManager, ResolvedLanguages, ResolvedThemes, ResolvingLanguages, ResolvingThemes, SPLIT_WITH_NEWLINES, SVGSpriteSheet, ScrollSyncManager, ShikiStreamTokenizer, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE, areFilesEqual, areLanguagesAttached, areObjectsEqual, areOptionsEqual, areSelectionsEqual, areThemesAttached, areThemesEqual, attachResolvedLanguages, attachResolvedThemes, cleanLastNewline, cleanUpResolvedLanguages, cleanUpResolvedThemes, codeToHtml, createAnnotationElement, createAnnotationWrapperNode, createCSSVariablesTheme, createCodeNode, createDiffSpanDecoration, createEmptyRowBuffer, createFileHeaderElement, createHastElement, createHoverContentNode, createIconElement, createNoNewlineElement, createPreElement, createPreWrapperProperties, createRowNodes, createSeparator, createSpanFromToken, createStyleElement, createTextNodeElement, createTransformerWithState, createUnsafeCSSStyleNode, diffAcceptRejectHunk, disposeHighlighter, extendFileFormatMap, findCodeElement, formatCSSVariablePrefix, getFiletypeFromFileName, getHighlighterIfLoaded, getHighlighterOptions, getHighlighterThemeStyles, getHunkSeparatorSlotName, getIconForType, getLineAnnotationName, getLineEndingType, getLineNodes, getResolvedLanguages, getResolvedOrResolveLanguage, getResolvedOrResolveTheme, getResolvedThemes, getSharedHighlighter, getSingularPatch, getThemes, getTotalLineCountFromHunks, hasResolvedLanguages, hasResolvedThemes, isHighlighterLoaded, isHighlighterLoading, isHighlighterNull, isWorkerContext, parseDiffFromFile, parseLineType, parsePatchFiles, pluckLineSelectionOptions, pluckMouseEventOptions, preloadHighlighter, prerenderHTMLIfNecessary, processLine, pushOrJoinSpan, queueRender, registerCustomCSSVariableTheme, registerCustomTheme, renderDiffWithHighlighter, renderFileWithHighlighter, resolveLanguage, resolveLanguages, resolveTheme, resolveThemes, setLanguageOverride, setPreNodeProperties, wrapCoreCSS, wrapUnsafeCSS };
93
+ export { ALTERNATE_FILE_NAMES_GIT, AttachedLanguages, AttachedThemes, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, CodeToTokenTransformStream, DEFAULT_EXPANDED_REGION, DEFAULT_THEMES, DIFFS_TAG_NAME, DIFF_HEADER_HEIGHT, DiffHunksRenderer, EXTENSION_TO_FILE_FORMAT, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, FILE_GAP, FILE_MODE_FROM_INDEX, File, FileDiff, FileRenderer, FileStream, GIT_DIFF_FILE_BREAK_REGEX, HEADER_METADATA_SLOT_ID, HUNK_HEADER, HUNK_SEPARATOR_HEIGHT, LINE_HEIGHT, LINE_HUNK_COUNT, LineSelectionManager, MouseEventManager, RegisteredCustomThemes, ResizeManager, ResolvedLanguages, ResolvedThemes, ResolvingLanguages, ResolvingThemes, SPLIT_WITH_NEWLINES, SVGSpriteSheet, ScrollSyncManager, ShikiStreamTokenizer, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE, areDiffLineAnnotationsEqual, areFilesEqual, areHunkDataEqual, areLanguagesAttached, areLineAnnotationsEqual, areObjectsEqual, areOptionsEqual, arePrePropertiesEqual, areRenderRangesEqual, areSelectionsEqual, areThemesAttached, areThemesEqual, areVirtualWindowSpecsEqual, areWorkerStatsEqual, attachResolvedLanguages, attachResolvedThemes, cleanLastNewline, cleanUpResolvedLanguages, cleanUpResolvedThemes, codeToHtml, createAnnotationElement, createAnnotationWrapperNode, createBufferElement, createCSSVariablesTheme, createDiffSpanDecoration, createEmptyRowBuffer, createFileHeaderElement, createHastElement, createHoverContentNode, createIconElement, createNoNewlineElement, createPreElement, createPreWrapperProperties, createRowNodes, createSeparator, createSpanFromToken, createStyleElement, createTextNodeElement, createTransformerWithState, createUnsafeCSSStyleNode, createWindowFromScrollPosition, diffAcceptRejectHunk, disposeHighlighter, extendFileFormatMap, findCodeElement, formatCSSVariablePrefix, getFiletypeFromFileName, getHighlighterIfLoaded, getHighlighterOptions, getHighlighterThemeStyles, getHunkSeparatorSlotName, getIconForType, getLineAnnotationName, getLineEndingType, getLineNodes, getOrCreateCodeNode, getResolvedLanguages, getResolvedOrResolveLanguage, getResolvedOrResolveTheme, getResolvedThemes, getSharedHighlighter, getSingularPatch, getThemes, getTotalLineCountFromHunks, hasResolvedLanguages, hasResolvedThemes, isDefaultRenderRange, isHighlighterLoaded, isHighlighterLoading, isHighlighterNull, isWorkerContext, parseDiffFromFile, parseLineType, parsePatchFiles, pluckLineSelectionOptions, pluckMouseEventOptions, preloadHighlighter, prerenderHTMLIfNecessary, processFile, processLine, processPatch, pushOrJoinSpan, queueRender, registerCustomCSSVariableTheme, registerCustomTheme, renderDiffWithHighlighter, renderFileWithHighlighter, resolveLanguage, resolveLanguages, resolveTheme, resolveThemes, setLanguageOverride, setPreNodeProperties, wrapCoreCSS, wrapUnsafeCSS };
@@ -1 +1 @@
1
- {"version":3,"file":"LineSelectionManager.d.ts","names":["options: LineSelectionOptions"],"sources":["../../src/managers/LineSelectionManager.ts"],"sourcesContent":[],"mappings":";;;KAGY,aAAA,GAAgB;UAEX,iBAAA;EAFjB,KAAY,EAAA,MAAA;EAEZ,IAAiB,CAAA,EAER,aAFQ;EAOjB,GAAiB,EAAA,MAAA;EAEU,OAAA,CAAA,EALf,aAKe;;AAEI,UAJd,oBAAA,CAIc;EAAA,mBAAA,CAAA,EAAA,OAAA;EAgB/B,cAAa,CAAA,EAAA,CAAA,KAAA,EAlBc,iBAkBd,GAAA,IAAA,EAAA,GAAA,IAAA;EAOkB,oBAAA,CAAA,EAAA,CAAA,KAAA,EAxBE,iBAwBF,GAAA,IAAA,EAAA,GAAA,IAAA;EAET,kBAAA,CAAA,EAAA,CAAA,KAAA,EAzBS,iBAyBT,GAAA,IAAA,EAAA,GAAA,IAAA;;;;;AAsbtB;;;;AAIE,cAncW,oBAAA,CAmcX;EACC,QAAA,OAAA;EAAuB,QAAA,GAAA;EAAA,QAAA,aAAA;;;;wBA7bK;sBAET;;aAoBT;;;sBA2BS;kBAaJ;;;;;;;;;;;;;;;;;;;iBA0XF,yBAAA;;;;;GAKb,uBAAuB"}
1
+ {"version":3,"file":"LineSelectionManager.d.ts","names":["options: LineSelectionOptions"],"sources":["../../src/managers/LineSelectionManager.ts"],"sourcesContent":[],"mappings":";;;KAGY,aAAA,GAAgB;UAEX,iBAAA;EAFjB,KAAY,EAAA,MAAA;EAEZ,IAAiB,CAAA,EAER,aAFQ;EAOjB,GAAiB,EAAA,MAAA;EAEU,OAAA,CAAA,EALf,aAKe;;AAEI,UAJd,oBAAA,CAIc;EAAA,mBAAA,CAAA,EAAA,OAAA;EAgB/B,cAAa,CAAA,EAAA,CAAA,KAAA,EAlBc,iBAkBd,GAAA,IAAA,EAAA,GAAA,IAAA;EAOkB,oBAAA,CAAA,EAAA,CAAA,KAAA,EAxBE,iBAwBF,GAAA,IAAA,EAAA,GAAA,IAAA;EAET,kBAAA,CAAA,EAAA,CAAA,KAAA,EAzBS,iBAyBT,GAAA,IAAA,EAAA,GAAA,IAAA;;;;;AAqbtB;;;;AAIE,cAlcW,oBAAA,CAkcX;EACC,QAAA,OAAA;EAAuB,QAAA,GAAA;EAAA,QAAA,aAAA;;;;wBA5bK;sBAET;;aAoBT;;;sBAwBS;kBAaJ;;;;;;;;;;;;;;;;;;;iBA4XF,yBAAA;;;;;GAKb,uBAAuB"}
@@ -36,15 +36,12 @@ var LineSelectionManager = class {
36
36
  }
37
37
  setup(pre) {
38
38
  this.setDirty();
39
- if (this.pre !== pre) this.cleanUp();
40
- this.pre = pre;
41
- const { enableLineSelection = false } = this.options;
42
- if (enableLineSelection) {
43
- this.pre.dataset.interactiveLineNumbers = "";
44
- this.attachEventListeners();
45
- } else {
46
- this.removeEventListeners();
47
- delete this.pre.dataset.interactiveLineNumbers;
39
+ if (this.pre !== pre) {
40
+ this.cleanUp();
41
+ this.pre = pre;
42
+ const { enableLineSelection = false } = this.options;
43
+ if (enableLineSelection) this.attachEventListeners();
44
+ else this.removeEventListeners();
48
45
  }
49
46
  this.setSelection(this.selectedRange);
50
47
  }
@@ -67,6 +64,7 @@ var LineSelectionManager = class {
67
64
  attachEventListeners() {
68
65
  if (this.pre == null) return;
69
66
  this.removeEventListeners();
67
+ this.pre.dataset.interactiveLineNumbers = "";
70
68
  this.pre.addEventListener("pointerdown", this.handleMouseDown);
71
69
  }
72
70
  removeEventListeners() {
@@ -74,6 +72,7 @@ var LineSelectionManager = class {
74
72
  this.pre.removeEventListener("pointerdown", this.handleMouseDown);
75
73
  document.removeEventListener("pointermove", this.handleMouseMove);
76
74
  document.removeEventListener("pointerup", this.handleMouseUp);
75
+ delete this.pre.dataset.interactiveLineNumbers;
77
76
  }
78
77
  handleMouseDown = (event) => {
79
78
  const mouseEventData = event.button === 0 ? this.getMouseEventDataForPath(event.composedPath(), "click") : void 0;
@@ -1 +1 @@
1
- {"version":3,"file":"LineSelectionManager.js","names":["options: LineSelectionOptions","lineNumber: number | undefined","lineIndex: number | undefined","eventSide: AnnotationSide | undefined"],"sources":["../../src/managers/LineSelectionManager.ts"],"sourcesContent":["import type { AnnotationSide } from '../types';\nimport { areSelectionsEqual } from '../utils/areSelectionsEqual';\n\nexport type SelectionSide = AnnotationSide;\n\nexport interface SelectedLineRange {\n start: number;\n side?: SelectionSide;\n end: number;\n endSide?: SelectionSide;\n}\n\nexport interface LineSelectionOptions {\n enableLineSelection?: boolean;\n onLineSelected?: (range: SelectedLineRange | null) => void;\n onLineSelectionStart?: (range: SelectedLineRange | null) => void;\n onLineSelectionEnd?: (range: SelectedLineRange | null) => void;\n}\n\ninterface MouseInfo {\n lineNumber: number;\n eventSide: AnnotationSide;\n lineIndex: number;\n}\n\n/**\n * Manages line selection state and interactions for code/diff viewers.\n * Handles:\n * - Click and drag selection\n * - Shift-click to extend selection\n * - DOM attribute updates (data-selected-line)\n */\nexport class LineSelectionManager {\n private pre: HTMLPreElement | undefined;\n private selectedRange: SelectedLineRange | null = null;\n private renderedSelectionRange: SelectedLineRange | null | undefined;\n private anchor: { line: number; side: SelectionSide } | undefined;\n private _queuedRender: number | undefined;\n\n constructor(private options: LineSelectionOptions = {}) {}\n\n setOptions(options: LineSelectionOptions): void {\n this.options = { ...this.options, ...options };\n this.removeEventListeners();\n if (this.options.enableLineSelection === true) {\n this.attachEventListeners();\n }\n }\n\n cleanUp(): void {\n this.removeEventListeners();\n if (this._queuedRender != null) {\n cancelAnimationFrame(this._queuedRender);\n this._queuedRender = undefined;\n }\n if (this.pre != null) {\n delete this.pre.dataset.interactiveLineNumbers;\n }\n this.pre = undefined;\n }\n\n setup(pre: HTMLPreElement): void {\n // Assume we are always dirty after a setup...\n this.setDirty();\n if (this.pre !== pre) {\n this.cleanUp();\n }\n this.pre = pre;\n const { enableLineSelection = false } = this.options;\n if (enableLineSelection) {\n this.pre.dataset.interactiveLineNumbers = '';\n this.attachEventListeners();\n } else {\n this.removeEventListeners();\n delete this.pre.dataset.interactiveLineNumbers;\n }\n\n this.setSelection(this.selectedRange);\n }\n\n setDirty(): void {\n this.renderedSelectionRange = undefined;\n }\n\n isDirty(): boolean {\n return this.renderedSelectionRange === undefined;\n }\n\n setSelection(range: SelectedLineRange | null): void {\n const isRangeChange = !(\n range === this.selectedRange ||\n areSelectionsEqual(range ?? undefined, this.selectedRange ?? undefined)\n );\n if (!this.isDirty() && !isRangeChange) return;\n this.selectedRange = range;\n this.renderSelection();\n if (isRangeChange) {\n this.notifySelectionChange();\n }\n }\n\n getSelection(): SelectedLineRange | null {\n return this.selectedRange;\n }\n\n private attachEventListeners(): void {\n if (this.pre == null) return;\n // Lets run a cleanup, just in case\n this.removeEventListeners();\n this.pre.addEventListener('pointerdown', this.handleMouseDown);\n }\n\n private removeEventListeners(): void {\n if (this.pre == null) return;\n this.pre.removeEventListener('pointerdown', this.handleMouseDown);\n document.removeEventListener('pointermove', this.handleMouseMove);\n document.removeEventListener('pointerup', this.handleMouseUp);\n }\n\n private handleMouseDown = (event: PointerEvent): void => {\n // Only handle left mouse button\n const mouseEventData =\n event.button === 0\n ? this.getMouseEventDataForPath(event.composedPath(), 'click')\n : undefined;\n if (mouseEventData == null) {\n return;\n }\n event.preventDefault();\n const { lineNumber, eventSide, lineIndex } = mouseEventData;\n if (event.shiftKey && this.selectedRange != null) {\n const range = this.deriveRowRangeFromDOM(\n this.selectedRange,\n this.pre?.dataset.type === 'split'\n );\n if (range == null) return;\n const useStart =\n range.start <= range.end\n ? lineIndex >= range.start\n : lineIndex <= range.end;\n this.anchor = {\n line: useStart ? this.selectedRange.start : this.selectedRange.end,\n side:\n (useStart\n ? this.selectedRange.side\n : (this.selectedRange.endSide ?? this.selectedRange.side)) ??\n 'additions',\n };\n this.updateSelection(lineNumber, eventSide);\n this.notifySelectionStart(this.selectedRange);\n } else {\n // Check if clicking on already selected single line to unselect\n if (\n this.selectedRange?.start === lineNumber &&\n this.selectedRange?.end === lineNumber\n ) {\n this.updateSelection(null);\n this.notifySelectionEnd(null);\n this.notifySelectionChange();\n return;\n }\n this.selectedRange = null;\n this.anchor = { line: lineNumber, side: eventSide };\n this.updateSelection(lineNumber, eventSide);\n this.notifySelectionStart(this.selectedRange);\n }\n\n document.addEventListener('pointermove', this.handleMouseMove);\n document.addEventListener('pointerup', this.handleMouseUp);\n };\n\n private handleMouseMove = (event: PointerEvent): void => {\n const mouseEventData = this.getMouseEventDataForPath(\n event.composedPath(),\n 'move'\n );\n if (mouseEventData == null || this.anchor == null) return;\n const { lineNumber, eventSide } = mouseEventData;\n this.updateSelection(lineNumber, eventSide);\n };\n\n private handleMouseUp = (): void => {\n this.anchor = undefined;\n document.removeEventListener('pointermove', this.handleMouseMove);\n document.removeEventListener('pointerup', this.handleMouseUp);\n this.notifySelectionEnd(this.selectedRange);\n this.notifySelectionChange();\n };\n\n private updateSelection(currentLine: null): void;\n private updateSelection(currentLine: number, side: AnnotationSide): void;\n private updateSelection(\n currentLine: number | null,\n side?: AnnotationSide\n ): void {\n if (currentLine == null) {\n this.selectedRange = null;\n } else {\n const anchorSide = this.anchor?.side ?? side;\n const anchorLine = this.anchor?.line ?? currentLine;\n this.selectedRange = {\n start: anchorLine,\n end: currentLine,\n side: anchorSide,\n endSide: anchorSide !== side ? side : undefined,\n };\n }\n this._queuedRender ??= requestAnimationFrame(this.renderSelection);\n }\n\n private renderSelection = (): void => {\n if (this._queuedRender != null) {\n cancelAnimationFrame(this._queuedRender);\n this._queuedRender = undefined;\n }\n if (\n this.pre == null ||\n this.renderedSelectionRange === this.selectedRange\n ) {\n return;\n }\n\n // First clear existing selections, maybe we\n // can cache this to better avoid this query?\n const allSelected = this.pre.querySelectorAll('[data-selected-line]');\n for (const element of allSelected) {\n element.removeAttribute('data-selected-line');\n }\n\n this.renderedSelectionRange = this.selectedRange;\n if (this.selectedRange == null) {\n return;\n }\n\n const codeElements = this.pre.querySelectorAll('[data-code]');\n if (codeElements.length === 0) return;\n if (codeElements.length > 2) {\n console.error(codeElements);\n throw new Error(\n 'LineSelectionManager.applySelectionToDOM: Somehow there are more than 2 code elements...'\n );\n }\n const split = this.pre.dataset.type === 'split';\n const rowRange = this.deriveRowRangeFromDOM(this.selectedRange, split);\n if (rowRange == null) {\n console.error({ rowRange, selectedRange: this.selectedRange });\n throw new Error(\n 'LineSelectionManager.renderSelection: No valid rowRange'\n );\n }\n const isSingle = rowRange.start === rowRange.end;\n const first = Math.min(rowRange.start, rowRange.end);\n const last = Math.max(rowRange.start, rowRange.end);\n for (const code of codeElements) {\n for (const element of code.children) {\n if (!(element instanceof HTMLElement)) continue;\n const lineIndex = this.getLineIndex(element, split);\n if ((lineIndex ?? 0) > last) break;\n if (lineIndex == null || lineIndex < first) continue;\n let attributeValue = isSingle\n ? 'single'\n : lineIndex === first\n ? 'first'\n : lineIndex === last\n ? 'last'\n : '';\n element.setAttribute('data-selected-line', attributeValue);\n // If we have a line annotation following our selected line, we should\n // mark it as selected as well\n if (\n element.nextSibling instanceof HTMLElement &&\n element.nextSibling.hasAttribute('data-line-annotation')\n ) {\n // Depending on the line's attribute value, lets go ahead and correct\n // it when adding in the annotation row\n if (isSingle) {\n // Single technically becomes 2 selected lines\n attributeValue = 'last';\n element.setAttribute('data-selected-line', 'first');\n } else if (lineIndex === first) {\n // We don't want apply 'first' to the line annotation\n attributeValue = '';\n } else if (lineIndex === last) {\n // the annotation will become the last selected line and therefore\n // our existing line should no longer be last\n element.setAttribute('data-selected-line', '');\n }\n element.nextSibling.setAttribute(\n 'data-selected-line',\n attributeValue\n );\n }\n }\n }\n };\n\n private deriveRowRangeFromDOM(\n range: SelectedLineRange,\n split: boolean\n ): { start: number; end: number } | undefined {\n if (range == null) return undefined;\n const start = this.findRowIndexForLineNumber(\n range.start,\n range.side,\n split\n );\n const end =\n range.end === range.start &&\n (range.endSide == null || range.endSide === range.side)\n ? start\n : this.findRowIndexForLineNumber(\n range.end,\n range.endSide ?? range.side,\n split\n );\n return start != null && end != null ? { start, end } : undefined;\n }\n\n private findRowIndexForLineNumber(\n lineNumber: number,\n targetSide: SelectionSide = 'additions',\n split: boolean\n ): number | undefined {\n if (this.pre == null) return undefined;\n const elements = Array.from(\n this.pre.querySelectorAll(`[data-line=\"${lineNumber}\"]`)\n );\n // Given how unified diffs can order things, we need to always process\n // `[data-line]` elements before `[data-alt-line]`\n elements.push(\n ...Array.from(\n this.pre.querySelectorAll(`[data-alt-line=\"${lineNumber}\"]`)\n )\n );\n if (elements.length === 0) return undefined;\n\n for (const element of elements) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n const side = this.getLineSideFromElement(element);\n if (side === targetSide) {\n return this.getLineIndex(element, split);\n } else if (parseInt(element.dataset.altLine ?? '') === lineNumber) {\n return this.getLineIndex(element, split);\n }\n }\n console.error(\n 'LineSelectionManager.findRowIndexForLineNumber: Invalid selection',\n lineNumber,\n targetSide\n );\n return undefined;\n }\n\n private notifySelectionChange(): void {\n const { onLineSelected } = this.options;\n if (onLineSelected == null) return;\n\n onLineSelected(this.selectedRange ?? null);\n }\n\n private notifySelectionStart(range: SelectedLineRange | null): void {\n const { onLineSelectionStart } = this.options;\n if (onLineSelectionStart == null) return;\n onLineSelectionStart(range);\n }\n\n private notifySelectionEnd(range: SelectedLineRange | null): void {\n const { onLineSelectionEnd } = this.options;\n if (onLineSelectionEnd == null) return;\n onLineSelectionEnd(range);\n }\n\n private getMouseEventDataForPath(\n path: (EventTarget | undefined)[],\n eventType: 'click' | 'move'\n ): MouseInfo | undefined {\n let lineNumber: number | undefined;\n let lineIndex: number | undefined;\n let isNumberColumn = false;\n let eventSide: AnnotationSide | undefined;\n for (const element of path) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (element.hasAttribute('data-column-number')) {\n isNumberColumn = true;\n continue;\n }\n if (element.hasAttribute('data-line')) {\n lineNumber = this.getLineNumber(element);\n lineIndex = this.getLineIndex(\n element,\n this.pre?.dataset.type === 'split'\n );\n if (element.dataset.lineType === 'change-deletion') {\n eventSide = 'deletions';\n } else if (element.dataset.lineType === 'change-additions') {\n eventSide = 'additions';\n }\n // if we can't pull out an index or line number, we can't do anything.\n if (lineIndex == null || lineNumber == null) {\n lineIndex = undefined;\n lineNumber = undefined;\n break;\n }\n // If we already have an eventSide, we done computin\n if (eventSide != null) {\n break;\n } else {\n // context type lines will need to be discovered higher up\n // at the data-code level\n }\n continue;\n }\n if (element.hasAttribute('data-code')) {\n eventSide ??= element.hasAttribute('data-deletions')\n ? 'deletions'\n : // context in unified style are assumed to be additions based on\n // their line numbers\n 'additions';\n // If we got to the code element, we def done, son\n break;\n }\n }\n if (\n (eventType === 'click' && !isNumberColumn) ||\n lineIndex == null ||\n lineNumber == null\n ) {\n return undefined;\n }\n return {\n lineIndex,\n lineNumber,\n // Normally this shouldn't hit unless we broke early for whatever reason,\n // but for types lets ensure it's additions if undefined\n eventSide: eventSide ?? 'additions',\n };\n }\n\n private getLineNumber(element: HTMLElement): number | undefined {\n const lineNumber = parseInt(element.dataset.line ?? '', 10);\n return !Number.isNaN(lineNumber) ? lineNumber : undefined;\n }\n\n private getLineIndex(\n element: HTMLElement,\n split: boolean\n ): number | undefined {\n const lineIndexes = (element.dataset.lineIndex ?? '')\n .split(',')\n .map((value) => parseInt(value))\n .filter((value) => !Number.isNaN(value));\n\n if (split && lineIndexes.length === 2) {\n return lineIndexes[1];\n } else if (!split) {\n return lineIndexes[0];\n }\n return undefined;\n }\n\n private getLineSideFromElement(element: HTMLElement): SelectionSide {\n if (element.dataset.lineType === 'change-deletion') {\n return 'deletions';\n }\n if (element.dataset.lineType === 'change-addition') {\n return 'additions';\n }\n const parent = element.closest('[data-code]');\n if (!(parent instanceof HTMLElement)) {\n return 'additions';\n }\n return parent.hasAttribute('data-deletions') ? 'deletions' : 'additions';\n }\n}\n\nexport function pluckLineSelectionOptions({\n enableLineSelection,\n onLineSelected,\n onLineSelectionStart,\n onLineSelectionEnd,\n}: LineSelectionOptions): LineSelectionOptions {\n return {\n enableLineSelection,\n onLineSelected,\n onLineSelectionStart,\n onLineSelectionEnd,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"LineSelectionManager.js","names":["options: LineSelectionOptions","lineNumber: number | undefined","lineIndex: number | undefined","eventSide: AnnotationSide | undefined"],"sources":["../../src/managers/LineSelectionManager.ts"],"sourcesContent":["import type { AnnotationSide } from '../types';\nimport { areSelectionsEqual } from '../utils/areSelectionsEqual';\n\nexport type SelectionSide = AnnotationSide;\n\nexport interface SelectedLineRange {\n start: number;\n side?: SelectionSide;\n end: number;\n endSide?: SelectionSide;\n}\n\nexport interface LineSelectionOptions {\n enableLineSelection?: boolean;\n onLineSelected?: (range: SelectedLineRange | null) => void;\n onLineSelectionStart?: (range: SelectedLineRange | null) => void;\n onLineSelectionEnd?: (range: SelectedLineRange | null) => void;\n}\n\ninterface MouseInfo {\n lineNumber: number;\n eventSide: AnnotationSide;\n lineIndex: number;\n}\n\n/**\n * Manages line selection state and interactions for code/diff viewers.\n * Handles:\n * - Click and drag selection\n * - Shift-click to extend selection\n * - DOM attribute updates (data-selected-line)\n */\nexport class LineSelectionManager {\n private pre: HTMLPreElement | undefined;\n private selectedRange: SelectedLineRange | null = null;\n private renderedSelectionRange: SelectedLineRange | null | undefined;\n private anchor: { line: number; side: SelectionSide } | undefined;\n private _queuedRender: number | undefined;\n\n constructor(private options: LineSelectionOptions = {}) {}\n\n setOptions(options: LineSelectionOptions): void {\n this.options = { ...this.options, ...options };\n this.removeEventListeners();\n if (this.options.enableLineSelection === true) {\n this.attachEventListeners();\n }\n }\n\n cleanUp(): void {\n this.removeEventListeners();\n if (this._queuedRender != null) {\n cancelAnimationFrame(this._queuedRender);\n this._queuedRender = undefined;\n }\n if (this.pre != null) {\n delete this.pre.dataset.interactiveLineNumbers;\n }\n this.pre = undefined;\n }\n\n setup(pre: HTMLPreElement): void {\n // Assume we are always dirty after a setup...\n this.setDirty();\n if (this.pre !== pre) {\n this.cleanUp();\n this.pre = pre;\n const { enableLineSelection = false } = this.options;\n if (enableLineSelection) {\n this.attachEventListeners();\n } else {\n this.removeEventListeners();\n }\n }\n this.setSelection(this.selectedRange);\n }\n\n setDirty(): void {\n this.renderedSelectionRange = undefined;\n }\n\n isDirty(): boolean {\n return this.renderedSelectionRange === undefined;\n }\n\n setSelection(range: SelectedLineRange | null): void {\n const isRangeChange = !(\n range === this.selectedRange ||\n areSelectionsEqual(range ?? undefined, this.selectedRange ?? undefined)\n );\n if (!this.isDirty() && !isRangeChange) return;\n this.selectedRange = range;\n this.renderSelection();\n if (isRangeChange) {\n this.notifySelectionChange();\n }\n }\n\n getSelection(): SelectedLineRange | null {\n return this.selectedRange;\n }\n\n private attachEventListeners(): void {\n if (this.pre == null) return;\n // Lets run a cleanup, just in case\n this.removeEventListeners();\n this.pre.dataset.interactiveLineNumbers = '';\n this.pre.addEventListener('pointerdown', this.handleMouseDown);\n }\n\n private removeEventListeners(): void {\n if (this.pre == null) return;\n this.pre.removeEventListener('pointerdown', this.handleMouseDown);\n document.removeEventListener('pointermove', this.handleMouseMove);\n document.removeEventListener('pointerup', this.handleMouseUp);\n delete this.pre.dataset.interactiveLineNumbers;\n }\n\n private handleMouseDown = (event: PointerEvent): void => {\n // Only handle left mouse button\n const mouseEventData =\n event.button === 0\n ? this.getMouseEventDataForPath(event.composedPath(), 'click')\n : undefined;\n if (mouseEventData == null) {\n return;\n }\n event.preventDefault();\n const { lineNumber, eventSide, lineIndex } = mouseEventData;\n if (event.shiftKey && this.selectedRange != null) {\n const range = this.deriveRowRangeFromDOM(\n this.selectedRange,\n this.pre?.dataset.type === 'split'\n );\n if (range == null) return;\n const useStart =\n range.start <= range.end\n ? lineIndex >= range.start\n : lineIndex <= range.end;\n this.anchor = {\n line: useStart ? this.selectedRange.start : this.selectedRange.end,\n side:\n (useStart\n ? this.selectedRange.side\n : (this.selectedRange.endSide ?? this.selectedRange.side)) ??\n 'additions',\n };\n this.updateSelection(lineNumber, eventSide);\n this.notifySelectionStart(this.selectedRange);\n } else {\n // Check if clicking on already selected single line to unselect\n if (\n this.selectedRange?.start === lineNumber &&\n this.selectedRange?.end === lineNumber\n ) {\n this.updateSelection(null);\n this.notifySelectionEnd(null);\n this.notifySelectionChange();\n return;\n }\n this.selectedRange = null;\n this.anchor = { line: lineNumber, side: eventSide };\n this.updateSelection(lineNumber, eventSide);\n this.notifySelectionStart(this.selectedRange);\n }\n\n document.addEventListener('pointermove', this.handleMouseMove);\n document.addEventListener('pointerup', this.handleMouseUp);\n };\n\n private handleMouseMove = (event: PointerEvent): void => {\n const mouseEventData = this.getMouseEventDataForPath(\n event.composedPath(),\n 'move'\n );\n if (mouseEventData == null || this.anchor == null) return;\n const { lineNumber, eventSide } = mouseEventData;\n this.updateSelection(lineNumber, eventSide);\n };\n\n private handleMouseUp = (): void => {\n this.anchor = undefined;\n document.removeEventListener('pointermove', this.handleMouseMove);\n document.removeEventListener('pointerup', this.handleMouseUp);\n this.notifySelectionEnd(this.selectedRange);\n this.notifySelectionChange();\n };\n\n private updateSelection(currentLine: null): void;\n private updateSelection(currentLine: number, side: AnnotationSide): void;\n private updateSelection(\n currentLine: number | null,\n side?: AnnotationSide\n ): void {\n if (currentLine == null) {\n this.selectedRange = null;\n } else {\n const anchorSide = this.anchor?.side ?? side;\n const anchorLine = this.anchor?.line ?? currentLine;\n this.selectedRange = {\n start: anchorLine,\n end: currentLine,\n side: anchorSide,\n endSide: anchorSide !== side ? side : undefined,\n };\n }\n this._queuedRender ??= requestAnimationFrame(this.renderSelection);\n }\n\n private renderSelection = (): void => {\n if (this._queuedRender != null) {\n cancelAnimationFrame(this._queuedRender);\n this._queuedRender = undefined;\n }\n if (\n this.pre == null ||\n this.renderedSelectionRange === this.selectedRange\n ) {\n return;\n }\n\n // First clear existing selections, maybe we\n // can cache this to better avoid this query?\n const allSelected = this.pre.querySelectorAll('[data-selected-line]');\n for (const element of allSelected) {\n element.removeAttribute('data-selected-line');\n }\n\n this.renderedSelectionRange = this.selectedRange;\n if (this.selectedRange == null) {\n return;\n }\n\n const codeElements = this.pre.querySelectorAll('[data-code]');\n if (codeElements.length === 0) return;\n if (codeElements.length > 2) {\n console.error(codeElements);\n throw new Error(\n 'LineSelectionManager.applySelectionToDOM: Somehow there are more than 2 code elements...'\n );\n }\n const split = this.pre.dataset.type === 'split';\n const rowRange = this.deriveRowRangeFromDOM(this.selectedRange, split);\n if (rowRange == null) {\n console.error({ rowRange, selectedRange: this.selectedRange });\n throw new Error(\n 'LineSelectionManager.renderSelection: No valid rowRange'\n );\n }\n const isSingle = rowRange.start === rowRange.end;\n const first = Math.min(rowRange.start, rowRange.end);\n const last = Math.max(rowRange.start, rowRange.end);\n for (const code of codeElements) {\n for (const element of code.children) {\n if (!(element instanceof HTMLElement)) continue;\n const lineIndex = this.getLineIndex(element, split);\n if ((lineIndex ?? 0) > last) break;\n if (lineIndex == null || lineIndex < first) continue;\n let attributeValue = isSingle\n ? 'single'\n : lineIndex === first\n ? 'first'\n : lineIndex === last\n ? 'last'\n : '';\n element.setAttribute('data-selected-line', attributeValue);\n // If we have a line annotation following our selected line, we should\n // mark it as selected as well\n if (\n element.nextSibling instanceof HTMLElement &&\n element.nextSibling.hasAttribute('data-line-annotation')\n ) {\n // Depending on the line's attribute value, lets go ahead and correct\n // it when adding in the annotation row\n if (isSingle) {\n // Single technically becomes 2 selected lines\n attributeValue = 'last';\n element.setAttribute('data-selected-line', 'first');\n } else if (lineIndex === first) {\n // We don't want apply 'first' to the line annotation\n attributeValue = '';\n } else if (lineIndex === last) {\n // the annotation will become the last selected line and therefore\n // our existing line should no longer be last\n element.setAttribute('data-selected-line', '');\n }\n element.nextSibling.setAttribute(\n 'data-selected-line',\n attributeValue\n );\n }\n }\n }\n };\n\n private deriveRowRangeFromDOM(\n range: SelectedLineRange,\n split: boolean\n ): { start: number; end: number } | undefined {\n if (range == null) return undefined;\n const start = this.findRowIndexForLineNumber(\n range.start,\n range.side,\n split\n );\n const end =\n range.end === range.start &&\n (range.endSide == null || range.endSide === range.side)\n ? start\n : this.findRowIndexForLineNumber(\n range.end,\n range.endSide ?? range.side,\n split\n );\n return start != null && end != null ? { start, end } : undefined;\n }\n\n private findRowIndexForLineNumber(\n lineNumber: number,\n targetSide: SelectionSide = 'additions',\n split: boolean\n ): number | undefined {\n if (this.pre == null) return undefined;\n const elements = Array.from(\n this.pre.querySelectorAll(`[data-line=\"${lineNumber}\"]`)\n );\n // Given how unified diffs can order things, we need to always process\n // `[data-line]` elements before `[data-alt-line]`\n elements.push(\n ...Array.from(\n this.pre.querySelectorAll(`[data-alt-line=\"${lineNumber}\"]`)\n )\n );\n if (elements.length === 0) return undefined;\n\n for (const element of elements) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n const side = this.getLineSideFromElement(element);\n if (side === targetSide) {\n return this.getLineIndex(element, split);\n } else if (parseInt(element.dataset.altLine ?? '') === lineNumber) {\n return this.getLineIndex(element, split);\n }\n }\n console.error(\n 'LineSelectionManager.findRowIndexForLineNumber: Invalid selection',\n lineNumber,\n targetSide\n );\n return undefined;\n }\n\n private notifySelectionChange(): void {\n const { onLineSelected } = this.options;\n if (onLineSelected == null) return;\n\n onLineSelected(this.selectedRange ?? null);\n }\n\n private notifySelectionStart(range: SelectedLineRange | null): void {\n const { onLineSelectionStart } = this.options;\n if (onLineSelectionStart == null) return;\n onLineSelectionStart(range);\n }\n\n private notifySelectionEnd(range: SelectedLineRange | null): void {\n const { onLineSelectionEnd } = this.options;\n if (onLineSelectionEnd == null) return;\n onLineSelectionEnd(range);\n }\n\n private getMouseEventDataForPath(\n path: (EventTarget | undefined)[],\n eventType: 'click' | 'move'\n ): MouseInfo | undefined {\n let lineNumber: number | undefined;\n let lineIndex: number | undefined;\n let isNumberColumn = false;\n let eventSide: AnnotationSide | undefined;\n for (const element of path) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (element.hasAttribute('data-column-number')) {\n isNumberColumn = true;\n continue;\n }\n if (element.hasAttribute('data-line')) {\n lineNumber = this.getLineNumber(element);\n lineIndex = this.getLineIndex(\n element,\n this.pre?.dataset.type === 'split'\n );\n if (element.dataset.lineType === 'change-deletion') {\n eventSide = 'deletions';\n } else if (element.dataset.lineType === 'change-additions') {\n eventSide = 'additions';\n }\n // if we can't pull out an index or line number, we can't do anything.\n if (lineIndex == null || lineNumber == null) {\n lineIndex = undefined;\n lineNumber = undefined;\n break;\n }\n // If we already have an eventSide, we done computin\n if (eventSide != null) {\n break;\n } else {\n // context type lines will need to be discovered higher up\n // at the data-code level\n }\n continue;\n }\n if (element.hasAttribute('data-code')) {\n eventSide ??= element.hasAttribute('data-deletions')\n ? 'deletions'\n : // context in unified style are assumed to be additions based on\n // their line numbers\n 'additions';\n // If we got to the code element, we def done, son\n break;\n }\n }\n if (\n (eventType === 'click' && !isNumberColumn) ||\n lineIndex == null ||\n lineNumber == null\n ) {\n return undefined;\n }\n return {\n lineIndex,\n lineNumber,\n // Normally this shouldn't hit unless we broke early for whatever reason,\n // but for types lets ensure it's additions if undefined\n eventSide: eventSide ?? 'additions',\n };\n }\n\n private getLineNumber(element: HTMLElement): number | undefined {\n const lineNumber = parseInt(element.dataset.line ?? '', 10);\n return !Number.isNaN(lineNumber) ? lineNumber : undefined;\n }\n\n private getLineIndex(\n element: HTMLElement,\n split: boolean\n ): number | undefined {\n const lineIndexes = (element.dataset.lineIndex ?? '')\n .split(',')\n .map((value) => parseInt(value))\n .filter((value) => !Number.isNaN(value));\n\n if (split && lineIndexes.length === 2) {\n return lineIndexes[1];\n } else if (!split) {\n return lineIndexes[0];\n }\n return undefined;\n }\n\n private getLineSideFromElement(element: HTMLElement): SelectionSide {\n if (element.dataset.lineType === 'change-deletion') {\n return 'deletions';\n }\n if (element.dataset.lineType === 'change-addition') {\n return 'additions';\n }\n const parent = element.closest('[data-code]');\n if (!(parent instanceof HTMLElement)) {\n return 'additions';\n }\n return parent.hasAttribute('data-deletions') ? 'deletions' : 'additions';\n }\n}\n\nexport function pluckLineSelectionOptions({\n enableLineSelection,\n onLineSelected,\n onLineSelectionStart,\n onLineSelectionEnd,\n}: LineSelectionOptions): LineSelectionOptions {\n return {\n enableLineSelection,\n onLineSelected,\n onLineSelectionStart,\n onLineSelectionEnd,\n };\n}\n"],"mappings":"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"}
@@ -5,6 +5,7 @@ declare class ScrollSyncManager {
5
5
  timeoutId: NodeJS.Timeout;
6
6
  codeDeletions: HTMLElement | undefined;
7
7
  codeAdditions: HTMLElement | undefined;
8
+ private enabled;
8
9
  cleanUp(): void;
9
10
  setup(pre: HTMLPreElement, codeDeletions?: HTMLElement, codeAdditions?: HTMLElement): void;
10
11
  private handleDeletionsScroll;
@@ -1 +1 @@
1
- {"version":3,"file":"ScrollSyncManager.d.ts","names":[],"sources":["../../src/managers/ScrollSyncManager.ts"],"sourcesContent":[],"mappings":";cAAa,iBAAA;EAAb,oBAAa,EAAA,OAAA;EAGA,oBAAO,EAAA,OAAA;EACH,SAAA,EADJ,MAAA,CAAO,OACH;EACA,aAAA,EADA,WACA,GAAA,SAAA;EAiBR,aAAA,EAjBQ,WAiBR,GAAA,SAAA;EACW,OAAA,CAAA,CAAA,EAAA,IAAA;EACA,KAAA,CAAA,GAAA,EAFX,cAEW,EAAA,aAAA,CAAA,EADA,WACA,EAAA,aAAA,CAAA,EAAA,WAAA,CAAA,EAAA,IAAA;EAAA,QAAA,qBAAA"}
1
+ {"version":3,"file":"ScrollSyncManager.d.ts","names":[],"sources":["../../src/managers/ScrollSyncManager.ts"],"sourcesContent":[],"mappings":";cAAa,iBAAA;EAAb,oBAAa,EAAA,OAAA;EAGA,oBAAO,EAAA,OAAA;EACH,SAAA,EADJ,MAAA,CAAO,OACH;EACA,aAAA,EADA,WACA,GAAA,SAAA;EAsBR,aAAA,EAtBQ,WAsBR,GAAA,SAAA;EACW,QAAA,OAAA;EACA,OAAA,CAAA,CAAA,EAAA,IAAA;EAAA,KAAA,CAAA,GAAA,EAFX,cAEW,EAAA,aAAA,CAAA,EADA,WACA,EAAA,aAAA,CAAA,EAAA,WAAA,CAAA,EAAA,IAAA"}
@@ -5,12 +5,15 @@ var ScrollSyncManager = class {
5
5
  timeoutId = -1;
6
6
  codeDeletions;
7
7
  codeAdditions;
8
+ enabled = false;
8
9
  cleanUp() {
10
+ if (!this.enabled) return;
9
11
  this.codeDeletions?.removeEventListener("scroll", this.handleDeletionsScroll);
10
12
  this.codeAdditions?.removeEventListener("scroll", this.handleAdditionsScroll);
11
13
  clearTimeout(this.timeoutId);
12
14
  this.codeDeletions = void 0;
13
15
  this.codeAdditions = void 0;
16
+ this.enabled = false;
14
17
  }
15
18
  setup(pre, codeDeletions, codeAdditions) {
16
19
  if (codeDeletions == null || codeAdditions == null) for (const element of pre.children ?? []) {
@@ -22,12 +25,17 @@ var ScrollSyncManager = class {
22
25
  this.cleanUp();
23
26
  return;
24
27
  }
25
- this.codeDeletions?.removeEventListener("scroll", this.handleDeletionsScroll);
26
- this.codeAdditions?.removeEventListener("scroll", this.handleAdditionsScroll);
27
- this.codeDeletions = codeDeletions;
28
- this.codeAdditions = codeAdditions;
29
- codeDeletions.addEventListener("scroll", this.handleDeletionsScroll, { passive: true });
30
- codeAdditions.addEventListener("scroll", this.handleAdditionsScroll, { passive: true });
28
+ if (this.codeDeletions !== codeDeletions) {
29
+ this.codeDeletions?.removeEventListener("scroll", this.handleDeletionsScroll);
30
+ this.codeDeletions = codeDeletions;
31
+ codeDeletions.addEventListener("scroll", this.handleDeletionsScroll, { passive: true });
32
+ }
33
+ if (this.codeAdditions !== codeAdditions) {
34
+ this.codeAdditions?.removeEventListener("scroll", this.handleAdditionsScroll);
35
+ this.codeAdditions = codeAdditions;
36
+ codeAdditions.addEventListener("scroll", this.handleAdditionsScroll, { passive: true });
37
+ }
38
+ this.enabled = true;
31
39
  }
32
40
  handleDeletionsScroll = () => {
33
41
  if (this.isAdditionsScrolling) return;
@@ -1 +1 @@
1
- {"version":3,"file":"ScrollSyncManager.js","names":[],"sources":["../../src/managers/ScrollSyncManager.ts"],"sourcesContent":["export class ScrollSyncManager {\n isDeletionsScrolling: boolean = false;\n isAdditionsScrolling: boolean = false;\n timeoutId: NodeJS.Timeout = -1 as unknown as NodeJS.Timeout;\n codeDeletions: HTMLElement | undefined;\n codeAdditions: HTMLElement | undefined;\n\n cleanUp(): void {\n this.codeDeletions?.removeEventListener(\n 'scroll',\n this.handleDeletionsScroll\n );\n this.codeAdditions?.removeEventListener(\n 'scroll',\n this.handleAdditionsScroll\n );\n clearTimeout(this.timeoutId);\n this.codeDeletions = undefined;\n this.codeAdditions = undefined;\n }\n\n setup(\n pre: HTMLPreElement,\n codeDeletions?: HTMLElement,\n codeAdditions?: HTMLElement\n ): void {\n // If no code elements were provided, lets try to find them in\n // the pre element\n if (codeDeletions == null || codeAdditions == null) {\n for (const element of pre.children ?? []) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if ('deletions' in element.dataset) {\n codeDeletions = element;\n } else if ('additions' in element.dataset) {\n codeAdditions = element;\n }\n }\n }\n if (codeAdditions == null || codeDeletions == null) {\n this.cleanUp();\n return;\n }\n this.codeDeletions?.removeEventListener(\n 'scroll',\n this.handleDeletionsScroll\n );\n this.codeAdditions?.removeEventListener(\n 'scroll',\n this.handleAdditionsScroll\n );\n this.codeDeletions = codeDeletions;\n this.codeAdditions = codeAdditions;\n codeDeletions.addEventListener('scroll', this.handleDeletionsScroll, {\n passive: true,\n });\n codeAdditions.addEventListener('scroll', this.handleAdditionsScroll, {\n passive: true,\n });\n }\n\n private handleDeletionsScroll = () => {\n if (this.isAdditionsScrolling) {\n return;\n }\n this.isDeletionsScrolling = true;\n clearTimeout(this.timeoutId);\n this.timeoutId = setTimeout(() => {\n this.isDeletionsScrolling = false;\n }, 300);\n this.codeAdditions?.scrollTo({\n left: this.codeDeletions?.scrollLeft,\n });\n };\n\n private handleAdditionsScroll = () => {\n if (this.isDeletionsScrolling) {\n return;\n }\n this.isAdditionsScrolling = true;\n clearTimeout(this.timeoutId);\n this.timeoutId = setTimeout(() => {\n this.isAdditionsScrolling = false;\n }, 300);\n this.codeDeletions?.scrollTo({\n left: this.codeAdditions?.scrollLeft,\n });\n };\n}\n"],"mappings":";AAAA,IAAa,oBAAb,MAA+B;CAC7B,uBAAgC;CAChC,uBAAgC;CAChC,YAA4B;CAC5B;CACA;CAEA,UAAgB;AACd,OAAK,eAAe,oBAClB,UACA,KAAK,sBACN;AACD,OAAK,eAAe,oBAClB,UACA,KAAK,sBACN;AACD,eAAa,KAAK,UAAU;AAC5B,OAAK,gBAAgB;AACrB,OAAK,gBAAgB;;CAGvB,MACE,KACA,eACA,eACM;AAGN,MAAI,iBAAiB,QAAQ,iBAAiB,KAC5C,MAAK,MAAM,WAAW,IAAI,YAAY,EAAE,EAAE;AACxC,OAAI,EAAE,mBAAmB,aACvB;AAEF,OAAI,eAAe,QAAQ,QACzB,iBAAgB;YACP,eAAe,QAAQ,QAChC,iBAAgB;;AAItB,MAAI,iBAAiB,QAAQ,iBAAiB,MAAM;AAClD,QAAK,SAAS;AACd;;AAEF,OAAK,eAAe,oBAClB,UACA,KAAK,sBACN;AACD,OAAK,eAAe,oBAClB,UACA,KAAK,sBACN;AACD,OAAK,gBAAgB;AACrB,OAAK,gBAAgB;AACrB,gBAAc,iBAAiB,UAAU,KAAK,uBAAuB,EACnE,SAAS,MACV,CAAC;AACF,gBAAc,iBAAiB,UAAU,KAAK,uBAAuB,EACnE,SAAS,MACV,CAAC;;CAGJ,AAAQ,8BAA8B;AACpC,MAAI,KAAK,qBACP;AAEF,OAAK,uBAAuB;AAC5B,eAAa,KAAK,UAAU;AAC5B,OAAK,YAAY,iBAAiB;AAChC,QAAK,uBAAuB;KAC3B,IAAI;AACP,OAAK,eAAe,SAAS,EAC3B,MAAM,KAAK,eAAe,YAC3B,CAAC;;CAGJ,AAAQ,8BAA8B;AACpC,MAAI,KAAK,qBACP;AAEF,OAAK,uBAAuB;AAC5B,eAAa,KAAK,UAAU;AAC5B,OAAK,YAAY,iBAAiB;AAChC,QAAK,uBAAuB;KAC3B,IAAI;AACP,OAAK,eAAe,SAAS,EAC3B,MAAM,KAAK,eAAe,YAC3B,CAAC"}
1
+ {"version":3,"file":"ScrollSyncManager.js","names":[],"sources":["../../src/managers/ScrollSyncManager.ts"],"sourcesContent":["export class ScrollSyncManager {\n isDeletionsScrolling: boolean = false;\n isAdditionsScrolling: boolean = false;\n timeoutId: NodeJS.Timeout = -1 as unknown as NodeJS.Timeout;\n codeDeletions: HTMLElement | undefined;\n codeAdditions: HTMLElement | undefined;\n private enabled = false;\n\n cleanUp(): void {\n if (!this.enabled) {\n return;\n }\n this.codeDeletions?.removeEventListener(\n 'scroll',\n this.handleDeletionsScroll\n );\n this.codeAdditions?.removeEventListener(\n 'scroll',\n this.handleAdditionsScroll\n );\n clearTimeout(this.timeoutId);\n this.codeDeletions = undefined;\n this.codeAdditions = undefined;\n this.enabled = false;\n }\n\n setup(\n pre: HTMLPreElement,\n codeDeletions?: HTMLElement,\n codeAdditions?: HTMLElement\n ): void {\n // If no code elements were provided, lets try to find them in\n // the pre element\n if (codeDeletions == null || codeAdditions == null) {\n for (const element of pre.children ?? []) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if ('deletions' in element.dataset) {\n codeDeletions = element;\n } else if ('additions' in element.dataset) {\n codeAdditions = element;\n }\n }\n }\n if (codeAdditions == null || codeDeletions == null) {\n this.cleanUp();\n return;\n }\n\n if (this.codeDeletions !== codeDeletions) {\n this.codeDeletions?.removeEventListener(\n 'scroll',\n this.handleDeletionsScroll\n );\n this.codeDeletions = codeDeletions;\n codeDeletions.addEventListener('scroll', this.handleDeletionsScroll, {\n passive: true,\n });\n }\n if (this.codeAdditions !== codeAdditions) {\n this.codeAdditions?.removeEventListener(\n 'scroll',\n this.handleAdditionsScroll\n );\n this.codeAdditions = codeAdditions;\n codeAdditions.addEventListener('scroll', this.handleAdditionsScroll, {\n passive: true,\n });\n }\n this.enabled = true;\n }\n\n private handleDeletionsScroll = () => {\n if (this.isAdditionsScrolling) {\n return;\n }\n this.isDeletionsScrolling = true;\n clearTimeout(this.timeoutId);\n this.timeoutId = setTimeout(() => {\n this.isDeletionsScrolling = false;\n }, 300);\n this.codeAdditions?.scrollTo({\n left: this.codeDeletions?.scrollLeft,\n });\n };\n\n private handleAdditionsScroll = () => {\n if (this.isDeletionsScrolling) {\n return;\n }\n this.isAdditionsScrolling = true;\n clearTimeout(this.timeoutId);\n this.timeoutId = setTimeout(() => {\n this.isAdditionsScrolling = false;\n }, 300);\n this.codeDeletions?.scrollTo({\n left: this.codeAdditions?.scrollLeft,\n });\n };\n}\n"],"mappings":";AAAA,IAAa,oBAAb,MAA+B;CAC7B,uBAAgC;CAChC,uBAAgC;CAChC,YAA4B;CAC5B;CACA;CACA,AAAQ,UAAU;CAElB,UAAgB;AACd,MAAI,CAAC,KAAK,QACR;AAEF,OAAK,eAAe,oBAClB,UACA,KAAK,sBACN;AACD,OAAK,eAAe,oBAClB,UACA,KAAK,sBACN;AACD,eAAa,KAAK,UAAU;AAC5B,OAAK,gBAAgB;AACrB,OAAK,gBAAgB;AACrB,OAAK,UAAU;;CAGjB,MACE,KACA,eACA,eACM;AAGN,MAAI,iBAAiB,QAAQ,iBAAiB,KAC5C,MAAK,MAAM,WAAW,IAAI,YAAY,EAAE,EAAE;AACxC,OAAI,EAAE,mBAAmB,aACvB;AAEF,OAAI,eAAe,QAAQ,QACzB,iBAAgB;YACP,eAAe,QAAQ,QAChC,iBAAgB;;AAItB,MAAI,iBAAiB,QAAQ,iBAAiB,MAAM;AAClD,QAAK,SAAS;AACd;;AAGF,MAAI,KAAK,kBAAkB,eAAe;AACxC,QAAK,eAAe,oBAClB,UACA,KAAK,sBACN;AACD,QAAK,gBAAgB;AACrB,iBAAc,iBAAiB,UAAU,KAAK,uBAAuB,EACnE,SAAS,MACV,CAAC;;AAEJ,MAAI,KAAK,kBAAkB,eAAe;AACxC,QAAK,eAAe,oBAClB,UACA,KAAK,sBACN;AACD,QAAK,gBAAgB;AACrB,iBAAc,iBAAiB,UAAU,KAAK,uBAAuB,EACnE,SAAS,MACV,CAAC;;AAEJ,OAAK,UAAU;;CAGjB,AAAQ,8BAA8B;AACpC,MAAI,KAAK,qBACP;AAEF,OAAK,uBAAuB;AAC5B,eAAa,KAAK,UAAU;AAC5B,OAAK,YAAY,iBAAiB;AAChC,QAAK,uBAAuB;KAC3B,IAAI;AACP,OAAK,eAAe,SAAS,EAC3B,MAAM,KAAK,eAAe,YAC3B,CAAC;;CAGJ,AAAQ,8BAA8B;AACpC,MAAI,KAAK,qBACP;AAEF,OAAK,uBAAuB;AAC5B,eAAa,KAAK,UAAU;AAC5B,OAAK,YAAY,iBAAiB;AAChC,QAAK,uBAAuB;KAC3B,IAAI;AACP,OAAK,eAAe,SAAS,EAC3B,MAAM,KAAK,eAAe,YAC3B,CAAC"}
@@ -22,8 +22,8 @@ function MultiFileDiff({ oldFile, newFile, options, lineAnnotations, selectedLin
22
22
  className,
23
23
  style,
24
24
  children: templateRender(renderDiffChildren({
25
- oldFile,
26
- newFile,
25
+ deletionFile: oldFile,
26
+ additionFile: newFile,
27
27
  renderHeaderMetadata,
28
28
  renderAnnotation,
29
29
  lineAnnotations,
@@ -1 +1 @@
1
- {"version":3,"file":"MultiFileDiff.js","names":[],"sources":["../../src/react/MultiFileDiff.tsx"],"sourcesContent":["'use client';\n\nimport { DIFFS_TAG_NAME } from '../constants';\nimport type { FileContents } from '../types';\nimport type { DiffBasePropsReact } from './types';\nimport { renderDiffChildren } from './utils/renderDiffChildren';\nimport { templateRender } from './utils/templateRender';\nimport { useFileDiffInstance } from './utils/useFileDiffInstance';\n\nexport type { FileContents };\n\nexport interface MultiFileDiffProps<LAnnotation>\n extends DiffBasePropsReact<LAnnotation> {\n oldFile: FileContents;\n newFile: FileContents;\n}\n\nexport function MultiFileDiff<LAnnotation = undefined>({\n oldFile,\n newFile,\n options,\n lineAnnotations,\n selectedLines,\n className,\n style,\n prerenderedHTML,\n renderAnnotation,\n renderHeaderMetadata,\n renderHoverUtility,\n}: MultiFileDiffProps<LAnnotation>): React.JSX.Element {\n const { ref, getHoveredLine } = useFileDiffInstance({\n oldFile,\n newFile,\n options,\n lineAnnotations,\n selectedLines,\n prerenderedHTML,\n });\n const children = renderDiffChildren({\n oldFile,\n newFile,\n renderHeaderMetadata,\n renderAnnotation,\n lineAnnotations,\n renderHoverUtility,\n getHoveredLine,\n });\n return (\n <DIFFS_TAG_NAME ref={ref} className={className} style={style}>\n {templateRender(children, prerenderedHTML)}\n </DIFFS_TAG_NAME>\n );\n}\n"],"mappings":";;;;;;;;;;AAiBA,SAAgB,cAAuC,EACrD,SACA,SACA,SACA,iBACA,eACA,WACA,OACA,iBACA,kBACA,sBACA,sBACqD;CACrD,MAAM,EAAE,KAAK,mBAAmB,oBAAoB;EAClD;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;AAUF,QACE,oBAAC;EAAoB;EAAgB;EAAkB;YACpD,eAXY,mBAAmB;GAClC;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC,EAG4B,gBAAgB;GAC3B"}
1
+ {"version":3,"file":"MultiFileDiff.js","names":[],"sources":["../../src/react/MultiFileDiff.tsx"],"sourcesContent":["'use client';\n\nimport { DIFFS_TAG_NAME } from '../constants';\nimport type { FileContents } from '../types';\nimport type { DiffBasePropsReact } from './types';\nimport { renderDiffChildren } from './utils/renderDiffChildren';\nimport { templateRender } from './utils/templateRender';\nimport { useFileDiffInstance } from './utils/useFileDiffInstance';\n\nexport type { FileContents };\n\nexport interface MultiFileDiffProps<LAnnotation>\n extends DiffBasePropsReact<LAnnotation> {\n oldFile: FileContents;\n newFile: FileContents;\n}\n\nexport function MultiFileDiff<LAnnotation = undefined>({\n oldFile,\n newFile,\n options,\n lineAnnotations,\n selectedLines,\n className,\n style,\n prerenderedHTML,\n renderAnnotation,\n renderHeaderMetadata,\n renderHoverUtility,\n}: MultiFileDiffProps<LAnnotation>): React.JSX.Element {\n const { ref, getHoveredLine } = useFileDiffInstance({\n oldFile,\n newFile,\n options,\n lineAnnotations,\n selectedLines,\n prerenderedHTML,\n });\n const children = renderDiffChildren({\n deletionFile: oldFile,\n additionFile: newFile,\n renderHeaderMetadata,\n renderAnnotation,\n lineAnnotations,\n renderHoverUtility,\n getHoveredLine,\n });\n return (\n <DIFFS_TAG_NAME ref={ref} className={className} style={style}>\n {templateRender(children, prerenderedHTML)}\n </DIFFS_TAG_NAME>\n );\n}\n"],"mappings":";;;;;;;;;;AAiBA,SAAgB,cAAuC,EACrD,SACA,SACA,SACA,iBACA,eACA,WACA,OACA,iBACA,kBACA,sBACA,sBACqD;CACrD,MAAM,EAAE,KAAK,mBAAmB,oBAAoB;EAClD;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;AAUF,QACE,oBAAC;EAAoB;EAAgB;EAAkB;YACpD,eAXY,mBAAmB;GAClC,cAAc;GACd,cAAc;GACd;GACA;GACA;GACA;GACA;GACD,CAAC,EAG4B,gBAAgB;GAC3B"}
@@ -1,4 +1,4 @@
1
- import { AnnotationLineMap, AnnotationSide, AnnotationSpan, BaseCodeOptions, BaseDiffOptions, BundledLanguage, ChangeContent, ChangeHunk, ChangeTypes, CodeToHastOptions, ContextContent, DecorationItem, DiffLineAnnotation, DiffLineEventBaseProps, DiffsHighlighter, DiffsThemeNames, ExpansionDirections, ExtensionFormatMap, FileContents, FileDiffMetadata, GapSpan, Hunk, HunkData, HunkLineType, HunkSeparators, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSpans, LineTypes, ObservedAnnotationNodes, ObservedGridNodes, ParsedPatch, PrePropertiesConfig, RenderDiffFilesResult, RenderDiffHunksResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderMetadataProps, RenderedDiffASTCache, RenderedFileASTCache, SharedRenderState, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType } from "../types.js";
1
+ import { AnnotationLineMap, AnnotationSide, AnnotationSpan, BaseCodeOptions, BaseDiffOptions, BundledLanguage, ChangeContent, ChangeTypes, CodeToHastOptions, ContextContent, DecorationItem, DiffLineAnnotation, DiffLineEventBaseProps, DiffsHighlighter, DiffsThemeNames, ExpansionDirections, ExtensionFormatMap, FileContents, FileDiffMetadata, ForcePlainTextOptions, GapSpan, Hunk, HunkData, HunkExpansionRegion, HunkLineType, HunkSeparators, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSpans, LineTypes, ObservedAnnotationNodes, ObservedGridNodes, ParsedPatch, PrePropertiesConfig, RenderDiffFilesResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderMetadataProps, RenderRange, RenderWindow, RenderedDiffASTCache, RenderedFileASTCache, SharedRenderState, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType, VirtualWindowSpecs } from "../types.js";
2
2
  import { WorkerInitializationRenderOptions, WorkerPoolOptions } from "../worker/types.js";
3
3
  import { FileOptions } from "../components/File.js";
4
4
  import { DiffBasePropsReact, FileProps } from "./types.js";
@@ -14,4 +14,4 @@ import { templateRender } from "./utils/templateRender.js";
14
14
  import { useFileDiffInstance } from "./utils/useFileDiffInstance.js";
15
15
  import { useFileInstance } from "./utils/useFileInstance.js";
16
16
  import { useStableCallback } from "./utils/useStableCallback.js";
17
- export { AnnotationLineMap, AnnotationSide, AnnotationSpan, BaseCodeOptions, BaseDiffOptions, BundledLanguage, ChangeContent, ChangeHunk, ChangeTypes, CodeToHastOptions, ContextContent, DecorationItem, DiffBasePropsReact, DiffLineAnnotation, DiffLineEventBaseProps, DiffsHighlighter, DiffsThemeNames, ExpansionDirections, ExtensionFormatMap, File, FileContents, FileDiff, FileDiffMetadata, FileDiffProps, FileOptions, FileProps, GapSpan, HoverSlotStyles, Hunk, HunkData, HunkLineType, HunkSeparators, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSpans, LineTypes, MultiFileDiff, MultiFileDiffProps, ObservedAnnotationNodes, ObservedGridNodes, ParsedPatch, PatchDiff, PatchDiffProps, PrePropertiesConfig, RenderDiffFilesResult, RenderDiffHunksResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderMetadataProps, RenderedDiffASTCache, RenderedFileASTCache, SharedRenderState, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType, WorkerInitializationRenderOptions, WorkerPoolContext, WorkerPoolContextProvider, WorkerPoolOptions, renderDiffChildren, renderFileChildren, templateRender, useFileDiffInstance, useFileInstance, useStableCallback, useWorkerPool };
17
+ export { AnnotationLineMap, AnnotationSide, AnnotationSpan, BaseCodeOptions, BaseDiffOptions, BundledLanguage, ChangeContent, ChangeTypes, CodeToHastOptions, ContextContent, DecorationItem, DiffBasePropsReact, DiffLineAnnotation, DiffLineEventBaseProps, DiffsHighlighter, DiffsThemeNames, ExpansionDirections, ExtensionFormatMap, File, FileContents, FileDiff, FileDiffMetadata, FileDiffProps, FileOptions, FileProps, ForcePlainTextOptions, GapSpan, HoverSlotStyles, Hunk, HunkData, HunkExpansionRegion, HunkLineType, HunkSeparators, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSpans, LineTypes, MultiFileDiff, MultiFileDiffProps, ObservedAnnotationNodes, ObservedGridNodes, ParsedPatch, PatchDiff, PatchDiffProps, PrePropertiesConfig, RenderDiffFilesResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderMetadataProps, RenderRange, RenderWindow, RenderedDiffASTCache, RenderedFileASTCache, SharedRenderState, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType, VirtualWindowSpecs, WorkerInitializationRenderOptions, WorkerPoolContext, WorkerPoolContextProvider, WorkerPoolOptions, renderDiffChildren, renderFileChildren, templateRender, useFileDiffInstance, useFileInstance, useStableCallback, useWorkerPool };
@@ -6,8 +6,8 @@ import { ReactNode } from "react";
6
6
  //#region src/react/utils/renderDiffChildren.d.ts
7
7
  interface RenderDiffChildrenProps<LAnnotation> {
8
8
  fileDiff?: FileDiffMetadata;
9
- oldFile?: FileContents;
10
- newFile?: FileContents;
9
+ deletionFile?: FileContents;
10
+ additionFile?: FileContents;
11
11
  renderHeaderMetadata: DiffBasePropsReact<LAnnotation>["renderHeaderMetadata"];
12
12
  renderAnnotation: DiffBasePropsReact<LAnnotation>["renderAnnotation"];
13
13
  renderHoverUtility: DiffBasePropsReact<LAnnotation>["renderHoverUtility"];
@@ -16,8 +16,8 @@ interface RenderDiffChildrenProps<LAnnotation> {
16
16
  }
17
17
  declare function renderDiffChildren<LAnnotation>({
18
18
  fileDiff,
19
- oldFile,
20
- newFile,
19
+ deletionFile,
20
+ additionFile,
21
21
  renderHeaderMetadata,
22
22
  renderAnnotation,
23
23
  renderHoverUtility,
@@ -1 +1 @@
1
- {"version":3,"file":"renderDiffChildren.d.ts","names":[],"sources":["../../../src/react/utils/renderDiffChildren.tsx"],"sourcesContent":[],"mappings":";;;;;;UASU;aACG;EAH2B,OAE9B,CAAA,EAEE,YAFF;EACG,OAAA,CAAA,EAED,YAFC;EACD,oBAAA,EAEY,kBAFZ,CAE+B,WAF/B,CAAA,CAAA,sBAAA,CAAA;EACA,gBAAA,EAEQ,kBAFR,CAE2B,WAF3B,CAAA,CAAA,kBAAA,CAAA;EAC+B,kBAAA,EAErB,kBAFqB,CAEF,WAFE,CAAA,CAAA,oBAAA,CAAA;EAAnB,eAAA,EAGL,kBAHK,CAGc,WAHd,CAAA,CAAA,iBAAA,CAAA;EACe,cAAA,EAAA,EAGnB,oBAHmB,CAAA,MAAA,CAAA,GAAA,SAAA;;AACE,iBAKzB,kBALyB,CAAA,WAAA,CAAA,CAAA;EAAA,QAAA;EAAA,OAAA;EAAA,OAAA;EAAA,oBAAA;EAAA,gBAAA;EAAA,kBAAA;EAAA,eAAA;EAAA;AAAA,CAAA,EActC,uBAdsC,CAcd,WAdc,CAAA,CAAA,EAcC,SAdD"}
1
+ {"version":3,"file":"renderDiffChildren.d.ts","names":[],"sources":["../../../src/react/utils/renderDiffChildren.tsx"],"sourcesContent":[],"mappings":";;;;;;UASU;aACG;EAH2B,YAE9B,CAAA,EAEO,YAFP;EACG,YAAA,CAAA,EAEI,YAFJ;EACI,oBAAA,EAEO,kBAFP,CAE0B,WAF1B,CAAA,CAAA,sBAAA,CAAA;EACA,gBAAA,EAEG,kBAFH,CAEsB,WAFtB,CAAA,CAAA,kBAAA,CAAA;EAC0B,kBAAA,EAErB,kBAFqB,CAEF,WAFE,CAAA,CAAA,oBAAA,CAAA;EAAnB,eAAA,EAGL,kBAHK,CAGc,WAHd,CAAA,CAAA,iBAAA,CAAA;EACe,cAAA,EAAA,EAGnB,oBAHmB,CAAA,MAAA,CAAA,GAAA,SAAA;;AACE,iBAKzB,kBALyB,CAAA,WAAA,CAAA,CAAA;EAAA,QAAA;EAAA,YAAA;EAAA,YAAA;EAAA,oBAAA;EAAA,gBAAA;EAAA,kBAAA;EAAA,eAAA;EAAA;AAAA,CAAA,EActC,uBAdsC,CAcd,WAdc,CAAA,CAAA,EAcC,SAdD"}
@@ -4,11 +4,11 @@ import { HoverSlotStyles } from "../constants.js";
4
4
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
5
 
6
6
  //#region src/react/utils/renderDiffChildren.tsx
7
- function renderDiffChildren({ fileDiff, oldFile, newFile, renderHeaderMetadata, renderAnnotation, renderHoverUtility, lineAnnotations, getHoveredLine }) {
7
+ function renderDiffChildren({ fileDiff, deletionFile, additionFile, renderHeaderMetadata, renderAnnotation, renderHoverUtility, lineAnnotations, getHoveredLine }) {
8
8
  const metadata = renderHeaderMetadata?.({
9
9
  fileDiff,
10
- oldFile,
11
- newFile
10
+ deletionFile,
11
+ additionFile
12
12
  });
13
13
  return /* @__PURE__ */ jsxs(Fragment, { children: [
14
14
  metadata != null && /* @__PURE__ */ jsx("div", {
@@ -1 +1 @@
1
- {"version":3,"file":"renderDiffChildren.js","names":[],"sources":["../../../src/react/utils/renderDiffChildren.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { HEADER_METADATA_SLOT_ID } from '../../constants';\nimport type { GetHoveredLineResult } from '../../managers/MouseEventManager';\nimport type { FileContents, FileDiffMetadata } from '../../types';\nimport { getLineAnnotationName } from '../../utils/getLineAnnotationName';\nimport { HoverSlotStyles } from '../constants';\nimport type { DiffBasePropsReact } from '../types';\n\ninterface RenderDiffChildrenProps<LAnnotation> {\n fileDiff?: FileDiffMetadata;\n oldFile?: FileContents;\n newFile?: FileContents;\n renderHeaderMetadata: DiffBasePropsReact<LAnnotation>['renderHeaderMetadata'];\n renderAnnotation: DiffBasePropsReact<LAnnotation>['renderAnnotation'];\n renderHoverUtility: DiffBasePropsReact<LAnnotation>['renderHoverUtility'];\n lineAnnotations: DiffBasePropsReact<LAnnotation>['lineAnnotations'];\n getHoveredLine(): GetHoveredLineResult<'diff'> | undefined;\n}\n\nexport function renderDiffChildren<LAnnotation>({\n fileDiff,\n oldFile,\n newFile,\n renderHeaderMetadata,\n renderAnnotation,\n renderHoverUtility,\n lineAnnotations,\n getHoveredLine,\n}: RenderDiffChildrenProps<LAnnotation>): ReactNode {\n const metadata = renderHeaderMetadata?.({ fileDiff, oldFile, newFile });\n return (\n <>\n {metadata != null && <div slot={HEADER_METADATA_SLOT_ID}>{metadata}</div>}\n {renderAnnotation != null &&\n lineAnnotations?.map((annotation, index) => (\n <div key={index} slot={getLineAnnotationName(annotation)}>\n {renderAnnotation(annotation)}\n </div>\n ))}\n {renderHoverUtility != null && (\n <div slot=\"hover-slot\" style={HoverSlotStyles}>\n {renderHoverUtility(getHoveredLine)}\n </div>\n )}\n </>\n );\n}\n"],"mappings":";;;;;;AAoBA,SAAgB,mBAAgC,EAC9C,UACA,SACA,SACA,sBACA,kBACA,oBACA,iBACA,kBACkD;CAClD,MAAM,WAAW,uBAAuB;EAAE;EAAU;EAAS;EAAS,CAAC;AACvE,QACE;EACG,YAAY,QAAQ,oBAAC;GAAI,MAAM;aAA0B;IAAe;EACxE,oBAAoB,QACnB,iBAAiB,KAAK,YAAY,UAChC,oBAAC;GAAgB,MAAM,sBAAsB,WAAW;aACrD,iBAAiB,WAAW;KADrB,MAEJ,CACN;EACH,sBAAsB,QACrB,oBAAC;GAAI,MAAK;GAAa,OAAO;aAC3B,mBAAmB,eAAe;IAC/B;KAEP"}
1
+ {"version":3,"file":"renderDiffChildren.js","names":[],"sources":["../../../src/react/utils/renderDiffChildren.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { HEADER_METADATA_SLOT_ID } from '../../constants';\nimport type { GetHoveredLineResult } from '../../managers/MouseEventManager';\nimport type { FileContents, FileDiffMetadata } from '../../types';\nimport { getLineAnnotationName } from '../../utils/getLineAnnotationName';\nimport { HoverSlotStyles } from '../constants';\nimport type { DiffBasePropsReact } from '../types';\n\ninterface RenderDiffChildrenProps<LAnnotation> {\n fileDiff?: FileDiffMetadata;\n deletionFile?: FileContents;\n additionFile?: FileContents;\n renderHeaderMetadata: DiffBasePropsReact<LAnnotation>['renderHeaderMetadata'];\n renderAnnotation: DiffBasePropsReact<LAnnotation>['renderAnnotation'];\n renderHoverUtility: DiffBasePropsReact<LAnnotation>['renderHoverUtility'];\n lineAnnotations: DiffBasePropsReact<LAnnotation>['lineAnnotations'];\n getHoveredLine(): GetHoveredLineResult<'diff'> | undefined;\n}\n\nexport function renderDiffChildren<LAnnotation>({\n fileDiff,\n deletionFile,\n additionFile,\n renderHeaderMetadata,\n renderAnnotation,\n renderHoverUtility,\n lineAnnotations,\n getHoveredLine,\n}: RenderDiffChildrenProps<LAnnotation>): ReactNode {\n const metadata = renderHeaderMetadata?.({\n fileDiff,\n deletionFile,\n additionFile,\n });\n return (\n <>\n {metadata != null && <div slot={HEADER_METADATA_SLOT_ID}>{metadata}</div>}\n {renderAnnotation != null &&\n lineAnnotations?.map((annotation, index) => (\n <div key={index} slot={getLineAnnotationName(annotation)}>\n {renderAnnotation(annotation)}\n </div>\n ))}\n {renderHoverUtility != null && (\n <div slot=\"hover-slot\" style={HoverSlotStyles}>\n {renderHoverUtility(getHoveredLine)}\n </div>\n )}\n </>\n );\n}\n"],"mappings":";;;;;;AAoBA,SAAgB,mBAAgC,EAC9C,UACA,cACA,cACA,sBACA,kBACA,oBACA,iBACA,kBACkD;CAClD,MAAM,WAAW,uBAAuB;EACtC;EACA;EACA;EACD,CAAC;AACF,QACE;EACG,YAAY,QAAQ,oBAAC;GAAI,MAAM;aAA0B;IAAe;EACxE,oBAAoB,QACnB,iBAAiB,KAAK,YAAY,UAChC,oBAAC;GAAgB,MAAM,sBAAsB,WAAW;aACrD,iBAAiB,WAAW;KADrB,MAEJ,CACN;EACH,sBAAsB,QACrB,oBAAC;GAAI,MAAK;GAAa,OAAO;aAC3B,mBAAmB,eAAe;IAC/B;KAEP"}
@@ -1 +1 @@
1
- {"version":3,"file":"useFileDiffInstance.js","names":[],"sources":["../../../src/react/utils/useFileDiffInstance.ts"],"sourcesContent":["import {\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useRef,\n} from 'react';\n\nimport { FileDiff, type FileDiffOptions } from '../../components/FileDiff';\nimport type { SelectedLineRange } from '../../managers/LineSelectionManager';\nimport type { GetHoveredLineResult } from '../../managers/MouseEventManager';\nimport type {\n DiffLineAnnotation,\n FileContents,\n FileDiffMetadata,\n} from '../../types';\nimport { areOptionsEqual } from '../../utils/areOptionsEqual';\nimport { WorkerPoolContext } from '../WorkerPoolContext';\nimport { useStableCallback } from './useStableCallback';\n\nconst useIsometricEffect =\n typeof window === 'undefined' ? useEffect : useLayoutEffect;\n\ninterface UseFileDiffInstanceProps<LAnnotation> {\n oldFile?: FileContents;\n newFile?: FileContents;\n fileDiff?: FileDiffMetadata;\n options: FileDiffOptions<LAnnotation> | undefined;\n lineAnnotations: DiffLineAnnotation<LAnnotation>[] | undefined;\n selectedLines: SelectedLineRange | null | undefined;\n prerenderedHTML: string | undefined;\n}\n\ninterface UseFileDiffInstanceReturn {\n ref(node: HTMLElement | null): void;\n getHoveredLine(): GetHoveredLineResult<'diff'> | undefined;\n}\n\nexport function useFileDiffInstance<LAnnotation>({\n oldFile,\n newFile,\n fileDiff,\n options,\n lineAnnotations,\n selectedLines,\n prerenderedHTML,\n}: UseFileDiffInstanceProps<LAnnotation>): UseFileDiffInstanceReturn {\n const poolManager = useContext(WorkerPoolContext);\n const instanceRef = useRef<FileDiff<LAnnotation> | null>(null);\n const ref = useStableCallback((fileContainer: HTMLElement | null) => {\n if (fileContainer != null) {\n if (instanceRef.current != null) {\n throw new Error(\n 'useFileDiffInstance: An instance should not already exist when a node is created'\n );\n }\n // FIXME: Ideally we don't use FileDiffUI here, and instead amalgamate\n // the renderers manually\n instanceRef.current = new FileDiff(options, poolManager, true);\n void instanceRef.current.hydrate({\n fileDiff,\n oldFile,\n newFile,\n fileContainer,\n lineAnnotations,\n prerenderedHTML,\n });\n } else {\n if (instanceRef.current == null) {\n throw new Error(\n 'useFileDiffInstance: A FileDiff instance should exist when unmounting'\n );\n }\n instanceRef.current.cleanUp();\n instanceRef.current = null;\n }\n });\n\n useIsometricEffect(() => {\n if (instanceRef.current == null) return;\n const instance = instanceRef.current;\n const forceRender = !areOptionsEqual(instance.options, options);\n instance.setOptions(options);\n void instance.render({\n forceRender,\n fileDiff,\n oldFile,\n newFile,\n lineAnnotations,\n });\n if (selectedLines !== undefined) {\n instance.setSelectedLines(selectedLines);\n }\n });\n\n const getHoveredLine = useCallback(():\n | GetHoveredLineResult<'diff'>\n | undefined => {\n return instanceRef.current?.getHoveredLine();\n }, []);\n\n return { ref, getHoveredLine };\n}\n"],"mappings":";;;;;;;AAoBA,MAAM,qBACJ,OAAO,WAAW,cAAc,YAAY;AAiB9C,SAAgB,oBAAiC,EAC/C,SACA,SACA,UACA,SACA,iBACA,eACA,mBACmE;CACnE,MAAM,cAAc,WAAW,kBAAkB;CACjD,MAAM,cAAc,OAAqC,KAAK;CAC9D,MAAM,MAAM,mBAAmB,kBAAsC;AACnE,MAAI,iBAAiB,MAAM;AACzB,OAAI,YAAY,WAAW,KACzB,OAAM,IAAI,MACR,mFACD;AAIH,eAAY,UAAU,IAAI,SAAS,SAAS,aAAa,KAAK;AAC9D,GAAK,YAAY,QAAQ,QAAQ;IAC/B;IACA;IACA;IACA;IACA;IACA;IACD,CAAC;SACG;AACL,OAAI,YAAY,WAAW,KACzB,OAAM,IAAI,MACR,wEACD;AAEH,eAAY,QAAQ,SAAS;AAC7B,eAAY,UAAU;;GAExB;AAEF,0BAAyB;AACvB,MAAI,YAAY,WAAW,KAAM;EACjC,MAAM,WAAW,YAAY;EAC7B,MAAM,cAAc,CAAC,gBAAgB,SAAS,SAAS,QAAQ;AAC/D,WAAS,WAAW,QAAQ;AAC5B,EAAK,SAAS,OAAO;GACnB;GACA;GACA;GACA;GACA;GACD,CAAC;AACF,MAAI,kBAAkB,OACpB,UAAS,iBAAiB,cAAc;GAE1C;AAQF,QAAO;EAAE;EAAK,gBANS,kBAEN;AACf,UAAO,YAAY,SAAS,gBAAgB;KAC3C,EAAE,CAAC;EAEwB"}
1
+ {"version":3,"file":"useFileDiffInstance.js","names":[],"sources":["../../../src/react/utils/useFileDiffInstance.ts"],"sourcesContent":["import {\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useRef,\n} from 'react';\n\nimport { FileDiff, type FileDiffOptions } from '../../components/FileDiff';\nimport type { SelectedLineRange } from '../../managers/LineSelectionManager';\nimport type { GetHoveredLineResult } from '../../managers/MouseEventManager';\nimport type {\n DiffLineAnnotation,\n FileContents,\n FileDiffMetadata,\n} from '../../types';\nimport { areOptionsEqual } from '../../utils/areOptionsEqual';\nimport { WorkerPoolContext } from '../WorkerPoolContext';\nimport { useStableCallback } from './useStableCallback';\n\nconst useIsometricEffect =\n typeof window === 'undefined' ? useEffect : useLayoutEffect;\n\ninterface UseFileDiffInstanceProps<LAnnotation> {\n oldFile?: FileContents;\n newFile?: FileContents;\n fileDiff?: FileDiffMetadata;\n options: FileDiffOptions<LAnnotation> | undefined;\n lineAnnotations: DiffLineAnnotation<LAnnotation>[] | undefined;\n selectedLines: SelectedLineRange | null | undefined;\n prerenderedHTML: string | undefined;\n}\n\ninterface UseFileDiffInstanceReturn {\n ref(node: HTMLElement | null): void;\n getHoveredLine(): GetHoveredLineResult<'diff'> | undefined;\n}\n\nexport function useFileDiffInstance<LAnnotation>({\n oldFile,\n newFile,\n fileDiff,\n options,\n lineAnnotations,\n selectedLines,\n prerenderedHTML,\n}: UseFileDiffInstanceProps<LAnnotation>): UseFileDiffInstanceReturn {\n const poolManager = useContext(WorkerPoolContext);\n const instanceRef = useRef<FileDiff<LAnnotation> | null>(null);\n const ref = useStableCallback((fileContainer: HTMLElement | null) => {\n if (fileContainer != null) {\n if (instanceRef.current != null) {\n throw new Error(\n 'useFileDiffInstance: An instance should not already exist when a node is created'\n );\n }\n instanceRef.current = new FileDiff(options, poolManager, true);\n void instanceRef.current.hydrate({\n fileDiff,\n oldFile,\n newFile,\n fileContainer,\n lineAnnotations,\n prerenderedHTML,\n });\n } else {\n if (instanceRef.current == null) {\n throw new Error(\n 'useFileDiffInstance: A FileDiff instance should exist when unmounting'\n );\n }\n instanceRef.current.cleanUp();\n instanceRef.current = null;\n }\n });\n\n useIsometricEffect(() => {\n if (instanceRef.current == null) return;\n const instance = instanceRef.current;\n const forceRender = !areOptionsEqual(instance.options, options);\n instance.setOptions(options);\n void instance.render({\n forceRender,\n fileDiff,\n oldFile,\n newFile,\n lineAnnotations,\n });\n if (selectedLines !== undefined) {\n instance.setSelectedLines(selectedLines);\n }\n });\n\n const getHoveredLine = useCallback(():\n | GetHoveredLineResult<'diff'>\n | undefined => {\n return instanceRef.current?.getHoveredLine();\n }, []);\n\n return { ref, getHoveredLine };\n}\n"],"mappings":";;;;;;;AAoBA,MAAM,qBACJ,OAAO,WAAW,cAAc,YAAY;AAiB9C,SAAgB,oBAAiC,EAC/C,SACA,SACA,UACA,SACA,iBACA,eACA,mBACmE;CACnE,MAAM,cAAc,WAAW,kBAAkB;CACjD,MAAM,cAAc,OAAqC,KAAK;CAC9D,MAAM,MAAM,mBAAmB,kBAAsC;AACnE,MAAI,iBAAiB,MAAM;AACzB,OAAI,YAAY,WAAW,KACzB,OAAM,IAAI,MACR,mFACD;AAEH,eAAY,UAAU,IAAI,SAAS,SAAS,aAAa,KAAK;AAC9D,GAAK,YAAY,QAAQ,QAAQ;IAC/B;IACA;IACA;IACA;IACA;IACA;IACD,CAAC;SACG;AACL,OAAI,YAAY,WAAW,KACzB,OAAM,IAAI,MACR,wEACD;AAEH,eAAY,QAAQ,SAAS;AAC7B,eAAY,UAAU;;GAExB;AAEF,0BAAyB;AACvB,MAAI,YAAY,WAAW,KAAM;EACjC,MAAM,WAAW,YAAY;EAC7B,MAAM,cAAc,CAAC,gBAAgB,SAAS,SAAS,QAAQ;AAC/D,WAAS,WAAW,QAAQ;AAC5B,EAAK,SAAS,OAAO;GACnB;GACA;GACA;GACA;GACA;GACD,CAAC;AACF,MAAI,kBAAkB,OACpB,UAAS,iBAAiB,cAAc;GAE1C;AAQF,QAAO;EAAE;EAAK,gBANS,kBAEN;AACf,UAAO,YAAY,SAAS,gBAAgB;KAC3C,EAAE,CAAC;EAEwB"}
@@ -1,4 +1,4 @@
1
- import { BaseDiffOptions, DiffLineAnnotation, DiffsHighlighter, ExpansionDirections, FileDiffMetadata, HunkData, RenderDiffOptions, ThemeTypes, ThemedDiffResult } from "../types.js";
1
+ import { BaseDiffOptions, DiffLineAnnotation, DiffsHighlighter, ExpansionDirections, FileDiffMetadata, HunkData, HunkExpansionRegion, RenderDiffOptions, RenderRange, ThemeTypes, ThemedDiffResult } from "../types.js";
2
2
  import { WorkerPoolManager } from "../worker/WorkerPoolManager.js";
3
3
  import "../worker/index.js";
4
4
  import { Element, ElementContent } from "hast";
@@ -21,6 +21,7 @@ declare class DiffHunksRenderer<LAnnotation = undefined> {
21
21
  options: BaseDiffOptions;
22
22
  private onRenderUpdate?;
23
23
  private workerManager?;
24
+ readonly __id: string;
24
25
  private highlighter;
25
26
  private diff;
26
27
  private expandedHunks;
@@ -30,17 +31,20 @@ declare class DiffHunksRenderer<LAnnotation = undefined> {
30
31
  private renderCache;
31
32
  constructor(options?: BaseDiffOptions, onRenderUpdate?: (() => unknown) | undefined, workerManager?: WorkerPoolManager | undefined);
32
33
  cleanUp(): void;
34
+ recycle(): void;
33
35
  setOptions(options: BaseDiffOptions): void;
34
36
  private mergeOptions;
35
37
  setThemeType(themeType: ThemeTypes): void;
36
38
  expandHunk(index: number, direction: ExpansionDirections): void;
39
+ getExpandedHunk(hunkIndex: number): HunkExpansionRegion;
40
+ getExpandedHunksMap(): Map<number, HunkExpansionRegion>;
37
41
  setLineAnnotations(lineAnnotations: DiffLineAnnotation<LAnnotation>[]): void;
38
42
  getOptionsWithDefaults(): OptionsWithDefaults;
39
43
  initializeHighlighter(): Promise<DiffsHighlighter>;
40
44
  hydrate(diff: FileDiffMetadata | undefined): void;
41
45
  private getRenderOptions;
42
- renderDiff(diff?: FileDiffMetadata | undefined): HunksRenderResult | undefined;
43
- asyncRender(diff: FileDiffMetadata): Promise<HunksRenderResult>;
46
+ renderDiff(diff?: FileDiffMetadata | undefined, renderRange?: RenderRange): HunksRenderResult | undefined;
47
+ asyncRender(diff: FileDiffMetadata, renderRange?: RenderRange): Promise<HunksRenderResult>;
44
48
  private createPreElement;
45
49
  private asyncHighlight;
46
50
  private renderDiffWithHighlighter;
@@ -50,9 +54,6 @@ declare class DiffHunksRenderer<LAnnotation = undefined> {
50
54
  renderFullAST(result: HunksRenderResult, children?: ElementContent[]): Element;
51
55
  renderFullHTML(result: HunksRenderResult, tempChildren?: ElementContent[]): string;
52
56
  renderPartialHTML(children: ElementContent[], columnType?: "unified" | "deletions" | "additions"): string;
53
- private renderCollapsedHunks;
54
- private renderHunks;
55
- private pushLineWithAnnotation;
56
57
  private getAnnotations;
57
58
  private getAnnotations;
58
59
  private renderHeader;