apollo-server-errors
Version:
209 lines • 7.65 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.formatApolloErrors = exports.UserInputError = exports.PersistedQueryNotSupportedError = exports.PersistedQueryNotFoundError = exports.ForbiddenError = exports.AuthenticationError = exports.ValidationError = exports.SyntaxError = exports.fromGraphQLError = exports.toApolloError = exports.ApolloError = void 0;
const graphql_1 = require("graphql");
class ApolloError extends Error {
constructor(message, code, extensions) {
super(message);
if (!this.name) {
Object.defineProperty(this, 'name', { value: 'ApolloError' });
}
if (extensions === null || extensions === void 0 ? void 0 : extensions.extensions) {
throw Error('Pass extensions directly as the third argument of the ApolloError constructor: `new ' +
'ApolloError(message, code, {myExt: value})`, not `new ApolloError(message, code, ' +
'{extensions: {myExt: value}})`');
}
this.extensions = { ...extensions, code };
}
toJSON() {
return (0, graphql_1.formatError)(toGraphQLError(this));
}
toString() {
return (0, graphql_1.printError)(toGraphQLError(this));
}
get [Symbol.toStringTag]() {
return this.name;
}
}
exports.ApolloError = ApolloError;
function toGraphQLError(error) {
return new graphql_1.GraphQLError(error.message, error.nodes, error.source, error.positions, error.path, error.originalError, error.extensions);
}
function enrichError(error, debug = false) {
var _a, _b, _c;
const expanded = Object.create(Object.getPrototypeOf(error), {
name: {
value: error.name,
},
message: {
value: error.message,
enumerable: true,
writable: true,
},
locations: {
value: error.locations || undefined,
enumerable: true,
},
path: {
value: error.path || undefined,
enumerable: true,
},
nodes: {
value: error.nodes || undefined,
},
source: {
value: error.source || undefined,
},
positions: {
value: error.positions || undefined,
},
originalError: {
value: error.originalError,
},
});
expanded.extensions = {
...error.extensions,
code: ((_a = error.extensions) === null || _a === void 0 ? void 0 : _a.code) || 'INTERNAL_SERVER_ERROR',
exception: {
...(_b = error.extensions) === null || _b === void 0 ? void 0 : _b.exception,
...error.originalError,
},
};
delete expanded.extensions.exception.extensions;
if (debug && !expanded.extensions.exception.stacktrace) {
const stack = ((_c = error.originalError) === null || _c === void 0 ? void 0 : _c.stack) || error.stack;
expanded.extensions.exception.stacktrace = stack === null || stack === void 0 ? void 0 : stack.split('\n');
}
if (Object.keys(expanded.extensions.exception).length === 0) {
delete expanded.extensions.exception;
}
return expanded;
}
function toApolloError(error, code = 'INTERNAL_SERVER_ERROR') {
let err = error;
if (err.extensions) {
err.extensions.code = code;
}
else {
err.extensions = { code };
}
return err;
}
exports.toApolloError = toApolloError;
function fromGraphQLError(error, options) {
const copy = (options === null || options === void 0 ? void 0 : options.errorClass)
? new options.errorClass(error.message)
: new ApolloError(error.message);
Object.entries(error).forEach(([key, value]) => {
if (key === 'extensions') {
return;
}
copy[key] = value;
});
copy.extensions = {
...copy.extensions,
...error.extensions,
};
if (!copy.extensions.code) {
copy.extensions.code = (options === null || options === void 0 ? void 0 : options.code) || 'INTERNAL_SERVER_ERROR';
}
Object.defineProperty(copy, 'originalError', { value: {} });
Object.getOwnPropertyNames(error).forEach((key) => {
Object.defineProperty(copy.originalError, key, {
value: error[key],
});
});
return copy;
}
exports.fromGraphQLError = fromGraphQLError;
class SyntaxError extends ApolloError {
constructor(message) {
super(message, 'GRAPHQL_PARSE_FAILED');
Object.defineProperty(this, 'name', { value: 'SyntaxError' });
}
}
exports.SyntaxError = SyntaxError;
class ValidationError extends ApolloError {
constructor(message) {
super(message, 'GRAPHQL_VALIDATION_FAILED');
Object.defineProperty(this, 'name', { value: 'ValidationError' });
}
}
exports.ValidationError = ValidationError;
class AuthenticationError extends ApolloError {
constructor(message, extensions) {
super(message, 'UNAUTHENTICATED', extensions);
Object.defineProperty(this, 'name', { value: 'AuthenticationError' });
}
}
exports.AuthenticationError = AuthenticationError;
class ForbiddenError extends ApolloError {
constructor(message, extensions) {
super(message, 'FORBIDDEN', extensions);
Object.defineProperty(this, 'name', { value: 'ForbiddenError' });
}
}
exports.ForbiddenError = ForbiddenError;
class PersistedQueryNotFoundError extends ApolloError {
constructor() {
super('PersistedQueryNotFound', 'PERSISTED_QUERY_NOT_FOUND');
Object.defineProperty(this, 'name', {
value: 'PersistedQueryNotFoundError',
});
}
}
exports.PersistedQueryNotFoundError = PersistedQueryNotFoundError;
class PersistedQueryNotSupportedError extends ApolloError {
constructor() {
super('PersistedQueryNotSupported', 'PERSISTED_QUERY_NOT_SUPPORTED');
Object.defineProperty(this, 'name', {
value: 'PersistedQueryNotSupportedError',
});
}
}
exports.PersistedQueryNotSupportedError = PersistedQueryNotSupportedError;
class UserInputError extends ApolloError {
constructor(message, extensions) {
super(message, 'BAD_USER_INPUT', extensions);
Object.defineProperty(this, 'name', { value: 'UserInputError' });
}
}
exports.UserInputError = UserInputError;
function formatApolloErrors(errors, options) {
if (!options) {
return errors.map((error) => enrichError(error));
}
const { formatter, debug } = options;
const enrichedErrors = errors.map((error) => enrichError(error, debug));
const makePrintable = (error) => {
if (error instanceof Error) {
const graphQLError = error;
return {
message: graphQLError.message,
...(graphQLError.locations && { locations: graphQLError.locations }),
...(graphQLError.path && { path: graphQLError.path }),
...(graphQLError.extensions && { extensions: graphQLError.extensions }),
};
}
return error;
};
if (!formatter) {
return enrichedErrors;
}
return enrichedErrors.map((error) => {
try {
return makePrintable(formatter(error));
}
catch (err) {
if (debug) {
return enrichError(err, debug);
}
else {
const newError = fromGraphQLError(new graphql_1.GraphQLError('Internal server error'));
return enrichError(newError, debug);
}
}
});
}
exports.formatApolloErrors = formatApolloErrors;
//# sourceMappingURL=index.js.map
;