UNPKG

http-errors-plus

Version:

Next-gen HTTP error handling for modern JavaScript and TypeScript apps — structured, overrideable, and developer-focused.

192 lines (191 loc) 5.08 kB
"use strict"; Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); 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 }); } exports.BASE_HTTP_ERRORS = BASE_HTTP_ERRORS; exports.HttpError = HttpError; exports.generateError = generateError; //# sourceMappingURL=index.cjs.map