UNPKG

@icapps/tree-house-errors

Version:

NodeJS default error definitions with an error parser utility function

84 lines (83 loc) 3.75 kB
"use strict"; 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;