diff --git a/packages/core/injector/instance-wrapper.ts b/packages/core/injector/instance-wrapper.ts index 7c8b93a07e3..958a515a26e 100644 --- a/packages/core/injector/instance-wrapper.ts +++ b/packages/core/injector/instance-wrapper.ts @@ -210,8 +210,10 @@ export class InstanceWrapper<T = any> { } const isTreeNonDurable = this.introspectDepsAttribute( (collection, registry) => - collection.every( - (item: InstanceWrapper) => !item.isDependencyTreeDurable(registry), + collection.some( + (item: InstanceWrapper) => + !item.isDependencyTreeStatic() && + !item.isDependencyTreeDurable(registry), ), lookupRegistry, ); diff --git a/packages/core/test/injector/instance-wrapper.spec.ts b/packages/core/test/injector/instance-wrapper.spec.ts index d5ab67c15bc..d6ab2c9d4d7 100644 --- a/packages/core/test/injector/instance-wrapper.spec.ts +++ b/packages/core/test/injector/instance-wrapper.spec.ts @@ -152,6 +152,26 @@ describe('InstanceWrapper', () => { expect(wrapper.isDependencyTreeDurable()).to.be.true; }); }); + describe('when one is not static, durable and non durable', () => { + it('should return false', () => { + const wrapper = new InstanceWrapper(); + wrapper.addCtorMetadata(0, new InstanceWrapper()); + wrapper.addCtorMetadata( + 1, + new InstanceWrapper({ + scope: Scope.REQUEST, + durable: true, + }), + ); + wrapper.addCtorMetadata( + 2, + new InstanceWrapper({ + scope: Scope.REQUEST, + }), + ); + expect(wrapper.isDependencyTreeDurable()).to.be.false; + }); + }); }); describe('properties', () => { describe('when each is static', () => { @@ -184,6 +204,21 @@ describe('InstanceWrapper', () => { expect(wrapper.isDependencyTreeDurable()).to.be.true; }); }); + describe('when one is not static, non durable and durable', () => { + it('should return false', () => { + const wrapper = new InstanceWrapper(); + wrapper.addPropertiesMetadata( + 'key1', + new InstanceWrapper({ scope: Scope.REQUEST, durable: true }), + ); + wrapper.addPropertiesMetadata('key2', new InstanceWrapper()); + wrapper.addPropertiesMetadata( + 'key3', + new InstanceWrapper({ scope: Scope.REQUEST }), + ); + expect(wrapper.isDependencyTreeDurable()).to.be.false; + }); + }); }); describe('enhancers', () => { describe('when each is static', () => { @@ -214,6 +249,19 @@ describe('InstanceWrapper', () => { expect(wrapper.isDependencyTreeDurable()).to.be.true; }); }); + describe('when one is not static, non durable and durable', () => { + it('should return false', () => { + const wrapper = new InstanceWrapper(); + wrapper.addEnhancerMetadata( + new InstanceWrapper({ scope: Scope.REQUEST, durable: true }), + ); + wrapper.addEnhancerMetadata(new InstanceWrapper()); + wrapper.addEnhancerMetadata( + new InstanceWrapper({ scope: Scope.REQUEST }), + ); + expect(wrapper.isDependencyTreeDurable()).to.be.false; + }); + }); }); }); });