You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					163 lines
				
				4.6 KiB
			
		
		
			
		
	
	
					163 lines
				
				4.6 KiB
			| 
											3 years ago
										 | "use strict"; | ||
|  | 
 | ||
|  | Object.defineProperty(exports, "__esModule", { | ||
|  |   value: true | ||
|  | }); | ||
|  | exports.codeFrameColumns = codeFrameColumns; | ||
|  | exports.default = _default; | ||
|  | 
 | ||
|  | var _highlight = require("@babel/highlight"); | ||
|  | 
 | ||
|  | let deprecationWarningShown = false; | ||
|  | 
 | ||
|  | function getDefs(chalk) { | ||
|  |   return { | ||
|  |     gutter: chalk.grey, | ||
|  |     marker: chalk.red.bold, | ||
|  |     message: chalk.red.bold | ||
|  |   }; | ||
|  | } | ||
|  | 
 | ||
|  | const NEWLINE = /\r\n|[\n\r\u2028\u2029]/; | ||
|  | 
 | ||
|  | function getMarkerLines(loc, source, opts) { | ||
|  |   const startLoc = Object.assign({ | ||
|  |     column: 0, | ||
|  |     line: -1 | ||
|  |   }, loc.start); | ||
|  |   const endLoc = Object.assign({}, startLoc, loc.end); | ||
|  |   const { | ||
|  |     linesAbove = 2, | ||
|  |     linesBelow = 3 | ||
|  |   } = opts || {}; | ||
|  |   const startLine = startLoc.line; | ||
|  |   const startColumn = startLoc.column; | ||
|  |   const endLine = endLoc.line; | ||
|  |   const endColumn = endLoc.column; | ||
|  |   let start = Math.max(startLine - (linesAbove + 1), 0); | ||
|  |   let end = Math.min(source.length, endLine + linesBelow); | ||
|  | 
 | ||
|  |   if (startLine === -1) { | ||
|  |     start = 0; | ||
|  |   } | ||
|  | 
 | ||
|  |   if (endLine === -1) { | ||
|  |     end = source.length; | ||
|  |   } | ||
|  | 
 | ||
|  |   const lineDiff = endLine - startLine; | ||
|  |   const markerLines = {}; | ||
|  | 
 | ||
|  |   if (lineDiff) { | ||
|  |     for (let i = 0; i <= lineDiff; i++) { | ||
|  |       const lineNumber = i + startLine; | ||
|  | 
 | ||
|  |       if (!startColumn) { | ||
|  |         markerLines[lineNumber] = true; | ||
|  |       } else if (i === 0) { | ||
|  |         const sourceLength = source[lineNumber - 1].length; | ||
|  |         markerLines[lineNumber] = [startColumn, sourceLength - startColumn + 1]; | ||
|  |       } else if (i === lineDiff) { | ||
|  |         markerLines[lineNumber] = [0, endColumn]; | ||
|  |       } else { | ||
|  |         const sourceLength = source[lineNumber - i].length; | ||
|  |         markerLines[lineNumber] = [0, sourceLength]; | ||
|  |       } | ||
|  |     } | ||
|  |   } else { | ||
|  |     if (startColumn === endColumn) { | ||
|  |       if (startColumn) { | ||
|  |         markerLines[startLine] = [startColumn, 0]; | ||
|  |       } else { | ||
|  |         markerLines[startLine] = true; | ||
|  |       } | ||
|  |     } else { | ||
|  |       markerLines[startLine] = [startColumn, endColumn - startColumn]; | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   return { | ||
|  |     start, | ||
|  |     end, | ||
|  |     markerLines | ||
|  |   }; | ||
|  | } | ||
|  | 
 | ||
|  | function codeFrameColumns(rawLines, loc, opts = {}) { | ||
|  |   const highlighted = (opts.highlightCode || opts.forceColor) && (0, _highlight.shouldHighlight)(opts); | ||
|  |   const chalk = (0, _highlight.getChalk)(opts); | ||
|  |   const defs = getDefs(chalk); | ||
|  | 
 | ||
|  |   const maybeHighlight = (chalkFn, string) => { | ||
|  |     return highlighted ? chalkFn(string) : string; | ||
|  |   }; | ||
|  | 
 | ||
|  |   const lines = rawLines.split(NEWLINE); | ||
|  |   const { | ||
|  |     start, | ||
|  |     end, | ||
|  |     markerLines | ||
|  |   } = getMarkerLines(loc, lines, opts); | ||
|  |   const hasColumns = loc.start && typeof loc.start.column === "number"; | ||
|  |   const numberMaxWidth = String(end).length; | ||
|  |   const highlightedLines = highlighted ? (0, _highlight.default)(rawLines, opts) : rawLines; | ||
|  |   let frame = highlightedLines.split(NEWLINE, end).slice(start, end).map((line, index) => { | ||
|  |     const number = start + 1 + index; | ||
|  |     const paddedNumber = ` ${number}`.slice(-numberMaxWidth); | ||
|  |     const gutter = ` ${paddedNumber} |`; | ||
|  |     const hasMarker = markerLines[number]; | ||
|  |     const lastMarkerLine = !markerLines[number + 1]; | ||
|  | 
 | ||
|  |     if (hasMarker) { | ||
|  |       let markerLine = ""; | ||
|  | 
 | ||
|  |       if (Array.isArray(hasMarker)) { | ||
|  |         const markerSpacing = line.slice(0, Math.max(hasMarker[0] - 1, 0)).replace(/[^\t]/g, " "); | ||
|  |         const numberOfMarkers = hasMarker[1] || 1; | ||
|  |         markerLine = ["\n ", maybeHighlight(defs.gutter, gutter.replace(/\d/g, " ")), " ", markerSpacing, maybeHighlight(defs.marker, "^").repeat(numberOfMarkers)].join(""); | ||
|  | 
 | ||
|  |         if (lastMarkerLine && opts.message) { | ||
|  |           markerLine += " " + maybeHighlight(defs.message, opts.message); | ||
|  |         } | ||
|  |       } | ||
|  | 
 | ||
|  |       return [maybeHighlight(defs.marker, ">"), maybeHighlight(defs.gutter, gutter), line.length > 0 ? ` ${line}` : "", markerLine].join(""); | ||
|  |     } else { | ||
|  |       return ` ${maybeHighlight(defs.gutter, gutter)}${line.length > 0 ? ` ${line}` : ""}`; | ||
|  |     } | ||
|  |   }).join("\n"); | ||
|  | 
 | ||
|  |   if (opts.message && !hasColumns) { | ||
|  |     frame = `${" ".repeat(numberMaxWidth + 1)}${opts.message}\n${frame}`; | ||
|  |   } | ||
|  | 
 | ||
|  |   if (highlighted) { | ||
|  |     return chalk.reset(frame); | ||
|  |   } else { | ||
|  |     return frame; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | function _default(rawLines, lineNumber, colNumber, opts = {}) { | ||
|  |   if (!deprecationWarningShown) { | ||
|  |     deprecationWarningShown = true; | ||
|  |     const message = "Passing lineNumber and colNumber is deprecated to @babel/code-frame. Please use `codeFrameColumns`."; | ||
|  | 
 | ||
|  |     if (process.emitWarning) { | ||
|  |       process.emitWarning(message, "DeprecationWarning"); | ||
|  |     } else { | ||
|  |       const deprecationError = new Error(message); | ||
|  |       deprecationError.name = "DeprecationWarning"; | ||
|  |       console.warn(new Error(message)); | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   colNumber = Math.max(colNumber, 0); | ||
|  |   const location = { | ||
|  |     start: { | ||
|  |       column: colNumber, | ||
|  |       line: lineNumber | ||
|  |     } | ||
|  |   }; | ||
|  |   return codeFrameColumns(rawLines, location, opts); | ||
|  | } |