// Copyright 2015-present 650 Industries. All rights reserved. #import #import #import #import #import #import @import EXDevMenuInterface; @implementation EXDevLauncherRCTCxxBridge - (instancetype)initWithParentBridge:(RCTBridge *)bridge { if ((self = [super initWithParentBridge:bridge])) { RCTBridge *appBridge = [EXDevLauncherController sharedInstance].appBridge; // reset the singleton `RCTBridge.currentBridge` to app bridge instance RCTBridge.currentBridge = appBridge != nil ? appBridge.batchedBridge : nil; } return self; } /** * Theoretically, we could overwrite the `RCTDevSettings` module by exporting our version through the bridge. * However, this won't work with the js remote debugging. For some reason, the RN needs to initialized remote tools very early. So it always uses the default module to do it. * When we export our module, it won't be used in the initialized phase. So the launcher will start with remote debug support. */ - (RCTDevSettings *)devSettings { #ifdef EX_DEV_LAUNCHER_URL return super.devSettings; #endif return nil; } - (RCTDevMenu *)devMenu { return nil; } - (NSArray *)filterModuleList:(NSArray *)modules { NSArray *allowedModules = @[ @"RCT", @"DevMenu", @"ExpoBridgeModule", @"EXNativeModulesProxy", @"ViewManagerAdapter_", @"ExpoModulesCore", @"EXReactNativeEventEmitter", @"EXDevLauncherDevMenuExtensions" ]; NSArray *filteredModuleList = [modules filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id _Nullable clazz, NSDictionary * _Nullable bindings) { NSString* clazzName = NSStringFromClass(clazz); for (NSString *allowedModule in allowedModules) { if ([clazzName hasPrefix:allowedModule]) { return true; } } return false; }]]; return filteredModuleList; } - (NSArray *)_initializeModules:(NSArray *)modules withDispatchGroup:(dispatch_group_t)dispatchGroup lazilyDiscovered:(BOOL)lazilyDiscovered { return [super _initializeModules:[self filterModuleList:modules] withDispatchGroup:dispatchGroup lazilyDiscovered:lazilyDiscovered]; } @end @implementation EXDevLauncherRCTBridge - (Class)bridgeClass { return [EXDevLauncherRCTCxxBridge class]; } #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-implementations" // This method is still used so we need to override it even if it's deprecated - (void)reloadWithReason:(NSString *)reason {} #pragma clang diagnostic pop @end