Skip to content

Instantly share code, notes, and snippets.

@irisjae
Last active August 2, 2023 11:22
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save irisjae/08f55a52f7e4bcb81613061fc21746d7 to your computer and use it in GitHub Desktop.
Save irisjae/08f55a52f7e4bcb81613061fc21746d7 to your computer and use it in GitHub Desktop.
EAS patches for offline
--- a/eas-cli/build/analytics/AnalyticsManager.js
+++ b/eas-cli/build/analytics/AnalyticsManager.js
@@ -91,31 +91,31 @@ exports.getAnalyticsEnabledAsync = getAnalyticsEnabledAsync;
* Create an instance of Analytics based on the user's analytics enabled preferences.
*/
async function createAnalyticsAsync() {
- // TODO: remove after some time
- const amplitudeEnabled = await UserSettings_1.default.getAsync(USER_SETTINGS_KEY_AMPLITUDE_ENABLED, null);
- if (amplitudeEnabled !== null) {
- await UserSettings_1.default.setAsync(USER_SETTINGS_KEY_ANALYTICS_ENABLED, amplitudeEnabled);
- await UserSettings_1.default.deleteKeyAsync(USER_SETTINGS_KEY_AMPLITUDE_ENABLED);
- }
- const amplitudeDeviceId = await UserSettings_1.default.getAsync(USER_SETTINGS_KEY_AMPLITUDE_DEVICE_ID, null);
- if (amplitudeDeviceId !== null) {
- await UserSettings_1.default.setAsync(USER_SETTINGS_KEY_ANALYTICS_DEVICE_ID, amplitudeDeviceId);
- await UserSettings_1.default.deleteKeyAsync(USER_SETTINGS_KEY_AMPLITUDE_DEVICE_ID);
- }
- if (process.env.DISABLE_EAS_ANALYTICS) {
- await UserSettings_1.default.setAsync(USER_SETTINGS_KEY_ANALYTICS_ENABLED, false);
- }
- const analyticsEnabled = !process.env.https_proxy && // disable analytics if running behind proxy
- (await UserSettings_1.default.getAsync(USER_SETTINGS_KEY_ANALYTICS_ENABLED, true));
- if (!analyticsEnabled) {
+ // // TODO: remove after some time
+ // const amplitudeEnabled = await UserSettings_1.default.getAsync(USER_SETTINGS_KEY_AMPLITUDE_ENABLED, null);
+ // if (amplitudeEnabled !== null) {
+ // await UserSettings_1.default.setAsync(USER_SETTINGS_KEY_ANALYTICS_ENABLED, amplitudeEnabled);
+ // await UserSettings_1.default.deleteKeyAsync(USER_SETTINGS_KEY_AMPLITUDE_ENABLED);
+ // }
+ // const amplitudeDeviceId = await UserSettings_1.default.getAsync(USER_SETTINGS_KEY_AMPLITUDE_DEVICE_ID, null);
+ // if (amplitudeDeviceId !== null) {
+ // await UserSettings_1.default.setAsync(USER_SETTINGS_KEY_ANALYTICS_DEVICE_ID, amplitudeDeviceId);
+ // await UserSettings_1.default.deleteKeyAsync(USER_SETTINGS_KEY_AMPLITUDE_DEVICE_ID);
+ // }
+ // if (process.env.DISABLE_EAS_ANALYTICS) {
+ // await UserSettings_1.default.setAsync(USER_SETTINGS_KEY_ANALYTICS_ENABLED, false);
+ // }
+ // const analyticsEnabled = !process.env.https_proxy && // disable analytics if running behind proxy
+ // (await UserSettings_1.default.getAsync(USER_SETTINGS_KEY_ANALYTICS_ENABLED, true));
+ // if (!analyticsEnabled) {
return new NoOpAnalytics();
- }
- const persistedDeviceId = await UserSettings_1.default.getAsync(USER_SETTINGS_KEY_ANALYTICS_DEVICE_ID, null);
- const deviceId = persistedDeviceId !== null && persistedDeviceId !== void 0 ? persistedDeviceId : (0, uuid_1.v4)();
- if (!persistedDeviceId) {
- await UserSettings_1.default.setAsync(USER_SETTINGS_KEY_ANALYTICS_DEVICE_ID, deviceId);
- }
- return new RudderstackAnalytics(deviceId);
+ // }
+ // const persistedDeviceId = await UserSettings_1.default.getAsync(USER_SETTINGS_KEY_ANALYTICS_DEVICE_ID, null);
+ // const deviceId = persistedDeviceId !== null && persistedDeviceId !== void 0 ? persistedDeviceId : (0, uuid_1.v4)();
+ // if (!persistedDeviceId) {
+ // await UserSettings_1.default.setAsync(USER_SETTINGS_KEY_ANALYTICS_DEVICE_ID, deviceId);
+ // }
+ // return new RudderstackAnalytics(deviceId);
}
exports.createAnalyticsAsync = createAnalyticsAsync;
class NoOpAnalytics {
--- a/eas-cli/build/commandUtils/context/contextUtils/createGraphqlClient.js
+++ b/eas-cli/build/commandUtils/context/contextUtils/createGraphqlClient.js
@@ -8,7 +8,7 @@ const node_fetch_1 = tslib_1.__importDefault(require("node-fetch"));
const api_1 = require("../../../api");
const fetch_1 = require("../../../fetch");
function createGraphqlClient(authInfo) {
- return (0, core_1.createClient)({
+ var _client = (0, core_1.createClient)({
url: (0, api_1.getExpoApiBaseUrl)() + '/graphql',
exchanges: [
core_1.dedupExchange,
@@ -39,5 +39,9 @@ function createGraphqlClient(authInfo) {
};
},
});
+ _client.subscribeToDebugTarget(event => {
+ console.log(JSON.stringify(event)); // { type, message, operation, data, source, timestamp }
+ })
+ return _client;
}
exports.createGraphqlClient = createGraphqlClient;
--- a/eas-cli/build/commandUtils/context/contextUtils/getProjectIdAsync.js
+++ b/eas-cli/build/commandUtils/context/contextUtils/getProjectIdAsync.js
@@ -22,7 +22,7 @@ async function saveProjectIdToAppConfigAsync(projectDir, projectId, options = {}
var _a;
const exp = (0, expoConfig_1.getExpoConfig)(projectDir, options);
const result = await (0, config_1.modifyConfigAsync)(projectDir, {
- extra: { ...exp.extra, eas: { ...(_a = exp.extra) === null || _a === void 0 ? void 0 : _a.eas, projectId } },
+ // extra: { ...exp.extra, eas: { ...(_a = exp.extra) === null || _a === void 0 ? void 0 : _a.eas, projectId } },
}, { skipSDKVersionRequirement: true });
switch (result.type) {
case 'success':
--- a/@expo/build-tools/dist/common/installDependencies.js
+++ b/@expo/build-tools/dist/common/installDependencies.js
@@ -15,24 +15,24 @@ async function installDependenciesAsync(ctx) {
ctx.logger.info(`We detected that '${relativeReactNativeProjectDirectory}' is a ${ctx.packageManager} workspace`);
}
const relativePackagerRunDir = path_1.default.relative(ctx.buildDirectory, packagerRunDir);
- let args = ['install'];
- if (ctx.packageManager === packageManager_1.PackageManager.PNPM) {
- args = ['install', '--no-frozen-lockfile'];
- }
- else if (ctx.packageManager === packageManager_1.PackageManager.YARN) {
- const isYarn2 = await (0, project_1.isUsingYarn2)(ctx.reactNativeProjectDirectory);
- if (isYarn2) {
- args = ['install', '--no-immutable'];
- }
- }
- ctx.logger.info(`Running "${ctx.packageManager} ${args.join(' ')}" in ${relativePackagerRunDir
+ // let args = ['install'];
+ // if (ctx.packageManager === packageManager_1.PackageManager.PNPM) {
+ // args = ['install', '--no-frozen-lockfile'];
+ // }
+ // else if (ctx.packageManager === packageManager_1.PackageManager.YARN) {
+ // const isYarn2 = await (0, project_1.isUsingYarn2)(ctx.reactNativeProjectDirectory);
+ // if (isYarn2) {
+ // args = ['install', '--no-immutable'];
+ // }
+ // }
+ ctx.logger.info(`Running "expo-app-node-modules" in ${relativePackagerRunDir
? `directory '${relativePackagerRunDir}'`
: 'the root dir of your repository'} `);
- await (0, turtle_spawn_1.default)(ctx.packageManager, args, {
+ await (0, turtle_spawn_1.default)('expo-app-node-modules', [], {
cwd: packagerRunDir,
logger: ctx.logger,
env: ctx.env,
});
}
exports.installDependenciesAsync = installDependenciesAsync;
-//# sourceMappingURL=installDependencies.js.map
\ No newline at end of file
+//# sourceMappingURL=installDependencies.js.map
--- a/eas-cli/build/build/android/build.js
+++ b/eas-cli/build/build/android/build.js
@@ -98,7 +98,7 @@ async function ensureAndroidCredentialsAsync(ctx) {
const androidApplicationIdentifier = await (0, applicationId_1.getApplicationIdAsync)(ctx.projectDir, ctx.exp, ctx.android.gradleContext);
const provider = new AndroidCredentialsProvider_1.default(ctx.credentialsCtx, {
app: {
- account: (0, nullthrows_1.default)(ctx.user.accounts.find(a => a.name === ctx.accountName), `You do not have access to account: ${ctx.accountName}`),
+ // account: (0, nullthrows_1.default)(ctx.user.accounts.find(a => a.name === ctx.accountName), `You do not have access to account: ${ctx.accountName}`),
projectName: ctx.projectName,
androidApplicationIdentifier,
},
--- a/eas-cli/build/credentials/ios/IosCredentialsProvider.js
+++ b/eas-cli/build/credentials/ios/IosCredentialsProvider.js
@@ -54,9 +54,9 @@ class IosCredentialsProvider {
}
async getPushKeyAsync(ctx, targets) {
var _a;
- if (ctx.nonInteractive) {
+ // if (ctx.nonInteractive) {
return null;
- }
+ // }
const applicationTarget = (0, target_1.findApplicationTarget)(targets);
const app = await (0, BuildCredentialsUtils_1.getAppFromContextAsync)(ctx);
const appLookupParams = {
--- a/eas-cli/build/project/fetchOrCreateProjectIDForWriteToConfigWithConfirmationAsync.js
+++ b/eas-cli/build/project/fetchOrCreateProjectIDForWriteToConfigWithConfirmationAsync.js
@@ -17,55 +17,7 @@ const prompts_1 = require("../prompts");
* If yes, register and return that. If not, throw.
*/
async function fetchOrCreateProjectIDForWriteToConfigWithConfirmationAsync(graphqlClient, projectInfo, options, actor) {
- var _a;
- const { accountName, projectName } = projectInfo;
- const projectFullName = `@${accountName}/${projectName}`;
- if (options.nonInteractive) {
- throw new Error(`Must configure EAS project by running 'eas init' before this command can be run in non-interactive mode.`);
- }
- const allAccounts = actor.accounts;
- const accountNamesWhereUserHasSufficientPublishPermissions = new Set(allAccounts
- .filter(a => { var _a; return ((_a = a.users.find(it => it.actor.id === actor.id)) === null || _a === void 0 ? void 0 : _a.role) !== generated_1.Role.ViewOnly; })
- .map(it => it.name));
- const account = allAccounts.find(a => a.name === accountName);
- if (!account) {
- throw new Error(`You must have access to the ${accountName} account to configure this EAS project.`);
- }
- const projectIdOnServer = await findProjectIdByAccountNameAndSlugNullableAsync(graphqlClient, accountName, projectName);
- if (projectIdOnServer) {
- const affirmedLink = await (0, prompts_1.confirmAsync)({
- message: `Existing EAS project found for ${projectFullName} (id = ${projectIdOnServer}). Configure this project?`,
- });
- if (!affirmedLink) {
- throw new Error(`EAS project ID configuration canceled for ${projectFullName}. Run 'eas init' to configure.`);
- }
- return projectIdOnServer;
- }
- if (!accountNamesWhereUserHasSufficientPublishPermissions.has(accountName)) {
- throw new Error(`You don't have permission to create a new project on the ${accountName} account and no matching project already exists on the account.`);
- }
- const affirmedCreate = await (0, prompts_1.confirmAsync)({
- message: `Would you like to automatically create an EAS project for ${projectFullName}?`,
- });
- if (!affirmedCreate) {
- throw new Error(`EAS project ID configuration canceled for ${projectFullName}. Run 'eas init' to configure.`);
- }
- const projectDashboardUrl = (0, url_1.getProjectDashboardUrl)(accountName, projectName);
- const projectLink = (0, log_1.link)(projectDashboardUrl, { text: projectFullName });
- const spinner = (0, ora_1.ora)(`Creating ${chalk_1.default.bold(projectFullName)} on Expo`).start();
- try {
- const id = await AppMutation_1.AppMutation.createAppAsync(graphqlClient, {
- accountId: account.id,
- projectName,
- privacy: (_a = projectInfo.privacy) !== null && _a !== void 0 ? _a : generated_1.AppPrivacy.Public,
- });
- spinner.succeed(`Created ${chalk_1.default.bold(projectLink)} on Expo`);
- return id;
- }
- catch (err) {
- spinner.fail();
- throw err;
- }
+ return 'x'
}
exports.fetchOrCreateProjectIDForWriteToConfigWithConfirmationAsync = fetchOrCreateProjectIDForWriteToConfigWithConfirmationAsync;
/**
--- a/eas-cli/build/project/projectUtils.js
+++ b/eas-cli/build/project/projectUtils.js
@@ -104,8 +104,7 @@ async function installExpoUpdatesAsync(projectDir, options) {
}
exports.installExpoUpdatesAsync = installExpoUpdatesAsync;
async function getOwnerAccountForProjectIdAsync(graphqlClient, projectId) {
- const app = await AppQuery_1.AppQuery.byIdAsync(graphqlClient, projectId);
- return app.ownerAccount;
+ return { __typename: 'Account', id: '', name: 'x' , users: [] };
}
exports.getOwnerAccountForProjectIdAsync = getOwnerAccountForProjectIdAsync;
async function getDisplayNameForProjectIdAsync(graphqlClient, projectId) {
--- a/eas-cli/build/graphql/queries/UserQuery.js
+++ b/eas-cli/build/graphql/queries/UserQuery.js
@@ -8,38 +8,6 @@ const client_1 = require("../client");
const Account_1 = require("../types/Account");
exports.UserQuery = {
async currentUserAsync(graphqlClient) {
- const data = await (0, client_1.withErrorHandlingAsync)(graphqlClient
- .query((0, graphql_tag_1.default) `
- query CurrentUser {
- meActor {
- __typename
- id
- ... on User {
- username
- primaryAccount {
- id
- ...AccountFragment
- }
- }
- ... on Robot {
- firstName
- }
- ... on SSOUser {
- username
- }
- accounts {
- id
- ...AccountFragment
- }
- featureGates
- isExpoAdmin
- }
- }
- ${(0, graphql_1.print)(Account_1.AccountFragmentNode)}
- `, {}, {
- additionalTypenames: ['User'],
- })
- .toPromise());
- return data.meActor;
+ return { __typename: "User", username: "x" };
},
};
--- a/eas-cli/build/user/SessionManager.js
+++ b/eas-cli/build/user/SessionManager.js
@@ -75,27 +75,7 @@ class SessionManager {
* @returns logged-in Actor
*/
async ensureLoggedInAsync({ nonInteractive, }) {
- let actor;
- try {
- actor = await this.getUserAsync();
- }
- catch { }
- if (!actor) {
- log_1.default.warn('An Expo user account is required to proceed.');
- await this.showLoginPromptAsync({ nonInteractive, printNewLine: true });
- actor = await this.getUserAsync();
- }
- const accessToken = this.getAccessToken();
- const authenticationInfo = accessToken
- ? {
- accessToken,
- sessionSecret: null,
- }
- : {
- accessToken: null,
- sessionSecret: (0, nullthrows_1.default)(this.getSessionSecret()),
- };
- return { actor: (0, nullthrows_1.default)(actor), authenticationInfo };
+ return { actor: { __typename: "User", username: "x" }, authenticationInfo: {} };
}
/**
* Prompt the user to log in.
--- a/eas-cli/build/utils/paths.js
+++ b/eas-cli/build/utils/paths.js
@@ -8,21 +8,7 @@ const path = tslib_1.__importStar(require("path"));
// The ~/.expo directory is used to store authentication sessions,
// which are shared between EAS CLI and Expo CLI.
function dotExpoHomeDirectory() {
- const home = (0, os_1.homedir)();
- if (!home) {
- throw new Error("Can't determine your home directory; make sure your $HOME environment variable is set.");
- }
- let dirPath;
- if (process.env.EXPO_STAGING) {
- dirPath = path.join(home, '.expo-staging');
- }
- else if (process.env.EXPO_LOCAL) {
- dirPath = path.join(home, '.expo-local');
- }
- else {
- dirPath = path.join(home, '.expo');
- }
- return dirPath;
+ return process.env.EXPO_APP_HOME;
}
const getStateJsonPath = () => path.join(dotExpoHomeDirectory(), 'state.json');
exports.getStateJsonPath = getStateJsonPath;
--- a/xdl/build/tools/FsCache.js
+++ b/xdl/build/tools/FsCache.js
@@ -155,7 +155,7 @@ class Cacher {
exports.Cacher = Cacher;
function getCacheDir() {
- const homeDir = _os().default.homedir();
+ const homeDir = process.env.EXPO_APP_HOME;
if (process.env.XDG_CACHE_HOME) {
return process.env.XDG_CACHE_HOME;
@@ -168,4 +168,4 @@ function getCacheDir() {
return _path().default.join(homeDir, '.cache', 'expo');
}
}
-//# sourceMappingURL=FsCache.js.map
\ No newline at end of file
+//# sourceMappingURL=FsCache.js.map
--- a/@expo/cli/build/src/api/getExpoSchema.js
+++ b/@expo/cli/build/src/api/getExpoSchema.js
@@ -14,7 +14,9 @@ function _interopRequireDefault(obj) {
default: obj
};
}
-const schemaJson = {};
+const schemaJson = {
+ "48.0.0": {"schema":{"definitions":{"Android":{"description":"Configuration that is specific to the Android platform.","type":"object","meta":{"standaloneOnly":true},"properties":{"publishManifestPath":{"description":"The manifest for the Android version of your app will be written to this path during publish.","type":"string","meta":{"autogenerated":true}},"publishBundlePath":{"description":"The bundle for the Android version of your app will be written to this path during publish.","type":"string","meta":{"autogenerated":true}},"package":{"description":"The package name for your Android standalone app. You make it up, but it needs to be unique on the Play Store. See [this StackOverflow question](http://stackoverflow.com/questions/6273892/android-package-name-convention).","type":"string","pattern":"^[a-zA-Z][a-zA-Z0-9\\_]*(\\.[a-zA-Z][a-zA-Z0-9\\_]*)+$","meta":{"regexHuman":"Reverse DNS notation unique name for your app. Valid Android Application ID. For example, `com.example.app`, where `com.example` is our domain and `app` is our app. The name may only contain lowercase and uppercase letters (a-z, A-Z), numbers (0-9) and underscores (_), separated by periods (.). Each component of the name should start with a lowercase letter.","bareWorkflow":"This is set in `android/app/build.gradle` as `applicationId` as well as in your `AndroidManifest.xml` file (multiple places)."}},"versionCode":{"description":"Version number required by Google Play. Increment by one for each release. Must be a positive integer. [Learn more](https://developer.android.com/studio/publish/versioning.html)","type":"integer","minimum":0,"maximum":2100000000,"meta":{"bareWorkflow":"This is set in `android/app/build.gradle` as `versionCode`"}},"backgroundColor":{"description":"The background color for your Android app, behind any of your React views. Overrides the top-level `backgroundColor` key if it is present.","type":"string","pattern":"^#|(&#x23;)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`","bareWorkflow":"This is set in `android/app/src/main/AndroidManifest.xml` under `android:windowBackground`"}},"userInterfaceStyle":{"description":"Configuration to force the app to always use the light or dark user-interface appearance, such as \"dark mode\", or make it automatically adapt to the system preferences. If not provided, defaults to `light`. Requires `expo-system-ui` be installed in your project to work on Android.","type":"string","fallback":"light","enum":["light","dark","automatic"]},"icon":{"description":"Local path or remote URL to an image to use for your app's icon on Android. If specified, this overrides the top-level `icon` key. We recommend that you use a 1024x1024 png file (transparency is recommended for the Google Play Store). This icon will appear on the home screen and within the Expo app.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true}},"adaptiveIcon":{"description":"Settings for an Adaptive Launcher Icon on Android. [Learn more](https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive)","type":"object","properties":{"foregroundImage":{"description":"Local path or remote URL to an image to use for your app's icon on Android. If specified, this overrides the top-level `icon` and the `android.icon` keys. Should follow the [specified guidelines](https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive). This icon will appear on the home screen.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true}},"monochromeImage":{"description":"Local path or remote URL to an image representing the Android 13+ monochromatic icon. Should follow the [specified guidelines](https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive). This icon will appear on the home screen when the user enables 'Themed icons' in system settings on a device running Android 13+.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true}},"backgroundImage":{"description":"Local path or remote URL to a background image for your app's Adaptive Icon on Android. If specified, this overrides the `backgroundColor` key. Must have the same dimensions as `foregroundImage`, and has no effect if `foregroundImage` is not specified. Should follow the [specified guidelines](https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive).","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true}},"backgroundColor":{"description":"Color to use as the background for your app's Adaptive Icon on Android. Defaults to white, `#FFFFFF`. Has no effect if `foregroundImage` is not specified.","type":"string","pattern":"^#|(&#x23;)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}}},"additionalProperties":false},"playStoreUrl":{"description":"URL to your app on the Google Play Store, if you have deployed it there. This is used to link to your store page from your Expo project page if your app is public.","pattern":"^https://play\\.google\\.com/","example":"https://play.google.com/store/apps/details?id=host.exp.exponent","type":["string"]},"permissions":{"description":"List of permissions used by the standalone app. \n\n To use ONLY the following minimum necessary permissions and none of the extras supported by Expo in a default managed app, set `permissions` to `[]`. The minimum necessary permissions do not require a Privacy Policy when uploading to Google Play Store and are: \n• receive data from Internet \n• view network connections \n• full network access \n• change your audio settings \n• prevent device from sleeping \n\n To use ALL permissions supported by Expo by default, do not specify the `permissions` key. \n\n To use the minimum necessary permissions ALONG with certain additional permissions, specify those extras in `permissions`, e.g.\n\n `[ \"CAMERA\", \"ACCESS_FINE_LOCATION\" ]`.\n\n You can specify the following permissions depending on what you need:\n\n- `ACCESS_COARSE_LOCATION`\n- `ACCESS_FINE_LOCATION`\n- `ACCESS_BACKGROUND_LOCATION`\n- `CAMERA`\n- `RECORD_AUDIO`\n- `READ_CONTACTS`\n- `WRITE_CONTACTS`\n- `READ_CALENDAR`\n- `WRITE_CALENDAR`\n- `READ_EXTERNAL_STORAGE`\n- `WRITE_EXTERNAL_STORAGE`\n- `USE_FINGERPRINT`\n- `USE_BIOMETRIC`\n- `WRITE_SETTINGS`\n- `VIBRATE`\n- `READ_PHONE_STATE`\n- `FOREGROUND_SERVICE`\n- `WAKE_LOCK`\n- `com.anddoes.launcher.permission.UPDATE_COUNT`\n- `com.android.launcher.permission.INSTALL_SHORTCUT`\n- `com.google.android.c2dm.permission.RECEIVE`\n- `com.google.android.gms.permission.ACTIVITY_RECOGNITION`\n- `com.google.android.providers.gsf.permission.READ_GSERVICES`\n- `com.htc.launcher.permission.READ_SETTINGS`\n- `com.htc.launcher.permission.UPDATE_SHORTCUT`\n- `com.majeur.launcher.permission.UPDATE_BADGE`\n- `com.sec.android.provider.badge.permission.READ`\n- `com.sec.android.provider.badge.permission.WRITE`\n- `com.sonyericsson.home.permission.BROADCAST_BADGE`\n","type":"array","meta":{"bareWorkflow":"To change the permissions your app requests, you'll need to edit `AndroidManifest.xml` manually. To prevent your app from requesting one of the permissions listed below, you'll need to explicitly add it to `AndroidManifest.xml` along with a `tools:node=\"remove\"` tag."},"items":{"type":"string"}},"blockedPermissions":{"description":"List of permissions to block in the final `AndroidManifest.xml`. This is useful for removing permissions that are added by native package `AndroidManifest.xml` files which are merged into the final manifest. Internally this feature uses the `tools:node=\"remove\"` XML attribute to remove permissions. Not available in Expo Go.","type":"array","items":{"type":"string"}},"googleServicesFile":{"description":"[Firebase Configuration File](https://support.google.com/firebase/answer/7015592) Location of the `GoogleService-Info.plist` file for configuring Firebase. Including this key automatically enables FCM in your standalone app.","type":"string","meta":{"bareWorkflow":"Add or edit the file directly at `android/app/google-services.json`"}},"config":{"type":"object","description":"Note: This property key is not included in the production manifest and will evaluate to `undefined`. It is used internally only in the build process, because it contains API keys that some may want to keep private.","properties":{"branch":{"description":"[Branch](https://branch.io/) key to hook up Branch linking services.","type":"object","properties":{"apiKey":{"description":"Your Branch API key","type":"string"}},"additionalProperties":false},"googleMaps":{"description":"[Google Maps Android SDK](https://developers.google.com/maps/documentation/android-api/signup) configuration for your standalone app.","type":"object","properties":{"apiKey":{"description":"Your Google Maps Android SDK API key","type":"string"}},"additionalProperties":false},"googleMobileAdsAppId":{"description":"[Google Mobile Ads App ID](https://support.google.com/admob/answer/6232340) Google AdMob App ID. ","type":"string"},"googleMobileAdsAutoInit":{"description":"A boolean indicating whether to initialize Google App Measurement and begin sending user-level event data to Google immediately when the app starts. The default in Expo (Client and in standalone apps) is `false`. [Sets the opposite of the given value to the following key in `Info.plist`](https://developers.google.com/admob/ios/eu-consent#delay_app_measurement_optional)","type":"boolean","fallback":false}},"additionalProperties":false},"splash":{"description":"Configuration for loading and splash screen for managed and standalone Android apps.","type":"object","properties":{"backgroundColor":{"description":"Color to fill the loading screen background","type":"string","pattern":"^#|(&#x23;)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"resizeMode":{"description":"Determines how the `image` will be displayed in the splash loading screen. Must be one of `cover`, `contain` or `native`, defaults to `contain`.","enum":["cover","contain","native"],"type":"string"},"image":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"mdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Natural sized image (baseline)`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"hdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 1.5x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"xhdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 2x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"xxhdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 3x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"xxxhdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 4x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"dark":{"description":"Configuration for loading and splash screen for managed and standalone Android apps in dark mode.","type":"object","properties":{"backgroundColor":{"description":"Color to fill the loading screen background","type":"string","pattern":"^#|(&#x23;)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"resizeMode":{"description":"Determines how the `image` will be displayed in the splash loading screen. Must be one of `cover`, `contain` or `native`, defaults to `contain`.","enum":["cover","contain","native"],"type":"string"},"image":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"mdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Natural sized image (baseline)`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"hdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 1.5x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"xhdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 2x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"xxhdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 3x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"xxxhdpi":{"description":"Local path or remote URL to an image to fill the background of the loading screen in \"native\" mode. Image size and aspect ratio are up to you. [Learn more]( https://developer.android.com/training/multiscreen/screendensities) \n\n `Scale 4x`","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}}}}}},"intentFilters":{"description":"Configuration for setting an array of custom intent filters in Android manifest. [Learn more](https://developer.android.com/guide/components/intents-filters)","example":[{"autoVerify":true,"action":"VIEW","data":{"scheme":"https","host":"*.example.com"},"category":["BROWSABLE","DEFAULT"]}],"exampleString":"\n [{ \n \"autoVerify\": true, \n \"action\": \"VIEW\", \n \"data\": { \n \"scheme\": \"https\", \n \"host\": \"*.example.com\" \n }, \n \"category\": [\"BROWSABLE\", \"DEFAULT\"] \n }]","type":"array","uniqueItems":true,"items":{"type":"object","properties":{"autoVerify":{"description":"You may also use an intent filter to set your app as the default handler for links (without showing the user a dialog with options). To do so use `true` and then configure your server to serve a JSON file verifying that you own the domain. [Learn more](https://developer.android.com/training/app-links)","type":"boolean"},"action":{"type":"string"},"data":{"anyOf":[{"$ref":"#/definitions/AndroidIntentFiltersData"},{"type":["array"],"items":{"$ref":"#/definitions/AndroidIntentFiltersData"}}]},"category":{"anyOf":[{"type":["string"]},{"type":"array","items":{"type":"string"}}]}},"additionalProperties":false,"required":["action"]},"meta":{"bareWorkflow":"This is set in `AndroidManifest.xml` directly. [Learn more.](https://developer.android.com/guide/components/intents-filters)"}},"allowBackup":{"description":"Allows your user's app data to be automatically backed up to their Google Drive. If this is set to false, no backup or restore of the application will ever be performed (this is useful if your app deals with sensitive information). Defaults to the Android default, which is `true`.","fallback":true,"type":"boolean"},"softwareKeyboardLayoutMode":{"description":"Determines how the software keyboard will impact the layout of your application. This maps to the `android:windowSoftInputMode` property. Defaults to `resize`. Valid values: `resize`, `pan`.","enum":["resize","pan"],"type":"string","fallback":"resize"},"jsEngine":{"description":"Specifies the JavaScript engine for Android apps. Supported only on EAS Build and in Expo Go. Defaults to `jsc`. Valid values: `hermes`, `jsc`.","type":"string","fallback":"jsc","enum":["hermes","jsc"],"meta":{"bareWorkflow":"To change the JavaScript engine, update the `expo.jsEngine` value in `android/gradle.properties`"}},"runtimeVersion":{"description":"**Note: Don't use this property unless you are sure what you're doing** \n\nThe runtime version associated with this manifest for the Android platform. If provided, this will override the top level runtimeVersion key.\nSet this to `{\"policy\": \"nativeVersion\"}` to generate it automatically.","$ref":"#/definitions/RuntimeVersion"}},"additionalProperties":false},"AndroidIntentFiltersData":{"type":"object","properties":{"scheme":{"description":"Scheme of the URL, e.g. `https`","type":"string"},"host":{"description":"Hostname, e.g. `myapp.io`","type":"string"},"port":{"description":"Port, e.g. `3000`","type":"string"},"path":{"description":"Exact path for URLs that should be matched by the filter, e.g. `/records`","type":"string"},"pathPattern":{"description":"Pattern for paths that should be matched by the filter, e.g. `.*`. Must begin with `/`","type":"string"},"pathPrefix":{"description":"Prefix for paths that should be matched by the filter, e.g. `/records/` will match `/records/123`","type":"string"},"mimeType":{"description":"MIME type for URLs that should be matched by the filter","type":"string"}},"additionalProperties":false},"IOS":{"description":"Configuration that is specific to the iOS platform.","type":"object","meta":{"standaloneOnly":true},"properties":{"publishManifestPath":{"description":"The manifest for the iOS version of your app will be written to this path during publish.","type":"string","meta":{"autogenerated":true}},"publishBundlePath":{"description":"The bundle for the iOS version of your app will be written to this path during publish.","type":"string","meta":{"autogenerated":true}},"bundleIdentifier":{"description":"The bundle identifier for your iOS standalone app. You make it up, but it needs to be unique on the App Store. See [this StackOverflow question](http://stackoverflow.com/questions/11347470/what-does-bundle-identifier-mean-in-the-ios-project).","type":"string","pattern":"^[a-zA-Z0-9.-]+$","meta":{"bareWorkflow":"Set this value in `info.plist` under `CFBundleIdentifier`","regexHuman":"iOS bundle identifier notation unique name for your app. For example, `host.exp.expo`, where `exp.host` is our domain and `expo` is our app name."}},"buildNumber":{"description":"Build number for your iOS standalone app. Corresponds to `CFBundleVersion` and must match Apple's [specified format](https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleversion). (Note: Transporter will pull the value for `Version Number` from `expo.version` and NOT from `expo.ios.buildNumber`.)","type":"string","pattern":"^[A-Za-z0-9\\.]+$","meta":{"bareWorkflow":"Set this value in `info.plist` under `CFBundleVersion`"}},"backgroundColor":{"description":"The background color for your iOS app, behind any of your React views. Overrides the top-level `backgroundColor` key if it is present. Requires `expo-system-ui` be installed in your project to work on iOS.","type":"string","pattern":"^#|(&#x23;)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"icon":{"description":"Local path or remote URL to an image to use for your app's icon on iOS. If specified, this overrides the top-level `icon` key. Use a 1024x1024 icon which follows Apple's interface guidelines for icons, including color profile and transparency. \n\n Expo will generate the other required sizes. This icon will appear on the home screen and within the Expo app.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true}},"appStoreUrl":{"description":"URL to your app on the Apple App Store, if you have deployed it there. This is used to link to your store page from your Expo project page if your app is public.","pattern":"^https://(itunes|apps)\\.apple\\.com/.*?\\d+","example":"https://apps.apple.com/us/app/expo-client/id982107779","type":["string"]},"bitcode":{"description":"Enable iOS Bitcode optimizations in the native build. Accepts the name of an iOS build configuration to enable for a single configuration and disable for all others, e.g. Debug, Release. Not available in Expo Go. Defaults to `undefined` which uses the template's predefined settings.","anyOf":[{"type":["boolean"]},{"type":["string"]}]},"config":{"type":"object","description":"Note: This property key is not included in the production manifest and will evaluate to `undefined`. It is used internally only in the build process, because it contains API keys that some may want to keep private.","properties":{"branch":{"description":"[Branch](https://branch.io/) key to hook up Branch linking services.","type":"object","properties":{"apiKey":{"description":"Your Branch API key","type":"string"}},"additionalProperties":false},"usesNonExemptEncryption":{"description":"Sets `ITSAppUsesNonExemptEncryption` in the standalone ipa's Info.plist to the given boolean value.","type":"boolean"},"googleMapsApiKey":{"description":"[Google Maps iOS SDK](https://developers.google.com/maps/documentation/ios-sdk/start) key for your standalone app.","type":"string"},"googleMobileAdsAppId":{"description":"[Google Mobile Ads App ID](https://support.google.com/admob/answer/6232340) Google AdMob App ID. ","type":"string"},"googleMobileAdsAutoInit":{"description":"A boolean indicating whether to initialize Google App Measurement and begin sending user-level event data to Google immediately when the app starts. The default in Expo (Go and in standalone apps) is `false`. [Sets the opposite of the given value to the following key in `Info.plist`.](https://developers.google.com/admob/ios/eu-consent#delay_app_measurement_optional)","type":"boolean","fallback":false}},"additionalProperties":false},"googleServicesFile":{"description":"[Firebase Configuration File](https://support.google.com/firebase/answer/7015592) Location of the `GoogleService-Info.plist` file for configuring Firebase.","type":"string"},"supportsTablet":{"description":"Whether your standalone iOS app supports tablet screen sizes. Defaults to `false`.","type":"boolean","meta":{"bareWorkflow":"Set this value in `info.plist` under `UISupportedInterfaceOrientations~ipad`"}},"isTabletOnly":{"description":"If true, indicates that your standalone iOS app does not support handsets, and only supports tablets.","type":"boolean","meta":{"bareWorkflow":"Set this value in `info.plist` under `UISupportedInterfaceOrientations`"}},"requireFullScreen":{"description":"If true, indicates that your standalone iOS app does not support Slide Over and Split View on iPad. Defaults to `false`","type":"boolean","meta":{"bareWorkflow":"Use Xcode to set `UIRequiresFullScreen`"}},"userInterfaceStyle":{"description":"Configuration to force the app to always use the light or dark user-interface appearance, such as \"dark mode\", or make it automatically adapt to the system preferences. If not provided, defaults to `light`.","type":"string","fallback":"light","enum":["light","dark","automatic"]},"infoPlist":{"description":"Dictionary of arbitrary configuration to add to your standalone app's native Info.plist. Applied prior to all other Expo-specific configuration. No other validation is performed, so use this at your own risk of rejection from the App Store.","type":"object","properties":{},"additionalProperties":true},"entitlements":{"description":"Dictionary of arbitrary configuration to add to your standalone app's native *.entitlements (plist). Applied prior to all other Expo-specific configuration. No other validation is performed, so use this at your own risk of rejection from the App Store.","type":"object","properties":{},"additionalProperties":true},"associatedDomains":{"description":"An array that contains Associated Domains for the standalone app. [Learn more](https://developer.apple.com/documentation/safariservices/supporting_associated_domains).","type":"array","uniqueItems":true,"items":{"type":"string"},"meta":{"regexHuman":"Entries must follow the format `applinks:<fully qualified domain>[:port number]`. [Learn more](https://developer.apple.com/documentation/safariservices/supporting_associated_domains).","bareWorkflow":"Build with EAS, or use Xcode to enable this capability manually. [Learn more](https://developer.apple.com/documentation/safariservices/supporting_associated_domains)."}},"usesIcloudStorage":{"description":"A boolean indicating if the app uses iCloud Storage for `DocumentPicker`. See `DocumentPicker` docs for details.","type":"boolean","meta":{"bareWorkflow":"Use Xcode, or ios.entitlements to configure this."}},"usesAppleSignIn":{"description":"A boolean indicating if the app uses Apple Sign-In. See `AppleAuthentication` docs for details.","type":"boolean","fallback":false},"accessesContactNotes":{"description":"A Boolean value that indicates whether the app may access the notes stored in contacts. You must [receive permission from Apple](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_developer_contacts_notes) before you can submit your app for review with this capability.","type":"boolean","fallback":false},"splash":{"description":"Configuration for loading and splash screen for standalone iOS apps.","type":"object","properties":{"backgroundColor":{"description":"Color to fill the loading screen background","type":"string","pattern":"^#|(&#x23;)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"resizeMode":{"description":"Determines how the `image` will be displayed in the splash loading screen. Must be one of `cover` or `contain`, defaults to `contain`.","enum":["cover","contain"],"type":"string"},"image":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"tabletImage":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"dark":{"description":"Configuration for loading and splash screen for standalone iOS apps in dark mode.","type":"object","properties":{"backgroundColor":{"description":"Color to fill the loading screen background","type":"string","pattern":"^#|(&#x23;)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"resizeMode":{"description":"Determines how the `image` will be displayed in the splash loading screen. Must be one of `cover` or `contain`, defaults to `contain`.","enum":["cover","contain"],"type":"string"},"image":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}},"tabletImage":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}}}}}},"jsEngine":{"description":"Specifies the JavaScript engine for iOS apps. Supported only on EAS Build. Defaults to `jsc`. Valid values: `hermes`, `jsc`.","type":"string","fallback":"jsc","enum":["hermes","jsc"],"meta":{"bareWorkflow":"To change the JavaScript engine, update the `expo.jsEngine` value in `ios/Podfile.properties.json`"}},"runtimeVersion":{"description":"**Note: Don't use this property unless you are sure what you're doing** \n\nThe runtime version associated with this manifest for the iOS platform. If provided, this will override the top level runtimeVersion key.\nSet this to `{\"policy\": \"nativeVersion\"}` to generate it automatically.","$ref":"#/definitions/RuntimeVersion"}},"additionalProperties":false},"Splash":{"description":"Configuration for loading and splash screen for standalone apps.","type":"object","properties":{"backgroundColor":{"description":"Color to fill the loading screen background","type":"string","pattern":"^#|(&#x23;)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`","bareWorkflow":"For Android, edit the `colorPrimary` item in `android/app/src/main/res/values/colors.xml`"}},"resizeMode":{"description":"Determines how the `image` will be displayed in the splash loading screen. Must be one of `cover` or `contain`, defaults to `contain`.","enum":["cover","contain"],"type":"string"},"image":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}}},"meta":{"bareWorkflow":"To change your app's icon, edit or replace the files in `ios/<PROJECT-NAME>/Assets.xcassets/AppIcon.appiconset` (we recommend using Xcode), and `android/app/src/main/res/mipmap-<RESOLUTION>` (Android Studio can [generate the appropriate image files for you](https://developer.android.com/studio/write/image-asset-studio)). Be sure to follow the guidelines for each platform ([iOS](https://developer.apple.com/design/human-interface-guidelines/ios/icons-and-images/app-icon/), [Android 7.1 and below](https://material.io/design/iconography/#icon-treatments), and [Android 8+](https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive)) and to provide your new icon in each required size."}},"PublishHook":{"type":"object","additionalProperties":true,"properties":{"file":{"type":"string"},"config":{"type":"object","additionalProperties":true,"properties":{}}}},"Web":{"description":"Configuration that is specific to the web platform.","type":"object","additionalProperties":true,"properties":{"favicon":{"description":"Relative path of an image to use for your app's favicon.","type":"string"},"name":{"description":"Defines the title of the document, defaults to the outer level name","type":"string","meta":{"pwa":"name"}},"shortName":{"description":"A short version of the app's name, 12 characters or fewer. Used in app launcher and new tab pages. Maps to `short_name` in the PWA manifest.json. Defaults to the `name` property.","type":"string","meta":{"pwa":"short_name","regexHuman":"Maximum 12 characters long"}},"lang":{"description":"Specifies the primary language for the values in the name and short_name members. This value is a string containing a single language tag.","type":"string","fallback":"en","meta":{"pwa":"lang"}},"scope":{"description":"Defines the navigation scope of this website's context. This restricts what web pages can be viewed while the manifest is applied. If the user navigates outside the scope, it returns to a normal web page inside a browser tab/window. If the scope is a relative URL, the base URL will be the URL of the manifest.","type":"string","meta":{"pwa":"scope"}},"themeColor":{"description":"Defines the color of the Android tool bar, and may be reflected in the app's preview in task switchers.","type":"string","pattern":"^#|(&#x23;)\\d{6}$","meta":{"pwa":"theme_color","html":"theme-color","regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"description":{"description":"Provides a general description of what the pinned website does.","type":"string","meta":{"html":"description","pwa":"description"}},"dir":{"description":"Specifies the primary text direction for the name, short_name, and description members. Together with the lang member, it helps the correct display of right-to-left languages.","enum":["auto","ltr","rtl"],"type":"string","meta":{"pwa":"dir"}},"display":{"description":"Defines the developers’ preferred display mode for the website.","enum":["fullscreen","standalone","minimal-ui","browser"],"type":"string","meta":{"pwa":"display"}},"startUrl":{"description":"The URL that loads when a user launches the application (e.g., when added to home screen), typically the index. Note: This has to be a relative URL, relative to the manifest URL.","type":"string","meta":{"pwa":"start_url"}},"orientation":{"description":"Defines the default orientation for all the website's top level browsing contexts.","enum":["any","natural","landscape","landscape-primary","landscape-secondary","portrait","portrait-primary","portrait-secondary"],"type":"string","meta":{"pwa":"orientation"}},"backgroundColor":{"description":"Defines the expected “background color” for the website. This value repeats what is already available in the site’s CSS, but can be used by browsers to draw the background color of a shortcut when the manifest is available before the stylesheet has loaded. This creates a smooth transition between launching the web application and loading the site's content.","type":"string","pattern":"^#|(&#x23;)\\d{6}$","meta":{"pwa":"background_color","regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"barStyle":{"description":"If content is set to default, the status bar appears normal. If set to black, the status bar has a black background. If set to black-translucent, the status bar is black and translucent. If set to default or black, the web content is displayed below the status bar. If set to black-translucent, the web content is displayed on the entire screen, partially obscured by the status bar.","enum":["default","black","black-translucent"],"type":"string","fallback":"black-translucent","meta":{"html":"apple-mobile-web-app-status-bar-style","pwa":"name"}},"preferRelatedApplications":{"description":"Hints for the user agent to indicate to the user that the specified native applications (defined in expo.ios and expo.android) are recommended over the website.","type":"boolean","fallback":true,"meta":{"pwa":"prefer_related_applications"}},"dangerous":{"description":"Experimental features. These will break without deprecation notice.","type":"object","properties":{},"additionalProperties":true},"splash":{"description":"Configuration for PWA splash screens.","type":"object","properties":{"backgroundColor":{"description":"Color to fill the loading screen background","type":"string","pattern":"^#|(&#x23;)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"resizeMode":{"description":"Determines how the `image` will be displayed in the splash loading screen. Must be one of `cover` or `contain`, defaults to `contain`.","enum":["cover","contain"],"type":"string"},"image":{"description":"Local path or remote URL to an image to fill the background of the loading screen. Image size and aspect ratio are up to you. Must be a .png.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image"}}},"meta":{"bareWorkflow":"Use [expo-splash-screen](https://github.com/expo/expo/tree/main/packages/expo-splash-screen#expo-splash-screen)"}},"config":{"description":"Firebase web configuration. Used by the expo-firebase packages on both web and native. [Learn more](https://firebase.google.com/docs/reference/js/firebase.html#initializeapp)","type":"object","properties":{"firebase":{"type":"object","properties":{"apiKey":{"type":"string"},"authDomain":{"type":"string"},"databaseURL":{"type":"string"},"projectId":{"type":"string"},"storageBucket":{"type":"string"},"messagingSenderId":{"type":"string"},"appId":{"type":"string"},"measurementId":{"type":"string"}}}}},"bundler":{"description":"Sets the bundler to use for the web platform. Only supported in the local CLI `npx expo`.","enum":["webpack","metro"],"fallback":"webpack"}}},"RuntimeVersionSDKVersionPolicy":{"type":"object","properties":{"policy":{"type":"string","enum":["nativeVersion","sdkVersion","appVersion"]}},"required":["policy"],"additionalProperties":false},"RuntimeVersion":{"tsType":"string | { policy: 'nativeVersion' | 'sdkVersion' | 'appVersion'; }","oneOf":[{"type":"string","pattern":"^[a-zA-Z\\d][a-zA-Z\\d._+()-]{0,254}$","not":{"pattern":"^\\d+\\.\\d*0$"},"meta":{"notHuman":"String beginning with an alphanumeric character followed by any combination of alphanumeric character, \"_\", \"+\", \".\",\"(\", \")\", or \"-\". May not be a decimal ending in a 0. Valid examples: \"1.0.3a+\", \"1.0.0\", \"._+()-0a1\", \"0\".","regexHuman":"String beginning with an alphanumeric character followed by any combination of alphanumeric character, \"_\", \"+\", \".\",\"(\", \")\", or \"-\". May not be a decimal ending in a 0. Valid examples: \"1.0.3a+\", \"1.0.0\", \"._+()-0a1\", \"0\"."}},{"type":"string","pattern":"^exposdk:((\\d+\\.\\d+\\.\\d+)|(UNVERSIONED))$","meta":{"regexHuman":"An 'exposdk:' prefix followed by the SDK version of your project. Example: \"exposdk:44.0.0\"."}},{"$ref":"#/definitions/RuntimeVersionSDKVersionPolicy"}]}},"type":"object","properties":{"name":{"description":"The name of your app as it appears both within Expo Go and on your home screen as a standalone app.","type":"string","meta":{"bareWorkflow":"To change the name of your app, edit the 'Display Name' field in Xcode and the `app_name` string in `android/app/src/main/res/values/strings.xml`"}},"description":{"description":"A short description of what your app is and why it is great.","type":"string"},"slug":{"description":"The friendly URL name for publishing. For example, `myAppName` will refer to the `expo.dev/@project-owner/myAppName` project.","type":"string","pattern":"^[a-zA-Z0-9_\\-]+$"},"owner":{"description":"The name of the Expo account that owns the project. This is useful for teams collaborating on a project. If not provided, the owner defaults to the username of the current user.","type":"string","minLength":1},"currentFullName":{"description":"The auto generated Expo account name and slug used for display purposes. It is not meant to be set directly. Formatted like `@username/slug`. When unauthenticated, the username is `@anonymous`. For published projects, this value may change when a project is transferred between accounts or renamed.","type":"string","meta":{"autogenerated":true}},"originalFullName":{"description":"The auto generated Expo account name and slug used for services like Notifications and AuthSession proxy. It is not meant to be set directly. Formatted like `@username/slug`. When unauthenticated, the username is `@anonymous`. For published projects, this value will not change when a project is transferred between accounts or renamed.","type":"string","meta":{"autogenerated":true}},"privacy":{"description":"Defaults to `unlisted`. `unlisted` hides the project from search results. `hidden` restricts access to the project page to only the owner and other users that have been granted access. Valid values: `public`, `unlisted`, `hidden`.","enum":["public","unlisted","hidden"],"type":"string","fallback":"unlisted"},"sdkVersion":{"description":"The Expo sdkVersion to run the project on. This should line up with the version specified in your package.json.","type":"string","pattern":"^(\\d+\\.\\d+\\.\\d+)|(UNVERSIONED)$"},"runtimeVersion":{"description":"**Note: Don't use this property unless you are sure what you're doing** \n\nThe runtime version associated with this manifest.\nSet this to `{\"policy\": \"nativeVersion\"}` to generate it automatically.","$ref":"#/definitions/RuntimeVersion"},"version":{"description":"Your app version. In addition to this field, you'll also use `ios.buildNumber` and `android.versionCode` — read more about how to version your app [here](https://docs.expo.dev/distribution/app-stores/#versioning-your-app). On iOS this corresponds to `CFBundleShortVersionString`, and on Android, this corresponds to `versionName`. The required format can be found [here](https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleshortversionstring).","type":"string","meta":{"bareWorkflow":"To change your app version, edit the 'Version' field in Xcode and the `versionName` string in `android/app/build.gradle`"}},"platforms":{"description":"Platforms that your project explicitly supports. If not specified, it defaults to `[\"ios\", \"android\"]`.","example":["ios","android","web"],"type":"array","uniqueItems":true,"items":{"type":"string","enum":["android","ios","web"]}},"githubUrl":{"description":"If you would like to share the source code of your app on Github, enter the URL for the repository here and it will be linked to from your Expo project page.","pattern":"^https://github\\.com/","example":"https://github.com/expo/expo","type":["string"]},"orientation":{"description":"Locks your app to a specific orientation with portrait or landscape. Defaults to no lock. Valid values: `default`, `portrait`, `landscape`","enum":["default","portrait","landscape"],"type":"string"},"userInterfaceStyle":{"description":"Configuration to force the app to always use the light or dark user-interface appearance, such as \"dark mode\", or make it automatically adapt to the system preferences. If not provided, defaults to `light`. Requires `expo-system-ui` be installed in your project to work on Android.","type":"string","fallback":"light","enum":["light","dark","automatic"]},"backgroundColor":{"description":"The background color for your app, behind any of your React views. This is also known as the root view background color. Requires `expo-system-ui` be installed in your project to work on iOS.","type":"string","pattern":"^#|(&#x23;)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`. Default is white: `'#ffffff'`"}},"primaryColor":{"description":"On Android, this will determine the color of your app in the multitasker. Currently this is not used on iOS, but it may be used for other purposes in the future.","type":"string","pattern":"^#|(&#x23;)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"icon":{"description":"Local path or remote URL to an image to use for your app's icon. We recommend that you use a 1024x1024 png file. This icon will appear on the home screen and within the Expo app.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true,"bareWorkflow":"To change your app's icon, edit or replace the files in `ios/<PROJECT-NAME>/Assets.xcassets/AppIcon.appiconset` (we recommend using Xcode), and `android/app/src/main/res/mipmap-<RESOLUTION>`. Be sure to follow the guidelines for each platform ([iOS](https://developer.apple.com/design/human-interface-guidelines/ios/icons-and-images/app-icon/), [Android 7.1 and below](https://material.io/design/iconography/#icon-treatments), and [Android 8+](https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive)) and to provide your new icon in each existing size."}},"notification":{"description":"Configuration for remote (push) notifications.","type":"object","properties":{"icon":{"description":"(Android only) Local path or remote URL to an image to use as the icon for push notifications. 96x96 png grayscale with transparency. We recommend following [Google's design guidelines](https://material.io/design/iconography/product-icons.html#design-principles). If not provided, defaults to your app icon.","type":"string","meta":{"asset":true,"contentTypePattern":"^image/png$","contentTypeHuman":".png image","square":true}},"color":{"description":"(Android only) Tint color for the push notification image when it appears in the notification tray. Defaults to `#ffffff`","type":"string","pattern":"^#|(&#x23;)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}},"iosDisplayInForeground":{"description":"Whether or not to display notifications when the app is in the foreground on iOS. `_displayInForeground` option in the individual push notification message overrides this option. [Learn more.](https://docs.expo.dev/push-notifications/receiving-notifications/#foreground-notification-behavior) Defaults to `false`.","type":"boolean"},"androidMode":{"description":"Show each push notification individually (`default`) or collapse into one (`collapse`).","enum":["default","collapse"],"type":"string"},"androidCollapsedTitle":{"description":"If `androidMode` is set to `collapse`, this title is used for the collapsed notification message. For example, `'#{unread_notifications} new interactions'`.","type":"string"}},"additionalProperties":false},"androidStatusBar":{"description":"Configuration for the status bar on Android. For more details please navigate to [Configuring StatusBar](https://docs.expo.dev/guides/configuring-statusbar/).","type":"object","properties":{"barStyle":{"description":"Configures the status bar icons to have a light or dark color. Valid values: `light-content`, `dark-content`. Defaults to `dark-content`","type":"string","enum":["light-content","dark-content"]},"backgroundColor":{"description":"Specifies the background color of the status bar. Defaults to `#00000000` (transparent) for `dark-content` bar style and `#00000088` (semi-transparent black) for `light-content` bar style","type":"string","pattern":"^#|(&#x23;)\\d{6}$","meta":{"regexHuman":"6 character long hex color string `'#RRGGBB'`, for example, `'#000000'` for black. Or 8 character long hex color string `'#RRGGBBAA'`, for example, `'#00000088'` for semi-transparent black."}},"hidden":{"description":"Instructs the system whether the status bar should be visible or not. Defaults to `false`","type":"boolean"},"translucent":{"description":"When false, the system status bar pushes the content of your app down (similar to `position: relative`). When true, the status bar floats above the content in your app (similar to `position: absolute`). Defaults to `true` to match the iOS status bar behavior (which can only float above content). Explicitly setting this property to `true` will add `android:windowTranslucentStatus` to `styles.xml` and may cause unexpected keyboard behavior on Android when using the `softwareKeyboardLayoutMode` set to `resize`. In this case you will have to use `KeyboardAvoidingView` to manage the keyboard layout.","type":"boolean"}},"additionalProperties":false},"androidNavigationBar":{"description":"Configuration for the bottom navigation bar on Android. Can be used to configure the `expo-navigation-bar` module in EAS Build.","type":"object","properties":{"visible":{"description":"Determines how and when the navigation bar is shown. [Learn more](https://developer.android.com/training/system-ui/immersive). Requires `expo-navigation-bar` be installed in your project. Valid values: `leanback`, `immersive`, `sticky-immersive` \n\n `leanback` results in the navigation bar being hidden until the first touch gesture is registered. \n\n `immersive` results in the navigation bar being hidden until the user swipes up from the edge where the navigation bar is hidden. \n\n `sticky-immersive` is identical to `'immersive'` except that the navigation bar will be semi-transparent and will be hidden again after a short period of time.","type":"string","enum":["leanback","immersive","sticky-immersive"]},"barStyle":{"description":"Configure the navigation bar icons to have a light or dark color. Supported on Android Oreo and newer. Valid values: `'light-content'`, `'dark-content'`","type":"string","enum":["light-content","dark-content"]},"backgroundColor":{"description":"Specifies the background color of the navigation bar.","type":"string","pattern":"^#|(&#x23;)\\d{6}$","meta":{"regexHuman":"6 character long hex color string, for example, `'#000000'`"}}},"additionalProperties":false},"developmentClient":{"description":"Settings that apply specifically to running this app in a development client","type":"object","properties":{"silentLaunch":{"description":"If true, the app will launch in a development client with no additional dialogs or progress indicators, just like in a standalone app.","type":"boolean","fallback":false}},"additionalProperties":false},"scheme":{"description":"**Standalone Apps Only**. URL scheme to link into your app. For example, if we set this to `'demo'`, then demo:// URLs would open your app when tapped.","type":"string","pattern":"^[a-z][a-z0-9+.-]*$","meta":{"regexHuman":"String beginning with a **lowercase** letter followed by any combination of **lowercase** letters, digits, \"+\", \".\" or \"-\"","standaloneOnly":true,"bareWorkflow":"To change your app's scheme, replace all occurrences of the old scheme in `Info.plist` and `AndroidManifest.xml`"}},"extra":{"description":"Any extra fields you want to pass to your experience. Values are accessible via `Constants.expoConfig.extra` ([Learn more](https://docs.expo.dev/versions/latest/sdk/constants/#constantsmanifest))","type":"object","properties":{},"additionalProperties":true},"packagerOpts":{"description":"@deprecated Use a `metro.config.js` file instead. [Learn more](https://docs.expo.dev/guides/customizing-metro/)","meta":{"deprecated":true,"autogenerated":true},"type":"object","properties":{},"additionalProperties":true},"updates":{"description":"Configuration for how and when the app should request OTA JavaScript updates","type":"object","properties":{"enabled":{"description":"If set to false, your standalone app will never download any code, and will only use code bundled locally on the device. In that case, all updates to your app must be submitted through app store review. Defaults to true. (Note: This will not work out of the box with ExpoKit projects)","type":"boolean"},"checkAutomatically":{"description":"By default, Expo will check for updates every time the app is loaded. Set this to `ON_ERROR_RECOVERY` to disable automatic checking unless recovering from an error. Must be one of `ON_LOAD` or `ON_ERROR_RECOVERY`","enum":["ON_ERROR_RECOVERY","ON_LOAD"],"type":"string"},"fallbackToCacheTimeout":{"description":"How long (in ms) to allow for fetching OTA updates before falling back to a cached version of the app. Defaults to 0. Must be between 0 and 300000 (5 minutes).","type":"number","minimum":0,"maximum":300000},"url":{"description":"URL from which expo-updates will fetch update manifests","type":"string"},"codeSigningCertificate":{"description":"Local path of a PEM-formatted X.509 certificate used for requiring and verifying signed Expo updates","type":"string"},"codeSigningMetadata":{"description":"Metadata for `codeSigningCertificate`","type":"object","properties":{"alg":{"description":"Algorithm used to generate manifest code signing signature.","enum":["rsa-v1_5-sha256"],"type":"string"},"keyid":{"description":"Identifier for the key in the certificate. Used to instruct signing mechanisms when signing or verifying signatures.","type":"string"}},"additionalProperties":false},"requestHeaders":{"description":"Extra HTTP headers to include in HTTP requests made by `expo-updates`. These may override preset headers.","type":"object","additionalProperties":true}},"additionalProperties":false},"locales":{"description":"Provide overrides by locale for System Dialog prompts like Permissions Boxes","type":"object","properties":{},"meta":{"bareWorkflow":"To add or change language and localization information in your iOS app, you need to use Xcode."},"additionalProperties":{"type":["string","object"]}},"isDetached":{"description":"Is app detached","type":"boolean","meta":{"autogenerated":true}},"detach":{"description":"Extra fields needed by detached apps","type":"object","properties":{},"meta":{"autogenerated":true},"additionalProperties":true},"assetBundlePatterns":{"description":"An array of file glob strings which point to assets that will be bundled within your standalone app binary. Read more in the [Offline Support guide](https://docs.expo.dev/guides/offline-support/)","type":"array","items":{"type":"string"}},"plugins":{"description":"Config plugins for adding extra functionality to your project. [Learn more](https://docs.expo.dev/guides/config-plugins/).","meta":{"bareWorkflow":"Plugins that add modifications can only be used with [prebuilding](https://expo.fyi/prebuilding) and managed EAS Build"},"type":"array","items":{"anyOf":[{"type":["string"]},{"type":"array","items":[{"type":["string"]},{}],"additionalItems":false}]}},"splash":{"$ref":"#/definitions/Splash"},"jsEngine":{"description":"Specifies the JavaScript engine for apps. Supported only on EAS Build. Defaults to `hermes`. Valid values: `hermes`, `jsc`.","type":"string","fallback":"jsc","enum":["hermes","jsc"],"meta":{"bareWorkflow":"To change the JavaScript engine, update the `expo.jsEngine` value in `ios/Podfile.properties.json` or `android/gradle.properties`"}},"ios":{"$ref":"#/definitions/IOS"},"android":{"$ref":"#/definitions/Android"},"web":{"$ref":"#/definitions/Web"},"hooks":{"description":"Configuration for scripts to run to hook into the publish process","type":"object","additionalProperties":false,"properties":{"postPublish":{"type":"array","items":{"$ref":"#/definitions/PublishHook"}},"postExport":{"type":"array","items":{"$ref":"#/definitions/PublishHook"}}}},"experiments":{"description":"Enable experimental features that may be unstable, unsupported, or removed without deprecation notices.","type":"object","additionalProperties":false,"properties":{"turboModules":{"description":"Enables Turbo Modules, which are a type of native modules that use a different way of communicating between JS and platform code. When installing a Turbo Module you will need to enable this experimental option (the library still needs to be a part of Expo SDK already, like react-native-reanimated v2). Turbo Modules do not support remote debugging and enabling this option will disable remote debugging.","type":"boolean","fallback":false}}},"_internal":{"description":"Internal properties for developer tools","type":"object","properties":{"pluginHistory":{"description":"List of plugins already run on the config","type":"object","properties":{},"additionalProperties":true}},"additionalProperties":true,"meta":{"autogenerated":true}}},"additionalProperties":false,"required":["name","slug"]}}
+};
// TODO: Maybe move json-schema-deref-sync out of api (1.58MB -- lodash)
// https://packagephobia.com/result?p=json-schema-deref-sync
async function getSchemaAsync(sdkVersion) {
--- a/@expo/cli/build/src/api/user/UserSettings.js
+++ b/@expo/cli/build/src/api/user/UserSettings.js
@@ -31,16 +31,7 @@ async function setSessionAsync(sessionData) {
});
}
function getSession() {
- try {
- var ref;
- var ref1;
- return (ref1 = (ref = _jsonFile.default.read((0, _getUserState).getUserStatePath())) == null ? void 0 : ref.auth) != null ? ref1 : null;
- } catch (error) {
- if (error.code === "ENOENT") {
- return null;
- }
- throw error;
- }
+ return null;
}
function getAccessToken() {
var _EXPO_TOKEN;
@@ -68,4 +59,4 @@ const UserSettings = Object.assign(userSettingsJsonFile(), {
var _default = UserSettings;
exports.default = _default;
-//# sourceMappingURL=UserSettings.js.map
\ No newline at end of file
+//# sourceMappingURL=UserSettings.js.map
@irisjae
Copy link
Author

irisjae commented Jul 26, 2023

Sets of patches for "eas-cli": "3.9.2", "eas-cli-local-build-plugin": "0.0.128", "expo": "48.0.10" that allows building offline. To consume these patches, after installing node_modules in your expo project (make sure to install the packages aforementioned), cd into your node_modules directory, and patch -f -p1 < "/path/to/patch" to apply each of these patches.

Note that the eas-node-modules-install patch unblocks offline building via replacing the npm install invocation by the EAS local build plugin (which by default, would require internet connection), with a custom command expo-app-node-modules. This command needs to be supplied in your path for the build to work. For example, in my build process, I use a expo-app-node-modules script with the following contents, and a copy of the node_modules directory at EXPO_APP_NODE_MODULES_PATH

# ...
cp -a "$EXPO_APP_NODE_MODULES_PATH" "node_modules"
# ...

expo-home-detection should be unnecessary just for building offline, but enables setting the configs/cache directory for expo to a configurable location via an environment variable.

eas-graphql-logging is also unnecessary just for building offline. The patch is responsible for making any calls to the EAS GraphQL API visible.

@pSnehanshu
Copy link

I will try to apply it using yarn patch.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment