exstack
Version:
A utility library designed to simplify and enhance Express.js applications.
131 lines (129 loc) • 4.11 kB
JavaScript
const require_status = require('../status.cjs');
//#region src/helps/http-error.ts
/**
* Get a human-readable error name from the HTTP status code.
* @param {number} status - The HTTP status code.
* @returns {string} - The formatted error name.
*/
const getErrorName = (status) => {
if (status < 400 || status > 511) return "HttpError";
const statusKey = require_status.HttpStatus[`${status}_NAME`];
if (!statusKey) return "HttpError";
const name = statusKey.toLowerCase().replace(/_/g, " ").replace(/\b\w/g, (char) => char.toUpperCase()).replace(/\s+/g, "");
return name.endsWith("Error") ? name : name.concat("Error");
};
/**
* Base class for handling HTTP errors.
* @extends {Error}
*/
var HttpError = class HttpError extends Error {
/**
* Creates an instance of `HTTPException`.
* @param status - HTTP status code for the exception. Defaults to 500.
* @param options - Additional options for the exception.
*/
constructor(status = require_status.HttpStatus.INTERNAL_SERVER_ERROR, options) {
super(typeof options.message === "string" ? options.message : getErrorName(status));
this.status = status;
this.options = options;
this.name = getErrorName(status);
Error.captureStackTrace(this, this.constructor);
}
/**
* Check if the given error is an instance of HttpError.
* @param {unknown} value - The error to check.
* @returns {boolean} - True if the error is an instance of HttpError, false otherwise.
*
* @example
* if (HttpError.isHttpError(error)) {
* // Handle the HttpError
* }
*/
static isHttpError = (value) => value instanceof HttpError;
/**
* Convert the HttpError instance to a Body object.
* @example
* const errorBody = new HttpError(404, {message: 'Not Found'}).body;
*/
get body() {
const { name: error, status } = this;
const { message, data = null, code = null } = this.options;
return {
status,
error,
message,
data,
code
};
}
/**
* Send the json of the error in an HTTP response.
* @param {Response} res - The Express response object.
*
* @example
* new HttpError(404, {message: 'Not Found'}).toJson(res);
*/
toJson = (res) => {
res.status(this.status).json(this.body);
};
};
/**
* Utility function to create custom error classes.
* @param status - HTTP status code.
* @returns - A new error class.
* @example
* const NotFoundError = createHttpErrorClass(HttpStatus.NOT_FOUND);
*/
const createHttpErrorClass = (status) => class extends HttpError {
constructor(message, options = {}) {
super(status, {
message,
...options
});
}
};
/**
* Represents a Bad Request HTTP error (400).
* @extends {HttpError}
*/
const BadRequestError = createHttpErrorClass(require_status.HttpStatus.BAD_REQUEST);
/**
* Represents a Conflict HTTP error (409).
* @extends {HttpError}
*/
const ConflictError = createHttpErrorClass(require_status.HttpStatus.CONFLICT);
/**
* Represents a Forbidden HTTP error (403).
* @extends {HttpError}
*/
const ForbiddenError = createHttpErrorClass(require_status.HttpStatus.FORBIDDEN);
/**
* Represents a Not Found HTTP error (404).
* @extends {HttpError}
*/
const NotFoundError = createHttpErrorClass(require_status.HttpStatus.NOT_FOUND);
/**
* Represents an UnAuthorized HTTP error (401).
* @extends {HttpError}
*/
const UnAuthorizedError = createHttpErrorClass(require_status.HttpStatus.UNAUTHORIZED);
/**
* Represents an Internal Server Error HTTP error (500).
* @extends {HttpError}
*/
const InternalServerError = createHttpErrorClass(require_status.HttpStatus.INTERNAL_SERVER_ERROR);
/**
* Represents an Content Too Larger Error HTTP error (413).
* @extends {HttpError}
*/
const ContentTooLargeError = createHttpErrorClass(require_status.HttpStatus.PAYLOAD_TOO_LARGE);
//#endregion
exports.BadRequestError = BadRequestError;
exports.ConflictError = ConflictError;
exports.ContentTooLargeError = ContentTooLargeError;
exports.ForbiddenError = ForbiddenError;
exports.HttpError = HttpError;
exports.InternalServerError = InternalServerError;
exports.NotFoundError = NotFoundError;
exports.UnAuthorizedError = UnAuthorizedError;
exports.createHttpErrorClass = createHttpErrorClass;