From 0343094b5109a958780f9144ba84b72b4d356a44 Mon Sep 17 00:00:00 2001 From: Lukas Kohler Date: Sun, 18 Feb 2018 23:01:24 +0100 Subject: [PATCH] Fix wrong used .reverse that caused the resolver order to change --- lib/metal/container.ts | 2 +- test/unit/metal/container-test.ts | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/metal/container.ts b/lib/metal/container.ts index 3f645fae..77d0a5b2 100644 --- a/lib/metal/container.ts +++ b/lib/metal/container.ts @@ -245,7 +245,7 @@ export class Container { let registrations = Object.keys(this.registry).filter((specifier) => { return specifier.startsWith(type); }); - let resolved = this.resolvers.reverse().reduce((entries, resolver) => { + let resolved = [...this.resolvers].reverse().reduce((entries, resolver) => { return entries.concat(resolver.availableForType(type)); }, []); return uniq(registrations.concat(resolved)).map((specifier) => specifier.split(':')[1]); diff --git a/test/unit/metal/container-test.ts b/test/unit/metal/container-test.ts index 967077d6..3fba59cb 100644 --- a/test/unit/metal/container-test.ts +++ b/test/unit/metal/container-test.ts @@ -82,4 +82,22 @@ test('availableForType() returns all registered instances of a type', async (t) t.deepEqual(container.availableForType('foo'), ['a', 'b', 'c', 'd']); }); +test('the resolver order should not be changed by lookup methods', async (t) => { + const container: Container = t.context.subject(); + + const loaderMock = (name : string) => ({ + retrieve: () => name, + loadRelative: () => name, + factories: new Map(), + }) as any; + + container.loadBundleScope(loaderMock('l1')); + container.loadBundleScope(loaderMock('l2')); + + t.deepEqual(container.lookup('foo:l1', { raw: true }), 'l1'); + container.availableForType('foo'); + t.deepEqual(container.lookup('foo:l1', { raw: true }), 'l1'); + t.deepEqual(container.lookup('foo:l1', { raw: true }), 'l1'); +}); + test.todo('fallsback to `fallbacks` specifiers if original specifier is not found');