2 var statuses = require('statuses');
3 var inherits = require('inherits');
5 function toIdentifier(str) {
6 return str.split(' ').map(function (token) {
7 return token.slice(0, 1).toUpperCase() + token.slice(1)
8 }).join('').replace(/[^ _0-9a-z]/gi, '')
11 exports = module.exports = function httpError() {
12 // so much arity going on ~_~
17 for (var i = 0; i < arguments.length; i++) {
18 var arg = arguments[i];
19 if (arg instanceof Error) {
21 status = err.status || err.statusCode || status;
37 if (typeof status !== 'number' || !statuses[status]) {
42 var HttpError = exports[status]
48 : new Error(msg || statuses[status])
49 Error.captureStackTrace(err, httpError)
52 if (!HttpError || !(err instanceof HttpError)) {
53 // add properties to generic error
54 err.expose = status < 500
55 err.status = err.statusCode = status
58 for (var key in props) {
59 if (key !== 'status' && key !== 'statusCode') {
67 // create generic error objects
68 var codes = statuses.codes.filter(function (num) {
72 codes.forEach(function (code) {
73 var name = toIdentifier(statuses[code])
74 var className = name.match(/Error$/) ? name : name + 'Error'
77 var ServerError = function ServerError(msg) {
78 var self = new Error(msg != null ? msg : statuses[code])
79 Error.captureStackTrace(self, ServerError)
80 self.__proto__ = ServerError.prototype
81 Object.defineProperty(self, 'name', {
89 inherits(ServerError, Error);
90 ServerError.prototype.status =
91 ServerError.prototype.statusCode = code;
92 ServerError.prototype.expose = false;
94 exports[name] = ServerError
98 var ClientError = function ClientError(msg) {
99 var self = new Error(msg != null ? msg : statuses[code])
100 Error.captureStackTrace(self, ClientError)
101 self.__proto__ = ClientError.prototype
102 Object.defineProperty(self, 'name', {
110 inherits(ClientError, Error);
111 ClientError.prototype.status =
112 ClientError.prototype.statusCode = code;
113 ClientError.prototype.expose = true;
115 exports[name] = ClientError
119 // backwards-compatibility
120 exports["I'mateapot"] = exports.ImATeapot