diff --git a/src/resolve/resolvable.ts b/src/resolve/resolvable.ts index 680097c13..3895ee009 100644 --- a/src/resolve/resolvable.ts +++ b/src/resolve/resolvable.ts @@ -23,7 +23,12 @@ import {ResolveContext} from "./resolveContext"; */ export class Resolvable { constructor(name: string, resolveFn: Function, preResolvedData?: any) { - extend(this, { name, resolveFn, deps: services.$injector.annotate(resolveFn), data: preResolvedData }); + extend(this, { + name, + resolveFn, + deps: services.$injector.annotate(resolveFn, services.$injector.strictDi), + data: preResolvedData + }); } name: string; diff --git a/src/resolve/resolveContext.ts b/src/resolve/resolveContext.ts index be137c7da..9a49bbe4e 100644 --- a/src/resolve/resolveContext.ts +++ b/src/resolve/resolveContext.ts @@ -73,7 +73,7 @@ export class ResolveContext { /** Inspects a function `fn` for its dependencies. Returns an object containing any matching Resolvables */ getResolvablesForFn(fn: IInjectable): { [key: string]: Resolvable } { - let deps = services.$injector.annotate( fn); + let deps = services.$injector.annotate( fn, services.$injector.strictDi); return pick(this.getResolvables(), deps); } diff --git a/test/resolveSpec.ts b/test/resolveSpec.ts index 6bcfd35b8..ca7f39155 100644 --- a/test/resolveSpec.ts +++ b/test/resolveSpec.ts @@ -54,7 +54,8 @@ beforeEach(function () { O: { resolve: { _O: function(_O2) { return _O2 + "O"; }, _O2: function(_O) { return _O + "O2"; } } }, P: { resolve: { $state: function($state) { return $state } }, Q: { resolve: { _Q: function($state) { counts._Q++; vals._Q = $state; return "foo"; }}} - } + }, + PAnnotated: { resolve: { $state: ['$state', function($state) { return $state }] } } }; var stateProps = ["resolve", "resolvePolicy"]; @@ -95,6 +96,48 @@ describe('Resolvables system:', function () { asyncCount = 0; })); + describe('strictDi support', function () { + let originalStrictDi: boolean; + let supportsStrictDi = false; + + beforeEach(inject(function ($injector) { + // not all angular versions support strictDi mode. + // here, we detect the feature + try { + $injector.annotate(() => {}, true); + } catch (e) { + supportsStrictDi = true; + } + + if (supportsStrictDi) { + originalStrictDi = $injector.strictDi; + $injector.strictDi = true; + } + })); + + afterEach(inject(function ($injector) { + if (supportsStrictDi) { + $injector.strictDi = originalStrictDi; + } + })); + + it('should throw when creating a resolvable with an unannotated fn and strictDi mode on', inject(function ($injector) { + if (supportsStrictDi) { + expect(() => { + makePath([ "P" ]); + }).toThrowError(/strictdi/); + } + }); + + it('should not throw when creating a resolvable with an annotated fn and strictDi mode on', inject(function ($injector) { + if (supportsStrictDi) { + expect(() => { + makePath([ "PAnnotated" ]); + }).not.toThrowError(/strictdi/); + } + }); + }); + describe('ResolveContext.resolvePathElement()', function () { it('should resolve all resolves in a PathElement', inject(function ($q) { let path = makePath([ "A" ]);