yasui
Version:
Lightweight Express-based framework for REST and web APIs
97 lines • 6.54 kB
JavaScript
import kleur from 'kleur';
import { HttpCode, HttpCodeMap } from '../enums/index.js';
export class HttpError extends Error {
status;
constructor(status, message) {
super(message);
this.status = status;
}
}
export class ErrorResource {
url;
path;
method;
name;
message;
statusMessage;
status;
data;
constructor(err, req) {
this.url = `${req.protocol}://${req.headers.host}${req.originalUrl}`;
this.path = req.path;
this.method = req.method;
this.status = err.status || HttpCode.INTERNAL_SERVER_ERROR;
this.statusMessage = HttpCodeMap[this.status] || '';
this.message = err?.message || '';
this.name = err.constructor.name;
this.data = {};
this.setData(err);
}
toString() {
return `url: ${this.url}\n` +
`request: ${kleur.italic(`${this.method} ${this.path}`)}\n` +
`status: ${this.status} (${this.statusMessage})\n` +
`message: ${this.message}\n` +
`data: ${JSON.stringify(this.data, null, 2)}`;
}
setData(err) {
const otherKeys = Object.keys(err)
.filter(key => Object.keys(this).indexOf(key) === -1);
for (const key of otherKeys) {
this.data[key] = err[key];
}
}
}
export function ErrorResourceSchema(statusCode = 500) {
return {
type: 'object',
properties: {
url: {
type: 'string',
format: 'uri',
description: 'Request URL',
example: 'http://localhost:3000/api/tests'
},
path: {
type: 'string',
description: 'Request path',
example: '/api/tests'
},
method: {
type: 'string',
enum: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'],
description: 'HTTP method',
example: 'PUT'
},
name: {
type: 'string',
description: 'Error class name',
example: 'Error'
},
message: {
type: 'string',
description: 'Error message',
example: 'I just simulate an error.'
},
statusMessage: {
type: 'string',
description: 'HTTP status message',
example: HttpCodeMap[statusCode]
},
status: {
type: 'integer',
minimum: 100,
maximum: 599,
description: 'HTTP status code',
example: statusCode
},
data: {
type: 'object',
description: 'Additional error data and extended properties',
example: {}
}
}
};
}
;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IucmVzb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvZXJyb3IucmVzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFJMUQsTUFBTSxPQUFPLFNBQVUsU0FBUSxLQUFLO0lBSzNCLE1BQU0sQ0FBWTtJQUV6QixZQUFZLE1BQWdCLEVBQUUsT0FBZTtRQUMzQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sYUFBYTtJQUNqQixHQUFHLENBQVM7SUFDWixJQUFJLENBQVM7SUFDYixNQUFNLENBQVM7SUFDZixJQUFJLENBQVM7SUFDYixPQUFPLENBQVM7SUFDaEIsYUFBYSxDQUFTO0lBQ3RCLE1BQU0sQ0FBVztJQUNqQixJQUFJLENBQXlCO0lBRXBDLFlBQVksR0FBYyxFQUFFLEdBQVk7UUFDdEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxRQUFRLE1BQU0sR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JFLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQztRQUMzRCxJQUFJLENBQUMsYUFBYSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BELElBQUksQ0FBQyxPQUFPLEdBQUcs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