Skip to content

Commit 7d86894

Browse files
Alanmgechev
authored andcommitted
feat(@angular-devkit/build-optimizer): add support for es2015 enums emitted by tsickle
tsickle emits es2015 enums with an object literal followed by an export declaration Example: ``` const RendererStyleFlags3 = { Important: 1, DashCase: 2, }; export { RendererStyleFlags3 }; RendererStyleFlags3[RendererStyleFlags3.Important] = 'Important'; RendererStyleFlags3[RendererStyleFlags3.DashCase] = 'DashCase'; ``` This PR adds support for the enums to be optimized by wrapping them in an iife and marks them as pure. Fixes #13488
1 parent 35b0594 commit 7d86894

File tree

2 files changed

+80
-2
lines changed

2 files changed

+80
-2
lines changed

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

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,18 +120,28 @@ function visitBlockStatements(
120120
} else if (ts.isObjectLiteralExpression(variableDeclaration.initializer)
121121
&& variableDeclaration.initializer.properties.length !== 0) {
122122
const literalPropertyCount = variableDeclaration.initializer.properties.length;
123+
124+
// tsickle es2015 enums first statement is an export declaration
125+
const isPotentialEnumExport = ts.isExportDeclaration(statements[oIndex + 1]);
126+
if (isPotentialEnumExport) {
127+
// skip the export
128+
oIndex ++;
129+
}
130+
123131
const enumStatements = findEnumNameStatements(name, statements, oIndex + 1);
124132
if (enumStatements.length === literalPropertyCount) {
125133
// found an enum
126134
if (!updatedStatements) {
127135
updatedStatements = statements.slice();
128136
}
129137
// create wrapper and replace variable statement and enum member statements
130-
updatedStatements.splice(uIndex, enumStatements.length + 1, createWrappedEnum(
138+
const deleteCount = enumStatements.length + (isPotentialEnumExport ? 2 : 1);
139+
updatedStatements.splice(uIndex, deleteCount, createWrappedEnum(
131140
name,
132141
currentStatement,
133142
enumStatements,
134143
variableDeclaration.initializer,
144+
isPotentialEnumExport,
135145
));
136146
// skip enum member declarations
137147
oIndex += enumStatements.length;
@@ -475,8 +485,18 @@ function createWrappedEnum(
475485
hostNode: ts.VariableStatement,
476486
statements: Array<ts.Statement>,
477487
literalInitializer: ts.ObjectLiteralExpression | undefined,
488+
addExportModifier = false,
478489
): ts.Statement {
479490
literalInitializer = literalInitializer || ts.createObjectLiteral();
491+
492+
const node = addExportModifier
493+
? ts.updateVariableStatement(
494+
hostNode,
495+
[ts.createToken(ts.SyntaxKind.ExportKeyword)],
496+
hostNode.declarationList,
497+
)
498+
: hostNode;
499+
480500
const innerVarStmt = ts.createVariableStatement(
481501
undefined,
482502
ts.createVariableDeclarationList([
@@ -492,5 +512,5 @@ function createWrappedEnum(
492512
innerReturn,
493513
]);
494514

495-
return updateHostNode(hostNode, addPureComment(ts.createParen(iife)));
515+
return updateHostNode(node, addPureComment(ts.createParen(iife)));
496516
}

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

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,64 @@ describe('wrap-enums', () => {
3838
expect(tags.oneLine`${transform(input)}`).toEqual(tags.oneLine`${output}`);
3939
});
4040

41+
it('wraps ES2015 tsickle enums in IIFE', () => {
42+
const input = tags.stripIndent`
43+
const ChangeDetectionStrategy = {
44+
OnPush: 0,
45+
Default: 1,
46+
};
47+
export { ChangeDetectionStrategy };
48+
ChangeDetectionStrategy[ChangeDetectionStrategy.OnPush] = 'OnPush';
49+
ChangeDetectionStrategy[ChangeDetectionStrategy.Default] = 'Default';
50+
`;
51+
52+
const output = tags.stripIndent`
53+
export const ChangeDetectionStrategy = /*@__PURE__*/ (function () {
54+
var ChangeDetectionStrategy = { OnPush: 0, Default: 1, };
55+
56+
ChangeDetectionStrategy[ChangeDetectionStrategy.OnPush] = 'OnPush';
57+
ChangeDetectionStrategy[ChangeDetectionStrategy.Default] = 'Default';
58+
return ChangeDetectionStrategy;
59+
}());
60+
`;
61+
62+
expect(tags.oneLine`${transform(input)}`).toEqual(tags.oneLine`${output}`);
63+
});
64+
65+
it('wraps only ES2015 tsickle enums in IIFE', () => {
66+
const input = tags.stripIndent`
67+
const RendererStyleFlags3 = {
68+
Important: 1,
69+
DashCase: 2,
70+
};
71+
export { RendererStyleFlags3 };
72+
RendererStyleFlags3[RendererStyleFlags3.Important] = 'Important';
73+
RendererStyleFlags3[RendererStyleFlags3.DashCase] = 'DashCase';
74+
75+
export const domRendererFactory3 = {
76+
createRenderer: (hostElement, rendererType) => { return document; }
77+
};
78+
79+
export const unusedValueExportToPlacateAjd = 1;
80+
`;
81+
const output = tags.stripIndent`
82+
export const RendererStyleFlags3 = /*@__PURE__*/ (function () {
83+
var RendererStyleFlags3 = { Important: 1, DashCase: 2, };
84+
RendererStyleFlags3[RendererStyleFlags3.Important] = 'Important';
85+
RendererStyleFlags3[RendererStyleFlags3.DashCase] = 'DashCase';
86+
return RendererStyleFlags3;
87+
}());
88+
89+
export const domRendererFactory3 = {
90+
createRenderer: (hostElement, rendererType) => { return document; }
91+
};
92+
93+
export const unusedValueExportToPlacateAjd = 1;
94+
`;
95+
96+
expect(tags.oneLine`${transform(input)}`).toEqual(tags.oneLine`${output}`);
97+
});
98+
4199
it('wraps ts >2.3 enums in IIFE', () => {
42100
const input = tags.stripIndent`
43101
export var ChangeDetectionStrategy;

0 commit comments

Comments
 (0)