UNPKG

@villedemontreal/general-utils

Version:
85 lines 3.03 kB
"use strict"; // ========================================== // Interfaces and classes related to errors // to be sent in response to an API request. // // It is recommended that you use the provided // builder to create an error. This builder can be // started by using the exported "createError()" // function. // // The structure of those errors is based on // https://github.com/Microsoft/api-guidelines/blob/master/Guidelines.md#7102-error-condition-responses // // ========================================== Object.defineProperty(exports, "__esModule", { value: true }); exports.ApiErrorAndInfo = exports.isApiErrorAndInfo = exports.isApiError = exports.isErrorResponse = exports.LogLevel = void 0; const _ = require("lodash"); const logLevel_1 = require("./logLevel"); Object.defineProperty(exports, "LogLevel", { enumerable: true, get: function () { return logLevel_1.LogLevel; } }); const utils_1 = require("./utils"); /** * Error Reponse Type Guard */ const isErrorResponse = (obj) => { return obj && utils_1.utils.isObjectStrict(obj) && 'error' in obj && (0, exports.isApiError)(obj.error); }; exports.isErrorResponse = isErrorResponse; /** * Error Type Guard */ const isApiError = (obj) => { if (!obj || !utils_1.utils.isObjectStrict(obj) || !('code' in obj) || !('message' in obj)) { return false; } // ========================================== // We make sure the object doesn't contain unknown // fields. Some third-party libraries such as // "mssql" will throw errors that do have a "code" // and "message" fields, but we don't want those errors // to be considered as IApiError! // ========================================== for (const key of Object.keys(obj)) { if (!_.includes(['code', 'message', 'target', 'details', 'innererror'], key)) { return false; } } return true; }; exports.isApiError = isApiError; /** * IApiErrorAndInfo Type Guard */ const isApiErrorAndInfo = (obj) => { return (obj && utils_1.utils.isObjectStrict(obj) && 'error' in obj && (0, exports.isApiError)(obj.error) && 'httpStatus' in obj && 'logMessage' in obj); }; exports.isApiErrorAndInfo = isApiErrorAndInfo; /** * Concrete error class to throw. It contains the actual error * to return and some extra info to help manage it. * * Since it extends the standard Node "Error" class, the stack trace will * be available. */ class ApiErrorAndInfo extends Error { constructor(error, logMessage, httpStatus, logLevel, logStackTrace) { super((() => { if (!_.isObject(logMessage)) { return logMessage; } return logMessage.msg || logMessage.message || ''; })()); this.error = error; this.logMessage = logMessage; this.httpStatus = httpStatus; this.logLevel = logLevel; this.logStackTrace = logStackTrace; } } exports.ApiErrorAndInfo = ApiErrorAndInfo; //# sourceMappingURL=apiError.js.map