From 7d9d833876e5650cf98e78b8a27c2ab0d1162d55 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Fri, 1 Jun 2018 12:56:32 +0100 Subject: [PATCH] fix(@angular-devkit/build-optimizer): don't exceed call stack with big files Related to https://github.com/Microsoft/TypeScript/issues/17033 Fix https://github.com/angular/angular-cli/issues/9636 --- .../build_optimizer/package.json | 2 +- .../build-optimizer/build-optimizer_spec.ts | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/packages/angular_devkit/build_optimizer/package.json b/packages/angular_devkit/build_optimizer/package.json index 967928026c..baf7f2ffc9 100644 --- a/packages/angular_devkit/build_optimizer/package.json +++ b/packages/angular_devkit/build_optimizer/package.json @@ -14,7 +14,7 @@ "dependencies": { "loader-utils": "^1.1.0", "source-map": "^0.5.6", - "typescript": "~2.7.2", + "typescript": "~2.9.1", "webpack-sources": "^1.1.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 fc32421c82..f1589ed3c3 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 @@ -8,6 +8,7 @@ // tslint:disable-next-line:no-implicit-dependencies import { tags } from '@angular-devkit/core'; import { RawSourceMap } from 'source-map'; +import { TransformJavascriptOutput } from '../helpers/transform-javascript'; import { buildOptimizer } from './build-optimizer'; @@ -127,6 +128,32 @@ describe('build-optimizer', () => { expect(() => buildOptimizer({ content: input, strict: true })).toThrow(); }); + + // TODO: re-enable this test when updating to TypeScript >2.9.1. + // The `prefix-classes` tests will also need to be adjusted. + // See https://github.com/angular/devkit/pull/998#issuecomment-393867606 for more info. + xit(`doesn't exceed call stack size when type checking very big classes`, () => { + // BigClass with a thousand methods. + // Clazz is included with ctorParameters to trigger transforms with type checking. + const input = ` + var BigClass = /** @class */ (function () { + function BigClass() { + } + ${Array.from(new Array(1000)).map((_v, i) => + `BigClass.prototype.method${i} = function () { return this.myVar; };`, + ).join('\n')} + return BigClass; + }()); + ${clazz} + Clazz.ctorParameters = function () { return []; }; + `; + + let boOutput: TransformJavascriptOutput; + expect(() => { + boOutput = buildOptimizer({ content: input }); + expect(boOutput.emitSkipped).toEqual(false); + }).not.toThrow(); + }); }); describe('whitelisted modules', () => {