├── index.js └── index.js.map /index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.codeFrameColumns = codeFrameColumns; 7 | exports.default = _default; 8 | var _highlight = require("@babel/highlight"); 9 | let deprecationWarningShown = false; 10 | function getDefs(chalk) { 11 | return { 12 | gutter: chalk.grey, 13 | marker: chalk.red.bold, 14 | message: chalk.red.bold 15 | }; 16 | } 17 | const NEWLINE = /\r\n|[\n\r\u2028\u2029]/; 18 | function getMarkerLines(loc, source, opts) { 19 | const startLoc = Object.assign({ 20 | column: 0, 21 | line: -1 22 | }, loc.start); 23 | const endLoc = Object.assign({}, startLoc, loc.end); 24 | const { 25 | linesAbove = 2, 26 | linesBelow = 3 27 | } = opts || {}; 28 | const startLine = startLoc.line; 29 | const startColumn = startLoc.column; 30 | const endLine = endLoc.line; 31 | const endColumn = endLoc.column; 32 | let start = Math.max(startLine - (linesAbove + 1), 0); 33 | let end = Math.min(source.length, endLine + linesBelow); 34 | if (startLine === -1) { 35 | start = 0; 36 | } 37 | if (endLine === -1) { 38 | end = source.length; 39 | } 40 | const lineDiff = endLine - startLine; 41 | const markerLines = {}; 42 | if (lineDiff) { 43 | for (let i = 0; i <= lineDiff; i++) { 44 | const lineNumber = i + startLine; 45 | if (!startColumn) { 46 | markerLines[lineNumber] = true; 47 | } else if (i === 0) { 48 | const sourceLength = source[lineNumber - 1].length; 49 | markerLines[lineNumber] = [startColumn, sourceLength - startColumn + 1]; 50 | } else if (i === lineDiff) { 51 | markerLines[lineNumber] = [0, endColumn]; 52 | } else { 53 | const sourceLength = source[lineNumber - i].length; 54 | markerLines[lineNumber] = [0, sourceLength]; 55 | } 56 | } 57 | } else { 58 | if (startColumn === endColumn) { 59 | if (startColumn) { 60 | markerLines[startLine] = [startColumn, 0]; 61 | } else { 62 | markerLines[startLine] = true; 63 | } 64 | } else { 65 | markerLines[startLine] = [startColumn, endColumn - startColumn]; 66 | } 67 | } 68 | return { 69 | start, 70 | end, 71 | markerLines 72 | }; 73 | } 74 | function codeFrameColumns(rawLines, loc, opts = {}) { 75 | const highlighted = (opts.highlightCode || opts.forceColor) && (0, _highlight.shouldHighlight)(opts); 76 | const chalk = (0, _highlight.getChalk)(opts); 77 | const defs = getDefs(chalk); 78 | const maybeHighlight = (chalkFn, string) => { 79 | return highlighted ? chalkFn(string) : string; 80 | }; 81 | const lines = rawLines.split(NEWLINE); 82 | const { 83 | start, 84 | end, 85 | markerLines 86 | } = getMarkerLines(loc, lines, opts); 87 | const hasColumns = loc.start && typeof loc.start.column === "number"; 88 | const numberMaxWidth = String(end).length; 89 | const highlightedLines = highlighted ? (0, _highlight.default)(rawLines, opts) : rawLines; 90 | let frame = highlightedLines.split(NEWLINE, end).slice(start, end).map((line, index) => { 91 | const number = start + 1 + index; 92 | const paddedNumber = ` ${number}`.slice(-numberMaxWidth); 93 | const gutter = ` ${paddedNumber} |`; 94 | const hasMarker = markerLines[number]; 95 | const lastMarkerLine = !markerLines[number + 1]; 96 | if (hasMarker) { 97 | let markerLine = ""; 98 | if (Array.isArray(hasMarker)) { 99 | const markerSpacing = line.slice(0, Math.max(hasMarker[0] - 1, 0)).replace(/[^\t]/g, " "); 100 | const numberOfMarkers = hasMarker[1] || 1; 101 | markerLine = ["\n ", maybeHighlight(defs.gutter, gutter.replace(/\d/g, " ")), " ", markerSpacing, maybeHighlight(defs.marker, "^").repeat(numberOfMarkers)].join(""); 102 | if (lastMarkerLine && opts.message) { 103 | markerLine += " " + maybeHighlight(defs.message, opts.message); 104 | } 105 | } 106 | return [maybeHighlight(defs.marker, ">"), maybeHighlight(defs.gutter, gutter), line.length > 0 ? ` ${line}` : "", markerLine].join(""); 107 | } else { 108 | return ` ${maybeHighlight(defs.gutter, gutter)}${line.length > 0 ? ` ${line}` : ""}`; 109 | } 110 | }).join("\n"); 111 | if (opts.message && !hasColumns) { 112 | frame = `${" ".repeat(numberMaxWidth + 1)}${opts.message}\n${frame}`; 113 | } 114 | if (highlighted) { 115 | return chalk.reset(frame); 116 | } else { 117 | return frame; 118 | } 119 | } 120 | function _default(rawLines, lineNumber, colNumber, opts = {}) { 121 | if (!deprecationWarningShown) { 122 | deprecationWarningShown = true; 123 | const message = "Passing lineNumber and colNumber is deprecated to @babel/code-frame. Please use `codeFrameColumns`."; 124 | if (process.emitWarning) { 125 | process.emitWarning(message, "DeprecationWarning"); 126 | } else { 127 | const deprecationError = new Error(message); 128 | deprecationError.name = "DeprecationWarning"; 129 | console.warn(new Error(message)); 130 | } 131 | } 132 | colNumber = Math.max(colNumber, 0); 133 | const location = { 134 | start: { 135 | column: colNumber, 136 | line: lineNumber 137 | } 138 | }; 139 | return codeFrameColumns(rawLines, location, opts); 140 | } 141 | 142 | //# sourceMappingURL=index.js.map 143 | -------------------------------------------------------------------------------- /index.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"names":["_highlight","require","deprecationWarningShown","getDefs","chalk","gutter","grey","marker","red","bold","message","NEWLINE","getMarkerLines","loc","source","opts","startLoc","Object","assign","column","line","start","endLoc","end","linesAbove","linesBelow","startLine","startColumn","endLine","endColumn","Math","max","min","length","lineDiff","markerLines","i","lineNumber","sourceLength","codeFrameColumns","rawLines","highlighted","highlightCode","forceColor","shouldHighlight","getChalk","defs","maybeHighlight","chalkFn","string","lines","split","hasColumns","numberMaxWidth","String","highlightedLines","highlight","frame","slice","map","index","number","paddedNumber","hasMarker","lastMarkerLine","markerLine","Array","isArray","markerSpacing","replace","numberOfMarkers","repeat","join","reset","_default","colNumber","process","emitWarning","deprecationError","Error","name","console","warn","location"],"sources":["../src/index.ts"],"sourcesContent":["import highlight, { shouldHighlight, getChalk } from \"@babel/highlight\";\n\ntype Chalk = ReturnType;\n\nlet deprecationWarningShown = false;\n\ntype Location = {\n column: number;\n line: number;\n};\n\ntype NodeLocation = {\n end?: Location;\n start: Location;\n};\n\nexport interface Options {\n /** Syntax highlight the code as JavaScript for terminals. default: false */\n highlightCode?: boolean;\n /** The number of lines to show above the error. default: 2 */\n linesAbove?: number;\n /** The number of lines to show below the error. default: 3 */\n linesBelow?: number;\n /**\n * Forcibly syntax highlight the code as JavaScript (for non-terminals);\n * overrides highlightCode.\n * default: false\n */\n forceColor?: boolean;\n /**\n * Pass in a string to be displayed inline (if possible) next to the\n * highlighted location in the code. If it can't be positioned inline,\n * it will be placed above the code frame.\n * default: nothing\n */\n message?: string;\n}\n\n/**\n * Chalk styles for code frame token types.\n */\nfunction getDefs(chalk: Chalk) {\n return {\n gutter: chalk.grey,\n marker: chalk.red.bold,\n message: chalk.red.bold,\n };\n}\n\n/**\n * RegExp to test for newlines in terminal.\n */\n\nconst NEWLINE = /\\r\\n|[\\n\\r\\u2028\\u2029]/;\n\n/**\n * Extract what lines should be marked and highlighted.\n */\n\ntype MarkerLines = Record;\n\nfunction getMarkerLines(\n loc: NodeLocation,\n source: Array,\n opts: Options,\n): {\n start: number;\n end: number;\n markerLines: MarkerLines;\n} {\n const startLoc: Location = {\n column: 0,\n line: -1,\n ...loc.start,\n };\n const endLoc: Location = {\n ...startLoc,\n ...loc.end,\n };\n const { linesAbove = 2, linesBelow = 3 } = opts || {};\n const startLine = startLoc.line;\n const startColumn = startLoc.column;\n const endLine = endLoc.line;\n const endColumn = endLoc.column;\n\n let start = Math.max(startLine - (linesAbove + 1), 0);\n let end = Math.min(source.length, endLine + linesBelow);\n\n if (startLine === -1) {\n start = 0;\n }\n\n if (endLine === -1) {\n end = source.length;\n }\n\n const lineDiff = endLine - startLine;\n const markerLines: MarkerLines = {};\n\n if (lineDiff) {\n for (let i = 0; i <= lineDiff; i++) {\n const lineNumber = i + startLine;\n\n if (!startColumn) {\n markerLines[lineNumber] = true;\n } else if (i === 0) {\n const sourceLength = source[lineNumber - 1].length;\n\n markerLines[lineNumber] = [startColumn, sourceLength - startColumn + 1];\n } else if (i === lineDiff) {\n markerLines[lineNumber] = [0, endColumn];\n } else {\n const sourceLength = source[lineNumber - i].length;\n\n markerLines[lineNumber] = [0, sourceLength];\n }\n }\n } else {\n if (startColumn === endColumn) {\n if (startColumn) {\n markerLines[startLine] = [startColumn, 0];\n } else {\n markerLines[startLine] = true;\n }\n } else {\n markerLines[startLine] = [startColumn, endColumn - startColumn];\n }\n }\n\n return { start, end, markerLines };\n}\n\nexport function codeFrameColumns(\n rawLines: string,\n loc: NodeLocation,\n opts: Options = {},\n): string {\n const highlighted =\n (opts.highlightCode || opts.forceColor) && shouldHighlight(opts);\n const chalk = getChalk(opts);\n const defs = getDefs(chalk);\n const maybeHighlight = (chalkFn: Chalk, string: string) => {\n return highlighted ? chalkFn(string) : string;\n };\n const lines = rawLines.split(NEWLINE);\n const { start, end, markerLines } = getMarkerLines(loc, lines, opts);\n const hasColumns = loc.start && typeof loc.start.column === \"number\";\n\n const numberMaxWidth = String(end).length;\n\n const highlightedLines = highlighted ? highlight(rawLines, opts) : rawLines;\n\n let frame = highlightedLines\n .split(NEWLINE, end)\n .slice(start, end)\n .map((line, index) => {\n const number = start + 1 + index;\n const paddedNumber = ` ${number}`.slice(-numberMaxWidth);\n const gutter = ` ${paddedNumber} |`;\n const hasMarker = markerLines[number];\n const lastMarkerLine = !markerLines[number + 1];\n if (hasMarker) {\n let markerLine = \"\";\n if (Array.isArray(hasMarker)) {\n const markerSpacing = line\n .slice(0, Math.max(hasMarker[0] - 1, 0))\n .replace(/[^\\t]/g, \" \");\n const numberOfMarkers = hasMarker[1] || 1;\n\n markerLine = [\n \"\\n \",\n maybeHighlight(defs.gutter, gutter.replace(/\\d/g, \" \")),\n \" \",\n markerSpacing,\n maybeHighlight(defs.marker, \"^\").repeat(numberOfMarkers),\n ].join(\"\");\n\n if (lastMarkerLine && opts.message) {\n markerLine += \" \" + maybeHighlight(defs.message, opts.message);\n }\n }\n return [\n maybeHighlight(defs.marker, \">\"),\n maybeHighlight(defs.gutter, gutter),\n line.length > 0 ? ` ${line}` : \"\",\n markerLine,\n ].join(\"\");\n } else {\n return ` ${maybeHighlight(defs.gutter, gutter)}${\n line.length > 0 ? ` ${line}` : \"\"\n }`;\n }\n })\n .join(\"\\n\");\n\n if (opts.message && !hasColumns) {\n frame = `${\" \".repeat(numberMaxWidth + 1)}${opts.message}\\n${frame}`;\n }\n\n if (highlighted) {\n return chalk.reset(frame);\n } else {\n return frame;\n }\n}\n\n/**\n * Create a code frame, adding line numbers, code highlighting, and pointing to a given position.\n */\n\nexport default function (\n rawLines: string,\n lineNumber: number,\n colNumber?: number | null,\n opts: Options = {},\n): string {\n if (!deprecationWarningShown) {\n deprecationWarningShown = true;\n\n const message =\n \"Passing lineNumber and colNumber is deprecated to @babel/code-frame. Please use `codeFrameColumns`.\";\n\n if (process.emitWarning) {\n // A string is directly supplied to emitWarning, because when supplying an\n // Error object node throws in the tests because of different contexts\n process.emitWarning(message, \"DeprecationWarning\");\n } else {\n const deprecationError = new Error(message);\n deprecationError.name = \"DeprecationWarning\";\n console.warn(new Error(message));\n }\n }\n\n colNumber = Math.max(colNumber, 0);\n\n const location: NodeLocation = {\n start: { column: colNumber, line: lineNumber },\n };\n\n return codeFrameColumns(rawLines, location, opts);\n}\n"],"mappings":"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"} --------------------------------------------------------------------------------