source dump of claude code
at main 118 lines 14 kB view raw
1import { c as _c } from "react/compiler-runtime"; 2import * as React from 'react'; 3import { useMemo } from 'react'; 4import { useTerminalSize } from '../../hooks/useTerminalSize.js'; 5import { Ansi, Text } from '../../ink.js'; 6import { createHyperlink } from '../../utils/hyperlink.js'; 7import { jsonParse, jsonStringify } from '../../utils/slowOperations.js'; 8import { renderTruncatedContent } from '../../utils/terminal.js'; 9import { MessageResponse } from '../MessageResponse.js'; 10import { InVirtualListContext } from '../messageActions.js'; 11import { useExpandShellOutput } from './ExpandShellOutputContext.js'; 12export function tryFormatJson(line: string): string { 13 try { 14 const parsed = jsonParse(line); 15 const stringified = jsonStringify(parsed); 16 17 // Check if precision was lost during JSON round-trip 18 // This happens when large integers exceed Number.MAX_SAFE_INTEGER 19 // We normalize both strings by removing whitespace and unnecessary 20 // escapes (\/ is valid but optional in JSON) for comparison 21 const normalizedOriginal = line.replace(/\\\//g, '/').replace(/\s+/g, ''); 22 const normalizedStringified = stringified.replace(/\s+/g, ''); 23 if (normalizedOriginal !== normalizedStringified) { 24 // Precision loss detected - return original line unformatted 25 return line; 26 } 27 return jsonStringify(parsed, null, 2); 28 } catch { 29 return line; 30 } 31} 32const MAX_JSON_FORMAT_LENGTH = 10_000; 33export function tryJsonFormatContent(content: string): string { 34 if (content.length > MAX_JSON_FORMAT_LENGTH) { 35 return content; 36 } 37 const allLines = content.split('\n'); 38 return allLines.map(tryFormatJson).join('\n'); 39} 40 41// Match http(s) URLs inside JSON string values. Conservative: no quotes, 42// no whitespace, no trailing comma/brace that'd be JSON structure. 43const URL_IN_JSON = /https?:\/\/[^\s"'<>\\]+/g; 44export function linkifyUrlsInText(content: string): string { 45 return content.replace(URL_IN_JSON, url => createHyperlink(url)); 46} 47export function OutputLine(t0) { 48 const $ = _c(11); 49 const { 50 content, 51 verbose, 52 isError, 53 isWarning, 54 linkifyUrls 55 } = t0; 56 const { 57 columns 58 } = useTerminalSize(); 59 const expandShellOutput = useExpandShellOutput(); 60 const inVirtualList = React.useContext(InVirtualListContext); 61 const shouldShowFull = verbose || expandShellOutput; 62 let t1; 63 if ($[0] !== columns || $[1] !== content || $[2] !== inVirtualList || $[3] !== linkifyUrls || $[4] !== shouldShowFull) { 64 bb0: { 65 let formatted = tryJsonFormatContent(content); 66 if (linkifyUrls) { 67 formatted = linkifyUrlsInText(formatted); 68 } 69 if (shouldShowFull) { 70 t1 = stripUnderlineAnsi(formatted); 71 break bb0; 72 } 73 t1 = stripUnderlineAnsi(renderTruncatedContent(formatted, columns, inVirtualList)); 74 } 75 $[0] = columns; 76 $[1] = content; 77 $[2] = inVirtualList; 78 $[3] = linkifyUrls; 79 $[4] = shouldShowFull; 80 $[5] = t1; 81 } else { 82 t1 = $[5]; 83 } 84 const formattedContent = t1; 85 const color = isError ? "error" : isWarning ? "warning" : undefined; 86 let t2; 87 if ($[6] !== formattedContent) { 88 t2 = <Ansi>{formattedContent}</Ansi>; 89 $[6] = formattedContent; 90 $[7] = t2; 91 } else { 92 t2 = $[7]; 93 } 94 let t3; 95 if ($[8] !== color || $[9] !== t2) { 96 t3 = <MessageResponse><Text color={color}>{t2}</Text></MessageResponse>; 97 $[8] = color; 98 $[9] = t2; 99 $[10] = t3; 100 } else { 101 t3 = $[10]; 102 } 103 return t3; 104} 105 106/** 107 * Underline ANSI codes in particular tend to leak out for some reason. I wasn't 108 * able to figure out why, or why emitting a reset ANSI code wasn't enough to 109 * prevent them from leaking. I also didn't want to strip all ANSI codes with 110 * stripAnsi(), because we used to do that and people complained about losing 111 * all formatting. So we just strip the underline ANSI codes specifically. 112 */ 113export function stripUnderlineAnsi(content: string): string { 114 return content.replace( 115 // eslint-disable-next-line no-control-regex 116 /\u001b\[([0-9]+;)*4(;[0-9]+)*m|\u001b\[4(;[0-9]+)*m|\u001b\[([0-9]+;)*4m/g, ''); 117} 118//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZU1lbW8iLCJ1c2VUZXJtaW5hbFNpemUiLCJBbnNpIiwiVGV4dCIsImNyZWF0ZUh5cGVybGluayIsImpzb25QYXJzZSIsImpzb25TdHJpbmdpZnkiLCJyZW5kZXJUcnVuY2F0ZWRDb250ZW50IiwiTWVzc2FnZVJlc3BvbnNlIiwiSW5WaXJ0dWFsTGlzdENvbnRleHQiLCJ1c2VFeHBhbmRTaGVsbE91dHB1dCIsInRyeUZvcm1hdEpzb24iLCJsaW5lIiwicGFyc2VkIiwic3RyaW5naWZpZWQiLCJub3JtYWxpemVkT3JpZ2luYWwiLCJyZXBsYWNlIiwibm9ybWFsaXplZFN0cmluZ2lmaWVkIiwiTUFYX0pTT05fRk9STUFUX0xFTkdUSCIsInRyeUpzb25Gb3JtYXRDb250ZW50IiwiY29udGVudCIsImxlbmd0aCIsImFsbExpbmVzIiwic3BsaXQiLCJtYXAiLCJqb2luIiwiVVJMX0lOX0pTT04iLCJsaW5raWZ5VXJsc0luVGV4dCIsInVybCIsIk91dHB1dExpbmUiLCJ0MCIsIiQiLCJfYyIsInZlcmJvc2UiLCJpc0Vycm9yIiwiaXNXYXJuaW5nIiwibGlua2lmeVVybHMiLCJjb2x1bW5zIiwiZXhwYW5kU2hlbGxPdXRwdXQiLCJpblZpcnR1YWxMaXN0IiwidXNlQ29udGV4dCIsInNob3VsZFNob3dGdWxsIiwidDEiLCJiYjAiLCJmb3JtYXR0ZWQiLCJzdHJpcFVuZGVybGluZUFuc2kiLCJmb3JtYXR0ZWRDb250ZW50IiwiY29sb3IiLCJ1bmRlZmluZWQiLCJ0MiIsInQzIl0sInNvdXJjZXMiOlsiT3V0cHV0TGluZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VUZXJtaW5hbFNpemUgfSBmcm9tICcuLi8uLi9ob29rcy91c2VUZXJtaW5hbFNpemUuanMnXG5pbXBvcnQgeyBBbnNpLCBUZXh0IH0gZnJvbSAnLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHsgY3JlYXRlSHlwZXJsaW5rIH0gZnJvbSAnLi4vLi4vdXRpbHMvaHlwZXJsaW5rLmpzJ1xuaW1wb3J0IHsganNvblBhcnNlLCBqc29uU3RyaW5naWZ5IH0gZnJvbSAnLi4vLi4vdXRpbHMvc2xvd09wZXJhdGlvbnMuanMnXG5pbXBvcnQgeyByZW5kZXJUcnVuY2F0ZWRDb250ZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvdGVybWluYWwuanMnXG5pbXBvcnQgeyBNZXNzYWdlUmVzcG9uc2UgfSBmcm9tICcuLi9NZXNzYWdlUmVzcG9uc2UuanMnXG5pbXBvcnQgeyBJblZpcnR1YWxMaXN0Q29udGV4dCB9IGZyb20gJy4uL21lc3NhZ2VBY3Rpb25zLmpzJ1xuaW1wb3J0IHsgdXNlRXhwYW5kU2hlbGxPdXRwdXQgfSBmcm9tICcuL0V4cGFuZFNoZWxsT3V0cHV0Q29udGV4dC5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIHRyeUZvcm1hdEpzb24obGluZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBqc29uUGFyc2UobGluZSlcbiAgICBjb25zdCBzdHJpbmdpZmllZCA9IGpzb25TdHJpbmdpZnkocGFyc2VkKVxuXG4gICAgLy8gQ2hlY2sgaWYgcHJlY2lzaW9uIHdhcyBsb3N0IGR1cmluZyBKU09OIHJvdW5kLXRyaXBcbiAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiBsYXJnZSBpbnRlZ2VycyBleGNlZWQgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJcbiAgICAvLyBXZSBub3JtYWxpemUgYm90aCBzdHJpbmdzIGJ5IHJlbW92aW5nIHdoaXRlc3BhY2UgYW5kIHVubmVjZXNzYXJ5XG4gICAgLy8gZXNjYXBlcyAoXFwvIGlzIHZhbGlkIGJ1dCBvcHRpb25hbCBpbiBKU09OKSBmb3IgY29tcGFyaXNvblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRPcmlnaW5hbCA9IGxpbmUucmVwbGFjZSgvXFxcXFxcLy9nLCAnLycpLnJlcGxhY2UoL1xccysvZywgJycpXG4gICAgY29uc3Qgbm9ybWFsaXplZFN0cmluZ2lmaWVkID0gc3RyaW5naWZpZWQucmVwbGFjZSgvXFxzKy9nLCAnJylcblxuICAgIGlmIChub3JtYWxpemVkT3JpZ2luYWwgIT09IG5vcm1hbGl6ZWRTdHJpbmdpZmllZCkge1xuICAgICAgLy8gUHJlY2lzaW9uIGxvc3MgZGV0ZWN0ZWQgLSByZXR1cm4gb3JpZ2luYWwgbGluZSB1bmZvcm1hdHRlZFxuICAgICAgcmV0dXJuIGxpbmVcbiAgICB9XG5cbiAgICByZXR1cm4ganNvblN0cmluZ2lmeShwYXJzZWQsIG51bGwsIDIpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBsaW5lXG4gIH1cbn1cblxuY29uc3QgTUFYX0pTT05fRk9STUFUX0xFTkdUSCA9IDEwXzAwMFxuXG5leHBvcnQgZnVuY3Rpb24gdHJ5SnNvbkZvcm1hdENvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGNvbnRlbnQubGVuZ3RoID4gTUFYX0pTT05fRk9STUFUX0xFTkdUSCkge1xuICAgIHJldHVybiBjb250ZW50XG4gIH1cbiAgY29uc3QgYWxsTGluZXMgPSBjb250ZW50LnNwbGl0KCdcXG4nKVxuICByZXR1cm4gYWxsTGluZXMubWFwKHRyeUZvcm1hdEpzb24pLmpvaW4oJ1xcbicpXG59XG5cbi8vIE1hdGNoIGh0dHAocykgVVJMcyBpbnNpZGUgSlNPTiBzdHJpbmcgdmFsdWVzLiBDb25zZXJ2YXRpdmU6IG5vIHF1b3Rlcyxcbi8vIG5vIHdoaXRlc3BhY2UsIG5vIHRyYWlsaW5nIGNvbW1hL2JyYWNlIHRoYXQnZCBiZSBKU09OIHN0cnVjdHVyZS5cbmNvbnN0IFVSTF9JTl9KU09OID0gL2h0dHBzPzpcXC9cXC9bXlxcc1wiJzw+XFxcXF0rL2dcblxuZXhwb3J0IGZ1bmN0aW9uIGxpbmtpZnlVcmxzSW5UZXh0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50LnJlcGxhY2UoVVJMX0lOX0pTT04sIHVybCA9PiBjcmVhdGVIeXBlcmxpbmsodXJsKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE91dHB1dExpbmUoe1xuICBjb250ZW50LFxuICB2ZXJib3NlLFxuICBpc0Vycm9yLFxuICBpc1dhcm5pbmcsXG4gIGxpbmtpZnlVcmxzLFxufToge1xuICBjb250ZW50OiBzdHJpbmdcbiAgdmVyYm9zZTogYm9vbGVhblxuICBpc0Vycm9yPzogYm9vbGVhblxuICBpc1dhcm5pbmc/OiBib29sZWFuXG4gIGxpbmtpZnlVcmxzPzogYm9vbGVhblxufSk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IHsgY29sdW1ucyB9ID0gdXNlVGVybWluYWxTaXplKClcbiAgLy8gQ29udGV4dC1iYXNlZCBleHBhbnNpb24gZm9yIGxhdGVzdCB1c2VyIHNoZWxsIG91dHB1dCAoZnJvbSAhIGNvbW1hbmRzKVxuICBjb25zdCBleHBhbmRTaGVsbE91dHB1dCA9IHVzZUV4cGFuZFNoZWxsT3V0cHV0KClcbiAgY29uc3QgaW5WaXJ0dWFsTGlzdCA9IFJlYWN0LnVzZUNvbnRleHQoSW5WaXJ0dWFsTGlzdENvbnRleHQpXG5cbiAgLy8gU2hvdyBmdWxsIG91dHB1dCBpZiB2ZXJib3NlIG1vZGUgT1IgaWYgdGhpcyBpcyB0aGUgbGF0ZXN0IHVzZXIgc2hlbGwgb3V0cHV0XG4gIGNvbnN0IHNob3VsZFNob3dGdWxsID0gdmVyYm9zZSB8fCBleHBhbmRTaGVsbE91dHB1dFxuXG4gIGNvbnN0IGZvcm1hdHRlZENvbnRlbnQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBsZXQgZm9ybWF0dGVkID0gdHJ5SnNvbkZvcm1hdENvbnRlbnQoY29udGVudClcbiAgICBpZiAobGlua2lmeVVybHMpIHtcbiAgICAgIGZvcm1hdHRlZCA9IGxpbmtpZnlVcmxzSW5UZXh0KGZvcm1hdHRlZClcbiAgICB9XG4gICAgaWYgKHNob3VsZFNob3dGdWxsKSB7XG4gICAgICByZXR1cm4gc3RyaXBVbmRlcmxpbmVBbnNpKGZvcm1hdHRlZClcbiAgICB9XG4gICAgcmV0dXJuIHN0cmlwVW5kZXJsaW5lQW5zaShcbiAgICAgIHJlbmRlclRydW5jYXRlZENvbnRlbnQoZm9ybWF0dGVkLCBjb2x1bW5zLCBpblZpcnR1YWxMaXN0KSxcbiAgICApXG4gIH0sIFtjb250ZW50LCBzaG91bGRTaG93RnVsbCwgY29sdW1ucywgbGlua2lmeVVybHMsIGluVmlydHVhbExpc3RdKVxuXG4gIGNvbnN0IGNvbG9yID0gaXNFcnJvciA/ICdlcnJvcicgOiBpc1dhcm5pbmcgPyAnd2FybmluZycgOiB1bmRlZmluZWRcblxuICByZXR1cm4gKFxuICAgIDxNZXNzYWdlUmVzcG9uc2U+XG4gICAgICA8VGV4dCBjb2xvcj17Y29sb3J9PlxuICAgICAgICA8QW5zaT57Zm9ybWF0dGVkQ29udGVudH08L0Fuc2k+XG4gICAgICA8L1RleHQ+XG4gICAgPC9NZXNzYWdlUmVzcG9uc2U+XG4gIClcbn1cblxuLyoqXG4gKiBVbmRlcmxpbmUgQU5TSSBjb2RlcyBpbiBwYXJ0aWN1bGFyIHRlbmQgdG8gbGVhayBvdXQgZm9yIHNvbWUgcmVhc29uLiBJIHdhc24ndFxuICogYWJsZSB0byBmaWd1cmUgb3V0IHdoeSwgb3Igd2h5IGVtaXR0aW5nIGEgcmVzZXQgQU5TSSBjb2RlIHdhc24ndCBlbm91Z2ggdG9cbiAqIHByZXZlbnQgdGhlbSBmcm9tIGxlYWtpbmcuIEkgYWxzbyBkaWRuJ3Qgd2FudCB0byBzdHJpcCBhbGwgQU5TSSBjb2RlcyB3aXRoXG4gKiBzdHJpcEFuc2koKSwgYmVjYXVzZSB3ZSB1c2VkIHRvIGRvIHRoYXQgYW5kIHBlb3BsZSBjb21wbGFpbmVkIGFib3V0IGxvc2luZ1xuICogYWxsIGZvcm1hdHRpbmcuIFNvIHdlIGp1c3Qgc3RyaXAgdGhlIHVuZGVybGluZSBBTlNJIGNvZGVzIHNwZWNpZmljYWxseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwVW5kZXJsaW5lQW5zaShjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudC5yZXBsYWNlKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG4gICAgL1xcdTAwMWJcXFsoWzAtOV0rOykqNCg7WzAtOV0rKSptfFxcdTAwMWJcXFs0KDtbMC05XSspKm18XFx1MDAxYlxcWyhbMC05XSs7KSo0bS9nLFxuICAgICcnLFxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEtBQUtBLEtBQUssTUFBTSxPQUFPO0FBQzlCLFNBQVNDLE9BQU8sUUFBUSxPQUFPO0FBQy9CLFNBQVNDLGVBQWUsUUFBUSxnQ0FBZ0M7QUFDaEUsU0FBU0MsSUFBSSxFQUFFQyxJQUFJLFFBQVEsY0FBYztBQUN6QyxTQUFTQyxlQUFlLFFBQVEsMEJBQTBCO0FBQzFELFNBQVNDLFNBQVMsRUFBRUMsYUFBYSxRQUFRLCtCQUErQjtBQUN4RSxTQUFTQyxzQkFBc0IsUUFBUSx5QkFBeUI7QUFDaEUsU0FBU0MsZUFBZSxRQUFRLHVCQUF1QjtBQUN2RCxTQUFTQyxvQkFBb0IsUUFBUSxzQkFBc0I7QUFDM0QsU0FBU0Msb0JBQW9CLFFBQVEsK0JBQStCO0FBRXBFLE9BQU8sU0FBU0MsYUFBYUEsQ0FBQ0MsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQztFQUNsRCxJQUFJO0lBQ0YsTUFBTUMsTUFBTSxHQUFHUixTQUFTLENBQUNPLElBQUksQ0FBQztJQUM5QixNQUFNRSxXQUFXLEdBQUdSLGFBQWEsQ0FBQ08sTUFBTSxDQUFDOztJQUV6QztJQUNBO0lBQ0E7SUFDQTtJQUNBLE1BQU1FLGtCQUFrQixHQUFHSCxJQUFJLENBQUNJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUNBLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO0lBQ3pFLE1BQU1DLHFCQUFxQixHQUFHSCxXQUFXLENBQUNFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO0lBRTdELElBQUlELGtCQUFrQixLQUFLRSxxQkFBcUIsRUFBRTtNQUNoRDtNQUNBLE9BQU9MLElBQUk7SUFDYjtJQUVBLE9BQU9OLGFBQWEs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