diff --git a/package-lock.json b/package-lock.json index 62d0e1bb..2632a933 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "nestjs-i18n", - "version": "10.3.6", + "version": "10.3.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "nestjs-i18n", - "version": "10.3.6", + "version": "10.3.7", "license": "MIT", "dependencies": { "accept-language-parser": "^1.5.0", diff --git a/src/interceptors/i18n-language.interceptor.ts b/src/interceptors/i18n-language.interceptor.ts index 51b002bc..7bcdcf46 100644 --- a/src/interceptors/i18n-language.interceptor.ts +++ b/src/interceptors/i18n-language.interceptor.ts @@ -71,11 +71,13 @@ export class I18nLanguageInterceptor implements NestInterceptor { ctx.i18nContext = new I18nContext(ctx.i18nLang, this.i18nService); if (!this.i18nOptions.skipAsyncHook) { - return I18nContext.createAsync(ctx.i18nContext, async (error) => { - if (error) { - throw error; - } - return next.handle(); + return new Observable((observer) => { + I18nContext.createAsync(ctx.i18nContext, async (error) => { + if (error) { + throw error; + } + return next.handle().subscribe(observer); + }); }); } } diff --git a/tests/app/controllers/hello.controller.ts b/tests/app/controllers/hello.controller.ts index 214834c1..731cabd9 100644 --- a/tests/app/controllers/hello.controller.ts +++ b/tests/app/controllers/hello.controller.ts @@ -7,6 +7,7 @@ import { Render, UseFilters, UseGuards, + UseInterceptors, } from '@nestjs/common'; import { GrpcMethod, Payload } from '@nestjs/microservices'; import { @@ -21,7 +22,8 @@ import { CreateUserDto } from '../dto/create-user.dto'; import { TestException, TestExceptionFilter } from '../filter/test.filter'; import { TestGuard } from '../guards/test.guard'; import { Hero, HeroById } from '../interfaces/hero.interface'; -import {exampleErrorFormatter, exampleResponseBodyFormatter} from '../examples/example.functions'; +import { exampleErrorFormatter, exampleResponseBodyFormatter } from '../examples/example.functions'; +import { TestInterceptor } from '../interceptors/test.interceptor'; @Controller('hello') @UseFilters(new TestExceptionFilter()) @@ -87,6 +89,12 @@ export class HelloController { return I18nContext.current().translate('test.HELLO'); } + @Get('/request-scope/additional-interceptor') + @UseInterceptors(TestInterceptor) + helloRequestScopeAdditionalInterceptor(): any { + return I18nContext.current().translate('test.HELLO'); + } + @Get('/request-scope/typed') helloRequestScopeTyped(): string { return I18nContext.current().translate('test.HELLO'); @@ -189,10 +197,10 @@ export class HelloController { @Post('/validation-custom-response-body-formatter') @UseFilters( - new I18nValidationExceptionFilter({ - responseBodyFormatter: exampleResponseBodyFormatter, - errorFormatter: exampleErrorFormatter, - }), + new I18nValidationExceptionFilter({ + responseBodyFormatter: exampleResponseBodyFormatter, + errorFormatter: exampleErrorFormatter, + }), ) validationResponseBodyFormatter(@Body() createUserDto: CreateUserDto): any { return 'This action adds a new user'; diff --git a/tests/app/interceptors/test.interceptor.ts b/tests/app/interceptors/test.interceptor.ts new file mode 100644 index 00000000..bb7d13fc --- /dev/null +++ b/tests/app/interceptors/test.interceptor.ts @@ -0,0 +1,14 @@ +import { + CallHandler, + ExecutionContext, + Injectable, + NestInterceptor, +} from '@nestjs/common'; +import { Observable } from 'rxjs'; + +@Injectable() +export class TestInterceptor implements NestInterceptor { + intercept(_: ExecutionContext, next: CallHandler): Observable { + return next.handle(); + } +} diff --git a/tests/i18n-disable-middleware.e2e.spec.ts b/tests/i18n-disable-middleware.e2e.spec.ts index f88599f8..6d68d045 100644 --- a/tests/i18n-disable-middleware.e2e.spec.ts +++ b/tests/i18n-disable-middleware.e2e.spec.ts @@ -43,6 +43,14 @@ describe('i18n module e2e no middleware', () => { await request(app.getHttpServer()).get('/hello/guard?lang=nl').expect(500); }); + it(`/GET hello/request-scope/additional-interceptor should return translation`, () => { + return request(app.getHttpServer()) + .get('/hello/request-scope/additional-interceptor') + .set('accept-language', 'fr-FR') + .expect(200) + .expect('Bonjour'); + }); + afterAll(async () => { await app.close(); });