Skip to content

Commit

Permalink
fix(compiler): improve error message for undefined providers (#13546)
Browse files Browse the repository at this point in the history
Closes #10835
  • Loading branch information
Dzmitry Shylovich authored and hansl committed Dec 28, 2016
1 parent 2c0c86e commit 6b02b80
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 1 deletion.
5 changes: 4 additions & 1 deletion modules/@angular/compiler/src/metadata_resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -862,11 +862,14 @@ export class CompileMetadataResolver {
} else {
provider = resolveForwardRef(provider);
let providerMeta: cpl.ProviderMeta;
if (provider && typeof provider == 'object' && provider.hasOwnProperty('provide')) {
if (provider && typeof provider === 'object' && provider.hasOwnProperty('provide')) {
this._validateProvider(provider);
providerMeta = new cpl.ProviderMeta(provider.provide, provider);
} else if (isValidType(provider)) {
providerMeta = new cpl.ProviderMeta(provider, {useClass: provider});
} else if (provider === void 0) {
this._reportError(new SyntaxError(
`Encountered undefined provider! Usually this means you have a circular dependencies (might be caused by using 'barrel' index.ts files.`));
} else {
const providersInfo =
(<string[]>providers.reduce(
Expand Down
10 changes: 10 additions & 0 deletions modules/@angular/compiler/test/metadata_resolver_spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,16 @@ export function main() {
SyntaxError, /Invalid provider for SimpleService. useClass cannot be undefined./);
}));

it('should throw with descriptive error message when provider is undefined',
inject([CompileMetadataResolver], (resolver: CompileMetadataResolver) => {
@NgModule({providers: [undefined]})
class SomeModule {
}

expect(() => resolver.loadNgModuleDirectiveAndPipeMetadata(SomeModule, true))
.toThrowError(SyntaxError, /Encountered undefined provider!/);
}));

it('should throw with descriptive error message when one of providers is not present',
inject([CompileMetadataResolver], (resolver: CompileMetadataResolver) => {
@NgModule({declarations: [MyBrokenComp3]})
Expand Down

1 comment on commit 6b02b80

@IgorMinar
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

note: do not cherry-pick to the patch branch because of a potential breaking change due to stricter behavior

Please sign in to comment.