mirror of
https://github.com/expo/eas-cli.git
synced 2026-11-14 10:08:06 -10:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
987c23fc2d | ||
|
|
2bf5819075 | ||
|
|
fdbeb862ec | ||
|
|
9a05359dcb | ||
|
|
ce76d4d7d0 | ||
|
|
3c58bd4515 | ||
|
|
f4f4756e07 | ||
|
|
31b3d81b1a | ||
|
|
5cf526592c | ||
|
|
8646dc81d9 | ||
|
|
54ae76e85e | ||
|
|
63381b8ee4 |
No files matched your search
@@ -10,6 +10,19 @@ This is the log of notable changes to EAS CLI and related packages.
|
||||
|
||||
### 🐛 Bug fixes
|
||||
|
||||
### 🧹 Chores
|
||||
|
||||
## [10.2.3](https://github.com/expo/eas-cli/releases/tag/v10.2.3) - 2024-08-13
|
||||
|
||||
### 🧹 Chores
|
||||
|
||||
- Add support for `EAS_DANGEROUS_OVERRIDE_IOS_BUNDLE_IDENTIFIER` for bare workflow iOS builds. ([#2469](https://github.com/expo/eas-cli/pull/2469) by [@szdziedzic](https://github.com/szdziedzic))
|
||||
- Update images list in `eas.schema.json` and warn users when using the deprecated Android images. ([#2450](https://github.com/expo/eas-cli/pull/2450) by [@szdziedzic](https://github.com/szdziedzic))
|
||||
|
||||
## [10.2.2](https://github.com/expo/eas-cli/releases/tag/v10.2.2) - 2024-07-31
|
||||
|
||||
### 🐛 Bug fixes
|
||||
|
||||
- Pass correct path to `vcsClient.isFileIgnoredAsync` check for monorepos to validate that custom build config file is not ignored. ([#2470](https://github.com/expo/eas-cli/pull/2470) by [@szdziedzic](https://github.com/szdziedzic))
|
||||
|
||||
### 🧹 Chores
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"npmClient": "yarn",
|
||||
"version": "10.2.2",
|
||||
"version": "10.2.4",
|
||||
"$schema": "node_modules/lerna/schemas/lerna-schema.json"
|
||||
}
|
||||
+60
-60
@@ -143,7 +143,7 @@ ALIASES
|
||||
$ eas login
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/account/login.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/account/login.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/account/login.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/account/login.ts)_
|
||||
|
||||
## `eas account:logout`
|
||||
|
||||
@@ -160,7 +160,7 @@ ALIASES
|
||||
$ eas logout
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/account/logout.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/account/logout.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/account/logout.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/account/logout.ts)_
|
||||
|
||||
## `eas account:view`
|
||||
|
||||
@@ -177,7 +177,7 @@ ALIASES
|
||||
$ eas whoami
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/account/view.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/account/view.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/account/view.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/account/view.ts)_
|
||||
|
||||
## `eas analytics [STATUS]`
|
||||
|
||||
@@ -191,7 +191,7 @@ DESCRIPTION
|
||||
display or change analytics settings
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/analytics.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/analytics.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/analytics.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/analytics.ts)_
|
||||
|
||||
## `eas autocomplete [SHELL]`
|
||||
|
||||
@@ -243,7 +243,7 @@ DESCRIPTION
|
||||
create a branch
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/branch/create.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/branch/create.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/branch/create.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/branch/create.ts)_
|
||||
|
||||
## `eas branch:delete [NAME]`
|
||||
|
||||
@@ -264,7 +264,7 @@ DESCRIPTION
|
||||
delete a branch
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/branch/delete.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/branch/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/branch/delete.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/branch/delete.ts)_
|
||||
|
||||
## `eas branch:list`
|
||||
|
||||
@@ -284,7 +284,7 @@ DESCRIPTION
|
||||
list all branches
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/branch/list.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/branch/list.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/branch/list.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/branch/list.ts)_
|
||||
|
||||
## `eas branch:rename`
|
||||
|
||||
@@ -304,7 +304,7 @@ DESCRIPTION
|
||||
rename a branch
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/branch/rename.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/branch/rename.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/branch/rename.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/branch/rename.ts)_
|
||||
|
||||
## `eas branch:view [NAME]`
|
||||
|
||||
@@ -327,7 +327,7 @@ DESCRIPTION
|
||||
view a branch
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/branch/view.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/branch/view.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/branch/view.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/branch/view.ts)_
|
||||
|
||||
## `eas build`
|
||||
|
||||
@@ -364,7 +364,7 @@ DESCRIPTION
|
||||
start a build
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/index.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/build/index.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/index.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/build/index.ts)_
|
||||
|
||||
## `eas build:cancel [BUILD_ID]`
|
||||
|
||||
@@ -383,7 +383,7 @@ DESCRIPTION
|
||||
cancel a build
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/cancel.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/build/cancel.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/cancel.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/build/cancel.ts)_
|
||||
|
||||
## `eas build:configure`
|
||||
|
||||
@@ -400,7 +400,7 @@ DESCRIPTION
|
||||
configure the project to support EAS Build
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/configure.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/build/configure.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/configure.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/build/configure.ts)_
|
||||
|
||||
## `eas build:delete [BUILD_ID]`
|
||||
|
||||
@@ -419,7 +419,7 @@ DESCRIPTION
|
||||
delete a build
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/delete.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/build/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/delete.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/build/delete.ts)_
|
||||
|
||||
## `eas build:inspect`
|
||||
|
||||
@@ -454,7 +454,7 @@ DESCRIPTION
|
||||
inspect the state of the project at specific build stages, useful for troubleshooting
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/inspect.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/build/inspect.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/inspect.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/build/inspect.ts)_
|
||||
|
||||
## `eas build:list`
|
||||
|
||||
@@ -504,7 +504,7 @@ DESCRIPTION
|
||||
list all builds for your project
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/list.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/build/list.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/list.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/build/list.ts)_
|
||||
|
||||
## `eas build:resign`
|
||||
|
||||
@@ -533,7 +533,7 @@ DESCRIPTION
|
||||
re-sign a build archive
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/resign.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/build/resign.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/resign.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/build/resign.ts)_
|
||||
|
||||
## `eas build:run`
|
||||
|
||||
@@ -559,7 +559,7 @@ DESCRIPTION
|
||||
run simulator/emulator builds from eas-cli
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/run.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/build/run.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/run.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/build/run.ts)_
|
||||
|
||||
## `eas build:submit`
|
||||
|
||||
@@ -609,7 +609,7 @@ DESCRIPTION
|
||||
get the latest version from EAS servers
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/version/get.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/build/version/get.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/version/get.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/build/version/get.ts)_
|
||||
|
||||
## `eas build:version:set`
|
||||
|
||||
@@ -628,7 +628,7 @@ DESCRIPTION
|
||||
update version of an app
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/version/set.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/build/version/set.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/version/set.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/build/version/set.ts)_
|
||||
|
||||
## `eas build:version:sync`
|
||||
|
||||
@@ -647,7 +647,7 @@ DESCRIPTION
|
||||
update a version in native code with a value stored on EAS servers
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/version/sync.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/build/version/sync.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/version/sync.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/build/version/sync.ts)_
|
||||
|
||||
## `eas build:view [BUILD_ID]`
|
||||
|
||||
@@ -664,7 +664,7 @@ DESCRIPTION
|
||||
view a build for your project
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/view.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/build/view.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/view.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/build/view.ts)_
|
||||
|
||||
## `eas channel:create [NAME]`
|
||||
|
||||
@@ -685,7 +685,7 @@ DESCRIPTION
|
||||
create a channel
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/channel/create.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/channel/create.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/channel/create.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/channel/create.ts)_
|
||||
|
||||
## `eas channel:edit [NAME]`
|
||||
|
||||
@@ -707,7 +707,7 @@ DESCRIPTION
|
||||
point a channel at a new branch
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/channel/edit.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/channel/edit.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/channel/edit.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/channel/edit.ts)_
|
||||
|
||||
## `eas channel:list`
|
||||
|
||||
@@ -727,7 +727,7 @@ DESCRIPTION
|
||||
list all channels
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/channel/list.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/channel/list.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/channel/list.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/channel/list.ts)_
|
||||
|
||||
## `eas channel:rollout [CHANNEL]`
|
||||
|
||||
@@ -760,7 +760,7 @@ DESCRIPTION
|
||||
Roll a new branch out on a channel incrementally.
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/channel/rollout.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/channel/rollout.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/channel/rollout.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/channel/rollout.ts)_
|
||||
|
||||
## `eas channel:view [NAME]`
|
||||
|
||||
@@ -783,7 +783,7 @@ DESCRIPTION
|
||||
view a channel
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/channel/view.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/channel/view.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/channel/view.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/channel/view.ts)_
|
||||
|
||||
## `eas config`
|
||||
|
||||
@@ -804,7 +804,7 @@ DESCRIPTION
|
||||
display project configuration (app.json + eas.json)
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/config.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/config.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/config.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/config.ts)_
|
||||
|
||||
## `eas credentials`
|
||||
|
||||
@@ -821,7 +821,7 @@ DESCRIPTION
|
||||
manage credentials
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/credentials/index.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/credentials/index.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/credentials/index.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/credentials/index.ts)_
|
||||
|
||||
## `eas credentials:configure-build`
|
||||
|
||||
@@ -839,7 +839,7 @@ DESCRIPTION
|
||||
Set up credentials for building your project.
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/credentials/configure-build.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/credentials/configure-build.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/credentials/configure-build.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/credentials/configure-build.ts)_
|
||||
|
||||
## `eas device:create`
|
||||
|
||||
@@ -853,7 +853,7 @@ DESCRIPTION
|
||||
register new Apple Devices to use for internal distribution
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/device/create.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/device/create.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/device/create.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/device/create.ts)_
|
||||
|
||||
## `eas device:delete`
|
||||
|
||||
@@ -873,7 +873,7 @@ DESCRIPTION
|
||||
remove a registered device from your account
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/device/delete.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/device/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/device/delete.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/device/delete.ts)_
|
||||
|
||||
## `eas device:list`
|
||||
|
||||
@@ -894,7 +894,7 @@ DESCRIPTION
|
||||
list all registered devices for your account
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/device/list.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/device/list.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/device/list.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/device/list.ts)_
|
||||
|
||||
## `eas device:rename`
|
||||
|
||||
@@ -915,7 +915,7 @@ DESCRIPTION
|
||||
rename a registered device
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/device/rename.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/device/rename.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/device/rename.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/device/rename.ts)_
|
||||
|
||||
## `eas device:view [UDID]`
|
||||
|
||||
@@ -929,7 +929,7 @@ DESCRIPTION
|
||||
view a device for your project
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/device/view.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/device/view.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/device/view.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/device/view.ts)_
|
||||
|
||||
## `eas diagnostics`
|
||||
|
||||
@@ -943,7 +943,7 @@ DESCRIPTION
|
||||
display environment info
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/diagnostics.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/diagnostics.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/diagnostics.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/diagnostics.ts)_
|
||||
|
||||
## `eas help [COMMAND]`
|
||||
|
||||
@@ -1050,7 +1050,7 @@ DESCRIPTION
|
||||
validate the local store configuration
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/metadata/lint.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/metadata/lint.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/metadata/lint.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/metadata/lint.ts)_
|
||||
|
||||
## `eas metadata:pull`
|
||||
|
||||
@@ -1067,7 +1067,7 @@ DESCRIPTION
|
||||
generate the local store configuration from the app stores
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/metadata/pull.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/metadata/pull.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/metadata/pull.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/metadata/pull.ts)_
|
||||
|
||||
## `eas metadata:push`
|
||||
|
||||
@@ -1084,7 +1084,7 @@ DESCRIPTION
|
||||
sync the local store configuration to the app stores
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/metadata/push.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/metadata/push.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/metadata/push.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/metadata/push.ts)_
|
||||
|
||||
## `eas onboarding [TARGET_PROJECT_DIRECTORY]`
|
||||
|
||||
@@ -1114,7 +1114,7 @@ DESCRIPTION
|
||||
open the project page in a web browser
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/open.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/open.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/open.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/open.ts)_
|
||||
|
||||
## `eas project:info`
|
||||
|
||||
@@ -1128,7 +1128,7 @@ DESCRIPTION
|
||||
information about the current project
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/project/info.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/project/info.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/project/info.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/project/info.ts)_
|
||||
|
||||
## `eas project:init`
|
||||
|
||||
@@ -1150,7 +1150,7 @@ ALIASES
|
||||
$ eas init
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/project/init.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/project/init.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/project/init.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/project/init.ts)_
|
||||
|
||||
## `eas project:onboarding [TARGET_PROJECT_DIRECTORY]`
|
||||
|
||||
@@ -1168,7 +1168,7 @@ ALIASES
|
||||
$ eas onboarding
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/project/onboarding.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/project/onboarding.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/project/onboarding.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/project/onboarding.ts)_
|
||||
|
||||
## `eas secret:create`
|
||||
|
||||
@@ -1191,7 +1191,7 @@ DESCRIPTION
|
||||
create an environment secret on the current project or owner account
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/secret/create.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/secret/create.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/secret/create.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/secret/create.ts)_
|
||||
|
||||
## `eas secret:delete`
|
||||
|
||||
@@ -1209,7 +1209,7 @@ DESCRIPTION
|
||||
delete an environment secret by ID
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/secret/delete.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/secret/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/secret/delete.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/secret/delete.ts)_
|
||||
|
||||
## `eas secret:list`
|
||||
|
||||
@@ -1223,7 +1223,7 @@ DESCRIPTION
|
||||
list environment secrets available for your current app
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/secret/list.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/secret/list.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/secret/list.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/secret/list.ts)_
|
||||
|
||||
## `eas secret:push`
|
||||
|
||||
@@ -1243,7 +1243,7 @@ DESCRIPTION
|
||||
read environment secrets from env file and store on the server
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/secret/push.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/secret/push.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/secret/push.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/secret/push.ts)_
|
||||
|
||||
## `eas submit`
|
||||
|
||||
@@ -1274,7 +1274,7 @@ ALIASES
|
||||
$ eas build:submit
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/submit.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/submit.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/submit.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/submit.ts)_
|
||||
|
||||
## `eas update`
|
||||
|
||||
@@ -1310,7 +1310,7 @@ DESCRIPTION
|
||||
publish an update group
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/index.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/update/index.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/index.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/update/index.ts)_
|
||||
|
||||
## `eas update:configure`
|
||||
|
||||
@@ -1328,7 +1328,7 @@ DESCRIPTION
|
||||
configure the project to support EAS Update
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/configure.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/update/configure.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/configure.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/update/configure.ts)_
|
||||
|
||||
## `eas update:delete GROUPID`
|
||||
|
||||
@@ -1349,7 +1349,7 @@ DESCRIPTION
|
||||
delete all the updates in an update group
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/delete.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/update/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/delete.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/update/delete.ts)_
|
||||
|
||||
## `eas update:list`
|
||||
|
||||
@@ -1371,7 +1371,7 @@ DESCRIPTION
|
||||
view the recent updates
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/list.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/update/list.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/list.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/update/list.ts)_
|
||||
|
||||
## `eas update:republish`
|
||||
|
||||
@@ -1399,7 +1399,7 @@ DESCRIPTION
|
||||
roll back to an existing update
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/republish.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/update/republish.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/republish.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/update/republish.ts)_
|
||||
|
||||
## `eas update:roll-back-to-embedded`
|
||||
|
||||
@@ -1427,7 +1427,7 @@ DESCRIPTION
|
||||
roll back to the embedded update
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/roll-back-to-embedded.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/update/roll-back-to-embedded.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/roll-back-to-embedded.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/update/roll-back-to-embedded.ts)_
|
||||
|
||||
## `eas update:rollback`
|
||||
|
||||
@@ -1447,7 +1447,7 @@ DESCRIPTION
|
||||
roll back to an embedded update or an existing update
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/rollback.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/update/rollback.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/rollback.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/update/rollback.ts)_
|
||||
|
||||
## `eas update:view GROUPID`
|
||||
|
||||
@@ -1467,7 +1467,7 @@ DESCRIPTION
|
||||
update group details
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/view.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/update/view.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/view.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/update/view.ts)_
|
||||
|
||||
## `eas webhook:create`
|
||||
|
||||
@@ -1488,7 +1488,7 @@ DESCRIPTION
|
||||
create a webhook
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/webhook/create.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/webhook/create.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/webhook/create.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/webhook/create.ts)_
|
||||
|
||||
## `eas webhook:delete [ID]`
|
||||
|
||||
@@ -1508,7 +1508,7 @@ DESCRIPTION
|
||||
delete a webhook
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/webhook/delete.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/webhook/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/webhook/delete.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/webhook/delete.ts)_
|
||||
|
||||
## `eas webhook:list`
|
||||
|
||||
@@ -1526,7 +1526,7 @@ DESCRIPTION
|
||||
list webhooks
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/webhook/list.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/webhook/list.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/webhook/list.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/webhook/list.ts)_
|
||||
|
||||
## `eas webhook:update`
|
||||
|
||||
@@ -1548,7 +1548,7 @@ DESCRIPTION
|
||||
update a webhook
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/webhook/update.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/webhook/update.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/webhook/update.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/webhook/update.ts)_
|
||||
|
||||
## `eas webhook:view ID`
|
||||
|
||||
@@ -1565,7 +1565,7 @@ DESCRIPTION
|
||||
view a webhook
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/webhook/view.ts](https://github.com/expo/eas-cli/blob/v10.2.2/packages/eas-cli/src/commands/webhook/view.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/webhook/view.ts](https://github.com/expo/eas-cli/blob/v10.2.4/packages/eas-cli/src/commands/webhook/view.ts)_
|
||||
|
||||
## `eas whoami`
|
||||
|
||||
|
||||
Generated
+3230
-282
File diff suppressed because it is too large.
Load diff
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "eas-cli",
|
||||
"description": "EAS command line tool",
|
||||
"version": "10.2.2",
|
||||
"version": "10.2.4",
|
||||
"author": "Expo <[email protected]>",
|
||||
"bin": {
|
||||
"eas": "./bin/run"
|
||||
@@ -13,8 +13,8 @@
|
||||
"@expo/config": "8.5.4",
|
||||
"@expo/config-plugins": "7.8.4",
|
||||
"@expo/config-types": "50.0.0",
|
||||
"@expo/eas-build-job": "1.0.129",
|
||||
"@expo/eas-json": "10.2.2",
|
||||
"@expo/eas-build-job": "1.0.130",
|
||||
"@expo/eas-json": "10.2.4",
|
||||
"@expo/json-file": "8.2.37",
|
||||
"@expo/logger": "1.0.117",
|
||||
"@expo/multipart-body-parser": "1.1.0",
|
||||
@@ -28,7 +28,7 @@
|
||||
"@expo/results": "1.0.0",
|
||||
"@expo/rudder-sdk-node": "1.1.1",
|
||||
"@expo/spawn-async": "1.7.0",
|
||||
"@expo/steps": "1.0.129",
|
||||
"@expo/steps": "1.0.130",
|
||||
"@expo/timeago.js": "1.0.0",
|
||||
"@oclif/core": "^1.26.2",
|
||||
"@oclif/plugin-autocomplete": "^2.3.10",
|
||||
|
||||
@@ -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.129';
|
||||
const PLUGIN_PACKAGE_VERSION = '1.0.131';
|
||||
|
||||
export enum LocalBuildMode {
|
||||
/**
|
||||
|
||||
@@ -60,6 +60,7 @@ export async function collectMetadataAsync<T extends Platform>(
|
||||
requiredPackageManager: ctx.requiredPackageManager ?? undefined,
|
||||
selectedImage: ctx.buildProfile.image,
|
||||
customNodeVersion: ctx.buildProfile.node,
|
||||
environment: ctx.buildProfile.environment,
|
||||
simulator: 'simulator' in ctx.buildProfile && ctx.buildProfile.simulator,
|
||||
};
|
||||
return sanitizeMetadata(metadata);
|
||||
|
||||
@@ -142,6 +142,24 @@ export async function runBuildAndSubmitAsync(
|
||||
Log.warn(
|
||||
`The "image" field in the build profile "${buildProfile.profileName}" is set to "${buildProfile.profile.image}". This tag is deprecated and will be removed in the future. Use other images or tags listed here: https://docs.expo.dev/build-reference/infrastructure/`
|
||||
);
|
||||
} else if (
|
||||
buildProfile.profile.image &&
|
||||
[
|
||||
'ubuntu-20.04-jdk-11-ndk-r19c',
|
||||
'ubuntu-20.04-jdk-8-ndk-r19c',
|
||||
'ubuntu-20.04-jdk-11-ndk-r21e',
|
||||
'ubuntu-20.04-jdk-8-ndk-r21e',
|
||||
'ubuntu-22.04-jdk-8-ndk-r21e',
|
||||
'ubuntu-20.04-jdk-11-ndk-r23b',
|
||||
].includes(buildProfile.profile.image)
|
||||
) {
|
||||
Log.warn(
|
||||
`The "image" field in the build profile "${buildProfile.profileName}" is set to "${
|
||||
buildProfile.profile.image
|
||||
}". This image is deprecated and will be removed on September 1st, 2024. ${learnMore(
|
||||
'https://expo.dev/changelog/2024/07-12-eas-build-upcoming-android-images-updates'
|
||||
)}`
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,21 @@
|
||||
import { Flags } from '@oclif/core';
|
||||
|
||||
import {
|
||||
EnvironmentVariableEnvironment,
|
||||
EnvironmentVariableScope,
|
||||
EnvironmentVariableVisibility,
|
||||
} from '../graphql/generated';
|
||||
|
||||
// NOTE: not exactly true, but, provided mapToLowercase and upperCaseAsync
|
||||
// are used in tandem, it saves on unnecessary typying in commands
|
||||
async function upperCaseAsync<T>(input: string): Promise<T> {
|
||||
return input.toUpperCase() as T;
|
||||
}
|
||||
|
||||
function mapToLowercase<T extends string>(options: T[]): T[] {
|
||||
return options.map(option => option.toLowerCase()) as T[];
|
||||
}
|
||||
|
||||
export const EasNonInteractiveAndJsonFlags = {
|
||||
json: Flags.boolean({
|
||||
description: 'Enable JSON output, non-JSON messages will be printed to stderr.',
|
||||
@@ -10,6 +26,47 @@ export const EasNonInteractiveAndJsonFlags = {
|
||||
}),
|
||||
};
|
||||
|
||||
export const EASEnvironmentFlag = {
|
||||
environment: Flags.enum<EnvironmentVariableEnvironment>({
|
||||
description: "Environment variable's environment",
|
||||
parse: upperCaseAsync,
|
||||
options: mapToLowercase([
|
||||
EnvironmentVariableEnvironment.Development,
|
||||
EnvironmentVariableEnvironment.Preview,
|
||||
EnvironmentVariableEnvironment.Production,
|
||||
]),
|
||||
}),
|
||||
};
|
||||
|
||||
export const EASVariableFormatFlag = {
|
||||
format: Flags.enum({
|
||||
description: 'Output format',
|
||||
options: ['long', 'short'],
|
||||
default: 'short',
|
||||
}),
|
||||
};
|
||||
|
||||
export const EASVariableVisibilityFlag = {
|
||||
visibility: Flags.enum<EnvironmentVariableVisibility>({
|
||||
description: 'Visibility of the variable',
|
||||
options: mapToLowercase([
|
||||
EnvironmentVariableVisibility.Secret,
|
||||
EnvironmentVariableVisibility.Sensitive,
|
||||
EnvironmentVariableVisibility.Public,
|
||||
]),
|
||||
parse: upperCaseAsync,
|
||||
}),
|
||||
};
|
||||
|
||||
export const EASVariableScopeFlag = {
|
||||
scope: Flags.enum<EnvironmentVariableScope>({
|
||||
description: 'Scope for the variable',
|
||||
options: mapToLowercase([EnvironmentVariableScope.Shared, EnvironmentVariableScope.Project]),
|
||||
parse: upperCaseAsync,
|
||||
default: EnvironmentVariableScope.Project,
|
||||
}),
|
||||
};
|
||||
|
||||
export const EASNonInteractiveFlag = {
|
||||
'non-interactive': Flags.boolean({
|
||||
description: 'Run the command in non-interactive mode.',
|
||||
|
||||
+275
@@ -0,0 +1,275 @@
|
||||
import { Flags } from '@oclif/core';
|
||||
import chalk from 'chalk';
|
||||
|
||||
import EasCommand from '../../commandUtils/EasCommand';
|
||||
import {
|
||||
EASEnvironmentFlag,
|
||||
EASNonInteractiveFlag,
|
||||
EASVariableScopeFlag,
|
||||
EASVariableVisibilityFlag,
|
||||
} from '../../commandUtils/flags';
|
||||
import {
|
||||
EnvironmentVariableEnvironment,
|
||||
EnvironmentVariableScope,
|
||||
EnvironmentVariableVisibility,
|
||||
} from '../../graphql/generated';
|
||||
import { EnvironmentVariableMutation } from '../../graphql/mutations/EnvironmentVariableMutation';
|
||||
import { EnvironmentVariablesQuery } from '../../graphql/queries/EnvironmentVariablesQuery';
|
||||
import Log from '../../log';
|
||||
import {
|
||||
getDisplayNameForProjectIdAsync,
|
||||
getOwnerAccountForProjectIdAsync,
|
||||
} from '../../project/projectUtils';
|
||||
import { confirmAsync } from '../../prompts';
|
||||
import {
|
||||
promptVariableEnvironmentAsync,
|
||||
promptVariableNameAsync,
|
||||
promptVariableValueAsync,
|
||||
} from '../../utils/prompts';
|
||||
|
||||
type CreateFlags = {
|
||||
name?: string;
|
||||
value?: string;
|
||||
link?: boolean;
|
||||
force?: boolean;
|
||||
visibility?: EnvironmentVariableVisibility;
|
||||
scope?: EnvironmentVariableScope;
|
||||
environment?: EnvironmentVariableEnvironment;
|
||||
'non-interactive': boolean;
|
||||
};
|
||||
|
||||
export default class EnvironmentVariableCreate extends EasCommand {
|
||||
static override description =
|
||||
'create an environment variable on the current project or owner account';
|
||||
|
||||
static override hidden = true;
|
||||
|
||||
static override flags = {
|
||||
name: Flags.string({
|
||||
description: 'Name of the variable',
|
||||
}),
|
||||
value: Flags.string({
|
||||
description: 'Text value or the variable',
|
||||
}),
|
||||
link: Flags.boolean({
|
||||
description: 'Link shared variable to the current project',
|
||||
}),
|
||||
force: Flags.boolean({
|
||||
description: 'Overwrite existing variable',
|
||||
default: false,
|
||||
}),
|
||||
...EASVariableVisibilityFlag,
|
||||
...EASVariableScopeFlag,
|
||||
...EASEnvironmentFlag,
|
||||
...EASNonInteractiveFlag,
|
||||
};
|
||||
|
||||
static override contextDefinition = {
|
||||
...this.ContextOptions.ProjectConfig,
|
||||
...this.ContextOptions.Analytics,
|
||||
...this.ContextOptions.LoggedIn,
|
||||
};
|
||||
|
||||
async runAsync(): Promise<void> {
|
||||
const { flags } = await this.parse(EnvironmentVariableCreate);
|
||||
|
||||
let {
|
||||
name,
|
||||
value,
|
||||
scope,
|
||||
'non-interactive': nonInteractive,
|
||||
environment,
|
||||
visibility,
|
||||
link,
|
||||
force,
|
||||
} = this.validateFlags(flags);
|
||||
|
||||
const {
|
||||
privateProjectConfig: { projectId },
|
||||
loggedIn: { graphqlClient },
|
||||
} = await this.getContextAsync(EnvironmentVariableCreate, {
|
||||
nonInteractive,
|
||||
});
|
||||
|
||||
const [projectDisplayName, ownerAccount] = await Promise.all([
|
||||
getDisplayNameForProjectIdAsync(graphqlClient, projectId),
|
||||
getOwnerAccountForProjectIdAsync(graphqlClient, projectId),
|
||||
]);
|
||||
|
||||
if (!name) {
|
||||
name = await promptVariableNameAsync(nonInteractive);
|
||||
}
|
||||
|
||||
let overwrite = false;
|
||||
visibility = visibility ?? EnvironmentVariableVisibility.Public;
|
||||
|
||||
if (!value) {
|
||||
value = await promptVariableValueAsync({
|
||||
nonInteractive,
|
||||
hidden: visibility !== EnvironmentVariableVisibility.Public,
|
||||
});
|
||||
}
|
||||
|
||||
if (scope === EnvironmentVariableScope.Project) {
|
||||
if (!environment) {
|
||||
environment = await promptVariableEnvironmentAsync(nonInteractive);
|
||||
}
|
||||
const existingVariables = await EnvironmentVariablesQuery.byAppIdAsync(
|
||||
graphqlClient,
|
||||
projectId,
|
||||
environment
|
||||
);
|
||||
const existingVariable = existingVariables.find(variable => variable.name === name);
|
||||
|
||||
if (existingVariable) {
|
||||
if (existingVariable.scope === EnvironmentVariableScope.Shared) {
|
||||
if (!nonInteractive) {
|
||||
const confirmation = await confirmAsync({
|
||||
message: `Shared variable ${name} already exists on this project. Do you want to unlink it first?`,
|
||||
});
|
||||
|
||||
if (!confirmation) {
|
||||
Log.log('Aborting');
|
||||
throw new Error(`Shared variable ${name} already exists on this project.`);
|
||||
}
|
||||
} else if (!force) {
|
||||
throw new Error(
|
||||
`Shared variable ${name} already exists on this project. Use --force to overwrite it.`
|
||||
);
|
||||
}
|
||||
|
||||
await EnvironmentVariableMutation.unlinkSharedEnvironmentVariableAsync(
|
||||
graphqlClient,
|
||||
existingVariable.id,
|
||||
projectId,
|
||||
environment
|
||||
);
|
||||
Log.withTick(
|
||||
`Unlinking shared variable ${chalk.bold(name)} on project ${chalk.bold(
|
||||
projectDisplayName
|
||||
)}.`
|
||||
);
|
||||
} else {
|
||||
if (!nonInteractive) {
|
||||
const confirmation = await confirmAsync({
|
||||
message: `Variable ${name} already exists on this project. Do you want to overwrite it?`,
|
||||
});
|
||||
|
||||
if (!confirmation) {
|
||||
Log.log('Aborting');
|
||||
throw new Error(
|
||||
`Variable ${name} already exists on this project. Use --force to overwrite it.`
|
||||
);
|
||||
}
|
||||
} else if (!force) {
|
||||
throw new Error(
|
||||
`Variable ${name} already exists on this project. Use --force to overwrite it.`
|
||||
);
|
||||
}
|
||||
overwrite = true;
|
||||
}
|
||||
}
|
||||
|
||||
const variable = await EnvironmentVariableMutation.createForAppAsync(
|
||||
graphqlClient,
|
||||
{
|
||||
name,
|
||||
value,
|
||||
environment,
|
||||
visibility,
|
||||
overwrite,
|
||||
},
|
||||
projectId
|
||||
);
|
||||
if (!variable) {
|
||||
throw new Error(
|
||||
`Could not create variable with name ${name} on project ${projectDisplayName}`
|
||||
);
|
||||
}
|
||||
|
||||
Log.withTick(
|
||||
`Created a new variable ${chalk.bold(name)} on project ${chalk.bold(projectDisplayName)}.`
|
||||
);
|
||||
} else if (scope === EnvironmentVariableScope.Shared) {
|
||||
const sharedVariables = await EnvironmentVariablesQuery.sharedAsync(graphqlClient, projectId);
|
||||
const existingVariable = sharedVariables.find(variable => variable.name === name);
|
||||
if (existingVariable) {
|
||||
throw new Error(
|
||||
`Shared variable with ${name} name already exists on this account.\n` +
|
||||
`Use a different name or delete the existing variable on website or by using eas env:delete --name ${name} --scope shared command.`
|
||||
);
|
||||
}
|
||||
|
||||
if (environment && !link) {
|
||||
const confirmation = await confirmAsync({
|
||||
message: `Unexpected argument: --environment can only be used with --link flag. Do you want to link the variable to the current project?`,
|
||||
});
|
||||
|
||||
if (!confirmation) {
|
||||
Log.log('Aborting');
|
||||
throw new Error('Unexpected argument: --environment can only be used with --link flag.');
|
||||
}
|
||||
}
|
||||
|
||||
if (!environment && link) {
|
||||
environment = await promptVariableEnvironmentAsync(nonInteractive);
|
||||
}
|
||||
|
||||
const variable = await EnvironmentVariableMutation.createSharedVariableAsync(
|
||||
graphqlClient,
|
||||
{
|
||||
name,
|
||||
value,
|
||||
visibility,
|
||||
},
|
||||
ownerAccount.id
|
||||
);
|
||||
|
||||
if (!variable) {
|
||||
throw new Error(
|
||||
`Could not create variable with name ${name} on account ${ownerAccount.name}`
|
||||
);
|
||||
}
|
||||
|
||||
Log.withTick(
|
||||
`Created a new variable ${chalk.bold(name)} on account ${chalk.bold(ownerAccount.name)}.`
|
||||
);
|
||||
|
||||
if (link && environment) {
|
||||
Log.withTick(
|
||||
`Linking shared variable ${chalk.bold(name)} to project ${chalk.bold(
|
||||
projectDisplayName
|
||||
)}.`
|
||||
);
|
||||
await EnvironmentVariableMutation.linkSharedEnvironmentVariableAsync(
|
||||
graphqlClient,
|
||||
variable.id,
|
||||
projectId,
|
||||
environment
|
||||
);
|
||||
Log.withTick(
|
||||
`Linked shared variable ${chalk.bold(name)} to project ${chalk.bold(projectDisplayName)}.`
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private validateFlags(flags: CreateFlags): CreateFlags {
|
||||
if (flags.scope !== EnvironmentVariableScope.Shared && flags.link) {
|
||||
throw new Error(
|
||||
`Unexpected argument: --link can only be used when creating shared variables`
|
||||
);
|
||||
}
|
||||
if (
|
||||
flags.scope === EnvironmentVariableScope.Shared &&
|
||||
flags.environment &&
|
||||
!flags.link &&
|
||||
flags['non-interactive']
|
||||
) {
|
||||
throw new Error(
|
||||
'Unexpected argument: --environment in non-interactive mode can only be used with --link flag.'
|
||||
);
|
||||
}
|
||||
return flags;
|
||||
}
|
||||
}
|
||||
+128
@@ -0,0 +1,128 @@
|
||||
import { Flags } from '@oclif/core';
|
||||
import chalk from 'chalk';
|
||||
|
||||
import EasCommand from '../../commandUtils/EasCommand';
|
||||
import {
|
||||
EASEnvironmentFlag,
|
||||
EASNonInteractiveFlag,
|
||||
EASVariableScopeFlag,
|
||||
} from '../../commandUtils/flags';
|
||||
import { EnvironmentVariableEnvironment, EnvironmentVariableScope } from '../../graphql/generated';
|
||||
import { EnvironmentVariableMutation } from '../../graphql/mutations/EnvironmentVariableMutation';
|
||||
import { EnvironmentVariablesQuery } from '../../graphql/queries/EnvironmentVariablesQuery';
|
||||
import Log from '../../log';
|
||||
import { promptAsync, toggleConfirmAsync } from '../../prompts';
|
||||
import { promptVariableEnvironmentAsync } from '../../utils/prompts';
|
||||
|
||||
type DeleteFlags = {
|
||||
name?: string;
|
||||
environment?: EnvironmentVariableEnvironment;
|
||||
'non-interactive': boolean;
|
||||
scope?: EnvironmentVariableScope;
|
||||
};
|
||||
|
||||
export default class EnvironmentVariableDelete extends EasCommand {
|
||||
static override description = 'delete an environment variable by name';
|
||||
|
||||
static override hidden = true;
|
||||
|
||||
static override flags = {
|
||||
name: Flags.string({
|
||||
description: 'Name of the variable to delete',
|
||||
}),
|
||||
...EASVariableScopeFlag,
|
||||
...EASEnvironmentFlag,
|
||||
...EASNonInteractiveFlag,
|
||||
};
|
||||
|
||||
static override contextDefinition = {
|
||||
...this.ContextOptions.ProjectConfig,
|
||||
...this.ContextOptions.LoggedIn,
|
||||
};
|
||||
|
||||
async runAsync(): Promise<void> {
|
||||
const { flags } = await this.parse(EnvironmentVariableDelete);
|
||||
let { name, environment, 'non-interactive': nonInteractive, scope } = this.validateFlags(flags);
|
||||
const {
|
||||
privateProjectConfig: { projectId },
|
||||
loggedIn: { graphqlClient },
|
||||
} = await this.getContextAsync(EnvironmentVariableDelete, {
|
||||
nonInteractive,
|
||||
});
|
||||
|
||||
if (scope === EnvironmentVariableScope.Project) {
|
||||
if (!environment) {
|
||||
environment = await promptVariableEnvironmentAsync(nonInteractive);
|
||||
}
|
||||
}
|
||||
|
||||
const variables =
|
||||
scope === EnvironmentVariableScope.Project && environment
|
||||
? await EnvironmentVariablesQuery.byAppIdAsync(graphqlClient, projectId, environment)
|
||||
: await EnvironmentVariablesQuery.sharedAsync(graphqlClient, projectId);
|
||||
|
||||
if (!name) {
|
||||
({ name } = await promptAsync({
|
||||
type: 'select',
|
||||
name: 'name',
|
||||
message: 'Pick the variable to be deleted:',
|
||||
choices: variables
|
||||
.filter(({ scope: variableScope }) => scope === variableScope)
|
||||
.map(variable => ({
|
||||
title: variable.name,
|
||||
value: variable.name,
|
||||
})),
|
||||
}));
|
||||
|
||||
if (!name) {
|
||||
throw new Error(
|
||||
`Environment variable wasn't selected. Run the command again and select existing variable or run it with ${chalk.bold(
|
||||
'--name VARIABLE_NAME'
|
||||
)} flag to fix the issue.`
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
const selectedVariable = variables.find(variable => variable.name === name);
|
||||
|
||||
if (!selectedVariable) {
|
||||
throw new Error(`Variable "${name}" not found.`);
|
||||
}
|
||||
|
||||
if (!nonInteractive) {
|
||||
Log.addNewLineIfNone();
|
||||
Log.warn(`You are about to permanently delete variable ${selectedVariable.name}.`);
|
||||
Log.warn('This action is irreversible.');
|
||||
Log.newLine();
|
||||
const confirmed = await toggleConfirmAsync({
|
||||
message: `Are you sure you wish to proceed?${
|
||||
selectedVariable.scope === EnvironmentVariableScope.Shared
|
||||
? ' This variable is applied across your whole account and may affect multiple apps.'
|
||||
: ''
|
||||
}`,
|
||||
});
|
||||
if (!confirmed) {
|
||||
Log.error(`Canceled deletion of variable ${selectedVariable.name}.`);
|
||||
throw new Error(`Variable "${name}" not deleted.`);
|
||||
}
|
||||
}
|
||||
|
||||
await EnvironmentVariableMutation.deleteAsync(graphqlClient, selectedVariable.id);
|
||||
|
||||
Log.withTick(`️Deleted variable ${selectedVariable.name}".`);
|
||||
}
|
||||
|
||||
private validateFlags(flags: DeleteFlags): DeleteFlags {
|
||||
if (flags['non-interactive']) {
|
||||
if (!flags.name) {
|
||||
throw new Error(
|
||||
`Environment variable needs 'name' to be specified when running in non-interactive mode. Run the command with ${chalk.bold(
|
||||
'--name VARIABLE_NAME'
|
||||
)} flag to fix the issue`
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return flags;
|
||||
}
|
||||
}
|
||||
+144
@@ -0,0 +1,144 @@
|
||||
import { Flags } from '@oclif/core';
|
||||
import chalk from 'chalk';
|
||||
|
||||
import EasCommand from '../../commandUtils/EasCommand';
|
||||
import { ExpoGraphqlClient } from '../../commandUtils/context/contextUtils/createGraphqlClient';
|
||||
import {
|
||||
EASEnvironmentFlag,
|
||||
EASNonInteractiveFlag,
|
||||
EASVariableFormatFlag,
|
||||
EASVariableScopeFlag,
|
||||
} from '../../commandUtils/flags';
|
||||
import {
|
||||
EnvironmentVariableEnvironment,
|
||||
EnvironmentVariableFragment,
|
||||
EnvironmentVariableScope,
|
||||
} from '../../graphql/generated';
|
||||
import { EnvironmentVariablesQuery } from '../../graphql/queries/EnvironmentVariablesQuery';
|
||||
import Log from '../../log';
|
||||
import { formatVariable } from '../../utils/formatVariable';
|
||||
import { promptVariableEnvironmentAsync, promptVariableNameAsync } from '../../utils/prompts';
|
||||
|
||||
type GetFlags = {
|
||||
name?: string;
|
||||
environment?: EnvironmentVariableEnvironment;
|
||||
'non-interactive': boolean;
|
||||
format?: string;
|
||||
scope: EnvironmentVariableScope;
|
||||
};
|
||||
|
||||
export default class EnvironmentVariableGet extends EasCommand {
|
||||
static override description = 'get environment variable';
|
||||
|
||||
static override hidden = true;
|
||||
|
||||
static override contextDefinition = {
|
||||
...this.ContextOptions.ProjectConfig,
|
||||
...this.ContextOptions.LoggedIn,
|
||||
};
|
||||
|
||||
static override flags = {
|
||||
name: Flags.string({
|
||||
description: 'Name of the variable',
|
||||
}),
|
||||
...EASVariableFormatFlag,
|
||||
...EASVariableScopeFlag,
|
||||
...EASNonInteractiveFlag,
|
||||
...EASEnvironmentFlag,
|
||||
};
|
||||
|
||||
async runAsync(): Promise<void> {
|
||||
const { flags } = await this.parse(EnvironmentVariableGet);
|
||||
|
||||
let {
|
||||
environment,
|
||||
name,
|
||||
'non-interactive': nonInteractive,
|
||||
format,
|
||||
scope,
|
||||
} = this.validateFlags(flags);
|
||||
|
||||
const {
|
||||
privateProjectConfig: { projectId },
|
||||
loggedIn: { graphqlClient },
|
||||
} = await this.getContextAsync(EnvironmentVariableGet, {
|
||||
nonInteractive,
|
||||
});
|
||||
|
||||
if (!name) {
|
||||
name = await promptVariableNameAsync(nonInteractive);
|
||||
}
|
||||
|
||||
if (!environment && scope === EnvironmentVariableScope.Project) {
|
||||
environment = await promptVariableEnvironmentAsync(nonInteractive);
|
||||
}
|
||||
|
||||
const variable = await getVariableAsync(graphqlClient, scope, projectId, name, environment);
|
||||
|
||||
if (!variable) {
|
||||
Log.error(`Variable with name "${name}" not found`);
|
||||
return;
|
||||
}
|
||||
if (!variable.value) {
|
||||
throw new Error(
|
||||
`${chalk.bold(
|
||||
variable.name
|
||||
)} is a secret variable and cannot be displayed once it has been created.`
|
||||
);
|
||||
}
|
||||
|
||||
if (format === 'short') {
|
||||
Log.log(`${chalk.bold(variable.name)}=${variable.value}`);
|
||||
} else {
|
||||
Log.log(formatVariable(variable));
|
||||
}
|
||||
}
|
||||
|
||||
private validateFlags(flags: GetFlags): GetFlags {
|
||||
if (flags.environment && flags.scope === EnvironmentVariableScope.Shared) {
|
||||
throw new Error(`Unexpected argument: --environment can only be used with project variables`);
|
||||
}
|
||||
if (flags['non-interactive']) {
|
||||
if (!flags.name) {
|
||||
throw new Error('Variable name is required. Run the command with --name flag.');
|
||||
}
|
||||
if (!flags.scope) {
|
||||
throw new Error('Scope is required. Run the command with --scope flag.');
|
||||
}
|
||||
if (!flags.environment && flags.scope === EnvironmentVariableScope.Project) {
|
||||
throw new Error('Environment is required.');
|
||||
}
|
||||
}
|
||||
return flags;
|
||||
}
|
||||
}
|
||||
|
||||
async function getVariableAsync(
|
||||
graphqlClient: ExpoGraphqlClient,
|
||||
scope: string,
|
||||
projectId: string,
|
||||
name: string,
|
||||
environment: string | undefined
|
||||
): Promise<EnvironmentVariableFragment | null> {
|
||||
if (!environment && scope === EnvironmentVariableScope.Project) {
|
||||
throw new Error('Environment is required.');
|
||||
}
|
||||
if (environment && scope === EnvironmentVariableScope.Project) {
|
||||
const appVariables = await EnvironmentVariablesQuery.byAppIdAsync(
|
||||
graphqlClient,
|
||||
projectId,
|
||||
environment,
|
||||
[name]
|
||||
);
|
||||
return appVariables[0];
|
||||
}
|
||||
|
||||
if (scope === EnvironmentVariableScope.Shared) {
|
||||
const sharedVariables = await EnvironmentVariablesQuery.sharedAsync(graphqlClient, projectId, [
|
||||
name,
|
||||
]);
|
||||
return sharedVariables[0];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
+83
@@ -0,0 +1,83 @@
|
||||
import { Flags } from '@oclif/core';
|
||||
import chalk from 'chalk';
|
||||
|
||||
import EasCommand from '../../commandUtils/EasCommand';
|
||||
import { EASEnvironmentFlag, EASNonInteractiveFlag } from '../../commandUtils/flags';
|
||||
import { EnvironmentVariableMutation } from '../../graphql/mutations/EnvironmentVariableMutation';
|
||||
import { EnvironmentVariablesQuery } from '../../graphql/queries/EnvironmentVariablesQuery';
|
||||
import Log from '../../log';
|
||||
import { getDisplayNameForProjectIdAsync } from '../../project/projectUtils';
|
||||
import { selectAsync } from '../../prompts';
|
||||
import { promptVariableEnvironmentAsync } from '../../utils/prompts';
|
||||
|
||||
export default class EnvironmentVariableLink extends EasCommand {
|
||||
static override description = 'link a shared environment variable to the current project';
|
||||
|
||||
static override hidden = true;
|
||||
|
||||
static override flags = {
|
||||
name: Flags.string({
|
||||
description: 'Name of the variable',
|
||||
}),
|
||||
...EASEnvironmentFlag,
|
||||
...EASNonInteractiveFlag,
|
||||
};
|
||||
|
||||
static override contextDefinition = {
|
||||
...this.ContextOptions.ProjectConfig,
|
||||
...this.ContextOptions.LoggedIn,
|
||||
};
|
||||
|
||||
async runAsync(): Promise<void> {
|
||||
let {
|
||||
flags: { name, 'non-interactive': nonInteractive, environment },
|
||||
} = await this.parse(EnvironmentVariableLink);
|
||||
const {
|
||||
privateProjectConfig: { projectId },
|
||||
loggedIn: { graphqlClient },
|
||||
} = await this.getContextAsync(EnvironmentVariableLink, {
|
||||
nonInteractive,
|
||||
});
|
||||
|
||||
const projectDisplayName = await getDisplayNameForProjectIdAsync(graphqlClient, projectId);
|
||||
const variables = await EnvironmentVariablesQuery.sharedAsync(graphqlClient, projectId);
|
||||
|
||||
if (!name) {
|
||||
name = await selectAsync(
|
||||
'Select shared variable',
|
||||
variables.map(variable => ({
|
||||
title: variable.name,
|
||||
value: variable.name,
|
||||
}))
|
||||
);
|
||||
}
|
||||
|
||||
const selectedVariable = variables.find(variable => variable.name === name);
|
||||
|
||||
if (!selectedVariable) {
|
||||
throw new Error(`Shared variable ${name} doesn't exist`);
|
||||
}
|
||||
|
||||
if (!environment) {
|
||||
environment = await promptVariableEnvironmentAsync(nonInteractive);
|
||||
}
|
||||
|
||||
const linkedVariable = await EnvironmentVariableMutation.linkSharedEnvironmentVariableAsync(
|
||||
graphqlClient,
|
||||
selectedVariable.id,
|
||||
projectId,
|
||||
environment
|
||||
);
|
||||
if (!linkedVariable) {
|
||||
throw new Error(
|
||||
`Could not link variable with name ${selectedVariable.name} to project with id ${projectId}`
|
||||
);
|
||||
}
|
||||
|
||||
Log.withTick(
|
||||
`Linked variable ${chalk.bold(linkedVariable.name)} to project ${chalk.bold(
|
||||
projectDisplayName
|
||||
)}.`
|
||||
);
|
||||
}
|
||||
}
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
import chalk from 'chalk';
|
||||
|
||||
import EasCommand from '../../commandUtils/EasCommand';
|
||||
import {
|
||||
EASEnvironmentFlag,
|
||||
EASVariableFormatFlag,
|
||||
EASVariableScopeFlag,
|
||||
} from '../../commandUtils/flags';
|
||||
import { EnvironmentVariableScope } from '../../graphql/generated';
|
||||
import { EnvironmentVariablesQuery } from '../../graphql/queries/EnvironmentVariablesQuery';
|
||||
import Log from '../../log';
|
||||
import { formatVariable } from '../../utils/formatVariable';
|
||||
import { promptVariableEnvironmentAsync } from '../../utils/prompts';
|
||||
|
||||
export default class EnvironmentValueList extends EasCommand {
|
||||
static override description = 'list environment variables for the current project';
|
||||
|
||||
static override hidden = true;
|
||||
|
||||
static override contextDefinition = {
|
||||
...this.ContextOptions.ProjectConfig,
|
||||
...this.ContextOptions.LoggedIn,
|
||||
};
|
||||
|
||||
static override flags = {
|
||||
...EASVariableFormatFlag,
|
||||
...EASVariableScopeFlag,
|
||||
...EASEnvironmentFlag,
|
||||
};
|
||||
|
||||
async runAsync(): Promise<void> {
|
||||
let {
|
||||
flags: { environment, format, scope },
|
||||
} = await this.parse(EnvironmentValueList);
|
||||
const {
|
||||
privateProjectConfig: { projectId },
|
||||
loggedIn: { graphqlClient },
|
||||
} = await this.getContextAsync(EnvironmentValueList, {
|
||||
nonInteractive: true,
|
||||
});
|
||||
|
||||
if (scope === EnvironmentVariableScope.Project && !environment) {
|
||||
environment = await promptVariableEnvironmentAsync(false);
|
||||
}
|
||||
|
||||
const variables =
|
||||
scope === EnvironmentVariableScope.Project && environment
|
||||
? await EnvironmentVariablesQuery.byAppIdAsync(graphqlClient, projectId, environment)
|
||||
: await EnvironmentVariablesQuery.sharedAsync(graphqlClient, projectId);
|
||||
|
||||
if (format === 'short') {
|
||||
for (const variable of variables) {
|
||||
// TODO: Add Learn more link
|
||||
Log.log(
|
||||
`${chalk.bold(variable.name)}=${
|
||||
variable.value ??
|
||||
"***** (This is a secret env variable that can only be accessed on EAS builder and can't be read in any UI. Learn more.)"
|
||||
}`
|
||||
);
|
||||
}
|
||||
} else {
|
||||
if (scope === EnvironmentVariableScope.Shared) {
|
||||
Log.log(chalk.bold('Shared variables for this account:'));
|
||||
} else {
|
||||
Log.log(chalk.bold(`Variables for this project for environment ${environment}:`));
|
||||
}
|
||||
Log.log(
|
||||
variables.map(variable => formatVariable(variable)).join(`\n\n${chalk.dim('———')}\n\n`)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
+97
@@ -0,0 +1,97 @@
|
||||
import { Flags } from '@oclif/core';
|
||||
import chalk from 'chalk';
|
||||
|
||||
import EasCommand from '../../commandUtils/EasCommand';
|
||||
import { EASEnvironmentFlag, EASNonInteractiveFlag } from '../../commandUtils/flags';
|
||||
import { EnvironmentVariableScope } from '../../graphql/generated';
|
||||
import { EnvironmentVariableMutation } from '../../graphql/mutations/EnvironmentVariableMutation';
|
||||
import { EnvironmentVariablesQuery } from '../../graphql/queries/EnvironmentVariablesQuery';
|
||||
import Log from '../../log';
|
||||
import { getDisplayNameForProjectIdAsync } from '../../project/projectUtils';
|
||||
import { selectAsync } from '../../prompts';
|
||||
import { promptVariableEnvironmentAsync } from '../../utils/prompts';
|
||||
|
||||
export default class EnvironmentVariableUnlink extends EasCommand {
|
||||
static override description = 'unlink a shared environment variable to the current project';
|
||||
|
||||
static override hidden = true;
|
||||
|
||||
static override flags = {
|
||||
name: Flags.string({
|
||||
description: 'Name of the variable',
|
||||
}),
|
||||
...EASEnvironmentFlag,
|
||||
...EASNonInteractiveFlag,
|
||||
};
|
||||
|
||||
static override contextDefinition = {
|
||||
...this.ContextOptions.ProjectConfig,
|
||||
...this.ContextOptions.LoggedIn,
|
||||
};
|
||||
|
||||
async runAsync(): Promise<void> {
|
||||
let {
|
||||
flags: { name, 'non-interactive': nonInteractive, environment },
|
||||
} = await this.parse(EnvironmentVariableUnlink);
|
||||
const {
|
||||
privateProjectConfig: { projectId },
|
||||
loggedIn: { graphqlClient },
|
||||
} = await this.getContextAsync(EnvironmentVariableUnlink, {
|
||||
nonInteractive,
|
||||
});
|
||||
|
||||
if (!environment) {
|
||||
environment = await promptVariableEnvironmentAsync(nonInteractive);
|
||||
}
|
||||
|
||||
const projectDisplayName = await getDisplayNameForProjectIdAsync(graphqlClient, projectId);
|
||||
|
||||
const appVariables = await EnvironmentVariablesQuery.byAppIdAsync(
|
||||
graphqlClient,
|
||||
projectId,
|
||||
environment
|
||||
);
|
||||
const linkedVariables = appVariables.filter(
|
||||
({ scope }) => scope === EnvironmentVariableScope.Shared
|
||||
);
|
||||
|
||||
if (linkedVariables.length === 0) {
|
||||
throw new Error(`There are no linked shared env variables for project ${projectDisplayName}`);
|
||||
}
|
||||
|
||||
if (!name) {
|
||||
name = await selectAsync(
|
||||
'Select shared variable to unlink',
|
||||
linkedVariables.map(variable => ({
|
||||
title: variable.name,
|
||||
value: variable.name,
|
||||
}))
|
||||
);
|
||||
}
|
||||
|
||||
const selectedVariable = linkedVariables.find(variable => variable.name === name);
|
||||
|
||||
if (!selectedVariable) {
|
||||
throw new Error(`Shared variable ${name} doesn't exist`);
|
||||
}
|
||||
|
||||
const unlinkedVariable = await EnvironmentVariableMutation.unlinkSharedEnvironmentVariableAsync(
|
||||
graphqlClient,
|
||||
selectedVariable.id,
|
||||
projectId,
|
||||
environment
|
||||
);
|
||||
|
||||
if (!unlinkedVariable) {
|
||||
throw new Error(
|
||||
`Could not unlink variable with name ${selectedVariable.name} from project ${projectDisplayName}`
|
||||
);
|
||||
}
|
||||
|
||||
Log.withTick(
|
||||
`Unlinked variable ${chalk.bold(unlinkedVariable.name)} from the project ${chalk.bold(
|
||||
projectDisplayName
|
||||
)}.`
|
||||
);
|
||||
}
|
||||
}
|
||||
+206
@@ -0,0 +1,206 @@
|
||||
import { Flags } from '@oclif/core';
|
||||
import chalk from 'chalk';
|
||||
|
||||
import EasCommand from '../../commandUtils/EasCommand';
|
||||
import {
|
||||
EASEnvironmentFlag,
|
||||
EASNonInteractiveFlag,
|
||||
EASVariableScopeFlag,
|
||||
EASVariableVisibilityFlag,
|
||||
} from '../../commandUtils/flags';
|
||||
import { EnvironmentVariableScope, EnvironmentVariableVisibility } from '../../graphql/generated';
|
||||
import { EnvironmentVariableMutation } from '../../graphql/mutations/EnvironmentVariableMutation';
|
||||
import { EnvironmentVariablesQuery } from '../../graphql/queries/EnvironmentVariablesQuery';
|
||||
import Log from '../../log';
|
||||
import {
|
||||
getDisplayNameForProjectIdAsync,
|
||||
getOwnerAccountForProjectIdAsync,
|
||||
} from '../../project/projectUtils';
|
||||
import { selectAsync } from '../../prompts';
|
||||
import { promptVariableEnvironmentAsync, promptVariableValueAsync } from '../../utils/prompts';
|
||||
|
||||
type UpdateFlags = {
|
||||
name?: string;
|
||||
value?: string;
|
||||
scope?: EnvironmentVariableScope;
|
||||
environment?: string;
|
||||
visibility?: EnvironmentVariableVisibility;
|
||||
'non-interactive': boolean;
|
||||
};
|
||||
|
||||
export default class EnvironmentVariableUpdate extends EasCommand {
|
||||
static override description =
|
||||
'update an environment variable on the current project or owner account';
|
||||
|
||||
static override hidden = true;
|
||||
|
||||
static override flags = {
|
||||
name: Flags.string({
|
||||
description: 'Name of the variable',
|
||||
}),
|
||||
value: Flags.string({
|
||||
description: 'Text value or the variable',
|
||||
}),
|
||||
...EASVariableVisibilityFlag,
|
||||
...EASVariableScopeFlag,
|
||||
...EASEnvironmentFlag,
|
||||
...EASNonInteractiveFlag,
|
||||
};
|
||||
|
||||
static override contextDefinition = {
|
||||
...this.ContextOptions.ProjectConfig,
|
||||
...this.ContextOptions.Analytics,
|
||||
...this.ContextOptions.LoggedIn,
|
||||
};
|
||||
|
||||
async runAsync(): Promise<void> {
|
||||
const { flags } = await this.parse(EnvironmentVariableUpdate);
|
||||
let {
|
||||
name,
|
||||
value,
|
||||
scope,
|
||||
'non-interactive': nonInteractive,
|
||||
environment,
|
||||
visibility,
|
||||
} = this.validateFlags(flags);
|
||||
|
||||
const {
|
||||
privateProjectConfig: { projectId },
|
||||
loggedIn: { graphqlClient },
|
||||
} = await this.getContextAsync(EnvironmentVariableUpdate, {
|
||||
nonInteractive,
|
||||
});
|
||||
|
||||
const [projectDisplayName, ownerAccount] = await Promise.all([
|
||||
getDisplayNameForProjectIdAsync(graphqlClient, projectId),
|
||||
getOwnerAccountForProjectIdAsync(graphqlClient, projectId),
|
||||
]);
|
||||
|
||||
if (scope === EnvironmentVariableScope.Project) {
|
||||
if (!environment) {
|
||||
environment = await promptVariableEnvironmentAsync(nonInteractive);
|
||||
}
|
||||
const existingVariables = await EnvironmentVariablesQuery.byAppIdAsync(
|
||||
graphqlClient,
|
||||
projectId,
|
||||
environment
|
||||
);
|
||||
if (!name) {
|
||||
name = await selectAsync(
|
||||
'Select variable',
|
||||
existingVariables.map(variable => ({
|
||||
title: variable.name,
|
||||
value: variable.name,
|
||||
}))
|
||||
);
|
||||
}
|
||||
|
||||
const existingVariable = existingVariables.find(variable => variable.name === name);
|
||||
if (!existingVariable) {
|
||||
throw new Error(
|
||||
`Variable with name ${name} does not exist on project ${projectDisplayName}`
|
||||
);
|
||||
}
|
||||
|
||||
if (!value) {
|
||||
value = await promptVariableValueAsync({
|
||||
nonInteractive,
|
||||
required: false,
|
||||
initial: existingVariable.value,
|
||||
});
|
||||
if (!value || value.length === 0) {
|
||||
value = '';
|
||||
}
|
||||
}
|
||||
|
||||
const variable = await EnvironmentVariableMutation.createForAppAsync(
|
||||
graphqlClient,
|
||||
{
|
||||
name,
|
||||
value,
|
||||
environment,
|
||||
visibility,
|
||||
overwrite: true,
|
||||
},
|
||||
projectId
|
||||
);
|
||||
if (!variable) {
|
||||
throw new Error(
|
||||
`Could not update variable with name ${name} on project ${projectDisplayName}`
|
||||
);
|
||||
}
|
||||
|
||||
Log.withTick(
|
||||
`Updated variable ${chalk.bold(name)} on project ${chalk.bold(projectDisplayName)}.`
|
||||
);
|
||||
} else if (scope === EnvironmentVariableScope.Shared) {
|
||||
const sharedVariables = await EnvironmentVariablesQuery.sharedAsync(graphqlClient, projectId);
|
||||
|
||||
if (!name) {
|
||||
name = await selectAsync(
|
||||
'Select variable',
|
||||
sharedVariables.map(variable => ({
|
||||
title: variable.name,
|
||||
value: variable.name,
|
||||
}))
|
||||
);
|
||||
}
|
||||
|
||||
const existingVariable = sharedVariables.find(variable => variable.name === name);
|
||||
if (!existingVariable) {
|
||||
throw new Error(
|
||||
"Variable with this name doesn't exist on this account. Use a different name."
|
||||
);
|
||||
}
|
||||
|
||||
if (!value) {
|
||||
value = await promptVariableValueAsync({
|
||||
nonInteractive,
|
||||
required: false,
|
||||
initial: existingVariable.value,
|
||||
});
|
||||
if (!value || value.length === 0) {
|
||||
value = '';
|
||||
}
|
||||
}
|
||||
|
||||
const variable = await EnvironmentVariableMutation.createSharedVariableAsync(
|
||||
graphqlClient,
|
||||
{
|
||||
name,
|
||||
value,
|
||||
visibility,
|
||||
overwrite: true,
|
||||
},
|
||||
ownerAccount.id
|
||||
);
|
||||
|
||||
if (!variable) {
|
||||
throw new Error(
|
||||
`Could not update variable with name ${name} on account ${ownerAccount.name}`
|
||||
);
|
||||
}
|
||||
|
||||
Log.withTick(
|
||||
`Updated shared variable ${chalk.bold(name)} on account ${chalk.bold(ownerAccount.name)}.`
|
||||
);
|
||||
}
|
||||
}
|
||||
private validateFlags(flags: UpdateFlags): UpdateFlags {
|
||||
if (flags['non-interactive']) {
|
||||
if (!flags.name) {
|
||||
throw new Error(
|
||||
'Variable name is required in non-interactive mode. Run the command with --name flag.'
|
||||
);
|
||||
}
|
||||
|
||||
if (flags.scope === EnvironmentVariableScope.Project && !flags.environment) {
|
||||
throw new Error(
|
||||
'Environment is required when updating project-wide variable in non-interactive mode. Run the command with --environment flag.'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return flags;
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,11 @@ export default {
|
||||
* ignore failures when parsing build.gradle.
|
||||
*/
|
||||
overrideAndroidApplicationId: process.env.EAS_DANGEROUS_OVERRIDE_ANDROID_APPLICATION_ID,
|
||||
/**
|
||||
* Overrides bundleIdentifier from Xcode project for bare workflow.
|
||||
* Setting this option will ignore failures thrown when bundle identifier can't be obtained from Xcode project.
|
||||
*/
|
||||
overrideIosBundleIdentifier: process.env.EAS_DANGEROUS_OVERRIDE_IOS_BUNDLE_IDENTIFIER,
|
||||
/**
|
||||
* Comma separated list of feature gate keys of feature gates to evaluate override to true.
|
||||
*/
|
||||
|
||||
+526
-62
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,199 @@
|
||||
import { print } from 'graphql';
|
||||
import gql from 'graphql-tag';
|
||||
|
||||
import { ExpoGraphqlClient } from '../../commandUtils/context/contextUtils/createGraphqlClient';
|
||||
import { withErrorHandlingAsync } from '../client';
|
||||
import {
|
||||
CreateEnvironmentVariableForAccountMutation,
|
||||
CreateEnvironmentVariableForAppMutation,
|
||||
DeleteEnvironmentVariableMutation,
|
||||
EnvironmentVariableFragment,
|
||||
EnvironmentVariableVisibility,
|
||||
LinkSharedEnvironmentVariableMutation,
|
||||
UnlinkSharedEnvironmentVariableMutation,
|
||||
} from '../generated';
|
||||
import { EnvironmentVariableFragmentNode } from '../types/EnvironmentVariable';
|
||||
|
||||
type UpdateVariableArgs = {
|
||||
value?: string;
|
||||
name: string;
|
||||
overwrite: true;
|
||||
visibility?: EnvironmentVariableVisibility;
|
||||
};
|
||||
|
||||
export type EnvironmentVariablePushInput = {
|
||||
name: string;
|
||||
value: string;
|
||||
environment: string;
|
||||
visibility: EnvironmentVariableVisibility;
|
||||
overwrite?: boolean;
|
||||
};
|
||||
|
||||
export const EnvironmentVariableMutation = {
|
||||
async linkSharedEnvironmentVariableAsync(
|
||||
graphqlClient: ExpoGraphqlClient,
|
||||
environmentVariableId: string,
|
||||
appId: string,
|
||||
environment: string
|
||||
): Promise<EnvironmentVariableFragment> {
|
||||
const data = await withErrorHandlingAsync(
|
||||
graphqlClient
|
||||
.mutation<LinkSharedEnvironmentVariableMutation>(
|
||||
gql`
|
||||
mutation LinkSharedEnvironmentVariable(
|
||||
$appId: ID!
|
||||
$environment: EnvironmentVariableEnvironment!
|
||||
$environmentVariableId: ID!
|
||||
) {
|
||||
environmentVariable {
|
||||
linkSharedEnvironmentVariable(
|
||||
appId: $appId
|
||||
environmentVariableId: $environmentVariableId
|
||||
environment: $environment
|
||||
) {
|
||||
id
|
||||
...EnvironmentVariableFragment
|
||||
}
|
||||
}
|
||||
}
|
||||
${print(EnvironmentVariableFragmentNode)}
|
||||
`,
|
||||
{ appId, environment, environmentVariableId }
|
||||
)
|
||||
.toPromise()
|
||||
);
|
||||
|
||||
return data.environmentVariable.linkSharedEnvironmentVariable;
|
||||
},
|
||||
async unlinkSharedEnvironmentVariableAsync(
|
||||
graphqlClient: ExpoGraphqlClient,
|
||||
environmentVariableId: string,
|
||||
appId: string,
|
||||
environment: string
|
||||
): Promise<EnvironmentVariableFragment> {
|
||||
const data = await withErrorHandlingAsync(
|
||||
graphqlClient
|
||||
.mutation<UnlinkSharedEnvironmentVariableMutation>(
|
||||
gql`
|
||||
mutation UnlinkSharedEnvironmentVariable(
|
||||
$appId: ID!
|
||||
$environment: EnvironmentVariableEnvironment!
|
||||
$environmentVariableId: ID!
|
||||
) {
|
||||
environmentVariable {
|
||||
unlinkSharedEnvironmentVariable(
|
||||
appId: $appId
|
||||
environmentVariableId: $environmentVariableId
|
||||
environment: $environment
|
||||
) {
|
||||
id
|
||||
...EnvironmentVariableFragment
|
||||
}
|
||||
}
|
||||
}
|
||||
${print(EnvironmentVariableFragmentNode)}
|
||||
`,
|
||||
{ appId, environment, environmentVariableId }
|
||||
)
|
||||
.toPromise()
|
||||
);
|
||||
|
||||
return data.environmentVariable.unlinkSharedEnvironmentVariable;
|
||||
},
|
||||
async createSharedVariableAsync(
|
||||
graphqlClient: ExpoGraphqlClient,
|
||||
input:
|
||||
| {
|
||||
name: string;
|
||||
value: string;
|
||||
visibility: EnvironmentVariableVisibility;
|
||||
overwrite?: boolean;
|
||||
}
|
||||
| UpdateVariableArgs,
|
||||
accountId: string
|
||||
): Promise<EnvironmentVariableFragment> {
|
||||
const data = await withErrorHandlingAsync(
|
||||
graphqlClient
|
||||
.mutation<CreateEnvironmentVariableForAccountMutation>(
|
||||
gql`
|
||||
mutation CreateEnvironmentVariableForAccount(
|
||||
$input: CreateSharedEnvironmentVariableInput!
|
||||
$accountId: ID!
|
||||
) {
|
||||
environmentVariable {
|
||||
createEnvironmentVariableForAccount(
|
||||
environmentVariableData: $input
|
||||
accountId: $accountId
|
||||
) {
|
||||
id
|
||||
...EnvironmentVariableFragment
|
||||
}
|
||||
}
|
||||
}
|
||||
${print(EnvironmentVariableFragmentNode)}
|
||||
`,
|
||||
{ input, accountId }
|
||||
)
|
||||
.toPromise()
|
||||
);
|
||||
|
||||
return data.environmentVariable.createEnvironmentVariableForAccount;
|
||||
},
|
||||
async createForAppAsync(
|
||||
graphqlClient: ExpoGraphqlClient,
|
||||
input:
|
||||
| {
|
||||
name: string;
|
||||
value?: string;
|
||||
environment: string;
|
||||
visibility: EnvironmentVariableVisibility;
|
||||
overwrite?: boolean;
|
||||
}
|
||||
| (UpdateVariableArgs & { environment: string }),
|
||||
appId: string
|
||||
): Promise<EnvironmentVariableFragment> {
|
||||
const data = await withErrorHandlingAsync(
|
||||
graphqlClient
|
||||
.mutation<CreateEnvironmentVariableForAppMutation>(
|
||||
gql`
|
||||
mutation CreateEnvironmentVariableForApp(
|
||||
$input: CreateEnvironmentVariableInput!
|
||||
$appId: ID!
|
||||
) {
|
||||
environmentVariable {
|
||||
createEnvironmentVariableForApp(environmentVariableData: $input, appId: $appId) {
|
||||
id
|
||||
...EnvironmentVariableFragment
|
||||
}
|
||||
}
|
||||
}
|
||||
${print(EnvironmentVariableFragmentNode)}
|
||||
`,
|
||||
{ input, appId }
|
||||
)
|
||||
.toPromise()
|
||||
);
|
||||
|
||||
return data.environmentVariable.createEnvironmentVariableForApp;
|
||||
},
|
||||
async deleteAsync(graphqlClient: ExpoGraphqlClient, id: string): Promise<{ id: string }> {
|
||||
const data = await withErrorHandlingAsync(
|
||||
graphqlClient
|
||||
.mutation<DeleteEnvironmentVariableMutation>(
|
||||
gql`
|
||||
mutation DeleteEnvironmentVariable($id: ID!) {
|
||||
environmentVariable {
|
||||
deleteEnvironmentVariable(id: $id) {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
`,
|
||||
{ id }
|
||||
)
|
||||
.toPromise()
|
||||
);
|
||||
|
||||
return data.environmentVariable.deleteEnvironmentVariable;
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,130 @@
|
||||
import { print } from 'graphql';
|
||||
import gql from 'graphql-tag';
|
||||
|
||||
import { ExpoGraphqlClient } from '../../commandUtils/context/contextUtils/createGraphqlClient';
|
||||
import { withErrorHandlingAsync } from '../client';
|
||||
import {
|
||||
EnvironmentVariableEnvironment,
|
||||
EnvironmentVariableFragment,
|
||||
EnvironmentVariablesByAppIdQuery,
|
||||
} from '../generated';
|
||||
import { EnvironmentVariableFragmentNode } from '../types/EnvironmentVariable';
|
||||
|
||||
export const EnvironmentVariablesQuery = {
|
||||
async byAppIdWithSensitiveAsync(
|
||||
graphqlClient: ExpoGraphqlClient,
|
||||
{
|
||||
appId,
|
||||
environment,
|
||||
filterNames,
|
||||
}: {
|
||||
appId: string;
|
||||
environment: EnvironmentVariableEnvironment;
|
||||
filterNames?: string[];
|
||||
}
|
||||
): Promise<{
|
||||
appVariables: EnvironmentVariableFragment[];
|
||||
}> {
|
||||
const data = await withErrorHandlingAsync(
|
||||
graphqlClient
|
||||
.query(
|
||||
gql`
|
||||
query EnvironmentVariablesIncludingSensitiveByAppId(
|
||||
$appId: String!
|
||||
$filterNames: [String!]
|
||||
$environment: EnvironmentVariableEnvironment!
|
||||
) {
|
||||
app {
|
||||
byId(appId: $appId) {
|
||||
id
|
||||
environmentVariablesIncludingSensitive(
|
||||
filterNames: $filterNames
|
||||
environment: $environment
|
||||
) {
|
||||
id
|
||||
name
|
||||
value
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
`,
|
||||
{ appId, filterNames, environment },
|
||||
{ additionalTypenames: ['EnvironmentVariable'] }
|
||||
)
|
||||
.toPromise()
|
||||
);
|
||||
|
||||
return {
|
||||
appVariables: data.app?.byId.environmentVariablesIncludingSensitive ?? [],
|
||||
};
|
||||
},
|
||||
async byAppIdAsync(
|
||||
graphqlClient: ExpoGraphqlClient,
|
||||
appId: string,
|
||||
environment: string,
|
||||
filterNames?: string[]
|
||||
): Promise<EnvironmentVariableFragment[]> {
|
||||
const data = await withErrorHandlingAsync(
|
||||
graphqlClient
|
||||
.query<EnvironmentVariablesByAppIdQuery>(
|
||||
gql`
|
||||
query EnvironmentVariablesByAppId(
|
||||
$appId: String!
|
||||
$filterNames: [String!]
|
||||
$environment: EnvironmentVariableEnvironment!
|
||||
) {
|
||||
app {
|
||||
byId(appId: $appId) {
|
||||
id
|
||||
environmentVariables(filterNames: $filterNames, environment: $environment) {
|
||||
id
|
||||
...EnvironmentVariableFragment
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
${print(EnvironmentVariableFragmentNode)}
|
||||
`,
|
||||
{ appId, filterNames, environment },
|
||||
{ additionalTypenames: ['EnvironmentVariable'] }
|
||||
)
|
||||
.toPromise()
|
||||
);
|
||||
|
||||
return data.app?.byId.environmentVariables ?? [];
|
||||
},
|
||||
async sharedAsync(
|
||||
graphqlClient: ExpoGraphqlClient,
|
||||
appId: string,
|
||||
filterNames?: string[]
|
||||
): Promise<EnvironmentVariableFragment[]> {
|
||||
const data = await withErrorHandlingAsync(
|
||||
graphqlClient
|
||||
.query<EnvironmentVariablesByAppIdQuery>(
|
||||
gql`
|
||||
query EnvironmentVariablesShared($appId: String!, $filterNames: [String!]) {
|
||||
app {
|
||||
byId(appId: $appId) {
|
||||
id
|
||||
ownerAccount {
|
||||
id
|
||||
environmentVariables(filterNames: $filterNames) {
|
||||
id
|
||||
...EnvironmentVariableFragment
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
${print(EnvironmentVariableFragmentNode)}
|
||||
`,
|
||||
{ appId, filterNames },
|
||||
{ additionalTypenames: ['EnvironmentVariable'] }
|
||||
)
|
||||
.toPromise()
|
||||
);
|
||||
|
||||
return data.app?.byId.ownerAccount.environmentVariables ?? [];
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,13 @@
|
||||
import gql from 'graphql-tag';
|
||||
|
||||
export const EnvironmentVariableFragmentNode = gql`
|
||||
fragment EnvironmentVariableFragment on EnvironmentVariable {
|
||||
id
|
||||
name
|
||||
value
|
||||
environment
|
||||
createdAt
|
||||
scope
|
||||
visibility
|
||||
}
|
||||
`;
|
||||
@@ -7,6 +7,7 @@ import fs from 'fs-extra';
|
||||
|
||||
import { readAppJson } from '../../build/utils/appJson';
|
||||
import { ExpoGraphqlClient } from '../../commandUtils/context/contextUtils/createGraphqlClient';
|
||||
import env from '../../env';
|
||||
import Log, { learnMore } from '../../log';
|
||||
import { promptAsync } from '../../prompts';
|
||||
import { Client } from '../../vcs/vcs';
|
||||
@@ -62,6 +63,10 @@ export async function getBundleIdentifierAsync(
|
||||
if (workflow === Workflow.GENERIC) {
|
||||
warnIfBundleIdentifierDefinedInAppConfigForBareWorkflowProject(projectDir, exp);
|
||||
|
||||
if (env.overrideIosBundleIdentifier) {
|
||||
return env.overrideIosBundleIdentifier;
|
||||
}
|
||||
|
||||
const xcodeProject = IOSConfig.XcodeUtils.getPbxproj(projectDir);
|
||||
const isMultiScheme = IOSConfig.BuildScheme.getSchemesFromXcodeproj(projectDir).length > 1;
|
||||
const isMultiTarget =
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
import dateFormat from 'dateformat';
|
||||
|
||||
import formatFields from './formatFields';
|
||||
import { EnvironmentVariableFragment } from '../graphql/generated';
|
||||
|
||||
export function formatVariable(variable: EnvironmentVariableFragment): string {
|
||||
return formatFields([
|
||||
{ label: 'ID', value: variable.id },
|
||||
{ label: 'Name', value: variable.name },
|
||||
{ label: 'Value', value: variable.value ?? '(secret)' },
|
||||
{ label: 'Scope', value: variable.scope },
|
||||
{ label: 'Created at', value: dateFormat(variable.createdAt, 'mmm dd HH:MM:ss') },
|
||||
]);
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
import chalk from 'chalk';
|
||||
|
||||
import { EnvironmentVariableEnvironment } from '../graphql/generated';
|
||||
import { promptAsync, selectAsync } from '../prompts';
|
||||
|
||||
export async function promptVariableEnvironmentAsync(
|
||||
nonInteractive: boolean
|
||||
): Promise<EnvironmentVariableEnvironment> {
|
||||
if (nonInteractive) {
|
||||
throw new Error(
|
||||
'The `--environment` flag must be set when running in `--non-interactive` mode.'
|
||||
);
|
||||
}
|
||||
return await selectAsync('Select environment:', [
|
||||
{ title: 'Development', value: EnvironmentVariableEnvironment.Development },
|
||||
{ title: 'Preview', value: EnvironmentVariableEnvironment.Preview },
|
||||
{ title: 'Production', value: EnvironmentVariableEnvironment.Production },
|
||||
]);
|
||||
}
|
||||
export async function promptVariableValueAsync({
|
||||
nonInteractive,
|
||||
required = true,
|
||||
hidden = false,
|
||||
initial,
|
||||
}: {
|
||||
nonInteractive: boolean;
|
||||
required?: boolean;
|
||||
initial?: string | null;
|
||||
hidden?: boolean;
|
||||
}): Promise<string> {
|
||||
if (nonInteractive && required) {
|
||||
throw new Error(
|
||||
`Environment variable needs 'value' to be specified when running in non-interactive mode. Run the command with ${chalk.bold(
|
||||
'--value VARIABLE_VALUE'
|
||||
)} flag to fix the issue`
|
||||
);
|
||||
}
|
||||
|
||||
const { variableValue } = await promptAsync({
|
||||
type: hidden ? 'password' : 'text',
|
||||
name: 'variableValue',
|
||||
message: 'Variable value:',
|
||||
initial: initial ?? '',
|
||||
validate: variableValue => {
|
||||
if (!required) {
|
||||
return true;
|
||||
}
|
||||
if (!variableValue || variableValue.trim() === '') {
|
||||
return "Environment variable value can't be empty";
|
||||
}
|
||||
return true;
|
||||
},
|
||||
});
|
||||
|
||||
if (!variableValue && required) {
|
||||
throw new Error(
|
||||
`Environment variable needs 'value' to be specifed. Run the command again with ${chalk.bold(
|
||||
'--value VARIABLE_VALUE'
|
||||
)} flag or provide it interactively to fix the issue.`
|
||||
);
|
||||
}
|
||||
|
||||
return variableValue;
|
||||
}
|
||||
|
||||
export async function promptVariableNameAsync(nonInteractive: boolean): Promise<string> {
|
||||
const validationMessage = 'Variable name may not be empty.';
|
||||
if (nonInteractive) {
|
||||
throw new Error(validationMessage);
|
||||
}
|
||||
|
||||
const { name } = await promptAsync({
|
||||
type: 'text',
|
||||
name: 'name',
|
||||
message: `Variable name:`,
|
||||
validate: value => {
|
||||
if (!value) {
|
||||
return validationMessage;
|
||||
}
|
||||
|
||||
if (!value.match(/^\w+$/)) {
|
||||
return 'Names may contain only letters, numbers, and underscores.';
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
});
|
||||
|
||||
if (!name) {
|
||||
throw new Error(validationMessage);
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@expo/eas-json",
|
||||
"description": "A library for interacting with eas.json",
|
||||
"version": "10.2.2",
|
||||
"version": "10.2.4",
|
||||
"author": "Expo <[email protected]>",
|
||||
"bugs": "https://github.com/expo/eas-cli/issues",
|
||||
"dependencies": {
|
||||
"@babel/code-frame": "7.23.5",
|
||||
"@expo/eas-build-job": "1.0.129",
|
||||
"@expo/eas-build-job": "1.0.130",
|
||||
"chalk": "4.1.2",
|
||||
"env-string": "1.0.1",
|
||||
"fs-extra": "11.2.0",
|
||||
|
||||
@@ -232,20 +232,15 @@
|
||||
"sdk-51",
|
||||
"sdk-50",
|
||||
"sdk-49",
|
||||
"ubuntu-22.04-jdk-17-ndk-r26b",
|
||||
"ubuntu-22.04-jdk-17-ndk-r25b",
|
||||
"ubuntu-22.04-jdk-11-ndk-r23b",
|
||||
"ubuntu-20.04-jdk-11-ndk-r23b",
|
||||
"ubuntu-22.04-jdk-17-ndk-r21e",
|
||||
"ubuntu-22.04-jdk-11-ndk-r21e",
|
||||
"ubuntu-20.04-jdk-11-ndk-r21e",
|
||||
"ubuntu-22.04-jdk-8-ndk-r21e",
|
||||
"ubuntu-20.04-jdk-8-ndk-r21e",
|
||||
"ubuntu-20.04-jdk-11-ndk-r19c",
|
||||
"ubuntu-20.04-jdk-8-ndk-r19c"
|
||||
"ubuntu-22.04-jdk-11-ndk-r21e"
|
||||
],
|
||||
"markdownEnumDescriptions": [
|
||||
"When using this option the build image is selected automatically based on the project configuration, detected Expo SDK and React Native versions.",
|
||||
"The latest Android image currently available. It is resolved to `ubuntu-22.04-jdk-17-ndk-r25b`. The `latest` to image mapping will be updated as new images are released.",
|
||||
"The latest Android image currently available. It is resolved to `ubuntu-22.04-jdk-17-ndk-r26b`. The `latest` to image mapping will be updated as new images are released.",
|
||||
"The recommended image for SDK 51 builds",
|
||||
"The recommended image for SDK 50 builds",
|
||||
"The recommended image for SDK 49 builds"
|
||||
@@ -253,10 +248,25 @@
|
||||
},
|
||||
{
|
||||
"deprecated": true,
|
||||
"enum": ["default", "stable"],
|
||||
"enum": [
|
||||
"default",
|
||||
"stable",
|
||||
"ubuntu-20.04-jdk-11-ndk-r23b",
|
||||
"ubuntu-20.04-jdk-11-ndk-r19c",
|
||||
"ubuntu-20.04-jdk-8-ndk-r19c",
|
||||
"ubuntu-20.04-jdk-11-ndk-r21e",
|
||||
"ubuntu-20.04-jdk-8-ndk-r21e",
|
||||
"ubuntu-22.04-jdk-8-ndk-r21e"
|
||||
],
|
||||
"markdownEnumDescriptions": [
|
||||
"This image tag is deprecated, please use other image tags or images directly instead.",
|
||||
"This image tag is deprecated, please use other image tags or images directly instead."
|
||||
"This image tag is deprecated, please use other image tags or images directly instead.",
|
||||
"This image is deprecated",
|
||||
"This image is deprecated",
|
||||
"This image is deprecated",
|
||||
"This image is deprecated",
|
||||
"This image is deprecated",
|
||||
"This image is deprecated"
|
||||
]
|
||||
}
|
||||
]
|
||||
@@ -368,6 +378,7 @@
|
||||
"sdk-51",
|
||||
"sdk-50",
|
||||
"sdk-49",
|
||||
"macos-sonoma-14.5-xcode-15.4",
|
||||
"macos-sonoma-14.4-xcode-15.3",
|
||||
"macos-ventura-13.6-xcode-15.2",
|
||||
"macos-ventura-13.6-xcode-15.1",
|
||||
@@ -375,7 +386,7 @@
|
||||
],
|
||||
"markdownEnumDescriptions": [
|
||||
"When using this option the build image is selected automatically based on the project configuration, detected Expo SDK and React Native versions.",
|
||||
"The latest iOS image currently available. It is resolved to `macos-sonoma-14.4-xcode-15.3`. The `latest` to image mapping will be updated as new images are released.",
|
||||
"The latest iOS image currently available. It is resolved to `macos-sonoma-14.5-xcode-15.4`. The `latest` to image mapping will be updated as new images are released.",
|
||||
"The recommended image for SDK 51 builds",
|
||||
"The recommended image for SDK 50 builds",
|
||||
"The recommended image for SDK 49 builds"
|
||||
|
||||
@@ -100,6 +100,35 @@ test('valid eas.json for development client builds', async () => {
|
||||
});
|
||||
});
|
||||
|
||||
test('valid eas.json with specified environment', async () => {
|
||||
await fs.writeJson('/project/eas.json', {
|
||||
build: {
|
||||
development: {
|
||||
environment: 'production',
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const accessor = EasJsonAccessor.fromProjectPath('/project');
|
||||
const iosProfile = await EasJsonUtils.getBuildProfileAsync(accessor, Platform.IOS, 'development');
|
||||
const androidProfile = await EasJsonUtils.getBuildProfileAsync(
|
||||
accessor,
|
||||
Platform.ANDROID,
|
||||
'development'
|
||||
);
|
||||
expect(androidProfile).toEqual({
|
||||
credentialsSource: 'remote',
|
||||
distribution: 'store',
|
||||
environment: 'production',
|
||||
});
|
||||
|
||||
expect(iosProfile).toEqual({
|
||||
credentialsSource: 'remote',
|
||||
distribution: 'store',
|
||||
environment: 'production',
|
||||
});
|
||||
});
|
||||
|
||||
test('valid eas.json with top level withoutCredentials property', async () => {
|
||||
await fs.writeJson('/project/eas.json', {
|
||||
build: {
|
||||
|
||||
@@ -69,6 +69,8 @@ const CommonBuildProfileSchema = Joi.object({
|
||||
|
||||
// credentials
|
||||
withoutCredentials: Joi.boolean(),
|
||||
|
||||
environment: Joi.string().valid('preview', 'production', 'development'),
|
||||
});
|
||||
|
||||
const PlatformBuildProfileSchema = CommonBuildProfileSchema.concat(
|
||||
|
||||
@@ -69,6 +69,8 @@ export interface CommonBuildProfile {
|
||||
|
||||
// credentials
|
||||
withoutCredentials?: boolean;
|
||||
|
||||
environment?: 'preview' | 'production' | 'development';
|
||||
}
|
||||
|
||||
interface PlatformBuildProfile extends Omit<CommonBuildProfile, 'autoIncrement'> {
|
||||
|
||||
@@ -1462,10 +1462,10 @@
|
||||
slugify "^1.3.4"
|
||||
sucrase "^3.20.0"
|
||||
|
||||
"@expo/[email protected]29":
|
||||
version "1.0.129"
|
||||
resolved "https://registry.yarnpkg.com/@expo/eas-build-job/-/eas-build-job-1.0.129.tgz#c5d7a8d87d0265d622222a3ae10b6ff91f0c287e"
|
||||
integrity sha512-4afSML5IxhBNW1iLu5dQ8rfe4RlXFCAnjXaVhag/Y2Z4l+TmN30C27ff8qfxUDaa/5G+8D9ru3xl4L3JV906Tg==
|
||||
"@expo/[email protected]30":
|
||||
version "1.0.130"
|
||||
resolved "https://registry.yarnpkg.com/@expo/eas-build-job/-/eas-build-job-1.0.130.tgz#698de0139d14cd339f9d0f37ad40a86f1e9acbc8"
|
||||
integrity sha512-3amSYB9QC24ZqMjNAl/s2EHbF4Y3btKnSAafp5sp5t2g8GvU1sBZ/+rXQPKH/Ga+PcbqNT+pduGIGg4uUC7gnw==
|
||||
dependencies:
|
||||
"@expo/logger" "1.0.117"
|
||||
joi "^17.13.1"
|
||||
@@ -1667,12 +1667,12 @@
|
||||
dependencies:
|
||||
cross-spawn "^7.0.3"
|
||||
|
||||
"@expo/[email protected]29":
|
||||
version "1.0.129"
|
||||
resolved "https://registry.yarnpkg.com/@expo/steps/-/steps-1.0.129.tgz#c91f8758d10b9f78e68dab988730980f3a4dcf6f"
|
||||
integrity sha512-OIzKuOP6UZ/WmwwdVrNsgUTi41zdkAojCD+2cQufWZIsP62FiNEvtB+OqqDAQ/nznRPD4dj5UJzf0+gofmiQsg==
|
||||
"@expo/[email protected]30":
|
||||
version "1.0.130"
|
||||
resolved "https://registry.yarnpkg.com/@expo/steps/-/steps-1.0.130.tgz#91e05e7387f674d7c27cc610fa558e6cc2fb7ac1"
|
||||
integrity sha512-ZWjrPGj8rzPVDSwxhWi2i2FWIkKUZmJCNfs0p9DSPqdUOADg7XIFSqxefxBeygZ0R2dJMEjRQA8Gz0mqjFIkiQ==
|
||||
dependencies:
|
||||
"@expo/eas-build-job" "1.0.129"
|
||||
"@expo/eas-build-job" "1.0.130"
|
||||
"@expo/logger" "1.0.117"
|
||||
"@expo/spawn-async" "^1.7.2"
|
||||
arg "^5.0.2"
|
||||
@@ -12691,7 +12691,16 @@ string-length@^5.0.1:
|
||||
char-regex "^2.0.0"
|
||||
strip-ansi "^7.0.1"
|
||||
|
||||
"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3:
|
||||
"string-width-cjs@npm:string-width@^4.2.0":
|
||||
version "4.2.3"
|
||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
||||
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
||||
dependencies:
|
||||
emoji-regex "^8.0.0"
|
||||
is-fullwidth-code-point "^3.0.0"
|
||||
strip-ansi "^6.0.1"
|
||||
|
||||
"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3:
|
||||
version "4.2.3"
|
||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
||||
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
||||
@@ -12808,7 +12817,7 @@ string_decoder@~1.1.1:
|
||||
dependencies:
|
||||
safe-buffer "~5.1.0"
|
||||
|
||||
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.1:
|
||||
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
||||
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
||||
@@ -12822,6 +12831,13 @@ strip-ansi@^6.0.0:
|
||||
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"
|
||||
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
||||
dependencies:
|
||||
ansi-regex "^5.0.1"
|
||||
|
||||
strip-ansi@^7.0.1:
|
||||
version "7.0.1"
|
||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2"
|
||||
@@ -13983,7 +13999,16 @@ wordwrap@^1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
|
||||
integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
|
||||
|
||||
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", [email protected], wrap-ansi@^7.0.0:
|
||||
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
||||
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
|
||||
dependencies:
|
||||
ansi-styles "^4.0.0"
|
||||
string-width "^4.1.0"
|
||||
strip-ansi "^6.0.0"
|
||||
|
||||
[email protected], wrap-ansi@^7.0.0:
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
||||
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
|
||||
|
||||
Reference in new issue
Block a user