var range = 2 function generateCodeFrame ( source, start, end ) { source = source.replace(/\r\n/g, '\n') // 替换\r\n 为 \n /* eslint-disable no-void */ if (start === void 0) start = 0 if (end === void 0) end = source.length var lines = source.split(/\n/) // 替换\r?\n 为 \n,不然 length 对不上,导致死循环 var count = 0 var res = [] for (var i = 0; i < lines.length; i++) { count += lines[i].length + 1 if (count >= start) { for (var j = i - range; j <= i + range || end > count; j++) { if (j < 0 || j >= lines.length) { continue } res.push(('' + (j + 1) + (repeat$1(' ', 3 - String(j + 1).length)) + '| ' + (lines[j]))) var lineLength = lines[j].length if (j === i) { // push underline var pad = start - (count - lineLength) + 1 var length = end > count ? lineLength - pad : end - start res.push(' | ' + repeat$1(' ', pad) + repeat$1('^', length)) } else if (j > i) { if (end > count) { var length$1 = Math.min(end - count, lineLength) res.push(' | ' + repeat$1('^', length$1)) } count += lineLength + 1 } } break } } return res.join('\n') } function repeat$1 (str, n) { var result = '' if (n > 0) { while (true) { // eslint-disable-line if (n & 1) { result += str } n >>>= 1 if (n <= 0) { break } str += str } } return result } module.exports = generateCodeFrame