Compare commits

..
Author SHA1 Message Date
Douglas Lowder a7f002fb47 Show both tvOS and iOS simulators in build:run 2023-09-26 19:00:01 -07:00
Expo CI 04049a8d1f update CHANGELOG.md 2023-09-25 16:41:24 +00:00
Szymon Dziedzic 5bdd46a2a9 v5.3.0 2023-09-25 18:27:59 +02:00
Szymon Dziedzic a7e88bd7cb upgrade eas-cli-local-build-plugin to 1.0.44 2023-09-25 18:27:06 +02:00
Kadi KramanandSzymon Dziedzic 78b75c6224 [eas-cli] [eas-json] [ENG-10069] add support for bun (#2055)
* Update eas-build-job dependency

* Add bun to eas-cli

* Add bun to eas-json

* Add changelog

* Use correct PR in changelog

* Update packages/eas-json/schema/eas.schema.json

Co-authored-by: Szymon Dziedzic <[email protected]>

* Update gql schema

---------

Co-authored-by: Szymon Dziedzic <[email protected]>
2023-09-25 16:54:23 +01:00
Szymon Dziedzic 52f54fc7ae fix tests 2023-09-18 10:26:36 +02:00
Piotr Szeremeta 7ddd630cfd [FIX] Remove semver validation from node version read from .nvmrc (#2052)
* [FIX] Remove semver validation from node version read from .nvmrc

Node version can be specified as an alias (such as `iojs`, `lts/hydrogen` etc), so validating it as semver may cause errors for some users.

* update CHANGELOG.md
2023-09-18 08:28:39 +02:00
_nderscore 8751a2835f feat(eas-cli): expose expo export dev flag as an option in eas update (#2050) 2023-09-13 13:00:01 -07:00
Piotr Szeremeta da9829a853 [ENG-5266] Suggest correct bundleId when account name not available (#2027) 2023-09-11 14:56:53 +02:00
Quinlan Jung cc822b18f3 [eas-cli] rollouts: more robust printing function (#2047)
* [eas-cli] rollouts: more robust printing function

* update CHANGELOG.md
2023-09-06 11:10:44 -07:00
Expo CI bcab3bcb09 update CHANGELOG.md 2023-09-05 20:58:51 +00:00
Quinlan Jung a5dc0bd27c v5.2.0 2023-09-05 13:50:41 -07:00
Quinlan Jung 54127c4e37 [ENG-9828][eas-cli] rollouts: view action for CI (#2040)
* [eas-cli] rollouts: non-interactive view

* update CHANGELOG.md

* rebase
2023-09-05 13:49:12 -07:00
Quinlan Jung 9097ab2537 [ENG-9602][eas-cli] rollouts: json output for ci (#2037)
* [eas-cli] rollouts: json output for ci

* update CHANGELOG.md

* fix tests
2023-09-05 13:01:20 -07:00
Quinlan Jung 4e2029a5c5 [eas-cli] rollout tests (#2042)
* [eas-cli] rollout tests

* update CHANGELOG.md
2023-09-05 12:30:31 -07:00
Quinlan Jung ad02a056d7 [eas-cli] remove unreachable codesigning option (#2041)
* [eas-cli] remove unreachable option

* update CHANGELOG.md
2023-09-05 12:29:23 -07:00
Quinlan Jung ea9f734b11 [eas-cli] fix graphql (#2039)
* [eas-cli] fix graphql

* update CHANGELOG.md
2023-09-05 12:27:54 -07:00
Piotr Szeremeta 7db9d79c55 [Fix] Remove doubled definition of pnpm field from eas.schema.json (#2038) 2023-09-04 07:44:39 +02:00
Quinlan Jung 2e31b42b76 [eas-cli] only print channel-branch pairing if we created a channel (#2036)
* [eas-cli] only print channel-branch pairing if we created a channel

* update CHANGELOG.md
2023-09-01 12:38:42 -07:00
Expo CI 66d02d9724 update CHANGELOG.md 2023-09-01 14:14:32 +00:00
31 changed files with 2420 additions and 258 deletions

No files matched your search

+41 -2
View File
@@ -7,14 +7,53 @@ This is the log of notable changes to EAS CLI and related packages.
### 🛠 Breaking changes
### 🎉 New features
### 🐛 Bug fixes
### 🧹 Chores
## [5.3.0](https://github.com/expo/eas-cli/releases/tag/v5.3.0) - 2023-09-25
### 🎉 New features
- Update: expose expo cli `--dev` flag as an argument. ([#2050](https://github.com/expo/eas-cli/pull/2050) by [@nderscore](https://github.com/nderscore))
- Support `bun` option in eas.json. ([#2055](https://github.com/expo/eas-cli/pull/2055) by [@kadikraman](https://github.com/kadikraman))
### 🐛 Bug fixes
- Support node aliases in .nvmrc. ([#2052](https://github.com/expo/eas-cli/pull/2052) by [@khamilowicz](https://github.com/khamilowicz))
### 🧹 Chores
- Rollouts: more robust printing function. ([#2047](https://github.com/expo/eas-cli/pull/2047) by [@quinlanj](https://github.com/quinlanj))
## [5.2.0](https://github.com/expo/eas-cli/releases/tag/v5.2.0) - 2023-09-05
### 🎉 New features
- Rollouts: json output for ci. ([#2037](https://github.com/expo/eas-cli/pull/2037) by [@quinlanj](https://github.com/quinlanj))
### 🐛 Bug fixes
- Update: only print channel-branch pairing if we created a channel. ([#2036](https://github.com/expo/eas-cli/pull/2036) by [@quinlanj](https://github.com/quinlanj))
### 🧹 Chores
- Added rollout tests. ([#2042](https://github.com/expo/eas-cli/pull/2042) by [@quinlanj](https://github.com/quinlanj))
- Remove unreachable codesigning option. ([#2041](https://github.com/expo/eas-cli/pull/2041) by [@quinlanj](https://github.com/quinlanj))
- Fix generated graphql tsc errors. ([#2039](https://github.com/expo/eas-cli/pull/2039) by [@quinlanj](https://github.com/quinlanj))
- Rollouts: view action for CI. ([#2040](https://github.com/expo/eas-cli/pull/2040) by [@quinlanj](https://github.com/quinlanj))
## [5.1.0](https://github.com/expo/eas-cli/releases/tag/v5.1.0) - 2023-09-01
### 🎉 New features
- Support `pnpm` option in eas.json. ([#1988](https://github.com/expo/eas-cli/pull/1988) by [@khamilowicz](https://github.com/khamilowicz))
### 🐛 Bug fixes
- Make app config error not repeat indefinitely. ([#2020](https://github.com/expo/eas-cli/pull/2020) by [@radoslawkrzemien](https://github.com/radoslawkrzemien))
### 🧹 Chores
## [5.0.2](https://github.com/expo/eas-cli/releases/tag/v5.0.2) - 2023-08-29
### 🐛 Bug fixes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"npmClient": "yarn",
"useWorkspaces": true,
"version": "5.1.0",
"version": "5.3.0",
"$schema": "node_modules/lerna/schemas/lerna-schema.json"
}
+60 -59
View File
@@ -133,7 +133,7 @@ ALIASES
$ eas login
```
_See code: [src/commands/account/login.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/account/login.ts)_
_See code: [src/commands/account/login.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/account/login.ts)_
## `eas account:logout`
@@ -150,7 +150,7 @@ ALIASES
$ eas logout
```
_See code: [src/commands/account/logout.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/account/logout.ts)_
_See code: [src/commands/account/logout.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/account/logout.ts)_
## `eas account:view`
@@ -167,7 +167,7 @@ ALIASES
$ eas whoami
```
_See code: [src/commands/account/view.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/account/view.ts)_
_See code: [src/commands/account/view.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/account/view.ts)_
## `eas analytics [STATUS]`
@@ -181,7 +181,7 @@ DESCRIPTION
display or change analytics settings
```
_See code: [src/commands/analytics.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/analytics.ts)_
_See code: [src/commands/analytics.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/analytics.ts)_
## `eas autocomplete [SHELL]`
@@ -231,7 +231,7 @@ DESCRIPTION
create a branch
```
_See code: [src/commands/branch/create.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/branch/create.ts)_
_See code: [src/commands/branch/create.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/branch/create.ts)_
## `eas branch:delete [NAME]`
@@ -252,7 +252,7 @@ DESCRIPTION
delete a branch
```
_See code: [src/commands/branch/delete.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/branch/delete.ts)_
_See code: [src/commands/branch/delete.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/branch/delete.ts)_
## `eas branch:list`
@@ -272,7 +272,7 @@ DESCRIPTION
list all branches
```
_See code: [src/commands/branch/list.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/branch/list.ts)_
_See code: [src/commands/branch/list.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/branch/list.ts)_
## `eas branch:rename`
@@ -292,7 +292,7 @@ DESCRIPTION
rename a branch
```
_See code: [src/commands/branch/rename.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/branch/rename.ts)_
_See code: [src/commands/branch/rename.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/branch/rename.ts)_
## `eas branch:view [NAME]`
@@ -315,7 +315,7 @@ DESCRIPTION
view a branch
```
_See code: [src/commands/branch/view.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/branch/view.ts)_
_See code: [src/commands/branch/view.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/branch/view.ts)_
## `eas build`
@@ -345,7 +345,7 @@ DESCRIPTION
start a build
```
_See code: [src/commands/build/index.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/build/index.ts)_
_See code: [src/commands/build/index.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/build/index.ts)_
## `eas build:cancel [BUILD_ID]`
@@ -362,7 +362,7 @@ DESCRIPTION
cancel a build
```
_See code: [src/commands/build/cancel.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/build/cancel.ts)_
_See code: [src/commands/build/cancel.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/build/cancel.ts)_
## `eas build:configure`
@@ -379,7 +379,7 @@ DESCRIPTION
configure the project to support EAS Build
```
_See code: [src/commands/build/configure.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/build/configure.ts)_
_See code: [src/commands/build/configure.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/build/configure.ts)_
## `eas build:inspect`
@@ -414,7 +414,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/v5.1.0/packages/eas-cli/src/commands/build/inspect.ts)_
_See code: [src/commands/build/inspect.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/build/inspect.ts)_
## `eas build:list`
@@ -452,7 +452,7 @@ DESCRIPTION
list all builds for your project
```
_See code: [src/commands/build/list.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/build/list.ts)_
_See code: [src/commands/build/list.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/build/list.ts)_
## `eas build:resign`
@@ -478,7 +478,7 @@ DESCRIPTION
re-sign a build archive
```
_See code: [src/commands/build/resign.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/build/resign.ts)_
_See code: [src/commands/build/resign.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/build/resign.ts)_
## `eas build:run`
@@ -502,7 +502,7 @@ DESCRIPTION
run simulator/emulator builds from eas-cli
```
_See code: [src/commands/build/run.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/build/run.ts)_
_See code: [src/commands/build/run.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/build/run.ts)_
## `eas build:submit`
@@ -551,7 +551,7 @@ DESCRIPTION
get the latest version from EAS servers
```
_See code: [src/commands/build/version/get.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/build/version/get.ts)_
_See code: [src/commands/build/version/get.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/build/version/get.ts)_
## `eas build:version:set`
@@ -570,7 +570,7 @@ DESCRIPTION
update version of an app
```
_See code: [src/commands/build/version/set.ts](https://github.com/expo/eas-cli/blob/v5.1.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/v5.3.0/packages/eas-cli/src/commands/build/version/set.ts)_
## `eas build:version:sync`
@@ -589,7 +589,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/v5.1.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/v5.3.0/packages/eas-cli/src/commands/build/version/sync.ts)_
## `eas build:view [BUILD_ID]`
@@ -606,7 +606,7 @@ DESCRIPTION
view a build for your project
```
_See code: [src/commands/build/view.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/build/view.ts)_
_See code: [src/commands/build/view.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/build/view.ts)_
## `eas channel:create [NAME]`
@@ -627,7 +627,7 @@ DESCRIPTION
create a channel
```
_See code: [src/commands/channel/create.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/channel/create.ts)_
_See code: [src/commands/channel/create.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/channel/create.ts)_
## `eas channel:edit [NAME]`
@@ -649,7 +649,7 @@ DESCRIPTION
point a channel at a new branch
```
_See code: [src/commands/channel/edit.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/channel/edit.ts)_
_See code: [src/commands/channel/edit.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/channel/edit.ts)_
## `eas channel:list`
@@ -669,7 +669,7 @@ DESCRIPTION
list all channels
```
_See code: [src/commands/channel/list.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/channel/list.ts)_
_See code: [src/commands/channel/list.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/channel/list.ts)_
## `eas channel:rollout [CHANNEL]`
@@ -677,7 +677,7 @@ Roll a new branch out on a channel incrementally.
```
USAGE
$ eas channel:rollout [CHANNEL] [--action create|edit|end] [--percent <value>] [--outcome
$ eas channel:rollout [CHANNEL] [--action create|edit|end|view] [--percent <value>] [--outcome
republish-and-revert|revert] [--branch <value>] [--runtime-version <value>] [--private-key-path <value>] [--json
--non-interactive]
@@ -685,7 +685,7 @@ ARGUMENTS
CHANNEL channel on which the rollout should be done
FLAGS
--action=(create|edit|end) Rollout action to perform
--action=(create|edit|end|view) Rollout action to perform
--branch=<value> Branch to roll out. Use with --action=create
--json Enable JSON output, non-JSON messages will be printed to stderr.
--non-interactive Run the command in non-interactive mode.
@@ -701,7 +701,7 @@ DESCRIPTION
Roll a new branch out on a channel incrementally.
```
_See code: [src/commands/channel/rollout.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/channel/rollout.ts)_
_See code: [src/commands/channel/rollout.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/channel/rollout.ts)_
## `eas channel:view [NAME]`
@@ -724,7 +724,7 @@ DESCRIPTION
view a channel
```
_See code: [src/commands/channel/view.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/channel/view.ts)_
_See code: [src/commands/channel/view.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/channel/view.ts)_
## `eas config`
@@ -745,7 +745,7 @@ DESCRIPTION
display project configuration (app.json + eas.json)
```
_See code: [src/commands/config.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/config.ts)_
_See code: [src/commands/config.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/config.ts)_
## `eas credentials`
@@ -762,7 +762,7 @@ DESCRIPTION
manage credentials
```
_See code: [src/commands/credentials.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/credentials.ts)_
_See code: [src/commands/credentials.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/credentials.ts)_
## `eas device:create`
@@ -776,7 +776,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/v5.1.0/packages/eas-cli/src/commands/device/create.ts)_
_See code: [src/commands/device/create.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/device/create.ts)_
## `eas device:delete`
@@ -796,7 +796,7 @@ DESCRIPTION
remove a registered device from your account
```
_See code: [src/commands/device/delete.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/device/delete.ts)_
_See code: [src/commands/device/delete.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/device/delete.ts)_
## `eas device:list`
@@ -817,7 +817,7 @@ DESCRIPTION
list all registered devices for your account
```
_See code: [src/commands/device/list.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/device/list.ts)_
_See code: [src/commands/device/list.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/device/list.ts)_
## `eas device:rename`
@@ -838,7 +838,7 @@ DESCRIPTION
rename a registered device
```
_See code: [src/commands/device/rename.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/device/rename.ts)_
_See code: [src/commands/device/rename.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/device/rename.ts)_
## `eas device:view [UDID]`
@@ -852,7 +852,7 @@ DESCRIPTION
view a device for your project
```
_See code: [src/commands/device/view.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/device/view.ts)_
_See code: [src/commands/device/view.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/device/view.ts)_
## `eas diagnostics`
@@ -866,7 +866,7 @@ DESCRIPTION
display environment info
```
_See code: [src/commands/diagnostics.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/diagnostics.ts)_
_See code: [src/commands/diagnostics.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/diagnostics.ts)_
## `eas help [COMMAND]`
@@ -954,7 +954,7 @@ DESCRIPTION
validate the local store configuration
```
_See code: [src/commands/metadata/lint.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/metadata/lint.ts)_
_See code: [src/commands/metadata/lint.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/metadata/lint.ts)_
## `eas metadata:pull`
@@ -971,7 +971,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/v5.1.0/packages/eas-cli/src/commands/metadata/pull.ts)_
_See code: [src/commands/metadata/pull.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/metadata/pull.ts)_
## `eas metadata:push`
@@ -988,7 +988,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/v5.1.0/packages/eas-cli/src/commands/metadata/push.ts)_
_See code: [src/commands/metadata/push.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/metadata/push.ts)_
## `eas open`
@@ -1002,7 +1002,7 @@ DESCRIPTION
open the project page in a web browser
```
_See code: [src/commands/open.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/open.ts)_
_See code: [src/commands/open.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/open.ts)_
## `eas project:info`
@@ -1016,7 +1016,7 @@ DESCRIPTION
information about the current project
```
_See code: [src/commands/project/info.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/project/info.ts)_
_See code: [src/commands/project/info.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/project/info.ts)_
## `eas project:init`
@@ -1038,7 +1038,7 @@ ALIASES
$ eas init
```
_See code: [src/commands/project/init.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/project/init.ts)_
_See code: [src/commands/project/init.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/project/init.ts)_
## `eas secret:create`
@@ -1061,7 +1061,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/v5.1.0/packages/eas-cli/src/commands/secret/create.ts)_
_See code: [src/commands/secret/create.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/secret/create.ts)_
## `eas secret:delete`
@@ -1079,7 +1079,7 @@ DESCRIPTION
delete an environment secret by ID
```
_See code: [src/commands/secret/delete.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/secret/delete.ts)_
_See code: [src/commands/secret/delete.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/secret/delete.ts)_
## `eas secret:list`
@@ -1093,7 +1093,7 @@ DESCRIPTION
list environment secrets available for your current app
```
_See code: [src/commands/secret/list.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/secret/list.ts)_
_See code: [src/commands/secret/list.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/secret/list.ts)_
## `eas secret:push`
@@ -1113,7 +1113,7 @@ DESCRIPTION
read environment secrets from env file and store on the server
```
_See code: [src/commands/secret/push.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/secret/push.ts)_
_See code: [src/commands/secret/push.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/secret/push.ts)_
## `eas submit`
@@ -1143,7 +1143,7 @@ ALIASES
$ eas build:submit
```
_See code: [src/commands/submit.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/submit.ts)_
_See code: [src/commands/submit.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/submit.ts)_
## `eas update`
@@ -1152,8 +1152,8 @@ publish an update group
```
USAGE
$ eas update [--branch <value>] [--channel <value>] [-m <value>] [--republish | --input-dir <value> |
--skip-bundler] [--group <value> | | ] [--clear-cache] [-p android|ios|all] [--auto] [--private-key-path <value>]
[--json --non-interactive]
--skip-bundler] [--group <value> | | ] [--clear-cache] [-p android|ios|all] [--dev] [--auto] [--private-key-path
<value>] [--json --non-interactive]
FLAGS
-m, --message=<value> A short message describing the update
@@ -1162,6 +1162,7 @@ FLAGS
--branch=<value> Branch to publish the update group on
--channel=<value> Channel that the published update should affect
--clear-cache Clear the bundler cache before publishing
--dev Publish a development bundle
--group=<value> Update group to republish (deprecated, see republish command)
--input-dir=<value> [default: dist] Location of the bundle
--json Enable JSON output, non-JSON messages will be printed to stderr.
@@ -1176,7 +1177,7 @@ DESCRIPTION
publish an update group
```
_See code: [src/commands/update/index.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/update/index.ts)_
_See code: [src/commands/update/index.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/update/index.ts)_
## `eas update:configure`
@@ -1194,7 +1195,7 @@ DESCRIPTION
configure the project to support EAS Update
```
_See code: [src/commands/update/configure.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/update/configure.ts)_
_See code: [src/commands/update/configure.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/update/configure.ts)_
## `eas update:delete GROUPID`
@@ -1215,7 +1216,7 @@ DESCRIPTION
delete all the updates in an update group
```
_See code: [src/commands/update/delete.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/update/delete.ts)_
_See code: [src/commands/update/delete.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/update/delete.ts)_
## `eas update:list`
@@ -1237,7 +1238,7 @@ DESCRIPTION
view the recent updates
```
_See code: [src/commands/update/list.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/update/list.ts)_
_See code: [src/commands/update/list.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/update/list.ts)_
## `eas update:republish`
@@ -1264,7 +1265,7 @@ DESCRIPTION
roll back to an existing update
```
_See code: [src/commands/update/republish.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/update/republish.ts)_
_See code: [src/commands/update/republish.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/update/republish.ts)_
## `eas update:view GROUPID`
@@ -1284,7 +1285,7 @@ DESCRIPTION
update group details
```
_See code: [src/commands/update/view.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/update/view.ts)_
_See code: [src/commands/update/view.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/update/view.ts)_
## `eas webhook:create`
@@ -1305,7 +1306,7 @@ DESCRIPTION
create a webhook
```
_See code: [src/commands/webhook/create.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/webhook/create.ts)_
_See code: [src/commands/webhook/create.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/webhook/create.ts)_
## `eas webhook:delete [ID]`
@@ -1325,7 +1326,7 @@ DESCRIPTION
delete a webhook
```
_See code: [src/commands/webhook/delete.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/webhook/delete.ts)_
_See code: [src/commands/webhook/delete.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/webhook/delete.ts)_
## `eas webhook:list`
@@ -1343,7 +1344,7 @@ DESCRIPTION
list webhooks
```
_See code: [src/commands/webhook/list.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/webhook/list.ts)_
_See code: [src/commands/webhook/list.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/webhook/list.ts)_
## `eas webhook:update`
@@ -1365,7 +1366,7 @@ DESCRIPTION
update a webhook
```
_See code: [src/commands/webhook/update.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/webhook/update.ts)_
_See code: [src/commands/webhook/update.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/webhook/update.ts)_
## `eas webhook:view ID`
@@ -1382,7 +1383,7 @@ DESCRIPTION
view a webhook
```
_See code: [src/commands/webhook/view.ts](https://github.com/expo/eas-cli/blob/v5.1.0/packages/eas-cli/src/commands/webhook/view.ts)_
_See code: [src/commands/webhook/view.ts](https://github.com/expo/eas-cli/blob/v5.3.0/packages/eas-cli/src/commands/webhook/view.ts)_
## `eas whoami`
+1685 -130
View File
File diff suppressed because it is too large. Load diff
+3 -3
View File
@@ -1,7 +1,7 @@
{
"name": "eas-cli",
"description": "EAS command line tool",
"version": "5.1.0",
"version": "5.3.0",
"author": "Expo <[email protected]>",
"bin": {
"eas": "./bin/run"
@@ -13,8 +13,8 @@
"@expo/config": "8.1.2",
"@expo/config-plugins": "7.2.4",
"@expo/config-types": "49.0.0",
"@expo/eas-build-job": "1.0.39",
"@expo/eas-json": "5.1.0",
"@expo/eas-build-job": "1.0.43",
"@expo/eas-json": "5.3.0",
"@expo/json-file": "8.2.37",
"@expo/multipart-body-parser": "1.1.0",
"@expo/osascript": "2.0.33",
@@ -67,6 +67,7 @@ export async function prepareJobAsync(
image: buildProfile.image,
node: buildProfile.node,
pnpm: buildProfile.pnpm,
bun: buildProfile.bun,
yarn: buildProfile.yarn,
ndk: buildProfile.ndk,
expoCli: buildProfile.expoCli,
@@ -59,6 +59,7 @@ export async function prepareJobAsync(
image: buildProfile.image,
node: buildProfile.node,
pnpm: buildProfile.pnpm,
bun: buildProfile.bun,
yarn: buildProfile.yarn,
bundler: buildProfile.bundler,
cocoapods: buildProfile.cocoapods,
+1 -1
View File
@@ -6,7 +6,7 @@ import semver from 'semver';
import { ora } from '../ora';
const PLUGIN_PACKAGE_NAME = 'eas-cli-local-build-plugin';
const PLUGIN_PACKAGE_VERSION = '1.0.42';
const PLUGIN_PACKAGE_VERSION = '1.0.44';
export enum LocalBuildMode {
/**
@@ -124,6 +124,7 @@ export const testChannelObject: UpdateChannelObject = {
id: '9309afc2-9752-40db-8ef7-4abc10744c61',
name: 'production',
createdAt: '2023-05-16T21:26:16.946Z',
updatedAt: '2023-05-16T21:26:16.946Z',
branchMapping:
'{"data":[{"branchId":"754bf17f-efc0-46ab-8a59-a03f20e53e9b","branchMappingLogic":{"operand":0.15,"clientKey":"rolloutToken","branchMappingOperator":"hash_lt"}},{"branchId":"6941a8dd-5c0a-48bc-8876-f49c88ed419f","branchMappingLogic":"true"}],"version":0}',
updateBranches: [testUpdateBranch1, testUpdateBranch2],
@@ -1,3 +1,5 @@
import { format } from '@expo/timeago.js';
import { getAlwaysTrueBranchMapping, getEmptyBranchMapping } from '../branch-mapping';
import { getDescriptionByBranchId } from '../print-utils';
import { testChannelObject, testUpdateBranch1, testUpdateBranch2 } from './fixtures';
@@ -13,11 +15,12 @@ describe(getDescriptionByBranchId, () => {
codeSigningKey: undefined,
group: '16ca6dba-e63b-48b0-baa3-15a894ee9434',
isRollBackToEmbedded: false,
message: '"fix bug" (1 month ago by quintest113)',
message: `"fix bug" (${format('2023-07-17T22:48:59.278Z', 'en_US')} by quintest113)`,
platforms: 'android, ios',
runtimeVersion: 'exposdk:48.0.0',
},
});
expect(descriptionByBranchId[testUpdateBranch2.id]).toEqual({
branch: 'production',
branchRolloutPercentage: 85,
@@ -25,7 +28,7 @@ describe(getDescriptionByBranchId, () => {
codeSigningKey: undefined,
group: 'e40ad156-e9af-4cc2-8e9d-c7b5c328db48',
isRollBackToEmbedded: false,
message: '"fix bug" (2 months ago by quintest113)',
message: `"fix bug" (${format('2023-06-23T23:37:10.004Z', 'en_US')} by quintest113)`,
platforms: 'android, ios',
runtimeVersion: 'exposdk:48.0.0',
},
@@ -17,11 +17,13 @@ import {
RolloutActions,
RolloutMainMenu,
} from '../../rollout/actions/RolloutMainMenu';
import { enableJsonOutput } from '../../utils/json';
enum ActionRawFlagValue {
CREATE = 'create',
EDIT = 'edit',
END = 'end',
VIEW = 'view',
}
type ChannelRolloutRawArgsAndFlags = {
channel?: string;
@@ -137,8 +139,7 @@ export default class ChannelRollout extends EasCommand {
nonInteractive: argsAndFlags.nonInteractive,
});
if (argsAndFlags.json) {
// TODO(quin): implement json output
throw new Error('Developer Preview doesnt support JSON output yet');
enableJsonOutput();
}
const app = { projectId, exp };
@@ -168,6 +169,8 @@ export default class ChannelRollout extends EasCommand {
return ManageRolloutActions.EDIT;
case ActionRawFlagValue.END:
return ManageRolloutActions.END;
case ActionRawFlagValue.VIEW:
return ManageRolloutActions.VIEW;
}
}
+13 -4
View File
@@ -56,6 +56,7 @@ import { getVcsClient } from '../../vcs';
type RawUpdateFlags = {
auto: boolean;
dev: boolean;
branch?: string;
channel?: string;
message?: string;
@@ -74,6 +75,7 @@ type RawUpdateFlags = {
type UpdateFlags = {
auto: boolean;
dev: boolean;
platform: ExpoCLIExportPlatformFlag;
branchName?: string;
channelName?: string;
@@ -134,6 +136,10 @@ export default class UpdatePublish extends EasCommand {
default: 'all',
required: false,
}),
dev: Flags.boolean({
description: 'Publish a development bundle',
default: false,
}),
auto: Flags.boolean({
description:
'Use the current git branch and commit message for the EAS branch and update message',
@@ -158,6 +164,7 @@ export default class UpdatePublish extends EasCommand {
auto: autoFlag,
platform: platformFlag,
channelName: channelNameArg,
dev,
updateMessage: updateMessageArg,
inputDir,
skipBundler,
@@ -220,7 +227,7 @@ export default class UpdatePublish extends EasCommand {
if (!skipBundler) {
const bundleSpinner = ora().start('Exporting...');
try {
await buildBundlesAsync({ projectDir, inputDir, exp, platformFlag, clearCache });
await buildBundlesAsync({ projectDir, inputDir, dev, exp, platformFlag, clearCache });
bundleSpinner.succeed('Exported bundle(s)');
} catch (e) {
bundleSpinner.fail('Export failed');
@@ -360,10 +367,11 @@ export default class UpdatePublish extends EasCommand {
branchId,
channelName: branchName,
});
Log.withTick(
`Channel: ${chalk.bold(branchName)} pointed at branch: ${chalk.bold(branchName)}`
);
}
Log.withTick(`Channel: ${chalk.bold(branchName)} pointed at branch: ${chalk.bold(branchName)}`);
const vcsClient = getVcsClient();
const gitCommitHash = await vcsClient.getCommitHashAsync();
@@ -523,7 +531,7 @@ export default class UpdatePublish extends EasCommand {
private sanitizeFlags(flags: RawUpdateFlags): UpdateFlags {
const nonInteractive = flags['non-interactive'] ?? false;
const { auto, branch: branchName, channel: channelName, message: updateMessage } = flags;
const { auto, branch: branchName, channel: channelName, dev, message: updateMessage } = flags;
if (nonInteractive && !auto && !(updateMessage && (branchName || channelName))) {
Errors.error(
'--branch and --message, or --channel and --message are required when updating in non-interactive mode unless --auto is specified',
@@ -552,6 +560,7 @@ export default class UpdatePublish extends EasCommand {
auto,
branchName,
channelName,
dev,
updateMessage,
inputDir: flags['input-dir'],
skipBundler: flags['skip-bundler'],
+272 -21
View File
@@ -479,17 +479,11 @@ export type AccountSsoConfiguration = {
};
export type AccountSsoConfigurationData = {
authEndpoint?: InputMaybe<Scalars['String']>;
authProtocol: AuthProtocolType;
authProviderIdentifier: Scalars['String'];
clientIdentifier: Scalars['String'];
clientSecret: Scalars['String'];
endSessionEndpoint?: InputMaybe<Scalars['String']>;
issuer: Scalars['String'];
jwksEndpoint?: InputMaybe<Scalars['String']>;
revokeEndpoint?: InputMaybe<Scalars['String']>;
tokenEndpoint?: InputMaybe<Scalars['String']>;
userInfoEndpoint?: InputMaybe<Scalars['String']>;
};
export type AccountSsoConfigurationMutation = {
@@ -602,6 +596,8 @@ export type Actor = {
* For example, when displaying a sentence indicating that actor X created a build or published an update.
*/
displayName: Scalars['String'];
/** Experiments associated with this actor */
experiments: Array<ActorExperiment>;
/**
* Server feature gate values for this actor, optionally filtering by desired gates.
* Only resolves for the viewer.
@@ -618,9 +614,33 @@ export type ActorFeatureGatesArgs = {
filter?: InputMaybe<Array<Scalars['String']>>;
};
export type ActorExperiment = {
__typename?: 'ActorExperiment';
createdAt: Scalars['DateTime'];
enabled: Scalars['Boolean'];
experiment: Experiment;
id: Scalars['ID'];
updatedAt: Scalars['DateTime'];
};
export type ActorExperimentMutation = {
__typename?: 'ActorExperimentMutation';
/** Create or update the value of a User Experiment */
createOrUpdateActorExperiment: ActorExperiment;
};
export type ActorExperimentMutationCreateOrUpdateActorExperimentArgs = {
enabled: Scalars['Boolean'];
experiment: Experiment;
};
export type ActorQuery = {
__typename?: 'ActorQuery';
/** Query an Actor by ID */
/**
* Query an Actor by ID
* @deprecated Public actor queries are no longer supported
*/
byId: Actor;
};
@@ -789,6 +809,7 @@ export enum AndroidBuildType {
}
export type AndroidBuilderEnvironmentInput = {
bun?: InputMaybe<Scalars['String']>;
env?: InputMaybe<Scalars['JSONObject']>;
expoCli?: InputMaybe<Scalars['String']>;
image?: InputMaybe<Scalars['String']>;
@@ -1024,6 +1045,7 @@ export type App = Project & {
insights: AppInsights;
/** iOS app credentials for the project */
iosAppCredentials: Array<IosAppCredentials>;
isDeleting: Scalars['Boolean'];
/** Whether the latest classic update publish is using a deprecated SDK version */
isDeprecated: Scalars['Boolean'];
/** @deprecated 'likes' have been deprecated. */
@@ -1058,6 +1080,8 @@ export type App = Project & {
releaseChannels: Array<Scalars['String']>;
/** @deprecated Legacy access tokens are deprecated */
requiresAccessTokenForPushSecurity: Scalars['Boolean'];
/** Runtimes associated with this app */
runtimes: RuntimesConnection;
scopeKey: Scalars['String'];
/** SDK version of the latest classic update publish, 0.0.0 otherwise */
sdkVersion: Scalars['String'];
@@ -1175,6 +1199,7 @@ export type AppDeploymentArgs = {
export type AppDeploymentsArgs = {
after?: InputMaybe<Scalars['String']>;
before?: InputMaybe<Scalars['String']>;
filter?: InputMaybe<DeploymentFilterInput>;
first?: InputMaybe<Scalars['Int']>;
last?: InputMaybe<Scalars['Int']>;
};
@@ -1213,6 +1238,15 @@ export type AppLikedByArgs = {
};
/** Represents an Exponent App (or Experience in legacy terms) */
export type AppRuntimesArgs = {
after?: InputMaybe<Scalars['String']>;
before?: InputMaybe<Scalars['String']>;
first?: InputMaybe<Scalars['Int']>;
last?: InputMaybe<Scalars['Int']>;
};
/** Represents an Exponent App (or Experience in legacy terms) */
export type AppSubmissionsArgs = {
filter: SubmissionFilter;
@@ -2054,6 +2088,7 @@ export type Build = ActivityTimelineProjectActivity & BuildOrBuildJob & {
completedAt?: Maybe<Scalars['DateTime']>;
createdAt: Scalars['DateTime'];
customWorkflowName?: Maybe<Scalars['String']>;
developmentClient?: Maybe<Scalars['Boolean']>;
distribution?: Maybe<DistributionType>;
enqueuedAt?: Maybe<Scalars['DateTime']>;
error?: Maybe<BuildError>;
@@ -2145,6 +2180,7 @@ export enum BuildCredentialsSource {
export type BuildError = {
__typename?: 'BuildError';
buildPhase?: Maybe<BuildPhase>;
docsUrl?: Maybe<Scalars['String']>;
errorCode: Scalars['String'];
message: Scalars['String'];
@@ -2270,6 +2306,7 @@ export type BuildMetadataInput = {
cliVersion?: InputMaybe<Scalars['String']>;
credentialsSource?: InputMaybe<BuildCredentialsSource>;
customWorkflowName?: InputMaybe<Scalars['String']>;
developmentClient?: InputMaybe<Scalars['Boolean']>;
distribution?: InputMaybe<DistributionType>;
gitCommitHash?: InputMaybe<Scalars['String']>;
gitCommitMessage?: InputMaybe<Scalars['String']>;
@@ -2398,6 +2435,50 @@ export type BuildParamsInput = {
sdkVersion?: InputMaybe<Scalars['String']>;
};
export enum BuildPhase {
BuilderInfo = 'BUILDER_INFO',
CleanUpCredentials = 'CLEAN_UP_CREDENTIALS',
CompleteBuild = 'COMPLETE_BUILD',
ConfigureExpoUpdates = 'CONFIGURE_EXPO_UPDATES',
ConfigureXcodeProject = 'CONFIGURE_XCODE_PROJECT',
Custom = 'CUSTOM',
DownloadApplicationArchive = 'DOWNLOAD_APPLICATION_ARCHIVE',
EasBuildInternal = 'EAS_BUILD_INTERNAL',
FailBuild = 'FAIL_BUILD',
FixGradlew = 'FIX_GRADLEW',
InstallCustomTools = 'INSTALL_CUSTOM_TOOLS',
InstallDependencies = 'INSTALL_DEPENDENCIES',
InstallPods = 'INSTALL_PODS',
OnBuildCancelHook = 'ON_BUILD_CANCEL_HOOK',
OnBuildCompleteHook = 'ON_BUILD_COMPLETE_HOOK',
OnBuildErrorHook = 'ON_BUILD_ERROR_HOOK',
OnBuildSuccessHook = 'ON_BUILD_SUCCESS_HOOK',
ParseCustomWorkflowConfig = 'PARSE_CUSTOM_WORKFLOW_CONFIG',
PostInstallHook = 'POST_INSTALL_HOOK',
Prebuild = 'PREBUILD',
PrepareArtifacts = 'PREPARE_ARTIFACTS',
PrepareCredentials = 'PREPARE_CREDENTIALS',
PrepareProject = 'PREPARE_PROJECT',
PreInstallHook = 'PRE_INSTALL_HOOK',
PreUploadArtifactsHook = 'PRE_UPLOAD_ARTIFACTS_HOOK',
Queue = 'QUEUE',
ReadAppConfig = 'READ_APP_CONFIG',
ReadPackageJson = 'READ_PACKAGE_JSON',
RestoreCache = 'RESTORE_CACHE',
RunExpoDoctor = 'RUN_EXPO_DOCTOR',
RunFastlane = 'RUN_FASTLANE',
RunGradlew = 'RUN_GRADLEW',
SaveCache = 'SAVE_CACHE',
SetUpBuildEnvironment = 'SET_UP_BUILD_ENVIRONMENT',
SpinUpBuilder = 'SPIN_UP_BUILDER',
StartBuild = 'START_BUILD',
Unknown = 'UNKNOWN',
UploadApplicationArchive = 'UPLOAD_APPLICATION_ARCHIVE',
/** @deprecated No longer supported */
UploadArtifacts = 'UPLOAD_ARTIFACTS',
UploadBuildArtifacts = 'UPLOAD_BUILD_ARTIFACTS'
}
export type BuildPlanCreditThresholdExceededMetadata = {
__typename?: 'BuildPlanCreditThresholdExceededMetadata';
account: Account;
@@ -2772,8 +2853,10 @@ export type Deployment = {
builds: DeploymentBuildsConnection;
channel: UpdateChannel;
id: Scalars['ID'];
/** @deprecated Not required for the new Deployment UI */
latestUpdate?: Maybe<Update>;
/** Deployment query field */
insights: DeploymentInsights;
/** Ordered the same way as 'updateBranches' in UpdateChannel */
latestUpdatesPerBranch: Array<LatestUpdateOnBranch>;
runtime: Runtime;
};
@@ -2786,6 +2869,13 @@ export type DeploymentBuildsArgs = {
last?: InputMaybe<Scalars['Int']>;
};
/** Represents a Deployment - a set of Builds with the same Runtime Version and Channel */
export type DeploymentLatestUpdatesPerBranchArgs = {
limit: Scalars['Int'];
offset: Scalars['Int'];
};
export type DeploymentBuildEdge = {
__typename?: 'DeploymentBuildEdge';
cursor: Scalars['String'];
@@ -2805,6 +2895,40 @@ export type DeploymentEdge = {
node: Deployment;
};
export type DeploymentFilterInput = {
channel?: InputMaybe<Scalars['String']>;
runtimeVersion?: InputMaybe<Scalars['String']>;
};
export type DeploymentInsights = {
__typename?: 'DeploymentInsights';
embeddedUpdateTotalUniqueUsers: Scalars['Int'];
embeddedUpdateUniqueUsersOverTime: UniqueUsersOverTimeData;
id: Scalars['ID'];
mostPopularUpdates: Array<Update>;
uniqueUsersOverTime: UniqueUsersOverTimeData;
};
export type DeploymentInsightsEmbeddedUpdateTotalUniqueUsersArgs = {
timespan: InsightsTimespan;
};
export type DeploymentInsightsEmbeddedUpdateUniqueUsersOverTimeArgs = {
timespan: InsightsTimespan;
};
export type DeploymentInsightsMostPopularUpdatesArgs = {
timespan: InsightsTimespan;
};
export type DeploymentInsightsUniqueUsersOverTimeArgs = {
timespan: InsightsTimespan;
};
/** Represents the connection over the deployments edge of an App */
export type DeploymentsConnection = {
__typename?: 'DeploymentsConnection';
@@ -2973,6 +3097,10 @@ export type EstimatedUsage = {
value: Scalars['Float'];
};
export enum Experiment {
Orbit = 'ORBIT'
}
export type ExperimentationQuery = {
__typename?: 'ExperimentationQuery';
/** Get device experimentation config */
@@ -3536,6 +3664,7 @@ export enum IosBuildType {
}
export type IosBuilderEnvironmentInput = {
bun?: InputMaybe<Scalars['String']>;
bundler?: InputMaybe<Scalars['String']>;
cocoapods?: InputMaybe<Scalars['String']>;
env?: InputMaybe<Scalars['JSONObject']>;
@@ -3670,6 +3799,12 @@ export type KeystoreGenerationUrlMutation = {
createKeystoreGenerationUrl: KeystoreGenerationUrl;
};
export type LatestUpdateOnBranch = {
__typename?: 'LatestUpdateOnBranch';
branchId: Scalars['String'];
update?: Maybe<Update>;
};
export type LeaveAccountResult = {
__typename?: 'LeaveAccountResult';
success: Scalars['Boolean'];
@@ -3847,6 +3982,7 @@ export type MeteredBillingStatus = {
export type Notification = {
__typename?: 'Notification';
accountName: Scalars['String'];
createdAt: Scalars['DateTime'];
event: NotificationEvent;
id: Scalars['ID'];
@@ -3854,6 +3990,7 @@ export type Notification = {
metadata?: Maybe<NotificationMetadata>;
type: NotificationType;
updatedAt: Scalars['DateTime'];
websiteMessage: Scalars['String'];
};
export enum NotificationEvent {
@@ -4086,6 +4223,8 @@ export type Robot = Actor & {
accounts: Array<Account>;
created: Scalars['DateTime'];
displayName: Scalars['String'];
/** Experiments associated with this actor */
experiments: Array<ActorExperiment>;
/**
* Server feature gate values for this actor, optionally filtering by desired gates.
* Only resolves for the viewer.
@@ -4157,6 +4296,8 @@ export type RootMutation = {
account: AccountMutation;
/** Mutations that create, update, and delete an AccountSSOConfiguration */
accountSSOConfiguration: AccountSsoConfigurationMutation;
/** Mutations for Actor experiments */
actorExperiment: ActorExperimentMutation;
/** Mutations that modify the build credentials for an Android app */
androidAppBuildCredentials: AndroidAppBuildCredentialsMutation;
/** Mutations that modify the credentials for an Android app */
@@ -4228,10 +4369,14 @@ export type RootMutation = {
updateBranch: UpdateBranchMutation;
updateChannel: UpdateChannelMutation;
uploadSession: UploadSession;
/** Mutations that create, update, and delete pinned apps */
userAppPins: UserAppPinMutation;
/** Mutations that create, delete, and accept UserInvitations */
userInvitation: UserInvitationMutation;
/** Mutations that create, delete, update Webhooks */
webhook: WebhookMutation;
/** Mutations that modify a websiteNotification */
websiteNotifications: WebsiteNotificationMutation;
};
@@ -4265,7 +4410,10 @@ export type RootQuery = {
account: AccountQuery;
/** Top-level query object for querying AccountSSOConfigurationPublicData */
accountSSOConfigurationPublicData: AccountSsoConfigurationPublicDataQuery;
/** Top-level query object for querying Actors. */
/**
* Top-level query object for querying Actors.
* @deprecated Public actor queries are no longer supported
*/
actor: ActorQuery;
/**
* Public apps in the app directory
@@ -4322,7 +4470,10 @@ export type RootQuery = {
* @deprecated Public user queries are no longer supported
*/
user: UserQuery;
/** Top-level query object for querying UserActors. */
/**
* Top-level query object for querying UserActors.
* @deprecated Public user queries are no longer supported
*/
userActor: UserActorQuery;
/** Top-level query object for querying UserActorPublicData publicly. */
userActorPublicData: UserActorPublicDataQuery;
@@ -4388,6 +4539,7 @@ export type RuntimeFilterInput = {
branchId?: InputMaybe<Scalars['String']>;
};
/** Represents the connection over the runtime edge of an App */
export type RuntimesConnection = {
__typename?: 'RuntimesConnection';
edges: Array<RuntimeEdge>;
@@ -4412,6 +4564,8 @@ export type SsoUser = Actor & UserActor & {
/** Discord account linked to a user */
discordUser?: Maybe<DiscordUser>;
displayName: Scalars['String'];
/** Experiments associated with this actor */
experiments: Array<ActorExperiment>;
/**
* Server feature gate values for this actor, optionally filtering by desired gates.
* Only resolves for the viewer.
@@ -4431,6 +4585,7 @@ export type SsoUser = Actor & UserActor & {
/** @deprecated No longer supported */
location?: Maybe<Scalars['String']>;
notificationSubscriptions: Array<NotificationSubscription>;
pinnedApps: Array<App>;
/** Associated accounts */
primaryAccount: Account;
profilePhoto: Scalars['String'];
@@ -4439,8 +4594,7 @@ export type SsoUser = Actor & UserActor & {
/** @deprecated No longer supported */
twitterUsername?: Maybe<Scalars['String']>;
username: Scalars['String'];
/** Web notifications linked to a user */
websiteNotifications: Array<Notification>;
websiteNotificationsPaginated: WebsiteNotificationsConnection;
};
@@ -4478,6 +4632,15 @@ export type SsoUserSnacksArgs = {
offset: Scalars['Int'];
};
/** Represents a human SSO (not robot) actor. */
export type SsoUserWebsiteNotificationsPaginatedArgs = {
after?: InputMaybe<Scalars['String']>;
before?: InputMaybe<Scalars['String']>;
first?: InputMaybe<Scalars['Int']>;
last?: InputMaybe<Scalars['Int']>;
};
export type SsoUserDataInput = {
firstName?: InputMaybe<Scalars['String']>;
lastName?: InputMaybe<Scalars['String']>;
@@ -4672,7 +4835,9 @@ export type StatuspageService = {
export enum StatuspageServiceName {
EasBuild = 'EAS_BUILD',
EasSubmit = 'EAS_SUBMIT',
EasUpdate = 'EAS_UPDATE'
EasUpdate = 'EAS_UPDATE',
GithubApiRequests = 'GITHUB_API_REQUESTS',
GithubWebhooks = 'GITHUB_WEBHOOKS'
}
export type StatuspageServiceQuery = {
@@ -4906,6 +5071,8 @@ export type Update = ActivityTimelineProjectActivity & {
gitCommitHash?: Maybe<Scalars['String']>;
group: Scalars['String'];
id: Scalars['ID'];
/** Update query field */
insights: UpdateInsights;
isGitWorkingTreeDirty: Scalars['Boolean'];
isRollBackToEmbedded: Scalars['Boolean'];
manifestFragment: Scalars['String'];
@@ -5066,6 +5233,17 @@ export type UpdateInfoGroup = {
web?: InputMaybe<PartialManifest>;
};
export type UpdateInsights = {
__typename?: 'UpdateInsights';
id: Scalars['ID'];
totalUniqueUsers: Scalars['Int'];
};
export type UpdateInsightsTotalUniqueUsersArgs = {
timespan: InsightsTimespan;
};
export type UpdateMutation = {
__typename?: 'UpdateMutation';
/** Delete an EAS update group */
@@ -5165,6 +5343,8 @@ export type User = Actor & UserActor & {
displayName: Scalars['String'];
email: Scalars['String'];
emailVerified: Scalars['Boolean'];
/** Experiments associated with this actor */
experiments: Array<ActorExperiment>;
/**
* Server feature gate values for this actor, optionally filtering by desired gates.
* Only resolves for the viewer.
@@ -5191,6 +5371,7 @@ export type User = Actor & UserActor & {
notificationSubscriptions: Array<NotificationSubscription>;
/** Pending UserInvitations for this user. Only resolves for the viewer. */
pendingUserInvitations: Array<UserInvitation>;
pinnedApps: Array<App>;
/** Associated accounts */
primaryAccount: Account;
profilePhoto: Scalars['String'];
@@ -5201,7 +5382,7 @@ export type User = Actor & UserActor & {
/** @deprecated No longer supported */
twitterUsername?: Maybe<Scalars['String']>;
username: Scalars['String'];
websiteNotifications: Array<Notification>;
websiteNotificationsPaginated: WebsiteNotificationsConnection;
};
@@ -5239,6 +5420,15 @@ export type UserSnacksArgs = {
offset: Scalars['Int'];
};
/** Represents a human (not robot) actor. */
export type UserWebsiteNotificationsPaginatedArgs = {
after?: InputMaybe<Scalars['String']>;
before?: InputMaybe<Scalars['String']>;
first?: InputMaybe<Scalars['Int']>;
last?: InputMaybe<Scalars['Int']>;
};
/** A human user (type User or SSOUser) that can login to the Expo website, use Expo services, and be a member of accounts. */
export type UserActor = {
/** Access Tokens belonging to this user actor */
@@ -5263,6 +5453,8 @@ export type UserActor = {
* For example, when displaying a sentence indicating that actor X created a build or published an update.
*/
displayName: Scalars['String'];
/** Experiments associated with this actor */
experiments: Array<ActorExperiment>;
/**
* Server feature gate values for this user actor, optionally filtering by desired gates.
* Only resolves for the viewer.
@@ -5282,6 +5474,7 @@ export type UserActor = {
/** @deprecated No longer supported */
location?: Maybe<Scalars['String']>;
notificationSubscriptions: Array<NotificationSubscription>;
pinnedApps: Array<App>;
/** Associated accounts */
primaryAccount: Account;
profilePhoto: Scalars['String'];
@@ -5290,8 +5483,7 @@ export type UserActor = {
/** @deprecated No longer supported */
twitterUsername?: Maybe<Scalars['String']>;
username: Scalars['String'];
/** Web notifications linked to a user */
websiteNotifications: Array<Notification>;
websiteNotificationsPaginated: WebsiteNotificationsConnection;
};
@@ -5329,6 +5521,15 @@ export type UserActorSnacksArgs = {
offset: Scalars['Int'];
};
/** A human user (type User or SSOUser) that can login to the Expo website, use Expo services, and be a member of accounts. */
export type UserActorWebsiteNotificationsPaginatedArgs = {
after?: InputMaybe<Scalars['String']>;
before?: InputMaybe<Scalars['String']>;
first?: InputMaybe<Scalars['Int']>;
last?: InputMaybe<Scalars['Int']>;
};
/** A human user (type User or SSOUser) that can login to the Expo website, use Expo services, and be a member of accounts. */
export type UserActorPublicData = {
__typename?: 'UserActorPublicData';
@@ -5371,9 +5572,15 @@ export type UserActorPublicDataQueryByUsernameArgs = {
export type UserActorQuery = {
__typename?: 'UserActorQuery';
/** Query a UserActor by ID */
/**
* Query a UserActor by ID
* @deprecated Public user actor queries are no longer supported
*/
byId: UserActor;
/** Query a UserActor by username */
/**
* Query a UserActor by username
* @deprecated Public user actor queries are no longer supported
*/
byUsername: UserActor;
};
@@ -5387,6 +5594,22 @@ export type UserActorQueryByUsernameArgs = {
username: Scalars['String'];
};
export type UserAppPinMutation = {
__typename?: 'UserAppPinMutation';
pinApp: Scalars['ID'];
unpinApp?: Maybe<Scalars['ID']>;
};
export type UserAppPinMutationPinAppArgs = {
appId: Scalars['ID'];
};
export type UserAppPinMutationUnpinAppArgs = {
appId: Scalars['ID'];
};
export type UserDataInput = {
email?: InputMaybe<Scalars['String']>;
firstName?: InputMaybe<Scalars['String']>;
@@ -5546,6 +5769,11 @@ export type UserSecondFactorDevice = {
user: User;
};
export type WebNotificationUpdateReadStateInput = {
id: Scalars['ID'];
isRead: Scalars['Boolean'];
};
export type Webhook = {
__typename?: 'Webhook';
appId: Scalars['ID'];
@@ -5608,6 +5836,29 @@ export enum WebhookType {
Submit = 'SUBMIT'
}
export type WebsiteNotificationEdge = {
__typename?: 'WebsiteNotificationEdge';
cursor: Scalars['String'];
node: Notification;
};
export type WebsiteNotificationMutation = {
__typename?: 'WebsiteNotificationMutation';
updateAllWebsiteNotificationReadStateAsRead: Scalars['Boolean'];
updateNotificationReadState: Notification;
};
export type WebsiteNotificationMutationUpdateNotificationReadStateArgs = {
input: WebNotificationUpdateReadStateInput;
};
export type WebsiteNotificationsConnection = {
__typename?: 'WebsiteNotificationsConnection';
edges: Array<WebsiteNotificationEdge>;
pageInfo: PageInfo;
};
export type DeleteAndroidAppBuildCredentialsResult = {
__typename?: 'deleteAndroidAppBuildCredentialsResult';
id: Scalars['ID'];
@@ -6336,7 +6587,7 @@ export type ViewUpdateChannelOnAppQueryVariables = Exact<{
}>;
export type ViewUpdateChannelOnAppQuery = { __typename?: 'RootQuery', app: { __typename?: 'AppQuery', byId: { __typename?: 'App', id: string, updateChannelByName?: { __typename?: 'UpdateChannel', id: string, name: string, createdAt: any, branchMapping: string, updateBranches: Array<{ __typename?: 'UpdateBranch', id: string, name: string, updateGroups: Array<Array<{ __typename?: 'Update', id: string, group: string, message?: string | null, createdAt: any, runtimeVersion: string, platform: string, manifestFragment: string, isRollBackToEmbedded: boolean, manifestPermalink: string, gitCommitHash?: string | null, actor?: { __typename: 'Robot', firstName?: string | null, id: string } | { __typename: 'SSOUser', username: string, id: string } | { __typename: 'User', username: string, id: string } | null, branch: { __typename?: 'UpdateBranch', id: string, name: string }, codeSigningInfo?: { __typename?: 'CodeSigningInfo', keyid: string, sig: string, alg: string } | null }>> }> } | null } } };
export type ViewUpdateChannelOnAppQuery = { __typename?: 'RootQuery', app: { __typename?: 'AppQuery', byId: { __typename?: 'App', id: string, updateChannelByName?: { __typename?: 'UpdateChannel', id: string, name: string, updatedAt: any, createdAt: any, branchMapping: string, updateBranches: Array<{ __typename?: 'UpdateBranch', id: string, name: string, updateGroups: Array<Array<{ __typename?: 'Update', id: string, group: string, message?: string | null, createdAt: any, runtimeVersion: string, platform: string, manifestFragment: string, isRollBackToEmbedded: boolean, manifestPermalink: string, gitCommitHash?: string | null, actor?: { __typename: 'Robot', firstName?: string | null, id: string } | { __typename: 'SSOUser', username: string, id: string } | { __typename: 'User', username: string, id: string } | null, branch: { __typename?: 'UpdateBranch', id: string, name: string }, codeSigningInfo?: { __typename?: 'CodeSigningInfo', keyid: string, sig: string, alg: string } | null }>> }> } | null } } };
export type ViewUpdateChannelsOnAppQueryVariables = Exact<{
appId: Scalars['String'];
@@ -6345,7 +6596,7 @@ export type ViewUpdateChannelsOnAppQueryVariables = Exact<{
}>;
export type ViewUpdateChannelsOnAppQuery = { __typename?: 'RootQuery', app: { __typename?: 'AppQuery', byId: { __typename?: 'App', id: string, updateChannels: Array<{ __typename?: 'UpdateChannel', id: string, name: string, createdAt: any, branchMapping: string, updateBranches: Array<{ __typename?: 'UpdateBranch', id: string, name: string, updateGroups: Array<Array<{ __typename?: 'Update', id: string, group: string, message?: string | null, createdAt: any, runtimeVersion: string, platform: string, manifestFragment: string, isRollBackToEmbedded: boolean, manifestPermalink: string, gitCommitHash?: string | null, actor?: { __typename: 'Robot', firstName?: string | null, id: string } | { __typename: 'SSOUser', username: string, id: string } | { __typename: 'User', username: string, id: string } | null, branch: { __typename?: 'UpdateBranch', id: string, name: string }, codeSigningInfo?: { __typename?: 'CodeSigningInfo', keyid: string, sig: string, alg: string } | null }>> }> }> } } };
export type ViewUpdateChannelsOnAppQuery = { __typename?: 'RootQuery', app: { __typename?: 'AppQuery', byId: { __typename?: 'App', id: string, updateChannels: Array<{ __typename?: 'UpdateChannel', id: string, name: string, updatedAt: any, createdAt: any, branchMapping: string, updateBranches: Array<{ __typename?: 'UpdateBranch', id: string, name: string, updateGroups: Array<Array<{ __typename?: 'Update', id: string, group: string, message?: string | null, createdAt: any, runtimeVersion: string, platform: string, manifestFragment: string, isRollBackToEmbedded: boolean, manifestPermalink: string, gitCommitHash?: string | null, actor?: { __typename: 'Robot', firstName?: string | null, id: string } | { __typename: 'SSOUser', username: string, id: string } | { __typename: 'User', username: string, id: string } | null, branch: { __typename?: 'UpdateBranch', id: string, name: string }, codeSigningInfo?: { __typename?: 'CodeSigningInfo', keyid: string, sig: string, alg: string } | null }>> }> }> } } };
export type ViewUpdateChannelsPaginatedOnAppQueryVariables = Exact<{
appId: Scalars['String'];
@@ -60,6 +60,7 @@ export const ChannelQuery = {
updateChannelByName(name: $channelName) {
id
name
updatedAt
createdAt
branchMapping
updateBranches(offset: 0, limit: 5) {
@@ -104,6 +105,7 @@ export const ChannelQuery = {
updateChannels(offset: $offset, limit: $limit) {
id
name
updatedAt
createdAt
branchMapping
updateBranches(offset: 0, limit: 5) {
@@ -201,8 +201,14 @@ async function getSuggestedBundleIdentifierAsync(
} else {
// the only callsite is heavily interactive
const account = await getOwnerAccountForProjectIdAsync(graphqlClient, projectId);
let possibleId: string;
// It's common to use dashes in your node project name, strip them from the suggested package name.
const possibleId = `com.${account.name}.${exp.slug}`.split('-').join('');
if (account.name) {
possibleId = `com.${account.name}.${exp.slug}`.split('-').join('');
} else {
possibleId = `com.${exp.slug}`.split('-').join('');
}
if (isBundleIdentifierValid(possibleId)) {
return possibleId;
}
+5
View File
@@ -185,12 +185,14 @@ export async function buildBundlesAsync({
exp,
platformFlag,
clearCache,
dev = false,
}: {
projectDir: string;
inputDir: string;
exp: Pick<ExpoConfig, 'sdkVersion' | 'web'>;
platformFlag: ExpoCLIExportPlatformFlag;
clearCache?: boolean;
dev?: boolean;
}): Promise<void> {
const packageJSON = JsonFile.read(path.resolve(projectDir, 'package.json'));
if (!packageJSON) {
@@ -208,6 +210,7 @@ export async function buildBundlesAsync({
'--dump-sourcemap',
'--dump-assetmap',
`--platform=${platformFlag}`,
...(dev ? ['--dev'] : []),
...(clearCache ? ['--clear'] : []),
]);
}
@@ -227,6 +230,7 @@ export async function buildBundlesAsync({
'--dump-sourcemap',
'--dump-assetmap',
...platformArgs,
...(dev ? ['--dev'] : []),
...(clearCache ? ['--clear'] : []),
]);
}
@@ -248,6 +252,7 @@ export async function buildBundlesAsync({
'--dump-sourcemap',
'--dump-assetmap',
`--platform=${platformFlag}`,
...(dev ? ['--dev'] : []),
...(clearCache ? ['--clear'] : []),
]);
}
@@ -20,6 +20,7 @@ import {
export enum ManageRolloutActions {
EDIT = 'Edit',
END = 'End',
VIEW = 'View',
GO_BACK = 'Go back',
}
@@ -31,7 +32,7 @@ export class ManageRollout implements EASUpdateAction<EASUpdateAction> {
private channelInfo: UpdateChannelBasicInfoFragment,
private options: {
callingAction?: EASUpdateAction;
action?: ManageRolloutActions.EDIT | ManageRolloutActions.END;
action?: ManageRolloutActions.EDIT | ManageRolloutActions.END | ManageRolloutActions.VIEW;
} & Partial<EditRolloutNonInteractiveOptions> &
Partial<EndRolloutNonInteractiveOptions> &
EndRolloutGeneralOptions
@@ -51,6 +52,9 @@ export class ManageRollout implements EASUpdateAction<EASUpdateAction> {
return new EditRollout(this.channelInfo, this.options);
case ManageRolloutActions.END:
return new EndRollout(this.channelInfo, this.options);
case ManageRolloutActions.VIEW:
// Rollout is automatically printed in interactive mode
return new Noop();
case ManageRolloutActions.GO_BACK:
assert(this.options.callingAction, 'calling action must be defined');
return this.options.callingAction;
@@ -94,3 +98,7 @@ export class ManageRollout implements EASUpdateAction<EASUpdateAction> {
});
}
}
class Noop {
public async runAsync(): Promise<void> {}
}
@@ -1,7 +1,14 @@
import { EASUpdateAction, EASUpdateContext } from '../../eas-update/utils';
import { UpdateChannelBasicInfoFragment } from '../../graphql/generated';
import { ChannelQuery } from '../../graphql/queries/ChannelQuery';
import { CodeSigningInfo } from '../../utils/code-signing';
import {
ChannelQuery,
UpdateBranchObject,
UpdateChannelObject,
} from '../../graphql/queries/ChannelQuery';
import Log from '../../log';
import { printJsonOnlyOutput } from '../../utils/json';
import { getRollout, getRolloutInfo, isConstrainedRolloutInfo, isRollout } from '../branch-mapping';
import { printRollout } from '../utils';
import {
CreateRollout,
NonInteractiveOptions as CreateRolloutNonInteractiveOptions,
@@ -18,6 +25,19 @@ import {
import { ManageRolloutActions } from './ManageRollout';
import { MainMenuActions, RolloutActions } from './RolloutMainMenu';
type JSONRolloutOutput = {
defaultBranch: UpdateBranchObject;
rolledOutBranch: UpdateBranchObject;
percentRolledOut: number;
runtimeVersion?: string;
updatedAt: Date;
};
type JSONOutput = {
hasRollout: boolean;
originalRolloutInfo?: JSONRolloutOutput;
currentRolloutInfo?: JSONRolloutOutput;
};
/**
* Control a rollout in non interactive mode.
*/
@@ -25,7 +45,7 @@ export class NonInteractiveRollout implements EASUpdateAction<void> {
constructor(
private options: {
channelName?: string;
codeSigningInfo?: CodeSigningInfo;
json?: boolean;
action?: RolloutActions;
} & Partial<EditRolloutNonInteractiveOptions> &
Partial<EndRolloutNonInteractiveOptions> &
@@ -49,29 +69,102 @@ export class NonInteractiveRollout implements EASUpdateAction<void> {
appId: app.projectId,
channelName,
});
const channelObject = await this.getChannelObjectAsync(ctx, {
channelName,
runtimeVersion: this.getRuntimeVersion(channelInfo),
});
if (!action) {
throw new Error(`--action is required in non-interactive mode.`);
}
await this.runActionAsync(ctx, action, channelInfo, this.options);
const updatedChannelInfo = await this.runActionAsync(ctx, action, channelObject);
const updatedChannelObject = await this.getChannelObjectAsync(ctx, {
channelName,
runtimeVersion: this.getRuntimeVersion(updatedChannelInfo),
});
if (this.options.json) {
const json = await this.getJsonAsync({
originalChannelObject: channelObject,
updatedChannelObject,
});
printJsonOnlyOutput(json);
}
}
async runActionAsync(
ctx: EASUpdateContext,
action: RolloutActions,
channelInfo: UpdateChannelBasicInfoFragment,
options: Partial<EditRolloutNonInteractiveOptions> &
Partial<EndRolloutNonInteractiveOptions> &
EndRolloutGeneralOptions &
Partial<CreateRolloutNonInteractiveOptions>
channelObject: UpdateChannelObject
): Promise<UpdateChannelBasicInfoFragment> {
switch (action) {
case MainMenuActions.CREATE_NEW:
return await new CreateRollout(channelInfo, options).runAsync(ctx);
return await new CreateRollout(channelObject, this.options).runAsync(ctx);
case ManageRolloutActions.EDIT:
return await new EditRollout(channelInfo, options).runAsync(ctx);
return await new EditRollout(channelObject, this.options).runAsync(ctx);
case ManageRolloutActions.END:
return await new EndRollout(channelInfo, options).runAsync(ctx);
return await new EndRollout(channelObject, this.options).runAsync(ctx);
case ManageRolloutActions.VIEW:
return this.viewRollout(channelObject);
}
}
viewRollout(channelObject: UpdateChannelObject): UpdateChannelObject {
if (!this.options.json) {
printRollout(channelObject);
Log.warn('For formatted output, add the --json flag to your command.');
}
return channelObject;
}
async getJsonAsync({
originalChannelObject,
updatedChannelObject,
}: {
originalChannelObject: UpdateChannelObject;
updatedChannelObject: UpdateChannelObject;
}): Promise<JSONOutput> {
return {
hasRollout: isRollout(updatedChannelObject),
...(isRollout(originalChannelObject)
? { originalRolloutInfo: await this.getRolloutJsonAsync(originalChannelObject) }
: {}),
...(isRollout(updatedChannelObject)
? { currentRolloutInfo: await this.getRolloutJsonAsync(updatedChannelObject) }
: {}),
};
}
async getRolloutJsonAsync(channelObject: UpdateChannelObject): Promise<JSONRolloutOutput> {
const rollout = getRollout(channelObject);
return {
defaultBranch: rollout.defaultBranch,
rolledOutBranch: rollout.rolledOutBranch,
percentRolledOut: rollout.percentRolledOut,
runtimeVersion: this.getRuntimeVersion(channelObject) ?? undefined,
updatedAt: channelObject.updatedAt,
};
}
getRuntimeVersion(channelInfo: UpdateChannelBasicInfoFragment): string | undefined {
if (isRollout(channelInfo)) {
const updatedRolloutInfo = getRolloutInfo(channelInfo);
if (isConstrainedRolloutInfo(updatedRolloutInfo)) {
return updatedRolloutInfo.runtimeVersion;
}
}
return undefined;
}
async getChannelObjectAsync(
ctx: EASUpdateContext,
{ channelName, runtimeVersion }: { channelName: string; runtimeVersion?: string }
): Promise<UpdateChannelObject> {
const { graphqlClient, app } = ctx;
const { projectId } = app;
return await ChannelQuery.viewUpdateChannelAsync(graphqlClient, {
appId: projectId,
channelName,
...(runtimeVersion ? { filter: { runtimeVersions: [runtimeVersion] } } : {}),
});
}
}
@@ -27,7 +27,8 @@ export enum MainMenuActions {
export type RolloutActions =
| MainMenuActions.CREATE_NEW
| ManageRolloutActions.EDIT
| ManageRolloutActions.END;
| ManageRolloutActions.END
| ManageRolloutActions.VIEW;
/**
* Manage a rollout for the project.
@@ -126,7 +127,11 @@ export class RolloutMainMenu implements EASUpdateAction<void> {
toMainMenuAction(action: RolloutActions): MainMenuActions {
if (action === MainMenuActions.CREATE_NEW) {
return MainMenuActions.CREATE_NEW;
} else if (action === ManageRolloutActions.EDIT || action === ManageRolloutActions.END) {
} else if (
action === ManageRolloutActions.EDIT ||
action === ManageRolloutActions.END ||
action === ManageRolloutActions.VIEW
) {
return MainMenuActions.MANAGE_EXISTING;
} else {
throw new Error(`Action not supported yet: ` + action);
@@ -0,0 +1,65 @@
import { testBasicChannelInfo, testChannelObject } from '../../../channel/__tests__/fixtures';
import { getAlwaysTrueBranchMapping, getBranchMapping } from '../../../channel/branch-mapping';
import { updateChannelBranchMappingAsync } from '../../../commands/channel/edit';
import { createCtxMock } from '../../../eas-update/__tests__/fixtures';
import { ChannelQuery } from '../../../graphql/queries/ChannelQuery';
import { confirmAsync } from '../../../prompts';
import { RolloutBranchMapping, editRolloutBranchMapping } from '../../branch-mapping';
import { EditRollout } from '../EditRollout';
jest.mock('../../../prompts');
jest.mock('../../../graphql/queries/ChannelQuery');
jest.mock('../../../commands/channel/edit');
describe(EditRollout, () => {
afterEach(() => {
jest.clearAllMocks();
});
it('throws if the channel doesnt have an active rollout', async () => {
const ctx = createCtxMock();
const editRollout = new EditRollout({
...testBasicChannelInfo,
branchMapping: JSON.stringify(getAlwaysTrueBranchMapping('test-branch')),
});
await expect(editRollout.runAsync(ctx)).rejects.toThrowError('is not a rollout');
});
it('edits the channel with an active rollout', async () => {
const ctx = createCtxMock();
jest.mocked(ChannelQuery.viewUpdateChannelAsync).mockResolvedValue(testChannelObject);
jest.mocked(updateChannelBranchMappingAsync).mockResolvedValue(testChannelObject);
jest.mocked(confirmAsync).mockImplementation(async () => true);
const editRollout = new EditRollout(testChannelObject, { percent: 50 });
await editRollout.runAsync(ctx);
expect(updateChannelBranchMappingAsync).toBeCalledWith(
expect.any(Function),
expect.objectContaining({
branchMapping: JSON.stringify(
editRolloutBranchMapping(
getBranchMapping(testChannelObject.branchMapping) as RolloutBranchMapping,
50
)
),
})
);
});
it('works in Non-Interactive Mode', async () => {
const ctx = createCtxMock({
nonInteractive: true,
});
jest.mocked(ChannelQuery.viewUpdateChannelAsync).mockResolvedValue(testChannelObject);
jest.mocked(updateChannelBranchMappingAsync).mockResolvedValue(testChannelObject);
jest.mocked(confirmAsync).mockImplementation(async () => true);
const editRollout = new EditRollout(testChannelObject, { percent: 50 });
await editRollout.runAsync(ctx);
expect(updateChannelBranchMappingAsync).toBeCalledWith(
expect.any(Function),
expect.objectContaining({
branchMapping: JSON.stringify(
editRolloutBranchMapping(
getBranchMapping(testChannelObject.branchMapping) as RolloutBranchMapping,
50
)
),
})
);
});
});
@@ -0,0 +1,96 @@
import { testUpdateBranch1, testUpdateBranch2 } from '../../../channel/__tests__/fixtures';
import { createCtxMock } from '../../../eas-update/__tests__/fixtures';
import { NonInteractiveError } from '../../../eas-update/utils';
import { RuntimeQuery } from '../../../graphql/queries/RuntimeQuery';
import { UpdateQuery } from '../../../graphql/queries/UpdateQuery';
import { confirmAsync, promptAsync } from '../../../prompts';
import { SelectRuntime } from '../SelectRuntime';
jest.mock('../../../prompts');
jest.mock('../../../graphql/queries/RuntimeQuery');
jest.mock('../../../graphql/queries/UpdateQuery');
const runtimeFragment1 = { id: 'test-runtime-1-id', version: '1.0.0' };
const runtimeFragment2 = { id: 'test-runtime-2-id', version: '2.0.0' };
describe(SelectRuntime, () => {
afterEach(() => {
jest.clearAllMocks();
});
it('returns null if project has no runtimes', async () => {
const ctx = createCtxMock();
jest.mocked(RuntimeQuery.getRuntimesOnBranchAsync).mockResolvedValue({
edges: [],
pageInfo: {
hasPreviousPage: false,
hasNextPage: false,
},
});
const selectRuntime = new SelectRuntime(testUpdateBranch1);
const runtime = await selectRuntime.runAsync(ctx);
expect(runtime).toBeNull();
});
it('still prompts if project has only one runtime', async () => {
const ctx = createCtxMock();
jest.mocked(RuntimeQuery.getRuntimesOnBranchAsync).mockResolvedValue({
edges: [{ node: runtimeFragment1, cursor: 'cursor' }],
pageInfo: {
hasPreviousPage: false,
hasNextPage: false,
},
});
jest.mocked(UpdateQuery.viewUpdateGroupsOnBranchAsync).mockResolvedValue([]);
jest.mocked(confirmAsync).mockImplementation(async () => true);
const selectRuntime = new SelectRuntime(testUpdateBranch1);
const runtime = await selectRuntime.runAsync(ctx);
expect(runtime).toBe('1.0.0');
expect(confirmAsync).toHaveBeenCalledTimes(1);
});
it('returns the selected runtime', async () => {
jest.mocked(RuntimeQuery.getRuntimesOnBranchAsync).mockResolvedValue({
edges: [
{ node: runtimeFragment1, cursor: 'cursor' },
{ node: runtimeFragment2, cursor: 'cursor' },
],
pageInfo: {
hasPreviousPage: false,
hasNextPage: false,
},
});
jest.mocked(promptAsync).mockImplementation(async () => ({
item: runtimeFragment2,
}));
const ctx = createCtxMock();
const selectRuntime = new SelectRuntime(testUpdateBranch1);
const runtime = await selectRuntime.runAsync(ctx);
expect(runtime).toBe('2.0.0');
});
it('filters the runtime by intersecting branch id', async () => {
const ctx = createCtxMock();
jest.mocked(RuntimeQuery.getRuntimesOnBranchAsync).mockResolvedValue({
edges: [],
pageInfo: {
hasPreviousPage: false,
hasNextPage: false,
},
});
const selectRuntime = new SelectRuntime(testUpdateBranch1, {
anotherBranchToIntersectRuntimesBy: testUpdateBranch2,
});
const runtime = await selectRuntime.runAsync(ctx);
expect(runtime).toBeNull();
expect(RuntimeQuery.getRuntimesOnBranchAsync).toBeCalledWith(
expect.any(Function),
expect.objectContaining({
filter: { branchId: testUpdateBranch2.id },
})
);
});
it('throws an error in Non-Interactive Mode', async () => {
const ctx = createCtxMock({
nonInteractive: true,
});
const selectRuntime = new SelectRuntime(testUpdateBranch1);
// dont fail if users are running in non-interactive mode
await expect(selectRuntime.runAsync(ctx)).rejects.toThrowError(NonInteractiveError);
});
});
+5 -1
View File
@@ -10,9 +10,13 @@ import Log from '../log';
import { promptAsync } from '../prompts';
import { FormattedUpdateGroupDescription, getUpdateGroupDescriptions } from '../update/utils';
import formatFields from '../utils/formatFields';
import { Rollout, getRollout, isConstrainedRollout } from './branch-mapping';
import { Rollout, getRollout, isConstrainedRollout, isRollout } from './branch-mapping';
export function printRollout(channel: UpdateChannelObject): void {
if (!isRollout(channel)) {
Log.log(`Channel ${chalk.bold(channel.name)} doesn't have a rollout.`);
return;
}
const rollout = getRollout(channel);
displayRolloutDetails(channel.name, rollout);
}
+4 -4
View File
@@ -10,7 +10,7 @@ interface IosSimulator {
runtime: string;
osVersion: string;
windowName: string;
osType: 'iOS';
osType: 'iOS' | 'tvOS';
state: 'Booted' | 'Shutdown';
isAvailable: boolean;
name: string;
@@ -33,7 +33,7 @@ export async function selectSimulatorAsync(): Promise<IosSimulator> {
message: `Select a simulator to run your app on`,
name: 'selectedSimulator',
choices: simulators.map(simulator => ({
title: `iOS ${simulator.osVersion} ${simulator.name}`,
title: `${simulator.osType} ${simulator.osVersion} ${simulator.name}`,
value: simulator,
})),
});
@@ -69,7 +69,7 @@ export async function getAvaliableIosSimulatorsListAsync(query?: string): Promis
// Create an array [tvOS, 13, 4]
const [osType, ...osVersionComponents] = runtimeSuffix.split('-');
if (osType === 'iOS') {
if (osType === 'iOS' || osType === 'tvOS') {
// Join the end components [13, 4] -> '13.4'
const osVersion = osVersionComponents.join('.');
const sims = info.devices[runtime];
@@ -80,7 +80,7 @@ export async function getAvaliableIosSimulatorsListAsync(query?: string): Promis
runtime,
osVersion,
windowName: `${device.name} (${osVersion})`,
osType: 'iOS' as const,
osType,
state: device.state as 'Booted' | 'Shutdown',
lastBootedAt: device.lastBootedAt ? new Date(device.lastBootedAt) : undefined,
});
@@ -1,7 +1,7 @@
import { instance, mock } from 'ts-mockito';
import { ExpoGraphqlClient } from '../../commandUtils/context/contextUtils/createGraphqlClient';
import { App, Runtime, UpdateBranch, UpdateChannel } from '../../graphql/generated';
import { App, Runtime, UpdateBranch, UpdateChannel, UpdateInsights } from '../../graphql/generated';
import { ChannelQuery } from '../../graphql/queries/ChannelQuery';
import { getBranchNameFromChannelNameAsync } from '../getBranchNameFromChannelNameAsync';
@@ -125,6 +125,7 @@ function mockUpdateBranches(branchNames: string[]): UpdateBranch[] {
createdAt: '2022-12-07T02:24:43.487Z',
runtimeVersion: '1.0.0',
runtime: {} as Runtime, // Temporary fix to resolve type errors
insights: {} as UpdateInsights, // Temporary fix to resolve type errors
platform: 'ios',
manifestFragment: '...',
isRollBackToEmbedded: false,
-4
View File
@@ -8,7 +8,6 @@ import {
} from '@expo/eas-json';
import fs from 'fs-extra';
import path from 'path';
import semver from 'semver';
import Log, { learnMore } from '../log';
@@ -83,9 +82,6 @@ async function getNodeVersionFromFileAsync(projectDir: string): Promise<string |
} catch {
return undefined;
}
if (!semver.valid(semver.coerce(nodeVersion))) {
throw new Error(`Invalid node version in .nvmrc: ${nodeVersion}`);
}
return nodeVersion;
}
@@ -24,6 +24,8 @@ const humanReadableServiceName: Record<StatuspageServiceName, string> = {
[StatuspageServiceName.EasBuild]: 'EAS Build',
[StatuspageServiceName.EasSubmit]: 'EAS Submit',
[StatuspageServiceName.EasUpdate]: 'EAS Update',
[StatuspageServiceName.GithubApiRequests]: 'GitHub API Requests',
[StatuspageServiceName.GithubWebhooks]: 'Github Webhooks',
};
function warnAboutServiceOutage(service: StatuspageServiceFragment): void {
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@expo/eas-json",
"description": "A library for interacting with eas.json",
"version": "5.1.0",
"version": "5.3.0",
"author": "Expo <[email protected]>",
"bugs": "https://github.com/expo/eas-cli/issues",
"dependencies": {
+11 -6
View File
@@ -154,11 +154,6 @@
"description": "Optional override of the prebuild command used by EAS. Learn more: https://docs.expo.dev/workflow/expo-cli/#expo-prebuild",
"markdownDescription": "Optional override of the prebuild command used by EAS.\n\nFor example, you can specify `prebuild --template example-template` to use a custom template.\n>`--platform` and `--non-interactive` will be added automatically by the build engine, so you do not need to specify them manually.\n\n[Learn more](https://docs.expo.dev/workflow/expo-cli/#expo-prebuild)"
},
"pnpm": {
"type": "string",
"description": "The version of pnpm to use for the build. See: https://www.npmjs.com/package/pnpm",
"markdownDescription": "The exact version of [pnpm](https://www.npmjs.com/package/pnpm) to use for the build."
},
"node": {
"type": "string",
"description": "The version of Node.js to use for the build. See: https://nodejs.org/en/about/releases/",
@@ -174,6 +169,11 @@
"description": "The version of pnpm to use for the build. See: https://www.npmjs.com/package/pnpm",
"markdownDescription": "The exact version of [pnpm](https://www.npmjs.com/package/pnpm) to use for the build."
},
"bun": {
"type": "string",
"description": "The version of Bun to use for the build. See: https://bun.sh/",
"markdownDescription": "The exact version of [Bun](https://bun.sh/) to use for the build."
},
"expoCli": {
"type": "string",
"description": "The version of `expo-cli` used to `prebuild` your app.",
@@ -420,7 +420,12 @@
"default": "default",
"anyOf": [
{
"enum": ["default", "medium", "large", "m-medium"]
"enum": [
"default",
"medium",
"large",
"m-medium"
]
},
{
"type": "string"
+1
View File
@@ -40,6 +40,7 @@ const CommonBuildProfileSchema = Joi.object({
env: Joi.object().pattern(Joi.string(), Joi.string().empty(null)),
node: Joi.string().empty(null).custom(semverCheck),
pnpm: Joi.string().empty(null).custom(semverCheck),
bun: Joi.string().empty(null).custom(semverCheck),
yarn: Joi.string().empty(null).custom(semverCheck),
expoCli: Joi.string().empty(null).custom(semverCheck),
+1
View File
@@ -45,6 +45,7 @@ export interface CommonBuildProfile {
env?: Record<string, string>;
node?: string;
pnpm?: string;
bun?: string;
yarn?: string;
expoCli?: string;
Generated
+8
View File
@@ -1403,6 +1403,14 @@
joi "^17.9.2"
semver "^7.5.4"
"@expo/[email protected]":
version "1.0.43"
resolved "https://registry.yarnpkg.com/@expo/eas-build-job/-/eas-build-job-1.0.43.tgz#e331b5039372c31b15aedbadc229efee3dcaefba"
integrity sha512-LMOoDIEax31uGBGux6/ocbCjUbWK3cUHuCxrsYlU+bvba4pGifegYWt2YQ/HC2477paq+K69IGjOUCHvNWG6Yg==
dependencies:
joi "^17.9.2"
semver "^7.5.4"
"@expo/[email protected]":
version "0.3.22"
resolved "https://registry.yarnpkg.com/@expo/image-utils/-/image-utils-0.3.22.tgz#3a45fb2e268d20fcc761c87bca3aca7fd8e24260"