diff --git a/src/__tests__/dependency-resolution.js b/src/__tests__/dependency-resolution.js index 6fbadaee..a57100b9 100644 --- a/src/__tests__/dependency-resolution.js +++ b/src/__tests__/dependency-resolution.js @@ -196,6 +196,61 @@ tape('dependency registration with aliases', t => { t.end(); }); +tape('dependency registration with aliasing non-plugins', t => { + const app = new App('el', el => el); + t.ok(app, 'creates an app'); + const counters = { + a: 0, + b: 0, + c: 0, + d: 0, + }; + + const ValueA = 'some-value'; + const AliasedValue = 'some-aliased-value'; + const ValueTokenA: string = createToken('ValueA'); + const AliasedTokenA: string = createToken('AliasedTokenA'); + const PluginB: FusionPlugin<{a: string}, BType> = createPlugin({ + deps: { + a: ValueTokenA, + }, + provides: deps => { + counters.b++; + t.equal(deps.a, 'some-value'); + t.equal(counters.b, 1, 'only instantiates once'); + return { + b: 'PluginB', + }; + }, + }); + + type PluginCType = FusionPlugin<{a: string}, CType>; + const PluginC: PluginCType = createPlugin({ + deps: { + a: ValueTokenA, + }, + provides: deps => { + counters.c++; + t.equal(deps.a, 'some-aliased-value'); + t.equal(counters.c, 1, 'only instantiates once'); + return { + c: 'PluginC', + }; + }, + }); + + app.register(ValueTokenA, ValueA); + app.register(TokenB, PluginB); + app.register(TokenC, PluginC).alias(ValueTokenA, AliasedTokenA); + app.register(AliasedTokenA, AliasedValue); + t.equal(counters.b, 0, 'does not instantiate until resolve is called'); + t.equal(counters.c, 0, 'does not instantiate until resolve is called'); + app.resolve(); + t.equal(counters.b, 1, 'only instantiates once'); + t.equal(counters.c, 1, 'only instantiates once'); + t.end(); +}); + tape('dependency registration with no token', t => { const app = new App('el', el => el); const PluginA: FusionPlugin = createPlugin({ diff --git a/src/base-app.js b/src/base-app.js index d6f1e770..8d073390 100644 --- a/src/base-app.js +++ b/src/base-app.js @@ -46,11 +46,15 @@ class FusionApp { const resolving = new Set(); const registered = this.registered; const resolvedPlugins = []; + const allAliases = new Set(); const resolveToken = (token, tokenAliases) => { // if we have already resolved the type, return it if (tokenAliases && tokenAliases.has(token)) { - token = tokenAliases.get(token); + const newToken = tokenAliases.get(token); + allAliases.add([token, newToken]); + token = newToken; } + if (resolved.has(token)) { return resolved.get(token); } @@ -116,6 +120,12 @@ class FusionApp { for (let i = 0; i < this.plugins.length; i++) { resolveToken(this.plugins[i]); } + for (const aliasPair of allAliases) { + const [sourceToken, destToken] = aliasPair; + if (dependedOn.has(sourceToken)) { + dependedOn.add(destToken); + } + } for (const token of nonPluginTokens) { if (!dependedOn.has(token)) { throw new Error(