| import { getLocation } from "./location.mjs"; |
| /** |
| * Render a helpful description of the location in the GraphQL Source document. |
| */ |
| |
| export function printLocation(location) { |
| return printSourceLocation(location.source, getLocation(location.source, location.start)); |
| } |
| /** |
| * Render a helpful description of the location in the GraphQL Source document. |
| */ |
| |
| export function printSourceLocation(source, sourceLocation) { |
| var firstLineColumnOffset = source.locationOffset.column - 1; |
| var body = whitespace(firstLineColumnOffset) + source.body; |
| var lineIndex = sourceLocation.line - 1; |
| var lineOffset = source.locationOffset.line - 1; |
| var lineNum = sourceLocation.line + lineOffset; |
| var columnOffset = sourceLocation.line === 1 ? firstLineColumnOffset : 0; |
| var columnNum = sourceLocation.column + columnOffset; |
| var locationStr = "".concat(source.name, ":").concat(lineNum, ":").concat(columnNum, "\n"); |
| var lines = body.split(/\r\n|[\n\r]/g); |
| var locationLine = lines[lineIndex]; // Special case for minified documents |
| |
| if (locationLine.length > 120) { |
| var subLineIndex = Math.floor(columnNum / 80); |
| var subLineColumnNum = columnNum % 80; |
| var subLines = []; |
| |
| for (var i = 0; i < locationLine.length; i += 80) { |
| subLines.push(locationLine.slice(i, i + 80)); |
| } |
| |
| return locationStr + printPrefixedLines([["".concat(lineNum), subLines[0]]].concat(subLines.slice(1, subLineIndex + 1).map(function (subLine) { |
| return ['', subLine]; |
| }), [[' ', whitespace(subLineColumnNum - 1) + '^'], ['', subLines[subLineIndex + 1]]])); |
| } |
| |
| return locationStr + printPrefixedLines([// Lines specified like this: ["prefix", "string"], |
| ["".concat(lineNum - 1), lines[lineIndex - 1]], ["".concat(lineNum), locationLine], ['', whitespace(columnNum - 1) + '^'], ["".concat(lineNum + 1), lines[lineIndex + 1]]]); |
| } |
| |
| function printPrefixedLines(lines) { |
| var existingLines = lines.filter(function (_ref) { |
| var _ = _ref[0], |
| line = _ref[1]; |
| return line !== undefined; |
| }); |
| var padLen = Math.max.apply(Math, existingLines.map(function (_ref2) { |
| var prefix = _ref2[0]; |
| return prefix.length; |
| })); |
| return existingLines.map(function (_ref3) { |
| var prefix = _ref3[0], |
| line = _ref3[1]; |
| return leftPad(padLen, prefix) + (line ? ' | ' + line : ' |'); |
| }).join('\n'); |
| } |
| |
| function whitespace(len) { |
| return Array(len + 1).join(' '); |
| } |
| |
| function leftPad(len, str) { |
| return whitespace(len - str.length) + str; |
| } |