diff --git a/packages/ngtools/webpack/src/transformers/elide_imports.ts b/packages/ngtools/webpack/src/transformers/elide_imports.ts index d243535319d5..d91b3c290fb9 100644 --- a/packages/ngtools/webpack/src/transformers/elide_imports.ts +++ b/packages/ngtools/webpack/src/transformers/elide_imports.ts @@ -85,7 +85,15 @@ export function elideImports( } else { switch (node.kind) { case ts.SyntaxKind.Identifier: - symbol = typeChecker.getSymbolAtLocation(node); + const parent = node.parent; + if (parent && ts.isShorthandPropertyAssignment(parent)) { + const shorthandSymbol = typeChecker.getShorthandAssignmentValueSymbol(parent); + if (shorthandSymbol) { + symbol = shorthandSymbol; + } + } else { + symbol = typeChecker.getSymbolAtLocation(node); + } break; case ts.SyntaxKind.ExportSpecifier: symbol = typeChecker.getExportSpecifierLocalTargetSymbol(node as ts.ExportSpecifier); diff --git a/packages/ngtools/webpack/src/transformers/elide_imports_spec.ts b/packages/ngtools/webpack/src/transformers/elide_imports_spec.ts index 6b3a5885433c..ffd13a6645f8 100644 --- a/packages/ngtools/webpack/src/transformers/elide_imports_spec.ts +++ b/packages/ngtools/webpack/src/transformers/elide_imports_spec.ts @@ -28,6 +28,7 @@ describe('@ngtools/webpack transformers', () => { const additionalFiles: Record = { 'const.ts': ` + export const animations = []; export const promise = () => null; export const take = () => null; export default promise; @@ -528,6 +529,44 @@ describe('@ngtools/webpack transformers', () => { expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); }); + + describe('NGTSC - ShorthandPropertyAssignment to PropertyAssignment', () => { + const transformShorthandPropertyAssignment = (context: ts.TransformationContext): ts.Transformer => { + const visit: ts.Visitor = node => { + if (ts.isShorthandPropertyAssignment(node)) { + return ts.createPropertyAssignment(node.name, node.name); + } + + return ts.visitEachChild(node, child => visit(child), context); + }; + + return node => ts.visitNode(node, visit); + }; + + it('should not elide import when ShorthandPropertyAssignment is transformed to PropertyAssignment', () => { + const input = tags.stripIndent` + import { animations } from './const'; + const used = { + animations + } + + ${dummyNode} + `; + + const output = tags.stripIndent` + import { animations } from './const'; + const used = { animations: animations }; + `; + + const { program, compilerHost } = createTypescriptContext(input, additionalFiles); + const result = transformTypescript(undefined, [ + transformShorthandPropertyAssignment, + transformer(program), + ], program, compilerHost); + + expect(tags.oneLine`${result}`).toEqual(tags.oneLine`${output}`); + }); + }); }); }); });