Compare commits

..
7 Commits
Author SHA1 Message Date
Dominik Sokal feca0dc721 v1.1.0 2022-08-23 10:02:07 +02:00
Will Schurman 81831d156d [eas-cli] Prevent throwing dynamic app config write error when configuring project id (#1301) 2022-08-22 17:08:23 -07:00
Jon Samp 55c859cea7 [eas-cli] Removes "please" from output (#1250)
* Removes "please" from output

* updates changelog

* incorporate feedback from kim
2022-08-22 13:18:57 -04:00
Bartosz Kaszubowski 613748b2f0 [cli] remove unused dependencies (#1297) 2022-08-22 11:37:24 +02:00
Bartosz Kaszubowski bbd4bca83d [cli] correct Changelog (#1295) 2022-08-22 10:11:38 +02:00
Bartosz KaszubowskiandDominik Sokal 007866f278 [cli] Credentials: support platform flag (#1277)
Co-authored-by: Dominik Sokal <[email protected]>
2022-08-22 10:03:53 +02:00
Expo CI 1d2e9818ed update CHANGELOG.md 2022-08-22 08:02:35 +00:00
44 changed files with 237 additions and 231 deletions

No files matched your search

+17
View File
@@ -6,6 +6,22 @@ This is the log of notable changes to EAS CLI and related packages.
### 🛠 Breaking changes
### 🎉 New features
- Add support for passing platform flag to `credentials` command. ([#1277](https://github.com/expo/eas-cli/pull/1277) by [@Simek](https://github.com/Simek))
### 🐛 Bug fixes
- Prevent throwing dynamic app config write error when configuring project ID. ([#1301](https://github.com/expo/eas-cli/pull/1301) by [@wschurman](https://github.com/wschurman))
### 🧹 Chores
- Remove unused dependency and devDependency from the CLI. ([#1297](https://github.com/expo/eas-cli/pull/1297) by [@Simek](https://github.com/Simek))
## [1.0.0](https://github.com/expo/eas-cli/releases/tag/v1.0.0) - 2022-08-22
### 🛠 Breaking changes
- Remove timeout when waiting for build / submission. ([#1289](https://github.com/expo/eas-cli/pull/1289) by [@dsokal](https://github.com/dsokal))
### 🎉 New features
@@ -22,6 +38,7 @@ This is the log of notable changes to EAS CLI and related packages.
### 🧹 Chores
- Remove unused install script. ([#1280](https://github.com/expo/eas-cli/pull/1280), [#1281](https://github.com/expo/eas-cli/pull/1281) by [@wkozyra95](https://github.com/wkozyra95))
- Remove "please" from output ([#1250](https://github.com/expo/eas-cli/pull/1250) by [@jonsamp](https://github.com/jonsamp))
## [0.60.0](https://github.com/expo/eas-cli/releases/tag/v0.60.0) - 2022-08-12
+1 -1
View File
@@ -1,5 +1,5 @@
{
"npmClient": "yarn",
"useWorkspaces": true,
"version": "1.0.0"
"version": "1.1.0"
}
+50 -47
View File
@@ -102,7 +102,7 @@ ALIASES
$ eas login
```
_See code: [src/commands/account/login.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/account/login.ts)_
_See code: [src/commands/account/login.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/account/login.ts)_
## `eas account:logout`
@@ -119,7 +119,7 @@ ALIASES
$ eas logout
```
_See code: [src/commands/account/logout.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/account/logout.ts)_
_See code: [src/commands/account/logout.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/account/logout.ts)_
## `eas account:view`
@@ -136,7 +136,7 @@ ALIASES
$ eas whoami
```
_See code: [src/commands/account/view.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/account/view.ts)_
_See code: [src/commands/account/view.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/account/view.ts)_
## `eas analytics [STATUS]`
@@ -150,7 +150,7 @@ DESCRIPTION
display or change analytics settings
```
_See code: [src/commands/analytics.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/analytics.ts)_
_See code: [src/commands/analytics.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/analytics.ts)_
## `eas autocomplete [SHELL]`
@@ -199,7 +199,7 @@ DESCRIPTION
create a branch
```
_See code: [src/commands/branch/create.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/branch/create.ts)_
_See code: [src/commands/branch/create.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/branch/create.ts)_
## `eas branch:delete [NAME]`
@@ -219,7 +219,7 @@ DESCRIPTION
delete a branch
```
_See code: [src/commands/branch/delete.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/branch/delete.ts)_
_See code: [src/commands/branch/delete.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/branch/delete.ts)_
## `eas branch:list`
@@ -240,7 +240,7 @@ DESCRIPTION
list all branches
```
_See code: [src/commands/branch/list.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/branch/list.ts)_
_See code: [src/commands/branch/list.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/branch/list.ts)_
## `eas branch:rename`
@@ -259,7 +259,7 @@ DESCRIPTION
rename a branch
```
_See code: [src/commands/branch/rename.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/branch/rename.ts)_
_See code: [src/commands/branch/rename.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/branch/rename.ts)_
## `eas branch:view [NAME]`
@@ -283,7 +283,7 @@ DESCRIPTION
view a branch
```
_See code: [src/commands/branch/view.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/branch/view.ts)_
_See code: [src/commands/branch/view.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/branch/view.ts)_
## `eas build`
@@ -313,7 +313,7 @@ DESCRIPTION
start a build
```
_See code: [src/commands/build/index.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/build/index.ts)_
_See code: [src/commands/build/index.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/build/index.ts)_
## `eas build:cancel [BUILD_ID]`
@@ -327,7 +327,7 @@ DESCRIPTION
cancel a build
```
_See code: [src/commands/build/cancel.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/build/cancel.ts)_
_See code: [src/commands/build/cancel.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/build/cancel.ts)_
## `eas build:configure`
@@ -344,7 +344,7 @@ DESCRIPTION
configure the project to support EAS Build
```
_See code: [src/commands/build/configure.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/build/configure.ts)_
_See code: [src/commands/build/configure.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/build/configure.ts)_
## `eas build:inspect`
@@ -379,7 +379,7 @@ DESCRIPTION
inspect the state of the project at specific build stages, useful for troubleshooting
```
_See code: [src/commands/build/inspect.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/build/inspect.ts)_
_See code: [src/commands/build/inspect.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/build/inspect.ts)_
## `eas build:list`
@@ -412,7 +412,7 @@ DESCRIPTION
list all builds for your project
```
_See code: [src/commands/build/list.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/build/list.ts)_
_See code: [src/commands/build/list.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/build/list.ts)_
## `eas build:submit`
@@ -459,7 +459,7 @@ DESCRIPTION
Update version of an app.
```
_See code: [src/commands/build/version/set.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/build/version/set.ts)_
_See code: [src/commands/build/version/set.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/build/version/set.ts)_
## `eas build:version:sync`
@@ -478,7 +478,7 @@ DESCRIPTION
Update a version in native code with a value stored on EAS servers
```
_See code: [src/commands/build/version/sync.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/build/version/sync.ts)_
_See code: [src/commands/build/version/sync.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/build/version/sync.ts)_
## `eas build:view [BUILD_ID]`
@@ -495,7 +495,7 @@ DESCRIPTION
view a build for your project
```
_See code: [src/commands/build/view.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/build/view.ts)_
_See code: [src/commands/build/view.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/build/view.ts)_
## `eas channel:create [NAME]`
@@ -515,7 +515,7 @@ DESCRIPTION
create a channel
```
_See code: [src/commands/channel/create.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/channel/create.ts)_
_See code: [src/commands/channel/create.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/channel/create.ts)_
## `eas channel:edit [NAME]`
@@ -536,7 +536,7 @@ DESCRIPTION
point a channel at a new branch
```
_See code: [src/commands/channel/edit.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/channel/edit.ts)_
_See code: [src/commands/channel/edit.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/channel/edit.ts)_
## `eas channel:list`
@@ -553,7 +553,7 @@ DESCRIPTION
list all channels
```
_See code: [src/commands/channel/list.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/channel/list.ts)_
_See code: [src/commands/channel/list.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/channel/list.ts)_
## `eas channel:view [NAME]`
@@ -573,7 +573,7 @@ DESCRIPTION
view a channel
```
_See code: [src/commands/channel/view.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/channel/view.ts)_
_See code: [src/commands/channel/view.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/channel/view.ts)_
## `eas config`
@@ -591,7 +591,7 @@ DESCRIPTION
display project configuration (app.json + eas.json)
```
_See code: [src/commands/config.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/config.ts)_
_See code: [src/commands/config.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/config.ts)_
## `eas credentials`
@@ -599,13 +599,16 @@ manage credentials
```
USAGE
$ eas credentials
$ eas credentials [-p android|ios]
FLAGS
-p, --platform=(android|ios)
DESCRIPTION
manage credentials
```
_See code: [src/commands/credentials.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/credentials.ts)_
_See code: [src/commands/credentials.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/credentials.ts)_
## `eas device:create`
@@ -619,7 +622,7 @@ DESCRIPTION
register new Apple Devices to use for internal distribution
```
_See code: [src/commands/device/create.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/device/create.ts)_
_See code: [src/commands/device/create.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/device/create.ts)_
## `eas device:delete`
@@ -637,7 +640,7 @@ DESCRIPTION
remove a registered device from your account
```
_See code: [src/commands/device/delete.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/device/delete.ts)_
_See code: [src/commands/device/delete.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/device/delete.ts)_
## `eas device:list`
@@ -654,7 +657,7 @@ DESCRIPTION
list all registered devices for your account
```
_See code: [src/commands/device/list.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/device/list.ts)_
_See code: [src/commands/device/list.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/device/list.ts)_
## `eas device:view [UDID]`
@@ -668,7 +671,7 @@ DESCRIPTION
view a device for your project
```
_See code: [src/commands/device/view.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/device/view.ts)_
_See code: [src/commands/device/view.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/device/view.ts)_
## `eas diagnostics`
@@ -682,7 +685,7 @@ DESCRIPTION
display environment info
```
_See code: [src/commands/diagnostics.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/diagnostics.ts)_
_See code: [src/commands/diagnostics.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/diagnostics.ts)_
## `eas help [COMMAND]`
@@ -764,7 +767,7 @@ DESCRIPTION
generate the local store configuration from the app stores
```
_See code: [src/commands/metadata/pull.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/metadata/pull.ts)_
_See code: [src/commands/metadata/pull.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/metadata/pull.ts)_
## `eas metadata:push`
@@ -781,7 +784,7 @@ DESCRIPTION
sync the local store configuration to the app stores
```
_See code: [src/commands/metadata/push.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/metadata/push.ts)_
_See code: [src/commands/metadata/push.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/metadata/push.ts)_
## `eas project:info`
@@ -795,7 +798,7 @@ DESCRIPTION
information about the current project
```
_See code: [src/commands/project/info.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/project/info.ts)_
_See code: [src/commands/project/info.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/project/info.ts)_
## `eas project:init`
@@ -812,7 +815,7 @@ ALIASES
$ eas init
```
_See code: [src/commands/project/init.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/project/init.ts)_
_See code: [src/commands/project/init.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/project/init.ts)_
## `eas secret:create`
@@ -832,7 +835,7 @@ DESCRIPTION
create an environment secret on the current project or owner account
```
_See code: [src/commands/secret/create.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/secret/create.ts)_
_See code: [src/commands/secret/create.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/secret/create.ts)_
## `eas secret:delete`
@@ -849,7 +852,7 @@ DESCRIPTION
delete an environment secret by ID
```
_See code: [src/commands/secret/delete.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/secret/delete.ts)_
_See code: [src/commands/secret/delete.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/secret/delete.ts)_
## `eas secret:list`
@@ -863,7 +866,7 @@ DESCRIPTION
list environment secrets available for your current app
```
_See code: [src/commands/secret/list.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/secret/list.ts)_
_See code: [src/commands/secret/list.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/secret/list.ts)_
## `eas submit`
@@ -893,7 +896,7 @@ ALIASES
$ eas build:submit
```
_See code: [src/commands/submit.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/submit.ts)_
_See code: [src/commands/submit.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/submit.ts)_
## `eas update`
@@ -923,7 +926,7 @@ DESCRIPTION
publish an update group
```
_See code: [src/commands/update/index.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/update/index.ts)_
_See code: [src/commands/update/index.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/update/index.ts)_
## `eas update:configure`
@@ -940,7 +943,7 @@ DESCRIPTION
configure the project to support EAS Update
```
_See code: [src/commands/update/configure.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/update/configure.ts)_
_See code: [src/commands/update/configure.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/update/configure.ts)_
## `eas update:delete GROUPID`
@@ -960,7 +963,7 @@ DESCRIPTION
delete all the updates in an update group
```
_See code: [src/commands/update/delete.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/update/delete.ts)_
_See code: [src/commands/update/delete.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/update/delete.ts)_
## `eas update:list`
@@ -979,7 +982,7 @@ DESCRIPTION
view the recent updates for a branch
```
_See code: [src/commands/update/list.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/update/list.ts)_
_See code: [src/commands/update/list.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/update/list.ts)_
## `eas update:view GROUPID`
@@ -999,7 +1002,7 @@ DESCRIPTION
update group details
```
_See code: [src/commands/update/view.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/update/view.ts)_
_See code: [src/commands/update/view.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/update/view.ts)_
## `eas webhook:create`
@@ -1019,7 +1022,7 @@ DESCRIPTION
create a webhook
```
_See code: [src/commands/webhook/create.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/webhook/create.ts)_
_See code: [src/commands/webhook/create.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/webhook/create.ts)_
## `eas webhook:delete [ID]`
@@ -1036,7 +1039,7 @@ DESCRIPTION
delete a webhook
```
_See code: [src/commands/webhook/delete.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/webhook/delete.ts)_
_See code: [src/commands/webhook/delete.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/webhook/delete.ts)_
## `eas webhook:list`
@@ -1053,7 +1056,7 @@ DESCRIPTION
list webhooks
```
_See code: [src/commands/webhook/list.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/webhook/list.ts)_
_See code: [src/commands/webhook/list.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/webhook/list.ts)_
## `eas webhook:update`
@@ -1074,7 +1077,7 @@ DESCRIPTION
update a webhook
```
_See code: [src/commands/webhook/update.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/webhook/update.ts)_
_See code: [src/commands/webhook/update.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/webhook/update.ts)_
## `eas webhook:view ID`
@@ -1091,7 +1094,7 @@ DESCRIPTION
view a webhook
```
_See code: [src/commands/webhook/view.ts](https://github.com/expo/eas-cli/blob/v1.0.0/packages/eas-cli/src/commands/webhook/view.ts)_
_See code: [src/commands/webhook/view.ts](https://github.com/expo/eas-cli/blob/v1.1.0/packages/eas-cli/src/commands/webhook/view.ts)_
## `eas whoami`
+1 -4
View File
@@ -1,7 +1,7 @@
{
"name": "eas-cli",
"description": "EAS command line tool",
"version": "1.0.0",
"version": "1.1.0",
"author": "Expo <[email protected]>",
"bin": {
"eas": "./bin/run"
@@ -69,7 +69,6 @@
"resolve-from": "5.0.0",
"semver": "7.3.7",
"slash": "3.0.0",
"strip-ansi": "6.0.0",
"tar": "6.1.11",
"terminal-link": "2.1.1",
"tslib": "2.4.0",
@@ -100,12 +99,10 @@
"@types/wrap-ansi": "3.0.0",
"axios": "0.27.2",
"eslint-plugin-graphql": "4.0.0",
"form-data": "4.0.0",
"memfs": "3.4.7",
"mockdate": "3.0.5",
"nock": "13.2.9",
"rimraf": "3.0.2",
"tempy": "0.7.0",
"ts-deepmerge": "2.0.5",
"ts-mockito": "2.6.1",
"ts-node": "10.9.1",
+1 -1
View File
@@ -47,7 +47,7 @@ This means that it will most likely produce an AAB and you will not be able to i
Log.newLine();
const confirmed = await toggleConfirmAsync({ message: 'Would you like to proceed?' });
if (!confirmed) {
Log.error('Please update eas.json and come back again.');
Log.error('Update eas.json and come back again.');
process.exit(1);
}
}
+4 -4
View File
@@ -134,18 +134,18 @@ export async function prepareBuildRequestForPlatformAsync<
function handleBuildRequestError(error: any, platform: Platform): never {
if (error?.graphQLErrors?.[0]?.extensions?.errorCode === 'TURTLE_DEPRECATED_JOB_FORMAT') {
Log.error('EAS Build API has changed, please upgrade to the latest eas-cli version.');
Log.error('EAS Build API has changed. Upgrade to the latest eas-cli version.');
throw new Error('Build request failed.');
} else if (
error?.graphQLErrors?.[0]?.extensions?.errorCode === 'EAS_BUILD_DOWN_FOR_MAINTENANCE'
) {
Log.error(
'EAS Build is down for maintenance, please try again later. Check https://status.expo.dev/ for updates.'
'EAS Build is down for maintenance. Try again later. Check https://status.expo.dev/ for updates.'
);
throw new Error('Build request failed.');
} else if (error?.graphQLErrors?.[0]?.extensions?.errorCode === 'EAS_BUILD_FREE_TIER_DISABLED') {
Log.error(
'EAS Build free tier is temporarily disabled, please try again later. Check https://status.expo.dev/ for updates.'
'EAS Build free tier is temporarily disabled. Try again later. Check https://status.expo.dev/ for updates.'
);
throw new Error('Build request failed.');
} else if (
@@ -157,7 +157,7 @@ function handleBuildRequestError(error: any, platform: Platform): never {
throw new Error('Build request failed.');
} else if (error?.graphQLErrors) {
Log.error(
'Build request failed. Make sure you are using the latest eas-cli version. If the problem persists, please report the issue.'
'Build request failed. Make sure you are using the latest eas-cli version. If the problem persists, report the issue.'
);
}
throw error;
@@ -94,14 +94,14 @@ export function printDeprecationWarnings(deprecationInfo?: EasBuildDeprecationIn
return;
}
if (deprecationInfo.type === EasBuildDeprecationInfoType.Internal) {
Log.warn('This command is using API that soon will be deprecated, please update eas-cli.');
Log.warn('This command is using API that soon will be deprecated. Upgrade EAS CLI.');
Log.warn("Changes won't affect your project config.");
Log.warn(deprecationInfo.message);
} else if (deprecationInfo.type === EasBuildDeprecationInfoType.UserFacing) {
Log.warn('This command is using API that soon will be deprecated.');
Log.warn(deprecationInfo.message);
} else {
Log.warn('An unexpected warning was encountered. Please report it as a bug:');
Log.warn('An unexpected warning was encountered. Report it as a bug:');
Log.warn(deprecationInfo);
}
}
@@ -28,7 +28,7 @@ export async function maybeBailOnRepoStatusAsync(): Promise<void> {
});
if (!answer) {
throw new Error('Please commit all changes. Aborting...');
throw new Error('Commit all changes. Aborting...');
}
}
@@ -39,12 +39,12 @@ export async function ensureRepoIsCleanAsync(nonInteractive = false): Promise<vo
Log.addNewLineIfNone();
Log.warn(`${chalk.bold('Warning!')} Your repository working tree is dirty.`);
Log.log(
`This operation needs to be run on a clean working tree, please ${chalk.bold(
'commit all your changes before proceeding'
`This operation needs to be run on a clean working tree. ${chalk.bold(
'Commit all your changes before proceeding'
)}.`
);
if (nonInteractive) {
throw new Error('Please commit all changes. Aborting...');
throw new Error('Commit all changes. Aborting...');
}
const answer = await confirmAsync({
message: `Commit changes to git?`,
@@ -52,7 +52,7 @@ export async function ensureRepoIsCleanAsync(nonInteractive = false): Promise<vo
if (answer) {
await commitPromptAsync({ commitAllFiles: true });
} else {
throw new Error('Please commit all changes. Aborting...');
throw new Error('Commit all changes. Aborting...');
}
}
@@ -91,7 +91,7 @@ export default class BranchCreate extends EasCommand {
({ name } = await promptAsync({
type: 'text',
name: 'name',
message: 'Please name the branch:',
message: 'Provide a branch name:',
initial:
(await getVcsClient().getBranchNameAsync()) ||
`branch-${Math.random().toString(36).substr(2, 4)}`,
@@ -115,7 +115,7 @@ export default class BranchDelete extends EasCommand {
({ name } = await promptAsync({
type: 'text',
name: 'name',
message: 'Please enter the name of the branch to delete:',
message: 'Provide the name of the branch to delete:',
validate: value => (value ? true : validationMessage),
}));
}
@@ -90,7 +90,7 @@ export default class BranchRename extends EasCommand {
({ currentName } = await promptAsync({
type: 'text',
name: 'currentName',
message: 'Please enter the current name of the branch to rename:',
message: "Provide the name of the branch you'd like to rename:",
validate: value => (value ? true : validationMessage),
}));
}
@@ -103,7 +103,7 @@ export default class BranchRename extends EasCommand {
({ newName } = await promptAsync({
type: 'text',
name: 'newName',
message: `Please rename ${currentName}`,
message: `Rename ${currentName}`,
validate: value => (value ? true : validationMessage),
}));
}
@@ -99,7 +99,7 @@ export default class ChannelCreate extends EasCommand {
({ name: channelName } = await promptAsync({
type: 'text',
name: 'name',
message: 'Please name the channel:',
message: 'Provide a channel name:',
validate: value => (value ? true : validationMessage),
}));
}
@@ -70,7 +70,7 @@ export default class ChannelDelete extends EasCommand {
await promptAsync({
type: 'text',
name: 'name',
message: 'Please enter the name of the channel to delete:',
message: 'Provide the name of the channel to delete:',
validate: (value: any) => (value ? true : 'Channel name may not be empty.'),
})
).name;
@@ -127,9 +127,7 @@ export default class ChannelEdit extends EasCommand {
const existingChannel = await getChannelByNameForAppAsync({ appId: projectId, channelName });
if (existingChannel.updateBranches.length > 1) {
throw new Error(
'There is a rollout in progress. Please manage it with "channel:rollout" instead.'
);
throw new Error('There is a rollout in progress. Manage it with "channel:rollout" instead.');
}
const branchName = flags.branch ?? (await promptForBranchAsync());
@@ -140,7 +138,7 @@ export default class ChannelEdit extends EasCommand {
});
if (!branch) {
throw new Error(
`Could not find a branch named "${branchName}". Please check what branches exist on this project with ${chalk.bold(
`Could not find a branch named "${branchName}". Check what branches exist on this project with ${chalk.bold(
'eas branch:list'
)}.`
);
@@ -173,7 +171,7 @@ async function promptForChannelAsync(): Promise<string> {
const { name } = await promptAsync({
type: 'text',
name: 'name',
message: 'Please enter the name of the channel to edit:',
message: 'Provide the name of the channel to edit:',
validate: value => (value ? true : 'The channel name may not be empty.'),
});
return name;
@@ -92,7 +92,7 @@ async function startRolloutAsync({
});
if (!branch) {
throw new Error(
`Could not find a branch named "${branchName}". Please check what branches exist on this project with ${chalk.bold(
`Could not find a branch named "${branchName}". Check which branches exist on this project with ${chalk.bold(
'eas branch:list'
)}.`
);
@@ -238,7 +238,7 @@ async function endRolloutAsync({
});
if (!branch) {
throw new Error(
`Could not find a branch named "${branchName}". Please check what branches exist on this project with ${chalk.bold(
`Could not find a branch named "${branchName}". Check which branches exist on this project with ${chalk.bold(
'eas branch:list'
)}.`
);
@@ -354,7 +354,7 @@ export default class ChannelRollout extends EasCommand {
});
if (!channel) {
throw new Error(
`Could not find a channel named "${channelName}". Please check what channels exist on this project with ${chalk.bold(
`Could not find a channel named "${channelName}". Check which channels exist on this project with ${chalk.bold(
'eas channel:list'
)}.`
);
@@ -176,7 +176,7 @@ export default class ChannelView extends EasCommand {
({ name: channelName } = await promptAsync({
type: 'text',
name: 'name',
message: 'Please name the channel:',
message: 'Provide a channel name:',
validate: value => (value ? true : validationMessage),
}));
}
+8 -1
View File
@@ -1,10 +1,17 @@
import { Flags } from '@oclif/core';
import EasCommand from '../commandUtils/EasCommand';
import { SelectPlatform } from '../credentials/manager/SelectPlatform';
export default class Credentials extends EasCommand {
static description = 'manage credentials';
static flags = {
platform: Flags.enum({ char: 'p', options: ['android', 'ios'] }),
};
async runAsync(): Promise<void> {
await new SelectPlatform().runAsync();
const { flags } = await this.parse(Credentials);
await new SelectPlatform(flags.platform).runAsync();
}
}
@@ -3,7 +3,11 @@ import chalk from 'chalk';
import EasCommand from '../../commandUtils/EasCommand';
import Log from '../../log';
import { getExpoConfig } from '../../project/expoConfig';
import { findProjectRootAsync, setProjectIdAsync } from '../../project/projectUtils';
import {
fetchProjectIdFromServerAsync,
findProjectRootAsync,
saveProjectIdToAppConfigAsync,
} from '../../project/projectUtils';
export default class ProjectInit extends EasCommand {
static description = 'create or link an EAS project';
@@ -20,6 +24,9 @@ export default class ProjectInit extends EasCommand {
return;
}
await setProjectIdAsync(projectDir);
const projectId = await fetchProjectIdFromServerAsync(exp);
await saveProjectIdToAppConfigAsync(projectDir, projectId);
Log.withTick(`Linked app.json to project with ID ${chalk.bold(projectId)}`);
}
}
+1 -1
View File
@@ -22,7 +22,7 @@ export default class EnvironmentSecretList extends EasCommand {
const projectAccountName = await getProjectAccountNameAsync(exp);
if (!projectDir) {
throw new Error("Please run this command inside your project's directory");
throw new Error("Run this command inside your project's directory");
}
const secrets = await EnvironmentSecretsQuery.allAsync(projectAccountName, projectId);
@@ -302,7 +302,7 @@ export default class UpdatePublish extends EasCommand {
({ name: branchName } = await promptAsync({
type: 'text',
name: 'name',
message: 'No branches found. Creating a new one. Please name the new branch:',
message: 'No branches found. Provide a branch name:',
initial:
(await getVcsClient().getBranchNameAsync()) ||
`branch-${Math.random().toString(36).substr(2, 4)}`,
@@ -404,7 +404,7 @@ export default class UpdatePublish extends EasCommand {
({ publishMessage: message } = await promptAsync({
type: 'text',
name: 'publishMessage',
message: `Please enter an update message.`,
message: `Provide an update message.`,
initial: `Republish "${oldMessage!}" - group: ${group}`,
validate: (value: any) => (value ? true : validationMessage),
}));
@@ -426,7 +426,7 @@ export default class UpdatePublish extends EasCommand {
({ publishMessage: message } = await promptAsync({
type: 'text',
name: 'publishMessage',
message: `Please enter an update message.`,
message: `Provide an update message.`,
initial: (await getVcsClient().getLastCommitMessageAsync())?.trim(),
validate: (value: any) => (value ? true : validationMessage),
}));
@@ -757,7 +757,9 @@ async function checkEASUpdateURLIsSetAsync(exp: ExpoConfig): Promise<void> {
if (configuredURL !== expectedURL) {
throw new Error(
`The update URL is incorrectly configured for EAS Update. Please set updates.url to ${expectedURL} in your app.json.`
`The update URL is incorrectly configured for EAS Update. Set updates.url to ${expectedURL} in your ${chalk.bold(
'app.json'
)}.`
);
}
}
+1 -1
View File
@@ -73,7 +73,7 @@ export default class BranchView extends EasCommand {
({ name: branchInteractive } = await promptAsync({
type: 'text',
name: 'name',
message: 'Please enter the name of the branch whose updates you wish to view:',
message: 'Provide the name of the branch whose updates you wish to view:',
initial: (await getVcsClient().getBranchNameAsync()) ?? undefined,
validate: (value: any) => (value ? true : validationMessage),
}));
@@ -54,7 +54,7 @@ export class RemoveKeystore {
)
);
Log.warn(
'Please read https://docs.expo.dev/distribution/building-standalone-apps/#if-you-choose-to-build-for-android for more info before proceeding.'
'Read https://docs.expo.dev/distribution/building-standalone-apps/#if-you-choose-to-build-for-android for more info before proceeding.'
);
Log.newLine();
Log.warn(
+1 -3
View File
@@ -1,8 +1,6 @@
export class MissingCredentialsNonInteractiveError extends Error {
constructor(message?: string) {
super(
message ?? 'Credentials are not set up. Please run this command again in interactive mode.'
);
super(message ?? 'Credentials are not set up. Run this command again in interactive mode.');
}
}
@@ -147,8 +147,8 @@ const APPLE_DIST_CERTS_TOO_MANY_GENERATED_ERROR = `
You can have only ${chalk.underline(
'three'
)} Apple Distribution Certificates generated on your Apple Developer account.
Please revoke the old ones or reuse existing from your other apps.
Please remember that Apple Distribution Certificates are not application specific!
Revoke the old ones or reuse existing from your other apps.
Remember that Apple Distribution Certificates are not application specific!
`;
export async function provideOrGenerateDistributionCertificateAsync(
@@ -45,7 +45,7 @@ export class SetUpAdhocProvisioningProfile {
return nullthrows(await getBuildCredentialsAsync(ctx, this.app, IosDistributionType.AdHoc));
} else {
throw new MissingCredentialsNonInteractiveError(
'Provisioning profile is not configured correctly. Please run this command again in interactive mode.'
'Provisioning profile is not configured correctly. Run this command again in interactive mode.'
);
}
}
@@ -70,7 +70,7 @@ export class SetUpInternalProvisioningProfile {
} else {
if (adhocBuildCredentialsExist && enterpriseBuildCredentialsExist) {
throw new Error(
`You're in non-interactive mode. You have set up both adhoc and universal distribution credentials. Please set the 'enterpriseProvisioning' property (to 'adhoc' or 'universal') in eas.json to choose the credentials to use.`
`You're in non-interactive mode. You have set up both adhoc and universal distribution credentials. Set the 'enterpriseProvisioning' property (to 'adhoc' or 'universal') in eas.json to choose the credentials to use.`
);
} else if (adhocBuildCredentialsExist) {
return await this.setupAdhocProvisioningProfileAsync(ctx);
@@ -78,7 +78,7 @@ export class SetUpInternalProvisioningProfile {
return await this.setupUniversalProvisioningProfileAsync(ctx);
} else {
throw new Error(
`You're in non-interactive mode. EAS CLI couldn't find any credentials suitable for internal distribution. Please run again in interactive mode.`
`You're in non-interactive mode. EAS CLI couldn't find any credentials suitable for internal distribution. Run this command again in interactive mode.`
);
}
}
@@ -95,7 +95,7 @@ export class SetUpProvisioningProfile {
}
if (ctx.nonInteractive) {
throw new MissingCredentialsNonInteractiveError(
'Provisioning profile is not configured correctly. Please run this command again in interactive mode.'
'Provisioning profile is not configured correctly. Run this command again in interactive mode.'
);
}
@@ -48,7 +48,7 @@ export class SetUpSubmissionCredentials {
async promptForAppSpecificPasswordAsync(): Promise<string> {
Log.addNewLineIfNone();
Log.log(`Please enter your Apple app-specific password.`);
Log.log(`Enter your Apple app-specific password.`);
Log.log(learnMore('https://expo.fyi/apple-app-specific-password'));
Log.warn(
wrapAnsi(
@@ -153,7 +153,7 @@ describe(syncCapabilityIdentifiersForEntitlementsAsync, () => {
(_ctx: any, { identifier }: { identifier: string }): any => {
// e2e test with: merchant.expodemo
throw new Error(
`There is a problem with the request entity - A Merchant ID with Identifier '${identifier}' is not available. Please enter a different string.`
`There is a problem with the request entity - A Merchant ID with Identifier '${identifier}' is not available. Enter a different string.`
);
}
);
@@ -167,6 +167,6 @@ describe(syncCapabilityIdentifiersForEntitlementsAsync, () => {
syncCapabilityIdentifiersForEntitlementsAsync(bundleId, {
'com.apple.developer.in-app-payments': ['merchant.bacon'],
})
).rejects.toThrow(/is not available. Please enter a different string/);
).rejects.toThrow(/is not available. Enter a different string/);
});
});
@@ -67,7 +67,7 @@ async function getRequiredContractMessagesAsync(
// prompt the user to open an issue so we can address the new contract state if it ever appears.
// TODO: Maybe a silent analytic would be better
Log.error(
`\nUnexpected Apple developer contract status "${status}". Please open an issue on https://github.com/expo/eas-cli`
`\nUnexpected Apple developer contract status "${status}". Open an issue on https://github.com/expo/eas-cli`
);
Log.newLine();
return { messages: (await getContractMessagesAsync(context)) ?? [], isFatal: false };
@@ -62,7 +62,7 @@ export async function ensureBundleIdExistsWithNameAsync(
spinner.fail(
`The bundle identifier ${chalk.bold(bundleIdentifier)} is not available to team "${
authCtx.team.name
}" (${authCtx.team.id}), please change it in your app config and try again.`
}" (${authCtx.team.id}), change it in your app config and try again.`
);
} else {
spinner.fail(`Failed to register bundle identifier ${chalk.dim(bundleIdentifier)}`);
@@ -196,13 +196,13 @@ export async function ensureAppExistsAsync(
} catch (error: any) {
if (error.message.match(/An App ID with Identifier '(.*)' is not available/)) {
throw new Error(
`\nThe bundle identifier "${bundleIdentifier}" is not available to provider "${userAuthCtx.authState?.session.provider.name}. Please change it in your app config and try again.\n`
`\nThe bundle identifier "${bundleIdentifier}" is not available to provider "${userAuthCtx.authState?.session.provider.name}. Change it in your app config and try again.\n`
);
}
spinner.fail(`Failed to create App Store app ${chalk.dim(name)}`);
error.message +=
'\nPlease visit https://appstoreconnect.apple.com and resolve any warnings, then try again.';
'\nVisit https://appstoreconnect.apple.com and resolve any warnings, then try again.';
throw error;
}
} else {
@@ -12,8 +12,8 @@ const { MaxKeysCreatedError } = Keys;
export const APPLE_KEYS_TOO_MANY_GENERATED_ERROR = `
You can have only ${chalk.underline('two')} Apple Keys generated on your Apple Developer account.
Please revoke the old ones or reuse existing from your other apps.
Please remember that Apple Keys are not application specific!
Revoke the old ones or reuse existing from your other apps.
Remember that Apple Keys are not application specific!
`;
/**
@@ -45,7 +45,7 @@ export class SelectIosDistributionTypeGraphqlFromBuildProfile {
if (ctx.nonInteractive) {
throw new Error(
'Unable to determine type of internal distribution. Please run this command in interactive mode.'
'Unable to determine type of internal distribution. Run this command in interactive mode.'
);
}
@@ -1,22 +1,16 @@
import { promptAsync } from '../../prompts';
import { selectPlatformAsync } from '../../platform';
import { ManageAndroid } from './ManageAndroid';
import { ManageIos } from './ManageIos';
export class SelectPlatform {
constructor(private readonly flagPlatform?: string) {}
async runAsync(): Promise<void> {
const { platform } = await promptAsync({
type: 'select',
name: 'platform',
message: 'Select platform',
choices: [
{ value: 'android', title: 'Android' },
{ value: 'ios', title: 'iOS' },
],
});
const platform = await selectPlatformAsync(this.flagPlatform);
if (platform === 'ios') {
return await new ManageIos(new SelectPlatform(), process.cwd()).runAsync();
return await new ManageIos(new SelectPlatform(platform), process.cwd()).runAsync();
}
return await new ManageAndroid(new SelectPlatform(), process.cwd()).runAsync();
return await new ManageAndroid(new SelectPlatform(platform), process.cwd()).runAsync();
}
}
@@ -28,7 +28,7 @@ const EXPERT_PROMPT = (): void => {
}
Log.warn(`
In this mode, we won't be able to make sure that your credentials are valid.
Please double check that you're uploading valid files for your app otherwise you may encounter strange errors!
Double check that you're uploading valid files for your app otherwise you may encounter strange errors!
When building for IOS make sure you've created your App ID on the Apple Developer Portal, that your App ID
is in app.json as \`bundleIdentifier\`, and that the provisioning profile you
upload matches that Team ID and App ID.
+1 -1
View File
@@ -18,7 +18,7 @@ Internal distribution means that you won't need upload your app archive to App S
Your app archive (.ipa) will be installable on your equipment as long as you sign your application with an adhoc provisiong profile.
The provisioning profile needs to contain the UDIDs (unique identifiers) of your iPhones and iPads.
First of all, please choose the Expo account under which you want to register your devices.
First of all, choose the Expo account under which you want to register your devices.
Later, authenticate with Apple and choose your desired Apple Team (if your Apple ID has access to multiple teams).`;
export default class DeviceManager {
+2 -2
View File
@@ -55,7 +55,7 @@ export const graphqlClient = createUrqlClient({
},
}) as StricterClient;
/* Please specify additionalTypenames in your Graphql queries */
/* Specify additionalTypenames in your Graphql queries */
export interface StricterClient extends Client {
// eslint-disable-next-line @typescript-eslint/ban-types
query<Data = any, Variables extends object = {}>(
@@ -70,7 +70,7 @@ export async function withErrorHandlingAsync<T>(promise: Promise<OperationResult
if (error) {
if (error.graphQLErrors.some(e => e?.extensions?.isTransient)) {
Log.error(`We've encountered a transient error, please try again shortly.`);
Log.error(`We've encountered a transient error. Try again shortly.`);
}
throw error;
}
+2 -2
View File
@@ -76,8 +76,8 @@ export function handleMetadataError(error: Error): void {
Log.error(error.errors.map(err => err.message).join('\n\n'));
}
Log.newLine();
Log.log('Please check the logs for any configuration issues.');
Log.log('If this issue persists, please open a new issue at:');
Log.log('Check the logs for any configuration issues.');
Log.log('If this issue persists, open a new issue at:');
// TODO: add execution ID to the issue template link
Log.log(link('https://github.com/expo/eas-cli'));
return;
@@ -22,6 +22,10 @@ jest.mock('../../prompts');
jest.mock('../../user/User');
jest.mock('../ensureProjectExists');
beforeEach(() => {
jest.resetAllMocks();
});
describe(findProjectRootAsync, () => {
beforeEach(() => {
vol.reset();
@@ -35,7 +39,7 @@ describe(findProjectRootAsync, () => {
'/app'
);
await expect(findProjectRootAsync({ cwd: '/app' })).rejects.toThrow(
'Please run this command inside a project directory.'
'Run this command inside a project directory.'
);
});
@@ -252,6 +256,21 @@ describe(promptToCreateProjectIfNotExistsAsync, () => {
});
describe(getProjectIdAsync, () => {
beforeEach(() => {
jest.mocked(getUserAsync).mockImplementation(
async (): Promise<Actor> => ({
__typename: 'User',
id: 'user_id',
username: 'notnotbrent',
accounts: [
{ id: 'account_id_1', name: 'notnotbrent' },
{ id: 'account_id_2', name: 'dominik' },
],
isExpoAdmin: false,
})
);
});
it('gets the project ID from app config if exists', async () => {
await expect(
getProjectIdAsync({ name: 'test', slug: 'test', extra: { eas: { projectId: '1234' } } })
@@ -274,4 +293,16 @@ describe(getProjectIdAsync, () => {
extra: { eas: { projectId: '2345' } },
});
});
it('does not throw if writing the ID back to the config fails', async () => {
jest.mocked(getConfig).mockReturnValue({ exp: { name: 'test', slug: 'test' } } as any);
jest.mocked(modifyConfigAsync).mockResolvedValue({
type: 'fail',
config: null,
});
jest.mocked(ensureProjectExistsAsync).mockImplementation(async () => '4567');
const projectId = await getProjectIdAsync({ name: 'test', slug: 'test' }, {}, { cwd: '/app' });
expect(projectId).toBe('4567');
});
});
+1 -1
View File
@@ -60,7 +60,7 @@ function importMetroConfigFromProject(projectDir: string): typeof MetroConfig {
throw new MetroConfigPackageMissingError(
'Missing package "metro-config" in the project. ' +
'This usually means `react-native` is not installed. ' +
'Please verify that dependencies in package.json include "react-native" ' +
'Verify that dependencies in package.json include "react-native" ' +
'and run `yarn` or `npm install`.'
);
}
+38 -22
View File
@@ -65,7 +65,7 @@ export async function findProjectRootAsync({
const projectRootDir = await pkgDir(cwd);
if (!projectRootDir) {
if (!defaultToProcessCwd) {
throw new Error('Please run this command inside a project directory.');
throw new Error('Run this command inside a project directory.');
} else {
return process.cwd();
}
@@ -83,19 +83,15 @@ export async function findProjectRootAsync({
}
}
export async function setProjectIdAsync(
/**
* Save an EAS project ID to the appropriate field in the app config.
*/
export async function saveProjectIdToAppConfigAsync(
projectDir: string,
projectId: string,
options: { env?: Env } = {}
): Promise<ExpoConfig | undefined> {
): Promise<void> {
const exp = getExpoConfig(projectDir, options);
const privacy = toAppPrivacy(exp.privacy);
const projectId = await ensureProjectExistsAsync({
accountName: getProjectAccountName(exp, await ensureLoggedInAsync()),
projectName: exp.slug,
privacy,
});
const result = await modifyConfigAsync(projectDir, {
extra: { ...exp.extra, eas: { ...exp.extra?.eas, projectId } },
});
@@ -122,11 +118,27 @@ export async function setProjectIdAsync(
default:
throw new Error('Unexpected result type from modifyConfigAsync');
}
Log.withTick(`Linked app.json to project with ID ${chalk.bold(projectId)}`);
return result.config?.expo;
}
/**
* Use the owner/slug to identify an EAS project on the server.
*
* @returns the EAS project ID from the server
*/
export async function fetchProjectIdFromServerAsync(exp: ExpoConfig): Promise<string> {
const privacy = toAppPrivacy(exp.privacy);
return await ensureProjectExistsAsync({
accountName: getProjectAccountName(exp, await ensureLoggedInAsync()),
projectName: exp.slug,
privacy,
});
}
/**
* Get the EAS project ID from the app config. If the project ID is not set in the config.
* use the owner/slug to identify an EAS project on the server, and attempt to save the
* EAS project ID to the appropriate field in the app config.
*/
export async function getProjectIdAsync(
exp: ExpoConfig,
options: { env?: Env } = {},
@@ -140,19 +152,23 @@ export async function getProjectIdAsync(
return localProjectId;
}
// Set the project ID if it is missing.
const projectDir = await findProjectRootAsync(findProjectRootOptions);
if (!projectDir) {
throw new Error('Please run this command inside a project directory.');
throw new Error('Run this command inside a project directory.');
}
const newExp = await setProjectIdAsync(projectDir, options);
const newLocalProjectId = newExp?.extra?.eas?.projectId;
if (!newLocalProjectId) {
// throw if we still can't locate the projectId
throw new Error('Could not retrieve project ID from app.json');
const projectId = await fetchProjectIdFromServerAsync(exp);
try {
await saveProjectIdToAppConfigAsync(projectDir, projectId, options);
} catch (e: any) {
// saveProjectIdToAppConfigAsync already printed out a set of detailed errors and
// instructions on how to fix it. To mimic throwing the error but not halting
// execution, just warn here with the error message.
Log.warn(e.message);
}
return newLocalProjectId;
return projectId;
}
const toAppPrivacy = (privacy: ExpoConfig['privacy']): AppPrivacy => {
+9 -9
View File
@@ -23,7 +23,7 @@ enum SubmissionErrorCode {
const SubmissionErrorMessages: Record<SubmissionErrorCode, string> = {
[SubmissionErrorCode.ARCHIVE_DOWNLOAD_NOT_FOUND_ERROR]:
"Failed to download the archive file (Response code: 404 Not Found). Please make sure the URL you've provided is correct.",
"Failed to download the archive file (Response code: 404 Not Found). Make sure the URL you've provided is correct.",
[SubmissionErrorCode.ARCHIVE_DOWNLOAD_FORBIDDEN_ERROR]:
'Failed to download the archive file (Response code: 403 Forbidden). This is most probably caused by trying to upload an expired build artifact. All EAS build artifacts expire after 30 days.',
[SubmissionErrorCode.ARCHIVE_EXTRACT_CORRUPT_ARCHIVE_ERROR]:
@@ -32,7 +32,7 @@ const SubmissionErrorMessages: Record<SubmissionErrorCode, string> = {
"EAS Submit couldn't find a valid build artifact within provided compressed archive.\n" +
'If you provide a tar.gz archive, it should contain at least one .apk/.aab/.ipa file, depending on the submission platform.',
[SubmissionErrorCode.ANDROID_UNKNOWN_ERROR]:
"We couldn't figure out what went wrong. Please see logs to learn more.",
"We couldn't figure out what went wrong. See logs to learn more.",
[SubmissionErrorCode.ANDROID_FIRST_UPLOAD_ERROR]:
"You haven't submitted this app to Google Play Store yet. The first submission of the app needs to be performed manually.\n" +
`${learnMore('https://expo.fyi/first-android-submission')}.`,
@@ -50,29 +50,29 @@ const SubmissionErrorMessages: Record<SubmissionErrorCode, string> = {
"If you're submitting an Expo project built with EAS Build, increment the build number in app.json and build the project again.\n" +
`${learnMore('https://expo.fyi/bumping-ios-build-number')}.`,
[SubmissionErrorCode.IOS_UNKNOWN_ERROR]:
"We couldn't figure out what went wrong. Please see logs to learn more.",
"We couldn't figure out what went wrong. See logs to learn more.",
[SubmissionErrorCode.IOS_MISSING_APP_ICON]:
'Your iOS app icon is missing or is an invalid format. The icon must be a 1024x1024 PNG image with no transparency.\n' +
'Please check your icon image and icon configuration in app.json.\n' +
'Check your icon image and icon configuration in app.json.\n' +
`${learnMore('https://docs.expo.dev/guides/app-icons/')}`,
[SubmissionErrorCode.IOS_INVALID_SIGNATURE]:
'Your app signature seems to be invalid.\n' +
"Please check your iOS Distribution Certificate and your app's Provisioning Profile.\n" +
"Check your iOS Distribution Certificate and your app's Provisioning Profile.\n" +
`${learnMore('https://docs.expo.dev/distribution/app-signing')}`,
[SubmissionErrorCode.IOS_INCORRECT_CREDENTIALS]:
'Your Apple ID or app-specific password is incorrect. Please verify that you entered them correctly and try again.',
'Your Apple ID or app-specific password is incorrect. Verify that you entered them correctly and try again.',
[SubmissionErrorCode.IOS_IPAD_INVALID_ORIENTATION]:
"Your app doesn't support iPad multitasking and has to require full screen.\n" +
"If you're submitting a managed Expo project, set the `expo.ios.requireFullScreen` to true in app.json and build the project again.\n" +
`${learnMore('https://expo.fyi/ipad-requires-fullscreen')}`,
[SubmissionErrorCode.IOS_APPLE_MAINTENANCE]:
'It looks like Apple servers are undergoing an unscheduled maintenance. Please try again later.',
'It looks like Apple servers are undergoing an unscheduled maintenance. Try again later.',
[SubmissionErrorCode.IOS_INVALID_PROVISIONING_PROFILE_SIGNATURE]:
'Invalid Provisioning Profile Signature (ITMS-90165)\n' +
"Some of Apple's certificates have expired.\n" +
'Please delete your Provisioning Profile from your account. Then rebuild the app interactively to generate a new one, and try submitting it to the App Store again.',
'Delete your Provisioning Profile from your account. Then rebuild the app interactively to generate a new one, and try submitting it to the App Store again.',
[SubmissionErrorCode.UPLOAD_TAKING_TOO_LONG_ERROR]:
'Submission has reached the timeout limit. Please try again.',
'Submission has reached the timeout limit. Try again.',
};
export function printSubmissionError(error: SubmissionError): boolean {
+1 -1
View File
@@ -83,7 +83,7 @@ export function ensureValidVersions(exp: ExpoConfig, platform: RequestedPlatform
'sdkVersion'
)} to configure ${chalk.bold(
'expo-updates'
)}. Please specify at least one of these properties under the ${chalk.bold(
)}. Specify at least one of these properties under the ${chalk.bold(
'expo'
)} key in ${chalk.bold('app.json')}. ${learnMore(
'https://docs.expo.dev/eas-update/runtime-versions/'
Generated
+7 -71
View File
@@ -5603,11 +5603,6 @@ crypto-random-string@^1.0.0:
resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=
crypto-random-string@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==
d@1, d@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
@@ -5760,20 +5755,6 @@ define-properties@^1.1.4:
has-property-descriptors "^1.0.0"
object-keys "^1.1.1"
del@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7"
integrity sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==
dependencies:
globby "^10.0.1"
graceful-fs "^4.2.2"
is-glob "^4.0.1"
is-path-cwd "^2.2.0"
is-path-inside "^3.0.1"
p-map "^3.0.0"
rimraf "^3.0.0"
slash "^3.0.0"
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
@@ -7898,16 +7879,6 @@ is-obj@^2.0.0:
resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
is-path-cwd@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb"
integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==
is-path-inside@^3.0.1:
version "3.0.2"
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017"
integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==
is-plain-obj@^1.0.0, is-plain-obj@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
@@ -10238,13 +10209,6 @@ p-map-series@^2.1.0:
resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-2.1.0.tgz#7560d4c452d9da0c07e692fdbfe6e2c81a2a91f2"
integrity sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==
p-map@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d"
integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==
dependencies:
aggregate-error "^3.0.0"
p-map@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
@@ -11749,13 +11713,6 @@ string_decoder@~1.1.1:
dependencies:
safe-buffer "~5.1.0"
[email protected], strip-ansi@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
dependencies:
ansi-regex "^5.0.0"
strip-ansi@^3.0.0, strip-ansi@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
@@ -11770,6 +11727,13 @@ strip-ansi@^4.0.0:
dependencies:
ansi-regex "^3.0.0"
strip-ansi@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
dependencies:
ansi-regex "^5.0.0"
strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
@@ -12006,11 +11970,6 @@ temp-dir@^1.0.0:
resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d"
integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=
temp-dir@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e"
integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==
temp-write@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-4.0.0.tgz#cd2e0825fc826ae72d201dc26eef3bf7e6fc9320"
@@ -12031,17 +11990,6 @@ [email protected]:
type-fest "^0.3.1"
unique-string "^1.0.0"
[email protected]:
version "0.7.0"
resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.7.0.tgz#8249c76a38bd104733a5491410aa84b508e8b503"
integrity sha512-YcFJbGum4B10jqKroKsci0kE5eEzRCMCTCa0ATtRC6zApBboaOnug1igqAbRC9SCvyqTRI9Xt8NYVggQr4k9hw==
dependencies:
del "^5.1.0"
is-stream "^2.0.0"
temp-dir "^2.0.0"
type-fest "^0.16.0"
unique-string "^2.0.0"
[email protected], terminal-link@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994"
@@ -12330,11 +12278,6 @@ type-fest@^0.13.1:
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934"
integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==
type-fest@^0.16.0:
version "0.16.0"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860"
integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==
type-fest@^0.18.0:
version "0.18.1"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f"
@@ -12478,13 +12421,6 @@ unique-string@^1.0.0:
dependencies:
crypto-random-string "^1.0.0"
unique-string@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d"
integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==
dependencies:
crypto-random-string "^2.0.0"
universal-user-agent@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee"