1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.hasPersistedQueryError = exports.formatApolloErrors = exports.UserInputError = exports.PersistedQueryNotSupportedError = exports.PersistedQueryNotFoundError = exports.ForbiddenError = exports.AuthenticationError = exports.ValidationError = exports.SyntaxError = exports.fromGraphQLError = exports.toApolloError = exports.ApolloError = void 0;
|
4 | const graphql_1 = require("graphql");
|
5 | class ApolloError extends Error {
|
6 | constructor(message, code, extensions) {
|
7 | super(message);
|
8 | if (extensions) {
|
9 | Object.keys(extensions)
|
10 | .filter(keyName => keyName !== 'message' && keyName !== 'extensions')
|
11 | .forEach(key => {
|
12 | this[key] = extensions[key];
|
13 | });
|
14 | }
|
15 | if (!this.name) {
|
16 | Object.defineProperty(this, 'name', { value: 'ApolloError' });
|
17 | }
|
18 | const userProvidedExtensions = (extensions && extensions.extensions) || null;
|
19 | this.extensions = Object.assign(Object.assign(Object.assign({}, extensions), userProvidedExtensions), { code });
|
20 | }
|
21 | }
|
22 | exports.ApolloError = ApolloError;
|
23 | function enrichError(error, debug = false) {
|
24 | const expanded = Object.create(Object.getPrototypeOf(error), {
|
25 | name: {
|
26 | value: error.name,
|
27 | },
|
28 | message: {
|
29 | value: error.message,
|
30 | enumerable: true,
|
31 | writable: true,
|
32 | },
|
33 | locations: {
|
34 | value: error.locations || undefined,
|
35 | enumerable: true,
|
36 | },
|
37 | path: {
|
38 | value: error.path || undefined,
|
39 | enumerable: true,
|
40 | },
|
41 | nodes: {
|
42 | value: error.nodes || undefined,
|
43 | },
|
44 | source: {
|
45 | value: error.source || undefined,
|
46 | },
|
47 | positions: {
|
48 | value: error.positions || undefined,
|
49 | },
|
50 | originalError: {
|
51 | value: error.originalError,
|
52 | },
|
53 | });
|
54 | expanded.extensions = Object.assign(Object.assign({}, error.extensions), { code: (error.extensions && error.extensions.code) || 'INTERNAL_SERVER_ERROR', exception: Object.assign(Object.assign({}, (error.extensions && error.extensions.exception)), error.originalError) });
|
55 | delete expanded.extensions.exception.extensions;
|
56 | if (debug && !expanded.extensions.exception.stacktrace) {
|
57 | expanded.extensions.exception.stacktrace =
|
58 | (error.originalError &&
|
59 | error.originalError.stack &&
|
60 | error.originalError.stack.split('\n')) ||
|
61 | (error.stack && error.stack.split('\n'));
|
62 | }
|
63 | if (Object.keys(expanded.extensions.exception).length === 0) {
|
64 | delete expanded.extensions.exception;
|
65 | }
|
66 | return expanded;
|
67 | }
|
68 | function toApolloError(error, code = 'INTERNAL_SERVER_ERROR') {
|
69 | let err = error;
|
70 | if (err.extensions) {
|
71 | err.extensions.code = code;
|
72 | }
|
73 | else {
|
74 | err.extensions = { code };
|
75 | }
|
76 | return err;
|
77 | }
|
78 | exports.toApolloError = toApolloError;
|
79 | function fromGraphQLError(error, options) {
|
80 | const copy = options && options.errorClass
|
81 | ? new options.errorClass(error.message)
|
82 | : new ApolloError(error.message);
|
83 | Object.keys(error).forEach(key => {
|
84 | copy[key] = error[key];
|
85 | });
|
86 | copy.extensions = Object.assign(Object.assign({}, copy.extensions), error.extensions);
|
87 | if (!copy.extensions.code) {
|
88 | copy.extensions.code = (options && options.code) || 'INTERNAL_SERVER_ERROR';
|
89 | }
|
90 | Object.defineProperty(copy, 'originalError', { value: {} });
|
91 | Object.getOwnPropertyNames(error).forEach(key => {
|
92 | Object.defineProperty(copy.originalError, key, { value: error[key] });
|
93 | });
|
94 | return copy;
|
95 | }
|
96 | exports.fromGraphQLError = fromGraphQLError;
|
97 | class SyntaxError extends ApolloError {
|
98 | constructor(message) {
|
99 | super(message, 'GRAPHQL_PARSE_FAILED');
|
100 | Object.defineProperty(this, 'name', { value: 'SyntaxError' });
|
101 | }
|
102 | }
|
103 | exports.SyntaxError = SyntaxError;
|
104 | class ValidationError extends ApolloError {
|
105 | constructor(message) {
|
106 | super(message, 'GRAPHQL_VALIDATION_FAILED');
|
107 | Object.defineProperty(this, 'name', { value: 'ValidationError' });
|
108 | }
|
109 | }
|
110 | exports.ValidationError = ValidationError;
|
111 | class AuthenticationError extends ApolloError {
|
112 | constructor(message) {
|
113 | super(message, 'UNAUTHENTICATED');
|
114 | Object.defineProperty(this, 'name', { value: 'AuthenticationError' });
|
115 | }
|
116 | }
|
117 | exports.AuthenticationError = AuthenticationError;
|
118 | class ForbiddenError extends ApolloError {
|
119 | constructor(message) {
|
120 | super(message, 'FORBIDDEN');
|
121 | Object.defineProperty(this, 'name', { value: 'ForbiddenError' });
|
122 | }
|
123 | }
|
124 | exports.ForbiddenError = ForbiddenError;
|
125 | class PersistedQueryNotFoundError extends ApolloError {
|
126 | constructor() {
|
127 | super('PersistedQueryNotFound', 'PERSISTED_QUERY_NOT_FOUND');
|
128 | Object.defineProperty(this, 'name', {
|
129 | value: 'PersistedQueryNotFoundError',
|
130 | });
|
131 | }
|
132 | }
|
133 | exports.PersistedQueryNotFoundError = PersistedQueryNotFoundError;
|
134 | class PersistedQueryNotSupportedError extends ApolloError {
|
135 | constructor() {
|
136 | super('PersistedQueryNotSupported', 'PERSISTED_QUERY_NOT_SUPPORTED');
|
137 | Object.defineProperty(this, 'name', {
|
138 | value: 'PersistedQueryNotSupportedError',
|
139 | });
|
140 | }
|
141 | }
|
142 | exports.PersistedQueryNotSupportedError = PersistedQueryNotSupportedError;
|
143 | class UserInputError extends ApolloError {
|
144 | constructor(message, properties) {
|
145 | super(message, 'BAD_USER_INPUT', properties);
|
146 | Object.defineProperty(this, 'name', { value: 'UserInputError' });
|
147 | }
|
148 | }
|
149 | exports.UserInputError = UserInputError;
|
150 | function formatApolloErrors(errors, options) {
|
151 | if (!options) {
|
152 | return errors.map(error => enrichError(error));
|
153 | }
|
154 | const { formatter, debug } = options;
|
155 | const enrichedErrors = errors.map(error => enrichError(error, debug));
|
156 | const makePrintable = error => {
|
157 | if (error instanceof Error) {
|
158 | const graphQLError = error;
|
159 | return Object.assign(Object.assign(Object.assign({ message: graphQLError.message }, (graphQLError.locations && { locations: graphQLError.locations })), (graphQLError.path && { path: graphQLError.path })), (graphQLError.extensions && { extensions: graphQLError.extensions }));
|
160 | }
|
161 | return error;
|
162 | };
|
163 | if (!formatter) {
|
164 | return enrichedErrors;
|
165 | }
|
166 | return enrichedErrors.map(error => {
|
167 | try {
|
168 | return makePrintable(formatter(error));
|
169 | }
|
170 | catch (err) {
|
171 | if (debug) {
|
172 | return enrichError(err, debug);
|
173 | }
|
174 | else {
|
175 | const newError = fromGraphQLError(new graphql_1.GraphQLError('Internal server error'));
|
176 | return enrichError(newError, debug);
|
177 | }
|
178 | }
|
179 | });
|
180 | }
|
181 | exports.formatApolloErrors = formatApolloErrors;
|
182 | function hasPersistedQueryError(errors) {
|
183 | return Array.isArray(errors)
|
184 | ? errors.some(error => error instanceof PersistedQueryNotFoundError ||
|
185 | error instanceof PersistedQueryNotSupportedError)
|
186 | : false;
|
187 | }
|
188 | exports.hasPersistedQueryError = hasPersistedQueryError;
|
189 |
|
\ | No newline at end of file |