Skip to content

Commit 1e9f7c0

Browse files
committed
fix(@angular/build): prevent syntax corruption in linker and oxc transform
This commit addresses two sources of JavaScript syntax corruption: 1. StringAstFactory: Parenthesize object literal expression bodies in arrow functions to prevent them from being parsed as BlockStatements where property keys are treated as statement labels. 2. oxc-transform: Preserve parentheses when unwrapping enum IIFE argument assignments so expressions like Area || (exports.Area = {}) maintain correct operator precedence.
1 parent fffec59 commit 1e9f7c0

3 files changed

Lines changed: 32 additions & 5 deletions

File tree

packages/angular/build/src/tools/angular/linker/string-ast-factory.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,8 +177,12 @@ export class StringAstFactory implements AstFactory<string, unknown, string> {
177177

178178
createArrowFunctionExpression(parameters: Parameter<string>[], body: unknown): string {
179179
const params = parameters.map((p) => p.name).join(', ');
180+
const renderedBody = this.render(body);
181+
const isObjectLiteral =
182+
renderedBody.startsWith('{') && renderedBody.endsWith('}') && !renderedBody.includes(';');
183+
const formattedBody = isObjectLiteral ? `(${renderedBody})` : renderedBody;
180184

181-
return `(${params}) => ${this.render(body)}`;
185+
return `(${params}) => ${formattedBody}`;
182186
}
183187

184188
createDynamicImport(url: unknown): string {

packages/angular/build/src/tools/oxc/adjust-typescript-enums_oxc_spec.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,4 +280,24 @@ describe('adjust-typescript-enums oxc-transform implementation', () => {
280280
`,
281281
}),
282282
);
283+
284+
it(
285+
'handles TypeScript enums with chained exports assignment (angular-split / shared-docs pattern)',
286+
testCase({
287+
input: `
288+
var Area;
289+
(function (a1) {
290+
a1[a1["areaAfter"] = 0] = "areaAfter";
291+
a1[a1["preserveOtherCategoryOrder"] = 1] = "preserveOtherCategoryOrder";
292+
})(Area || (Area = exports.Area = {}));
293+
`,
294+
expected: `
295+
var Area = /*#__PURE__*/ (function (a1) {
296+
a1[(a1["areaAfter"] = 0)] = "areaAfter";
297+
a1[(a1["preserveOtherCategoryOrder"] = 1)] = "preserveOtherCategoryOrder";
298+
return a1;
299+
})(Area || (exports.Area = {}));
300+
`,
301+
}),
302+
);
283303
});

packages/angular/build/src/tools/oxc/oxc-transform.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -421,11 +421,14 @@ export function transform(filename: string, code: string, options: OxcTransformO
421421

422422
// 3. Remove `Name = ` assignment in arguments if it's a simple identifier
423423
if (rightCallArgument.left.type === 'Identifier') {
424-
s.overwrite(
425-
arg.right.start,
426-
arg.right.end,
427-
code.substring(rightCallArgument.right.start, rightCallArgument.right.end),
424+
let replacement = code.substring(
425+
rightCallArgument.right.start,
426+
rightCallArgument.right.end,
428427
);
428+
if (rightCallArgument.right.type === 'AssignmentExpression') {
429+
replacement = `(${replacement})`;
430+
}
431+
s.overwrite(arg.right.start, arg.right.end, replacement);
429432
markEdited(arg.right.start, arg.right.end);
430433
}
431434

0 commit comments

Comments
 (0)