From e973643bfbe47447ca522ca59b07a94fe6c03e0b Mon Sep 17 00:00:00 2001 From: Julien Saguet Date: Sun, 5 Jan 2025 19:38:51 +0100 Subject: [PATCH] fix(@angular/build): do not mark Babel _defineProperty helper function as pure Fixes #29145 (cherry picked from commit a5618693a12daf28fdfc1f791dd36889eeff6095) --- .../babel/plugins/pure-toplevel-functions.ts | 21 ++++++++++++++++--- .../plugins/pure-toplevel-functions_spec.ts | 12 +++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/packages/angular/build/src/tools/babel/plugins/pure-toplevel-functions.ts b/packages/angular/build/src/tools/babel/plugins/pure-toplevel-functions.ts index ec209e64850b..ce47977a74e3 100644 --- a/packages/angular/build/src/tools/babel/plugins/pure-toplevel-functions.ts +++ b/packages/angular/build/src/tools/babel/plugins/pure-toplevel-functions.ts @@ -32,6 +32,18 @@ function isTslibHelperName(name: string): boolean { return tslibHelpers.has(originalName); } +const babelHelpers = new Set(['_defineProperty']); + +/** + * Determinates whether an identifier name matches one of the Babel helper function names. + * + * @param name The identifier name to check. + * @returns True, if the name matches a Babel helper name; otherwise, false. + */ +function isBabelHelperName(name: string): boolean { + return babelHelpers.has(name); +} + /** * A babel plugin factory function for adding the PURE annotation to top-level new and call expressions. * @@ -53,9 +65,12 @@ export default function (): PluginObj { ) { return; } - // Do not annotate TypeScript helpers emitted by the TypeScript compiler. - // TypeScript helpers are intended to cause side effects. - if (callee.isIdentifier() && isTslibHelperName(callee.node.name)) { + // Do not annotate TypeScript helpers emitted by the TypeScript compiler or Babel helpers. + // They are intended to cause side effects. + if ( + callee.isIdentifier() && + (isTslibHelperName(callee.node.name) || isBabelHelperName(callee.node.name)) + ) { return; } diff --git a/packages/angular/build/src/tools/babel/plugins/pure-toplevel-functions_spec.ts b/packages/angular/build/src/tools/babel/plugins/pure-toplevel-functions_spec.ts index 2852d30821c0..891f794f43d5 100644 --- a/packages/angular/build/src/tools/babel/plugins/pure-toplevel-functions_spec.ts +++ b/packages/angular/build/src/tools/babel/plugins/pure-toplevel-functions_spec.ts @@ -130,6 +130,18 @@ describe('pure-toplevel-functions Babel plugin', () => { `), ); + it( + 'does not annotate _defineProperty function', + testCaseNoChange(` + class LanguageState {} + _defineProperty( + LanguageState, + 'property', + 'value' + ); + `), + ); + it( 'does not annotate object literal methods', testCaseNoChange(`