Skip to content

Commit bec7bfa

Browse files
authored
refactor(apple): use feature flags evaluated in JS (#2431)
1 parent e99cf68 commit bec7bfa

File tree

7 files changed

+30
-100
lines changed

7 files changed

+30
-100
lines changed

ios/app.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ import {
1313
import { cp_r, mkdir_p, rm_r } from "../scripts/utils/filesystem.mjs";
1414
import { generateAssetsCatalogs } from "./assetsCatalog.mjs";
1515
import { generateEntitlements } from "./entitlements.mjs";
16+
import { isBridgelessEnabled, isNewArchEnabled } from "./features.mjs";
1617
import { generateInfoPlist } from "./infoPlist.mjs";
1718
import { generateLocalizations, getProductName } from "./localizations.mjs";
18-
import { isBridgelessEnabled, isNewArchEnabled } from "./newArch.mjs";
1919
import { generatePrivacyManifest } from "./privacyManifest.mjs";
2020
import { isObject, isString, projectPath, resolveResources } from "./utils.mjs";
2121
import {

ios/newArch.mjs renamed to ios/features.mjs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
// @ts-check
2+
/** @import { JSONObject } from "../scripts/types.ts"; */
23
import { v } from "../scripts/helpers.js";
34

4-
/**
5-
* @typedef {import("../scripts/types.ts").JSONObject} JSONObject;
6-
*/
7-
85
/**
96
* @param {number} reactNativeVersion
107
*/
11-
export function supportsNewArch(reactNativeVersion) {
8+
function supportsNewArch(reactNativeVersion) {
129
return reactNativeVersion === 0 || reactNativeVersion >= v(0, 71, 0);
1310
}
1411

@@ -27,7 +24,16 @@ export function isNewArchEnabled(options, reactNativeVersion) {
2724
return envVar !== "0";
2825
}
2926

30-
return Boolean(options["fabricEnabled"]);
27+
if ("newArchEnabled" in options) {
28+
return Boolean(options["newArchEnabled"]);
29+
}
30+
31+
if ("fabricEnabled" in options) {
32+
return Boolean(options["fabricEnabled"]);
33+
}
34+
35+
// TODO: https://github.com/microsoft/react-native-test-app/issues/2321
36+
return false;
3137
}
3238

3339
/**

ios/pod_helpers.rb

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,6 @@ def assert_version(pod_version)
1818
"#{pod_version}, expected >=1.13"
1919
end
2020

21-
def bridgeless_enabled?(options, react_native_version)
22-
new_architecture_enabled?(options, react_native_version) && (
23-
(react_native_version >= v(0, 74, 0) && options[:bridgeless_enabled] != false) ||
24-
(react_native_version >= v(0, 73, 0) && options[:bridgeless_enabled])
25-
)
26-
end
27-
2821
def find_file(file_name, current_dir)
2922
return if current_dir.expand_path.to_s == '/'
3023

@@ -34,16 +27,6 @@ def find_file(file_name, current_dir)
3427
find_file(file_name, current_dir.parent)
3528
end
3629

37-
def new_architecture_enabled?(options, react_native_version)
38-
return false unless supports_new_architecture?(react_native_version)
39-
40-
ENV.fetch('RCT_NEW_ARCH_ENABLED', options[:fabric_enabled] ? '1' : '0') != '0'
41-
end
42-
43-
def supports_new_architecture?(react_native_version)
44-
react_native_version.zero? || react_native_version >= v(0, 71, 0)
45-
end
46-
4730
def use_hermes?(options)
4831
use_hermes = ENV.fetch('USE_HERMES', nil)
4932
return use_hermes == '1' unless use_hermes.nil?
@@ -56,7 +39,7 @@ def use_hermes?(options)
5639
end
5740

5841
def use_new_architecture!(options, react_native_version)
59-
return unless new_architecture_enabled?(options, react_native_version)
42+
return unless options[:use_new_arch]
6043

6144
if react_native_version < v(0, 76, 0)
6245
Pod::UI.warn(
@@ -69,7 +52,7 @@ def use_new_architecture!(options, react_native_version)
6952
options[:fabric_enabled] = true
7053
options[:new_arch_enabled] = true
7154
ENV['RCT_NEW_ARCH_ENABLED'] = '1'
72-
ENV['USE_BRIDGELESS'] = '1' if bridgeless_enabled?(options, react_native_version)
55+
ENV['USE_BRIDGELESS'] = '1' if options[:use_bridgeless]
7356
end
7457

7558
def v(major, minor, patch)

ios/test_app.rb

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -102,14 +102,18 @@ def resources_pod(project_root, platforms, resources)
102102
Pathname.new(app_dir).relative_path_from(project_root).to_s
103103
end
104104

105-
def use_react_native!(project_root, react_native, version, options)
106-
require_relative(react_native_pods(version))
105+
def use_react_native!(project_root, project, options)
106+
require_relative(react_native_pods(project[:react_native_version]))
107+
108+
react_native_path = Pathname.new(project[:react_native_path])
107109

108110
include_react_native!(**options,
109111
app_path: find_file('package.json', project_root).parent.to_s,
110-
path: Pathname.new(react_native).relative_path_from(project_root).to_s,
112+
path: react_native_path.relative_path_from(project_root).to_s,
111113
rta_project_root: project_root,
112-
version: version)
114+
use_new_arch: project[:use_new_arch],
115+
use_bridgeless: project[:use_bridgeless],
116+
version: project[:react_native_version])
113117
end
114118

115119
def make_project!(project_root, target_platform, options)
@@ -165,6 +169,7 @@ def make_project!(project_root, target_platform, options)
165169
:react_native_host_path => project['reactNativeHostPath'],
166170
:community_autolinking_script_path => project['communityAutolinkingScriptPath'],
167171
:use_new_arch => project['useNewArch'],
172+
:use_bridgeless => project['useBridgeless'],
168173
:code_sign_identity => build_settings[CODE_SIGN_IDENTITY] || '',
169174
:development_team => build_settings[DEVELOPMENT_TEAM] || '',
170175
:resources => project['resources'],
@@ -179,11 +184,9 @@ def use_test_app_internal!(target_platform, options)
179184
xcodeproj = 'ReactTestApp.xcodeproj'
180185
project_root = Pod::Config.instance.installation_root
181186
project_target = make_project!(project_root, target_platform, options)
182-
xcodeproj_dst, platforms, react_native_path, react_native_version = project_target.values_at(
183-
:xcodeproj_path, :platforms, :react_native_path, :react_native_version
184-
)
187+
xcodeproj_dst, platforms = project_target.values_at(:xcodeproj_path, :platforms)
185188

186-
if project_target[:use_new_arch] || react_native_version >= v(0, 73, 0)
189+
if project_target[:use_new_arch] || project_target[:react_native_version] >= v(0, 73, 0)
187190
install! 'cocoapods', :deterministic_uuids => false
188191
end
189192

@@ -205,10 +208,7 @@ def use_test_app_internal!(target_platform, options)
205208
react_native_post_install = nil
206209

207210
target 'ReactTestApp' do
208-
react_native_post_install = use_react_native!(project_root,
209-
react_native_path,
210-
react_native_version,
211-
options)
211+
react_native_post_install = use_react_native!(project_root, project_target, options)
212212

213213
pod 'ReactNativeHost', :path => project_target[:react_native_host_path]
214214

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { ok } from "node:assert/strict";
22
import { afterEach, before, describe, it } from "node:test";
3-
import { isBridgelessEnabled, isNewArchEnabled } from "../../ios/newArch.mjs";
3+
import { isBridgelessEnabled, isNewArchEnabled } from "../../ios/features.mjs";
44
import { v } from "../../scripts/helpers.js";
55

66
describe("isBridgelessEnabled()", () => {
@@ -69,6 +69,7 @@ describe("isNewArchEnabled()", () => {
6969
// New architecture is first publicly available in 0.68, but we'll require 0.71
7070
ok(!isNewArchEnabled({ fabricEnabled: true }, v(0, 70, 999)));
7171
ok(isNewArchEnabled({ fabricEnabled: true }, firstAvailableVersion));
72+
ok(isNewArchEnabled({ newArchEnabled: true }, firstAvailableVersion));
7273
});
7374

7475
it("returns true if `RCT_NEW_ARCH_ENABLED=1`", () => {

test/pack.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,9 +154,9 @@ describe("npm pack", () => {
154154
"ios/app.mjs",
155155
"ios/assetsCatalog.mjs",
156156
"ios/entitlements.mjs",
157+
"ios/features.mjs",
157158
"ios/infoPlist.mjs",
158159
"ios/localizations.mjs",
159-
"ios/newArch.mjs",
160160
"ios/pod_helpers.rb",
161161
"ios/privacyManifest.mjs",
162162
"ios/test_app.rb",

test/test_pod_helpers.rb

Lines changed: 0 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -17,66 +17,6 @@ def test_assert_version
1717
end
1818
end
1919

20-
def test_bridgeless_enabled?
21-
ENV.delete('RCT_NEW_ARCH_ENABLED')
22-
23-
# Bridgeless mode is first publicly available in 0.73
24-
available_version = v(0, 73, 0)
25-
26-
# Bridgeless mode is enabled by default starting with 0.74
27-
default_version = v(0, 74, 0)
28-
29-
refute(bridgeless_enabled?({}, 0))
30-
refute(bridgeless_enabled?({}, available_version))
31-
32-
options = { bridgeless_enabled: true, fabric_enabled: true }
33-
34-
refute(bridgeless_enabled?(options, v(0, 72, 999)))
35-
assert(bridgeless_enabled?(options, available_version))
36-
37-
# Bridgeless mode is enabled by default starting with 0.74 unless opted-out of
38-
assert(bridgeless_enabled?({ fabric_enabled: true }, default_version))
39-
refute(bridgeless_enabled?({ bridgeless_enabled: false, fabric_enabled: true },
40-
default_version))
41-
42-
# `RCT_NEW_ARCH_ENABLED` does not enable bridgeless
43-
ENV['RCT_NEW_ARCH_ENABLED'] = '1'
44-
45-
refute(bridgeless_enabled?({}, v(0, 72, 999)))
46-
refute(bridgeless_enabled?({}, available_version))
47-
assert(bridgeless_enabled?({}, default_version))
48-
refute(bridgeless_enabled?({ bridgeless_enabled: false }, default_version))
49-
end
50-
51-
def test_new_architecture_enabled?
52-
ENV.delete('RCT_NEW_ARCH_ENABLED')
53-
54-
# New architecture is first publicly available in 0.68, but we'll require 0.71
55-
available_version = v(0, 71, 0)
56-
57-
refute(new_architecture_enabled?({}, 0))
58-
refute(new_architecture_enabled?({}, available_version))
59-
60-
# New architecture is first publicly available in 0.68, but we'll require 0.71
61-
refute(new_architecture_enabled?({ fabric_enabled: true }, v(0, 70, 999)))
62-
assert(new_architecture_enabled?({ fabric_enabled: true }, available_version))
63-
64-
# `RCT_NEW_ARCH_ENABLED` enables everything
65-
ENV['RCT_NEW_ARCH_ENABLED'] = '1'
66-
67-
refute(new_architecture_enabled?({}, v(0, 70, 999)))
68-
assert(new_architecture_enabled?({}, available_version))
69-
70-
# `RCT_NEW_ARCH_ENABLED` disables everything
71-
ENV['RCT_NEW_ARCH_ENABLED'] = '0'
72-
73-
refute(new_architecture_enabled?({}, v(0, 70, 999)))
74-
refute(new_architecture_enabled?({}, available_version))
75-
refute(new_architecture_enabled?({ fabric_enabled: true }, available_version))
76-
77-
ENV.delete('RCT_NEW_ARCH_ENABLED')
78-
end
79-
8020
def test_use_hermes?
8121
options = { path: '../node_modules/react-native' }
8222

0 commit comments

Comments
 (0)