Skip to content

Commit 822314d

Browse files
committed
fix(injector): ensure transient context is reset to previous one to maintain old state
ref #651
1 parent 8ae437d commit 822314d

2 files changed

Lines changed: 33 additions & 2 deletions

File tree

packages/injector/src/injector.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -545,9 +545,11 @@ export class Injector {
545545
clear.push(`${varName} = undefined;`);
546546

547547
let setDestination = ``;
548+
let resetDestination = ``;
548549
if (code.needsDestination) {
549550
const tokenVar = compiler.reserveConst(prepared.token, 'token');
550-
setDestination = `runtimeContext.destination = { token: ${tokenVar} };`;
551+
setDestination = `const oldContext = runtimeContext.destination; runtimeContext.destination = { token: ${tokenVar} };`;
552+
resetDestination = `runtimeContext.destination = oldContext;`;
551553
}
552554

553555
let circularCheckBefore = '';
@@ -583,6 +585,7 @@ export class Injector {
583585
${code.code}
584586
${state}.count++;
585587
} finally {
588+
${resetDestination}
586589
${state}.creating = 0;
587590
}
588591
${circularCheckAfter}

packages/logger/tests/logger.spec.ts

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,35 @@ test('scope catches late changes', () => {
108108
expect(logger.memory.messageStrings).toEqual(['(database) test', '(database) test2', 'test3' ]);
109109
});
110110

111-
test('scoped logger', () => {
111+
test('scoped logger 1', () => {
112+
class MyProvider {
113+
constructor(public logger: ScopedLogger) {
114+
}
115+
}
116+
117+
class AnotherProvider {
118+
constructor(public myProvider: MyProvider, public logger: ScopedLogger) {
119+
}
120+
}
121+
122+
{
123+
const injector = Injector.from([
124+
MyProvider,
125+
AnotherProvider,
126+
Logger, // optional base logger used by ScopedLogger
127+
ScopedLogger,
128+
]);
129+
const logger = injector.get(Logger);
130+
expect(logger).toBeInstanceOf(Logger);
131+
132+
const anotherProvider = injector.get(AnotherProvider);
133+
expect(anotherProvider.logger).toBeInstanceOf(Logger);
134+
expect(anotherProvider.myProvider.logger.scope).toBe('MyProvider');
135+
expect(anotherProvider.logger.scope).toBe('AnotherProvider');
136+
}
137+
});
138+
139+
test('scoped logger 2', () => {
112140
class MyProvider {
113141
constructor(public logger: ScopedLogger) {
114142
}

0 commit comments

Comments
 (0)