@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.
- package/dist/components/File.d.ts +4 -2
- package/dist/components/File.d.ts.map +1 -1
- package/dist/components/File.js +80 -34
- package/dist/components/File.js.map +1 -1
- package/dist/components/FileDiff.d.ts +50 -28
- package/dist/components/FileDiff.d.ts.map +1 -1
- package/dist/components/FileDiff.js +222 -80
- package/dist/components/FileDiff.js.map +1 -1
- package/dist/components/FileStream.d.ts +1 -0
- package/dist/components/FileStream.d.ts.map +1 -1
- package/dist/components/FileStream.js +10 -6
- package/dist/components/FileStream.js.map +1 -1
- package/dist/components/web-components.d.ts.map +1 -1
- package/dist/components/web-components.js +1 -1
- package/dist/components/web-components.js.map +1 -1
- package/dist/constants.d.ts +8 -2
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +10 -1
- package/dist/constants.js.map +1 -1
- package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts +1 -1
- package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts.map +1 -1
- package/dist/highlighter/languages/getResolvedOrResolveLanguage.js.map +1 -1
- package/dist/highlighter/languages/resolveLanguage.d.ts +1 -1
- package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -1
- package/dist/highlighter/languages/resolveLanguage.js.map +1 -1
- package/dist/highlighter/languages/resolveLanguages.js +1 -1
- package/dist/highlighter/languages/resolveLanguages.js.map +1 -1
- package/dist/highlighter/shared_highlighter.js +1 -1
- package/dist/highlighter/shared_highlighter.js.map +1 -1
- package/dist/highlighter/themes/registerCustomCSSVariableTheme.js +1 -1
- package/dist/highlighter/themes/registerCustomCSSVariableTheme.js.map +1 -1
- package/dist/index.d.ts +19 -10
- package/dist/index.js +14 -5
- package/dist/managers/LineSelectionManager.d.ts.map +1 -1
- package/dist/managers/LineSelectionManager.js +8 -9
- package/dist/managers/LineSelectionManager.js.map +1 -1
- package/dist/managers/ScrollSyncManager.d.ts +1 -0
- package/dist/managers/ScrollSyncManager.d.ts.map +1 -1
- package/dist/managers/ScrollSyncManager.js +14 -6
- package/dist/managers/ScrollSyncManager.js.map +1 -1
- package/dist/react/MultiFileDiff.js +2 -2
- package/dist/react/MultiFileDiff.js.map +1 -1
- package/dist/react/index.d.ts +2 -2
- package/dist/react/utils/renderDiffChildren.d.ts +4 -4
- package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
- package/dist/react/utils/renderDiffChildren.js +3 -3
- package/dist/react/utils/renderDiffChildren.js.map +1 -1
- package/dist/react/utils/useFileDiffInstance.js.map +1 -1
- package/dist/renderers/DiffHunksRenderer.d.ts +7 -6
- package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
- package/dist/renderers/DiffHunksRenderer.js +263 -337
- package/dist/renderers/DiffHunksRenderer.js.map +1 -1
- package/dist/renderers/FileRenderer.d.ts +1 -0
- package/dist/renderers/FileRenderer.d.ts.map +1 -1
- package/dist/renderers/FileRenderer.js +11 -4
- package/dist/renderers/FileRenderer.js.map +1 -1
- package/dist/ssr/index.d.ts +2 -2
- package/dist/style.js +1 -1
- package/dist/style.js.map +1 -1
- package/dist/types.d.ts +247 -43
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/areDiffLineAnnotationsEqual.d.ts +7 -0
- package/dist/utils/areDiffLineAnnotationsEqual.d.ts.map +1 -0
- package/dist/utils/areDiffLineAnnotationsEqual.js +8 -0
- package/dist/utils/areDiffLineAnnotationsEqual.js.map +1 -0
- package/dist/utils/areHunkDataEqual.d.ts +7 -0
- package/dist/utils/areHunkDataEqual.d.ts.map +1 -0
- package/dist/utils/areHunkDataEqual.js +8 -0
- package/dist/utils/areHunkDataEqual.js.map +1 -0
- package/dist/utils/areLineAnnotationsEqual.d.ts +7 -0
- package/dist/utils/areLineAnnotationsEqual.d.ts.map +1 -0
- package/dist/utils/areLineAnnotationsEqual.js +8 -0
- package/dist/utils/areLineAnnotationsEqual.js.map +1 -0
- package/dist/utils/arePrePropertiesEqual.d.ts +7 -0
- package/dist/utils/arePrePropertiesEqual.d.ts.map +1 -0
- package/dist/utils/arePrePropertiesEqual.js +9 -0
- package/dist/utils/arePrePropertiesEqual.js.map +1 -0
- package/dist/utils/areRenderRangesEqual.d.ts +7 -0
- package/dist/utils/areRenderRangesEqual.d.ts.map +1 -0
- package/dist/utils/areRenderRangesEqual.js +9 -0
- package/dist/utils/areRenderRangesEqual.js.map +1 -0
- package/dist/utils/areVirtualWindowSpecsEqual.d.ts +7 -0
- package/dist/utils/areVirtualWindowSpecsEqual.d.ts.map +1 -0
- package/dist/utils/areVirtualWindowSpecsEqual.js +9 -0
- package/dist/utils/areVirtualWindowSpecsEqual.js.map +1 -0
- package/dist/utils/areWorkerStatsEqual.d.ts +8 -0
- package/dist/utils/areWorkerStatsEqual.d.ts.map +1 -0
- package/dist/utils/areWorkerStatsEqual.js +9 -0
- package/dist/utils/areWorkerStatsEqual.js.map +1 -0
- package/dist/utils/createTransformerWithState.js +1 -1
- package/dist/utils/createTransformerWithState.js.map +1 -1
- package/dist/utils/createWindowFromScrollPosition.d.ts +22 -0
- package/dist/utils/createWindowFromScrollPosition.d.ts.map +1 -0
- package/dist/utils/createWindowFromScrollPosition.js +26 -0
- package/dist/utils/createWindowFromScrollPosition.js.map +1 -0
- package/dist/utils/diffAcceptRejectHunk.js +36 -21
- package/dist/utils/diffAcceptRejectHunk.js.map +1 -1
- package/dist/utils/formatCSSVariablePrefix.d.ts +1 -1
- package/dist/utils/formatCSSVariablePrefix.js +2 -2
- package/dist/utils/formatCSSVariablePrefix.js.map +1 -1
- package/dist/utils/getHighlighterThemeStyles.js +12 -12
- package/dist/utils/getHighlighterThemeStyles.js.map +1 -1
- package/dist/utils/getOrCreateCodeNode.d.ts +14 -0
- package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -0
- package/dist/utils/getOrCreateCodeNode.js +13 -0
- package/dist/utils/getOrCreateCodeNode.js.map +1 -0
- package/dist/utils/getTotalLineCountFromHunks.js +1 -1
- package/dist/utils/getTotalLineCountFromHunks.js.map +1 -1
- package/dist/utils/hast_utils.d.ts +2 -1
- package/dist/utils/hast_utils.d.ts.map +1 -1
- package/dist/utils/hast_utils.js +10 -1
- package/dist/utils/hast_utils.js.map +1 -1
- package/dist/utils/isDefaultRenderRange.d.ts +7 -0
- package/dist/utils/isDefaultRenderRange.d.ts.map +1 -0
- package/dist/utils/isDefaultRenderRange.js +8 -0
- package/dist/utils/isDefaultRenderRange.js.map +1 -0
- package/dist/utils/iterateOverDiff.d.ts +39 -0
- package/dist/utils/iterateOverDiff.d.ts.map +1 -0
- package/dist/utils/iterateOverDiff.js +356 -0
- package/dist/utils/iterateOverDiff.js.map +1 -0
- package/dist/utils/parseDiffFromFile.d.ts.map +1 -1
- package/dist/utils/parseDiffFromFile.js +8 -6
- package/dist/utils/parseDiffFromFile.js.map +1 -1
- package/dist/utils/parsePatchFiles.d.ts +15 -3
- package/dist/utils/parsePatchFiles.d.ts.map +1 -1
- package/dist/utils/parsePatchFiles.js +207 -158
- package/dist/utils/parsePatchFiles.js.map +1 -1
- package/dist/utils/processLine.js +4 -3
- package/dist/utils/processLine.js.map +1 -1
- package/dist/utils/renderDiffWithHighlighter.d.ts +7 -2
- package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
- package/dist/utils/renderDiffWithHighlighter.js +151 -229
- package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
- package/dist/utils/renderFileWithHighlighter.js +2 -2
- package/dist/utils/renderFileWithHighlighter.js.map +1 -1
- package/dist/utils/setWrapperNodeProps.d.ts +3 -7
- package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
- package/dist/utils/setWrapperNodeProps.js +1 -1
- package/dist/utils/setWrapperNodeProps.js.map +1 -1
- package/dist/worker/WorkerPoolManager.d.ts +9 -2
- package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
- package/dist/worker/WorkerPoolManager.js +124 -45
- package/dist/worker/WorkerPoolManager.js.map +1 -1
- package/dist/worker/types.d.ts +7 -0
- package/dist/worker/types.d.ts.map +1 -1
- package/dist/worker/worker-portable.js +652 -260
- package/dist/worker/worker-portable.js.map +1 -1
- package/dist/worker/worker.js +529 -249
- package/dist/worker/worker.js.map +1 -1
- package/package.json +21 -2
- package/dist/utils/createCodeNode.d.ts +0 -12
- package/dist/utils/createCodeNode.d.ts.map +0 -1
- package/dist/utils/createCodeNode.js +0 -12
- 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,
|
|
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 {
|
|
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,
|
|
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,
|
|
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;;;;;
|
|
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)
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
this.
|
|
44
|
-
this.
|
|
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;
|
|
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
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
|
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;
|
|
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"}
|
package/dist/react/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AnnotationLineMap, AnnotationSide, AnnotationSpan, BaseCodeOptions, BaseDiffOptions, BundledLanguage, ChangeContent,
|
|
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,
|
|
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
|
-
|
|
10
|
-
|
|
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
|
-
|
|
20
|
-
|
|
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,
|
|
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,
|
|
7
|
+
function renderDiffChildren({ fileDiff, deletionFile, additionFile, renderHeaderMetadata, renderAnnotation, renderHoverUtility, lineAnnotations, getHoveredLine }) {
|
|
8
8
|
const metadata = renderHeaderMetadata?.({
|
|
9
9
|
fileDiff,
|
|
10
|
-
|
|
11
|
-
|
|
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
|
|
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
|
|
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;
|