diff --git a/CHANGELOG.md b/CHANGELOG.md index 61169d75d5..965eb98051 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,10 +12,33 @@ This is the log of notable changes to EAS CLI and related packages. ### ๐Ÿงน Chores +- Popup website in fingerprint:compare. ([#2859](https://github.com/expo/eas-cli/pull/2859) by [@quinlanj](https://github.com/quinlanj)) + +## [15.0.3](https://github.com/expo/eas-cli/releases/tag/v15.0.3) - 2025-02-04 + +### ๐Ÿ› Bug fixes + +- Fixed EAS server environment variables does not pass to `npx expo-updates runtimeversion:resolve` call. ([#2867](https://github.com/expo/eas-cli/pull/2867) by [@kudo](https://github.com/kudo)) + +## [15.0.2](https://github.com/expo/eas-cli/releases/tag/v15.0.2) - 2025-02-04 + +## [15.0.1](https://github.com/expo/eas-cli/releases/tag/v15.0.1) - 2025-02-04 + +## [15.0.0](https://github.com/expo/eas-cli/releases/tag/v15.0.0) - 2025-02-04 + +### ๐Ÿ›  Breaking changes + +- Use Git to archive projects containing a Git repository. (Previously, Git would only be used if `requireCommit` flag in `eas.json` was set to `true`.) ([#2841](https://github.com/expo/eas-cli/pull/2841) by [@sjchmiela](https://github.com/sjchmiela)) + +### ๐Ÿ› Bug fixes + +- Print warning for `NoVcsClient` only once. ([#2863](https://github.com/expo/eas-cli/pull/2863) by [@szdziedzic](https://github.com/szdziedzic)) + +### ๐Ÿงน Chores + - Add update support for fingerprint:compare. ([#2850](https://github.com/expo/eas-cli/pull/2850) by [@quinlanj](https://github.com/quinlanj)) - Add update group id support for fingerprint:compare. ([#2851](https://github.com/expo/eas-cli/pull/2851) by [@quinlanj](https://github.com/quinlanj)) - Add better interactive support for fingerprint:compare. ([#2854](https://github.com/expo/eas-cli/pull/2854) by [@quinlanj](https://github.com/quinlanj)) -- Popup website in fingerprint:compare. ([#2859](https://github.com/expo/eas-cli/pull/2859) by [@quinlanj](https://github.com/quinlanj)) - Fix fingerprint:compare URL. ([#2861](https://github.com/expo/eas-cli/pull/2861) by [@quinlanj](https://github.com/quinlanj)) ## [14.7.1](https://github.com/expo/eas-cli/releases/tag/v14.7.1) - 2025-01-31 diff --git a/lerna.json b/lerna.json index 75ba746ea5..cc6ab35874 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { "npmClient": "yarn", - "version": "14.7.1", + "version": "15.0.3", "$schema": "node_modules/lerna/schemas/lerna-schema.json" } diff --git a/packages/eas-cli/README.md b/packages/eas-cli/README.md index 0d8c98eec7..cc5f9d84eb 100644 --- a/packages/eas-cli/README.md +++ b/packages/eas-cli/README.md @@ -160,7 +160,7 @@ ALIASES $ eas login ``` -_See code: [packages/eas-cli/src/commands/account/login.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/account/login.ts)_ +_See code: [packages/eas-cli/src/commands/account/login.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/account/login.ts)_ ## `eas account:logout` @@ -177,7 +177,7 @@ ALIASES $ eas logout ``` -_See code: [packages/eas-cli/src/commands/account/logout.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/account/logout.ts)_ +_See code: [packages/eas-cli/src/commands/account/logout.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/account/logout.ts)_ ## `eas account:view` @@ -194,7 +194,7 @@ ALIASES $ eas whoami ``` -_See code: [packages/eas-cli/src/commands/account/view.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/account/view.ts)_ +_See code: [packages/eas-cli/src/commands/account/view.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/account/view.ts)_ ## `eas analytics [STATUS]` @@ -208,7 +208,7 @@ DESCRIPTION display or change analytics settings ``` -_See code: [packages/eas-cli/src/commands/analytics.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/analytics.ts)_ +_See code: [packages/eas-cli/src/commands/analytics.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/analytics.ts)_ ## `eas autocomplete [SHELL]` @@ -260,7 +260,7 @@ DESCRIPTION create a branch ``` -_See code: [packages/eas-cli/src/commands/branch/create.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/branch/create.ts)_ +_See code: [packages/eas-cli/src/commands/branch/create.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/branch/create.ts)_ ## `eas branch:delete [NAME]` @@ -281,7 +281,7 @@ DESCRIPTION delete a branch ``` -_See code: [packages/eas-cli/src/commands/branch/delete.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/branch/delete.ts)_ +_See code: [packages/eas-cli/src/commands/branch/delete.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/branch/delete.ts)_ ## `eas branch:list` @@ -301,7 +301,7 @@ DESCRIPTION list all branches ``` -_See code: [packages/eas-cli/src/commands/branch/list.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/branch/list.ts)_ +_See code: [packages/eas-cli/src/commands/branch/list.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/branch/list.ts)_ ## `eas branch:rename` @@ -321,7 +321,7 @@ DESCRIPTION rename a branch ``` -_See code: [packages/eas-cli/src/commands/branch/rename.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/branch/rename.ts)_ +_See code: [packages/eas-cli/src/commands/branch/rename.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/branch/rename.ts)_ ## `eas branch:view [NAME]` @@ -344,7 +344,7 @@ DESCRIPTION view a branch ``` -_See code: [packages/eas-cli/src/commands/branch/view.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/branch/view.ts)_ +_See code: [packages/eas-cli/src/commands/branch/view.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/branch/view.ts)_ ## `eas build` @@ -381,7 +381,7 @@ DESCRIPTION start a build ``` -_See code: [packages/eas-cli/src/commands/build/index.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/build/index.ts)_ +_See code: [packages/eas-cli/src/commands/build/index.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/build/index.ts)_ ## `eas build:cancel [BUILD_ID]` @@ -400,7 +400,7 @@ DESCRIPTION cancel a build ``` -_See code: [packages/eas-cli/src/commands/build/cancel.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/build/cancel.ts)_ +_See code: [packages/eas-cli/src/commands/build/cancel.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/build/cancel.ts)_ ## `eas build:configure` @@ -417,7 +417,7 @@ DESCRIPTION configure the project to support EAS Build ``` -_See code: [packages/eas-cli/src/commands/build/configure.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/build/configure.ts)_ +_See code: [packages/eas-cli/src/commands/build/configure.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/build/configure.ts)_ ## `eas build:delete [BUILD_ID]` @@ -436,7 +436,7 @@ DESCRIPTION delete a build ``` -_See code: [packages/eas-cli/src/commands/build/delete.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/build/delete.ts)_ +_See code: [packages/eas-cli/src/commands/build/delete.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/build/delete.ts)_ ## `eas build:dev` @@ -456,7 +456,7 @@ DESCRIPTION run dev client simulator/emulator build with matching fingerprint or create a new one ``` -_See code: [packages/eas-cli/src/commands/build/dev.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/build/dev.ts)_ +_See code: [packages/eas-cli/src/commands/build/dev.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/build/dev.ts)_ ## `eas build:inspect` @@ -491,7 +491,7 @@ DESCRIPTION inspect the state of the project at specific build stages, useful for troubleshooting ``` -_See code: [packages/eas-cli/src/commands/build/inspect.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/build/inspect.ts)_ +_See code: [packages/eas-cli/src/commands/build/inspect.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/build/inspect.ts)_ ## `eas build:list` @@ -543,7 +543,7 @@ DESCRIPTION list all builds for your project ``` -_See code: [packages/eas-cli/src/commands/build/list.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/build/list.ts)_ +_See code: [packages/eas-cli/src/commands/build/list.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/build/list.ts)_ ## `eas build:resign` @@ -572,7 +572,7 @@ DESCRIPTION re-sign a build archive ``` -_See code: [packages/eas-cli/src/commands/build/resign.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/build/resign.ts)_ +_See code: [packages/eas-cli/src/commands/build/resign.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/build/resign.ts)_ ## `eas build:run` @@ -598,7 +598,7 @@ DESCRIPTION run simulator/emulator builds from eas-cli ``` -_See code: [packages/eas-cli/src/commands/build/run.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/build/run.ts)_ +_See code: [packages/eas-cli/src/commands/build/run.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/build/run.ts)_ ## `eas build:submit` @@ -648,7 +648,7 @@ DESCRIPTION get the latest version from EAS servers ``` -_See code: [packages/eas-cli/src/commands/build/version/get.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/build/version/get.ts)_ +_See code: [packages/eas-cli/src/commands/build/version/get.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/build/version/get.ts)_ ## `eas build:version:set` @@ -667,7 +667,7 @@ DESCRIPTION update version of an app ``` -_See code: [packages/eas-cli/src/commands/build/version/set.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/build/version/set.ts)_ +_See code: [packages/eas-cli/src/commands/build/version/set.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/build/version/set.ts)_ ## `eas build:version:sync` @@ -686,7 +686,7 @@ DESCRIPTION update a version in native code with a value stored on EAS servers ``` -_See code: [packages/eas-cli/src/commands/build/version/sync.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/build/version/sync.ts)_ +_See code: [packages/eas-cli/src/commands/build/version/sync.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/build/version/sync.ts)_ ## `eas build:view [BUILD_ID]` @@ -703,7 +703,7 @@ DESCRIPTION view a build for your project ``` -_See code: [packages/eas-cli/src/commands/build/view.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/build/view.ts)_ +_See code: [packages/eas-cli/src/commands/build/view.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/build/view.ts)_ ## `eas channel:create [NAME]` @@ -724,7 +724,7 @@ DESCRIPTION create a channel ``` -_See code: [packages/eas-cli/src/commands/channel/create.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/channel/create.ts)_ +_See code: [packages/eas-cli/src/commands/channel/create.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/channel/create.ts)_ ## `eas channel:edit [NAME]` @@ -746,7 +746,7 @@ DESCRIPTION point a channel at a new branch ``` -_See code: [packages/eas-cli/src/commands/channel/edit.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/channel/edit.ts)_ +_See code: [packages/eas-cli/src/commands/channel/edit.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/channel/edit.ts)_ ## `eas channel:list` @@ -766,7 +766,7 @@ DESCRIPTION list all channels ``` -_See code: [packages/eas-cli/src/commands/channel/list.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/channel/list.ts)_ +_See code: [packages/eas-cli/src/commands/channel/list.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/channel/list.ts)_ ## `eas channel:pause [NAME]` @@ -788,7 +788,7 @@ DESCRIPTION pause a channel to stop it from sending updates ``` -_See code: [packages/eas-cli/src/commands/channel/pause.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/channel/pause.ts)_ +_See code: [packages/eas-cli/src/commands/channel/pause.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/channel/pause.ts)_ ## `eas channel:resume [NAME]` @@ -810,7 +810,7 @@ DESCRIPTION resume a channel to start sending updates ``` -_See code: [packages/eas-cli/src/commands/channel/resume.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/channel/resume.ts)_ +_See code: [packages/eas-cli/src/commands/channel/resume.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/channel/resume.ts)_ ## `eas channel:rollout [CHANNEL]` @@ -843,7 +843,7 @@ DESCRIPTION Roll a new branch out on a channel incrementally. ``` -_See code: [packages/eas-cli/src/commands/channel/rollout.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/channel/rollout.ts)_ +_See code: [packages/eas-cli/src/commands/channel/rollout.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/channel/rollout.ts)_ ## `eas channel:view [NAME]` @@ -866,7 +866,7 @@ DESCRIPTION view a channel ``` -_See code: [packages/eas-cli/src/commands/channel/view.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/channel/view.ts)_ +_See code: [packages/eas-cli/src/commands/channel/view.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/channel/view.ts)_ ## `eas config` @@ -887,7 +887,7 @@ DESCRIPTION display project configuration (app.json + eas.json) ``` -_See code: [packages/eas-cli/src/commands/config.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/config.ts)_ +_See code: [packages/eas-cli/src/commands/config.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/config.ts)_ ## `eas credentials` @@ -904,7 +904,7 @@ DESCRIPTION manage credentials ``` -_See code: [packages/eas-cli/src/commands/credentials/index.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/credentials/index.ts)_ +_See code: [packages/eas-cli/src/commands/credentials/index.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/credentials/index.ts)_ ## `eas credentials:configure-build` @@ -922,7 +922,7 @@ DESCRIPTION Set up credentials for building your project. ``` -_See code: [packages/eas-cli/src/commands/credentials/configure-build.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/credentials/configure-build.ts)_ +_See code: [packages/eas-cli/src/commands/credentials/configure-build.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/credentials/configure-build.ts)_ ## `eas deploy [options]` @@ -950,7 +950,7 @@ ALIASES $ eas worker:deploy ``` -_See code: [packages/eas-cli/src/commands/deploy/index.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/deploy/index.ts)_ +_See code: [packages/eas-cli/src/commands/deploy/index.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/deploy/index.ts)_ ## `eas deploy:alias` @@ -975,7 +975,7 @@ ALIASES $ eas deploy:promote ``` -_See code: [packages/eas-cli/src/commands/deploy/alias.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/deploy/alias.ts)_ +_See code: [packages/eas-cli/src/commands/deploy/alias.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/deploy/alias.ts)_ ## `eas deploy:promote` @@ -1012,7 +1012,7 @@ DESCRIPTION register new Apple Devices to use for internal distribution ``` -_See code: [packages/eas-cli/src/commands/device/create.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/device/create.ts)_ +_See code: [packages/eas-cli/src/commands/device/create.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/device/create.ts)_ ## `eas device:delete` @@ -1032,7 +1032,7 @@ DESCRIPTION remove a registered device from your account ``` -_See code: [packages/eas-cli/src/commands/device/delete.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/device/delete.ts)_ +_See code: [packages/eas-cli/src/commands/device/delete.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/device/delete.ts)_ ## `eas device:list` @@ -1053,7 +1053,7 @@ DESCRIPTION list all registered devices for your account ``` -_See code: [packages/eas-cli/src/commands/device/list.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/device/list.ts)_ +_See code: [packages/eas-cli/src/commands/device/list.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/device/list.ts)_ ## `eas device:rename` @@ -1074,7 +1074,7 @@ DESCRIPTION rename a registered device ``` -_See code: [packages/eas-cli/src/commands/device/rename.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/device/rename.ts)_ +_See code: [packages/eas-cli/src/commands/device/rename.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/device/rename.ts)_ ## `eas device:view [UDID]` @@ -1088,7 +1088,7 @@ DESCRIPTION view a device for your project ``` -_See code: [packages/eas-cli/src/commands/device/view.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/device/view.ts)_ +_See code: [packages/eas-cli/src/commands/device/view.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/device/view.ts)_ ## `eas diagnostics` @@ -1102,7 +1102,7 @@ DESCRIPTION display environment info ``` -_See code: [packages/eas-cli/src/commands/diagnostics.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/diagnostics.ts)_ +_See code: [packages/eas-cli/src/commands/diagnostics.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/diagnostics.ts)_ ## `eas env:create [ENVIRONMENT]` @@ -1131,7 +1131,7 @@ DESCRIPTION create an environment variable for the current project or account ``` -_See code: [packages/eas-cli/src/commands/env/create.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/env/create.ts)_ +_See code: [packages/eas-cli/src/commands/env/create.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/env/create.ts)_ ## `eas env:delete [ENVIRONMENT]` @@ -1155,7 +1155,7 @@ DESCRIPTION delete an environment variable for the current project or account ``` -_See code: [packages/eas-cli/src/commands/env/delete.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/env/delete.ts)_ +_See code: [packages/eas-cli/src/commands/env/delete.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/env/delete.ts)_ ## `eas env:exec ENVIRONMENT BASH_COMMAND` @@ -1176,7 +1176,7 @@ DESCRIPTION execute a command with environment variables from the selected environment ``` -_See code: [packages/eas-cli/src/commands/env/exec.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/env/exec.ts)_ +_See code: [packages/eas-cli/src/commands/env/exec.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/env/exec.ts)_ ## `eas env:get [ENVIRONMENT]` @@ -1201,7 +1201,7 @@ DESCRIPTION view an environment variable for the current project or account ``` -_See code: [packages/eas-cli/src/commands/env/get.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/env/get.ts)_ +_See code: [packages/eas-cli/src/commands/env/get.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/env/get.ts)_ ## `eas env:list [ENVIRONMENT]` @@ -1226,7 +1226,7 @@ DESCRIPTION list environment variables for the current project or account ``` -_See code: [packages/eas-cli/src/commands/env/list.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/env/list.ts)_ +_See code: [packages/eas-cli/src/commands/env/list.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/env/list.ts)_ ## `eas env:pull [ENVIRONMENT]` @@ -1249,7 +1249,7 @@ DESCRIPTION pull environment variables for the selected environment to .env file ``` -_See code: [packages/eas-cli/src/commands/env/pull.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/env/pull.ts)_ +_See code: [packages/eas-cli/src/commands/env/pull.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/env/pull.ts)_ ## `eas env:push [ENVIRONMENT]` @@ -1270,7 +1270,7 @@ DESCRIPTION push environment variables from .env file to the selected environment ``` -_See code: [packages/eas-cli/src/commands/env/push.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/env/push.ts)_ +_See code: [packages/eas-cli/src/commands/env/push.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/env/push.ts)_ ## `eas env:update [ENVIRONMENT]` @@ -1301,7 +1301,7 @@ DESCRIPTION update an environment variable on the current project or account ``` -_See code: [packages/eas-cli/src/commands/env/update.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/env/update.ts)_ +_See code: [packages/eas-cli/src/commands/env/update.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/env/update.ts)_ ## `eas fingerprint:compare [HASH1] [HASH2]` @@ -1309,16 +1309,17 @@ compare fingerprints of the current project, builds and updates ``` USAGE - $ eas fingerprint:compare [HASH1] [HASH2] [--build-id ] [--json --non-interactive] + $ eas fingerprint:compare [HASH1] [HASH2] [--build-id ] [--update-id ] [--json --non-interactive] ARGUMENTS HASH1 If provided alone, HASH1 is compared against the current project's fingerprint. HASH2 If two hashes are provided, HASH1 is compared against HASH2. FLAGS - --build-id= Compare the fingerprint with the build with the specified ID - --json Enable JSON output, non-JSON messages will be printed to stderr. - --non-interactive Run the command in non-interactive mode. + --build-id=... Compare the fingerprint with the build with the specified ID + --json Enable JSON output, non-JSON messages will be printed to stderr. + --non-interactive Run the command in non-interactive mode. + --update-id=... Compare the fingerprint with the update with the specified ID DESCRIPTION compare fingerprints of the current project, builds and updates @@ -1326,14 +1327,20 @@ DESCRIPTION EXAMPLES $ eas fingerprint:compare # Compare fingerprints in interactive mode - $ eas fingerprint:compare c71a7d475aa6f75291bc93cd74aef395c3c94eee # Compare fingerprint against local directory + $ eas fingerprint:compare # Compare fingerprint against local directory + + $ eas fingerprint:compare # Compare provided fingerprints + + $ eas fingerprint:compare --build-id # Compare fingerprint from build against local directory + + $ eas fingerprint:compare --build-id --build-id # Compare fingerprint from a build against another build - $ eas fingerprint:compare c71a7d475aa6f75291bc93cd74aef395c3c94eee f0d6a916e73f401d428e6e006e07b12453317ba2 # Compare provided fingerprints + $ eas fingerprint:compare --build-id --update-id # Compare fingerprint from build against fingerprint from update - $ eas fingerprint:compare --build-id 82bc6456-611a-48cb-8db4-5f9eb2ca1003 # Compare fingerprint from build against local directory + $ eas fingerprint:compare --update-id # Compare fingerprint from update against provided fingerprint ``` -_See code: [packages/eas-cli/src/commands/fingerprint/compare.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/fingerprint/compare.ts)_ +_See code: [packages/eas-cli/src/commands/fingerprint/compare.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/fingerprint/compare.ts)_ ## `eas help [COMMAND]` @@ -1441,7 +1448,7 @@ DESCRIPTION validate the local store configuration ``` -_See code: [packages/eas-cli/src/commands/metadata/lint.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/metadata/lint.ts)_ +_See code: [packages/eas-cli/src/commands/metadata/lint.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/metadata/lint.ts)_ ## `eas metadata:pull` @@ -1458,7 +1465,7 @@ DESCRIPTION generate the local store configuration from the app stores ``` -_See code: [packages/eas-cli/src/commands/metadata/pull.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/metadata/pull.ts)_ +_See code: [packages/eas-cli/src/commands/metadata/pull.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/metadata/pull.ts)_ ## `eas metadata:push` @@ -1475,7 +1482,7 @@ DESCRIPTION sync the local store configuration to the app stores ``` -_See code: [packages/eas-cli/src/commands/metadata/push.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/metadata/push.ts)_ +_See code: [packages/eas-cli/src/commands/metadata/push.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/metadata/push.ts)_ ## `eas onboarding [TARGET_PROJECT_DIRECTORY]` @@ -1505,7 +1512,7 @@ DESCRIPTION open the project page in a web browser ``` -_See code: [packages/eas-cli/src/commands/open.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/open.ts)_ +_See code: [packages/eas-cli/src/commands/open.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/open.ts)_ ## `eas project:info` @@ -1519,7 +1526,7 @@ DESCRIPTION information about the current project ``` -_See code: [packages/eas-cli/src/commands/project/info.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/project/info.ts)_ +_See code: [packages/eas-cli/src/commands/project/info.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/project/info.ts)_ ## `eas project:init` @@ -1542,7 +1549,7 @@ ALIASES $ eas init ``` -_See code: [packages/eas-cli/src/commands/project/init.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/project/init.ts)_ +_See code: [packages/eas-cli/src/commands/project/init.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/project/init.ts)_ ## `eas project:onboarding [TARGET_PROJECT_DIRECTORY]` @@ -1560,7 +1567,7 @@ ALIASES $ eas onboarding ``` -_See code: [packages/eas-cli/src/commands/project/onboarding.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/project/onboarding.ts)_ +_See code: [packages/eas-cli/src/commands/project/onboarding.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/project/onboarding.ts)_ ## `eas submit` @@ -1591,7 +1598,7 @@ ALIASES $ eas build:submit ``` -_See code: [packages/eas-cli/src/commands/submit.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/submit.ts)_ +_See code: [packages/eas-cli/src/commands/submit.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/submit.ts)_ ## `eas update` @@ -1633,7 +1640,7 @@ DESCRIPTION publish an update group ``` -_See code: [packages/eas-cli/src/commands/update/index.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/update/index.ts)_ +_See code: [packages/eas-cli/src/commands/update/index.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/update/index.ts)_ ## `eas update:configure` @@ -1653,7 +1660,7 @@ DESCRIPTION configure the project to support EAS Update ``` -_See code: [packages/eas-cli/src/commands/update/configure.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/update/configure.ts)_ +_See code: [packages/eas-cli/src/commands/update/configure.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/update/configure.ts)_ ## `eas update:delete GROUPID` @@ -1674,7 +1681,7 @@ DESCRIPTION delete all the updates in an update group ``` -_See code: [packages/eas-cli/src/commands/update/delete.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/update/delete.ts)_ +_See code: [packages/eas-cli/src/commands/update/delete.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/update/delete.ts)_ ## `eas update:edit [GROUPID]` @@ -1698,7 +1705,7 @@ DESCRIPTION edit all the updates in an update group ``` -_See code: [packages/eas-cli/src/commands/update/edit.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/update/edit.ts)_ +_See code: [packages/eas-cli/src/commands/update/edit.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/update/edit.ts)_ ## `eas update:list` @@ -1720,7 +1727,7 @@ DESCRIPTION view the recent updates ``` -_See code: [packages/eas-cli/src/commands/update/list.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/update/list.ts)_ +_See code: [packages/eas-cli/src/commands/update/list.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/update/list.ts)_ ## `eas update:republish` @@ -1752,7 +1759,7 @@ DESCRIPTION roll back to an existing update ``` -_See code: [packages/eas-cli/src/commands/update/republish.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/update/republish.ts)_ +_See code: [packages/eas-cli/src/commands/update/republish.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/update/republish.ts)_ ## `eas update:roll-back-to-embedded` @@ -1780,7 +1787,7 @@ DESCRIPTION roll back to the embedded update ``` -_See code: [packages/eas-cli/src/commands/update/roll-back-to-embedded.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/update/roll-back-to-embedded.ts)_ +_See code: [packages/eas-cli/src/commands/update/roll-back-to-embedded.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/update/roll-back-to-embedded.ts)_ ## `eas update:rollback` @@ -1800,7 +1807,7 @@ DESCRIPTION roll back to an embedded update or an existing update ``` -_See code: [packages/eas-cli/src/commands/update/rollback.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/update/rollback.ts)_ +_See code: [packages/eas-cli/src/commands/update/rollback.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/update/rollback.ts)_ ## `eas update:view GROUPID` @@ -1820,7 +1827,7 @@ DESCRIPTION update group details ``` -_See code: [packages/eas-cli/src/commands/update/view.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/update/view.ts)_ +_See code: [packages/eas-cli/src/commands/update/view.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/update/view.ts)_ ## `eas webhook:create` @@ -1841,7 +1848,7 @@ DESCRIPTION create a webhook ``` -_See code: [packages/eas-cli/src/commands/webhook/create.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/webhook/create.ts)_ +_See code: [packages/eas-cli/src/commands/webhook/create.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/webhook/create.ts)_ ## `eas webhook:delete [ID]` @@ -1861,7 +1868,7 @@ DESCRIPTION delete a webhook ``` -_See code: [packages/eas-cli/src/commands/webhook/delete.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/webhook/delete.ts)_ +_See code: [packages/eas-cli/src/commands/webhook/delete.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/webhook/delete.ts)_ ## `eas webhook:list` @@ -1879,7 +1886,7 @@ DESCRIPTION list webhooks ``` -_See code: [packages/eas-cli/src/commands/webhook/list.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/webhook/list.ts)_ +_See code: [packages/eas-cli/src/commands/webhook/list.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/webhook/list.ts)_ ## `eas webhook:update` @@ -1901,7 +1908,7 @@ DESCRIPTION update a webhook ``` -_See code: [packages/eas-cli/src/commands/webhook/update.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/webhook/update.ts)_ +_See code: [packages/eas-cli/src/commands/webhook/update.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/webhook/update.ts)_ ## `eas webhook:view ID` @@ -1918,7 +1925,7 @@ DESCRIPTION view a webhook ``` -_See code: [packages/eas-cli/src/commands/webhook/view.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/webhook/view.ts)_ +_See code: [packages/eas-cli/src/commands/webhook/view.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/webhook/view.ts)_ ## `eas whoami` @@ -2002,7 +2009,7 @@ DESCRIPTION create a new workflow configuration YAML file ``` -_See code: [packages/eas-cli/src/commands/workflow/create.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/workflow/create.ts)_ +_See code: [packages/eas-cli/src/commands/workflow/create.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/workflow/create.ts)_ ## `eas workflow:run [FILE]` @@ -2022,7 +2029,7 @@ DESCRIPTION Run an EAS workflow ``` -_See code: [packages/eas-cli/src/commands/workflow/run.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/workflow/run.ts)_ +_See code: [packages/eas-cli/src/commands/workflow/run.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/workflow/run.ts)_ ## `eas workflow:validate PATH` @@ -2042,5 +2049,5 @@ DESCRIPTION validate a workflow configuration yaml file ``` -_See code: [packages/eas-cli/src/commands/workflow/validate.ts](https://github.com/expo/eas-cli/blob/v14.7.1/packages/eas-cli/src/commands/workflow/validate.ts)_ +_See code: [packages/eas-cli/src/commands/workflow/validate.ts](https://github.com/expo/eas-cli/blob/v15.0.3/packages/eas-cli/src/commands/workflow/validate.ts)_ diff --git a/packages/eas-cli/graphql.schema.json b/packages/eas-cli/graphql.schema.json index 3a1041b7c1..137d089ea1 100644 --- a/packages/eas-cli/graphql.schema.json +++ b/packages/eas-cli/graphql.schema.json @@ -60446,6 +60446,18 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "sourceExpiresAt", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "status", "description": null, diff --git a/packages/eas-cli/package.json b/packages/eas-cli/package.json index b3b1e50c28..19d98cbda0 100644 --- a/packages/eas-cli/package.json +++ b/packages/eas-cli/package.json @@ -1,7 +1,7 @@ { "name": "eas-cli", "description": "EAS command line tool", - "version": "14.7.1", + "version": "15.0.3", "author": "Expo ", "bin": { "eas": "./bin/run" @@ -13,7 +13,7 @@ "@expo/config": "10.0.6", "@expo/config-plugins": "9.0.12", "@expo/eas-build-job": "1.0.165", - "@expo/eas-json": "14.5.0", + "@expo/eas-json": "15.0.0", "@expo/env": "^1.0.0", "@expo/json-file": "8.3.3", "@expo/logger": "1.0.117", diff --git a/packages/eas-cli/src/build/__tests__/configure-test.ts b/packages/eas-cli/src/build/__tests__/configure-test.ts index 04050a4099..21802e2932 100644 --- a/packages/eas-cli/src/build/__tests__/configure-test.ts +++ b/packages/eas-cli/src/build/__tests__/configure-test.ts @@ -38,7 +38,7 @@ describe(ensureProjectConfiguredAsync, () => { }), }); await expect(fs.pathExists(EasJsonAccessor.formatEasJsonPath('.'))).resolves.toBeTruthy(); - const vcsClientMock = jest.mocked(new GitClient()); + const vcsClientMock = jest.mocked(new GitClient({ requireCommit: false })); vcsClientMock.showChangedFilesAsync.mockImplementation(async () => {}); vcsClientMock.isCommitRequiredAsync.mockImplementation(async () => false); vcsClientMock.trackFileAsync.mockImplementation(async () => {}); @@ -60,7 +60,7 @@ describe(ensureProjectConfiguredAsync, () => { }); }); await expect(fs.pathExists(EasJsonAccessor.formatEasJsonPath('.'))).resolves.toBeFalsy(); - const vcsClientMock = jest.mocked(new GitClient()); + const vcsClientMock = jest.mocked(new GitClient({ requireCommit: false })); vcsClientMock.showChangedFilesAsync.mockImplementation(async () => {}); vcsClientMock.isCommitRequiredAsync.mockImplementation(async () => false); vcsClientMock.trackFileAsync.mockImplementation(async () => {}); diff --git a/packages/eas-cli/src/build/runBuildAndSubmit.ts b/packages/eas-cli/src/build/runBuildAndSubmit.ts index fc3d3cf8db..6b1e4d3f94 100644 --- a/packages/eas-cli/src/build/runBuildAndSubmit.ts +++ b/packages/eas-cli/src/build/runBuildAndSubmit.ts @@ -11,6 +11,7 @@ import { import { LoggerLevel } from '@expo/logger'; import assert from 'assert'; import chalk from 'chalk'; +import { pathExists } from 'fs-extra'; import nullthrows from 'nullthrows'; import { prepareAndroidBuildAsync } from './android/build'; @@ -62,7 +63,7 @@ import { validateBuildProfileVersionSettingsAsync, } from '../project/remoteVersionSource'; import { confirmAsync } from '../prompts'; -import { runAsync } from '../run/run'; +import { getEasBuildRunCachedAppPath, runAsync } from '../run/run'; import { isRunnableOnSimulatorOrEmulator } from '../run/utils'; import { createSubmissionContextAsync } from '../submit/context'; import { @@ -545,11 +546,21 @@ function exitWithNonZeroCodeIfSomeBuildsFailed(maybeBuilds: (BuildFragment | nul } } -async function downloadAndRunAsync(build: BuildFragment): Promise { +export async function downloadAndRunAsync(build: BuildFragment): Promise { assert(build.artifacts?.applicationArchiveUrl); + const cachedAppPath = getEasBuildRunCachedAppPath(build.project.id, build.id, build.platform); + + if (await pathExists(cachedAppPath)) { + Log.newLine(); + Log.log(`Using cached app...`); + await runAsync(cachedAppPath, build.platform); + return; + } + const buildPath = await downloadAndMaybeExtractAppAsync( build.artifacts.applicationArchiveUrl, - build.platform + build.platform, + cachedAppPath ); await runAsync(buildPath, build.platform); } diff --git a/packages/eas-cli/src/commands/build/dev.ts b/packages/eas-cli/src/commands/build/dev.ts index b6a968b740..f6eed3b6c1 100644 --- a/packages/eas-cli/src/commands/build/dev.ts +++ b/packages/eas-cli/src/commands/build/dev.ts @@ -1,6 +1,7 @@ import { Platform } from '@expo/eas-build-job'; import { BuildProfile, EasJsonAccessor } from '@expo/eas-json'; import { Errors, Flags } from '@oclif/core'; +import chalk from 'chalk'; import { createBuildProfileAsync, @@ -8,18 +9,18 @@ import { ensureProjectConfiguredAsync, } from '../../build/configure'; import { evaluateConfigWithEnvVarsAsync } from '../../build/evaluateConfigWithEnvVarsAsync'; -import { runBuildAndSubmitAsync } from '../../build/runBuildAndSubmit'; +import { downloadAndRunAsync, runBuildAndSubmitAsync } from '../../build/runBuildAndSubmit'; import { ensureRepoIsCleanAsync } from '../../build/utils/repository'; import EasCommand from '../../commandUtils/EasCommand'; -import { BuildStatus, DistributionType } from '../../graphql/generated'; +import { ExpoGraphqlClient } from '../../commandUtils/context/contextUtils/createGraphqlClient'; +import { BuildFragment, BuildStatus, DistributionType } from '../../graphql/generated'; import { BuildQuery } from '../../graphql/queries/BuildQuery'; import { toAppPlatform } from '../../graphql/types/AppPlatform'; import Log from '../../log'; import { RequestedPlatform } from '../../platform'; import { resolveWorkflowAsync } from '../../project/workflow'; import { confirmAsync, promptAsync } from '../../prompts'; -import { runAsync } from '../../run/run'; -import { downloadAndMaybeExtractAppAsync } from '../../utils/download'; +import { expoCommandAsync } from '../../utils/expoCli'; import { createFingerprintAsync } from '../../utils/fingerprintCli'; import { ProfileData, getProfilesAsync } from '../../utils/profiles'; import { Client } from '../../vcs/vcs'; @@ -109,18 +110,11 @@ export default class BuildDev extends EasCommand { Log.log(`โœจ Calculated fingerprint hash: ${fingerprint.hash}`); Log.newLine(); - const builds = await BuildQuery.viewBuildsOnAppAsync(graphqlClient, { - appId: projectId, - filter: { - platform: toAppPlatform(platform), - fingerprintHash: fingerprint.hash, - status: BuildStatus.Finished, - simulator: platform === Platform.IOS ? true : undefined, - distribution: platform === Platform.ANDROID ? DistributionType.Internal : undefined, - developmentClient: true, - }, - offset: 0, - limit: 1, + const builds = await this.getBuildsAsync({ + graphqlClient, + projectId, + platform, + fingerprint, }); if (builds.length !== 0) { const build = builds[0]; @@ -129,11 +123,8 @@ export default class BuildDev extends EasCommand { ); if (build.artifacts?.applicationArchiveUrl) { - const buildPath = await downloadAndMaybeExtractAppAsync( - build.artifacts.applicationArchiveUrl, - build.platform - ); - await runAsync(buildPath, build.platform); + await downloadAndRunAsync(build); + await this.startDevServerAsync({ projectDir, platform }); return; } else { Log.warn('Artifacts for this build expired. New build will be started.'); @@ -142,6 +133,22 @@ export default class BuildDev extends EasCommand { Log.log('๐Ÿš€ No successful build with matching fingerprint found. Starting a new build...'); + const previousBuildsForSelectedProfile = await this.getBuildsAsync({ + graphqlClient, + projectId, + platform, + }); + if ( + previousBuildsForSelectedProfile.length > 0 && + previousBuildsForSelectedProfile[0].metrics?.buildDuration + ) { + Log.log( + `๐Ÿ•’ Previous build for "${buildProfile.profileName}" profile completed in ${Math.floor( + previousBuildsForSelectedProfile[0].metrics.buildDuration / 60000 + )} minutes.` + ); + } + await runBuildAndSubmitAsync({ graphqlClient, analytics, @@ -165,6 +172,7 @@ export default class BuildDev extends EasCommand { downloadSimBuildAutoConfirm: true, envOverride: env, }); + await this.startDevServerAsync({ projectDir, platform }); } private async selectPlatformAsync(platform?: Platform): Promise { @@ -294,4 +302,50 @@ export default class BuildDev extends EasCommand { }); return buildProfile; } + + private async getBuildsAsync({ + graphqlClient, + projectId, + platform, + fingerprint, + }: { + graphqlClient: ExpoGraphqlClient; + projectId: string; + platform: Platform; + fingerprint?: { hash: string }; + }): Promise { + return await BuildQuery.viewBuildsOnAppAsync(graphqlClient, { + appId: projectId, + filter: { + platform: toAppPlatform(platform), + fingerprintHash: fingerprint?.hash, + status: BuildStatus.Finished, + simulator: platform === Platform.IOS ? true : undefined, + distribution: platform === Platform.ANDROID ? DistributionType.Internal : undefined, + developmentClient: true, + }, + offset: 0, + limit: 1, + }); + } + + private async startDevServerAsync({ + projectDir, + platform, + }: { + projectDir: string; + platform: Platform; + }): Promise { + Log.newLine(); + Log.log( + `Starting development server: ${chalk.dim( + `npx expo start --dev-client ${platform === Platform.IOS ? '--ios' : '--android'}` + )}` + ); + await expoCommandAsync(projectDir, [ + 'start', + '--dev-client', + platform === Platform.IOS ? '--ios' : '--android', + ]); + } } diff --git a/packages/eas-cli/src/commands/build/internal.ts b/packages/eas-cli/src/commands/build/internal.ts index 72e3747445..ad8676692f 100644 --- a/packages/eas-cli/src/commands/build/internal.ts +++ b/packages/eas-cli/src/commands/build/internal.ts @@ -6,8 +6,7 @@ import { runBuildAndSubmitAsync } from '../../build/runBuildAndSubmit'; import EasCommand from '../../commandUtils/EasCommand'; import { RequestedPlatform } from '../../platform'; import { enableJsonOutput } from '../../utils/json'; -import GitNoCommitClient from '../../vcs/clients/gitNoCommit'; -import NoVcsClient from '../../vcs/clients/noVcs'; +import GitClient from '../../vcs/clients/git'; /** * This command will be run on the EAS Build workers, when building @@ -64,10 +63,16 @@ export default class BuildInternal extends EasCommand { vcsClient, } = await this.getContextAsync(BuildInternal, { nonInteractive: true, - vcsClientOverride: process.env.EAS_NO_VCS ? new NoVcsClient() : new GitNoCommitClient(), withServerSideEnvironment: null, }); + if (vcsClient instanceof GitClient) { + // `build:internal` is run on EAS workers and the repo may have been changed + // by pre-install hooks or other scripts. We don't want to require committing changes + // to continue the build. + vcsClient.requireCommit = false; + } + await handleDeprecatedEasJsonAsync(projectDir, flags.nonInteractive); await runBuildAndSubmitAsync({ diff --git a/packages/eas-cli/src/commands/build/run.ts b/packages/eas-cli/src/commands/build/run.ts index 7fa4493815..8050cf67d6 100644 --- a/packages/eas-cli/src/commands/build/run.ts +++ b/packages/eas-cli/src/commands/build/run.ts @@ -1,7 +1,6 @@ import { Errors, Flags } from '@oclif/core'; import assert from 'assert'; import { pathExists } from 'fs-extra'; -import path from 'path'; import { getLatestBuildAsync, listAndSelectBuildOnAppAsync } from '../../build/queries'; import EasCommand from '../../commandUtils/EasCommand'; @@ -17,13 +16,12 @@ import Log from '../../log'; import { appPlatformDisplayNames } from '../../platform'; import { getDisplayNameForProjectIdAsync } from '../../project/projectUtils'; import { promptAsync } from '../../prompts'; -import { RunArchiveFlags, runAsync } from '../../run/run'; +import { RunArchiveFlags, getEasBuildRunCachedAppPath, runAsync } from '../../run/run'; import { isRunnableOnSimulatorOrEmulator } from '../../run/utils'; import { downloadAndMaybeExtractAppAsync, extractAppFromLocalArchiveAsync, } from '../../utils/download'; -import { getEasBuildRunCacheDirectoryPath } from '../../utils/paths'; interface RawRunFlags { latest?: boolean; @@ -245,17 +243,6 @@ async function maybeGetBuildAsync( } } -function getEasBuildRunCachedAppPath( - projectId: string, - buildId: string, - platform: AppPlatform -): string { - return path.join( - getEasBuildRunCacheDirectoryPath(), - `${projectId}_${buildId}.${platform === AppPlatform.Ios ? 'app' : 'apk'}` - ); -} - async function getPathToSimulatorBuildAppAsync( graphqlClient: ExpoGraphqlClient, projectId: string, diff --git a/packages/eas-cli/src/commands/project/onboarding.ts b/packages/eas-cli/src/commands/project/onboarding.ts index 7e854a8659..9d9d65719f 100644 --- a/packages/eas-cli/src/commands/project/onboarding.ts +++ b/packages/eas-cli/src/commands/project/onboarding.ts @@ -162,7 +162,10 @@ export default class Onboarding extends EasCommand { cloneMethod, }); - const vcsClient = new GitClient(finalTargetProjectDirectory); + const vcsClient = new GitClient({ + maybeCwdOverride: finalTargetProjectDirectory, + requireCommit: false, + }); if (!app.githubRepository) { await fs.remove(path.join(finalTargetProjectDirectory, '.git')); await runCommandAsync({ diff --git a/packages/eas-cli/src/commands/submit/internal.ts b/packages/eas-cli/src/commands/submit/internal.ts index 7fae9e333a..17543f81bf 100644 --- a/packages/eas-cli/src/commands/submit/internal.ts +++ b/packages/eas-cli/src/commands/submit/internal.ts @@ -18,8 +18,7 @@ import AndroidSubmitCommand from '../../submit/android/AndroidSubmitCommand'; import { SubmissionContext, createSubmissionContextAsync } from '../../submit/context'; import IosSubmitCommand from '../../submit/ios/IosSubmitCommand'; import { enableJsonOutput, printJsonOnlyOutput } from '../../utils/json'; -import GitNoCommitClient from '../../vcs/clients/gitNoCommit'; -import NoVcsClient from '../../vcs/clients/noVcs'; +import GitClient from '../../vcs/clients/git'; /** * This command will be run on the EAS workers. @@ -65,10 +64,16 @@ export default class SubmitInternal extends EasCommand { vcsClient, } = await this.getContextAsync(SubmitInternal, { nonInteractive: true, - vcsClientOverride: process.env.EAS_NO_VCS ? new NoVcsClient() : new GitNoCommitClient(), withServerSideEnvironment: null, }); + if (vcsClient instanceof GitClient) { + // `build:internal` is run on EAS workers and the repo may have been changed + // by pre-install hooks or other scripts. We don't want to require committing changes + // to continue the build. + vcsClient.requireCommit = false; + } + const submissionProfile = await EasJsonUtils.getSubmitProfileAsync( EasJsonAccessor.fromProjectPath(projectDir), flags.platform, diff --git a/packages/eas-cli/src/commands/update/index.ts b/packages/eas-cli/src/commands/update/index.ts index 581f5ae189..d91788b650 100644 --- a/packages/eas-cli/src/commands/update/index.ts +++ b/packages/eas-cli/src/commands/update/index.ts @@ -237,6 +237,10 @@ export default class UpdatePublish extends EasCommand { jsonFlag, }); + const maybeServerEnv = environment + ? { ...(await getServerSideEnvironmentVariablesAsync()), EXPO_NO_DOTENV: '1' } + : {}; + // build bundle and upload assets for a new publish if (!skipBundler) { const bundleSpinner = ora().start('Exporting...'); @@ -247,11 +251,7 @@ export default class UpdatePublish extends EasCommand { exp, platformFlag: requestedPlatform, clearCache, - extraEnv: { - ...(environment - ? { ...(await getServerSideEnvironmentVariablesAsync()), EXPO_NO_DOTENV: '1' } - : {}), - }, + extraEnv: maybeServerEnv, }); bundleSpinner.succeed('Exported bundle(s)'); } catch (e) { @@ -393,7 +393,7 @@ export default class UpdatePublish extends EasCommand { ...workflows, web: Workflow.UNKNOWN, }, - env: undefined, + env: maybeServerEnv, }); const runtimeToPlatformsAndFingerprintInfoMapping = getRuntimeToPlatformsAndFingerprintInfoMappingFromRuntimeVersionInfoObjects( diff --git a/packages/eas-cli/src/graphql/generated.ts b/packages/eas-cli/src/graphql/generated.ts index 7334f1bbe2..47685d3578 100644 --- a/packages/eas-cli/src/graphql/generated.ts +++ b/packages/eas-cli/src/graphql/generated.ts @@ -8500,6 +8500,7 @@ export type WorkflowRun = ActivityTimelineProjectActivity & { requestedGitRef?: Maybe; retriedWorkflowRun?: Maybe; retries: Array; + sourceExpiresAt?: Maybe; status: WorkflowRunStatus; triggerEventType: WorkflowRunTriggerEventType; updatedAt: Scalars['DateTime']['output']; @@ -9132,7 +9133,7 @@ export type CreateAndroidBuildMutationVariables = Exact<{ }>; -export type CreateAndroidBuildMutation = { __typename?: 'RootMutation', build: { __typename?: 'BuildMutation', createAndroidBuild: { __typename?: 'CreateBuildResult', build: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, expirationDate?: any | null, isForIosSimulator: boolean, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } }, deprecationInfo?: { __typename?: 'EASBuildDeprecationInfo', type: EasBuildDeprecationInfoType, message: string } | null } } }; +export type CreateAndroidBuildMutation = { __typename?: 'RootMutation', build: { __typename?: 'BuildMutation', createAndroidBuild: { __typename?: 'CreateBuildResult', build: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, expirationDate?: any | null, isForIosSimulator: boolean, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string }, metrics?: { __typename?: 'BuildMetrics', buildWaitTime?: number | null, buildQueueTime?: number | null, buildDuration?: number | null } | null }, deprecationInfo?: { __typename?: 'EASBuildDeprecationInfo', type: EasBuildDeprecationInfoType, message: string } | null } } }; export type CreateIosBuildMutationVariables = Exact<{ appId: Scalars['ID']['input']; @@ -9142,7 +9143,7 @@ export type CreateIosBuildMutationVariables = Exact<{ }>; -export type CreateIosBuildMutation = { __typename?: 'RootMutation', build: { __typename?: 'BuildMutation', createIosBuild: { __typename?: 'CreateBuildResult', build: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, expirationDate?: any | null, isForIosSimulator: boolean, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } }, deprecationInfo?: { __typename?: 'EASBuildDeprecationInfo', type: EasBuildDeprecationInfoType, message: string } | null } } }; +export type CreateIosBuildMutation = { __typename?: 'RootMutation', build: { __typename?: 'BuildMutation', createIosBuild: { __typename?: 'CreateBuildResult', build: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, expirationDate?: any | null, isForIosSimulator: boolean, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string }, metrics?: { __typename?: 'BuildMetrics', buildWaitTime?: number | null, buildQueueTime?: number | null, buildDuration?: number | null } | null }, deprecationInfo?: { __typename?: 'EASBuildDeprecationInfo', type: EasBuildDeprecationInfoType, message: string } | null } } }; export type UpdateBuildMetadataMutationVariables = Exact<{ buildId: Scalars['ID']['input']; @@ -9150,7 +9151,7 @@ export type UpdateBuildMetadataMutationVariables = Exact<{ }>; -export type UpdateBuildMetadataMutation = { __typename?: 'RootMutation', build: { __typename?: 'BuildMutation', updateBuildMetadata: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, expirationDate?: any | null, isForIosSimulator: boolean, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } } } }; +export type UpdateBuildMetadataMutation = { __typename?: 'RootMutation', build: { __typename?: 'BuildMutation', updateBuildMetadata: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, expirationDate?: any | null, isForIosSimulator: boolean, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string }, metrics?: { __typename?: 'BuildMetrics', buildWaitTime?: number | null, buildQueueTime?: number | null, buildDuration?: number | null } | null } } }; export type RetryIosBuildMutationVariables = Exact<{ buildId: Scalars['ID']['input']; @@ -9158,7 +9159,7 @@ export type RetryIosBuildMutationVariables = Exact<{ }>; -export type RetryIosBuildMutation = { __typename?: 'RootMutation', build: { __typename?: 'BuildMutation', retryIosBuild: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, expirationDate?: any | null, isForIosSimulator: boolean, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } } } }; +export type RetryIosBuildMutation = { __typename?: 'RootMutation', build: { __typename?: 'BuildMutation', retryIosBuild: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, expirationDate?: any | null, isForIosSimulator: boolean, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string }, metrics?: { __typename?: 'BuildMetrics', buildWaitTime?: number | null, buildQueueTime?: number | null, buildDuration?: number | null } | null } } }; export type CreateEnvironmentSecretForAccountMutationVariables = Exact<{ input: CreateEnvironmentSecretInput; @@ -9447,21 +9448,21 @@ export type BuildsByIdQueryVariables = Exact<{ }>; -export type BuildsByIdQuery = { __typename?: 'RootQuery', builds: { __typename?: 'BuildQuery', byId: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, expirationDate?: any | null, isForIosSimulator: boolean, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } } } }; +export type BuildsByIdQuery = { __typename?: 'RootQuery', builds: { __typename?: 'BuildQuery', byId: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, expirationDate?: any | null, isForIosSimulator: boolean, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string }, metrics?: { __typename?: 'BuildMetrics', buildWaitTime?: number | null, buildQueueTime?: number | null, buildDuration?: number | null } | null } } }; export type BuildsWithSubmissionsByIdQueryVariables = Exact<{ buildId: Scalars['ID']['input']; }>; -export type BuildsWithSubmissionsByIdQuery = { __typename?: 'RootQuery', builds: { __typename?: 'BuildQuery', byId: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, expirationDate?: any | null, isForIosSimulator: boolean, submissions: Array<{ __typename?: 'Submission', id: string, status: SubmissionStatus, platform: AppPlatform, logFiles: Array, app: { __typename?: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } }, androidConfig?: { __typename?: 'AndroidSubmissionConfig', applicationIdentifier?: string | null, track: SubmissionAndroidTrack, releaseStatus?: SubmissionAndroidReleaseStatus | null, rollout?: number | null } | null, iosConfig?: { __typename?: 'IosSubmissionConfig', ascAppIdentifier: string, appleIdUsername?: string | null } | null, error?: { __typename?: 'SubmissionError', errorCode?: string | null, message?: string | null } | null }>, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } } } }; +export type BuildsWithSubmissionsByIdQuery = { __typename?: 'RootQuery', builds: { __typename?: 'BuildQuery', byId: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, expirationDate?: any | null, isForIosSimulator: boolean, submissions: Array<{ __typename?: 'Submission', id: string, status: SubmissionStatus, platform: AppPlatform, logFiles: Array, app: { __typename?: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } }, androidConfig?: { __typename?: 'AndroidSubmissionConfig', applicationIdentifier?: string | null, track: SubmissionAndroidTrack, releaseStatus?: SubmissionAndroidReleaseStatus | null, rollout?: number | null } | null, iosConfig?: { __typename?: 'IosSubmissionConfig', ascAppIdentifier: string, appleIdUsername?: string | null } | null, error?: { __typename?: 'SubmissionError', errorCode?: string | null, message?: string | null } | null }>, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string }, metrics?: { __typename?: 'BuildMetrics', buildWaitTime?: number | null, buildQueueTime?: number | null, buildDuration?: number | null } | null } } }; export type BuildsWithFingerprintByIdQueryVariables = Exact<{ buildId: Scalars['ID']['input']; }>; -export type BuildsWithFingerprintByIdQuery = { __typename?: 'RootQuery', builds: { __typename?: 'BuildQuery', byId: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, expirationDate?: any | null, isForIosSimulator: boolean, fingerprint?: { __typename?: 'Fingerprint', id: string, hash: string, debugInfoUrl?: string | null, builds: { __typename?: 'AppBuildsConnection', edges: Array<{ __typename?: 'AppBuildEdge', node: { __typename?: 'Build', platform: AppPlatform, id: string } }> }, updates: { __typename?: 'AppUpdatesConnection', edges: Array<{ __typename?: 'AppUpdateEdge', node: { __typename?: 'Update', id: string, platform: string } }> } } | null, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } } } }; +export type BuildsWithFingerprintByIdQuery = { __typename?: 'RootQuery', builds: { __typename?: 'BuildQuery', byId: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, expirationDate?: any | null, isForIosSimulator: boolean, fingerprint?: { __typename?: 'Fingerprint', id: string, hash: string, debugInfoUrl?: string | null, builds: { __typename?: 'AppBuildsConnection', edges: Array<{ __typename?: 'AppBuildEdge', node: { __typename?: 'Build', platform: AppPlatform, id: string } }> }, updates: { __typename?: 'AppUpdatesConnection', edges: Array<{ __typename?: 'AppUpdateEdge', node: { __typename?: 'Update', id: string, platform: string } }> } } | null, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string }, metrics?: { __typename?: 'BuildMetrics', buildWaitTime?: number | null, buildQueueTime?: number | null, buildDuration?: number | null } | null } } }; export type ViewBuildsOnAppQueryVariables = Exact<{ appId: Scalars['String']['input']; @@ -9471,7 +9472,7 @@ export type ViewBuildsOnAppQueryVariables = Exact<{ }>; -export type ViewBuildsOnAppQuery = { __typename?: 'RootQuery', app: { __typename?: 'AppQuery', byId: { __typename?: 'App', id: string, builds: Array<{ __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, expirationDate?: any | null, isForIosSimulator: boolean, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } }> } } }; +export type ViewBuildsOnAppQuery = { __typename?: 'RootQuery', app: { __typename?: 'AppQuery', byId: { __typename?: 'App', id: string, builds: Array<{ __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, expirationDate?: any | null, isForIosSimulator: boolean, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string }, metrics?: { __typename?: 'BuildMetrics', buildWaitTime?: number | null, buildQueueTime?: number | null, buildDuration?: number | null } | null }> } } }; export type ViewUpdateChannelOnAppQueryVariables = Exact<{ appId: Scalars['String']['input']; @@ -9679,11 +9680,11 @@ export type AccountFragment = { __typename?: 'Account', id: string, name: string export type AppFragment = { __typename?: 'App', id: string, name: string, fullName: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string, ownerUserActor?: { __typename?: 'SSOUser', id: string, username: string } | { __typename?: 'User', id: string, username: string } | null, users: Array<{ __typename?: 'UserPermission', role: Role, actor: { __typename?: 'Robot', id: string } | { __typename?: 'SSOUser', id: string } | { __typename?: 'User', id: string } }> }, githubRepository?: { __typename?: 'GitHubRepository', id: string, metadata: { __typename?: 'GitHubRepositoryMetadata', githubRepoOwnerName: string, githubRepoName: string } } | null }; -export type BuildFragment = { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, expirationDate?: any | null, isForIosSimulator: boolean, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } }; +export type BuildFragment = { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, expirationDate?: any | null, isForIosSimulator: boolean, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string }, metrics?: { __typename?: 'BuildMetrics', buildWaitTime?: number | null, buildQueueTime?: number | null, buildDuration?: number | null } | null }; -export type BuildWithSubmissionsFragment = { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, expirationDate?: any | null, isForIosSimulator: boolean, submissions: Array<{ __typename?: 'Submission', id: string, status: SubmissionStatus, platform: AppPlatform, logFiles: Array, app: { __typename?: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } }, androidConfig?: { __typename?: 'AndroidSubmissionConfig', applicationIdentifier?: string | null, track: SubmissionAndroidTrack, releaseStatus?: SubmissionAndroidReleaseStatus | null, rollout?: number | null } | null, iosConfig?: { __typename?: 'IosSubmissionConfig', ascAppIdentifier: string, appleIdUsername?: string | null } | null, error?: { __typename?: 'SubmissionError', errorCode?: string | null, message?: string | null } | null }>, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } }; +export type BuildWithSubmissionsFragment = { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, expirationDate?: any | null, isForIosSimulator: boolean, submissions: Array<{ __typename?: 'Submission', id: string, status: SubmissionStatus, platform: AppPlatform, logFiles: Array, app: { __typename?: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } }, androidConfig?: { __typename?: 'AndroidSubmissionConfig', applicationIdentifier?: string | null, track: SubmissionAndroidTrack, releaseStatus?: SubmissionAndroidReleaseStatus | null, rollout?: number | null } | null, iosConfig?: { __typename?: 'IosSubmissionConfig', ascAppIdentifier: string, appleIdUsername?: string | null } | null, error?: { __typename?: 'SubmissionError', errorCode?: string | null, message?: string | null } | null }>, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string }, metrics?: { __typename?: 'BuildMetrics', buildWaitTime?: number | null, buildQueueTime?: number | null, buildDuration?: number | null } | null }; -export type BuildWithFingerprintFragment = { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, expirationDate?: any | null, isForIosSimulator: boolean, fingerprint?: { __typename?: 'Fingerprint', id: string, hash: string, debugInfoUrl?: string | null, builds: { __typename?: 'AppBuildsConnection', edges: Array<{ __typename?: 'AppBuildEdge', node: { __typename?: 'Build', platform: AppPlatform, id: string } }> }, updates: { __typename?: 'AppUpdatesConnection', edges: Array<{ __typename?: 'AppUpdateEdge', node: { __typename?: 'Update', id: string, platform: string } }> } } | null, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } }; +export type BuildWithFingerprintFragment = { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, expirationDate?: any | null, isForIosSimulator: boolean, fingerprint?: { __typename?: 'Fingerprint', id: string, hash: string, debugInfoUrl?: string | null, builds: { __typename?: 'AppBuildsConnection', edges: Array<{ __typename?: 'AppBuildEdge', node: { __typename?: 'Build', platform: AppPlatform, id: string } }> }, updates: { __typename?: 'AppUpdatesConnection', edges: Array<{ __typename?: 'AppUpdateEdge', node: { __typename?: 'Update', id: string, platform: string } }> } } | null, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string }, metrics?: { __typename?: 'BuildMetrics', buildWaitTime?: number | null, buildQueueTime?: number | null, buildDuration?: number | null } | null }; export type EnvironmentSecretFragment = { __typename?: 'EnvironmentSecret', id: string, name: string, type: EnvironmentSecretType, createdAt: any }; diff --git a/packages/eas-cli/src/graphql/types/Build.ts b/packages/eas-cli/src/graphql/types/Build.ts index abf3779974..2afafeb062 100644 --- a/packages/eas-cli/src/graphql/types/Build.ts +++ b/packages/eas-cli/src/graphql/types/Build.ts @@ -57,6 +57,11 @@ export const BuildFragmentNode = gql` completedAt expirationDate isForIosSimulator + metrics { + buildWaitTime + buildQueueTime + buildDuration + } } `; diff --git a/packages/eas-cli/src/run/run.ts b/packages/eas-cli/src/run/run.ts index 938df9548c..cbb9276df5 100644 --- a/packages/eas-cli/src/run/run.ts +++ b/packages/eas-cli/src/run/run.ts @@ -1,6 +1,9 @@ +import path from 'path'; + import { runAppOnAndroidEmulatorAsync } from './android/run'; import { runAppOnIosSimulatorAsync } from './ios/run'; import { AppPlatform } from '../graphql/generated'; +import { getEasBuildRunCacheDirectoryPath } from '../utils/paths'; export interface RunArchiveFlags { latest?: boolean; @@ -19,3 +22,14 @@ export async function runAsync( await runAppOnAndroidEmulatorAsync(simulatorBuildPath); } } + +export function getEasBuildRunCachedAppPath( + projectId: string, + buildId: string, + platform: AppPlatform +): string { + return path.join( + getEasBuildRunCacheDirectoryPath(), + `${projectId}_${buildId}.${platform === AppPlatform.Ios ? 'app' : 'apk'}` + ); +} diff --git a/packages/eas-cli/src/vcs/clients/git.ts b/packages/eas-cli/src/vcs/clients/git.ts index 0521386f27..e52bbc6d0d 100644 --- a/packages/eas-cli/src/vcs/clients/git.ts +++ b/packages/eas-cli/src/vcs/clients/git.ts @@ -2,6 +2,7 @@ import * as PackageManagerUtils from '@expo/package-manager'; import spawnAsync from '@expo/spawn-async'; import { Errors } from '@oclif/core'; import chalk from 'chalk'; +import fs from 'fs-extra'; import path from 'path'; import Log, { learnMore } from '../../log'; @@ -14,11 +15,17 @@ import { gitStatusAsync, isGitInstalledAsync, } from '../git'; +import { EASIGNORE_FILENAME, Ignore, makeShallowCopyAsync } from '../local'; import { Client } from '../vcs'; export default class GitClient extends Client { - constructor(private readonly maybeCwdOverride?: string) { + private readonly maybeCwdOverride?: string; + public requireCommit: boolean; + + constructor(options: { maybeCwdOverride?: string; requireCommit: boolean }) { super(); + this.maybeCwdOverride = options.maybeCwdOverride; + this.requireCommit = options.requireCommit; } public override async ensureRepoExistsAsync(): Promise { @@ -119,10 +126,6 @@ export default class GitClient extends Client { } } - public override async isCommitRequiredAsync(): Promise { - return await this.hasUncommittedChangesAsync(); - } - public override async showChangedFilesAsync(): Promise { const gitStatusOutput = await gitStatusAsync({ showUntracked: true, @@ -144,50 +147,80 @@ export default class GitClient extends Client { ).stdout.trim(); } + public override async isCommitRequiredAsync(): Promise { + if (!this.requireCommit) { + return false; + } + + return await this.hasUncommittedChangesAsync(); + } + public async makeShallowCopyAsync(destinationPath: string): Promise { - if (await this.hasUncommittedChangesAsync()) { + if (await this.isCommitRequiredAsync()) { // it should already be checked before this function is called, but in case it wasn't // we want to ensure that any changes were introduced by call to `setGitCaseSensitivityAsync` throw new Error('You have some uncommitted changes in your repository.'); } + + const rootPath = await this.getRootPathAsync(); + let gitRepoUri; if (process.platform === 'win32') { // getRootDirectoryAsync() will return C:/path/to/repo on Windows and path // prefix should be file:/// - gitRepoUri = `file:///${await this.getRootPathAsync()}`; + gitRepoUri = `file:///${rootPath}`; } else { // getRootDirectoryAsync() will /path/to/repo, and path prefix should be // file:/// so only file:// needs to be prepended - gitRepoUri = `file://${await this.getRootPathAsync()}`; + gitRepoUri = `file://${rootPath}`; } - const isCaseSensitive = await isGitCaseSensitiveAsync(this.maybeCwdOverride); - await setGitCaseSensitivityAsync(true, this.maybeCwdOverride); + + await assertEnablingGitCaseSensitivityDoesNotCauseNewUncommittedChangesAsync(rootPath); + + const isCaseSensitive = await isGitCaseSensitiveAsync(rootPath); try { - if (await this.hasUncommittedChangesAsync()) { - Log.error('Detected inconsistent filename casing between your local filesystem and git.'); - Log.error('This will likely cause your build to fail. Impacted files:'); - await spawnAsync('git', ['status', '--short'], { - stdio: 'inherit', - cwd: this.maybeCwdOverride, - }); - Log.newLine(); - Log.error( - `Error: Resolve filename casing inconsistencies before proceeding. ${learnMore( - 'https://expo.fyi/macos-ignorecase' - )}` - ); - throw new Error('You have some uncommitted changes in your repository.'); - } + await setGitCaseSensitivityAsync(true, rootPath); await spawnAsync( 'git', ['clone', '--no-hardlinks', '--depth', '1', gitRepoUri, destinationPath], - { - cwd: this.maybeCwdOverride, - } + { cwd: rootPath } ); + + const sourceEasignorePath = path.join(rootPath, EASIGNORE_FILENAME); + if (await fs.exists(sourceEasignorePath)) { + const cachedFilesWeShouldHaveIgnored = ( + await spawnAsync( + 'git', + [ + 'ls-files', + '--exclude-from', + sourceEasignorePath, + // `--ignored --cached` makes git print files that should be + // ignored by rules from `--exclude-from`, but instead are currently cached. + '--ignored', + '--cached', + // separates file names with null characters + '-z', + ], + { cwd: destinationPath } + ) + ).stdout + .split('\0') + // ls-files' output is terminated by a null character + .filter(file => file !== ''); + + await Promise.all( + cachedFilesWeShouldHaveIgnored.map(file => fs.rm(path.join(destinationPath, file))) + ); + } } finally { - await setGitCaseSensitivityAsync(isCaseSensitive, this.maybeCwdOverride); + await setGitCaseSensitivityAsync(isCaseSensitive, rootPath); } + + // After we create the shallow Git copy, we copy the files + // again. This way we include the changed and untracked files + // (`git clone` only copies the committed changes). + await makeShallowCopyAsync(rootPath, destinationPath); } public override async getCommitHashAsync(): Promise { @@ -252,10 +285,24 @@ export default class GitClient extends Client { } public override async isFileIgnoredAsync(filePath: string): Promise { + const rootPath = await this.getRootPathAsync(); + const easIgnorePath = path.join(rootPath, EASIGNORE_FILENAME); + if (await fs.exists(easIgnorePath)) { + const ignore = new Ignore(rootPath); + const wouldNotBeCopiedToClone = ignore.ignores(filePath); + const wouldBeDeletedFromClone = + ( + await spawnAsync( + 'git', + ['ls-files', '--exclude-from', easIgnorePath, '--ignored', '--cached', filePath], + { cwd: rootPath } + ) + ).stdout.trim() !== ''; + return wouldNotBeCopiedToClone && wouldBeDeletedFromClone; + } + try { - await spawnAsync('git', ['check-ignore', '-q', filePath], { - cwd: this.maybeCwdOverride ?? path.normalize(await this.getRootPathAsync()), - }); + await spawnAsync('git', ['check-ignore', '-q', filePath], { cwd: rootPath }); return true; } catch { return false; @@ -386,3 +433,51 @@ async function setGitCaseSensitivityAsync( }); } } + +async function assertEnablingGitCaseSensitivityDoesNotCauseNewUncommittedChangesAsync( + cwd: string +): Promise { + // Remember uncommited changes before case sensitivity change + // for later comparison so we log to the user only the files + // that were marked as changed after the case sensitivity change. + const uncommittedChangesBeforeCaseSensitivityChange = await gitStatusAsync({ + showUntracked: true, + cwd, + }); + + const isCaseSensitive = await isGitCaseSensitiveAsync(cwd); + await setGitCaseSensitivityAsync(true, cwd); + try { + const uncommitedChangesAfterCaseSensitivityChange = await gitStatusAsync({ + showUntracked: true, + cwd, + }); + + if ( + uncommitedChangesAfterCaseSensitivityChange !== uncommittedChangesBeforeCaseSensitivityChange + ) { + const baseUncommitedChangesSet = new Set( + uncommittedChangesBeforeCaseSensitivityChange.split('\n') + ); + + const errorMessage = [ + 'Detected inconsistent filename casing between your local filesystem and git.', + 'This will likely cause your job to fail. Impacted files:', + ...uncommitedChangesAfterCaseSensitivityChange.split('\n').flatMap(changedFile => { + // This file was changed before the case sensitivity change too. + if (baseUncommitedChangesSet.has(changedFile)) { + return []; + } + return [changedFile]; + }), + `Resolve filename casing inconsistencies before proceeding. ${learnMore( + 'https://expo.fyi/macos-ignorecase' + )}`, + ]; + + throw new Error(errorMessage.join('\n')); + } + } finally { + await setGitCaseSensitivityAsync(isCaseSensitive, cwd); + } +} diff --git a/packages/eas-cli/src/vcs/clients/gitNoCommit.ts b/packages/eas-cli/src/vcs/clients/gitNoCommit.ts deleted file mode 100644 index 7b761fd8d9..0000000000 --- a/packages/eas-cli/src/vcs/clients/gitNoCommit.ts +++ /dev/null @@ -1,45 +0,0 @@ -import spawnAsync from '@expo/spawn-async'; -import chalk from 'chalk'; -import path from 'path'; - -import GitClient from './git'; -import Log from '../../log'; -import { Ignore, makeShallowCopyAsync } from '../local'; - -export default class GitNoCommitClient extends GitClient { - public override async isCommitRequiredAsync(): Promise { - return false; - } - - public override async getRootPathAsync(): Promise { - return (await spawnAsync('git', ['rev-parse', '--show-toplevel'])).stdout.trim(); - } - - public override async makeShallowCopyAsync(destinationPath: string): Promise { - // normalize converts C:/some/path to C:\some\path on windows - const srcPath = path.normalize(await this.getRootPathAsync()); - await makeShallowCopyAsync(srcPath, destinationPath); - } - - public override async isFileIgnoredAsync(filePath: string): Promise { - // normalize converts C:/some/path to C:\some\path on windows - const rootPath = path.normalize(await this.getRootPathAsync()); - const ignore = new Ignore(rootPath); - await ignore.initIgnoreAsync(); - return ignore.ignores(filePath); - } - - public override async trackFileAsync(file: string): Promise { - try { - await super.trackFileAsync(file); - } catch { - // In the no commit workflow it doesn't matter if we fail to track changes, - // so we can ignore if this throws an exception - Log.warn( - `Unable to track ${chalk.bold(path.basename(file))} in Git. Proceeding without tracking.` - ); - Log.warn(` Reason: the command ${chalk.bold(`"git add ${file}"`)} exited with an error.`); - Log.newLine(); - } - } -} diff --git a/packages/eas-cli/src/vcs/index.ts b/packages/eas-cli/src/vcs/index.ts index 82a2526b24..e81b662bc8 100644 --- a/packages/eas-cli/src/vcs/index.ts +++ b/packages/eas-cli/src/vcs/index.ts @@ -1,25 +1,26 @@ import chalk from 'chalk'; import GitClient from './clients/git'; -import GitNoCommitClient from './clients/gitNoCommit'; import NoVcsClient from './clients/noVcs'; import { Client } from './vcs'; const NO_VCS_WARNING = `Using EAS CLI without version control system is not recommended, use this mode only if you know what you are doing.`; +let wasNoVcsWarningPrinted = false; + export function resolveVcsClient(requireCommit: boolean = false): Client { if (process.env.EAS_NO_VCS) { if (process.env.NODE_ENV !== 'test') { - // This log might be printed before cli arguments are evaluated, - // so it needs to go to stderr in case command is run in JSON - // only mode. - // eslint-disable-next-line no-console - console.error(chalk.yellow(NO_VCS_WARNING)); + if (!wasNoVcsWarningPrinted) { + // This log might be printed before cli arguments are evaluated, + // so it needs to go to stderr in case command is run in JSON + // only mode. + // eslint-disable-next-line no-console + console.error(chalk.yellow(NO_VCS_WARNING)); + wasNoVcsWarningPrinted = true; + } } return new NoVcsClient(); } - if (requireCommit) { - return new GitClient(); - } - return new GitNoCommitClient(); + return new GitClient({ requireCommit }); } diff --git a/packages/eas-cli/src/vcs/local.ts b/packages/eas-cli/src/vcs/local.ts index 0100d94561..ea424fb293 100644 --- a/packages/eas-cli/src/vcs/local.ts +++ b/packages/eas-cli/src/vcs/local.ts @@ -3,7 +3,7 @@ import fs from 'fs-extra'; import createIgnore, { Ignore as SingleFileIgnore } from 'ignore'; import path from 'path'; -const EASIGNORE_FILENAME = '.easignore'; +export const EASIGNORE_FILENAME = '.easignore'; const GITIGNORE_FILENAME = '.gitignore'; const DEFAULT_IGNORE = ` diff --git a/packages/eas-json/package.json b/packages/eas-json/package.json index 0d5e3aa1fb..fae2b1feec 100644 --- a/packages/eas-json/package.json +++ b/packages/eas-json/package.json @@ -1,7 +1,7 @@ { "name": "@expo/eas-json", "description": "A library for interacting with eas.json", - "version": "14.5.0", + "version": "15.0.0", "author": "Expo ", "bugs": "https://github.com/expo/eas-cli/issues", "dependencies": {