From c3a4c454be4d9578c702f5709d5d889d1a5102f8 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Tue, 19 Nov 2019 11:19:54 +0000 Subject: [PATCH] =?UTF-8?q?fix(@angular-devkit/build-optimizer):=20update?= =?UTF-8?q?=20=C9=B5setClassMetadata=20call=20format?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It's in a IIFE after https://github.com/angular/angular/pull/33337 lands. --- .../src/transforms/scrub-file.ts | 30 ++++++++++++++++++- .../src/transforms/scrub-file_spec.ts | 4 +-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/packages/angular_devkit/build_optimizer/src/transforms/scrub-file.ts b/packages/angular_devkit/build_optimizer/src/transforms/scrub-file.ts index 4dac89e1b332..628c41b0e85f 100644 --- a/packages/angular_devkit/build_optimizer/src/transforms/scrub-file.ts +++ b/packages/angular_devkit/build_optimizer/src/transforms/scrub-file.ts @@ -303,7 +303,35 @@ function isAssignmentExpressionTo(exprStmt: ts.ExpressionStatement, name: string } function isIvyPrivateCallExpression(exprStmt: ts.ExpressionStatement) { - const callExpr = exprStmt.expression; + // Each Ivy private call expression is inside an IIFE as single statements, so we must go down it. + const expression = exprStmt.expression; + if (!expression || !ts.isCallExpression(expression) || expression.arguments.length !== 0) { + return null; + } + + const parenExpr = expression; + if (!ts.isParenthesizedExpression(parenExpr.expression)) { + return null; + } + + const funExpr = parenExpr.expression.expression; + if (!ts.isFunctionExpression(funExpr)) { + return null; + } + + const innerStmts = funExpr.body.statements; + if (innerStmts.length !== 1) { + return null; + } + + const innerExprStmt = innerStmts[0]; + if (!ts.isExpressionStatement(innerExprStmt)) { + return null; + } + + // Now we're in the IIFE and have the inner expression statement. We can check if it matches + // a private Ivy call. + const callExpr = innerExprStmt.expression; if (!ts.isCallExpression(callExpr)) { return false; } diff --git a/packages/angular_devkit/build_optimizer/src/transforms/scrub-file_spec.ts b/packages/angular_devkit/build_optimizer/src/transforms/scrub-file_spec.ts index d1d07b811201..45a3ed971adb 100644 --- a/packages/angular_devkit/build_optimizer/src/transforms/scrub-file_spec.ts +++ b/packages/angular_devkit/build_optimizer/src/transforms/scrub-file_spec.ts @@ -722,14 +722,14 @@ describe('scrub-file', () => { `; const input = tags.stripIndent` ${output} - /*@__PURE__*/ i0.ɵsetClassMetadata(Clazz, [{ + /*@__PURE__*/ (function () { i0.ɵsetClassMetadata(Clazz, [{ type: Component, args: [{ selector: 'app-lazy', template: 'very lazy', styles: [] }] - }], null, null); + }], null, null); })(); `; expect(testScrubFile(input)).toBeTruthy();