Skip to content

Commit bb0a8ef

Browse files
committed
Guard private syntax preservation by profile
1 parent 2fa055f commit bb0a8ef

2 files changed

Lines changed: 26 additions & 4 deletions

File tree

packages/react-native-babel-preset/src/__tests__/transform-snapshot-test.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,25 @@ describe('react-native-babel-preset transform snapshots', () => {
444444
expect(result).toContain('_classPrivateFieldLooseKey');
445445
});
446446

447+
it('transforms private class fields when the profile lowers classes', () => {
448+
const code = `
449+
class Counter {
450+
#count = 0;
451+
#privateMethod() { return this.#count; }
452+
}
453+
`;
454+
const result = transformCode(code, {
455+
dev: false,
456+
unstable_transformProfile: 'hermes-legacy',
457+
customTransformOptions: {
458+
unstable_preserveClassPrivate: true,
459+
},
460+
});
461+
expect(result).not.toContain('#count');
462+
expect(result).not.toContain('#privateMethod');
463+
expect(result).toContain('_classPrivateFieldLooseKey');
464+
});
465+
447466
it('preserves async/await with unstable_preserveAsync', () => {
448467
const code = `
449468
async function fetchData() {

packages/react-native-babel-preset/src/configs/main.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,13 @@ const getPreset = (src, options, babel) => {
9494
// Preserve class syntax and related features for Hermes V1 profiles.
9595
const preserveClasses = isHermesProfile;
9696

97-
// Preserve private class fields and methods if the experiment is enabled.
98-
const preserveClassPrivate = TRUE_VALS.has(
99-
options?.customTransformOptions?.unstable_preserveClassPrivate,
100-
);
97+
// Private fields can only be preserved when the surrounding class syntax is
98+
// also preserved. Babel's class transform requires the private transforms.
99+
const preserveClassPrivate =
100+
preserveClasses &&
101+
TRUE_VALS.has(
102+
options?.customTransformOptions?.unstable_preserveClassPrivate,
103+
);
101104

102105
// Preserve async/await syntax if the experiment is enabled.
103106
const preserveAsync = TRUE_VALS.has(

0 commit comments

Comments
 (0)