From 813d8a852c35166b13cf032544c9115cbdcf282d Mon Sep 17 00:00:00 2001 From: Hans Larsen Date: Tue, 17 Jan 2017 15:13:27 -0800 Subject: [PATCH] fix(@ngtools/webpack): dont error on non-identifier properties. --- packages/@ngtools/webpack/src/loader.spec.ts | 27 +++++++++++++++ packages/@ngtools/webpack/src/loader.ts | 4 +-- packages/@ngtools/webpack/src/refactor.ts | 2 +- .../acceptance/ngtools-webpack-loader.spec.ts | 33 ------------------- 4 files changed, 30 insertions(+), 36 deletions(-) create mode 100644 packages/@ngtools/webpack/src/loader.spec.ts delete mode 100644 tests/acceptance/ngtools-webpack-loader.spec.ts diff --git a/packages/@ngtools/webpack/src/loader.spec.ts b/packages/@ngtools/webpack/src/loader.spec.ts new file mode 100644 index 000000000000..7e39c2c8224a --- /dev/null +++ b/packages/@ngtools/webpack/src/loader.spec.ts @@ -0,0 +1,27 @@ +import * as ts from 'typescript'; +import {removeModuleIdOnlyForTesting} from './loader'; +import {WebpackCompilerHost} from './compiler_host'; +import {TypeScriptFileRefactor} from './refactor'; + +describe('@ngtools/webpack', () => { + describe('loader', () => { + describe('removeModuleId', () => { + it('should work', () => { + const host = new WebpackCompilerHost({}, ''); + host.writeFile('/file.ts', ` + export const obj = { moduleId: 123 }; + export const obj2 = { moduleId: 123, otherValue: 1 }; + export const obj2 = { otherValue: 1, moduleId: 123 }; + `, false); + + const program = ts.createProgram(['/file.ts'], {}, host); + + const refactor = new TypeScriptFileRefactor('/file.ts', host, program); + removeModuleIdOnlyForTesting(refactor); + + expect(refactor.sourceText).toMatch(/obj = \{\s+};/); + expect(refactor.sourceText).toMatch(/obj2 = \{\s*otherValue: 1\s*};/); + }); + }); + }); +}); diff --git a/packages/@ngtools/webpack/src/loader.ts b/packages/@ngtools/webpack/src/loader.ts index 8d183d854f70..7c69ce292342 100644 --- a/packages/@ngtools/webpack/src/loader.ts +++ b/packages/@ngtools/webpack/src/loader.ts @@ -97,10 +97,10 @@ function _removeModuleId(refactor: TypeScriptFileRefactor) { refactor.findAstNodes(sourceFile, ts.SyntaxKind.ObjectLiteralExpression, true) // Get all their property assignments. .filter((node: ts.ObjectLiteralExpression) => - node.properties.some(prop => prop.name.getText() == 'moduleId')) + node.properties.some(prop => _getContentOfKeyLiteral(sourceFile, prop.name) == 'moduleId')) .forEach((node: ts.ObjectLiteralExpression) => { const moduleIdProp = node.properties.filter((prop: ts.ObjectLiteralElement, idx: number) => { - return prop.name.getText() == 'moduleId'; + return _getContentOfKeyLiteral(sourceFile, prop.name) == 'moduleId'; })[0]; // get the trailing comma const moduleIdCommaProp = moduleIdProp.parent.getChildAt(1).getChildren()[1]; diff --git a/packages/@ngtools/webpack/src/refactor.ts b/packages/@ngtools/webpack/src/refactor.ts index 276c807a7fdd..105920bb65a2 100644 --- a/packages/@ngtools/webpack/src/refactor.ts +++ b/packages/@ngtools/webpack/src/refactor.ts @@ -170,7 +170,7 @@ export class TypeScriptFileRefactor { } removeNodes(...nodes: ts.Node[]) { - nodes.forEach(node => this.removeNode(node)); + nodes.forEach(node => node && this.removeNode(node)); } replaceNode(node: ts.Node, replacement: string) { diff --git a/tests/acceptance/ngtools-webpack-loader.spec.ts b/tests/acceptance/ngtools-webpack-loader.spec.ts deleted file mode 100644 index 51381c6c19cb..000000000000 --- a/tests/acceptance/ngtools-webpack-loader.spec.ts +++ /dev/null @@ -1,33 +0,0 @@ -'use strict'; - -// This needs to be first so fs module can be mocked correctly. -import { expect } from 'chai'; - -import { removeModuleIdOnlyForTesting } from '../../packages/@ngtools/webpack/src/loader'; - -describe('@ngtools webpack loader: ', () => { - describe('removeModuleId', () => { - let refactor: any; - let moduleIdProp: any; - let commaProp: any; - let removeNodesArgs: any; - beforeEach(() => { - commaProp = { isCommaProp: true }; - moduleIdProp = { - name: { getText: () => 'moduleId' }, - parent: { getChildAt: () => ({ getChildren: (): any => [{}, commaProp] }) } - }; - refactor = { - sourceFile: 'sourceFile', - findAstNodes: (): any => [{ properties: [moduleIdProp] }], - removeNodes: (...args: any[]) => { removeNodesArgs = args; } - }; - }); - - it('should remove "moduleId: module.id"', () => { - removeModuleIdOnlyForTesting(refactor); - expect(removeNodesArgs[0]).to.equal(moduleIdProp); - expect(removeNodesArgs[1]).to.equal(commaProp); - }); - }); -});