@villedemontreal/general-utils
Version:
General utilities library
85 lines • 3.03 kB
JavaScript
;
// ==========================================
// 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