@softkit/i18n
Version:
This library is a simple wrapper based on [nestjs-i18n](https://nestjs-i18n.com/)
80 lines • 3.33 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.I18nValidationExceptionFilter = void 0;
const tslib_1 = require("tslib");
const common_1 = require("@nestjs/common");
const iterare_1 = tslib_1.__importDefault(require("iterare"));
const i18n_context_1 = require("../i18n.context");
const interfaces_1 = require("../interfaces");
const utils_1 = require("../utils");
let I18nValidationExceptionFilter = class I18nValidationExceptionFilter {
constructor(options = {
detailedErrors: true,
}) {
this.options = options;
}
catch(exception, host) {
const i18n = i18n_context_1.I18nContext.current();
const errors = (0, utils_1.formatI18nErrors)(exception.errors ?? [], i18n?.service, {
lang: i18n?.lang,
});
const normalizedErrors = this.normalizeValidationErrors(errors);
const hostType = host.getType();
if (hostType === 'http') {
const response = host.switchToHttp().getResponse();
const responseBody = this.buildResponseBody(host, exception, normalizedErrors);
return response
.status(this.options.errorHttpStatusCode ?? exception.getStatus())
.send(responseBody);
}
else if (hostType === 'graphql') {
exception.errors = normalizedErrors;
return exception;
}
else {
return new Error(`Unsupported host type: ${host.getType()}`);
}
}
buildResponseBody(host, exc, errors) {
return 'responseBodyFormatter' in this.options &&
this.options.responseBodyFormatter
? this.options.responseBodyFormatter(host, exc, errors)
: {
statusCode: this.options.errorHttpStatusCode === undefined
? exc.getStatus()
: this.options.errorHttpStatusCode,
message: exc.getResponse(),
errors,
};
}
normalizeValidationErrors(validationErrors) {
if (this.isWithErrorFormatter(this.options) &&
!('detailedErrors' in this.options) &&
this.options.errorFormatter) {
return this.options.errorFormatter(validationErrors);
}
if (!this.isWithErrorFormatter(this.options) &&
!this.options.detailedErrors) {
return this.flattenValidationErrors(validationErrors);
}
return validationErrors;
}
flattenValidationErrors(validationErrors) {
return (0, iterare_1.default)(validationErrors)
.map((error) => (0, utils_1.mapChildrenToValidationErrors)(error))
.flatten()
.filter((item) => !!item.constraints)
.map((item) => Object.values(item.constraints ?? {}))
.flatten()
.toArray();
}
isWithErrorFormatter(options) {
return 'errorFormatter' in options;
}
};
exports.I18nValidationExceptionFilter = I18nValidationExceptionFilter;
exports.I18nValidationExceptionFilter = I18nValidationExceptionFilter = tslib_1.__decorate([
(0, common_1.Catch)(interfaces_1.I18nValidationException),
tslib_1.__metadata("design:paramtypes", [Object])
], I18nValidationExceptionFilter);
//# sourceMappingURL=i18n-validation-exception.filter.js.map