/ components / diff / DiffDetailView.tsx
DiffDetailView.tsx
  1  import { c as _c } from "react/compiler-runtime";
  2  import type { StructuredPatchHunk } from 'diff';
  3  import { resolve } from 'path';
  4  import React, { useMemo } from 'react';
  5  import { useTerminalSize } from '../../hooks/useTerminalSize.js';
  6  import { Box, Text } from '../../ink.js';
  7  import { getCwd } from '../../utils/cwd.js';
  8  import { readFileSafe } from '../../utils/file.js';
  9  import { Divider } from '../design-system/Divider.js';
 10  import { StructuredDiff } from '../StructuredDiff.js';
 11  type Props = {
 12    filePath: string;
 13    hunks: StructuredPatchHunk[];
 14    isLargeFile?: boolean;
 15    isBinary?: boolean;
 16    isTruncated?: boolean;
 17    isUntracked?: boolean;
 18  };
 19  
 20  /**
 21   * Displays the diff content for a single file.
 22   * Uses StructuredDiff for word-level diffing and syntax highlighting.
 23   * No scrolling - renders all lines (max 400 due to parsing limits).
 24   */
 25  export function DiffDetailView(t0) {
 26    const $ = _c(53);
 27    const {
 28      filePath,
 29      hunks,
 30      isLargeFile,
 31      isBinary,
 32      isTruncated,
 33      isUntracked
 34    } = t0;
 35    const {
 36      columns
 37    } = useTerminalSize();
 38    let t1;
 39    bb0: {
 40      if (!filePath) {
 41        let t2;
 42        if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
 43          t2 = {
 44            firstLine: null,
 45            fileContent: undefined
 46          };
 47          $[0] = t2;
 48        } else {
 49          t2 = $[0];
 50        }
 51        t1 = t2;
 52        break bb0;
 53      }
 54      let content;
 55      let t2;
 56      if ($[1] !== filePath) {
 57        const fullPath = resolve(getCwd(), filePath);
 58        content = readFileSafe(fullPath);
 59        t2 = content?.split("\n")[0] ?? null;
 60        $[1] = filePath;
 61        $[2] = content;
 62        $[3] = t2;
 63      } else {
 64        content = $[2];
 65        t2 = $[3];
 66      }
 67      const t3 = content ?? undefined;
 68      let t4;
 69      if ($[4] !== t2 || $[5] !== t3) {
 70        t4 = {
 71          firstLine: t2,
 72          fileContent: t3
 73        };
 74        $[4] = t2;
 75        $[5] = t3;
 76        $[6] = t4;
 77      } else {
 78        t4 = $[6];
 79      }
 80      t1 = t4;
 81    }
 82    const {
 83      firstLine,
 84      fileContent
 85    } = t1;
 86    if (isUntracked) {
 87      let t2;
 88      if ($[7] !== filePath) {
 89        t2 = <Text bold={true}>{filePath}</Text>;
 90        $[7] = filePath;
 91        $[8] = t2;
 92      } else {
 93        t2 = $[8];
 94      }
 95      let t3;
 96      if ($[9] === Symbol.for("react.memo_cache_sentinel")) {
 97        t3 = <Text dimColor={true}> (untracked)</Text>;
 98        $[9] = t3;
 99      } else {
100        t3 = $[9];
101      }
102      let t4;
103      if ($[10] !== t2) {
104        t4 = <Box>{t2}{t3}</Box>;
105        $[10] = t2;
106        $[11] = t4;
107      } else {
108        t4 = $[11];
109      }
110      let t5;
111      if ($[12] === Symbol.for("react.memo_cache_sentinel")) {
112        t5 = <Divider padding={4} />;
113        $[12] = t5;
114      } else {
115        t5 = $[12];
116      }
117      let t6;
118      if ($[13] === Symbol.for("react.memo_cache_sentinel")) {
119        t6 = <Text dimColor={true} italic={true}>New file not yet staged.</Text>;
120        $[13] = t6;
121      } else {
122        t6 = $[13];
123      }
124      let t7;
125      if ($[14] !== filePath) {
126        t7 = <Box flexDirection="column">{t6}<Text dimColor={true} italic={true}>Run `git add {filePath}` to see line counts.</Text></Box>;
127        $[14] = filePath;
128        $[15] = t7;
129      } else {
130        t7 = $[15];
131      }
132      let t8;
133      if ($[16] !== t4 || $[17] !== t7) {
134        t8 = <Box flexDirection="column" width="100%">{t4}{t5}{t7}</Box>;
135        $[16] = t4;
136        $[17] = t7;
137        $[18] = t8;
138      } else {
139        t8 = $[18];
140      }
141      return t8;
142    }
143    if (isBinary) {
144      let t2;
145      if ($[19] !== filePath) {
146        t2 = <Box><Text bold={true}>{filePath}</Text></Box>;
147        $[19] = filePath;
148        $[20] = t2;
149      } else {
150        t2 = $[20];
151      }
152      let t3;
153      if ($[21] === Symbol.for("react.memo_cache_sentinel")) {
154        t3 = <Divider padding={4} />;
155        $[21] = t3;
156      } else {
157        t3 = $[21];
158      }
159      let t4;
160      if ($[22] === Symbol.for("react.memo_cache_sentinel")) {
161        t4 = <Box flexDirection="column"><Text dimColor={true} italic={true}>Binary file - cannot display diff</Text></Box>;
162        $[22] = t4;
163      } else {
164        t4 = $[22];
165      }
166      let t5;
167      if ($[23] !== t2) {
168        t5 = <Box flexDirection="column" width="100%">{t2}{t3}{t4}</Box>;
169        $[23] = t2;
170        $[24] = t5;
171      } else {
172        t5 = $[24];
173      }
174      return t5;
175    }
176    if (isLargeFile) {
177      let t2;
178      if ($[25] !== filePath) {
179        t2 = <Box><Text bold={true}>{filePath}</Text></Box>;
180        $[25] = filePath;
181        $[26] = t2;
182      } else {
183        t2 = $[26];
184      }
185      let t3;
186      if ($[27] === Symbol.for("react.memo_cache_sentinel")) {
187        t3 = <Divider padding={4} />;
188        $[27] = t3;
189      } else {
190        t3 = $[27];
191      }
192      let t4;
193      if ($[28] === Symbol.for("react.memo_cache_sentinel")) {
194        t4 = <Box flexDirection="column"><Text dimColor={true} italic={true}>Large file - diff exceeds 1 MB limit</Text></Box>;
195        $[28] = t4;
196      } else {
197        t4 = $[28];
198      }
199      let t5;
200      if ($[29] !== t2) {
201        t5 = <Box flexDirection="column" width="100%">{t2}{t3}{t4}</Box>;
202        $[29] = t2;
203        $[30] = t5;
204      } else {
205        t5 = $[30];
206      }
207      return t5;
208    }
209    let t2;
210    if ($[31] !== filePath) {
211      t2 = <Text bold={true}>{filePath}</Text>;
212      $[31] = filePath;
213      $[32] = t2;
214    } else {
215      t2 = $[32];
216    }
217    let t3;
218    if ($[33] !== isTruncated) {
219      t3 = isTruncated && <Text dimColor={true}> (truncated)</Text>;
220      $[33] = isTruncated;
221      $[34] = t3;
222    } else {
223      t3 = $[34];
224    }
225    let t4;
226    if ($[35] !== t2 || $[36] !== t3) {
227      t4 = <Box>{t2}{t3}</Box>;
228      $[35] = t2;
229      $[36] = t3;
230      $[37] = t4;
231    } else {
232      t4 = $[37];
233    }
234    let t5;
235    if ($[38] === Symbol.for("react.memo_cache_sentinel")) {
236      t5 = <Divider padding={4} />;
237      $[38] = t5;
238    } else {
239      t5 = $[38];
240    }
241    let t6;
242    if ($[39] !== columns || $[40] !== fileContent || $[41] !== filePath || $[42] !== firstLine || $[43] !== hunks) {
243      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} />);
244      $[39] = columns;
245      $[40] = fileContent;
246      $[41] = filePath;
247      $[42] = firstLine;
248      $[43] = hunks;
249      $[44] = t6;
250    } else {
251      t6 = $[44];
252    }
253    let t7;
254    if ($[45] !== t6) {
255      t7 = <Box flexDirection="column">{t6}</Box>;
256      $[45] = t6;
257      $[46] = t7;
258    } else {
259      t7 = $[46];
260    }
261    let t8;
262    if ($[47] !== isTruncated) {
263      t8 = isTruncated && <Text dimColor={true} italic={true}>… diff truncated (exceeded 400 line limit)</Text>;
264      $[47] = isTruncated;
265      $[48] = t8;
266    } else {
267      t8 = $[48];
268    }
269    let t9;
270    if ($[49] !== t4 || $[50] !== t7 || $[51] !== t8) {
271      t9 = <Box flexDirection="column" width="100%">{t4}{t5}{t7}{t8}</Box>;
272      $[49] = t4;
273      $[50] = t7;
274      $[51] = t8;
275      $[52] = t9;
276    } else {
277      t9 = $[52];
278    }
279    return t9;
280  }
281  //# 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+e2ZpbGVQYXRofTwvVGV4dD5cbiAgICAgICAge2lzVHJ1bmNhdGVkICYmIDxUZXh0IGRpbUNvbG9yPiAodHJ1bmNhdGVkKTwvVGV4dD59XG4gICAgICA8L0JveD5cblxuICAgICAgPERpdmlkZXIgcGFkZGluZz17NH0gLz5cbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICB7aHVua3MubGVuZ3RoID09PSAwID8gKFxuICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPk5vIGRpZmYgY29udGVudDwvVGV4dD5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICBodW5rcy5tYXAoKGh1bmssIGluZGV4KSA9PiAoXG4gICAgICAgICAgICA8U3RydWN0dXJlZERpZmZcbiAgICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgICAgcGF0Y2g9e2h1bmt9XG4gICAgICAgICAgICAgIGZpbGVQYXRoPXtmaWxlUGF0aH1cbiAgICAgICAgICAgICAgZmlyc3RMaW5lPXtmaXJzdExpbmV9XG4gICAgICAgICAgICAgIGZpbGVDb250ZW50PXtmaWxlQ29udGVudH1cbiAgICAgICAgICAgICAgZGltPXtmYWxzZX1cbiAgICAgICAgICAgICAgd2lkdGg9e2NvbHVtbnMgLSAyICogb3V0ZXJQYWRkaW5nWCAtIDIgKiBvdXRlckJvcmRlcldpZHRofVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApKVxuICAgICAgICApfVxuICAgICAgPC9Cb3g+XG5cbiAgICAgIHtpc1RydW5jYXRlZCAmJiAoXG4gICAgICAgIDxUZXh0IGRpbUNvbG9yIGl0YWxpYz5cbiAgICAgICAgICDigKYgZGlmZiB0cnVuY2F0ZWQgKGV4Y2VlZGVkIDQwMCBsaW5lIGxpbWl0KVxuICAgICAgICA8L1RleHQ+XG4gICAgICApfVxuICAgIDwvQm94PlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxjQUFjQSxtQkFBbUIsUUFBUSxNQUFNO0FBQy9DLFNBQVNDLE9BQU8sUUFBUSxNQUFNO0FBQzlCLE9BQU9DLEtBQUssSUFBSUMsT0FBTyxRQUFRLE9BQU87QUFDdEMsU0FBU0MsZUFBZSxRQUFRLGdDQUFnQztBQUNoRSxTQUFTQyxHQUFHLEVB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