|
1 | 1 | "use strict";
|
| 2 | +var __importDefault = (this && this.__importDefault) || function (mod) { |
| 3 | + return (mod && mod.__esModule) ? mod : { "default": mod }; |
| 4 | +}; |
2 | 5 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 |
| -exports.updateIosAppDelegate = exports.updateAndroidAppGradle = void 0; |
| 6 | +exports.updateIosAppDelegate50 = exports.updateIosAppDelegate = exports.updateAndroidAppGradle = void 0; |
| 7 | +const semver_1 = __importDefault(require("semver")); |
4 | 8 | const config_plugins_1 = require("expo/config-plugins");
|
5 | 9 | const generateCode_1 = require("./generateCode");
|
6 | 10 | const withV8ExpoAdapter = (config, opts) => {
|
@@ -43,7 +47,12 @@ const withIosAppDelegate = (config) => {
|
43 | 47 | throw new Error('Must setup `expo.jsEngine` as `jsc` in app.json.');
|
44 | 48 | }
|
45 | 49 | if (config.modResults.language === 'objcpp') {
|
46 |
| - config.modResults.contents = updateIosAppDelegate(config.modResults.contents); |
| 50 | + if (config.sdkVersion && semver_1.default.lt(config.sdkVersion, '51.0.0')) { |
| 51 | + config.modResults.contents = updateIosAppDelegate50(config.modResults.contents); |
| 52 | + } |
| 53 | + else { |
| 54 | + config.modResults.contents = updateIosAppDelegate(config.modResults.contents); |
| 55 | + } |
47 | 56 | }
|
48 | 57 | else {
|
49 | 58 | throw new Error('Cannot update AppDelegate file for react-native-v8 because the file is not objcpp');
|
@@ -119,6 +128,99 @@ function updateIosAppDelegate(contents) {
|
119 | 128 | #define FOLLY_CFG_NO_COROUTINES 1
|
120 | 129 | #endif
|
121 | 130 |
|
| 131 | +#import <memory> |
| 132 | +#import <objc/runtime.h> |
| 133 | +#import <React/RCTCxxBridgeDelegate.h> |
| 134 | +#import <React/RCTJSIExecutorRuntimeInstaller.h> |
| 135 | +#import <React/RCTSurfacePresenterBridgeAdapter.h> |
| 136 | +#import <react/renderer/runtimescheduler/RuntimeScheduler.h> |
| 137 | +#import <react/renderer/runtimescheduler/RuntimeSchedulerBinding.h> |
| 138 | +#import <RNV8/V8ExecutorFactory.h> |
| 139 | +`; |
| 140 | + let mergeResults; |
| 141 | + mergeResults = (0, generateCode_1.mergeContents)({ |
| 142 | + tag: `${mergeTagPrefix}:imports`, |
| 143 | + src: contents, |
| 144 | + newSrc: imports, |
| 145 | + anchor: /^#import "AppDelegate\.h"/m, |
| 146 | + offset: 1, |
| 147 | + comment: '//', |
| 148 | + }); |
| 149 | + didMerge || (didMerge = mergeResults.didMerge); |
| 150 | + didClear || mergeResults.didClear; |
| 151 | + const swizzleJsExecutorFactory = `\ |
| 152 | +method_exchangeImplementations( |
| 153 | + class_getInstanceMethod(RCTRootViewFactory.class, @selector(jsExecutorFactoryForBridge:)), |
| 154 | + class_getInstanceMethod(self.class, @selector(jsExecutorFactoryForBridge:))); |
| 155 | +`; |
| 156 | + mergeResults = (0, generateCode_1.mergeContents)({ |
| 157 | + tag: `${mergeTagPrefix}:swizzleJsExecutorFactory`, |
| 158 | + src: mergeResults.contents, |
| 159 | + newSrc: swizzleJsExecutorFactory, |
| 160 | + anchor: /^\s*return \[super application:application didFinishLaunchingWithOptions:launchOptions]/m, |
| 161 | + offset: 0, |
| 162 | + comment: '//', |
| 163 | + }); |
| 164 | + didMerge || (didMerge = mergeResults.didMerge); |
| 165 | + didClear || mergeResults.didClear; |
| 166 | + const jsExecutorFactoryForBridge = ` |
| 167 | +- (std::unique_ptr<facebook::react::JSExecutorFactory>)jsExecutorFactoryForBridge:(RCTBridge *)bridge |
| 168 | +{ |
| 169 | + RCTAssert(!RCTIsNewArchEnabled(), @"react-native-v8 does not support new architecture yet."); |
| 170 | + auto runtimeScheduler = std::make_shared<facebook::react::RuntimeScheduler>(RCTRuntimeExecutorFromBridge(bridge)); |
| 171 | + return std::make_unique<rnv8::V8ExecutorFactory>( |
| 172 | + facebook::react::RCTJSIExecutorRuntimeInstaller([bridge, runtimeScheduler = std::move(runtimeScheduler)](facebook::jsi::Runtime &runtime) { |
| 173 | + if (!bridge) { |
| 174 | + return; |
| 175 | + } |
| 176 | + if (runtimeScheduler) { |
| 177 | + facebook::react::RuntimeSchedulerBinding::createAndInstallIfNeeded(runtime, runtimeScheduler); |
| 178 | + } |
| 179 | + })); |
| 180 | +} |
| 181 | +`; |
| 182 | + mergeResults = (0, generateCode_1.mergeContents)({ |
| 183 | + tag: `${mergeTagPrefix}:jsExecutorFactoryForBridge`, |
| 184 | + src: mergeResults.contents, |
| 185 | + newSrc: jsExecutorFactoryForBridge, |
| 186 | + anchor: /^@end$/gm, |
| 187 | + findLastAnchor: true, |
| 188 | + offset: 0, |
| 189 | + comment: '//', |
| 190 | + }); |
| 191 | + didMerge || (didMerge = mergeResults.didMerge); |
| 192 | + didClear || mergeResults.didClear; |
| 193 | + if (didMerge || didClear) { |
| 194 | + return mergeResults.contents; |
| 195 | + } |
| 196 | + return contents; |
| 197 | +} |
| 198 | +exports.updateIosAppDelegate = updateIosAppDelegate; |
| 199 | +function updateIosAppDelegate50(contents) { |
| 200 | + const mergeTagPrefix = 'react-native-v8'; |
| 201 | + let didMerge = false; |
| 202 | + let didClear = false; |
| 203 | + const imports = `\ |
| 204 | +#ifndef FOLLY_NO_CONFIG |
| 205 | +#define FOLLY_NO_CONFIG 1 |
| 206 | +#endif |
| 207 | +
|
| 208 | +#ifndef FOLLY_MOBILE |
| 209 | +#define FOLLY_MOBILE 1 |
| 210 | +#endif |
| 211 | +
|
| 212 | +#ifndef FOLLY_USE_LIBCPP |
| 213 | +#define FOLLY_USE_LIBCPP 1 |
| 214 | +#endif |
| 215 | +
|
| 216 | +#ifndef FOLLY_HAVE_PTHREAD |
| 217 | +#define FOLLY_HAVE_PTHREAD 1 |
| 218 | +#endif |
| 219 | +
|
| 220 | +#ifndef FOLLY_CFG_NO_COROUTINES |
| 221 | +#define FOLLY_CFG_NO_COROUTINES 1 |
| 222 | +#endif |
| 223 | +
|
122 | 224 | #import <memory>
|
123 | 225 | #import <React/RCTCxxBridgeDelegate.h>
|
124 | 226 | #import <React/RCTJSIExecutorRuntimeInstaller.h>
|
@@ -209,4 +311,4 @@ function updateIosAppDelegate(contents) {
|
209 | 311 | }
|
210 | 312 | return contents;
|
211 | 313 | }
|
212 |
| -exports.updateIosAppDelegate = updateIosAppDelegate; |
| 314 | +exports.updateIosAppDelegate50 = updateIosAppDelegate50; |
0 commit comments