TypeScript type definitions for Expo application configuration objects used in app.config.ts files
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
Expo Config Types provides comprehensive TypeScript type definitions for Expo application configuration objects used in app.config.ts files. These types ensure compile-time type safety and IDE autocompletion for all Expo configuration options, automatically generated from versioned JSON schemas maintained by the Expo server.
npm install @expo/config-typesimport { ExpoConfig } from "@expo/config-types";For CommonJS environments:
const { ExpoConfig } = require("@expo/config-types");import { ExpoConfig } from "@expo/config-types";
export default (): ExpoConfig => {
return {
name: "My Expo App",
slug: "my-expo-app",
version: "1.0.0",
orientation: "portrait",
icon: "./assets/icon.png",
userInterfaceStyle: "light",
splash: {
image: "./assets/splash.png",
resizeMode: "contain",
backgroundColor: "#ffffff"
},
platforms: ["ios", "android"],
ios: {
bundleIdentifier: "com.example.myapp"
},
android: {
package: "com.example.myapp"
}
};
};Expo Config Types is built around a hierarchical type system:
The primary ExpoConfig interface that defines all possible configuration options for Expo applications.
/**
* The standard Expo config object defined in `app.config.js` files.
*/
interface ExpoConfig {
/** The name of your app as it appears both within Expo Go and on your home screen as a standalone app */
name: string;
/** A URL-friendly name for your project that is unique across your account */
slug: string;
/** A short description of what your app is and why it is great */
description?: string;
/** The name of the Expo account that owns the project */
owner?: string;
/** Auto generated Expo account name and slug used for display purposes (@username/slug) */
currentFullName?: string;
/** Auto generated Expo account name and slug used for services (@username/slug) */
originalFullName?: string;
/** The Expo sdkVersion to run the project on */
sdkVersion?: string;
/** Property indicating compatibility between a build's native code and an OTA update */
runtimeVersion?: string | {
policy: "nativeVersion" | "sdkVersion" | "appVersion" | "fingerprint";
};
/** Your app version */
version?: string;
/** Platforms that your project explicitly supports. Defaults to ["ios", "android"] */
platforms?: ("android" | "ios" | "web")[];
/** GitHub repository URL */
githubUrl?: string;
/** Screen orientation lock */
orientation?: "default" | "portrait" | "landscape";
/** UI appearance mode */
userInterfaceStyle?: "light" | "dark" | "automatic";
/** Root view background color */
backgroundColor?: string;
/** App primary color (Android multitasker) */
primaryColor?: string;
/** App icon path/URL (1024x1024 recommended) */
icon?: string;
/** Legacy push notifications config (deprecated) */
notification?: {
icon?: string;
color?: string;
iosDisplayInForeground?: boolean;
androidMode?: "default" | "collapse";
androidCollapsedTitle?: string;
};
/** Android status bar configuration */
androidStatusBar?: {
barStyle?: "light-content" | "dark-content";
backgroundColor?: string;
hidden?: boolean;
translucent?: boolean;
};
/** Android navigation bar configuration */
androidNavigationBar?: {
visible?: "leanback" | "immersive" | "sticky-immersive";
barStyle?: "light-content" | "dark-content";
backgroundColor?: string;
enforceContrast?: boolean;
};
/** Development client settings */
developmentClient?: {
silentLaunch?: boolean;
};
/** URL scheme(s) to link into your app */
scheme?: string | string[];
/** Extra fields accessible via Constants.expoConfig.extra */
extra?: {
[k: string]: any;
};
/** EAS Updates configuration */
updates?: {
enabled?: boolean;
checkAutomatically?: "ON_ERROR_RECOVERY" | "ON_LOAD" | "WIFI_ONLY" | "NEVER";
useEmbeddedUpdate?: boolean;
fallbackToCacheTimeout?: number;
url?: string;
codeSigningCertificate?: string;
codeSigningMetadata?: {
alg?: "rsa-v1_5-sha256";
keyid?: string;
};
requestHeaders?: {
[k: string]: any;
};
assetPatternsToBeBundled?: string[];
disableAntiBrickingMeasures?: boolean;
useNativeDebug?: boolean;
};
/** App metadata localization */
locales?: {
[k: string]: string | {
[k: string]: any;
};
};
/** Asset bundle patterns (deprecated) */
assetBundlePatterns?: string[];
/** Config plugins for adding extra functionality */
plugins?: (string | [] | [string] | [string, any])[];
/** Splash screen configuration */
splash?: Splash;
/** JavaScript engine selection (deprecated) */
jsEngine?: "hermes" | "jsc";
/** React Native new architecture flag */
newArchEnabled?: boolean;
/** Remote build caching provider */
buildCacheProvider?: "eas" | {
plugin: string;
options?: {
[k: string]: any;
};
};
/** iOS-specific configuration */
ios?: IOS;
/** Android-specific configuration */
android?: Android;
/** Web-specific configuration */
web?: Web;
/** Experimental feature flags */
experiments?: {
autolinkingModuleResolution?: boolean;
baseUrl?: string;
buildCacheProvider?: "eas" | {
plugin: string;
options?: {
[k: string]: any;
};
};
supportsTVOnly?: boolean;
tsconfigPaths?: boolean;
typedRoutes?: boolean;
turboModules?: boolean;
reactCanary?: boolean;
reactCompiler?: boolean;
reactServerComponentRoutes?: boolean;
reactServerFunctions?: boolean;
};
/** Internal developer tools configuration */
_internal?: {
pluginHistory?: {
[k: string]: any;
};
[k: string]: any;
};
}Base splash screen configuration used across platforms.
/**
* Configuration for loading and splash screen for standalone apps.
*/
interface Splash {
/** Color to fill the loading screen background */
backgroundColor?: string;
/** How the image will be displayed in the splash loading screen */
resizeMode?: "cover" | "contain";
/** Local path or remote URL to an image to fill the background of the loading screen */
image?: string;
[k: string]: any;
}Configuration specific to the iOS platform including App Store deployment, certificates, and iOS-specific features.
/**
* Configuration that is specific to the iOS platform.
*/
interface IOS {
/** Apple development team ID */
appleTeamId?: string;
/** Manifest path for iOS version during publish */
publishManifestPath?: string;
/** Bundle path for iOS version during publish */
publishBundlePath?: string;
/** Bundle identifier for iOS standalone app */
bundleIdentifier?: string;
/** Build number for iOS standalone app */
buildNumber?: string;
/** Background color for iOS app */
backgroundColor?: string;
/** URL scheme(s) to link into iOS app */
scheme?: string | string[];
/** App icon for iOS */
icon?: string | IOSIcons;
/** App Store URL */
appStoreUrl?: string;
/** iOS Bitcode optimizations */
bitcode?: boolean | string;
/** Private configuration with API keys */
config?: {
branch?: {
apiKey?: string;
};
usesNonExemptEncryption?: boolean;
googleMapsApiKey?: string;
googleMobileAdsAppId?: string;
googleMobileAdsAutoInit?: boolean;
};
/** Firebase Configuration File location */
googleServicesFile?: string;
/** Tablet screen size support */
supportsTablet?: boolean;
/** Tablet-only support flag */
isTabletOnly?: boolean;
/** Disable Slide Over and Split View on iPad */
requireFullScreen?: boolean;
/** UI appearance mode */
userInterfaceStyle?: "light" | "dark" | "automatic";
/** Info.plist configuration */
infoPlist?: {
[k: string]: any;
};
/** Entitlements configuration */
entitlements?: {
[k: string]: any;
};
/** Privacy manifests configuration */
privacyManifests?: {
NSPrivacyAccessedAPITypes?: {
NSPrivacyAccessedAPIType: string;
NSPrivacyAccessedAPITypeReasons: string[];
}[];
NSPrivacyTrackingDomains?: string[];
NSPrivacyTracking?: boolean;
NSPrivacyCollectedDataTypes?: {
NSPrivacyCollectedDataType: string;
NSPrivacyCollectedDataTypeLinked: boolean;
NSPrivacyCollectedDataTypeTracking: boolean;
NSPrivacyCollectedDataTypePurposes: string[];
}[];
};
/** Associated Domains */
associatedDomains?: string[];
/** iCloud Storage usage flag */
usesIcloudStorage?: boolean;
/** Apple Sign-In usage flag */
usesAppleSignIn?: boolean;
/** Push Notifications Broadcast capability */
usesBroadcastPushNotifications?: boolean;
/** Contact notes access permission */
accessesContactNotes?: boolean;
/** iOS splash screen configuration */
splash?: {
backgroundColor?: string;
resizeMode?: "cover" | "contain";
image?: string;
tabletImage?: string;
dark?: {
backgroundColor?: string;
resizeMode?: "cover" | "contain";
image?: string;
tabletImage?: string;
[k: string]: any;
};
[k: string]: any;
};
/** JavaScript engine for iOS (deprecated) */
jsEngine?: "hermes" | "jsc";
/** New architecture flag for iOS */
newArchEnabled?: boolean;
/** Runtime version for iOS platform */
runtimeVersion?: string | {
policy: "nativeVersion" | "sdkVersion" | "appVersion" | "fingerprint";
};
/** iOS app version */
version?: string;
}iOS platform icons supporting system appearance variations.
/**
* Configuration that is specific to the iOS platform icons.
*/
interface IOSIcons {
/** Light appearance icon */
light?: string;
/** Dark appearance icon */
dark?: string;
/** Tinted appearance icon */
tinted?: string;
}Configuration specific to the Android platform including Play Store deployment and Android-specific features.
/**
* Configuration that is specific to the Android platform.
*/
interface Android {
/** Manifest path for Android version during publish */
publishManifestPath?: string;
/** Bundle path for Android version during publish */
publishBundlePath?: string;
/** Package name for Android standalone app */
package?: string;
/** Version code required by Google Play */
versionCode?: number;
/** Background color for Android app */
backgroundColor?: string;
/** UI appearance mode */
userInterfaceStyle?: "light" | "dark" | "automatic";
/** URL scheme(s) to link into Android app */
scheme?: string | string[];
/** App icon for Android */
icon?: string;
/** Adaptive Launcher Icon settings */
adaptiveIcon?: {
foregroundImage?: string;
monochromeImage?: string;
backgroundImage?: string;
backgroundColor?: string;
};
/** Google Play Store URL */
playStoreUrl?: string;
/** List of permissions to add to AndroidManifest.xml */
permissions?: string[];
/** List of permissions to block in AndroidManifest.xml */
blockedPermissions?: string[];
/** Firebase Configuration File location */
googleServicesFile?: string;
/** Private configuration with API keys */
config?: {
branch?: {
apiKey?: string;
};
googleMaps?: {
apiKey?: string;
};
googleMobileAdsAppId?: string;
googleMobileAdsAutoInit?: boolean;
};
/** Android splash screen configuration */
splash?: {
backgroundColor?: string;
resizeMode?: "cover" | "contain" | "native";
image?: string;
mdpi?: string;
hdpi?: string;
xhdpi?: string;
xxhdpi?: string;
xxxhdpi?: string;
dark?: {
backgroundColor?: string;
resizeMode?: "cover" | "contain" | "native";
image?: string;
mdpi?: string;
hdpi?: string;
xhdpi?: string;
xxhdpi?: string;
xxxhdpi?: string;
[k: string]: any;
};
[k: string]: any;
};
/** Custom intent filters configuration */
intentFilters?: {
autoVerify?: boolean;
action: string;
data?: AndroidIntentFiltersData | AndroidIntentFiltersData[];
category?: string | string[];
}[];
/** App data backup configuration */
allowBackup?: boolean;
/** Software keyboard layout mode */
softwareKeyboardLayoutMode?: "resize" | "pan";
/** JavaScript engine for Android (deprecated) */
jsEngine?: "hermes" | "jsc";
/** New architecture flag for Android */
newArchEnabled?: boolean;
/** Runtime version for Android platform */
runtimeVersion?: string | {
policy: "nativeVersion" | "sdkVersion" | "appVersion" | "fingerprint";
};
/** Android app version */
version?: string;
/** Edge-to-edge mode support */
edgeToEdgeEnabled?: boolean;
/** Predictive back gesture support */
predictiveBackGestureEnabled?: boolean;
}Data structure for Android intent filters used in deep linking configuration.
/**
* Data structure for Android intent filters
*/
interface AndroidIntentFiltersData {
/** URL scheme */
scheme?: string;
/** Hostname */
host?: string;
/** Port number */
port?: string;
/** Exact path for URLs */
path?: string;
/** Pattern for paths with wildcards */
pathPattern?: string;
/** Prefix for paths */
pathPrefix?: string;
/** Suffix for paths */
pathSuffix?: string;
/** Advanced pattern for paths (API 31+) */
pathAdvancedPattern?: string;
/** MIME type for URLs */
mimeType?: string;
}Configuration specific to the web platform including Progressive Web App (PWA) settings.
/**
* Configuration that is specific to the web platform.
*/
interface Web {
/** Web app build output mode */
output?: "single" | "static" | "server";
/** Web app favicon */
favicon?: string;
/** Web app name */
name?: string;
/** Web app short name */
shortName?: string;
/** Primary language for the app */
lang?: string;
/** Navigation scope of the website */
scope?: string;
/** Android toolbar color */
themeColor?: string;
/** General description of the website */
description?: string;
/** Text direction for name and description */
dir?: "auto" | "ltr" | "rtl";
/** Display mode for the website */
display?: "fullscreen" | "standalone" | "minimal-ui" | "browser";
/** URL that loads when user launches the application */
startUrl?: string;
/** Default orientation for browsing contexts */
orientation?: "any" | "natural" | "landscape" | "landscape-primary" | "landscape-secondary" | "portrait" | "portrait-primary" | "portrait-secondary";
/** Background color for the website */
backgroundColor?: string;
/** Status bar style */
barStyle?: "default" | "black" | "black-translucent";
/** Prefer native applications over website */
preferRelatedApplications?: boolean;
/** Experimental features */
dangerous?: {
[k: string]: any;
};
/** PWA splash screen configuration */
splash?: {
backgroundColor?: string;
resizeMode?: "cover" | "contain";
image?: string;
[k: string]: any;
};
/** Firebase web configuration */
config?: {
firebase?: {
apiKey?: string;
authDomain?: string;
databaseURL?: string;
projectId?: string;
storageBucket?: string;
messagingSenderId?: string;
appId?: string;
measurementId?: string;
[k: string]: any;
};
[k: string]: any;
};
/** Web bundler selection */
bundler?: "webpack" | "metro";
[k: string]: any;
}The package defines several union types used throughout the configuration interfaces:
/** Screen orientation options */
type Orientation = "default" | "portrait" | "landscape";
/** User interface style options */
type UserInterfaceStyle = "light" | "dark" | "automatic";
/** Platform identifiers */
type Platform = "android" | "ios" | "web";
/** JavaScript engine options (deprecated) */
type JSEngine = "hermes" | "jsc";
/** Update check modes */
type UpdateCheckMode = "ON_ERROR_RECOVERY" | "ON_LOAD" | "WIFI_ONLY" | "NEVER";
/** Web output modes */
type WebOutput = "single" | "static" | "server";
/** Runtime version policy options */
type RuntimeVersionPolicy = "nativeVersion" | "sdkVersion" | "appVersion" | "fingerprint";
/** Splash image resize modes */
type ResizeMode = "contain" | "cover" | "native";
/** Android keyboard layout modes */
type KeyboardLayoutMode = "pan" | "resize";
/** Web display modes */
type WebDisplayMode = "fullscreen" | "standalone" | "minimal-ui" | "browser";
/** Status bar styles */
type StatusBarStyle = "light-content" | "dark-content";
/** Navigation bar visibility modes */
type NavigationBarVisibility = "leanback" | "immersive" | "sticky-immersive";
/** Notification modes */
type NotificationMode = "default" | "collapse";
/** Web text direction */
type TextDirection = "auto" | "ltr" | "rtl";
/** Web status bar styles */
type WebStatusBarStyle = "default" | "black" | "black-translucent";