axios-error
Version:
Axios error wrapper that aim to provide clear error message to developers
135 lines (107 loc) • 2.68 kB
text/typescript
import util from 'util';
import { AxiosError as BaseAxiosError } from 'axios';
import { JsonValue } from 'type-fest';
function indent(str: string): string {
return str
.split('\n')
.map((s) => (s ? ` ${s}` : ''))
.join('\n');
}
function json(data: JsonValue): string {
return JSON.stringify(data, null, 2);
}
class AxiosError extends Error {
config: BaseAxiosError['config'];
request?: BaseAxiosError['request'];
response?: BaseAxiosError['response'];
status?: number;
/**
* @example
* ```js
* new AxiosError(errorThrownByAxios)
* ```
*/
constructor(error: BaseAxiosError);
/**
* @example
* ```js
* new AxiosError('error message', errorThrownByAxios)
* ```
*/
constructor(message: string, error: BaseAxiosError);
/**
* @example
* ```js
* new AxiosError('error message', { config, request, response })
* ```
*/
constructor(
message: string,
error: Pick<BaseAxiosError, 'config' | 'request' | 'response'>
);
constructor(
messageOrError: string | BaseAxiosError,
error?:
| BaseAxiosError
| Pick<BaseAxiosError, 'config' | 'request' | 'response'>
) {
let err: Pick<BaseAxiosError, 'config' | 'request' | 'response'>;
if (typeof messageOrError === 'string') {
super(messageOrError);
err = error as Pick<BaseAxiosError, 'config' | 'request' | 'response'>;
} else {
super(messageOrError.message);
err = messageOrError;
}
const { config, request, response } = err;
this.config = config;
this.request = request;
this.response = response;
if (response && response.status) {
this.status = response.status;
}
this.name = 'AxiosError';
}
[util.inspect.custom](): string {
let requestMessage = '';
if (this.config) {
let { data } = this.config;
try {
data = JSON.parse(data);
} catch (_) {} // eslint-disable-line
let requestData = '';
if (this.config.data) {
requestData = `
Request Data -
${indent(json(data))}`;
}
requestMessage = `
Request -
${this.config.method ? this.config.method.toUpperCase() : ''} ${
this.config.url
}
${requestData}`;
}
let responseMessage = '';
if (this.response) {
let responseData;
if (this.response.data) {
responseData = `
Response Data -
${indent(json(this.response.data))}`;
}
responseMessage = `
Response -
${this.response.status} ${this.response.statusText}
${responseData}`;
}
return `
${this.stack}
Error Message -
${this.message}
${requestMessage}
${responseMessage}
`;
}
}
export = AxiosError;