diff --git a/packages/angular_devkit/build_optimizer/src/build-optimizer/build-optimizer.ts b/packages/angular_devkit/build_optimizer/src/build-optimizer/build-optimizer.ts index 3095f1eb67..ed9ddfbca5 100644 --- a/packages/angular_devkit/build_optimizer/src/build-optimizer/build-optimizer.ts +++ b/packages/angular_devkit/build_optimizer/src/build-optimizer/build-optimizer.ts @@ -19,6 +19,7 @@ import { getScrubFileTransformer } from '../transforms/scrub-file'; const hasDecorators = /decorators/; const hasCtorParameters = /ctorParameters/; const hasTsHelpers = /var (__extends|__decorate|__metadata|__param) = /; +const isAngularPackage = /(\\|\/)node_modules(\\|\/)@angular(\\|\/)/; export interface BuildOptimizerOptions { content?: string; @@ -50,15 +51,22 @@ export function buildOptimizer(options: BuildOptimizerOptions): getTransforms.push(getImportTslibTransformer); } - - if (hasDecorators.test(content) || hasCtorParameters.test(content)) { + if (inputFilePath && isAngularPackage.test(inputFilePath)) { // Order matters, getPrefixFunctionsTransformer needs to be called before // getFoldFileTransformer. - getTransforms.push(...[ + getTransforms.push( + // getPrefixFunctionsTransformer is rather dangerous. + // It will mark both `require()` calls and `console.log(stuff)` as pure. + // We only apply it to @angular/* packages, since we know they are safe. getPrefixFunctionsTransformer, getScrubFileTransformer, getFoldFileTransformer, - ]); + ); + } else if (hasDecorators.test(content) || hasCtorParameters.test(content)) { + getTransforms.push( + getScrubFileTransformer, + getFoldFileTransformer, + ); } if (getTransforms.length > 0) { diff --git a/packages/angular_devkit/build_optimizer/src/build-optimizer/build-optimizer_spec.ts b/packages/angular_devkit/build_optimizer/src/build-optimizer/build-optimizer_spec.ts index c7cc3f7e9c..560f60b7a7 100644 --- a/packages/angular_devkit/build_optimizer/src/build-optimizer/build-optimizer_spec.ts +++ b/packages/angular_devkit/build_optimizer/src/build-optimizer/build-optimizer_spec.ts @@ -40,10 +40,11 @@ describe('build-optimizer', () => { `; // tslint:enable:max-line-length - expect(oneLine`${buildOptimizer({ content: input }).content}`).toEqual(output); + const inputFilePath = '/node_modules/@angular/some-lib'; + expect(oneLine`${buildOptimizer({ content: input, inputFilePath }).content}`).toEqual(output); }); - it('doesn\'t process files without decorators/ctorParameters', () => { + it('doesn\'t process files without decorators/ctorParameters/outside Angular', () => { const input = oneLine` var Clazz = (function () { function Clazz() { } return Clazz; }()); ${staticProperty} diff --git a/packages/angular_devkit/build_optimizer/src/build-optimizer/webpack-loader.ts b/packages/angular_devkit/build_optimizer/src/build-optimizer/webpack-loader.ts index 0d02b8551d..56a0738d75 100644 --- a/packages/angular_devkit/build_optimizer/src/build-optimizer/webpack-loader.ts +++ b/packages/angular_devkit/build_optimizer/src/build-optimizer/webpack-loader.ts @@ -21,7 +21,11 @@ export default function buildOptimizerLoader this.cacheable(); const options: BuildOptimizerLoaderOptions = loaderUtils.getOptions(this) || {}; - const boOutput = buildOptimizer({ content, emitSourceMap: options.sourceMap }); + const boOutput = buildOptimizer({ + content, + inputFilePath: this.resourcePath, + emitSourceMap: options.sourceMap, + }); const intermediateSourceMap = boOutput.sourceMap; let newContent = boOutput.content;