UNPKG

http-errors-plus

Version:

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

1 lines 10.7 kB
{"version":3,"file":"index.cjs","sources":["../node_modules/statuses/index.js","../src/constants/index.js","../utils/http-error.js","../utils/generateError.js"],"sourcesContent":["/*!\n * statuses\n * Copyright(c) 2014 Jonathan Ong\n * Copyright(c) 2016 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n'use strict'\n\n/**\n * Module dependencies.\n * @private\n */\n\nvar codes = require('./codes.json')\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = status\n\n// status code to message map\nstatus.message = codes\n\n// status message (lower-case) to code map\nstatus.code = createMessageToStatusCodeMap(codes)\n\n// array of status codes\nstatus.codes = createStatusCodeList(codes)\n\n// status codes for redirects\nstatus.redirect = {\n 300: true,\n 301: true,\n 302: true,\n 303: true,\n 305: true,\n 307: true,\n 308: true\n}\n\n// status codes for empty bodies\nstatus.empty = {\n 204: true,\n 205: true,\n 304: true\n}\n\n// status codes for when you should retry the request\nstatus.retry = {\n 502: true,\n 503: true,\n 504: true\n}\n\n/**\n * Create a map of message to status code.\n * @private\n */\n\nfunction createMessageToStatusCodeMap (codes) {\n var map = {}\n\n Object.keys(codes).forEach(function forEachCode (code) {\n var message = codes[code]\n var status = Number(code)\n\n // populate map\n map[message.toLowerCase()] = status\n })\n\n return map\n}\n\n/**\n * Create a list of all status codes.\n * @private\n */\n\nfunction createStatusCodeList (codes) {\n return Object.keys(codes).map(function mapCode (code) {\n return Number(code)\n })\n}\n\n/**\n * Get the status code for given message.\n * @private\n */\n\nfunction getStatusCode (message) {\n var msg = message.toLowerCase()\n\n if (!Object.prototype.hasOwnProperty.call(status.code, msg)) {\n throw new Error('invalid status message: \"' + message + '\"')\n }\n\n return status.code[msg]\n}\n\n/**\n * Get the status message for given code.\n * @private\n */\n\nfunction getStatusMessage (code) {\n if (!Object.prototype.hasOwnProperty.call(status.message, code)) {\n throw new Error('invalid status code: ' + code)\n }\n\n return status.message[code]\n}\n\n/**\n * Get the status code.\n *\n * Given a number, this will throw if it is not a known status\n * code, otherwise the code will be returned. Given a string,\n * the string will be parsed for a number and return the code\n * if valid, otherwise will lookup the code assuming this is\n * the status message.\n *\n * @param {string|number} code\n * @returns {number}\n * @public\n */\n\nfunction status (code) {\n if (typeof code === 'number') {\n return getStatusMessage(code)\n }\n\n if (typeof code !== 'string') {\n throw new TypeError('code must be a number or string')\n }\n\n // '403'\n var n = parseInt(code, 10)\n if (!isNaN(n)) {\n return getStatusMessage(n)\n }\n\n return getStatusCode(code)\n}\n","import statuses from 'statuses';\n\n/**\n * @typedef {Object} StatusEntry\n * @property {number} code\n * @property {string} name\n * @property {string} message\n */\n\n/**\n * Maps HTTP status code to name/message\n * @type {Record<number, StatusEntry>}\n */\nexport const STATUS_CODE_MAP = statuses.codes.reduce((acc, code) => {\n const name = statuses.message[code].toUpperCase().replace(/[^A-Z0-9]+/g, '_');\n acc[code] = {\n code,\n name,\n message: statuses.message[code],\n };\n return acc;\n}, {});\n\n/**\n * Maps HTTP status name to code\n * @type {Record<string, StatusEntry>}\n */\nexport const STATUS_NAME_MAP = Object.values(STATUS_CODE_MAP).reduce((acc, { code, name, message }) => {\n acc[name] = { code, name, message };\n return acc;\n}, {});\n\n/**\n * @typedef {Object} HttpErrorConstant\n * @property {number} status - HTTP status code\n * @property {string} code - Uppercase constant name (e.g., NOT_FOUND)\n * @property {string} message - Human-readable HTTP message\n */\n\n/**\n * @typedef {{\n * CONTINUE: HttpErrorConstant,\n * SWITCHING_PROTOCOLS: HttpErrorConstant,\n * PROCESSING: HttpErrorConstant,\n * EARLY_HINTS: HttpErrorConstant,\n * OK: HttpErrorConstant,\n * CREATED: HttpErrorConstant,\n * ACCEPTED: HttpErrorConstant,\n * NON_AUTHORITATIVE_INFORMATION: HttpErrorConstant,\n * NO_CONTENT: HttpErrorConstant,\n * RESET_CONTENT: HttpErrorConstant,\n * PARTIAL_CONTENT: HttpErrorConstant,\n * MULTI_STATUS: HttpErrorConstant,\n * ALREADY_REPORTED: HttpErrorConstant,\n * IM_USED: HttpErrorConstant,\n * MULTIPLE_CHOICES: HttpErrorConstant,\n * MOVED_PERMANENTLY: HttpErrorConstant,\n * FOUND: HttpErrorConstant,\n * SEE_OTHER: HttpErrorConstant,\n * NOT_MODIFIED: HttpErrorConstant,\n * USE_PROXY: HttpErrorConstant,\n * TEMPORARY_REDIRECT: HttpErrorConstant,\n * PERMANENT_REDIRECT: HttpErrorConstant,\n * BAD_REQUEST: HttpErrorConstant,\n * UNAUTHORIZED: HttpErrorConstant,\n * PAYMENT_REQUIRED: HttpErrorConstant,\n * FORBIDDEN: HttpErrorConstant,\n * NOT_FOUND: HttpErrorConstant,\n * METHOD_NOT_ALLOWED: HttpErrorConstant,\n * NOT_ACCEPTABLE: HttpErrorConstant,\n * PROXY_AUTHENTICATION_REQUIRED: HttpErrorConstant,\n * REQUEST_TIMEOUT: HttpErrorConstant,\n * CONFLICT: HttpErrorConstant,\n * GONE: HttpErrorConstant,\n * LENGTH_REQUIRED: HttpErrorConstant,\n * PRECONDITION_FAILED: HttpErrorConstant,\n * PAYLOAD_TOO_LARGE: HttpErrorConstant,\n * URI_TOO_LONG: HttpErrorConstant,\n * UNSUPPORTED_MEDIA_TYPE: HttpErrorConstant,\n * RANGE_NOT_SATISFIABLE: HttpErrorConstant,\n * EXPECTATION_FAILED: HttpErrorConstant,\n * I_M_A_TEAPOT: HttpErrorConstant,\n * MISDIRECTED_REQUEST: HttpErrorConstant,\n * UNPROCESSABLE_ENTITY: HttpErrorConstant,\n * LOCKED: HttpErrorConstant,\n * FAILED_DEPENDENCY: HttpErrorConstant,\n * TOO_EARLY: HttpErrorConstant,\n * UPGRADE_REQUIRED: HttpErrorConstant,\n * PRECONDITION_REQUIRED: HttpErrorConstant,\n * TOO_MANY_REQUESTS: HttpErrorConstant,\n * REQUEST_HEADER_FIELDS_TOO_LARGE: HttpErrorConstant,\n * UNAVAILABLE_FOR_LEGAL_REASONS: HttpErrorConstant,\n * INTERNAL_SERVER_ERROR: HttpErrorConstant,\n * NOT_IMPLEMENTED: HttpErrorConstant,\n * BAD_GATEWAY: HttpErrorConstant,\n * SERVICE_UNAVAILABLE: HttpErrorConstant,\n * GATEWAY_TIMEOUT: HttpErrorConstant,\n * HTTP_VERSION_NOT_SUPPORTED: HttpErrorConstant,\n * VARIANT_ALSO_NEGOTIATES: HttpErrorConstant,\n * INSUFFICIENT_STORAGE: HttpErrorConstant,\n * LOOP_DETECTED: HttpErrorConstant,\n * BANDWIDTH_LIMIT_EXCEEDED: HttpErrorConstant,\n * NOT_EXTENDED: HttpErrorConstant,\n * NETWORK_AUTHENTICATION_REQUIRED: HttpErrorConstant,\n * }} BaseHttpErrors\n*/\n\n/**\n * @type {BaseHttpErrors}\n */\nexport const BASE_HTTP_ERRORS = Object.fromEntries(\n Object.values(STATUS_CODE_MAP).map(({ code, name, message }) => {\n return [name, Object.freeze({ status: code, code: name, message })];\n })\n);\n// /**\n// * Export default constants (e.g. NOT_FOUND, BAD_REQUEST)\n// * @type {Record<string, { status: number, code: string, message: string }>}\n// */","/**\n * @typedef {Object} SerializedHttpError\n * @property {number} status\n * @property {string} code\n * @property {string} message\n * @property {string} [detail]\n * @property {string} [path]\n * @property {string} [method]\n * @property {string} [timestamp]\n * @property {string} [requestId]\n * @property {string} [traceId]\n */\n\nexport class HttpError extends Error {\n /**\n * @param {number} status\n * @param {Omit<SerializedHttpError, 'status'>} options\n */\n constructor(status, options) {\n super(options.message);\n this.name = 'HttpError';\n\n /** @type {SerializedHttpError} */\n this.meta = {\n status,\n timestamp: new Date().toISOString(),\n ...options,\n };\n }\n\n /**\n * @returns {SerializedHttpError}\n */\n toJSON() {\n return this.meta;\n }\n}\n","import { HttpError } from './http-error.js';\n\n/**\n * @param {{ status: number, code: string, message: string }} base\n * @param {Partial<import('./http-error.js').SerializedHttpError>} [override]\n * @returns {HttpError}\n */\nexport function generateError(base, override = {}) {\n return new HttpError(base.status, {\n code: base.code,\n message: override.message || base.message,\n ...override,\n });\n}"],"names":["codes","status","statuses"],"mappings":"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","x_google_ignoreList":[0]}