http-errors-plus
Version:
Next-gen HTTP error handling for modern JavaScript and TypeScript apps — structured, overrideable, and developer-focused.
192 lines (191 loc) • 4.95 kB
JavaScript
function getDefaultExportFromCjs(x) {
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
}
const require$$0 = {
"100": "Continue",
"101": "Switching Protocols",
"102": "Processing",
"103": "Early Hints",
"200": "OK",
"201": "Created",
"202": "Accepted",
"203": "Non-Authoritative Information",
"204": "No Content",
"205": "Reset Content",
"206": "Partial Content",
"207": "Multi-Status",
"208": "Already Reported",
"226": "IM Used",
"300": "Multiple Choices",
"301": "Moved Permanently",
"302": "Found",
"303": "See Other",
"304": "Not Modified",
"305": "Use Proxy",
"307": "Temporary Redirect",
"308": "Permanent Redirect",
"400": "Bad Request",
"401": "Unauthorized",
"402": "Payment Required",
"403": "Forbidden",
"404": "Not Found",
"405": "Method Not Allowed",
"406": "Not Acceptable",
"407": "Proxy Authentication Required",
"408": "Request Timeout",
"409": "Conflict",
"410": "Gone",
"411": "Length Required",
"412": "Precondition Failed",
"413": "Payload Too Large",
"414": "URI Too Long",
"415": "Unsupported Media Type",
"416": "Range Not Satisfiable",
"417": "Expectation Failed",
"418": "I'm a Teapot",
"421": "Misdirected Request",
"422": "Unprocessable Entity",
"423": "Locked",
"424": "Failed Dependency",
"425": "Too Early",
"426": "Upgrade Required",
"428": "Precondition Required",
"429": "Too Many Requests",
"431": "Request Header Fields Too Large",
"451": "Unavailable For Legal Reasons",
"500": "Internal Server Error",
"501": "Not Implemented",
"502": "Bad Gateway",
"503": "Service Unavailable",
"504": "Gateway Timeout",
"505": "HTTP Version Not Supported",
"506": "Variant Also Negotiates",
"507": "Insufficient Storage",
"508": "Loop Detected",
"509": "Bandwidth Limit Exceeded",
"510": "Not Extended",
"511": "Network Authentication Required"
};
/*!
* statuses
* Copyright(c) 2014 Jonathan Ong
* Copyright(c) 2016 Douglas Christopher Wilson
* MIT Licensed
*/
var codes = require$$0;
var statuses = status;
status.message = codes;
status.code = createMessageToStatusCodeMap(codes);
status.codes = createStatusCodeList(codes);
status.redirect = {
300: true,
301: true,
302: true,
303: true,
305: true,
307: true,
308: true
};
status.empty = {
204: true,
205: true,
304: true
};
status.retry = {
502: true,
503: true,
504: true
};
function createMessageToStatusCodeMap(codes2) {
var map = {};
Object.keys(codes2).forEach(function forEachCode(code) {
var message = codes2[code];
var status2 = Number(code);
map[message.toLowerCase()] = status2;
});
return map;
}
function createStatusCodeList(codes2) {
return Object.keys(codes2).map(function mapCode(code) {
return Number(code);
});
}
function getStatusCode(message) {
var msg = message.toLowerCase();
if (!Object.prototype.hasOwnProperty.call(status.code, msg)) {
throw new Error('invalid status message: "' + message + '"');
}
return status.code[msg];
}
function getStatusMessage(code) {
if (!Object.prototype.hasOwnProperty.call(status.message, code)) {
throw new Error("invalid status code: " + code);
}
return status.message[code];
}
function status(code) {
if (typeof code === "number") {
return getStatusMessage(code);
}
if (typeof code !== "string") {
throw new TypeError("code must be a number or string");
}
var n = parseInt(code, 10);
if (!isNaN(n)) {
return getStatusMessage(n);
}
return getStatusCode(code);
}
const statuses$1 = /* @__PURE__ */ getDefaultExportFromCjs(statuses);
const STATUS_CODE_MAP = statuses$1.codes.reduce((acc, code) => {
const name = statuses$1.message[code].toUpperCase().replace(/[^A-Z0-9]+/g, "_");
acc[code] = {
code,
name,
message: statuses$1.message[code]
};
return acc;
}, {});
Object.values(STATUS_CODE_MAP).reduce((acc, { code, name, message }) => {
acc[name] = { code, name, message };
return acc;
}, {});
const BASE_HTTP_ERRORS = Object.fromEntries(
Object.values(STATUS_CODE_MAP).map(({ code, name, message }) => {
return [name, Object.freeze({ status: code, code: name, message })];
})
);
class HttpError extends Error {
/**
* @param {number} status
* @param {Omit<SerializedHttpError, 'status'>} options
*/
constructor(status2, options) {
super(options.message);
this.name = "HttpError";
this.meta = {
status: status2,
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
...options
};
}
/**
* @returns {SerializedHttpError}
*/
toJSON() {
return this.meta;
}
}
function generateError(base, override = {}) {
return new HttpError(base.status, {
code: base.code,
message: override.message || base.message,
...override
});
}
export {
BASE_HTTP_ERRORS,
HttpError,
generateError
};
//# sourceMappingURL=index.esm.js.map