UNPKG

@react-native-firebase/app

Version:

A well tested, feature rich Firebase implementation for React Native, supporting iOS & Android. Individual module support for Admob, Analytics, Auth, Crash Reporting, Cloud Firestore, Database, Dynamic Links, Functions, Messaging (FCM), Remote Config, Sto

117 lines (116 loc) 5.35 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.withFirebaseAppDelegate = void 0; exports.modifyObjcAppDelegate = modifyObjcAppDelegate; exports.modifySwiftAppDelegate = modifySwiftAppDelegate; exports.modifyAppDelegateAsync = modifyAppDelegateAsync; const config_plugins_1 = require("@expo/config-plugins"); const generateCode_1 = require("@expo/config-plugins/build/utils/generateCode"); const fs_1 = __importDefault(require("fs")); function modifyObjcAppDelegate(contents) { const methodInvocationBlock = `[FIRApp configure];`; // https://regex101.com/r/mPgaq6/1 const methodInvocationLineMatcher = /(?:self\.moduleName\s*=\s*@\"([^"]*)\";)|(?:(self\.|_)(\w+)\s?=\s?\[\[UMModuleRegistryAdapter alloc\])|(?:RCTBridge\s?\*\s?(\w+)\s?=\s?\[(\[RCTBridge alloc\]|self\.reactDelegate))/g; // https://regex101.com/r/nHrTa9/1/ // if the above regex fails, we can use this one as a fallback: const fallbackInvocationLineMatcher = /-\s*\(BOOL\)\s*application:\s*\(UIApplication\s*\*\s*\)\s*\w+\s+didFinishLaunchingWithOptions:/g; // Add import if (!contents.includes('#import <Firebase/Firebase.h>')) { contents = contents.replace(/#import "AppDelegate.h"/g, `#import "AppDelegate.h" #import <Firebase/Firebase.h>`); } // To avoid potential issues with existing changes from older plugin versions if (contents.includes(methodInvocationBlock)) { return contents; } if (!methodInvocationLineMatcher.test(contents) && !fallbackInvocationLineMatcher.test(contents)) { config_plugins_1.WarningAggregator.addWarningIOS('@react-native-firebase/app', 'Unable to determine correct Firebase insertion point in AppDelegate.m. Skipping Firebase addition.'); return contents; } // Add invocation try { return (0, generateCode_1.mergeContents)({ tag: '@react-native-firebase/app-didFinishLaunchingWithOptions', src: contents, newSrc: methodInvocationBlock, anchor: methodInvocationLineMatcher, offset: 0, // new line will be inserted right above matched anchor comment: '//', }).contents; } catch (_) { // tests if the opening `{` is in the new line const multilineMatcher = new RegExp(fallbackInvocationLineMatcher.source + '.+\\n*{'); const isHeaderMultiline = multilineMatcher.test(contents); // we fallback to another regex if the first one fails return (0, generateCode_1.mergeContents)({ tag: '@react-native-firebase/app-didFinishLaunchingWithOptions-fallback', src: contents, newSrc: methodInvocationBlock, anchor: fallbackInvocationLineMatcher, // new line will be inserted right below matched anchor // or two lines, if the `{` is in the new line offset: isHeaderMultiline ? 2 : 1, comment: '//', }).contents; } } function modifySwiftAppDelegate(contents) { const methodInvocationBlock = `FirebaseApp.configure()`; const methodInvocationLineMatcher = /(?:self\.moduleName\s*=\s*"([^"]*)")|(?:factory\.startReactNative\()/; // Add import if (!contents.includes('import FirebaseCore')) { contents = contents.replace(/import Expo/g, `import Expo import FirebaseCore`); } // To avoid potential issues with existing changes from older plugin versions if (contents.includes(methodInvocationBlock)) { return contents; } if (!methodInvocationLineMatcher.test(contents)) { config_plugins_1.WarningAggregator.addWarningIOS('@react-native-firebase/app', 'Unable to determine correct Firebase insertion point in AppDelegate.swift. Skipping Firebase addition.'); return contents; } // Add invocation return (0, generateCode_1.mergeContents)({ tag: '@react-native-firebase/app-didFinishLaunchingWithOptions', src: contents, newSrc: methodInvocationBlock, anchor: methodInvocationLineMatcher, offset: 0, // new line will be inserted right above matched anchor comment: '//', }).contents; } async function modifyAppDelegateAsync(appDelegateFileInfo) { const { language, path, contents } = appDelegateFileInfo; let newContents = contents; switch (language) { case 'objc': case 'objcpp': { newContents = modifyObjcAppDelegate(contents); break; } case 'swift': { newContents = modifySwiftAppDelegate(contents); break; } default: throw new Error(`Cannot add Firebase code to AppDelegate of language "${language}"`); } await fs_1.default.promises.writeFile(path, newContents); } const withFirebaseAppDelegate = config => { return (0, config_plugins_1.withDangerousMod)(config, [ 'ios', async (config) => { const fileInfo = config_plugins_1.IOSConfig.Paths.getAppDelegate(config.modRequest.projectRoot); await modifyAppDelegateAsync(fileInfo); return config; }, ]); }; exports.withFirebaseAppDelegate = withFirebaseAppDelegate;