expo-modules-autolinking
Version:
Scripts that autolink Expo modules.
341 lines (291 loc) • 7.91 kB
text/typescript
import { ExpoModuleConfig } from './ExpoModuleConfig';
type Required<T, K extends keyof T> = T & { [P in K]-?: T[P] };
type WithRequired<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>> & Required<T, K>;
// NOTE(@kitten): Our code has never guaranteed this to be exhaustive, hence the `| (string & {})` addition
export type SupportedPlatform =
| 'apple'
| 'ios'
| 'android'
| 'web'
| 'macos'
| 'tvos'
| 'devtools'
| (string & {});
export type PackageRevision = {
name: string;
path: string;
version: string;
config?: ExpoModuleConfig;
duplicates?: PackageRevision[];
};
export type SearchResults = {
[moduleName: string]: PackageRevision;
};
export interface ModuleAndroidProjectInfo {
name: string;
sourceDir: string;
modules: string[];
publication?: AndroidPublication;
aarProjects?: AndroidGradleAarProjectDescriptor[];
shouldUsePublicationScriptPath?: string;
}
export interface ModuleAndroidPluginInfo {
id: string;
sourceDir: string;
}
export interface ModuleAndroidAarProjectInfo extends AndroidGradleAarProjectDescriptor {
projectDir: string;
}
export interface CommonNativeModuleDescriptor {
packageName: string;
coreFeatures?: string[];
}
export interface ModuleDescriptorAndroid extends CommonNativeModuleDescriptor {
projects?: ModuleAndroidProjectInfo[];
plugins?: ModuleAndroidPluginInfo[];
}
export interface ModuleIosPodspecInfo {
podName: string;
podspecDir: string;
}
export interface ModuleDescriptorIos extends CommonNativeModuleDescriptor {
modules: string[];
pods: ModuleIosPodspecInfo[];
flags: Record<string, any> | undefined;
swiftModuleNames: string[];
appDelegateSubscribers: string[];
reactDelegateHandlers: string[];
debugOnly: boolean;
}
export interface ModuleDescriptorDevTools {
packageName: string;
packageRoot: string;
webpageRoot: string;
}
export interface ModuleDescriptorWeb {
packageName: string;
packageRoot: string;
}
export type ModuleDescriptor =
| ModuleDescriptorAndroid
| ModuleDescriptorIos
| ModuleDescriptorDevTools
| ModuleDescriptorWeb;
export interface AndroidGradlePluginDescriptor {
/**
* Gradle plugin ID
*/
id: string;
/**
* Artifact group
*/
group: string;
/**
* Relative path to the gradle plugin directory
*/
sourceDir: string;
/**
* Whether to apply the plugin to the root project
* Defaults to true
*/
applyToRootProject?: boolean;
}
export interface AndroidGradleAarProjectDescriptor {
/**
* Gradle project name
*/
name: string;
/**
* Path to the AAR file
*/
aarFilePath: string;
}
/**
* Information about the available publication of an Android AAR file.
*/
export interface AndroidPublication {
/**
* The Maven artifact ID.
*/
id: string;
/**
* The Maven group ID.
*/
group: string;
/**
* The Maven version.
*/
version: string;
/**
* The Maven repository.
*/
repository: string;
}
/**
* Represents a raw config specific to Apple platforms.
*/
export type RawModuleConfigApple = {
/**
* Names of Swift native modules classes to put to the generated modules provider file.
*/
modules?: string[];
/**
* Names of Swift classes that hooks into `ExpoAppDelegate` to receive AppDelegate life-cycle events.
*/
appDelegateSubscribers?: string[];
/**
* Names of Swift classes that implement `ExpoReactDelegateHandler` to hook React instance creation.
*/
reactDelegateHandlers?: string[];
/**
* Podspec relative path.
* To have multiple podspecs, string array type is also supported.
*/
podspecPath?: string | string[];
/**
* Swift product module name. If empty, the pod name is used for Swift imports.
* To have multiple modules, string array is also supported.
*/
swiftModuleName?: string | string[];
/**
* Whether this module will be added only to the debug configuration.
* Defaults to false.
*/
debugOnly?: boolean;
};
/**
* Represents a raw config specific to Android platforms.
*/
export type RawAndroidProjectConfig = {
/**
* The name of the project. It will be used as the Gradle project name.
*/
name?: string;
/**
* The path to the project directory. Should contain the `build.gradle{.kts}` file.
* It's relative to the module root directory.
*/
path?: string;
/**
* Information about the available publication of an Android AAR file
*/
publication?: AndroidPublication;
/**
* The path to the script that determines whether the publication should be used.
* Evaluate in the context of the `settings.gradle` file.
* Won't be run if the publication is not defined.
*/
shouldUsePublicationScriptPath?: string;
/**
* Names of the modules to be linked in the project.
*/
modules?: string[];
/**
* Prebuilded AAR projects.
*/
gradleAarProjects?: AndroidGradleAarProjectDescriptor[];
gradlePath?: string;
};
export type RawAndroidConfig = {
projects?: WithRequired<RawAndroidProjectConfig, 'name' | 'path'>[];
/**
* Gradle plugins.
*/
gradlePlugins?: AndroidGradlePluginDescriptor[];
/**
* Gradle projects containing AAR files.
*/
} & RawAndroidProjectConfig;
/**
* Represents a raw config from `expo-module.json`.
*/
export interface RawExpoModuleConfig {
/**
* An array of supported platforms.
*/
platforms?: SupportedPlatform[];
/**
* A config for all Apple platforms.
*/
apple?: RawModuleConfigApple;
/**
* The legacy config previously used for iOS platform. For backwards compatibility it's used as the fallback for `apple`.
* @deprecated As the module can now support more than iOS platform, use the generic `apple` config instead.
*/
ios?: RawModuleConfigApple;
/**
* Android-specific config.
*/
android?: RawAndroidConfig;
/**
* List of core features that this module requires.
*/
coreFeatures?: string[];
/**
* DevTools-specific config.
*/
devtools?: {
/**
* The webpage root directory for Expo CLI DevTools to serve the web resources.
*/
webpageRoot: string;
};
}
interface AndroidMavenRepositoryPasswordCredentials {
username: string;
password: string;
}
interface AndroidMavenRepositoryHttpHeaderCredentials {
name: string;
value: string;
}
interface AndroidMavenRepositoryAWSCredentials {
accessKey: string;
secretKey: string;
sessionToken?: string;
}
type AndroidMavenRepositoryCredentials =
| AndroidMavenRepositoryPasswordCredentials
| AndroidMavenRepositoryHttpHeaderCredentials
| AndroidMavenRepositoryAWSCredentials;
export interface AndroidMavenRepository {
/**
* The URL of the Maven repository.
*/
url: string;
/**
* The credentials to use when accessing the Maven repository.
* May be of type PasswordCredentials, HttpHeaderCredentials, or AWSCredentials.
*
* @see the authentication schemes section of [Gradle documentation](https://docs.gradle.org/current/userguide/declaring_repositories.html#sec:authentication_schemes) for more information.
*/
credentials?: AndroidMavenRepositoryCredentials;
/**
* The authentication scheme to use when accessing the Maven repository.
*/
authentication?: 'basic' | 'digest' | 'header';
}
interface ApplePod {
name: string;
version?: string;
configurations?: string[];
modular_headers?: boolean;
source?: string;
path?: string;
podspec?: string;
testspecs?: string[];
git?: string;
branch?: string;
tag?: string;
commit?: string;
}
export type ExtraDependencies = AndroidMavenRepository[] | ApplePod[];
/**
* Represents code signing entitlements passed to the `ExpoModulesProvider` for Apple platforms.
*/
export interface AppleCodeSignEntitlements {
/**
* @see https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_application-groups
*/
appGroups?: string[];
}