React Native CLI configuration generation for seamless integration with existing React Native projects and build workflows, providing compatibility with React Native's autolinking system.
Generate React Native CLI compatible configuration for seamless project integration.
/**
* Generate React Native CLI configuration
* @param platform - Target platform for configuration
* @param projectRoot - Project root directory
* @param options - Configuration generation options
* @returns Promise resolving to React Native configuration object
*/
function generateReactNativeConfig(
platform: SupportedPlatform,
projectRoot: string,
options?: ReactNativeConfigOptions
): Promise<RNConfigReactNativeProjectConfig>;
interface RNConfigReactNativeProjectConfig {
/** Package dependencies with configuration */
dependencies: { [packageName: string]: any };
/** Available CLI commands */
commands: any[];
/** Platform-specific configurations */
platforms: any;
/** Project-specific settings */
project: any;
}Usage Examples:
import { generateReactNativeConfig } from "expo-modules-autolinking";
// Generate iOS configuration
const iosConfig = await generateReactNativeConfig("ios", "/path/to/project", {
includeDevDependencies: false,
excludePackages: ["react-native-vector-icons"]
});
// Generate Android configuration
const androidConfig = await generateReactNativeConfig("android", "/path/to/project", {
useHermes: true,
enableProguard: true
});
console.log("iOS dependencies:", Object.keys(iosConfig.dependencies));
console.log("Android dependencies:", Object.keys(androidConfig.dependencies));Resolve React Native modules with Expo module compatibility.
/**
* Resolve React Native module configuration
* @param packageName - Name of the package to resolve
* @param packagePath - Path to the package directory
* @param platform - Target platform
* @returns Promise resolving to resolved module configuration
*/
function resolveReactNativeModule(
packageName: string,
packagePath: string,
platform: SupportedPlatform
): Promise<ResolvedReactNativeModule>;
interface ResolvedReactNativeModule {
name: string;
path: string;
platforms: {
[platform: string]: PlatformConfiguration;
};
assets?: string[];
hooks?: ModuleHooks;
}Usage Examples:
import { resolveReactNativeModule } from "expo-modules-autolinking";
// Resolve individual module
const resolvedModule = await resolveReactNativeModule(
"react-native-vector-icons",
"/path/to/node_modules/react-native-vector-icons",
"ios"
);
console.log("Module platforms:", Object.keys(resolvedModule.platforms));
console.log("Module assets:", resolvedModule.assets);Load and parse React Native project configuration files.
/**
* Load React Native configuration from project
* @param projectRoot - Project root directory
* @param options - Configuration loading options
* @returns Promise resolving to loaded configuration
*/
function loadConfigAsync(
projectRoot: string,
options?: ConfigLoadOptions
): Promise<ReactNativeConfig>;
interface ReactNativeConfig {
root: string;
reactNativePath: string;
dependencies: { [name: string]: any };
commands: any[];
platforms: { [name: string]: any };
project: {
ios?: IOSProjectConfig;
android?: AndroidProjectConfig;
};
}
interface ConfigLoadOptions {
platform?: SupportedPlatform;
searchPaths?: string[];
excludePackages?: string[];
}Usage Examples:
import { loadConfigAsync } from "expo-modules-autolinking";
// Load full project configuration
const config = await loadConfigAsync("/path/to/project", {
platform: "ios",
excludePackages: ["problematic-package"]
});
// Access platform-specific configuration
const iosProject = config.project.ios;
const androidProject = config.project.android;
console.log("React Native path:", config.reactNativePath);
console.log("Available commands:", config.commands.map(cmd => cmd.name));iOS-specific configuration structures for React Native integration.
interface IOSProjectConfig {
/** Xcode project file path */
project: string;
/** Target scheme name */
scheme?: string;
/** Source directory */
sourceDir: string;
/** Build configurations */
configurations?: string[];
/** Pod installation directory */
podfile?: string;
/** CocoaPods specifications */
podspec?: string;
}
interface IOSModuleConfig {
/** Pod name */
podspecPath?: string;
/** Configuration settings */
configurations?: string[];
/** Module source files */
sourceFiles?: string[];
/** Header search paths */
headerSearchPaths?: string[];
/** Framework search paths */
frameworkSearchPaths?: string[];
}Functions for resolving iOS-specific module configurations.
/**
* Resolve iOS module configuration from package
* @param packagePath - Path to package directory
* @param packageConfig - Package configuration object
* @returns Resolved iOS module configuration
*/
function resolveIOSModule(
packagePath: string,
packageConfig: any
): IOSModuleConfig;
/**
* Generate iOS project configuration
* @param projectRoot - Project root directory
* @param modules - Array of resolved modules
* @returns iOS project configuration object
*/
function generateIOSProjectConfig(
projectRoot: string,
modules: ResolvedReactNativeModule[]
): IOSProjectConfig;Usage Examples:
import { resolveIOSModule, generateIOSProjectConfig } from "expo-modules-autolinking";
// Resolve iOS module
const iosModule = resolveIOSModule(
"/path/to/module",
{ podspecPath: "MyModule.podspec" }
);
// Generate iOS project configuration
const iosProjectConfig = generateIOSProjectConfig("/path/to/project", resolvedModules);
console.log("iOS project file:", iosProjectConfig.project);Android-specific configuration structures for React Native integration.
interface AndroidProjectConfig {
/** Source directory containing build.gradle */
sourceDir: string;
/** Application ID */
appName: string;
/** Package name */
packageName?: string;
/** Main activity class name */
mainActivity?: string;
/** Manifest file path */
manifestPath?: string;
/** Build types configuration */
buildTypes?: { [name: string]: any };
/** Product flavors configuration */
productFlavors?: { [name: string]: any };
}
interface AndroidModuleConfig {
/** Source directory */
sourceDir: string;
/** Package name */
packageImportPath?: string;
/** Dependency configuration */
dependency?: {
platforms: {
android: {
sourceDir: string;
};
};
};
}Functions for resolving Android-specific module configurations.
/**
* Resolve Android module configuration from package
* @param packagePath - Path to package directory
* @param packageConfig - Package configuration object
* @returns Resolved Android module configuration
*/
function resolveAndroidModule(
packagePath: string,
packageConfig: any
): AndroidModuleConfig;
/**
* Generate Android project configuration
* @param projectRoot - Project root directory
* @param modules - Array of resolved modules
* @returns Android project configuration object
*/
function generateAndroidProjectConfig(
projectRoot: string,
modules: ResolvedReactNativeModule[]
): AndroidProjectConfig;Usage Examples:
import { resolveAndroidModule, generateAndroidProjectConfig } from "expo-modules-autolinking";
// Resolve Android module
const androidModule = resolveAndroidModule(
"/path/to/module",
{ sourceDir: "./android" }
);
// Generate Android project configuration
const androidProjectConfig = generateAndroidProjectConfig("/path/to/project", resolvedModules);
console.log("Android source dir:", androidProjectConfig.sourceDir);Utilities for configuring React Native dependencies.
/**
* Configure dependency for React Native
* @param packageName - Name of the package
* @param packagePath - Path to package directory
* @param platform - Target platform
* @returns Dependency configuration object
*/
function configureDependency(
packageName: string,
packagePath: string,
platform: SupportedPlatform
): DependencyConfiguration;
interface DependencyConfiguration {
name: string;
path: string;
platforms: {
[platform: string]: PlatformConfiguration;
};
assets?: string[];
hooks?: ModuleHooks;
}
interface PlatformConfiguration {
sourceDir?: string;
project?: string;
podspecPath?: string;
packageImportPath?: string;
}Configuration for module lifecycle hooks and events.
interface ModuleHooks {
/** Pre-install hook script */
preInstall?: string;
/** Post-install hook script */
postInstall?: string;
/** Pre-uninstall hook script */
preUninstall?: string;
/** Post-uninstall hook script */
postUninstall?: string;
}Usage Examples:
import { configureDependency } from "expo-modules-autolinking";
// Configure dependency with hooks
const depConfig = configureDependency("my-native-module", "/path/to/module", "ios");
// Add custom hooks
depConfig.hooks = {
postInstall: "cd ios && pod install",
preUninstall: "cd ios && pod deintegrate"
};Example of complete React Native integration workflow.
import {
loadConfigAsync,
generateReactNativeConfig,
resolveReactNativeModule,
configureDependency
} from "expo-modules-autolinking";
async function integrateWithReactNative(projectRoot: string, platform: SupportedPlatform) {
// 1. Load existing React Native configuration
const existingConfig = await loadConfigAsync(projectRoot, { platform });
// 2. Generate Expo modules configuration
const expoConfig = await generateReactNativeConfig(platform, projectRoot);
// 3. Merge configurations
const mergedConfig = {
...existingConfig,
dependencies: {
...existingConfig.dependencies,
...expoConfig.dependencies
}
};
// 4. Resolve individual modules
const resolvedModules = await Promise.all(
Object.keys(expoConfig.dependencies).map(packageName =>
resolveReactNativeModule(
packageName,
expoConfig.dependencies[packageName].path,
platform
)
)
);
return { mergedConfig, resolvedModules };
}Integration with Metro bundler for React Native projects.
/**
* Generate Metro configuration for Expo modules
* @param projectRoot - Project root directory
* @param modules - Array of resolved modules
* @returns Metro configuration object
*/
function generateMetroConfig(
projectRoot: string,
modules: ResolvedReactNativeModule[]
): MetroConfig;
interface MetroConfig {
resolver: {
platforms: string[];
sourceExts: string[];
assetExts: string[];
};
transformer: {
babelTransformerPath?: string;
assetPlugins?: string[];
};
serializer: {
platforms: string[];
};
}Usage Examples:
import { generateMetroConfig } from "expo-modules-autolinking";
// Generate Metro configuration
const metroConfig = generateMetroConfig("/path/to/project", resolvedModules);
// Write to metro.config.js
const configContent = `
module.exports = ${JSON.stringify(metroConfig, null, 2)};
`;