137 lines
4.3 KiB
JavaScript
137 lines
4.3 KiB
JavaScript
/**
|
|
* Copyright (c) 2015-present, Facebook, Inc.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* strict
|
|
*/
|
|
import { getLocation } from '../language/location';
|
|
|
|
/**
|
|
* Prints a GraphQLError to a string, representing useful location information
|
|
* about the error's position in the source.
|
|
*/
|
|
export function printError(error) {
|
|
var printedLocations = [];
|
|
|
|
if (error.nodes) {
|
|
var _iteratorNormalCompletion = true;
|
|
var _didIteratorError = false;
|
|
var _iteratorError = undefined;
|
|
|
|
try {
|
|
for (var _iterator = error.nodes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
var node = _step.value;
|
|
|
|
if (node.loc) {
|
|
printedLocations.push(highlightSourceAtLocation(node.loc.source, getLocation(node.loc.source, node.loc.start)));
|
|
}
|
|
}
|
|
} catch (err) {
|
|
_didIteratorError = true;
|
|
_iteratorError = err;
|
|
} finally {
|
|
try {
|
|
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
_iterator.return();
|
|
}
|
|
} finally {
|
|
if (_didIteratorError) {
|
|
throw _iteratorError;
|
|
}
|
|
}
|
|
}
|
|
} else if (error.source && error.locations) {
|
|
var source = error.source;
|
|
var _iteratorNormalCompletion2 = true;
|
|
var _didIteratorError2 = false;
|
|
var _iteratorError2 = undefined;
|
|
|
|
try {
|
|
for (var _iterator2 = error.locations[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
|
|
var location = _step2.value;
|
|
printedLocations.push(highlightSourceAtLocation(source, location));
|
|
}
|
|
} catch (err) {
|
|
_didIteratorError2 = true;
|
|
_iteratorError2 = err;
|
|
} finally {
|
|
try {
|
|
if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
|
|
_iterator2.return();
|
|
}
|
|
} finally {
|
|
if (_didIteratorError2) {
|
|
throw _iteratorError2;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return printedLocations.length === 0 ? error.message : [error.message].concat(printedLocations).join('\n\n') + '\n';
|
|
}
|
|
/**
|
|
* Render a helpful description of the location of the error in the GraphQL
|
|
* Source document.
|
|
*/
|
|
|
|
function highlightSourceAtLocation(source, location) {
|
|
var firstLineColumnOffset = source.locationOffset.column - 1;
|
|
var body = whitespace(firstLineColumnOffset) + source.body;
|
|
var lineIndex = location.line - 1;
|
|
var lineOffset = source.locationOffset.line - 1;
|
|
var lineNum = location.line + lineOffset;
|
|
var columnOffset = location.line === 1 ? firstLineColumnOffset : 0;
|
|
var columnNum = location.column + columnOffset;
|
|
var lines = body.split(/\r\n|[\n\r]/g);
|
|
return "".concat(source.name, " (").concat(lineNum, ":").concat(columnNum, ")\n") + printPrefixedLines([// Lines specified like this: ["prefix", "string"],
|
|
["".concat(lineNum - 1, ": "), lines[lineIndex - 1]], ["".concat(lineNum, ": "), lines[lineIndex]], ['', 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 = 0;
|
|
var _iteratorNormalCompletion3 = true;
|
|
var _didIteratorError3 = false;
|
|
var _iteratorError3 = undefined;
|
|
|
|
try {
|
|
for (var _iterator3 = existingLines[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
|
|
var _ref4 = _step3.value;
|
|
var prefix = _ref4[0];
|
|
padLen = Math.max(padLen, prefix.length);
|
|
}
|
|
} catch (err) {
|
|
_didIteratorError3 = true;
|
|
_iteratorError3 = err;
|
|
} finally {
|
|
try {
|
|
if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
|
|
_iterator3.return();
|
|
}
|
|
} finally {
|
|
if (_didIteratorError3) {
|
|
throw _iteratorError3;
|
|
}
|
|
}
|
|
}
|
|
|
|
return existingLines.map(function (_ref3) {
|
|
var prefix = _ref3[0],
|
|
line = _ref3[1];
|
|
return lpad(padLen, prefix) + line;
|
|
}).join('\n');
|
|
}
|
|
|
|
function whitespace(len) {
|
|
return Array(len + 1).join(' ');
|
|
}
|
|
|
|
function lpad(len, str) {
|
|
return whitespace(len - str.length) + str;
|
|
} |