123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 |
- import { isObjectLike } from '../jsutils/isObjectLike.mjs';
- import { getLocation } from '../language/location.mjs';
- import {
- printLocation,
- printSourceLocation,
- } from '../language/printLocation.mjs';
- function toNormalizedOptions(args) {
- const firstArg = args[0];
- if (firstArg == null || 'kind' in firstArg || 'length' in firstArg) {
- return {
- nodes: firstArg,
- source: args[1],
- positions: args[2],
- path: args[3],
- originalError: args[4],
- extensions: args[5],
- };
- }
- return firstArg;
- }
- /**
- * A GraphQLError describes an Error found during the parse, validate, or
- * execute phases of performing a GraphQL operation. In addition to a message
- * and stack trace, it also includes information about the locations in a
- * GraphQL document and/or execution result that correspond to the Error.
- */
- export class GraphQLError extends Error {
- /**
- * An array of `{ line, column }` locations within the source GraphQL document
- * which correspond to this error.
- *
- * Errors during validation often contain multiple locations, for example to
- * point out two things with the same name. Errors during execution include a
- * single location, the field which produced the error.
- *
- * Enumerable, and appears in the result of JSON.stringify().
- */
- /**
- * An array describing the JSON-path into the execution response which
- * corresponds to this error. Only included for errors during execution.
- *
- * Enumerable, and appears in the result of JSON.stringify().
- */
- /**
- * An array of GraphQL AST Nodes corresponding to this error.
- */
- /**
- * The source GraphQL document for the first location of this error.
- *
- * Note that if this Error represents more than one node, the source may not
- * represent nodes after the first node.
- */
- /**
- * An array of character offsets within the source GraphQL document
- * which correspond to this error.
- */
- /**
- * The original error thrown from a field resolver during execution.
- */
- /**
- * Extension fields to add to the formatted error.
- */
- /**
- * @deprecated Please use the `GraphQLErrorOptions` constructor overload instead.
- */
- constructor(message, ...rawArgs) {
- var _this$nodes, _nodeLocations$, _ref;
- const { nodes, source, positions, path, originalError, extensions } =
- toNormalizedOptions(rawArgs);
- super(message);
- this.name = 'GraphQLError';
- this.path = path !== null && path !== void 0 ? path : undefined;
- this.originalError =
- originalError !== null && originalError !== void 0
- ? originalError
- : undefined; // Compute list of blame nodes.
- this.nodes = undefinedIfEmpty(
- Array.isArray(nodes) ? nodes : nodes ? [nodes] : undefined,
- );
- const nodeLocations = undefinedIfEmpty(
- (_this$nodes = this.nodes) === null || _this$nodes === void 0
- ? void 0
- : _this$nodes.map((node) => node.loc).filter((loc) => loc != null),
- ); // Compute locations in the source for the given nodes/positions.
- this.source =
- source !== null && source !== void 0
- ? source
- : nodeLocations === null || nodeLocations === void 0
- ? void 0
- : (_nodeLocations$ = nodeLocations[0]) === null ||
- _nodeLocations$ === void 0
- ? void 0
- : _nodeLocations$.source;
- this.positions =
- positions !== null && positions !== void 0
- ? positions
- : nodeLocations === null || nodeLocations === void 0
- ? void 0
- : nodeLocations.map((loc) => loc.start);
- this.locations =
- positions && source
- ? positions.map((pos) => getLocation(source, pos))
- : nodeLocations === null || nodeLocations === void 0
- ? void 0
- : nodeLocations.map((loc) => getLocation(loc.source, loc.start));
- const originalExtensions = isObjectLike(
- originalError === null || originalError === void 0
- ? void 0
- : originalError.extensions,
- )
- ? originalError === null || originalError === void 0
- ? void 0
- : originalError.extensions
- : undefined;
- this.extensions =
- (_ref =
- extensions !== null && extensions !== void 0
- ? extensions
- : originalExtensions) !== null && _ref !== void 0
- ? _ref
- : Object.create(null); // Only properties prescribed by the spec should be enumerable.
- // Keep the rest as non-enumerable.
- Object.defineProperties(this, {
- message: {
- writable: true,
- enumerable: true,
- },
- name: {
- enumerable: false,
- },
- nodes: {
- enumerable: false,
- },
- source: {
- enumerable: false,
- },
- positions: {
- enumerable: false,
- },
- originalError: {
- enumerable: false,
- },
- }); // Include (non-enumerable) stack trace.
- /* c8 ignore start */
- // FIXME: https://github.com/graphql/graphql-js/issues/2317
- if (
- originalError !== null &&
- originalError !== void 0 &&
- originalError.stack
- ) {
- Object.defineProperty(this, 'stack', {
- value: originalError.stack,
- writable: true,
- configurable: true,
- });
- } else if (Error.captureStackTrace) {
- Error.captureStackTrace(this, GraphQLError);
- } else {
- Object.defineProperty(this, 'stack', {
- value: Error().stack,
- writable: true,
- configurable: true,
- });
- }
- /* c8 ignore stop */
- }
- get [Symbol.toStringTag]() {
- return 'GraphQLError';
- }
- toString() {
- let output = this.message;
- if (this.nodes) {
- for (const node of this.nodes) {
- if (node.loc) {
- output += '\n\n' + printLocation(node.loc);
- }
- }
- } else if (this.source && this.locations) {
- for (const location of this.locations) {
- output += '\n\n' + printSourceLocation(this.source, location);
- }
- }
- return output;
- }
- toJSON() {
- const formattedError = {
- message: this.message,
- };
- if (this.locations != null) {
- formattedError.locations = this.locations;
- }
- if (this.path != null) {
- formattedError.path = this.path;
- }
- if (this.extensions != null && Object.keys(this.extensions).length > 0) {
- formattedError.extensions = this.extensions;
- }
- return formattedError;
- }
- }
- function undefinedIfEmpty(array) {
- return array === undefined || array.length === 0 ? undefined : array;
- }
- /**
- * See: https://spec.graphql.org/draft/#sec-Errors
- */
- /**
- * Prints a GraphQLError to a string, representing useful location information
- * about the error's position in the source.
- *
- * @deprecated Please use `error.toString` instead. Will be removed in v17
- */
- export function printError(error) {
- return error.toString();
- }
- /**
- * Given a GraphQLError, format it according to the rules described by the
- * Response Format, Errors section of the GraphQL Specification.
- *
- * @deprecated Please use `error.toJSON` instead. Will be removed in v17
- */
- export function formatError(error) {
- return error.toJSON();
- }
|