diff --git a/packages/react-native-babel-preset/src/__tests__/transform-snapshot-test.js b/packages/react-native-babel-preset/src/__tests__/transform-snapshot-test.js index 1e972039ee5e..eb778e8e87a8 100644 --- a/packages/react-native-babel-preset/src/__tests__/transform-snapshot-test.js +++ b/packages/react-native-babel-preset/src/__tests__/transform-snapshot-test.js @@ -444,6 +444,25 @@ describe('react-native-babel-preset transform snapshots', () => { expect(result).toContain('_classPrivateFieldLooseKey'); }); + it('transforms private class fields when the profile lowers classes', () => { + const code = ` + class Counter { + #count = 0; + #privateMethod() { return this.#count; } + } + `; + const result = transformCode(code, { + dev: false, + unstable_transformProfile: 'hermes-legacy', + customTransformOptions: { + unstable_preserveClassPrivate: true, + }, + }); + expect(result).not.toContain('#count'); + expect(result).not.toContain('#privateMethod'); + expect(result).toContain('_classPrivateFieldLooseKey'); + }); + it('preserves async/await with unstable_preserveAsync', () => { const code = ` async function fetchData() { diff --git a/packages/react-native-babel-preset/src/configs/main.js b/packages/react-native-babel-preset/src/configs/main.js index a48b126ca8b8..86c5f69b6cb6 100644 --- a/packages/react-native-babel-preset/src/configs/main.js +++ b/packages/react-native-babel-preset/src/configs/main.js @@ -94,10 +94,13 @@ const getPreset = (src, options, babel) => { // Preserve class syntax and related features for Hermes V1 profiles. const preserveClasses = isHermesProfile; - // Preserve private class fields and methods if the experiment is enabled. - const preserveClassPrivate = TRUE_VALS.has( - options?.customTransformOptions?.unstable_preserveClassPrivate, - ); + // Private fields can only be preserved when the surrounding class syntax is + // also preserved. Babel's class transform requires the private transforms. + const preserveClassPrivate = + preserveClasses && + TRUE_VALS.has( + options?.customTransformOptions?.unstable_preserveClassPrivate, + ); // Preserve async/await syntax if the experiment is enabled. const preserveAsync = TRUE_VALS.has(