/** * @public */ declare const OriginalErrors: { readonly 400: "BadRequest"; readonly 401: "Unauthorized"; readonly 402: "PaymentRequired"; readonly 403: "Forbidden"; readonly 404: "NotFound"; readonly 405: "MethodNotAllowed"; readonly 406: "NotAcceptable"; readonly 407: "ProxyAuthenticationRequired"; readonly 408: "RequestTimeout"; readonly 409: "Conflict"; readonly 410: "Gone"; readonly 411: "LengthRequired"; readonly 412: "PreconditionFailed"; readonly 413: "PayloadTooLarge"; readonly 414: "URITooLong"; readonly 415: "UnsupportedMediaType"; readonly 416: "RequestedRangeNotSatisfiable"; readonly 417: "ExpectationFailed"; readonly 418: "ImATeapot"; readonly 421: "MisdirectedRequest"; readonly 422: "UnprocessableEntity"; readonly 423: "Locked"; readonly 424: "FailedDependency"; readonly 425: "UnorderedCollection"; readonly 426: "UpgradeRequired"; readonly 428: "PreconditionRequired"; readonly 429: "TooManyRequests"; readonly 431: "RequestHeaderFieldsTooLarge"; readonly 451: "UnavailableForLegalReasons"; readonly 500: "InternalServerError"; readonly 501: "NotImplemented"; readonly 502: "BadGateway"; readonly 503: "ServiceUnavailable"; readonly 504: "GatewayTimeout"; readonly 505: "HTTPVersionNotSupported"; readonly 506: "VariantAlsoNegotiates"; readonly 507: "InsufficientStorage"; readonly 508: "LoopDetected"; readonly 510: "NotExtended"; readonly 511: "NetworkAuthenticationRequired"; }; type OriginalErrors = typeof OriginalErrors; /** * HTTP centric error inherited from the native Error constructor. * @public */ declare class HttpError extends Error { /** * HTTP status code. */ readonly status: S; /** * Name inferred from status code. * https://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html#sec6.1.1 */ readonly name: S extends keyof OriginalErrors ? OriginalErrors[S] : S extends keyof RefletHttp.CustomErrors ? RefletHttp.CustomErrors[S] : 'HttpError'; constructor(...args: S extends keyof RefletHttp.ErrorParams ? [status: S, data: RefletHttp.ErrorParams[S]] : [status: S, message?: string]); /** * Type guard to ensure the error object is an instance of HttpError and has specific status. */ static isInstance(err: unknown, status?: S | S[]): err is _HttpError; /** * Retrieves error status code from generic objects if any has one between 400 and 599. * Looks for `status` or `statusCode` property. * * Useful to get status code from either error object or response object: * ```ts * const statusCode = HttpError.getStatus(err, res) || 500 * ``` */ static getStatus(...objs: unknown[]): number | undefined; /** * `400` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/400 */ static BadRequest(...args: ErrParams<400>): _HttpError<400>; /** * `401` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401 */ static Unauthorized(...args: ErrParams<401>): _HttpError<401>; /** * `402` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/402 */ static PaymentRequired(...args: ErrParams<402>): _HttpError<402>; /** * `403` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403 */ static Forbidden(...args: ErrParams<403>): _HttpError<403>; /** * `404` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404 */ static NotFound(...args: ErrParams<404>): _HttpError<404>; /** * `405` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/405 */ static MethodNotAllowed(...args: ErrParams<405>): _HttpError<405>; /** * `406` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/406 */ static NotAcceptable(...args: ErrParams<406>): _HttpError<406>; /** * `407` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/407 */ static ProxyAuthenticationRequired(...args: ErrParams<407>): _HttpError<407>; /** * `408` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408 */ static RequestTimeout(...args: ErrParams<408>): _HttpError<408>; /** * `409` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/409 */ static Conflict(...args: ErrParams<409>): _HttpError<409>; /** * `410` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/410 */ static Gone(...args: ErrParams<410>): _HttpError<410>; /** * `411` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/411 */ static LengthRequired(...args: ErrParams<411>): _HttpError<411>; /** * `412` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/412 */ static PreconditionFailed(...args: ErrParams<412>): _HttpError<412>; /** * `413` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/413 */ static PayloadTooLarge(...args: ErrParams<413>): _HttpError<413>; /** * `414` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/414 */ static URITooLong(...args: ErrParams<414>): _HttpError<414>; /** * `415` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/415 */ static UnsupportedMediaType(...args: ErrParams<415>): _HttpError<415>; /** * `416` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/416 */ static RequestedRangeNotSatisfiable(...args: ErrParams<416>): _HttpError<416>; /** * `417` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/417 */ static ExpectationFailed(...args: ErrParams<417>): _HttpError<417>; /** * `418` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/418 */ static ImATeapot(...args: ErrParams<418>): _HttpError<418>; /** * `421` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/421 */ static MisdirectedRequest(...args: ErrParams<421>): _HttpError<421>; /** * `422` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/422 */ static UnprocessableEntity(...args: ErrParams<422>): _HttpError<422>; /** * `423` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/423 */ static Locked(...args: ErrParams<423>): _HttpError<423>; /** * `424` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/424 */ static FailedDependency(...args: ErrParams<424>): _HttpError<424>; /** * `425` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/425 */ static UnorderedCollection(...args: ErrParams<425>): _HttpError<425>; /** * `426` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/426 */ static UpgradeRequired(...args: ErrParams<426>): _HttpError<426>; /** * `428` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/428 */ static PreconditionRequired(...args: ErrParams<428>): _HttpError<428>; /** * `429` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429 */ static TooManyRequests(...args: ErrParams<429>): _HttpError<429>; /** * `431` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/431 */ static RequestHeaderFieldsTooLarge(...args: ErrParams<431>): _HttpError<431>; /** * `451` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/451 */ static UnavailableForLegalReasons(...args: ErrParams<451>): _HttpError<451>; /** * `500` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500 */ static InternalServerError(...args: ErrParams<500>): _HttpError<500>; /** * `501` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/501 */ static NotImplemented(...args: ErrParams<501>): _HttpError<501>; /** * `502` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/502 */ static BadGateway(...args: ErrParams<502>): _HttpError<502>; /** * `503` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/503 */ static ServiceUnavailable(...args: ErrParams<503>): _HttpError<503>; /** * `504` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504 */ static GatewayTimeout(...args: ErrParams<504>): _HttpError<504>; /** * `505` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/505 */ static HTTPVersionNotSupported(...args: ErrParams<505>): _HttpError<505>; /** * `506` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/506 */ static VariantAlsoNegotiates(...args: ErrParams<506>): _HttpError<506>; /** * `507` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/507 */ static InsufficientStorage(...args: ErrParams<507>): _HttpError<507>; /** * `508` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/508 */ static LoopDetected(...args: ErrParams<508>): _HttpError<508>; /** * `510` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/510 */ static NotExtended(...args: ErrParams<510>): _HttpError<510>; /** * `511` * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/511 */ static NetworkAuthenticationRequired(...args: ErrParams<511>): _HttpError<511>; } /** * @public */ type ErrParams = S extends keyof RefletHttp.ErrorParams ? [data: RefletHttp.ErrorParams[S]] : [message?: string]; /** * @public */ type StaticCustomErrors = { [K in RefletHttp.CustomErrors[keyof RefletHttp.CustomErrors]]: (...args: ErrParams>) => _HttpError>; }; /** * @public */ type CustomStatus = { [K in keyof RefletHttp.CustomErrors]: RefletHttp.CustomErrors[K] extends V ? K : never; }[keyof RefletHttp.CustomErrors]; /** * @public */ interface HttpErrorConstructor extends Pick { new (...args: S extends keyof RefletHttp.ErrorParams ? [status: S, data: RefletHttp.ErrorParams[S]] : [status: S, message?: string]): _HttpError; (...args: S extends keyof RefletHttp.ErrorParams ? [status: S, data: RefletHttp.ErrorParams[S]] : [status: S, message?: string]): _HttpError; } /** * HTTP centric error. * * @param status - HTTP error status code. * @param message - Custom message. * * @remarks * - Invocation with or without the `new` keyword. * - The error `name` is inferred from `status`, _e.g._ `400` gives `BadRequest`. * * --- * @example * ```ts * throw HttpError(400) * // --- * const err = HttpError.Forbidden('Access denied') * next(err) * ``` * --- * @class * @public */ declare const _HttpError: HttpErrorConstructor; type _HttpError = HttpError & (S extends keyof RefletHttp.ErrorParams ? Omit : {}); declare namespace _HttpError { /** * Available status codes. */ type Status = RefletHttp.ErrorConstraint extends { status: infer S extends number; } ? S : keyof OriginalErrors | keyof RefletHttp.CustomErrors; /** * Available error names. */ type Name = OriginalErrors[Extract] | RefletHttp.CustomErrors[Extract]; /** * Parameter for a specific error status. * _Useful if the error interface has been augmented._ */ type Param = ErrParams[0]; } export { _HttpError as HttpError }; declare global { namespace RefletHttp { /** * Whitelist or widen status codes. * @example * ```ts * declare global { * namespace RefletHttp { * interface ErrorConstraint { * status: 400 | 401 | 403 | 404 | 405 | 422 | 500 * } * } * } * ``` */ interface ErrorConstraint { } /** * Create custom errors with their own augmented parameter. * @example * ```ts * declare global { * namespace RefletHttp { * interface ErrorParams { * 405: { * message?: string * headers: { * allow: ('GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE')[] * } * } * * 429: { * message?: string * headers: { * 'retry-after': number * } * } * } * } * } * ``` */ interface ErrorParams { } /** * Adds custom errors, with their own static method. * You must then call `defineCustomErrors` in order to use the new static methods. * * @example * ```ts * declare global { * namespace RefletHttp { * interface CustomErrors { * 299: 'Aborted' * 420: 'EnhanceYourCalm' * } * } * } * * defineCustomErrors({ 299: 'Aborted', 420: 'EnhanceYourCalm' }) * ``` */ interface CustomErrors { } } } export declare function defineCustomErrors(errors: RefletHttp.CustomErrors): void;