Skip to content

Commit 1f57d6a

Browse files
clydinfilipesilva
authored andcommitted
feat(@angular-devkit/build-optimizer): prefix wrapped es2015 classes
1 parent 9dc4a62 commit 1f57d6a

File tree

1 file changed

+23
-11
lines changed

1 file changed

+23
-11
lines changed

packages/angular_devkit/build_optimizer/src/transforms/prefix-classes.ts

+23-11
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,10 @@ function isBlock(node: ts.Node): node is ts.Block {
112112
return node.kind === ts.SyntaxKind.Block;
113113
}
114114

115+
function isClassDeclaration(node: ts.Node): node is ts.ClassDeclaration {
116+
return node.kind === ts.SyntaxKind.ClassDeclaration;
117+
}
118+
115119
// Determine if a node matched the structure of a downleveled TS class.
116120
function isDownleveledClass(node: ts.Node): boolean {
117121

@@ -169,17 +173,28 @@ function isDownleveledClass(node: ts.Node): boolean {
169173
const className = variableDeclaration.name.text;
170174

171175
const firstStatement = functionStatements[0];
172-
const lastStatement = functionStatements[functionStatements.length - 1];
176+
177+
// find return statement - may not be last statement
178+
let returnStatement: ts.ReturnStatement | undefined;
179+
for (let i = functionStatements.length - 1; i > 0; i--) {
180+
if (isReturnStatement(functionStatements[i])) {
181+
returnStatement = functionStatements[i] as ts.ReturnStatement;
182+
break;
183+
}
184+
}
185+
186+
if (returnStatement == undefined
187+
|| returnStatement.expression == undefined
188+
|| !isIdentifier(returnStatement.expression)) {
189+
return false;
190+
}
173191

174192
if (functionExpression.parameters.length === 0) {
175-
// potential non-extended class
176-
return isFunctionDeclaration(firstStatement)
193+
// potential non-extended class or wrapped es2015 class
194+
return (isFunctionDeclaration(firstStatement) || isClassDeclaration(firstStatement))
177195
&& firstStatement.name !== undefined
178196
&& firstStatement.name.text === className
179-
&& isReturnStatement(lastStatement)
180-
&& lastStatement.expression != undefined
181-
&& isIdentifier(lastStatement.expression)
182-
&& lastStatement.expression.text === firstStatement.name.text;
197+
&& returnStatement.expression.text === firstStatement.name.text;
183198
} else if (functionExpression.parameters.length !== 1) {
184199
return false;
185200
}
@@ -222,8 +237,5 @@ function isDownleveledClass(node: ts.Node): boolean {
222237
return isFunctionDeclaration(secondStatement)
223238
&& secondStatement.name !== undefined
224239
&& secondStatement.name.text === className
225-
&& isReturnStatement(lastStatement)
226-
&& lastStatement.expression !== undefined
227-
&& isIdentifier(lastStatement.expression)
228-
&& lastStatement.expression.text === secondStatement.name.text;
240+
&& returnStatement.expression.text === secondStatement.name.text;
229241
}

0 commit comments

Comments
 (0)