diff options
author | Minteck <contact@minteck.org> | 2023-01-10 14:54:04 +0100 |
---|---|---|
committer | Minteck <contact@minteck.org> | 2023-01-10 14:54:04 +0100 |
commit | 99c1d9af689e5325f3cf535c4007b3aeb8325229 (patch) | |
tree | e663b3c2ebdbd67c818ac0c5147f0ce1d2463cda /school/node_modules/graphql/error/GraphQLError.js.flow | |
parent | 9871b03912fc28ad38b4037ebf26a78aa937baba (diff) | |
download | pluralconnect-99c1d9af689e5325f3cf535c4007b3aeb8325229.tar.gz pluralconnect-99c1d9af689e5325f3cf535c4007b3aeb8325229.tar.bz2 pluralconnect-99c1d9af689e5325f3cf535c4007b3aeb8325229.zip |
Update - This is an automated commit
Diffstat (limited to 'school/node_modules/graphql/error/GraphQLError.js.flow')
-rw-r--r-- | school/node_modules/graphql/error/GraphQLError.js.flow | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/school/node_modules/graphql/error/GraphQLError.js.flow b/school/node_modules/graphql/error/GraphQLError.js.flow new file mode 100644 index 0000000..3d23ca5 --- /dev/null +++ b/school/node_modules/graphql/error/GraphQLError.js.flow @@ -0,0 +1,194 @@ +// @flow strict +import isObjectLike from '../jsutils/isObjectLike'; +import { SYMBOL_TO_STRING_TAG } from '../polyfills/symbols'; + +import type { ASTNode } from '../language/ast'; +import type { Source } from '../language/source'; +import type { SourceLocation } from '../language/location'; +import { getLocation } from '../language/location'; +import { printLocation, printSourceLocation } from '../language/printLocation'; + +/** + * 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(). + */ + +locations: $ReadOnlyArray<SourceLocation> | void; + + /** + * 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(). + */ + +path: $ReadOnlyArray<string | number> | void; + + /** + * An array of GraphQL AST Nodes corresponding to this error. + */ + +nodes: $ReadOnlyArray<ASTNode> | void; + + /** + * 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. + */ + +source: Source | void; + + /** + * An array of character offsets within the source GraphQL document + * which correspond to this error. + */ + +positions: $ReadOnlyArray<number> | void; + + /** + * The original error thrown from a field resolver during execution. + */ + +originalError: Error | void | null; + + /** + * Extension fields to add to the formatted error. + */ + +extensions: { [key: string]: mixed, ... }; + + constructor( + message: string, + nodes?: $ReadOnlyArray<ASTNode> | ASTNode | void | null, + source?: ?Source, + positions?: ?$ReadOnlyArray<number>, + path?: ?$ReadOnlyArray<string | number>, + originalError?: ?(Error & { +extensions?: mixed, ... }), + extensions?: ?{ [key: string]: mixed, ... }, + ) { + super(message); + + this.name = 'GraphQLError'; + this.originalError = originalError ?? undefined; + + // Compute list of blame nodes. + this.nodes = undefinedIfEmpty( + Array.isArray(nodes) ? nodes : nodes ? [nodes] : undefined, + ); + + let nodeLocations = []; + for (const { loc } of this.nodes ?? []) { + if (loc != null) { + nodeLocations.push(loc); + } + } + nodeLocations = undefinedIfEmpty(nodeLocations); + + // Compute locations in the source for the given nodes/positions. + this.source = source ?? nodeLocations?.[0].source; + + this.positions = positions ?? nodeLocations?.map((loc) => loc.start); + + this.locations = + positions && source + ? positions.map((pos) => getLocation(source, pos)) + : nodeLocations?.map((loc) => getLocation(loc.source, loc.start)); + + this.path = path ?? undefined; + + const originalExtensions = originalError?.extensions; + + if (extensions == null && isObjectLike(originalExtensions)) { + this.extensions = { ...originalExtensions }; + } else { + this.extensions = extensions ?? {}; + } + + // By being enumerable, JSON.stringify will include bellow properties in the resulting output. + // This ensures that the simplest possible GraphQL service adheres to the spec. + Object.defineProperties((this: any), { + message: { enumerable: true }, + locations: { + enumerable: this.locations != null, + }, + path: { + enumerable: this.path != null, + }, + extensions: { + enumerable: + this.extensions != null && Object.keys(this.extensions).length > 0, + }, + name: { enumerable: false }, + nodes: { enumerable: false }, + source: { enumerable: false }, + positions: { enumerable: false }, + originalError: { enumerable: false }, + }); + + // Include (non-enumerable) stack trace. + if (originalError?.stack) { + Object.defineProperty(this, 'stack', { + value: originalError.stack, + writable: true, + configurable: true, + }); + return; + } + + // istanbul ignore next (See: 'https://github.com/graphql/graphql-js/issues/2317') + if (Error.captureStackTrace) { + Error.captureStackTrace(this, GraphQLError); + } else { + Object.defineProperty(this, 'stack', { + value: Error().stack, + writable: true, + configurable: true, + }); + } + } + + toString(): string { + return printError(this); + } + + // FIXME: workaround to not break chai comparisons, should be remove in v16 + // $FlowFixMe[unsupported-syntax] Flow doesn't support computed properties yet + get [SYMBOL_TO_STRING_TAG](): string { + return 'Object'; + } +} + +function undefinedIfEmpty<T>( + array: $ReadOnlyArray<T> | void, +): $ReadOnlyArray<T> | void { + return array === undefined || array.length === 0 ? undefined : array; +} + +/** + * Prints a GraphQLError to a string, representing useful location information + * about the error's position in the source. + */ +export function printError(error: GraphQLError): string { + let output = error.message; + + if (error.nodes) { + for (const node of error.nodes) { + if (node.loc) { + output += '\n\n' + printLocation(node.loc); + } + } + } else if (error.source && error.locations) { + for (const location of error.locations) { + output += '\n\n' + printSourceLocation(error.source, location); + } + } + + return output; +} |