From 4ab0d68ad9dbbdf28230b0b3f696bde13ce52df3 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 --- package-lock.json | 6 ++--- package.json | 4 ++-- .../build_optimizer/package.json | 2 +- .../build-optimizer/build-optimizer_spec.ts | 24 +++++++++++++++++++ 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index f84fdfb152..65c19c3f51 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10582,9 +10582,9 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typescript": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.2.tgz", - "integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==" + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.1.tgz", + "integrity": "sha512-h6pM2f/GDchCFlldnriOhs1QHuwbnmj6/v7499eMHqPeW4V2G0elua2eIc2nu8v2NdHV0Gm+tzX83Hr6nUFjQA==" }, "uglify-js": { "version": "2.8.29", diff --git a/package.json b/package.json index 69fe5b4206..fecfdb18a9 100644 --- a/package.json +++ b/package.json @@ -134,8 +134,8 @@ "semver": "^5.3.0", "semver-intersect": "^1.1.2", "source-map": "^0.5.6", - "source-map-support": "^0.5.0", "source-map-loader": "^0.2.3", + "source-map-support": "^0.5.0", "stats-webpack-plugin": "^0.6.2", "style-loader": "^0.21.0", "stylus": "^0.54.5", @@ -147,7 +147,7 @@ "ts-node": "^5.0.0", "tslint": "^5.9.1", "tsutils": "~2.22.2", - "typescript": "~2.7.2", + "typescript": "^2.9.1", "uglifyjs-webpack-plugin": "^1.2.5", "url-loader": "^1.0.1", "webpack": "~4.6.0", 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..f0e2ce0142 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,29 @@ describe('build-optimizer', () => { expect(() => buildOptimizer({ content: input, strict: true })).toThrow(); }); + + it(`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', () => {