Skip to content
This repository was archived by the owner on Apr 4, 2025. It is now read-only.

Commit 7784c36

Browse files
clydinfilipesilva
authored andcommitted
fix(@angular-devkit/build-optimizer): correct 2.8 enum export assignment
1 parent 9b23d89 commit 7784c36

File tree

3 files changed

+61
-20
lines changed

3 files changed

+61
-20
lines changed

packages/angular_devkit/build_optimizer/src/build-optimizer/build-optimizer_spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ describe('build-optimizer', () => {
6363
ChangeDetectionStrategy[ChangeDetectionStrategy["OnPush"] = 0] = "OnPush";
6464
ChangeDetectionStrategy[ChangeDetectionStrategy["Default"] = 1] = "Default";
6565
return ChangeDetectionStrategy;
66-
})(ChangeDetectionStrategy || (ChangeDetectionStrategy = {}));
66+
})({});
6767
var Clazz = /*@__PURE__*/ (function () { function Clazz() { } ${staticProperty} return Clazz; }());
6868
var ComponentClazz = /*@__PURE__*/ (function () {
6969
function ComponentClazz() { }

packages/angular_devkit/build_optimizer/src/transforms/wrap-enums.ts

+55-14
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ function visitBlockStatements(
9494
// update IIFE and replace variable statement and old IIFE
9595
updatedStatements.splice(uIndex, 2, updateEnumIife(
9696
currentStatement,
97-
iife,
97+
iife[0],
98+
iife[1],
9899
));
99100
// skip IIFE statement
100101
oIndex++;
@@ -158,7 +159,10 @@ function visitBlockStatements(
158159
}
159160

160161
// TS 2.3 enums have statements that are inside a IIFE.
161-
function findTs2_3EnumIife(name: string, statement: ts.Statement): ts.CallExpression | null {
162+
function findTs2_3EnumIife(
163+
name: string,
164+
statement: ts.Statement,
165+
): [ts.CallExpression, ts.Expression | undefined] | null {
162166
if (!ts.isExpressionStatement(statement)) {
163167
return null;
164168
}
@@ -173,6 +177,7 @@ function findTs2_3EnumIife(name: string, statement: ts.Statement): ts.CallExpres
173177
}
174178

175179
const callExpression = expression;
180+
let exportExpression;
176181

177182
let argument = expression.arguments[0];
178183
if (!ts.isBinaryExpression(argument)) {
@@ -183,12 +188,14 @@ function findTs2_3EnumIife(name: string, statement: ts.Statement): ts.CallExpres
183188
return null;
184189
}
185190

191+
let potentialExport = false;
186192
if (argument.operatorToken.kind === ts.SyntaxKind.FirstAssignment) {
187193
if (!ts.isBinaryExpression(argument.right)
188194
|| argument.right.operatorToken.kind !== ts.SyntaxKind.BarBarToken) {
189195
return null;
190196
}
191197

198+
potentialExport = true;
192199
argument = argument.right;
193200
}
194201

@@ -200,6 +207,10 @@ function findTs2_3EnumIife(name: string, statement: ts.Statement): ts.CallExpres
200207
return null;
201208
}
202209

210+
if (potentialExport && !ts.isIdentifier(argument.left)) {
211+
exportExpression = argument.left;
212+
}
213+
203214
expression = expression.expression;
204215
while (ts.isParenthesizedExpression(expression)) {
205216
expression = expression.expression;
@@ -264,7 +275,7 @@ function findTs2_3EnumIife(name: string, statement: ts.Statement): ts.CallExpres
264275
}
265276
}
266277

267-
return callExpression;
278+
return [callExpression, exportExpression];
268279
}
269280

270281
// TS 2.2 enums have statements after the variable declaration, with index statements followed
@@ -362,9 +373,22 @@ function findEnumNameStatements(
362373
return enumStatements;
363374
}
364375

365-
function updateHostNode(hostNode: ts.VariableStatement, expression: ts.Expression): ts.Statement {
376+
function addPureComment<T extends ts.Node>(node: T): T {
366377
const pureFunctionComment = '@__PURE__';
367378

379+
return ts.addSyntheticLeadingComment(
380+
node,
381+
ts.SyntaxKind.MultiLineCommentTrivia,
382+
pureFunctionComment,
383+
false,
384+
);
385+
}
386+
387+
function updateHostNode(
388+
hostNode: ts.VariableStatement,
389+
expression: ts.Expression,
390+
): ts.Statement {
391+
368392
// Update existing host node with the pure comment before the variable declaration initializer.
369393
const variableDeclaration = hostNode.declarationList.declarations[0];
370394
const outerVarStmt = ts.updateVariableStatement(
@@ -377,12 +401,7 @@ function updateHostNode(hostNode: ts.VariableStatement, expression: ts.Expressio
377401
variableDeclaration,
378402
variableDeclaration.name,
379403
variableDeclaration.type,
380-
ts.addSyntheticLeadingComment(
381-
expression,
382-
ts.SyntaxKind.MultiLineCommentTrivia,
383-
pureFunctionComment,
384-
false,
385-
),
404+
expression,
386405
),
387406
],
388407
),
@@ -391,12 +410,22 @@ function updateHostNode(hostNode: ts.VariableStatement, expression: ts.Expressio
391410
return outerVarStmt;
392411
}
393412

394-
function updateEnumIife(hostNode: ts.VariableStatement, iife: ts.CallExpression): ts.Statement {
413+
function updateEnumIife(
414+
hostNode: ts.VariableStatement,
415+
iife: ts.CallExpression,
416+
exportAssignment?: ts.Expression,
417+
): ts.Statement {
395418
if (!ts.isParenthesizedExpression(iife.expression)
396419
|| !ts.isFunctionExpression(iife.expression.expression)) {
397420
throw new Error('Invalid IIFE Structure');
398421
}
399422

423+
// Ignore export assignment if variable is directly exported
424+
if (hostNode.modifiers
425+
&& hostNode.modifiers.findIndex(m => m.kind == ts.SyntaxKind.ExportKeyword) != -1) {
426+
exportAssignment = undefined;
427+
}
428+
400429
const expression = iife.expression.expression;
401430
const updatedFunction = ts.updateFunctionExpression(
402431
expression,
@@ -415,17 +444,29 @@ function updateEnumIife(hostNode: ts.VariableStatement, iife: ts.CallExpression)
415444
),
416445
);
417446

447+
let arg: ts.Expression = ts.createObjectLiteral();
448+
if (exportAssignment) {
449+
arg = ts.createBinary(exportAssignment, ts.SyntaxKind.BarBarToken, arg);
450+
}
418451
const updatedIife = ts.updateCall(
419452
iife,
420453
ts.updateParen(
421454
iife.expression,
422455
updatedFunction,
423456
),
424457
iife.typeArguments,
425-
iife.arguments,
458+
[arg],
426459
);
427460

428-
return updateHostNode(hostNode, updatedIife);
461+
let value: ts.Expression = addPureComment(updatedIife);
462+
if (exportAssignment) {
463+
value = ts.createBinary(
464+
exportAssignment,
465+
ts.SyntaxKind.FirstAssignment,
466+
updatedIife);
467+
}
468+
469+
return updateHostNode(hostNode, value);
429470
}
430471

431472
function createWrappedEnum(
@@ -450,5 +491,5 @@ function createWrappedEnum(
450491
innerReturn,
451492
]);
452493

453-
return updateHostNode(hostNode, ts.createParen(iife));
494+
return updateHostNode(hostNode, addPureComment(ts.createParen(iife)));
454495
}

packages/angular_devkit/build_optimizer/src/transforms/wrap-enums_spec.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ describe('wrap-enums', () => {
5050
ChangeDetectionStrategy[ChangeDetectionStrategy["OnPush"] = 0] = "OnPush";
5151
ChangeDetectionStrategy[ChangeDetectionStrategy["Default"] = 1] = "Default";
5252
return ChangeDetectionStrategy;
53-
})(ChangeDetectionStrategy || (ChangeDetectionStrategy = {}));
53+
})({});
5454
`;
5555

5656
expect(tags.oneLine`${transform(input)}`).toEqual(tags.oneLine`${output}`);
@@ -73,7 +73,7 @@ describe('wrap-enums', () => {
7373
AnimatorControlState[AnimatorControlState["FINISHED"] = 3] = "FINISHED";
7474
AnimatorControlState[AnimatorControlState["DESTROYED"] = 4] = "DESTROYED";
7575
return AnimatorControlState;
76-
})(AnimatorControlState || (AnimatorControlState = {}));
76+
})({});
7777
`;
7878

7979
expect(tags.oneLine`${transform(input)}`).toEqual(tags.oneLine`${output}`);
@@ -155,7 +155,7 @@ describe('wrap-enums', () => {
155155
RequestMethod[RequestMethod["Head"] = 5] = "Head";
156156
RequestMethod[RequestMethod["Patch"] = 6] = "Patch";
157157
return RequestMethod;
158-
})(RequestMethod || (RequestMethod = {}));
158+
})({});
159159
`;
160160

161161
expect(tags.oneLine`${transform(input)}`).toEqual(tags.oneLine`${output}`);
@@ -171,12 +171,12 @@ describe('wrap-enums', () => {
171171
})(ExportEnum = exports.ExportEnum || (exports.ExportEnum = {}));
172172
`;
173173
const output = tags.stripIndent`
174-
var ExportEnum = /*@__PURE__*/ (function (ExportEnum) {
174+
var ExportEnum = exports.ExportEnum = /*@__PURE__*/ (function (ExportEnum) {
175175
ExportEnum[ExportEnum["A"] = 0] = "A";
176176
ExportEnum[ExportEnum["B"] = 1] = "B";
177177
ExportEnum[ExportEnum["C"] = 2] = "C";
178178
return ExportEnum;
179-
})(ExportEnum = exports.ExportEnum || (exports.ExportEnum = {}));
179+
})(exports.ExportEnum || {});
180180
`;
181181

182182
expect(tags.oneLine`${transform(input)}`).toEqual(tags.oneLine`${output}`);

0 commit comments

Comments
 (0)