feat: build
This commit is contained in:
commit
f90eee85d8
1906 files changed
+514339
No files matched your search
@@ -0,0 +1,281 @@
|
||||
import { c as _c } from "react/compiler-runtime";
|
||||
import type { StructuredPatchHunk } from 'diff';
|
||||
import { resolve } from 'path';
|
||||
import React, { useMemo } from 'react';
|
||||
import { useTerminalSize } from '../../hooks/useTerminalSize.js';
|
||||
import { Box, Text } from '../../ink.js';
|
||||
import { getCwd } from '../../utils/cwd.js';
|
||||
import { readFileSafe } from '../../utils/file.js';
|
||||
import { Divider } from '../design-system/Divider.js';
|
||||
import { StructuredDiff } from '../StructuredDiff.js';
|
||||
type Props = {
|
||||
filePath: string;
|
||||
hunks: StructuredPatchHunk[];
|
||||
isLargeFile?: boolean;
|
||||
isBinary?: boolean;
|
||||
isTruncated?: boolean;
|
||||
isUntracked?: boolean;
|
||||
};
|
||||
|
||||
/**
|
||||
* Displays the diff content for a single file.
|
||||
* Uses StructuredDiff for word-level diffing and syntax highlighting.
|
||||
* No scrolling - renders all lines (max 400 due to parsing limits).
|
||||
*/
|
||||
export function DiffDetailView(t0) {
|
||||
const $ = _c(53);
|
||||
const {
|
||||
filePath,
|
||||
hunks,
|
||||
isLargeFile,
|
||||
isBinary,
|
||||
isTruncated,
|
||||
isUntracked
|
||||
} = t0;
|
||||
const {
|
||||
columns
|
||||
} = useTerminalSize();
|
||||
let t1;
|
||||
bb0: {
|
||||
if (!filePath) {
|
||||
let t2;
|
||||
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
|
||||
t2 = {
|
||||
firstLine: null,
|
||||
fileContent: undefined
|
||||
};
|
||||
$[0] = t2;
|
||||
} else {
|
||||
t2 = $[0];
|
||||
}
|
||||
t1 = t2;
|
||||
break bb0;
|
||||
}
|
||||
let content;
|
||||
let t2;
|
||||
if ($[1] !== filePath) {
|
||||
const fullPath = resolve(getCwd(), filePath);
|
||||
content = readFileSafe(fullPath);
|
||||
t2 = content?.split("\n")[0] ?? null;
|
||||
$[1] = filePath;
|
||||
$[2] = content;
|
||||
$[3] = t2;
|
||||
} else {
|
||||
content = $[2];
|
||||
t2 = $[3];
|
||||
}
|
||||
const t3 = content ?? undefined;
|
||||
let t4;
|
||||
if ($[4] !== t2 || $[5] !== t3) {
|
||||
t4 = {
|
||||
firstLine: t2,
|
||||
fileContent: t3
|
||||
};
|
||||
$[4] = t2;
|
||||
$[5] = t3;
|
||||
$[6] = t4;
|
||||
} else {
|
||||
t4 = $[6];
|
||||
}
|
||||
t1 = t4;
|
||||
}
|
||||
const {
|
||||
firstLine,
|
||||
fileContent
|
||||
} = t1;
|
||||
if (isUntracked) {
|
||||
let t2;
|
||||
if ($[7] !== filePath) {
|
||||
t2 = <Text bold={true}>{filePath}</Text>;
|
||||
$[7] = filePath;
|
||||
$[8] = t2;
|
||||
} else {
|
||||
t2 = $[8];
|
||||
}
|
||||
let t3;
|
||||
if ($[9] === Symbol.for("react.memo_cache_sentinel")) {
|
||||
t3 = <Text dimColor={true}> (untracked)</Text>;
|
||||
$[9] = t3;
|
||||
} else {
|
||||
t3 = $[9];
|
||||
}
|
||||
let t4;
|
||||
if ($[10] !== t2) {
|
||||
t4 = <Box>{t2}{t3}</Box>;
|
||||
$[10] = t2;
|
||||
$[11] = t4;
|
||||
} else {
|
||||
t4 = $[11];
|
||||
}
|
||||
let t5;
|
||||
if ($[12] === Symbol.for("react.memo_cache_sentinel")) {
|
||||
t5 = <Divider padding={4} />;
|
||||
$[12] = t5;
|
||||
} else {
|
||||
t5 = $[12];
|
||||
}
|
||||
let t6;
|
||||
if ($[13] === Symbol.for("react.memo_cache_sentinel")) {
|
||||
t6 = <Text dimColor={true} italic={true}>New file not yet staged.</Text>;
|
||||
$[13] = t6;
|
||||
} else {
|
||||
t6 = $[13];
|
||||
}
|
||||
let t7;
|
||||
if ($[14] !== filePath) {
|
||||
t7 = <Box flexDirection="column">{t6}<Text dimColor={true} italic={true}>Run `git add {filePath}` to see line counts.</Text></Box>;
|
||||
$[14] = filePath;
|
||||
$[15] = t7;
|
||||
} else {
|
||||
t7 = $[15];
|
||||
}
|
||||
let t8;
|
||||
if ($[16] !== t4 || $[17] !== t7) {
|
||||
t8 = <Box flexDirection="column" width="100%">{t4}{t5}{t7}</Box>;
|
||||
$[16] = t4;
|
||||
$[17] = t7;
|
||||
$[18] = t8;
|
||||
} else {
|
||||
t8 = $[18];
|
||||
}
|
||||
return t8;
|
||||
}
|
||||
if (isBinary) {
|
||||
let t2;
|
||||
if ($[19] !== filePath) {
|
||||
t2 = <Box><Text bold={true}>{filePath}</Text></Box>;
|
||||
$[19] = filePath;
|
||||
$[20] = t2;
|
||||
} else {
|
||||
t2 = $[20];
|
||||
}
|
||||
let t3;
|
||||
if ($[21] === Symbol.for("react.memo_cache_sentinel")) {
|
||||
t3 = <Divider padding={4} />;
|
||||
$[21] = t3;
|
||||
} else {
|
||||
t3 = $[21];
|
||||
}
|
||||
let t4;
|
||||
if ($[22] === Symbol.for("react.memo_cache_sentinel")) {
|
||||
t4 = <Box flexDirection="column"><Text dimColor={true} italic={true}>Binary file - cannot display diff</Text></Box>;
|
||||
$[22] = t4;
|
||||
} else {
|
||||
t4 = $[22];
|
||||
}
|
||||
let t5;
|
||||
if ($[23] !== t2) {
|
||||
t5 = <Box flexDirection="column" width="100%">{t2}{t3}{t4}</Box>;
|
||||
$[23] = t2;
|
||||
$[24] = t5;
|
||||
} else {
|
||||
t5 = $[24];
|
||||
}
|
||||
return t5;
|
||||
}
|
||||
if (isLargeFile) {
|
||||
let t2;
|
||||
if ($[25] !== filePath) {
|
||||
t2 = <Box><Text bold={true}>{filePath}</Text></Box>;
|
||||
$[25] = filePath;
|
||||
$[26] = t2;
|
||||
} else {
|
||||
t2 = $[26];
|
||||
}
|
||||
let t3;
|
||||
if ($[27] === Symbol.for("react.memo_cache_sentinel")) {
|
||||
t3 = <Divider padding={4} />;
|
||||
$[27] = t3;
|
||||
} else {
|
||||
t3 = $[27];
|
||||
}
|
||||
let t4;
|
||||
if ($[28] === Symbol.for("react.memo_cache_sentinel")) {
|
||||
t4 = <Box flexDirection="column"><Text dimColor={true} italic={true}>Large file - diff exceeds 1 MB limit</Text></Box>;
|
||||
$[28] = t4;
|
||||
} else {
|
||||
t4 = $[28];
|
||||
}
|
||||
let t5;
|
||||
if ($[29] !== t2) {
|
||||
t5 = <Box flexDirection="column" width="100%">{t2}{t3}{t4}</Box>;
|
||||
$[29] = t2;
|
||||
$[30] = t5;
|
||||
} else {
|
||||
t5 = $[30];
|
||||
}
|
||||
return t5;
|
||||
}
|
||||
let t2;
|
||||
if ($[31] !== filePath) {
|
||||
t2 = <Text bold={true}>{filePath}</Text>;
|
||||
$[31] = filePath;
|
||||
$[32] = t2;
|
||||
} else {
|
||||
t2 = $[32];
|
||||
}
|
||||
let t3;
|
||||
if ($[33] !== isTruncated) {
|
||||
t3 = isTruncated && <Text dimColor={true}> (truncated)</Text>;
|
||||
$[33] = isTruncated;
|
||||
$[34] = t3;
|
||||
} else {
|
||||
t3 = $[34];
|
||||
}
|
||||
let t4;
|
||||
if ($[35] !== t2 || $[36] !== t3) {
|
||||
t4 = <Box>{t2}{t3}</Box>;
|
||||
$[35] = t2;
|
||||
$[36] = t3;
|
||||
$[37] = t4;
|
||||
} else {
|
||||
t4 = $[37];
|
||||
}
|
||||
let t5;
|
||||
if ($[38] === Symbol.for("react.memo_cache_sentinel")) {
|
||||
t5 = <Divider padding={4} />;
|
||||
$[38] = t5;
|
||||
} else {
|
||||
t5 = $[38];
|
||||
}
|
||||
let t6;
|
||||
if ($[39] !== columns || $[40] !== fileContent || $[41] !== filePath || $[42] !== firstLine || $[43] !== hunks) {
|
||||
t6 = hunks.length === 0 ? <Text dimColor={true}>No diff content</Text> : hunks.map((hunk, index) => <StructuredDiff key={index} patch={hunk} filePath={filePath} firstLine={firstLine} fileContent={fileContent} dim={false} width={columns - 2 - 2} />);
|
||||
$[39] = columns;
|
||||
$[40] = fileContent;
|
||||
$[41] = filePath;
|
||||
$[42] = firstLine;
|
||||
$[43] = hunks;
|
||||
$[44] = t6;
|
||||
} else {
|
||||
t6 = $[44];
|
||||
}
|
||||
let t7;
|
||||
if ($[45] !== t6) {
|
||||
t7 = <Box flexDirection="column">{t6}</Box>;
|
||||
$[45] = t6;
|
||||
$[46] = t7;
|
||||
} else {
|
||||
t7 = $[46];
|
||||
}
|
||||
let t8;
|
||||
if ($[47] !== isTruncated) {
|
||||
t8 = isTruncated && <Text dimColor={true} italic={true}>… diff truncated (exceeded 400 line limit)</Text>;
|
||||
$[47] = isTruncated;
|
||||
$[48] = t8;
|
||||
} else {
|
||||
t8 = $[48];
|
||||
}
|
||||
let t9;
|
||||
if ($[49] !== t4 || $[50] !== t7 || $[51] !== t8) {
|
||||
t9 = <Box flexDirection="column" width="100%">{t4}{t5}{t7}{t8}</Box>;
|
||||
$[49] = t4;
|
||||
$[50] = t7;
|
||||
$[51] = t8;
|
||||
$[52] = t9;
|
||||
} else {
|
||||
t9 = $[52];
|
||||
}
|
||||
return t9;
|
||||
}
|
||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTdHJ1Y3R1cmVkUGF0Y2hIdW5rIiwicmVzb2x2ZSIsIlJlYWN0IiwidXNlTWVtbyIsInVzZVRlcm1pbmFsU2l6ZSIsIkJveCIsIlRleHQiLCJnZXRDd2QiLCJyZWFkRmlsZVNhZmUiLCJEaXZpZGVyIiwiU3RydWN0dXJlZERpZmYiLCJQcm9wcyIsImZpbGVQYXRoIiwiaHVua3MiLCJpc0xhcmdlRmlsZSIsImlzQmluYXJ5IiwiaXNUcnVuY2F0ZWQiLCJpc1VudHJhY2tlZCIsIkRpZmZEZXRhaWxWaWV3IiwidDAiLCIkIiwiX2MiLCJjb2x1bW5zIiwidDEiLCJiYjAiLCJ0MiIsIlN5bWJvbCIsImZvciIsImZpcnN0TGluZSIsImZpbGVDb250ZW50IiwidW5kZWZpbmVkIiwiY29udGVudCIsImZ1bGxQYXRoIiwic3BsaXQiLCJ0MyIsInQ0IiwidDUiLCJ0NiIsInQ3IiwidDgiLCJsZW5ndGgiLCJtYXAiLCJodW5rIiwiaW5kZXgiLCJ0OSJdLCJzb3VyY2VzIjpbIkRpZmZEZXRhaWxWaWV3LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFN0cnVjdHVyZWRQYXRjaEh1bmsgfSBmcm9tICdkaWZmJ1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnXG5pbXBvcnQgUmVhY3QsIHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlVGVybWluYWxTaXplIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlVGVybWluYWxTaXplLmpzJ1xuaW1wb3J0IHsgQm94LCBUZXh0IH0gZnJvbSAnLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHsgZ2V0Q3dkIH0gZnJvbSAnLi4vLi4vdXRpbHMvY3dkLmpzJ1xuaW1wb3J0IHsgcmVhZEZpbGVTYWZlIH0gZnJvbSAnLi4vLi4vdXRpbHMvZmlsZS5qcydcbmltcG9ydCB7IERpdmlkZXIgfSBmcm9tICcuLi9kZXNpZ24tc3lzdGVtL0RpdmlkZXIuanMnXG5pbXBvcnQgeyBTdHJ1Y3R1cmVkRGlmZiB9IGZyb20gJy4uL1N0cnVjdHVyZWREaWZmLmpzJ1xuXG50eXBlIFByb3BzID0ge1xuICBmaWxlUGF0aDogc3RyaW5nXG4gIGh1bmtzOiBTdHJ1Y3R1cmVkUGF0Y2hIdW5rW11cbiAgaXNMYXJnZUZpbGU/OiBib29sZWFuXG4gIGlzQmluYXJ5PzogYm9vbGVhblxuICBpc1RydW5jYXRlZD86IGJvb2xlYW5cbiAgaXNVbnRyYWNrZWQ/OiBib29sZWFuXG59XG5cbi8qKlxuICogRGlzcGxheXMgdGhlIGRpZmYgY29udGVudCBmb3IgYSBzaW5nbGUgZmlsZS5cbiAqIFVzZXMgU3RydWN0dXJlZERpZmYgZm9yIHdvcmQtbGV2ZWwgZGlmZmluZyBhbmQgc3ludGF4IGhpZ2hsaWdodGluZy5cbiAqIE5vIHNjcm9sbGluZyAtIHJlbmRlcnMgYWxsIGxpbmVzIChtYXggNDAwIGR1ZSB0byBwYXJzaW5nIGxpbWl0cykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBEaWZmRGV0YWlsVmlldyh7XG4gIGZpbGVQYXRoLFxuICBodW5rcyxcbiAgaXNMYXJnZUZpbGUsXG4gIGlzQmluYXJ5LFxuICBpc1RydW5jYXRlZCxcbiAgaXNVbnRyYWNrZWQsXG59OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IHsgY29sdW1ucyB9ID0gdXNlVGVybWluYWxTaXplKClcblxuICAvLyBSZWFkIGZpbGUgY29udGVudCBmb3Igc3ludGF4IGRldGVjdGlvbiBhbmQgbXVsdGlsaW5lIGNvbnN0cnVjdCBoYW5kbGluZy5cbiAgLy8gT25seSBjb21wdXRlZCB3aGVuIHRoaXMgY29tcG9uZW50IGlzIHJlbmRlcmVkIChkZXRhaWwgdmlldyBtb2RlKS5cbiAgY29uc3QgeyBmaXJzdExpbmUsIGZpbGVDb250ZW50IH0gPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICByZXR1cm4geyBmaXJzdExpbmU6IG51bGwsIGZpbGVDb250ZW50OiB1bmRlZmluZWQgfVxuICAgIH1cbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlc29sdmUoZ2V0Q3dkKCksIGZpbGVQYXRoKVxuICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVNhZmUoZnVsbFBhdGgpXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpcnN0TGluZTogY29udGVudD8uc3BsaXQoJ1xcbicpWzBdID8/IG51bGwsXG4gICAgICBmaWxlQ29udGVudDogY29udGVudCA/PyB1bmRlZmluZWQsXG4gICAgfVxuICB9LCBbZmlsZVBhdGhdKVxuXG4gIC8vIEhhbmRsZSB1bnRyYWNrZWQgZmlsZXNcbiAgaWYgKGlzVW50cmFja2VkKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIHdpZHRoPVwiMTAwJVwiPlxuICAgICAgICA8Qm94PlxuICAgICAgICAgIDxUZXh0IGJvbGQ+e2ZpbGVQYXRofTwvVGV4dD5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvcj4gKHVudHJhY2tlZCk8L1RleHQ+XG4gICAgICAgIDwvQm94PlxuICAgICAgICA8RGl2aWRlciBwYWRkaW5nPXs0fSAvPlxuICAgICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvciBpdGFsaWM+XG4gICAgICAgICAgICBOZXcgZmlsZSBub3QgeWV0IHN0YWdlZC5cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgPFRleHQgZGltQ29sb3IgaXRhbGljPlxuICAgICAgICAgICAgUnVuIGBnaXQgYWRkIHtmaWxlUGF0aH1gIHRvIHNlZSBsaW5lIGNvdW50cy5cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgIDwvQm94PlxuICAgICAgPC9Cb3g+XG4gICAgKVxuICB9XG5cbiAgLy8gSGFuZGxlIGJpbmFyeSBmaWxlc1xuICBpZiAoaXNCaW5hcnkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIgd2lkdGg9XCIxMDAlXCI+XG4gICAgICAgIDxCb3g+XG4gICAgICAgICAgPFRleHQgYm9sZD57ZmlsZVBhdGh9PC9UZXh0PlxuICAgICAgICA8L0JveD5cbiAgICAgICAgPERpdmlkZXIgcGFkZGluZz17NH0gLz5cbiAgICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+XG4gICAgICAgICAgPFRleHQgZGltQ29sb3IgaXRhbGljPlxuICAgICAgICAgICAgQmluYXJ5IGZpbGUgLSBjYW5ub3QgZGlzcGxheSBkaWZmXG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICA8L0JveD5cbiAgICAgIDwvQm94PlxuICAgIClcbiAgfVxuXG4gIC8vIEhhbmRsZSBsYXJnZSBmaWxlc1xuICBpZiAoaXNMYXJnZUZpbGUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIgd2lkdGg9XCIxMDAlXCI+XG4gICAgICAgIDxCb3g+XG4gICAgICAgICAgPFRleHQgYm9sZD57ZmlsZVBhdGh9PC9UZXh0PlxuICAgICAgICA8L0JveD5cbiAgICAgICAgPERpdmlkZXIgcGFkZGluZz17NH0gLz5cbiAgICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+XG4gICAgICAgICAgPFRleHQgZGltQ29sb3IgaXRhbGljPlxuICAgICAgICAgICAgTGFyZ2UgZmlsZSAtIGRpZmYgZXhjZWVkcyAxIE1CIGxpbWl0XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICA8L0JveD5cbiAgICAgIDwvQm94PlxuICAgIClcbiAgfVxuXG4gIGNvbnN0IG91dGVyUGFkZGluZ1ggPSAxXG4gIGNvbnN0IG91dGVyQm9yZGVyV2lkdGggPSAxXG5cbiAgcmV0dXJuIChcbiAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiB3aWR0aD1cIjEwMCVcIj5cbiAgICAgIDxCb3g+XG4gICAgICAgIDxUZXh0IGJvbGQ+e2ZpbGVQYXRofTwvVGV4dD5cbiAgICAgICAge2lzVHJ1bmNhdGVkICYmIDxUZXh0IGRpbUNvbG9yPiAodHJ1bmNhdGVkKTwvVGV4dD59XG4gICAgICA8L0JveD5cblxuICAgICAgPERpdmlkZXIgcGFkZGluZz17NH0gLz5cbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICB7aHV
Line truncated
|
||||
@@ -0,0 +1,383 @@
|
||||
import { c as _c } from "react/compiler-runtime";
|
||||
import type { StructuredPatchHunk } from 'diff';
|
||||
import React, { useEffect, useMemo, useRef, useState } from 'react';
|
||||
import type { CommandResultDisplay } from '../../commands.js';
|
||||
import { useRegisterOverlay } from '../../context/overlayContext.js';
|
||||
import { type DiffData, useDiffData } from '../../hooks/useDiffData.js';
|
||||
import { type TurnDiff, useTurnDiffs } from '../../hooks/useTurnDiffs.js';
|
||||
import { Box, Text } from '../../ink.js';
|
||||
import { useKeybindings } from '../../keybindings/useKeybinding.js';
|
||||
import { useShortcutDisplay } from '../../keybindings/useShortcutDisplay.js';
|
||||
import type { Message } from '../../types/message.js';
|
||||
import { plural } from '../../utils/stringUtils.js';
|
||||
import { Byline } from '../design-system/Byline.js';
|
||||
import { Dialog } from '../design-system/Dialog.js';
|
||||
import { DiffDetailView } from './DiffDetailView.js';
|
||||
import { DiffFileList } from './DiffFileList.js';
|
||||
type Props = {
|
||||
messages: Message[];
|
||||
onDone: (result?: string, options?: {
|
||||
display?: CommandResultDisplay;
|
||||
}) => void;
|
||||
};
|
||||
type ViewMode = 'list' | 'detail';
|
||||
type DiffSource = {
|
||||
type: 'current';
|
||||
} | {
|
||||
type: 'turn';
|
||||
turn: TurnDiff;
|
||||
};
|
||||
function turnDiffToDiffData(turn: TurnDiff): DiffData {
|
||||
const files = Array.from(turn.files.values()).map(f => ({
|
||||
path: f.filePath,
|
||||
linesAdded: f.linesAdded,
|
||||
linesRemoved: f.linesRemoved,
|
||||
isBinary: false,
|
||||
isLargeFile: false,
|
||||
isTruncated: false,
|
||||
isNewFile: f.isNewFile
|
||||
})).sort((a, b) => a.path.localeCompare(b.path));
|
||||
const hunks = new Map<string, StructuredPatchHunk[]>();
|
||||
for (const f of turn.files.values()) {
|
||||
hunks.set(f.filePath, f.hunks);
|
||||
}
|
||||
return {
|
||||
stats: {
|
||||
filesCount: turn.stats.filesChanged,
|
||||
linesAdded: turn.stats.linesAdded,
|
||||
linesRemoved: turn.stats.linesRemoved
|
||||
},
|
||||
files,
|
||||
hunks,
|
||||
loading: false
|
||||
};
|
||||
}
|
||||
export function DiffDialog(t0) {
|
||||
const $ = _c(73);
|
||||
const {
|
||||
messages,
|
||||
onDone
|
||||
} = t0;
|
||||
const gitDiffData = useDiffData();
|
||||
const turnDiffs = useTurnDiffs(messages);
|
||||
const [viewMode, setViewMode] = useState("list");
|
||||
const [selectedIndex, setSelectedIndex] = useState(0);
|
||||
const [sourceIndex, setSourceIndex] = useState(0);
|
||||
let t1;
|
||||
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
|
||||
t1 = {
|
||||
type: "current"
|
||||
};
|
||||
$[0] = t1;
|
||||
} else {
|
||||
t1 = $[0];
|
||||
}
|
||||
let t2;
|
||||
if ($[1] !== turnDiffs) {
|
||||
t2 = [t1, ...turnDiffs.map(_temp)];
|
||||
$[1] = turnDiffs;
|
||||
$[2] = t2;
|
||||
} else {
|
||||
t2 = $[2];
|
||||
}
|
||||
const sources = t2;
|
||||
const currentSource = sources[sourceIndex];
|
||||
const currentTurn = currentSource?.type === "turn" ? currentSource.turn : null;
|
||||
let t3;
|
||||
if ($[3] !== currentTurn || $[4] !== gitDiffData) {
|
||||
t3 = currentTurn ? turnDiffToDiffData(currentTurn) : gitDiffData;
|
||||
$[3] = currentTurn;
|
||||
$[4] = gitDiffData;
|
||||
$[5] = t3;
|
||||
} else {
|
||||
t3 = $[5];
|
||||
}
|
||||
const diffData = t3;
|
||||
const selectedFile = diffData.files[selectedIndex];
|
||||
let t4;
|
||||
if ($[6] !== diffData.hunks || $[7] !== selectedFile) {
|
||||
t4 = selectedFile ? diffData.hunks.get(selectedFile.path) || [] : [];
|
||||
$[6] = diffData.hunks;
|
||||
$[7] = selectedFile;
|
||||
$[8] = t4;
|
||||
} else {
|
||||
t4 = $[8];
|
||||
}
|
||||
const selectedHunks = t4;
|
||||
let t5;
|
||||
let t6;
|
||||
if ($[9] !== sourceIndex || $[10] !== sources.length) {
|
||||
t5 = () => {
|
||||
if (sourceIndex >= sources.length) {
|
||||
setSourceIndex(Math.max(0, sources.length - 1));
|
||||
}
|
||||
};
|
||||
t6 = [sources.length, sourceIndex];
|
||||
$[9] = sourceIndex;
|
||||
$[10] = sources.length;
|
||||
$[11] = t5;
|
||||
$[12] = t6;
|
||||
} else {
|
||||
t5 = $[11];
|
||||
t6 = $[12];
|
||||
}
|
||||
useEffect(t5, t6);
|
||||
const prevSourceIndex = useRef(sourceIndex);
|
||||
let t7;
|
||||
let t8;
|
||||
if ($[13] !== sourceIndex) {
|
||||
t7 = () => {
|
||||
if (prevSourceIndex.current !== sourceIndex) {
|
||||
setSelectedIndex(0);
|
||||
prevSourceIndex.current = sourceIndex;
|
||||
}
|
||||
};
|
||||
t8 = [sourceIndex];
|
||||
$[13] = sourceIndex;
|
||||
$[14] = t7;
|
||||
$[15] = t8;
|
||||
} else {
|
||||
t7 = $[14];
|
||||
t8 = $[15];
|
||||
}
|
||||
useEffect(t7, t8);
|
||||
useRegisterOverlay("diff-dialog");
|
||||
let t10;
|
||||
let t9;
|
||||
if ($[16] !== sources.length || $[17] !== viewMode) {
|
||||
t9 = () => {
|
||||
if (viewMode === "detail") {
|
||||
setViewMode("list");
|
||||
} else {
|
||||
if (viewMode === "list" && sources.length > 1) {
|
||||
setSourceIndex(_temp2);
|
||||
}
|
||||
}
|
||||
};
|
||||
t10 = () => {
|
||||
if (viewMode === "list" && sources.length > 1) {
|
||||
setSourceIndex(prev_0 => Math.min(sources.length - 1, prev_0 + 1));
|
||||
}
|
||||
};
|
||||
$[16] = sources.length;
|
||||
$[17] = viewMode;
|
||||
$[18] = t10;
|
||||
$[19] = t9;
|
||||
} else {
|
||||
t10 = $[18];
|
||||
t9 = $[19];
|
||||
}
|
||||
let t11;
|
||||
if ($[20] !== viewMode) {
|
||||
t11 = () => {
|
||||
if (viewMode === "detail") {
|
||||
setViewMode("list");
|
||||
}
|
||||
};
|
||||
$[20] = viewMode;
|
||||
$[21] = t11;
|
||||
} else {
|
||||
t11 = $[21];
|
||||
}
|
||||
let t12;
|
||||
if ($[22] !== selectedFile || $[23] !== viewMode) {
|
||||
t12 = () => {
|
||||
if (viewMode === "list" && selectedFile) {
|
||||
setViewMode("detail");
|
||||
}
|
||||
};
|
||||
$[22] = selectedFile;
|
||||
$[23] = viewMode;
|
||||
$[24] = t12;
|
||||
} else {
|
||||
t12 = $[24];
|
||||
}
|
||||
let t13;
|
||||
if ($[25] !== viewMode) {
|
||||
t13 = () => {
|
||||
if (viewMode === "list") {
|
||||
setSelectedIndex(_temp3);
|
||||
}
|
||||
};
|
||||
$[25] = viewMode;
|
||||
$[26] = t13;
|
||||
} else {
|
||||
t13 = $[26];
|
||||
}
|
||||
let t14;
|
||||
if ($[27] !== diffData.files.length || $[28] !== viewMode) {
|
||||
t14 = () => {
|
||||
if (viewMode === "list") {
|
||||
setSelectedIndex(prev_2 => Math.min(diffData.files.length - 1, prev_2 + 1));
|
||||
}
|
||||
};
|
||||
$[27] = diffData.files.length;
|
||||
$[28] = viewMode;
|
||||
$[29] = t14;
|
||||
} else {
|
||||
t14 = $[29];
|
||||
}
|
||||
let t15;
|
||||
if ($[30] !== t10 || $[31] !== t11 || $[32] !== t12 || $[33] !== t13 || $[34] !== t14 || $[35] !== t9) {
|
||||
t15 = {
|
||||
"diff:previousSource": t9,
|
||||
"diff:nextSource": t10,
|
||||
"diff:back": t11,
|
||||
"diff:viewDetails": t12,
|
||||
"diff:previousFile": t13,
|
||||
"diff:nextFile": t14
|
||||
};
|
||||
$[30] = t10;
|
||||
$[31] = t11;
|
||||
$[32] = t12;
|
||||
$[33] = t13;
|
||||
$[34] = t14;
|
||||
$[35] = t9;
|
||||
$[36] = t15;
|
||||
} else {
|
||||
t15 = $[36];
|
||||
}
|
||||
let t16;
|
||||
if ($[37] === Symbol.for("react.memo_cache_sentinel")) {
|
||||
t16 = {
|
||||
context: "DiffDialog"
|
||||
};
|
||||
$[37] = t16;
|
||||
} else {
|
||||
t16 = $[37];
|
||||
}
|
||||
useKeybindings(t15, t16);
|
||||
let t17;
|
||||
if ($[38] !== diffData.stats) {
|
||||
t17 = diffData.stats ? <Text dimColor={true}>{diffData.stats.filesCount} {plural(diffData.stats.filesCount, "file")}{" "}changed{diffData.stats.linesAdded > 0 && <Text color="diffAddedWord"> +{diffData.stats.linesAdded}</Text>}{diffData.stats.linesRemoved > 0 && <Text color="diffRemovedWord"> -{diffData.stats.linesRemoved}</Text>}</Text> : null;
|
||||
$[38] = diffData.stats;
|
||||
$[39] = t17;
|
||||
} else {
|
||||
t17 = $[39];
|
||||
}
|
||||
const subtitle = t17;
|
||||
const headerTitle = currentTurn ? `Turn ${currentTurn.turnIndex}` : "Uncommitted changes";
|
||||
const headerSubtitle = currentTurn ? currentTurn.userPromptPreview ? `"${currentTurn.userPromptPreview}"` : "" : "(git diff HEAD)";
|
||||
let t18;
|
||||
if ($[40] !== sourceIndex || $[41] !== sources) {
|
||||
t18 = sources.length > 1 ? <Box>{sourceIndex > 0 && <Text dimColor={true}>◀ </Text>}{sources.map((source, i) => {
|
||||
const isSelected = i === sourceIndex;
|
||||
const label = source.type === "current" ? "Current" : `T${source.turn.turnIndex}`;
|
||||
return <Text key={i} dimColor={!isSelected} bold={isSelected}>{i > 0 ? " \xB7 " : ""}{label}</Text>;
|
||||
})}{sourceIndex < sources.length - 1 && <Text dimColor={true}> ▶</Text>}</Box> : null;
|
||||
$[40] = sourceIndex;
|
||||
$[41] = sources;
|
||||
$[42] = t18;
|
||||
} else {
|
||||
t18 = $[42];
|
||||
}
|
||||
const sourceSelector = t18;
|
||||
const dismissShortcut = useShortcutDisplay("diff:dismiss", "DiffDialog", "esc");
|
||||
let t19;
|
||||
bb0: {
|
||||
if (diffData.loading) {
|
||||
t19 = "Loading diff\u2026";
|
||||
break bb0;
|
||||
}
|
||||
if (currentTurn) {
|
||||
t19 = "No file changes in this turn";
|
||||
break bb0;
|
||||
}
|
||||
if (diffData.stats && diffData.stats.filesCount > 0 && diffData.files.length === 0) {
|
||||
t19 = "Too many files to display details";
|
||||
break bb0;
|
||||
}
|
||||
t19 = "Working tree is clean";
|
||||
}
|
||||
const emptyMessage = t19;
|
||||
let t20;
|
||||
if ($[43] !== headerSubtitle) {
|
||||
t20 = headerSubtitle && <Text dimColor={true}> {headerSubtitle}</Text>;
|
||||
$[43] = headerSubtitle;
|
||||
$[44] = t20;
|
||||
} else {
|
||||
t20 = $[44];
|
||||
}
|
||||
let t21;
|
||||
if ($[45] !== headerTitle || $[46] !== t20) {
|
||||
t21 = <Text>{headerTitle}{t20}</Text>;
|
||||
$[45] = headerTitle;
|
||||
$[46] = t20;
|
||||
$[47] = t21;
|
||||
} else {
|
||||
t21 = $[47];
|
||||
}
|
||||
const title = t21;
|
||||
let t22;
|
||||
if ($[48] !== onDone || $[49] !== viewMode) {
|
||||
t22 = function handleCancel() {
|
||||
if (viewMode === "detail") {
|
||||
setViewMode("list");
|
||||
} else {
|
||||
onDone("Diff dialog dismissed", {
|
||||
display: "system"
|
||||
});
|
||||
}
|
||||
};
|
||||
$[48] = onDone;
|
||||
$[49] = viewMode;
|
||||
$[50] = t22;
|
||||
} else {
|
||||
t22 = $[50];
|
||||
}
|
||||
const handleCancel = t22;
|
||||
let t23;
|
||||
if ($[51] !== dismissShortcut || $[52] !== sources.length || $[53] !== viewMode) {
|
||||
t23 = exitState => exitState.pending ? <Text>Press {exitState.keyName} again to exit</Text> : viewMode === "list" ? <Byline>{sources.length > 1 && <Text>←/→ source</Text>}<Text>↑/↓ select</Text><Text>Enter view</Text><Text>{dismissShortcut} close</Text></Byline> : <Byline><Text>← back</Text><Text>{dismissShortcut} close</Text></Byline>;
|
||||
$[51] = dismissShortcut;
|
||||
$[52] = sources.length;
|
||||
$[53] = viewMode;
|
||||
$[54] = t23;
|
||||
} else {
|
||||
t23 = $[54];
|
||||
}
|
||||
let t24;
|
||||
if ($[55] !== diffData.files || $[56] !== emptyMessage || $[57] !== selectedFile?.isBinary || $[58] !== selectedFile?.isLargeFile || $[59] !== selectedFile?.isTruncated || $[60] !== selectedFile?.isUntracked || $[61] !== selectedFile?.path || $[62] !== selectedHunks || $[63] !== selectedIndex || $[64] !== viewMode) {
|
||||
t24 = diffData.files.length === 0 ? <Box marginTop={1}><Text dimColor={true}>{emptyMessage}</Text></Box> : viewMode === "list" ? <Box flexDirection="column" marginTop={1}><DiffFileList files={diffData.files} selectedIndex={selectedIndex} /></Box> : <Box flexDirection="column" marginTop={1}><DiffDetailView filePath={selectedFile?.path || ""} hunks={selectedHunks} isLargeFile={selectedFile?.isLargeFile} isBinary={selectedFile?.isBinary} isTruncated={selectedFile?.isTruncated} isUntracked={selectedFile?.isUntracked} /></Box>;
|
||||
$[55] = diffData.files;
|
||||
$[56] = emptyMessage;
|
||||
$[57] = selectedFile?.isBinary;
|
||||
$[58] = selectedFile?.isLargeFile;
|
||||
$[59] = selectedFile?.isTruncated;
|
||||
$[60] = selectedFile?.isUntracked;
|
||||
$[61] = selectedFile?.path;
|
||||
$[62] = selectedHunks;
|
||||
$[63] = selectedIndex;
|
||||
$[64] = viewMode;
|
||||
$[65] = t24;
|
||||
} else {
|
||||
t24 = $[65];
|
||||
}
|
||||
let t25;
|
||||
if ($[66] !== handleCancel || $[67] !== sourceSelector || $[68] !== subtitle || $[69] !== t23 || $[70] !== t24 || $[71] !== title) {
|
||||
t25 = <Dialog title={title} onCancel={handleCancel} color="background" inputGuide={t23}>{sourceSelector}{subtitle}{t24}</Dialog>;
|
||||
$[66] = handleCancel;
|
||||
$[67] = sourceSelector;
|
||||
$[68] = subtitle;
|
||||
$[69] = t23;
|
||||
$[70] = t24;
|
||||
$[71] = title;
|
||||
$[72] = t25;
|
||||
} else {
|
||||
t25 = $[72];
|
||||
}
|
||||
return t25;
|
||||
}
|
||||
function _temp3(prev_1) {
|
||||
return Math.max(0, prev_1 - 1);
|
||||
}
|
||||
function _temp2(prev) {
|
||||
return Math.max(0, prev - 1);
|
||||
}
|
||||
function _temp(turn) {
|
||||
return {
|
||||
type: "turn",
|
||||
turn
|
||||
};
|
||||
}
|
||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTdHJ1Y3R1cmVkUGF0Y2hIdW5rIiwiUmVhY3QiLCJ1c2VFZmZlY3QiLCJ1c2VNZW1vIiwidXNlUmVmIiwidXNlU3RhdGUiLCJDb21tYW5kUmVzdWx0RGlzcGxheSIsInVzZVJlZ2lzdGVyT3ZlcmxheSIsIkRpZmZEYXRhIiwidXNlRGlmZkRhdGEiLCJUdXJuRGlmZiIsInVzZVR1cm5EaWZmcyIsIkJveCIsIlRleHQiLCJ1c2VLZXliaW5kaW5ncyIsInVzZVNob3J0Y3V0RGlzcGxheSIsIk1lc3NhZ2UiLCJwbHVyYWwiLCJCeWxpbmUiLCJEaWFsb2ciLCJEaWZmRGV0YWlsVmlldyIsIkRpZmZGaWxlTGlzdCIsIlByb3BzIiwibWVzc2FnZXMiLCJvbkRvbmUiLCJyZXN1bHQiLCJvcHRpb25zIiwiZGlzcGxheSIsIlZpZXdNb2RlIiwiRGlmZlNvdXJjZSIsInR5cGUiLCJ0dXJuIiwidHVybkRpZmZUb0RpZmZEYXRhIiwiZmlsZXMiLCJBcnJheSIsImZyb20iLCJ2YWx1ZXMiLCJtYXAiLCJmIiwicGF0aCIsImZpbGVQYXRoIiwibGluZXNBZGRlZCIsImxpbmVzUmVtb3ZlZCIsImlzQmluYXJ5IiwiaXNMYXJnZUZpbGUiLCJpc1RydW5jYXRlZCIsImlzTmV3RmlsZSIsInNvcnQiLCJhIiwiYiIsImxvY2FsZUNvbXBhcmUiLCJodW5rcyIsIk1hcCIsInNldCIsInN0YXRzIiwiZmlsZXNDb3VudCIsImZpbGVzQ2hhbmdlZCIsImxvYWRpbmciLCJEaWZmRGlhbG9nIiwidDAiLCIkIiwiX2MiLCJnaXREaWZmRGF0YSIsInR1cm5EaWZmcyIsInZpZXdNb2RlIiwic2V0Vmlld01vZGUiLCJzZWxlY3RlZEluZGV4Iiwic2V0U2VsZWN0ZWRJbmRleCIsInNvdXJjZUluZGV4Iiwic2V0U291cmNlSW5kZXgiLCJ0MSIsIlN5bWJvbCIsImZvciIsInQyIiwiX3RlbXAiLCJzb3VyY2VzIiwiY3VycmVudFNvdXJjZSIsImN1cnJlbnRUdXJuIiwidDMiLCJkaWZmRGF0YSIsInNlbGVjdGVkRmlsZSIsInQ0IiwiZ2V0Iiwic2VsZWN0ZWRIdW5rcyIsInQ1IiwidDYiLCJsZW5ndGgiLCJNYXRoIiwibWF4IiwicHJldlNvdXJjZUluZGV4IiwidDciLCJ0OCIsImN1cnJlbnQiLCJ0MTAiLCJ0OSIsIl90ZW1wMiIsInByZXZfMCIsIm1pbiIsInByZXYiLCJ0MTEiLCJ0MTIiLCJ0MTMiLCJfdGVtcDMiLCJ0MTQiLCJwcmV2XzIiLCJ0MTUiLCJ0MTYiLCJjb250ZXh0IiwidDE3Iiwic3VidGl0bGUiLCJoZWFkZXJUaXRsZSIsInR1cm5JbmRleCIsImhlYWRlclN1YnRpdGxlIiwidXNlclByb21wdFByZXZpZXciLCJ0MTgiLCJzb3VyY2UiLCJpIiwiaXNTZWxlY3RlZCIsImxhYmVsIiwic291cmNlU2VsZWN0b3IiLCJkaXNtaXNzU2hvcnRjdXQiLCJ0MTkiLCJiYjAiLCJlbXB0eU1lc3NhZ2UiLCJ0MjAiLCJ0MjEiLCJ0aXRsZSIsInQyMiIsImhhbmRsZUNhbmNlbCIsInQyMyIsImV4aXRTdGF0ZSIsInBlbmRpbmciLCJrZXlOYW1lIiwidDI0IiwiaXNVbnRyYWNrZWQiLCJ0MjUiLCJwcmV2XzEiXSwic291cmNlcyI6WyJEaWZmRGlhbG9nLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFN0cnVjdHVyZWRQYXRjaEh1bmsgfSBmcm9tICdkaWZmJ1xuaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kUmVzdWx0RGlzcGxheSB9IGZyb20gJy4uLy4uL2NvbW1hbmRzLmpzJ1xuaW1wb3J0IHsgdXNlUmVnaXN0ZXJPdmVybGF5IH0gZnJvbSAnLi4vLi4vY29udGV4dC9vdmVybGF5Q29udGV4dC5qcydcbmltcG9ydCB7IHR5cGUgRGlmZkRhdGEsIHVzZURpZmZEYXRhIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlRGlmZkRhdGEuanMnXG5pbXBvcnQgeyB0eXBlIFR1cm5EaWZmLCB1c2VUdXJuRGlmZnMgfSBmcm9tICcuLi8uLi9ob29rcy91c2VUdXJuRGlmZnMuanMnXG5pbXBvcnQgeyBCb3gsIFRleHQgfSBmcm9tICcuLi8uLi9pbmsuanMnXG5pbXBvcnQgeyB1c2VLZXliaW5kaW5ncyB9IGZyb20gJy4uLy4uL2tleWJpbmRpbmdzL3VzZUtleWJpbmRpbmcuanMnXG5pbXBvcnQgeyB1c2VTaG9ydGN1dERpc3BsYXkgfSBmcm9tICcuLi8uLi9rZXliaW5kaW5ncy91c2VTaG9ydGN1dERpc3BsYXkuanMnXG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2UgfSBmcm9tICcuLi8uLi90eXBlcy9tZXNzYWdlLmpzJ1xuaW1wb3J0IHsgcGx1cmFsIH0gZnJvbSAnLi4vLi4vdXRpbHMvc3RyaW5nVXRpbHMuanMnXG5pbXBvcnQgeyBCeWxpbmUgfSBmcm9tICcuLi9kZXNpZ24tc3lzdGVtL0J5bGluZS5qcydcbmltcG9ydCB7IERpYWxvZyB9IGZyb20gJy4uL2Rlc2lnbi1zeXN0ZW0vRGlhbG9nLmpzJ1xuaW1wb3J0IHsgRGlmZkRldGFpbFZpZXcgfSBmcm9tICcuL0RpZmZEZXRhaWxWaWV3LmpzJ1xuaW1wb3J0IHsgRGlmZkZpbGVMaXN0IH0gZnJvbSAnLi9EaWZmRmlsZUxpc3QuanMnXG5cbnR5cGUgUHJvcHMgPSB7XG4gIG1lc3NhZ2VzOiBNZXNzYWdlW11cbiAgb25Eb25lOiAoXG4gICAgcmVzdWx0Pzogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IGRpc3BsYXk/OiBDb21tYW5kUmVzdWx0RGlzcGxheSB9LFxuICApID0+IHZvaWRcbn1cblxudHlwZSBWaWV3TW9kZSA9ICdsaXN0JyB8ICdkZXRhaWwnXG5cbnR5cGUgRGlmZlNvdXJjZSA9IHsgdHlwZTogJ2N1cnJlbnQnIH0gfCB7IHR5cGU6ICd0dXJuJzsgdHVybjogVHVybkRpZmYgfVxuXG5mdW5jdGlvbiB0dXJuRGlmZlRvRGlmZkRhdGEodHVybjogVHVybkRpZmYpOiBEaWZmRGF0YSB7XG4gIGNvbnN0IGZpbGVzID0gQXJyYXkuZnJvbSh0dXJuLmZpbGVzLnZhbHVlcygpKVxuICAgIC5tYXAoZiA9PiAoe1xuICAgICAgcGF0aDogZi5maWxlUGF0aCxcbiAgICAgIGxpbmVzQWRkZWQ6IGYubGluZXNBZGRlZCxcbiAgICAgIGxpbmVzUmVtb3ZlZDogZi5saW5lc1JlbW92ZWQsXG4gICAgICBpc0JpbmFyeTogZmFsc2UsXG4gICAgICBpc0xhcmdlRmlsZTogZmFsc2UsXG4gICAgICBpc1RydW5jYXRlZDogZmFsc2UsXG4gICAgICBpc05ld0ZpbGU6IGYuaXNOZXdGaWxlLFxuICAgIH0pKVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLnBhdGgubG9jYWxlQ29tcGFyZShiLnBhdGgpKVxuXG4gIGNvbnN0IGh1bmtzID0gbmV3IE1hcDxzdHJpbmcsIFN0cnVjdHVyZWRQYXRjaEh1bmtbXT4oKVxuICBmb3IgKGNvbnN0IGYgb2YgdHVybi5maWxlcy52YWx1ZXMoKSkge1xuICAgIGh1bmtzLnNldChmLmZpbGVQYXRoLCBmLmh1bmtzKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGF0czoge1xuICAgICAgZmlsZXNDb3VudDogdHVybi5zdGF0cy5maWxlc0NoYW5nZWQsXG4gICAgICBsaW5lc0FkZGVkOiB0dXJuLnN0YXRzLmxpbmVzQWRkZWQsXG4gICAgICBsaW5lc1JlbW92ZWQ6IHR1cm4uc3RhdHMubGluZXNSZW1vdmVkLFxuICAgIH0sXG4gICAgZmlsZXMsXG4gICAgaHVua3MsXG4gICAgbG9hZGluZzogZmFsc2UsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIERpZmZEaWFsb2coeyBtZXNzYWdlcywgb25Eb25lIH06IFByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgZ2l0RGlmZkRhdGEgPSB1c2VEaWZmRGF0YSgpXG4gIGNvbnN0IHR1cm5EaWZmcyA9IHVzZVR1cm5EaWZmcyhtZXNzYWdlcylcblxuICBjb25zdCBbdmlld01vZGUsIHNldFZpZXdNb2RlXSA9IHVzZVN0YXRlPFZpZXdNb2RlPignbGlzdCcpXG4gIGNvbnN0IFtzZWxlY3RlZEluZGV4LCBzZXRTZWxlY3RlZEluZGV4XSA9IHVzZVN0YXRlPG51bWJlcj4oMClcbiAgY29uc3QgW3NvdXJjZUluZGV4LCBzZXRTb3VyY2VJbmRleF0gPSB
Line truncated
|
||||
@@ -0,0 +1,292 @@
|
||||
import { c as _c } from "react/compiler-runtime";
|
||||
import figures from 'figures';
|
||||
import React, { useMemo } from 'react';
|
||||
import type { DiffFile } from '../../hooks/useDiffData.js';
|
||||
import { useTerminalSize } from '../../hooks/useTerminalSize.js';
|
||||
import { Box, Text } from '../../ink.js';
|
||||
import { truncateStartToWidth } from '../../utils/format.js';
|
||||
import { plural } from '../../utils/stringUtils.js';
|
||||
const MAX_VISIBLE_FILES = 5;
|
||||
type Props = {
|
||||
files: DiffFile[];
|
||||
selectedIndex: number;
|
||||
};
|
||||
export function DiffFileList(t0) {
|
||||
const $ = _c(36);
|
||||
const {
|
||||
files,
|
||||
selectedIndex
|
||||
} = t0;
|
||||
const {
|
||||
columns
|
||||
} = useTerminalSize();
|
||||
let t1;
|
||||
bb0: {
|
||||
if (files.length === 0 || files.length <= MAX_VISIBLE_FILES) {
|
||||
let t2;
|
||||
if ($[0] !== files.length) {
|
||||
t2 = {
|
||||
startIndex: 0,
|
||||
endIndex: files.length
|
||||
};
|
||||
$[0] = files.length;
|
||||
$[1] = t2;
|
||||
} else {
|
||||
t2 = $[1];
|
||||
}
|
||||
t1 = t2;
|
||||
break bb0;
|
||||
}
|
||||
let start = Math.max(0, selectedIndex - Math.floor(MAX_VISIBLE_FILES / 2));
|
||||
let end = start + MAX_VISIBLE_FILES;
|
||||
if (end > files.length) {
|
||||
end = files.length;
|
||||
start = Math.max(0, end - MAX_VISIBLE_FILES);
|
||||
}
|
||||
let t2;
|
||||
if ($[2] !== end || $[3] !== start) {
|
||||
t2 = {
|
||||
startIndex: start,
|
||||
endIndex: end
|
||||
};
|
||||
$[2] = end;
|
||||
$[3] = start;
|
||||
$[4] = t2;
|
||||
} else {
|
||||
t2 = $[4];
|
||||
}
|
||||
t1 = t2;
|
||||
}
|
||||
const {
|
||||
startIndex,
|
||||
endIndex
|
||||
} = t1;
|
||||
if (files.length === 0) {
|
||||
let t2;
|
||||
if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
|
||||
t2 = <Text dimColor={true}>No changed files</Text>;
|
||||
$[5] = t2;
|
||||
} else {
|
||||
t2 = $[5];
|
||||
}
|
||||
return t2;
|
||||
}
|
||||
let T0;
|
||||
let hasMoreBelow;
|
||||
let needsPagination;
|
||||
let t2;
|
||||
let t3;
|
||||
let t4;
|
||||
if ($[6] !== columns || $[7] !== endIndex || $[8] !== files || $[9] !== selectedIndex || $[10] !== startIndex) {
|
||||
const visibleFiles = files.slice(startIndex, endIndex);
|
||||
const hasMoreAbove = startIndex > 0;
|
||||
hasMoreBelow = endIndex < files.length;
|
||||
needsPagination = files.length > MAX_VISIBLE_FILES;
|
||||
const maxPathWidth = Math.max(20, columns - 16 - 3 - 4);
|
||||
T0 = Box;
|
||||
t2 = "column";
|
||||
if ($[17] !== hasMoreAbove || $[18] !== needsPagination || $[19] !== startIndex) {
|
||||
t3 = needsPagination && <Text dimColor={true}>{hasMoreAbove ? ` ↑ ${startIndex} more ${plural(startIndex, "file")}` : " "}</Text>;
|
||||
$[17] = hasMoreAbove;
|
||||
$[18] = needsPagination;
|
||||
$[19] = startIndex;
|
||||
$[20] = t3;
|
||||
} else {
|
||||
t3 = $[20];
|
||||
}
|
||||
let t5;
|
||||
if ($[21] !== maxPathWidth || $[22] !== selectedIndex || $[23] !== startIndex) {
|
||||
t5 = (file, index) => <FileItem key={file.path} file={file} isSelected={startIndex + index === selectedIndex} maxPathWidth={maxPathWidth} />;
|
||||
$[21] = maxPathWidth;
|
||||
$[22] = selectedIndex;
|
||||
$[23] = startIndex;
|
||||
$[24] = t5;
|
||||
} else {
|
||||
t5 = $[24];
|
||||
}
|
||||
t4 = visibleFiles.map(t5);
|
||||
$[6] = columns;
|
||||
$[7] = endIndex;
|
||||
$[8] = files;
|
||||
$[9] = selectedIndex;
|
||||
$[10] = startIndex;
|
||||
$[11] = T0;
|
||||
$[12] = hasMoreBelow;
|
||||
$[13] = needsPagination;
|
||||
$[14] = t2;
|
||||
$[15] = t3;
|
||||
$[16] = t4;
|
||||
} else {
|
||||
T0 = $[11];
|
||||
hasMoreBelow = $[12];
|
||||
needsPagination = $[13];
|
||||
t2 = $[14];
|
||||
t3 = $[15];
|
||||
t4 = $[16];
|
||||
}
|
||||
let t5;
|
||||
if ($[25] !== endIndex || $[26] !== files.length || $[27] !== hasMoreBelow || $[28] !== needsPagination) {
|
||||
t5 = needsPagination && <Text dimColor={true}>{hasMoreBelow ? ` ↓ ${files.length - endIndex} more ${plural(files.length - endIndex, "file")}` : " "}</Text>;
|
||||
$[25] = endIndex;
|
||||
$[26] = files.length;
|
||||
$[27] = hasMoreBelow;
|
||||
$[28] = needsPagination;
|
||||
$[29] = t5;
|
||||
} else {
|
||||
t5 = $[29];
|
||||
}
|
||||
let t6;
|
||||
if ($[30] !== T0 || $[31] !== t2 || $[32] !== t3 || $[33] !== t4 || $[34] !== t5) {
|
||||
t6 = <T0 flexDirection={t2}>{t3}{t4}{t5}</T0>;
|
||||
$[30] = T0;
|
||||
$[31] = t2;
|
||||
$[32] = t3;
|
||||
$[33] = t4;
|
||||
$[34] = t5;
|
||||
$[35] = t6;
|
||||
} else {
|
||||
t6 = $[35];
|
||||
}
|
||||
return t6;
|
||||
}
|
||||
function FileItem(t0) {
|
||||
const $ = _c(14);
|
||||
const {
|
||||
file,
|
||||
isSelected,
|
||||
maxPathWidth
|
||||
} = t0;
|
||||
let t1;
|
||||
if ($[0] !== file.path || $[1] !== maxPathWidth) {
|
||||
t1 = truncateStartToWidth(file.path, maxPathWidth);
|
||||
$[0] = file.path;
|
||||
$[1] = maxPathWidth;
|
||||
$[2] = t1;
|
||||
} else {
|
||||
t1 = $[2];
|
||||
}
|
||||
const displayPath = t1;
|
||||
const pointer = isSelected ? figures.pointer + " " : " ";
|
||||
const line = `${pointer}${displayPath}`;
|
||||
const t2 = isSelected ? "background" : undefined;
|
||||
let t3;
|
||||
if ($[3] !== isSelected || $[4] !== line || $[5] !== t2) {
|
||||
t3 = <Text bold={isSelected} color={t2} inverse={isSelected}>{line}</Text>;
|
||||
$[3] = isSelected;
|
||||
$[4] = line;
|
||||
$[5] = t2;
|
||||
$[6] = t3;
|
||||
} else {
|
||||
t3 = $[6];
|
||||
}
|
||||
let t4;
|
||||
if ($[7] === Symbol.for("react.memo_cache_sentinel")) {
|
||||
t4 = <Box flexGrow={1} />;
|
||||
$[7] = t4;
|
||||
} else {
|
||||
t4 = $[7];
|
||||
}
|
||||
let t5;
|
||||
if ($[8] !== file || $[9] !== isSelected) {
|
||||
t5 = <FileStats file={file} isSelected={isSelected} />;
|
||||
$[8] = file;
|
||||
$[9] = isSelected;
|
||||
$[10] = t5;
|
||||
} else {
|
||||
t5 = $[10];
|
||||
}
|
||||
let t6;
|
||||
if ($[11] !== t3 || $[12] !== t5) {
|
||||
t6 = <Box flexDirection="row">{t3}{t4}{t5}</Box>;
|
||||
$[11] = t3;
|
||||
$[12] = t5;
|
||||
$[13] = t6;
|
||||
} else {
|
||||
t6 = $[13];
|
||||
}
|
||||
return t6;
|
||||
}
|
||||
function FileStats(t0) {
|
||||
const $ = _c(20);
|
||||
const {
|
||||
file,
|
||||
isSelected
|
||||
} = t0;
|
||||
if (file.isUntracked) {
|
||||
const t1 = !isSelected;
|
||||
let t2;
|
||||
if ($[0] !== t1) {
|
||||
t2 = <Text dimColor={t1} italic={true}>untracked</Text>;
|
||||
$[0] = t1;
|
||||
$[1] = t2;
|
||||
} else {
|
||||
t2 = $[1];
|
||||
}
|
||||
return t2;
|
||||
}
|
||||
if (file.isBinary) {
|
||||
const t1 = !isSelected;
|
||||
let t2;
|
||||
if ($[2] !== t1) {
|
||||
t2 = <Text dimColor={t1} italic={true}>Binary file</Text>;
|
||||
$[2] = t1;
|
||||
$[3] = t2;
|
||||
} else {
|
||||
t2 = $[3];
|
||||
}
|
||||
return t2;
|
||||
}
|
||||
if (file.isLargeFile) {
|
||||
const t1 = !isSelected;
|
||||
let t2;
|
||||
if ($[4] !== t1) {
|
||||
t2 = <Text dimColor={t1} italic={true}>Large file modified</Text>;
|
||||
$[4] = t1;
|
||||
$[5] = t2;
|
||||
} else {
|
||||
t2 = $[5];
|
||||
}
|
||||
return t2;
|
||||
}
|
||||
let t1;
|
||||
if ($[6] !== file.linesAdded || $[7] !== isSelected) {
|
||||
t1 = file.linesAdded > 0 && <Text color="diffAddedWord" bold={isSelected}>+{file.linesAdded}</Text>;
|
||||
$[6] = file.linesAdded;
|
||||
$[7] = isSelected;
|
||||
$[8] = t1;
|
||||
} else {
|
||||
t1 = $[8];
|
||||
}
|
||||
const t2 = file.linesAdded > 0 && file.linesRemoved > 0 && " ";
|
||||
let t3;
|
||||
if ($[9] !== file.linesRemoved || $[10] !== isSelected) {
|
||||
t3 = file.linesRemoved > 0 && <Text color="diffRemovedWord" bold={isSelected}>-{file.linesRemoved}</Text>;
|
||||
$[9] = file.linesRemoved;
|
||||
$[10] = isSelected;
|
||||
$[11] = t3;
|
||||
} else {
|
||||
t3 = $[11];
|
||||
}
|
||||
let t4;
|
||||
if ($[12] !== file.isTruncated || $[13] !== isSelected) {
|
||||
t4 = file.isTruncated && <Text dimColor={!isSelected}> (truncated)</Text>;
|
||||
$[12] = file.isTruncated;
|
||||
$[13] = isSelected;
|
||||
$[14] = t4;
|
||||
} else {
|
||||
t4 = $[14];
|
||||
}
|
||||
let t5;
|
||||
if ($[15] !== t1 || $[16] !== t2 || $[17] !== t3 || $[18] !== t4) {
|
||||
t5 = <Text>{t1}{t2}{t3}{t4}</Text>;
|
||||
$[15] = t1;
|
||||
$[16] = t2;
|
||||
$[17] = t3;
|
||||
$[18] = t4;
|
||||
$[19] = t5;
|
||||
} else {
|
||||
t5 = $[19];
|
||||
}
|
||||
return t5;
|
||||
}
|
||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmaWd1cmVzIiwiUmVhY3QiLCJ1c2VNZW1vIiwiRGlmZkZpbGUiLCJ1c2VUZXJtaW5hbFNpemUiLCJCb3giLCJUZXh0IiwidHJ1bmNhdGVTdGFydFRvV2lkdGgiLCJwbHVyYWwiLCJNQVhfVklTSUJMRV9GSUxFUyIsIlByb3BzIiwiZmlsZXMiLCJzZWxlY3RlZEluZGV4IiwiRGlmZkZpbGVMaXN0IiwidDAiLCIkIiwiX2MiLCJjb2x1bW5zIiwidDEiLCJiYjAiLCJsZW5ndGgiLCJ0MiIsInN0YXJ0SW5kZXgiLCJlbmRJbmRleCIsInN0YXJ0IiwiTWF0aCIsIm1heCIsImZsb29yIiwiZW5kIiwiU3ltYm9sIiwiZm9yIiwiVDAiLCJoYXNNb3JlQmVsb3ciLCJuZWVkc1BhZ2luYXRpb24iLCJ0MyIsInQ0IiwidmlzaWJsZUZpbGVzIiwic2xpY2UiLCJoYXNNb3JlQWJvdmUiLCJtYXhQYXRoV2lkdGgiLCJ0NSIsImZpbGUiLCJpbmRleCIsInBhdGgiLCJtYXAiLCJ0NiIsIkZpbGVJdGVtIiwiaXNTZWxlY3RlZCIsImRpc3BsYXlQYXRoIiwicG9pbnRlciIsImxpbmUiLCJ1bmRlZmluZWQiLCJGaWxlU3RhdHMiLCJpc1VudHJhY2tlZCIsImlzQmluYXJ5IiwiaXNMYXJnZUZpbGUiLCJsaW5lc0FkZGVkIiwibGluZXNSZW1vdmVkIiwiaXNUcnVuY2F0ZWQiXSwic291cmNlcyI6WyJEaWZmRmlsZUxpc3QudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmaWd1cmVzIGZyb20gJ2ZpZ3VyZXMnXG5pbXBvcnQgUmVhY3QsIHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHR5cGUgeyBEaWZmRmlsZSB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZURpZmZEYXRhLmpzJ1xuaW1wb3J0IHsgdXNlVGVybWluYWxTaXplIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlVGVybWluYWxTaXplLmpzJ1xuaW1wb3J0IHsgQm94LCBUZXh0IH0gZnJvbSAnLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHsgdHJ1bmNhdGVTdGFydFRvV2lkdGggfSBmcm9tICcuLi8uLi91dGlscy9mb3JtYXQuanMnXG5pbXBvcnQgeyBwbHVyYWwgfSBmcm9tICcuLi8uLi91dGlscy9zdHJpbmdVdGlscy5qcydcblxuY29uc3QgTUFYX1ZJU0lCTEVfRklMRVMgPSA1XG5cbnR5cGUgUHJvcHMgPSB7XG4gIGZpbGVzOiBEaWZmRmlsZVtdXG4gIHNlbGVjdGVkSW5kZXg6IG51bWJlclxufVxuXG5leHBvcnQgZnVuY3Rpb24gRGlmZkZpbGVMaXN0KHsgZmlsZXMsIHNlbGVjdGVkSW5kZXggfTogUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCB7IGNvbHVtbnMgfSA9IHVzZVRlcm1pbmFsU2l6ZSgpXG5cbiAgLy8gQ2FsY3VsYXRlIHNjcm9sbCB3aW5kb3cgLSBtdXN0IGJlIGJlZm9yZSBlYXJseSByZXR1cm4gZm9yIGhvb2tzIHJ1bGVzXG4gIGNvbnN0IHsgc3RhcnRJbmRleCwgZW5kSW5kZXggfSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDAgfHwgZmlsZXMubGVuZ3RoIDw9IE1BWF9WSVNJQkxFX0ZJTEVTKSB7XG4gICAgICByZXR1cm4geyBzdGFydEluZGV4OiAwLCBlbmRJbmRleDogZmlsZXMubGVuZ3RoIH1cbiAgICB9XG5cbiAgICAvLyBLZWVwIHNlbGVjdGVkIGl0ZW0gcm91Z2hseSBpbiB0aGUgbWlkZGxlXG4gICAgbGV0IHN0YXJ0ID0gTWF0aC5tYXgoMCwgc2VsZWN0ZWRJbmRleCAtIE1hdGguZmxvb3IoTUFYX1ZJU0lCTEVfRklMRVMgLyAyKSlcbiAgICBsZXQgZW5kID0gc3RhcnQgKyBNQVhfVklTSUJMRV9GSUxFU1xuXG4gICAgLy8gQWRqdXN0IGlmIHdlJ3JlIGF0IHRoZSBlbmRcbiAgICBpZiAoZW5kID4gZmlsZXMubGVuZ3RoKSB7XG4gICAgICBlbmQgPSBmaWxlcy5sZW5ndGhcbiAgICAgIHN0YXJ0ID0gTWF0aC5tYXgoMCwgZW5kIC0gTUFYX1ZJU0lCTEVfRklMRVMpXG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3RhcnRJbmRleDogc3RhcnQsIGVuZEluZGV4OiBlbmQgfVxuICB9LCBbZmlsZXMubGVuZ3RoLCBzZWxlY3RlZEluZGV4XSlcblxuICBpZiAoZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIDxUZXh0IGRpbUNvbG9yPk5vIGNoYW5nZWQgZmlsZXM8L1RleHQ+XG4gIH1cblxuICBjb25zdCB2aXNpYmxlRmlsZXMgPSBmaWxlcy5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleClcbiAgY29uc3QgaGFzTW9yZUFib3ZlID0gc3RhcnRJbmRleCA+IDBcbiAgY29uc3QgaGFzTW9yZUJlbG93ID0gZW5kSW5kZXggPCBmaWxlcy5sZW5ndGhcbiAgY29uc3QgbmVlZHNQYWdpbmF0aW9uID0gZmlsZXMubGVuZ3RoID4gTUFYX1ZJU0lCTEVfRklMRVNcblxuICBjb25zdCBzdGF0c1dpZHRoID0gMTZcbiAgY29uc3QgcG9pbnRlcldpZHRoID0gM1xuICBjb25zdCBtYXhQYXRoV2lkdGggPSBNYXRoLm1heCgyMCwgY29sdW1ucyAtIHN0YXRzV2lkdGggLSBwb2ludGVyV2lkdGggLSA0KVxuXG4gIHJldHVybiAoXG4gICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+XG4gICAgICB7bmVlZHNQYWdpbmF0aW9uICYmIChcbiAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAge2hhc01vcmVBYm92ZVxuICAgICAgICAgICAgPyBgIOKGkSAke3N0YXJ0SW5kZXh9IG1vcmUgJHtwbHVyYWwoc3RhcnRJbmRleCwgJ2ZpbGUnKX1gXG4gICAgICAgICAgICA6ICcgJ31cbiAgICAgICAgPC9UZXh0PlxuICAgICAgKX1cbiAgICAgIHt2aXNpYmxlRmlsZXMubWFwKChmaWxlLCBpbmRleCkgPT4gKFxuICAgICAgICA8RmlsZUl0ZW1cbiAgICAgICAgICBrZXk9e2ZpbGUucGF0aH1cbiAgICAgICAgICBmaWxlPXtmaWxlfVxuICAgICAgICAgIGlzU2VsZWN0ZWQ9e3N0YXJ0SW5kZXggKyBpbmRleCA9PT0gc2VsZWN0ZWRJbmRleH1cbiAgICAgICAgICBtYXhQYXRoV2lkdGg9e21heFBhdGhXaWR0aH1cbiAgICAgICAgLz5cbiAgICAgICkpfVxuICAgICAge25lZWRzUGFnaW5hdGlvbiAmJiAoXG4gICAgICAgIDxUZXh0IGRpbUNvbG9yPlxuICAgICAgICAgIHtoYXNNb3JlQmVsb3dcbiAgICAgICAgICAgID8gYCDihpMgJHtmaWxlcy5sZW5ndGggLSBlbmRJbmRleH0gbW9yZSAke3BsdXJhbChmaWxlcy5sZW5ndGggLSBlbmRJbmRleCwgJ2ZpbGUnKX1gXG4gICAgICAgICAgICA6ICcgJ31cbiAgICAgICAgPC9UZXh0PlxuICAgICAgKX1cbiAgICA8L0JveD5cbiAgKVxufVxuXG5mdW5jdGlvbiBGaWxlSXRlbSh7XG4gIGZpbGUsXG4gIGlzU2VsZWN0ZWQsXG4gIG1heFBhdGhXaWR0aCxcbn06IHtcbiAgZmlsZTogRGlmZkZpbGVcbiAgaXNTZWxlY3RlZDogYm9vbGVhblxuICBtYXhQYXRoV2lkdGg6IG51bWJlclxufSk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IGRpc3BsYXlQYXRoID0gdHJ1bmNhdGVTdGFydFRvV2lkdGgoZmlsZS5wYXRoLCBtYXhQYXRoV2lkdGgpXG5cbiAgY29uc3QgcG9pbnRlciA9IGlzU2VsZWN0ZWQgPyBmaWd1cmVzLnBvaW50ZXIgKyAnICcgOiAnICAnXG4gIGNvbnN0IGxpbmUgPSBgJHtwb2ludGVyfSR7ZGlzcGxheVBhdGh9YFxuXG4gIHJldHVybiAoXG4gICAgPEJveCBmbGV4RGlyZWN0aW9uPVwicm93XCI+XG4gICAgICA8VGV4dFxuICAgICAgICBib2xkPXtpc1NlbGVjdGVkfVxuICAgICAgICBjb2xvcj17aXNTZWxlY3RlZCA/ICdiYWNrZ3JvdW5kJyA6IHVuZGVmaW5lZH1cbiAgICAgICAgaW52ZXJzZT17aXNTZWxlY3RlZH1cbiAgICAgID5cbiAgICAgICAge2xpbmV9XG4gICAgICA8L1RleHQ+XG4gICAgICA8Qm94IGZsZXhHcm93PXsxfSAvPlxuICAgICAgPEZpbGVTdGF0cyBmaWxlPXtmaWxlfSBpc1NlbGVjdGVkPXtpc1NlbGVjdGVkfSAvPlxuICAgIDw
Line truncated
|
||||
Reference in new issue
Block a user