react-native-app-auth
Version:
React Native bridge for AppAuth for supporting any OAuth 2 provider
87 lines (71 loc) • 2.68 kB
text/typescript
import * as fs from 'fs';
import * as path from 'path';
import { withDangerousMod, withXcodeProject, ConfigPlugin } from '@expo/config-plugins';
import { isExpo53OrLater } from '../expo-version';
const BRIDGING_HEADER_NAME = 'AppDelegate+RNAppAuth.h';
const BRIDGING_HEADER_CONTENT = '#import "RNAppAuthAuthorizationFlowManager.h"\n';
interface ConfigWithBridgingHeader {
_createdBridgingHeader?: string;
[key: string]: any;
}
const findBridgingHeader = (dir: string): string | null => {
const files = fs.readdirSync(dir);
// First check current directory
const headerInCurrentDir = files.find(f => f.endsWith('-Bridging-Header.h') || f.endsWith('.h'));
if (headerInCurrentDir) {
return path.join(dir, headerInCurrentDir);
}
// Then check subdirectories
for (const file of files) {
const fullPath = path.join(dir, file);
if (fs.statSync(fullPath).isDirectory()) {
const found = findBridgingHeader(fullPath);
if (found) {
return found;
}
}
}
return null;
};
export const withBridgingHeader: ConfigPlugin = rootConfig => {
if (!isExpo53OrLater(rootConfig)) {
return rootConfig;
}
return withDangerousMod(rootConfig, [
'ios',
config => {
const iosPath = path.join(config.modRequest.projectRoot, 'ios');
// Search for existing bridging header in the project and subfolders
const existingHeaderPath = findBridgingHeader(iosPath);
const importLine = BRIDGING_HEADER_CONTENT;
let headerPath: string;
if (existingHeaderPath) {
headerPath = existingHeaderPath;
const content = fs.readFileSync(headerPath, 'utf8');
if (!content.includes(importLine)) {
fs.writeFileSync(headerPath, `${importLine}\n${content}`);
}
} else {
// Default to new file if none found
headerPath = path.join(iosPath, BRIDGING_HEADER_NAME);
fs.writeFileSync(headerPath, `${importLine}\n`);
(config as ConfigWithBridgingHeader)._createdBridgingHeader = BRIDGING_HEADER_NAME;
}
return config;
},
]);
};
export const withXcodeBuildSettings: ConfigPlugin = rootConfig =>
withXcodeProject(rootConfig, config => {
const project = config.modResults;
const target = project.getFirstTarget().uuid;
const currentSetting = project.getBuildProperty('SWIFT_OBJC_BRIDGING_HEADER', target);
if (!currentSetting && (config as ConfigWithBridgingHeader)._createdBridgingHeader) {
project.addBuildProperty(
'SWIFT_OBJC_BRIDGING_HEADER',
`$(SRCROOT)/${(config as ConfigWithBridgingHeader)._createdBridgingHeader}`,
target
);
}
return config;
});