From 2c351a046df2105ef8ebf15212c0edc91e909446 Mon Sep 17 00:00:00 2001 From: Hans Larsen Date: Thu, 16 Nov 2017 16:17:19 -0800 Subject: [PATCH] fix(@ngtools/webpack): fix elide removing whole imports on single match If an import imports multiple symbols, the previous condition meant that the whole import statement was removed, instead of only the symbol. Fixes #8518. --- .../webpack/src/transformers/elide_imports.ts | 2 +- .../transformers/remove_decorators.spec.ts | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/packages/@ngtools/webpack/src/transformers/elide_imports.ts b/packages/@ngtools/webpack/src/transformers/elide_imports.ts index 1005e061b3af..a12bb030f77b 100644 --- a/packages/@ngtools/webpack/src/transformers/elide_imports.ts +++ b/packages/@ngtools/webpack/src/transformers/elide_imports.ts @@ -113,7 +113,7 @@ export function elideImports( }) .forEach((symbol) => { // Remove the whole declaration if it's a single import. - const nodeToRemove = symbol.singleImport ? symbol.importSpec : symbol.importDecl; + const nodeToRemove = symbol.singleImport ? symbol.importDecl : symbol.importSpec; ops.push(new RemoveNodeOperation(sourceFile, nodeToRemove)); }); diff --git a/packages/@ngtools/webpack/src/transformers/remove_decorators.spec.ts b/packages/@ngtools/webpack/src/transformers/remove_decorators.spec.ts index 3e30a0da0f3e..3fbfe4ad7203 100644 --- a/packages/@ngtools/webpack/src/transformers/remove_decorators.spec.ts +++ b/packages/@ngtools/webpack/src/transformers/remove_decorators.spec.ts @@ -108,5 +108,41 @@ describe('@ngtools/webpack transformers', () => { expect(oneLine`${result}`).toEqual(oneLine`${output}`); }); + + it('should not remove imports from types that are still used', () => { + const input = stripIndent` + import { Component, EventEmitter } from '@angular/core'; + + @Component({ + selector: 'app-root', + changeDetection: ChangeDetectionStrategy.OnPush, + templateUrl: './app.component.html', + styleUrls: ['./app.component.css'] + }) + export class AppComponent { + notify: EventEmitter = new EventEmitter(); + title = 'app'; + } + `; + const output = stripIndent` + import { EventEmitter } from '@angular/core'; + + export class AppComponent { + constructor() { + this.notify = new EventEmitter(); + this.title = 'app'; + } + } + `; + + const { program, compilerHost } = createTypescriptContext(input); + const transformer = removeDecorators( + () => true, + () => program.getTypeChecker(), + ); + const result = transformTypescript(undefined, [transformer], program, compilerHost); + + expect(oneLine`${result}`).toEqual(oneLine`${output}`); + }); }); });