Skip to main content
Module

x/http_errors/mod.ts

Create HTTP Error for Deno
Latest
File
/*! * Copyright (c) 2020 Henry Zhuang * MIT Licensed */
import { Status, STATUS_TEXT } from "./deps.ts";
export abstract class HttpError extends Error { name: string; message: string; status: number; statusCode: number; expose: boolean = false; [key: string]: any constructor(code: number, message?: string) { super(message); if (!Status[code]) { throw TypeError(`Unknown HTTP Status Code \`${code}\``); } if (code < 400 || code >= 600) { throw TypeError( `Only 4xx or 5xx status codes allowed, but got \`${code}\``, ); } if (code >= 400 && code < 500) { this.expose = true; }
let className = Status[code]; if (!className.endsWith("Error")) { className += "Error"; } const msg = message != null ? message : STATUS_TEXT.get(code)!; this.message = msg; this.status = this.statusCode = code; this.name = className; (Error as any).captureStackTrace(this, this.constructor); Object.setPrototypeOf(this, new.target.prototype); }
toString() { return `${this.name} [${this.status}]: ${this.message}`; }
toJSON() { return { name: this.name, status: this.status, message: this.message, }; }}
class HttpErrorImpl extends HttpError {}
export interface Props { [key: string]: any;}
export interface IError extends Error { status: number; statusCode: number; expose: boolean; [key: string]: any;}
/** * Create a new HttpError. * * @returns {HttpError} * @public */
export function createError( status: number, message?: string, props?: Props,): HttpError;export function createError(status: number, props: Props): HttpError;export function createError(err: Error, props?: Props): IError;export function createError( status: any, message?: any, props?: Props,): HttpError | Error { let err; if (status instanceof Error) { err = status as IError; status = err.status || err.statusCode;
if ( typeof status !== "number" || (!Status[status] && (status < 400 || status >= 600)) ) { status = 500; }
props = message; } else if (typeof message === "string") { err = new HttpErrorImpl(status, message); (Error as any).captureStackTrace(err, createError); } else { props = message; err = new HttpErrorImpl(status); (Error as any).captureStackTrace(err, createError); }
if (!(err instanceof HttpError) || err.status !== status) { // add properties to generic error err.expose = status < 500; err.status = err.statusCode = status; }
if (props) { for (let key in props) { if (key !== "status") { err[key] = props[key]; } } }
return err;}