Skip to content

Commit 7bbee8d

Browse files
committed
Merge pull request #2602 from matthewjh/strict-di
fix(src/resolve): use injector's strictDi value in calls to .annotate
2 parents bdb8327 + 4c5b5d8 commit 7bbee8d

File tree

3 files changed

+51
-3
lines changed

3 files changed

+51
-3
lines changed

src/resolve/resolvable.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,12 @@ import {ResolveContext} from "./resolveContext";
2323
*/
2424
export class Resolvable {
2525
constructor(name: string, resolveFn: Function, preResolvedData?: any) {
26-
extend(this, { name, resolveFn, deps: services.$injector.annotate(resolveFn), data: preResolvedData });
26+
extend(this, {
27+
name,
28+
resolveFn,
29+
deps: services.$injector.annotate(resolveFn, services.$injector.strictDi),
30+
data: preResolvedData
31+
});
2732
}
2833

2934
name: string;

src/resolve/resolveContext.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export class ResolveContext {
7373

7474
/** Inspects a function `fn` for its dependencies. Returns an object containing any matching Resolvables */
7575
getResolvablesForFn(fn: IInjectable): { [key: string]: Resolvable } {
76-
let deps = services.$injector.annotate(<Function> fn);
76+
let deps = services.$injector.annotate(<Function> fn, services.$injector.strictDi);
7777
return <any> pick(this.getResolvables(), deps);
7878
}
7979

test/resolveSpec.ts

+44-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ beforeEach(function () {
5454
O: { resolve: { _O: function(_O2) { return _O2 + "O"; }, _O2: function(_O) { return _O + "O2"; } } },
5555
P: { resolve: { $state: function($state) { return $state } },
5656
Q: { resolve: { _Q: function($state) { counts._Q++; vals._Q = $state; return "foo"; }}}
57-
}
57+
},
58+
PAnnotated: { resolve: { $state: ['$state', function($state) { return $state }] } }
5859
};
5960

6061
var stateProps = ["resolve", "resolvePolicy"];
@@ -95,6 +96,48 @@ describe('Resolvables system:', function () {
9596
asyncCount = 0;
9697
}));
9798

99+
describe('strictDi support', function () {
100+
let originalStrictDi: boolean;
101+
let supportsStrictDi = false;
102+
103+
beforeEach(inject(function ($injector) {
104+
// not all angular versions support strictDi mode.
105+
// here, we detect the feature
106+
try {
107+
$injector.annotate(() => {}, true);
108+
} catch (e) {
109+
supportsStrictDi = true;
110+
}
111+
112+
if (supportsStrictDi) {
113+
originalStrictDi = $injector.strictDi;
114+
$injector.strictDi = true;
115+
}
116+
}));
117+
118+
afterEach(inject(function ($injector) {
119+
if (supportsStrictDi) {
120+
$injector.strictDi = originalStrictDi;
121+
}
122+
}));
123+
124+
it('should throw when creating a resolvable with an unannotated fn and strictDi mode on', inject(function ($injector) {
125+
if (supportsStrictDi) {
126+
expect(() => {
127+
makePath([ "P" ]);
128+
}).toThrowError(/strictdi/);
129+
}
130+
});
131+
132+
it('should not throw when creating a resolvable with an annotated fn and strictDi mode on', inject(function ($injector) {
133+
if (supportsStrictDi) {
134+
expect(() => {
135+
makePath([ "PAnnotated" ]);
136+
}).not.toThrowError(/strictdi/);
137+
}
138+
});
139+
});
140+
98141
describe('ResolveContext.resolvePathElement()', function () {
99142
it('should resolve all resolves in a PathElement', inject(function ($q) {
100143
let path = makePath([ "A" ]);

0 commit comments

Comments
 (0)