UNPKG

yasui

Version:

Lightweight Express-based framework for REST and web APIs

97 lines 6.54 kB
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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