diff --git a/packages/angular_devkit/build_angular/src/babel/plugins/adjust-typescript-enums.ts b/packages/angular_devkit/build_angular/src/babel/plugins/adjust-typescript-enums.ts index ac7a6714f50d..07412ed6632c 100644 --- a/packages/angular_devkit/build_angular/src/babel/plugins/adjust-typescript-enums.ts +++ b/packages/angular_devkit/build_angular/src/babel/plugins/adjust-typescript-enums.ts @@ -76,9 +76,17 @@ export default function (): PluginObj { return; } + const enumCalleeParam = enumCallee.node.params[0]; + const isEnumCalleeMatching = + types.isIdentifier(enumCalleeParam) && enumCalleeParam.name === declarationId.name; + // Loose mode rewrites the enum to a shorter but less TypeScript-like form + // Note: We only can apply the `loose` mode transformation if the callee parameter matches + // with the declaration identifier name. This is necessary in case the the declaration id has + // been renamed to avoid collisions, as the loose transform would then break the enum assignments + // which rely on the differently-named callee identifier name. let enumAssignments: types.ExpressionStatement[] | undefined; - if (loose) { + if (loose && isEnumCalleeMatching) { enumAssignments = []; } diff --git a/packages/angular_devkit/build_angular/src/babel/plugins/adjust-typescript-enums_spec.ts b/packages/angular_devkit/build_angular/src/babel/plugins/adjust-typescript-enums_spec.ts index 8446bfeb93d1..ef8f9d6a3013 100644 --- a/packages/angular_devkit/build_angular/src/babel/plugins/adjust-typescript-enums_spec.ts +++ b/packages/angular_devkit/build_angular/src/babel/plugins/adjust-typescript-enums_spec.ts @@ -240,4 +240,31 @@ describe('adjust-typescript-enums Babel plugin', () => { options: { loose: true }, }); }); + + it( + 'should not wrap TypeScript enums in loose mode if the declaration identifier has been ' + + 'renamed to avoid collisions', + () => { + testCase({ + input: ` + var ChangeDetectionStrategy$1; + (function (ChangeDetectionStrategy) { + ChangeDetectionStrategy[ChangeDetectionStrategy["OnPush"] = 0] = "OnPush"; + ChangeDetectionStrategy[ChangeDetectionStrategy["Default"] = 1] = "Default"; + })(ChangeDetectionStrategy$1 || (ChangeDetectionStrategy$1 = {})); + `, + expected: ` + var ChangeDetectionStrategy$1 = /*#__PURE__*/ (() => { + (function (ChangeDetectionStrategy) { + ChangeDetectionStrategy[(ChangeDetectionStrategy["OnPush"] = 0)] = "OnPush"; + ChangeDetectionStrategy[(ChangeDetectionStrategy["Default"] = 1)] = "Default"; + })(ChangeDetectionStrategy$1 || (ChangeDetectionStrategy$1 = {})); + + return ChangeDetectionStrategy$1; + })(); + `, + options: { loose: true }, + }); + }, + ); });