@icapps/tree-house-errors
Version:
NodeJS default error definitions with an error parser utility function
84 lines (83 loc) • 3.75 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseJsonErrors = exports.parseErrors = exports.isApiError = exports.isJsonApiError = void 0;
const _ = require("lodash");
const safeJsonStringify = require("safe-json-stringify");
const errors_1 = require("./errors");
const errors_config_1 = require("../config/errors.config");
const defaults_config_1 = require("../config/defaults.config");
const translator_1 = require("./translator");
const isJsonApiError = (obj = {}) => _.has(obj, 'status') && _.has(obj, 'code') && _.has(obj, 'title') && _.has(obj, 'detail');
exports.isJsonApiError = isJsonApiError;
const isApiError = (err, type) => {
const isError = Object.getOwnPropertyDescriptor(err || {}, 'isApiError') && err.isApiError === true;
if (isError) {
if (!type)
return true;
return err.code === type.code;
}
return false;
};
exports.isApiError = isApiError;
function parseErrors(error = {}, translatorOptions) {
const metaData = {};
let parsedError = new errors_1.ApiError(defaults_config_1.errorDefaults.DEFAULT_HTTP_CODE, defaults_config_1.errorDefaults.DEFAULT_ERROR);
if (error instanceof Error) {
Object.assign(metaData, { stack: safeJsonStringify(error.stack) });
if (Object.getOwnPropertyDescriptor(error, 'schema') && Object.getOwnPropertyDescriptor(error, 'detail')) {
const errorData = error;
Object.assign(metaData, errorData);
}
}
if (error.name === 'ValidationError') {
parsedError = new errors_1.ValidationError(errors_config_1.errors.INVALID_INPUT, {
detail: error.details,
});
}
if (Object.getOwnPropertyDescriptor(error, 'joi')) {
const { isJoi = false, details } = error.joi || {};
if (isJoi) {
parsedError = new errors_1.ValidationError(errors_config_1.errors.INVALID_INPUT, {
detail: details,
});
}
}
if ((0, exports.isApiError)(error)) {
let translatedMessage = error.message;
if (translatorOptions) {
const translator = (0, translator_1.getTranslator)(translatorOptions.path, translatorOptions.defaultLocale);
try {
translatedMessage = translator.translate(error.i18n, translatorOptions === null || translatorOptions === void 0 ? void 0 : translatorOptions.language);
}
catch (_error) {
translatedMessage = error.message;
}
if (translatedMessage === error.i18n || translatedMessage == null) {
translatedMessage = error.message;
}
}
parsedError = Object.assign({}, error, { message: translatedMessage });
}
return {
id: parsedError.id,
status: parsedError.status,
code: parsedError.code,
title: parsedError.message,
detail: parsedError.detail || parsedError.message,
meta: Object.keys(metaData).length !== 0 ? metaData : undefined,
};
}
exports.parseErrors = parseErrors;
function parseJsonErrors(response) {
if (Object.getOwnPropertyDescriptor(response || {}, 'errors') && Array.isArray(response.errors)) {
return response.errors.reduce((acc, error) => {
if ((0, exports.isJsonApiError)(error)) {
const { status, code, title, detail, meta = {} } = error;
return [...acc, new errors_1.ApiError(status, { code, message: title }, { detail, stack: (meta || {}).stack })];
}
return acc;
}, []);
}
return [new errors_1.InternalServerError(errors_config_1.errors.INTERNAL_ERROR, { detail: response })];
}
exports.parseJsonErrors = parseJsonErrors;