http-handler-response
Version:
A simple response handler for HTTP requests.
1 lines • 9.77 kB
Source Map (JSON)
{"version":3,"file":"index.js","sources":["../lib/constants.ts","../lib/core/createModelMessage.ts","../lib/core/handler.ts","../lib/builder.ts"],"sourcesContent":["// 1xx\nexport const INFORMATIONAL = {\n 100: '100 - Continue',\n 101: '101 - Switching Protocols',\n 102: '102 - Processing',\n} as const\n\n// 2xx\nexport const SUCCESS = {\n 200: '200 - OK',\n 201: '201 - Created',\n 202: '202 - Accepted',\n 203: '203 - Non-authoritative Information',\n 204: '204 - No Content',\n 205: '205 - Reset Content',\n 206: '206 - Partial Content',\n 207: '207 - Multi-Status',\n 208: '208 - Already Reported',\n 209: '209 - IM Used',\n} as const\n\n// 3xx\nexport const REDIRECTION = {\n 300: '300 - Multiple Choices',\n 301: '301 - Moved Permanently',\n 302: '302 - Found',\n 303: '303 - See Other',\n 304: '304 - Not Modified',\n 305: '305 - Use Proxy',\n 307: '307 - Temporary Redirect',\n 308: '308 - Permanent Redirect',\n} as const\n\n// 4xx\nexport const CLIENT_ERROR = {\n 400: '400 - Bad Request',\n 401: '401 - Unauthorized',\n 402: '402 - Payment Required',\n 403: '403 - Forbidden',\n 404: '404 - Not Found',\n 405: '405 - Method Not Allowed',\n 406: '406 - Not Acceptable',\n 407: '407 - Proxy Authentication Required',\n 408: '408 - Request Timeout',\n 409: '409 - Conflict',\n 410: '410 - Gone',\n 411: '411 - Length Required',\n 412: '412 - Precondition Failed',\n 413: '413 - Payload Too Large',\n 414: '414 - Request-URI Too Long',\n 415: '415 - Unsupported Media Type',\n 416: '416 - Requested Range Not Satisfiable',\n 417: '417 - Expectation Failed',\n 418: \"418 - I'm a teapot\",\n 421: '421 - Misdirected Request',\n 422: '422 - Unprocessable Entity',\n 423: '423 - Locked',\n 424: '424 - Failed Dependency',\n 426: '426 - Upgrade Required',\n 428: '428 - Precondition Required',\n 429: '429 - Too Many Requests',\n 431: '431 - Request Header Fields Too Large',\n 444: '444 - Connection Closed Without Response',\n 451: '451 - Unavailable For Legal Reasons',\n 499: '499 - Client Closed Request',\n} as const\n\n// 5xx\nexport const SERVER_ERROR = {\n 500: '500 - Internal Server Error',\n 501: '501 - Not Implemented',\n 502: '502 - Bad Gateway',\n 503: '503 - Service Unavailable',\n 504: '504 - Gateway Timeout',\n 505: '505 - HTTP Version Not Supported',\n 506: '506 - Variant Also Negotiates',\n 507: '507 - Insufficient Storage',\n 508: '508 - Loop Detected',\n 510: '510 - Not Extended',\n 511: '511 - Network Authentication Required',\n 599: '599 - Network Connect Timeout Error',\n} as const\n\nexport const HTTP_CODES = {\n ...INFORMATIONAL,\n ...SUCCESS,\n ...REDIRECTION,\n ...CLIENT_ERROR,\n ...SERVER_ERROR,\n} as const\n","import { HTTP_CODES } from '../constants'\nimport { ICreateModelMessage, IModelMessage } from '../types'\n\n/**\n * @function createModelMessage\n *\n * @desc Assemble the default message header.\n *\n * @param code - HTTP status code 1xx to 5xx\n * @param title - Short and descriptive information\n */\nexport const createModelMessage = ({\n code,\n title,\n}: ICreateModelMessage): IModelMessage => {\n let model = { title: '', status: 0 }\n\n Object.entries(HTTP_CODES).forEach(([_code, _title]) => {\n if (Number(_code) === code || code === _title) {\n model = {\n status: Number(_code),\n title: title ?? _title.split(' - ')[1],\n }\n }\n })\n\n return model\n}\n","import { IHandler, IResponse } from '../types'\n\n/**\n * @function responseValidator\n *\n * @desc HTTP Response Instance Validator.\n *\n * @param response\n */\nconst validator = (response: IResponse) => ({\n status: {\n exist: response.status,\n isFunc: typeof response.status === 'function',\n },\n json: {\n exist: response.status && response.json,\n isFunc: typeof response.json === 'function',\n },\n body: {\n exist: response.status && response.body,\n isFunc: typeof response.body === 'function',\n },\n send: {\n exist: response.status && response.send,\n isFunc: typeof response.send === 'function',\n },\n app: {\n exist: response.app,\n },\n})\n\n/**\n * @function handler\n *\n * @desc Handling error for different response instances.\n *\n * @param response\n */\nexport const handler = ({ response, json }: IHandler) => {\n try {\n const validation = validator(response)\n\n if (validation.status.exist) {\n validation.status.isFunc\n ? response.status(json.status)\n : (response.status = json.status)\n }\n\n if (validation.json.exist) {\n validation.json.isFunc ? response.json(json) : (response.json = json)\n } else if (validation.app.exist) {\n response.type = 'json'\n validation.body.isFunc ? response.body(json) : (response.body = json)\n } else {\n validation.send.isFunc ? response.send(json) : (response.send = json)\n }\n\n return response\n } catch {\n throw new Error('The informed Response instance is not a valid model.')\n }\n}\n","import { createModelMessage, handler } from './core'\nimport {\n ICreateException,\n ICreateResponse,\n IResponse,\n IModelError,\n} from './types'\n\n/**\n * @function createException\n *\n * @desc Creates an error response following the RFC 7807 pattern.\n *\n * @param code - HTTP status code 4xx to 5xx\n * @param type - URL for a document describing the error condition\n * @param detail - Legible error description\n * @param instance - URI exclusive for or specific error\n * @param title - Short and descriptive information\n */\nexport const createException = ({\n code,\n title,\n type = 'about:blank',\n detail,\n instance,\n}: ICreateException): never => {\n throw Object.assign(createModelMessage({ code, title }), {\n type,\n detail,\n instance,\n })\n}\n\n/**\n * @function createResponse\n *\n * @desc Simple model for successful responses.\n *\n * @param response - HTTP Response Object\n * @param payload.code - HTTP status code 1xx to 3xx\n * @param payload.message - Legible action response\n * @param payload.data - Back Data\n * @param payload.title - Short and descriptive information\n */\nexport const createResponse = (\n response: IResponse,\n { code, message, data, title }: ICreateResponse,\n) =>\n handler({\n response,\n json: Object.assign(createModelMessage({ code, title }), {\n data,\n message,\n }),\n })\n\n/**\n * @function handlerError\n *\n * @desc Error handler.\n *\n * @param response - Response object instance\n * @param error - Error object instance\n */\nexport const handlerError = (response: IResponse, error: IModelError) =>\n handler({\n response,\n json: error.status\n ? error\n : {\n status: 500,\n title: 'Internal Server Error',\n detail: 'There was an internal problem on the server.',\n },\n })\n"],"names":["HTTP_CODES","Object","100","101","102","200","201","202","203","204","205","206","207","208","209","300","301","302","303","304","305","307","308","400","401","402","403","404","405","406","407","408","409","410","411","412","413","414","415","416","417","418","421","422","423","424","426","428","429","431","444","451","499","500","501","502","503","504","505","506","507","508","510","511","599","createModelMessage","code","title","model","status","entries","forEach","_code","_title","Number","split","handler","response","json","validation","exist","isFunc","body","send","app","validator","type","Error","detail","instance","assign","message","data","error"],"mappings":"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"}