Skip to content

Commit d16cb0e

Browse files
committed
fix: make default usePrebuiltRNCore version-aware
1 parent 3456d3a commit d16cb0e

3 files changed

Lines changed: 60 additions & 24 deletions

File tree

packages/cli/src/brownfield/commands/packageIos.ts

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -81,18 +81,30 @@ export const packageIosCommand = curryOptions(
8181
actionRunner(async (options: PackageIosCliFlags) => {
8282
const { projectRoot, platformConfig, userConfig } = getProjectInfo('ios');
8383

84-
const {
85-
supported: isPrebuiltRNCoreSupported,
86-
reason: maybePrebuiltRNCoreUnsupportedReason,
87-
} = supportsPrebuiltRNCore({ projectRoot });
88-
89-
// default value is based on project so is dynamically assigned at runtime
90-
options.usePrebuiltRnCore ??= isPrebuiltRNCoreSupported;
91-
92-
if (options.usePrebuiltRnCore && !isPrebuiltRNCoreSupported) {
93-
// user opted-in but prebuilt RN core is not supported
94-
// note: the default-assignment above - if effective - always satisfies this condition
95-
throw new RockError(maybePrebuiltRNCoreUnsupportedReason);
84+
const prebuiltRNCoreSupport = supportsPrebuiltRNCore({ projectRoot });
85+
86+
// version-aware default when the flag is omitted (see ios.mdx "React Native Prebuilts")
87+
options.usePrebuiltRnCore ??= prebuiltRNCoreSupport.supported
88+
? prebuiltRNCoreSupport.enabledByDefault
89+
: false;
90+
91+
if (prebuiltRNCoreSupport) {
92+
logger.info(
93+
`${options.usePrebuiltRnCore ? 'Using' : 'Not using'} prebuilt RN core`
94+
);
95+
96+
if (
97+
!prebuiltRNCoreSupport.enabledByDefault &&
98+
!options.usePrebuiltRnCore
99+
) {
100+
logger.info(
101+
'Your environment supports prebuilt RN Core as an opt-in feature, but it is disabled by default. Pass --use-prebuilt-rn-core to enable it.'
102+
);
103+
}
104+
}
105+
106+
if (options.usePrebuiltRnCore && !prebuiltRNCoreSupport.supported) {
107+
throw new RockError(prebuiltRNCoreSupport.reason);
96108
}
97109

98110
await runExpoPrebuildIfNeeded({ projectRoot, platform: 'ios' });

packages/cli/src/brownfield/utils/__tests__/supportsPrebuiltRNCore.test.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,23 @@ describe('supportsPrebuiltRNCore', () => {
2828
vi.mocked(projectUtils.getExpoSdkMajor).mockReset();
2929
});
3030

31-
test('returns supported for vanilla RN >= 0.81', () => {
31+
test('returns supported with opt-in default for vanilla RN 0.83', () => {
3232
vi.mocked(rockTools.getReactNativeVersion).mockReturnValue('0.83.0');
3333
vi.mocked(projectUtils.isExpoProject).mockReturnValue(false);
3434

3535
expect(supportsPrebuiltRNCore({ projectRoot: '/project' })).toEqual({
3636
supported: true,
37+
enabledByDefault: false,
38+
});
39+
});
40+
41+
test('returns supported with default enabled for vanilla RN >= 0.84', () => {
42+
vi.mocked(rockTools.getReactNativeVersion).mockReturnValue('0.84.0');
43+
vi.mocked(projectUtils.isExpoProject).mockReturnValue(false);
44+
45+
expect(supportsPrebuiltRNCore({ projectRoot: '/project' })).toEqual({
46+
supported: true,
47+
enabledByDefault: true,
3748
});
3849
});
3950

@@ -63,13 +74,14 @@ describe('supportsPrebuiltRNCore', () => {
6374
});
6475
});
6576

66-
test('returns supported for Expo SDK >= 55 when RN is supported', () => {
77+
test('returns supported with default enabled for Expo SDK >= 55', () => {
6778
vi.mocked(rockTools.getReactNativeVersion).mockReturnValue('0.83.0');
6879
vi.mocked(projectUtils.isExpoProject).mockReturnValue(true);
6980
vi.mocked(projectUtils.getExpoSdkMajor).mockReturnValue(55);
7081

7182
expect(supportsPrebuiltRNCore({ projectRoot: '/project' })).toEqual({
7283
supported: true,
84+
enabledByDefault: true,
7385
});
7486
});
7587

@@ -82,7 +94,7 @@ describe('supportsPrebuiltRNCore', () => {
8294

8395
expect(result).toEqual({
8496
supported: false,
85-
reason: expect.stringMatching(/Expo SDK 55 or newer/),
97+
reason: expect.stringMatching(/Expo SDK 54.*requires Expo SDK 55 or newer/),
8698
});
8799
});
88100
});

packages/cli/src/brownfield/utils/supportsPrebuiltRNCore.ts

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,16 @@ import { getReactNativeVersion, versionCompare } from '@rock-js/tools';
22

33
import { getExpoSdkMajor, isExpoProject } from './project.js';
44

5-
export const MIN_REACT_NATIVE_VERSION_FOR_USE_PREBUILT_RN_CORE = '0.81.0';
6-
export const MIN_EXPO_SDK_MAJOR_FOR_USE_PREBUILT_RN_CORE = 55;
5+
/** Minimum RN version that can opt in to prebuilts via `--use-prebuilt-rn-core`. */
6+
export const MIN_REACT_NATIVE_VERSION_FOR_OPT_IN_PREBUILT_RN_CORE = '0.81.0';
7+
/** Minimum RN version where Brownfield enables prebuilts by default (vanilla projects). */
8+
export const MIN_REACT_NATIVE_VERSION_FOR_PREBUILT_RN_CORE_BY_DEFAULT =
9+
'0.84.0';
10+
export const MIN_EXPO_SDK_MAJOR_FOR_PREBUILT_RN_CORE_BY_DEFAULT = 55;
711

812
export type PrebuiltRNCoreSupportResult =
9-
| { supported: true; reason?: never }
10-
| { supported: false; reason: string };
13+
| { supported: true; enabledByDefault: boolean; reason?: never }
14+
| { supported: false; enabledByDefault?: never; reason: string };
1115

1216
export function supportsPrebuiltRNCore({
1317
projectRoot,
@@ -27,12 +31,12 @@ export function supportsPrebuiltRNCore({
2731
if (
2832
versionCompare(
2933
reactNativeVersion,
30-
MIN_REACT_NATIVE_VERSION_FOR_USE_PREBUILT_RN_CORE
34+
MIN_REACT_NATIVE_VERSION_FOR_OPT_IN_PREBUILT_RN_CORE
3135
) < 0
3236
) {
3337
return {
3438
supported: false,
35-
reason: `--use-prebuilt-rn-core requires React Native ${MIN_REACT_NATIVE_VERSION_FOR_USE_PREBUILT_RN_CORE} or newer (found ${reactNativeVersion}).`,
39+
reason: `--use-prebuilt-rn-core requires React Native ${MIN_REACT_NATIVE_VERSION_FOR_OPT_IN_PREBUILT_RN_CORE} or newer (found ${reactNativeVersion}).`,
3640
};
3741
}
3842

@@ -41,15 +45,23 @@ export function supportsPrebuiltRNCore({
4145

4246
if (
4347
expoSdkMajor === null ||
44-
expoSdkMajor < MIN_EXPO_SDK_MAJOR_FOR_USE_PREBUILT_RN_CORE
48+
expoSdkMajor < MIN_EXPO_SDK_MAJOR_FOR_PREBUILT_RN_CORE_BY_DEFAULT
4549
) {
4650
const sdkLabel = expoSdkMajor === null ? 'unknown' : String(expoSdkMajor);
4751
return {
4852
supported: false,
49-
reason: `--use-prebuilt-rn-core requires Expo SDK ${MIN_EXPO_SDK_MAJOR_FOR_USE_PREBUILT_RN_CORE} or newer (found SDK ${sdkLabel}).`,
53+
reason: `--use-prebuilt-rn-core is unsupported in Expo SDK ${sdkLabel}: packaging brownfield with prebuilts requires Expo SDK ${MIN_EXPO_SDK_MAJOR_FOR_PREBUILT_RN_CORE_BY_DEFAULT} or newer.`,
5054
};
5155
}
56+
57+
return { supported: true, enabledByDefault: true };
5258
}
5359

54-
return { supported: true };
60+
const enabledByDefault =
61+
versionCompare(
62+
reactNativeVersion,
63+
MIN_REACT_NATIVE_VERSION_FOR_PREBUILT_RN_CORE_BY_DEFAULT
64+
) >= 0;
65+
66+
return { supported: true, enabledByDefault };
5567
}

0 commit comments

Comments
 (0)