Compare commits

...
10 Commits
Author SHA1 Message Date
Szymon Dziedzic 26bb7052ef v7.7.0 2024-04-05 21:16:01 +02:00
Szymon Dziedzic 8333d3361a upgrade eas-cli-local-build-plugin to 1.0.95 2024-04-05 21:15:52 +02:00
Szymon Dziedzic f62a8cad27 [eas-json] add Xcode 15.3 image (#2312)
* [eas-json] add Xcode 15.3 image

* update CHANGELOG.md

* fix changelog
2024-04-05 20:30:22 +02:00
Piotr Szeremeta b52145c0a7 Fix project metadata spinner persisting after upload (#2311) 2024-04-03 17:18:01 +02:00
Piotr SzeremetaandSzymon Dziedzic e06fc189aa [ENG-11445] Add '--verbose-fastlane' flag for verbose fastlane logs (#2276)
* [ENG-11445] Add verbose-fastlane flag for verbose fastlane logs

Make isVerboseFastlaneEnabled required parameter

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

* update CHANGELOG.md

* [ENG-11445] Add verbose-fastlane for android builds

* [ENG-11445] Update graphql

* [ENG-11445] Fix tests

---------

Co-authored-by: Szymon Dziedzic <[email protected]>
2024-04-03 12:05:12 +02:00
Piotr Szeremeta b346f96c63 [ENG-10412] Upload projectMetadata file (#2149)
* [ENG-10412] Upload projectMetadata file

* Lint

* [ENG-10412] Apply review suggestions

* update graphql
2024-04-03 11:47:44 +02:00
Juwan Wheatley 26ba0719ce [eas-cli] add a credentials:configure-build subcommand that prepares a project for EAS Build without executing the build from the CLI (#2282)
* [eas-cli] create new `init-build` command under the `credentials` topic

* get hacky version of cli command working

* add all option to flag

* extend the Manage<Platform> actions to reduce code duplication

* prompt user for platform if it doesn't exist

* prompt the user to choose a profile

* add a changelog entry

* call SetUpBuildCredentials for android
2024-03-28 15:55:19 -04:00
dependabot[bot] c33dff99d2 Bump express from 4.18.2 to 4.19.2 (#2302)
Bumps [express](https://github.com/expressjs/express) from 4.18.2 to 4.19.2.
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/master/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2)

---
updated-dependencies:
- dependency-name: express
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-28 08:48:50 +01:00
Expo BotandStanisław Chmiela 3d7d851d07 Upgrade eas-build dependencies (#2304)
Co-authored-by: Stanisław Chmiela <[email protected]>
2024-03-27 21:29:08 +01:00
Expo CI fad3f1346c update CHANGELOG.md 2024-03-27 16:02:19 +00:00
35 changed files with 689 additions and 259 deletions

No files matched your search

+12 -1
View File
@@ -8,11 +8,22 @@ This is the log of notable changes to EAS CLI and related packages.
### 🎉 New features
- Generate metadata file for project archive ([#2149](https://github.com/expo/eas-cli/pull/2149) by [@khamilowicz](https://github.com/khamilowicz))
- Add --verbose-fastlane flag to eas submit command for more robust fastlane pilot logs. ([#2276](https://github.com/expo/eas-cli/pull/2276) by [@khamilowicz](https://github.com/khamilowicz))
- Add `eas credentials:configure-build` subcommand. ([#2282](https://github.com/expo/eas-cli/pull/2282) by [@fiberjw](https://github.com/fiberjw))
### 🐛 Bug fixes
### 🧹 Chores
- Add info about the Xcode 15.3 image to `eas.schema.json`. ([#2312](https://github.com/expo/eas-cli/pull/2312) by [@szdziedzic](https://github.com/szdziedzic))
## [7.6.2](https://github.com/expo/eas-cli/releases/tag/v7.6.2) - 2024-03-27
### 🧹 Chores
- Upgrade [`eas-build`](https://github.com/expo/eas-build) dependencies. ([#2301](https://github.com/expo/eas-cli/pull/2301) by [@expo-bot](https://github.com/expo-bot))
- Upgrade [`eas-build`](https://github.com/expo/eas-build) dependencies. ([#2304](https://github.com/expo/eas-cli/pull/2304) by [@expo-bot](https://github.com/expo-bot))
## [7.6.1](https://github.com/expo/eas-cli/releases/tag/v7.6.1) - 2024-03-25
@@ -67,7 +78,7 @@ This is the log of notable changes to EAS CLI and related packages.
- Upgrade [`eas-build`](https://github.com/expo/eas-build) dependencies. ([#2237](https://github.com/expo/eas-cli/pull/2237) by [@expo-bot](https://github.com/expo-bot))
- Upgrade [`eas-build`](https://github.com/expo/eas-build) dependencies. ([#2240](https://github.com/expo/eas-cli/pull/2240) by [@expo-bot](https://github.com/expo-bot))
- Upgrade [`eas-build`](https://github.com/expo/eas-build) dependencies. ([#2253](https://github.com/expo/eas-cli/pull/2253) by [@expo-bot](https://github.com/expo-bot))
- Include src/**/build directories in vscode search and replace. ([#2250](https://github.com/expo/eas-cli/pull/2250) by [@wschurman](https://github.com/wschurman))
- Include src/\*\*/build directories in vscode search and replace. ([#2250](https://github.com/expo/eas-cli/pull/2250) by [@wschurman](https://github.com/wschurman))
- Upgrade [`eas-build`](https://github.com/expo/eas-build) dependencies. ([#2259](https://github.com/expo/eas-cli/pull/2259) by [@expo-bot](https://github.com/expo-bot))
## [7.3.0](https://github.com/expo/eas-cli/releases/tag/v7.3.0) - 2024-02-19
+1 -1
View File
@@ -1,5 +1,5 @@
{
"npmClient": "yarn",
"version": "7.6.2",
"version": "7.7.0",
"$schema": "node_modules/lerna/schemas/lerna-schema.json"
}
+81 -60
View File
@@ -85,6 +85,7 @@ eas --help COMMAND
* [`eas channel:view [NAME]`](#eas-channelview-name)
* [`eas config`](#eas-config)
* [`eas credentials`](#eas-credentials)
* [`eas credentials:configure-build`](#eas-credentialsconfigure-build)
* [`eas device:create`](#eas-devicecreate)
* [`eas device:delete`](#eas-devicedelete)
* [`eas device:list`](#eas-devicelist)
@@ -136,7 +137,7 @@ ALIASES
$ eas login
```
_See code: [src/commands/account/login.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/account/login.ts)_
_See code: [src/commands/account/login.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/account/login.ts)_
## `eas account:logout`
@@ -153,7 +154,7 @@ ALIASES
$ eas logout
```
_See code: [src/commands/account/logout.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/account/logout.ts)_
_See code: [src/commands/account/logout.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/account/logout.ts)_
## `eas account:view`
@@ -170,7 +171,7 @@ ALIASES
$ eas whoami
```
_See code: [src/commands/account/view.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/account/view.ts)_
_See code: [src/commands/account/view.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/account/view.ts)_
## `eas analytics [STATUS]`
@@ -184,7 +185,7 @@ DESCRIPTION
display or change analytics settings
```
_See code: [src/commands/analytics.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/analytics.ts)_
_See code: [src/commands/analytics.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/analytics.ts)_
## `eas autocomplete [SHELL]`
@@ -236,7 +237,7 @@ DESCRIPTION
create a branch
```
_See code: [src/commands/branch/create.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/branch/create.ts)_
_See code: [src/commands/branch/create.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/branch/create.ts)_
## `eas branch:delete [NAME]`
@@ -257,7 +258,7 @@ DESCRIPTION
delete a branch
```
_See code: [src/commands/branch/delete.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/branch/delete.ts)_
_See code: [src/commands/branch/delete.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/branch/delete.ts)_
## `eas branch:list`
@@ -277,7 +278,7 @@ DESCRIPTION
list all branches
```
_See code: [src/commands/branch/list.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/branch/list.ts)_
_See code: [src/commands/branch/list.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/branch/list.ts)_
## `eas branch:rename`
@@ -297,7 +298,7 @@ DESCRIPTION
rename a branch
```
_See code: [src/commands/branch/rename.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/branch/rename.ts)_
_See code: [src/commands/branch/rename.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/branch/rename.ts)_
## `eas branch:view [NAME]`
@@ -320,7 +321,7 @@ DESCRIPTION
view a branch
```
_See code: [src/commands/branch/view.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/branch/view.ts)_
_See code: [src/commands/branch/view.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/branch/view.ts)_
## `eas build`
@@ -350,7 +351,7 @@ DESCRIPTION
start a build
```
_See code: [src/commands/build/index.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/build/index.ts)_
_See code: [src/commands/build/index.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/build/index.ts)_
## `eas build:cancel [BUILD_ID]`
@@ -369,7 +370,7 @@ DESCRIPTION
cancel a build
```
_See code: [src/commands/build/cancel.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/build/cancel.ts)_
_See code: [src/commands/build/cancel.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/build/cancel.ts)_
## `eas build:configure`
@@ -386,7 +387,7 @@ DESCRIPTION
configure the project to support EAS Build
```
_See code: [src/commands/build/configure.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/build/configure.ts)_
_See code: [src/commands/build/configure.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/build/configure.ts)_
## `eas build:delete [BUILD_ID]`
@@ -405,7 +406,7 @@ DESCRIPTION
delete a build
```
_See code: [src/commands/build/delete.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/build/delete.ts)_
_See code: [src/commands/build/delete.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/build/delete.ts)_
## `eas build:inspect`
@@ -440,7 +441,7 @@ DESCRIPTION
inspect the state of the project at specific build stages, useful for troubleshooting
```
_See code: [src/commands/build/inspect.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/build/inspect.ts)_
_See code: [src/commands/build/inspect.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/build/inspect.ts)_
## `eas build:list`
@@ -481,7 +482,7 @@ DESCRIPTION
list all builds for your project
```
_See code: [src/commands/build/list.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/build/list.ts)_
_See code: [src/commands/build/list.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/build/list.ts)_
## `eas build:resign`
@@ -507,7 +508,7 @@ DESCRIPTION
re-sign a build archive
```
_See code: [src/commands/build/resign.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/build/resign.ts)_
_See code: [src/commands/build/resign.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/build/resign.ts)_
## `eas build:run`
@@ -533,7 +534,7 @@ DESCRIPTION
run simulator/emulator builds from eas-cli
```
_See code: [src/commands/build/run.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/build/run.ts)_
_See code: [src/commands/build/run.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/build/run.ts)_
## `eas build:submit`
@@ -542,7 +543,7 @@ submit app binary to App Store and/or Play Store
```
USAGE
$ eas build:submit [-p android|ios|all] [-e <value>] [--latest | --id <value> | --path <value> | --url <value>]
[--verbose] [--wait] [--non-interactive]
[--verbose] [--wait] [--verbose-fastlane] [--non-interactive]
FLAGS
-e, --profile=<value> Name of the submit profile from eas.json. Defaults to "production" if defined in
@@ -554,6 +555,7 @@ FLAGS
--path=<value> Path to the .apk/.aab/.ipa file
--url=<value> App archive url
--verbose Always print logs from EAS Submit
--verbose-fastlane Enable verbose logging for the submission process
--[no-]wait Wait for submission to complete
DESCRIPTION
@@ -582,7 +584,7 @@ DESCRIPTION
get the latest version from EAS servers
```
_See code: [src/commands/build/version/get.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/build/version/get.ts)_
_See code: [src/commands/build/version/get.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/build/version/get.ts)_
## `eas build:version:set`
@@ -601,7 +603,7 @@ DESCRIPTION
update version of an app
```
_See code: [src/commands/build/version/set.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/build/version/set.ts)_
_See code: [src/commands/build/version/set.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/build/version/set.ts)_
## `eas build:version:sync`
@@ -620,7 +622,7 @@ DESCRIPTION
update a version in native code with a value stored on EAS servers
```
_See code: [src/commands/build/version/sync.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/build/version/sync.ts)_
_See code: [src/commands/build/version/sync.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/build/version/sync.ts)_
## `eas build:view [BUILD_ID]`
@@ -637,7 +639,7 @@ DESCRIPTION
view a build for your project
```
_See code: [src/commands/build/view.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/build/view.ts)_
_See code: [src/commands/build/view.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/build/view.ts)_
## `eas channel:create [NAME]`
@@ -658,7 +660,7 @@ DESCRIPTION
create a channel
```
_See code: [src/commands/channel/create.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/channel/create.ts)_
_See code: [src/commands/channel/create.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/channel/create.ts)_
## `eas channel:edit [NAME]`
@@ -680,7 +682,7 @@ DESCRIPTION
point a channel at a new branch
```
_See code: [src/commands/channel/edit.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/channel/edit.ts)_
_See code: [src/commands/channel/edit.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/channel/edit.ts)_
## `eas channel:list`
@@ -700,7 +702,7 @@ DESCRIPTION
list all channels
```
_See code: [src/commands/channel/list.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/channel/list.ts)_
_See code: [src/commands/channel/list.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/channel/list.ts)_
## `eas channel:rollout [CHANNEL]`
@@ -732,7 +734,7 @@ DESCRIPTION
Roll a new branch out on a channel incrementally.
```
_See code: [src/commands/channel/rollout.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/channel/rollout.ts)_
_See code: [src/commands/channel/rollout.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/channel/rollout.ts)_
## `eas channel:view [NAME]`
@@ -755,7 +757,7 @@ DESCRIPTION
view a channel
```
_See code: [src/commands/channel/view.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/channel/view.ts)_
_See code: [src/commands/channel/view.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/channel/view.ts)_
## `eas config`
@@ -776,7 +778,7 @@ DESCRIPTION
display project configuration (app.json + eas.json)
```
_See code: [src/commands/config.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/config.ts)_
_See code: [src/commands/config.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/config.ts)_
## `eas credentials`
@@ -793,7 +795,25 @@ DESCRIPTION
manage credentials
```
_See code: [src/commands/credentials.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/credentials.ts)_
_See code: [src/commands/credentials/index.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/credentials/index.ts)_
## `eas credentials:configure-build`
Set up credentials for building your project.
```
USAGE
$ eas credentials:configure-build [-p android|ios] [-e <value>]
FLAGS
-e, --profile=PROFILE_NAME The name of the build profile in eas.json.
-p, --platform=(android|ios)
DESCRIPTION
Set up credentials for building your project.
```
_See code: [src/commands/credentials/configure-build.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/credentials/configure-build.ts)_
## `eas device:create`
@@ -807,7 +827,7 @@ DESCRIPTION
register new Apple Devices to use for internal distribution
```
_See code: [src/commands/device/create.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/device/create.ts)_
_See code: [src/commands/device/create.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/device/create.ts)_
## `eas device:delete`
@@ -827,7 +847,7 @@ DESCRIPTION
remove a registered device from your account
```
_See code: [src/commands/device/delete.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/device/delete.ts)_
_See code: [src/commands/device/delete.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/device/delete.ts)_
## `eas device:list`
@@ -848,7 +868,7 @@ DESCRIPTION
list all registered devices for your account
```
_See code: [src/commands/device/list.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/device/list.ts)_
_See code: [src/commands/device/list.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/device/list.ts)_
## `eas device:rename`
@@ -869,7 +889,7 @@ DESCRIPTION
rename a registered device
```
_See code: [src/commands/device/rename.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/device/rename.ts)_
_See code: [src/commands/device/rename.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/device/rename.ts)_
## `eas device:view [UDID]`
@@ -883,7 +903,7 @@ DESCRIPTION
view a device for your project
```
_See code: [src/commands/device/view.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/device/view.ts)_
_See code: [src/commands/device/view.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/device/view.ts)_
## `eas diagnostics`
@@ -897,7 +917,7 @@ DESCRIPTION
display environment info
```
_See code: [src/commands/diagnostics.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/diagnostics.ts)_
_See code: [src/commands/diagnostics.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/diagnostics.ts)_
## `eas help [COMMAND]`
@@ -985,7 +1005,7 @@ DESCRIPTION
validate the local store configuration
```
_See code: [src/commands/metadata/lint.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/metadata/lint.ts)_
_See code: [src/commands/metadata/lint.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/metadata/lint.ts)_
## `eas metadata:pull`
@@ -1002,7 +1022,7 @@ DESCRIPTION
generate the local store configuration from the app stores
```
_See code: [src/commands/metadata/pull.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/metadata/pull.ts)_
_See code: [src/commands/metadata/pull.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/metadata/pull.ts)_
## `eas metadata:push`
@@ -1019,7 +1039,7 @@ DESCRIPTION
sync the local store configuration to the app stores
```
_See code: [src/commands/metadata/push.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/metadata/push.ts)_
_See code: [src/commands/metadata/push.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/metadata/push.ts)_
## `eas open`
@@ -1033,7 +1053,7 @@ DESCRIPTION
open the project page in a web browser
```
_See code: [src/commands/open.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/open.ts)_
_See code: [src/commands/open.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/open.ts)_
## `eas project:info`
@@ -1047,7 +1067,7 @@ DESCRIPTION
information about the current project
```
_See code: [src/commands/project/info.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/project/info.ts)_
_See code: [src/commands/project/info.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/project/info.ts)_
## `eas project:init`
@@ -1069,7 +1089,7 @@ ALIASES
$ eas init
```
_See code: [src/commands/project/init.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/project/init.ts)_
_See code: [src/commands/project/init.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/project/init.ts)_
## `eas secret:create`
@@ -1092,7 +1112,7 @@ DESCRIPTION
create an environment secret on the current project or owner account
```
_See code: [src/commands/secret/create.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/secret/create.ts)_
_See code: [src/commands/secret/create.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/secret/create.ts)_
## `eas secret:delete`
@@ -1110,7 +1130,7 @@ DESCRIPTION
delete an environment secret by ID
```
_See code: [src/commands/secret/delete.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/secret/delete.ts)_
_See code: [src/commands/secret/delete.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/secret/delete.ts)_
## `eas secret:list`
@@ -1124,7 +1144,7 @@ DESCRIPTION
list environment secrets available for your current app
```
_See code: [src/commands/secret/list.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/secret/list.ts)_
_See code: [src/commands/secret/list.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/secret/list.ts)_
## `eas secret:push`
@@ -1144,7 +1164,7 @@ DESCRIPTION
read environment secrets from env file and store on the server
```
_See code: [src/commands/secret/push.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/secret/push.ts)_
_See code: [src/commands/secret/push.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/secret/push.ts)_
## `eas submit`
@@ -1153,7 +1173,7 @@ submit app binary to App Store and/or Play Store
```
USAGE
$ eas submit [-p android|ios|all] [-e <value>] [--latest | --id <value> | --path <value> | --url <value>]
[--verbose] [--wait] [--non-interactive]
[--verbose] [--wait] [--verbose-fastlane] [--non-interactive]
FLAGS
-e, --profile=<value> Name of the submit profile from eas.json. Defaults to "production" if defined in
@@ -1165,6 +1185,7 @@ FLAGS
--path=<value> Path to the .apk/.aab/.ipa file
--url=<value> App archive url
--verbose Always print logs from EAS Submit
--verbose-fastlane Enable verbose logging for the submission process
--[no-]wait Wait for submission to complete
DESCRIPTION
@@ -1174,7 +1195,7 @@ ALIASES
$ eas build:submit
```
_See code: [src/commands/submit.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/submit.ts)_
_See code: [src/commands/submit.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/submit.ts)_
## `eas update`
@@ -1207,7 +1228,7 @@ DESCRIPTION
publish an update group
```
_See code: [src/commands/update/index.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/update/index.ts)_
_See code: [src/commands/update/index.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/update/index.ts)_
## `eas update:configure`
@@ -1225,7 +1246,7 @@ DESCRIPTION
configure the project to support EAS Update
```
_See code: [src/commands/update/configure.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/update/configure.ts)_
_See code: [src/commands/update/configure.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/update/configure.ts)_
## `eas update:delete GROUPID`
@@ -1246,7 +1267,7 @@ DESCRIPTION
delete all the updates in an update group
```
_See code: [src/commands/update/delete.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/update/delete.ts)_
_See code: [src/commands/update/delete.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/update/delete.ts)_
## `eas update:list`
@@ -1268,7 +1289,7 @@ DESCRIPTION
view the recent updates
```
_See code: [src/commands/update/list.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/update/list.ts)_
_See code: [src/commands/update/list.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/update/list.ts)_
## `eas update:republish`
@@ -1295,7 +1316,7 @@ DESCRIPTION
roll back to an existing update
```
_See code: [src/commands/update/republish.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/update/republish.ts)_
_See code: [src/commands/update/republish.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/update/republish.ts)_
## `eas update:roll-back-to-embedded`
@@ -1322,7 +1343,7 @@ DESCRIPTION
roll back to the embedded update
```
_See code: [src/commands/update/roll-back-to-embedded.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/update/roll-back-to-embedded.ts)_
_See code: [src/commands/update/roll-back-to-embedded.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/update/roll-back-to-embedded.ts)_
## `eas update:rollback`
@@ -1341,7 +1362,7 @@ DESCRIPTION
roll back to an embedded update or an existing update
```
_See code: [src/commands/update/rollback.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/update/rollback.ts)_
_See code: [src/commands/update/rollback.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/update/rollback.ts)_
## `eas update:view GROUPID`
@@ -1361,7 +1382,7 @@ DESCRIPTION
update group details
```
_See code: [src/commands/update/view.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/update/view.ts)_
_See code: [src/commands/update/view.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/update/view.ts)_
## `eas webhook:create`
@@ -1382,7 +1403,7 @@ DESCRIPTION
create a webhook
```
_See code: [src/commands/webhook/create.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/webhook/create.ts)_
_See code: [src/commands/webhook/create.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/webhook/create.ts)_
## `eas webhook:delete [ID]`
@@ -1402,7 +1423,7 @@ DESCRIPTION
delete a webhook
```
_See code: [src/commands/webhook/delete.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/webhook/delete.ts)_
_See code: [src/commands/webhook/delete.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/webhook/delete.ts)_
## `eas webhook:list`
@@ -1420,7 +1441,7 @@ DESCRIPTION
list webhooks
```
_See code: [src/commands/webhook/list.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/webhook/list.ts)_
_See code: [src/commands/webhook/list.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/webhook/list.ts)_
## `eas webhook:update`
@@ -1442,7 +1463,7 @@ DESCRIPTION
update a webhook
```
_See code: [src/commands/webhook/update.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/webhook/update.ts)_
_See code: [src/commands/webhook/update.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/webhook/update.ts)_
## `eas webhook:view ID`
@@ -1459,7 +1480,7 @@ DESCRIPTION
view a webhook
```
_See code: [src/commands/webhook/view.ts](https://github.com/expo/eas-cli/blob/v7.6.2/src/commands/webhook/view.ts)_
_See code: [src/commands/webhook/view.ts](https://github.com/expo/eas-cli/blob/v7.7.0/src/commands/webhook/view.ts)_
## `eas whoami`
+54
View File
@@ -6780,6 +6780,18 @@
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "isVerboseFastlaneEnabled",
"description": null,
"type": {
"kind": "SCALAR",
"name": "Boolean",
"ofType": null
},
"defaultValue": null,
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "releaseStatus",
"description": null,
@@ -14891,6 +14903,18 @@
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "projectMetadataFileUrl",
"description": null,
"args": [],
"type": {
"kind": "SCALAR",
"name": "String",
"ofType": null
},
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "projectRootDirectory",
"description": null,
@@ -27415,6 +27439,18 @@
"defaultValue": null,
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "isVerboseFastlaneEnabled",
"description": null,
"type": {
"kind": "SCALAR",
"name": "Boolean",
"ofType": null
},
"defaultValue": null,
"isDeprecated": false,
"deprecationReason": null
}
],
"interfaces": null,
@@ -29868,6 +29904,18 @@
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "metadataLocation",
"description": null,
"type": {
"kind": "SCALAR",
"name": "String",
"ofType": null
},
"defaultValue": null,
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "repositoryUrl",
"description": null,
@@ -37732,6 +37780,12 @@
"inputFields": null,
"interfaces": null,
"enumValues": [
{
"name": "EAS_BUILD_GCS_PROJECT_METADATA",
"description": null,
"isDeprecated": false,
"deprecationReason": null
},
{
"name": "EAS_BUILD_GCS_PROJECT_SOURCES",
"description": null,
+5 -5
View File
@@ -1,7 +1,7 @@
{
"name": "eas-cli",
"description": "EAS command line tool",
"version": "7.6.2",
"version": "7.7.0",
"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.88",
"@expo/eas-json": "7.6.1",
"@expo/eas-build-job": "1.0.92",
"@expo/eas-json": "7.7.0",
"@expo/json-file": "8.2.37",
"@expo/multipart-body-parser": "1.1.0",
"@expo/osascript": "2.0.33",
@@ -27,7 +27,7 @@
"@expo/results": "1.0.0",
"@expo/rudder-sdk-node": "1.1.1",
"@expo/spawn-async": "1.7.0",
"@expo/steps": "1.0.91",
"@expo/steps": "1.0.92",
"@expo/timeago.js": "1.0.0",
"@oclif/core": "^1.26.2",
"@oclif/plugin-autocomplete": "^2.3.10",
@@ -109,7 +109,7 @@
"@types/wrap-ansi": "3.0.0",
"axios": "0.27.2",
"eslint-plugin-graphql": "4.0.0",
"express": "4.18.2",
"express": "4.19.2",
"memfs": "3.4.13",
"mockdate": "3.0.5",
"nock": "13.4.0",
+2 -2
View File
@@ -1,4 +1,4 @@
import { Android, Job, Metadata, Platform, Workflow } from '@expo/eas-build-job';
import { Android, Metadata, Platform, Workflow } from '@expo/eas-build-job';
import { AppVersionSource } from '@expo/eas-json';
import chalk from 'chalk';
import nullthrows from 'nullthrows';
@@ -112,7 +112,7 @@ export async function prepareAndroidBuildAsync(
prepareJobAsync: async (
ctx: BuildContext<Platform.ANDROID>,
jobData: JobData<AndroidCredentials>
): Promise<Job> => {
): Promise<Android.Job> => {
return await prepareJobAsync(ctx, jobData);
},
sendBuildRequestAsync: async (
@@ -3,9 +3,8 @@ import {
ArchiveSource,
BuildMode,
BuildTrigger,
Job,
Platform,
sanitizeJob,
sanitizeBuildJob,
} from '@expo/eas-build-job';
import { BuildProfile } from '@expo/eas-json';
import path from 'path';
@@ -29,7 +28,7 @@ const cacheDefaults = {
export async function prepareJobAsync(
ctx: BuildContext<Platform.ANDROID>,
jobData: JobData
): Promise<Job> {
): Promise<Android.Job> {
const username = getUsername(ctx.exp, ctx.user);
const buildProfile: BuildProfile<Platform.ANDROID> = ctx.buildProfile;
const projectRootDirectory =
@@ -105,5 +104,5 @@ export async function prepareJobAsync(
}),
};
return sanitizeJob(job);
return sanitizeBuildJob(job) as Android.Job;
}
+73 -11
View File
@@ -1,4 +1,10 @@
import { ArchiveSource, ArchiveSourceType, Job, Metadata, Platform } from '@expo/eas-build-job';
import {
ArchiveSource,
ArchiveSourceType,
BuildJob,
Metadata,
Platform,
} from '@expo/eas-build-job';
import { CredentialsSource } from '@expo/eas-json';
import assert from 'assert';
import chalk from 'chalk';
@@ -26,7 +32,12 @@ import { transformMetadata } from './graphql';
import { LocalBuildMode, runLocalBuildAsync } from './local';
import { collectMetadataAsync } from './metadata';
import { printDeprecationWarnings } from './utils/printBuildInfo';
import { makeProjectTarballAsync, reviewAndCommitChangesAsync } from './utils/repository';
import {
LocalFile,
makeProjectMetadataFileAsync,
makeProjectTarballAsync,
reviewAndCommitChangesAsync,
} from './utils/repository';
import { BuildEvent } from '../analytics/AnalyticsManager';
import { withAnalyticsAsync } from '../analytics/common';
import { getExpoWebsiteBaseUrl } from '../api';
@@ -65,14 +76,14 @@ export interface JobData<Credentials> {
projectArchive: ArchiveSource;
}
interface Builder<TPlatform extends Platform, Credentials, TJob extends Job> {
interface Builder<TPlatform extends Platform, Credentials, TJob extends BuildJob> {
ctx: BuildContext<TPlatform>;
ensureCredentialsAsync(
ctx: BuildContext<TPlatform>
): Promise<CredentialsResult<Credentials> | undefined>;
syncProjectConfigurationAsync(ctx: BuildContext<TPlatform>): Promise<void>;
prepareJobAsync(ctx: BuildContext<TPlatform>, jobData: JobData<Credentials>): Promise<Job>;
prepareJobAsync(ctx: BuildContext<TPlatform>, jobData: JobData<Credentials>): Promise<BuildJob>;
sendBuildRequestAsync(
appId: string,
job: TJob,
@@ -97,7 +108,7 @@ function resolveBuildParamsInput<T extends Platform>(
export async function prepareBuildRequestForPlatformAsync<
TPlatform extends Platform,
Credentials,
TJob extends Job,
TJob extends BuildJob,
>(builder: Builder<TPlatform, Credentials, TJob>): Promise<BuildRequestSender> {
const { ctx } = builder;
const credentialsResult = await withAnalyticsAsync(
@@ -133,9 +144,10 @@ export async function prepareBuildRequestForPlatformAsync<
let projectArchive: ArchiveSource | undefined;
if (ctx.localBuildOptions.localBuildMode === LocalBuildMode.LOCAL_BUILD_PLUGIN) {
const projectPath = (await makeProjectTarballAsync(ctx.vcsClient)).path;
projectArchive = {
type: ArchiveSourceType.PATH,
path: (await makeProjectTarballAsync(ctx.vcsClient)).path,
path: projectPath,
};
} else if (ctx.localBuildOptions.localBuildMode === LocalBuildMode.INTERNAL) {
projectArchive = {
@@ -145,7 +157,7 @@ export async function prepareBuildRequestForPlatformAsync<
} else if (!ctx.localBuildOptions.localBuildMode) {
projectArchive = {
type: ArchiveSourceType.GCS,
bucketKey: await uploadProjectAsync(ctx),
...(await uploadProjectAsync(ctx)),
};
}
assert(projectArchive);
@@ -231,7 +243,10 @@ export function handleBuildRequestError(error: any, platform: Platform): never {
async function uploadProjectAsync<TPlatform extends Platform>(
ctx: BuildContext<TPlatform>
): Promise<string> {
): Promise<{
bucketKey: string;
metadataLocation?: string;
}> {
let projectTarballPath;
try {
return await withAnalyticsAsync(
@@ -260,7 +275,6 @@ async function uploadProjectAsync<TPlatform extends Platform>(
}
projectTarballPath = projectTarball.path;
const bucketKey = await uploadFileAtPathToGCSAsync(
ctx.graphqlClient,
UploadSessionType.EasBuildGcsProjectSources,
@@ -274,7 +288,11 @@ async function uploadProjectAsync<TPlatform extends Platform>(
completedMessage: (duration: string) => `Uploaded to EAS ${chalk.dim(duration)}`,
})
);
return bucketKey;
const { metadataLocation } = await uploadMetadataFileAsync<TPlatform>(projectTarball, ctx);
if (metadataLocation) {
return { bucketKey, metadataLocation };
}
return { bucketKey };
},
{
attemptEvent: BuildEvent.PROJECT_UPLOAD_ATTEMPT,
@@ -285,9 +303,11 @@ async function uploadProjectAsync<TPlatform extends Platform>(
);
} catch (err: any) {
let errMessage = 'Failed to upload the project tarball to EAS Build';
if (err.message) {
errMessage += `\n\nReason: ${err.message}`;
}
throw new EasBuildProjectArchiveUploadError(errMessage);
} finally {
if (projectTarballPath) {
@@ -296,7 +316,49 @@ async function uploadProjectAsync<TPlatform extends Platform>(
}
}
async function sendBuildRequestAsync<TPlatform extends Platform, Credentials, TJob extends Job>(
async function uploadMetadataFileAsync<TPlatform extends Platform>(
projectTarball: LocalFile,
ctx: BuildContext<TPlatform>
): Promise<{ metadataLocation: string | null }> {
let projectMetadataFile: LocalFile | null = null;
try {
projectMetadataFile = await makeProjectMetadataFileAsync(projectTarball.path);
const metadataLocation = await uploadFileAtPathToGCSAsync(
ctx.graphqlClient,
UploadSessionType.EasBuildGcsProjectMetadata,
projectMetadataFile.path,
createProgressTracker({
total: projectMetadataFile.size,
message: ratio =>
`Uploading metadata to EAS Build (${formatBytes(
projectMetadataFile!.size * ratio
)} / ${formatBytes(projectMetadataFile!.size)})`,
completedMessage: (duration: string) => `Uploaded to EAS ${chalk.dim(duration)}`,
})
);
return { metadataLocation };
} catch (err: any) {
let errMessage = 'Failed to upload metadata to EAS Build';
if (err.message) {
errMessage += `\n\nReason: ${err.message}`;
}
Log.warn(errMessage);
return { metadataLocation: null };
} finally {
if (projectMetadataFile) {
await fs.remove(projectMetadataFile.path);
}
}
}
async function sendBuildRequestAsync<
TPlatform extends Platform,
Credentials,
TJob extends BuildJob,
>(
builder: Builder<TPlatform, Credentials, TJob>,
job: TJob,
metadata: Metadata,
+1
View File
@@ -25,6 +25,7 @@ export function transformProjectArchive(archiveSource: ArchiveSource): ProjectAr
return {
type: ProjectArchiveSourceType.Gcs,
bucketKey: archiveSource.bucketKey,
metadataLocation: archiveSource.metadataLocation,
};
} else if (archiveSource.type === ArchiveSourceType.URL) {
return {
+2 -2
View File
@@ -1,4 +1,4 @@
import { Ios, Job, Metadata, Platform, Workflow } from '@expo/eas-build-job';
import { Ios, Metadata, Platform, Workflow } from '@expo/eas-build-job';
import { AppVersionSource } from '@expo/eas-json';
import { ensureIosCredentialsAsync } from './credentials';
@@ -94,7 +94,7 @@ export async function prepareIosBuildAsync(
prepareJobAsync: async (
ctx: BuildContext<Platform.IOS>,
jobData: JobData<IosCredentials>
): Promise<Job> => {
): Promise<Ios.Job> => {
return await prepareJobAsync(ctx, {
...jobData,
buildScheme: ctx.ios.xcodeBuildContext.buildScheme,
+3 -4
View File
@@ -3,9 +3,8 @@ import {
BuildMode,
BuildTrigger,
Ios,
Job,
Platform,
sanitizeJob,
sanitizeBuildJob,
} from '@expo/eas-build-job';
import { BuildProfile } from '@expo/eas-json';
import nullthrows from 'nullthrows';
@@ -32,7 +31,7 @@ const cacheDefaults = {
export async function prepareJobAsync(
ctx: BuildContext<Platform.IOS>,
jobData: JobData
): Promise<Job> {
): Promise<Ios.Job> {
const username = getUsername(ctx.exp, ctx.user);
const buildProfile: BuildProfile<Platform.IOS> = ctx.buildProfile;
const projectRootDirectory =
@@ -99,7 +98,7 @@ export async function prepareJobAsync(
},
}),
};
return sanitizeJob(job);
return sanitizeBuildJob(job) as Ios.Job;
}
export function prepareCredentialsToResign(credentials: IosCredentials): IosJobSecretsInput {
+1 -1
View File
@@ -6,7 +6,7 @@ import semver from 'semver';
import { ora } from '../ora';
const PLUGIN_PACKAGE_NAME = 'eas-cli-local-build-plugin';
const PLUGIN_PACKAGE_VERSION = '1.0.89';
const PLUGIN_PACKAGE_VERSION = '1.0.95';
export enum LocalBuildMode {
/**
@@ -437,6 +437,7 @@ async function prepareAndStartSubmissionAsync({
projectId: buildCtx.projectId,
exp: buildCtx.exp,
vcsClient: buildCtx.vcsClient,
isVerboseFastlaneEnabled: false,
});
if (moreBuilds) {
+49 -3
View File
@@ -94,9 +94,55 @@ export async function commitPromptAsync(
});
}
export async function makeProjectTarballAsync(
vcsClient: Client
): Promise<{ path: string; size: number }> {
export type LocalFile = {
path: string;
size: number;
};
export async function makeProjectMetadataFileAsync(archivePath: string): Promise<LocalFile> {
const spinner = ora('Creating project metadata file');
const timerLabel = 'makeProjectMetadataFileAsync';
const timer = setTimeout(
() => {
spinner.start();
},
Log.isDebug ? 1 : 1000
);
startTimer(timerLabel);
const metadataLocation = path.join(getTmpDirectory(), `${uuidv4()}-eas-build-metadata.json`);
const archiveContent: string[] = [];
try {
await tar.list({
file: archivePath,
onentry: (entry: tar.ReadEntry) => {
if (entry.type === 'File' && !entry.path.includes('.git/')) {
archiveContent.push(entry.path);
}
},
});
await fs.writeJSON(metadataLocation, {
archiveContent,
});
} catch (e) {
clearTimeout(timer);
if (spinner.isSpinning) {
spinner.fail();
}
throw e;
}
clearTimeout(timer);
const duration = endTimer(timerLabel);
const prettyTime = formatMilliseconds(duration);
spinner.succeed(`Created project metadata file ${chalk.dim(prettyTime)}`);
return { path: metadataLocation, size: await fs.stat(metadataLocation).then(stat => stat.size) };
}
export async function makeProjectTarballAsync(vcsClient: Client): Promise<LocalFile> {
const spinner = ora('Compressing project files');
await fs.mkdirp(getTmpDirectory());
@@ -0,0 +1,64 @@
import { Platform } from '@expo/eas-build-job';
import { Flags } from '@oclif/core';
import EasCommand from '../../commandUtils/EasCommand';
import { SelectBuildProfileFromEasJson } from '../../credentials/manager/SelectBuildProfileFromEasJson';
import { SetUpBuildCredentialsCommandAction } from '../../credentials/manager/SetUpBuildCredentialsCommandAction';
import { selectPlatformAsync } from '../../platform';
export default class InitializeBuildCredentials extends EasCommand {
static override description = 'Set up credentials for building your project.';
static override flags = {
platform: Flags.enum({
char: 'p',
options: [Platform.ANDROID, Platform.IOS],
}),
profile: Flags.string({
char: 'e',
description: 'The name of the build profile in eas.json.',
helpValue: 'PROFILE_NAME',
}),
};
static override contextDefinition = {
...this.ContextOptions.LoggedIn,
...this.ContextOptions.ProjectConfig,
...this.ContextOptions.DynamicProjectConfig,
...this.ContextOptions.Analytics,
...this.ContextOptions.Vcs,
};
async runAsync(): Promise<void> {
const { flags } = await this.parse(InitializeBuildCredentials);
const {
loggedIn: { actor, graphqlClient },
privateProjectConfig,
getDynamicPrivateProjectConfigAsync,
analytics,
vcsClient,
} = await this.getContextAsync(InitializeBuildCredentials, {
nonInteractive: false,
});
const platform = await selectPlatformAsync(flags.platform);
const buildProfile =
flags.profile ??
(await new SelectBuildProfileFromEasJson(
privateProjectConfig.projectDir,
Platform.IOS
).getProfileNameFromEasConfigAsync());
await new SetUpBuildCredentialsCommandAction(
actor,
graphqlClient,
vcsClient,
analytics,
privateProjectConfig ?? null,
getDynamicPrivateProjectConfigAsync,
platform,
buildProfile
).runAsync();
}
}
@@ -1,7 +1,7 @@
import { Flags } from '@oclif/core';
import EasCommand from '../commandUtils/EasCommand';
import { SelectPlatform } from '../credentials/manager/SelectPlatform';
import EasCommand from '../../commandUtils/EasCommand';
import { SelectPlatform } from '../../credentials/manager/SelectPlatform';
export default class Credentials extends EasCommand {
static override description = 'manage credentials';
+9
View File
@@ -33,6 +33,7 @@ interface RawCommandFlags {
verbose: boolean;
wait: boolean;
'non-interactive': boolean;
'verbose-fastlane': boolean;
}
interface CommandFlags {
@@ -42,6 +43,7 @@ interface CommandFlags {
verbose: boolean;
wait: boolean;
nonInteractive: boolean;
isVerboseFastlaneEnabled: boolean;
}
export default class Submit extends EasCommand {
@@ -83,6 +85,10 @@ export default class Submit extends EasCommand {
default: true,
allowNo: true,
}),
'verbose-fastlane': Flags.boolean({
default: false,
description: 'Enable verbose logging for the submission process',
}),
'non-interactive': Flags.boolean({
default: false,
description: 'Run command in non-interactive mode',
@@ -132,6 +138,7 @@ export default class Submit extends EasCommand {
profile: submissionProfile.profile,
archiveFlags: flagsWithPlatform.archiveFlags,
nonInteractive: flagsWithPlatform.nonInteractive,
isVerboseFastlaneEnabled: flagsWithPlatform.isVerboseFastlaneEnabled,
actor,
graphqlClient,
analytics,
@@ -175,6 +182,7 @@ export default class Submit extends EasCommand {
wait,
profile,
'non-interactive': nonInteractive,
'verbose-fastlane': isVerboseFastlaneEnabled,
...archiveFlags
} = flags;
@@ -195,6 +203,7 @@ export default class Submit extends EasCommand {
wait,
profile,
nonInteractive,
isVerboseFastlaneEnabled,
};
}
@@ -35,6 +35,7 @@ export enum AndroidActionType {
SetUpGsaKeyForFcmV1,
UpdateCredentialsJson,
SetUpBuildCredentialsFromCredentialsJson,
SetUpBuildCredentials,
}
export enum IosActionType {
@@ -0,0 +1,46 @@
import { Platform } from '@expo/eas-build-job';
import { BuildProfile, EasJsonAccessor, EasJsonUtils } from '@expo/eas-json';
import Log from '../../log';
export class CheckBuildProfileFlagAgainstEasJson<T extends Platform> {
private easJsonAccessor: EasJsonAccessor;
constructor(
projectDir: string,
private platform: T,
private profileNameFromFlag: string
) {
this.easJsonAccessor = EasJsonAccessor.fromProjectPath(projectDir);
}
async runAsync(): Promise<BuildProfile<T>> {
const profileName = await this.getProfileNameFromEasConfigAsync();
const easConfig = await EasJsonUtils.getBuildProfileAsync<T>(
this.easJsonAccessor,
this.platform,
profileName
);
Log.succeed(`Using build profile: ${profileName}`);
return easConfig;
}
async getProfileNameFromEasConfigAsync(): Promise<string> {
const buildProfileNames = await EasJsonUtils.getBuildProfileNamesAsync(this.easJsonAccessor);
if (buildProfileNames.length === 0) {
throw new Error(
'You need at least one iOS build profile declared in eas.json. Go to https://docs.expo.dev/build/eas-json/ for more details'
);
} else if (buildProfileNames.length === 1) {
return buildProfileNames[0];
}
if (buildProfileNames.includes(this.profileNameFromFlag)) {
return this.profileNameFromFlag;
} else {
throw new Error(
`Build profile ${this.profileNameFromFlag} does not exist in eas.json. Go to https://docs.expo.dev/build/eas-json/ for more details`
);
}
}
}
@@ -34,6 +34,7 @@ import { DownloadKeystore } from '../android/actions/DownloadKeystore';
import { RemoveFcm } from '../android/actions/RemoveFcm';
import { SelectAndRemoveGoogleServiceAccountKey } from '../android/actions/RemoveGoogleServiceAccountKey';
import { RemoveKeystore } from '../android/actions/RemoveKeystore';
import { SetUpBuildCredentials } from '../android/actions/SetUpBuildCredentials';
import { SetUpBuildCredentialsFromCredentialsJson } from '../android/actions/SetUpBuildCredentialsFromCredentialsJson';
import { SetUpGoogleServiceAccountKeyForFcmV1 } from '../android/actions/SetUpGoogleServiceAccountKeyForFcmV1';
import { SetUpGoogleServiceAccountKeyForSubmissions } from '../android/actions/SetUpGoogleServiceAccountKeyForSubmissions';
@@ -48,8 +49,8 @@ import { AndroidPackageNotDefinedError } from '../errors';
export class ManageAndroid {
constructor(
private callingAction: Action,
private projectDir: string
protected callingAction: Action,
protected projectDir: string
) {}
async runAsync(currentActions: ActionInfo[] = highLevelActions): Promise<void> {
@@ -164,7 +165,7 @@ export class ManageAndroid {
}
}
private async createProjectContextAsync(
protected async createProjectContextAsync(
ctx: CredentialsContext,
buildProfile: BuildProfile<Platform.ANDROID>
): Promise<GradleBuildContext | undefined> {
@@ -172,7 +173,7 @@ export class ManageAndroid {
return await resolveGradleBuildContextAsync(ctx.projectDir, buildProfile, ctx.vcsClient);
}
private async runProjectSpecificActionAsync(
protected async runProjectSpecificActionAsync(
ctx: CredentialsContext,
action: AndroidActionType,
gradleContext?: GradleBuildContext
@@ -239,6 +240,8 @@ export class ManageAndroid {
}
} else if (action === AndroidActionType.SetUpBuildCredentialsFromCredentialsJson) {
await new SetUpBuildCredentialsFromCredentialsJson(appLookupParams).runAsync(ctx);
} else if (action === AndroidActionType.SetUpBuildCredentials) {
await new SetUpBuildCredentials({ app: appLookupParams }).runAsync(ctx);
}
}
}
@@ -56,8 +56,8 @@ import { displayIosCredentials } from '../ios/utils/printCredentials';
export class ManageIos {
constructor(
private callingAction: Action,
private projectDir: string
protected callingAction: Action,
protected projectDir: string
) {}
async runAsync(currentActions: ActionInfo[] = highLevelActions): Promise<void> {
@@ -182,7 +182,7 @@ export class ManageIos {
}
}
private async createProjectContextAsync(
protected async createProjectContextAsync(
ctx: CredentialsContext,
account: AccountFragment,
buildProfile: BuildProfile<Platform.IOS>
@@ -215,7 +215,7 @@ export class ManageIos {
};
}
private async runAccountSpecificActionAsync(
protected async runAccountSpecificActionAsync(
ctx: CredentialsContext,
account: AccountFragment,
action: IosActionType
@@ -235,7 +235,7 @@ export class ManageIos {
}
}
private async runProjectSpecificActionAsync(
protected async runProjectSpecificActionAsync(
ctx: CredentialsContext,
app: App,
targets: Target[],
@@ -396,7 +396,7 @@ export class ManageIos {
}
}
private async setupProvisioningProfileWithSpecificDistCertAsync(
protected async setupProvisioningProfileWithSpecificDistCertAsync(
ctx: CredentialsContext,
target: Target,
appLookupParams: AppLookupParams,
@@ -419,7 +419,7 @@ export class ManageIos {
}
}
private async selectTargetAsync(targets: Target[]): Promise<Target> {
protected async selectTargetAsync(targets: Target[]): Promise<Target> {
if (targets.length === 1) {
return targets[0];
}
@@ -0,0 +1,60 @@
import { Platform } from '@expo/eas-build-job';
import assert from 'assert';
import { AndroidActionType } from './Actions';
import { CheckBuildProfileFlagAgainstEasJson } from './CheckBuildProfileFlagAgainstEasJson';
import { Action } from './HelperActions';
import { ManageAndroid } from './ManageAndroid';
import { CredentialsContext, CredentialsContextProjectInfo } from '../context';
export class SetUpAndroidBuildCredentials extends ManageAndroid {
constructor(
callingAction: Action,
projectDir: string,
private setUpBuildCredentialsWithProfileNameFromFlag: string
) {
super(callingAction, projectDir);
}
override async runAsync(): Promise<void> {
const hasProjectContext = !!this.callingAction.projectInfo;
const buildProfile = hasProjectContext
? await new CheckBuildProfileFlagAgainstEasJson(
this.projectDir,
Platform.ANDROID,
this.setUpBuildCredentialsWithProfileNameFromFlag
).runAsync()
: null;
let projectInfo: CredentialsContextProjectInfo | null = null;
if (hasProjectContext) {
const { exp, projectId } = await this.callingAction.getDynamicPrivateProjectConfigAsync({
env: buildProfile?.env,
});
projectInfo = { exp, projectId };
}
const ctx = new CredentialsContext({
projectDir: process.cwd(),
projectInfo,
user: this.callingAction.actor,
graphqlClient: this.callingAction.graphqlClient,
analytics: this.callingAction.analytics,
env: buildProfile?.env,
nonInteractive: false,
vcsClient: this.callingAction.vcsClient,
});
let gradleContext;
if (ctx.hasProjectContext) {
assert(buildProfile, 'buildProfile must be defined in a project context');
gradleContext = await this.createProjectContextAsync(ctx, buildProfile);
}
if (this.setUpBuildCredentialsWithProfileNameFromFlag) {
await this.runProjectSpecificActionAsync(
ctx,
AndroidActionType.SetUpBuildCredentials,
gradleContext
);
}
}
}
@@ -0,0 +1,30 @@
import { Platform } from '@expo/eas-build-job';
import { Analytics } from '../../analytics/AnalyticsManager';
import { DynamicConfigContextFn } from '../../commandUtils/context/DynamicProjectConfigContextField';
import { ExpoGraphqlClient } from '../../commandUtils/context/contextUtils/createGraphqlClient';
import { Actor } from '../../user/User';
import { Client } from '../../vcs/vcs';
import { CredentialsContextProjectInfo } from '../context';
import { SetUpAndroidBuildCredentials } from '../manager/SetUpAndroidBuildCredentials';
import { SetUpIosBuildCredentials } from '../manager/SetUpIosBuildCredentials';
export class SetUpBuildCredentialsCommandAction {
constructor(
public readonly actor: Actor,
public readonly graphqlClient: ExpoGraphqlClient,
public readonly vcsClient: Client,
public readonly analytics: Analytics,
public readonly projectInfo: CredentialsContextProjectInfo | null,
public readonly getDynamicPrivateProjectConfigAsync: DynamicConfigContextFn,
private readonly platform: Platform,
private readonly profileName: string
) {}
async runAsync(): Promise<void> {
if (this.platform === Platform.IOS) {
return await new SetUpIosBuildCredentials(this, process.cwd(), this.profileName).runAsync();
}
return await new SetUpAndroidBuildCredentials(this, process.cwd(), this.profileName).runAsync();
}
}
@@ -0,0 +1,78 @@
import { Platform } from '@expo/eas-build-job';
import assert from 'assert';
import nullthrows from 'nullthrows';
import { IosActionType } from './Actions';
import { CheckBuildProfileFlagAgainstEasJson } from './CheckBuildProfileFlagAgainstEasJson';
import { Action } from './HelperActions';
import { ManageIos } from './ManageIos';
import { AccountFragment } from '../../graphql/generated';
import { getOwnerAccountForProjectIdAsync } from '../../project/projectUtils';
import { ensureActorHasPrimaryAccount } from '../../user/actions';
import { CredentialsContext, CredentialsContextProjectInfo } from '../context';
export class SetUpIosBuildCredentials extends ManageIos {
constructor(
callingAction: Action,
projectDir: string,
private setUpBuildCredentialsWithProfileNameFromFlag: string
) {
super(callingAction, projectDir);
}
override async runAsync(): Promise<void> {
const buildProfile = this.callingAction.projectInfo
? await new CheckBuildProfileFlagAgainstEasJson(
this.projectDir,
Platform.IOS,
this.setUpBuildCredentialsWithProfileNameFromFlag
).runAsync()
: null;
let projectInfo: CredentialsContextProjectInfo | null = null;
if (this.callingAction.projectInfo) {
const { exp, projectId } = await this.callingAction.getDynamicPrivateProjectConfigAsync({
env: buildProfile?.env,
});
projectInfo = { exp, projectId };
}
const ctx = new CredentialsContext({
projectDir: process.cwd(),
projectInfo,
user: this.callingAction.actor,
graphqlClient: this.callingAction.graphqlClient,
analytics: this.callingAction.analytics,
env: buildProfile?.env,
nonInteractive: false,
vcsClient: this.callingAction.vcsClient,
});
await ctx.bestEffortAppStoreAuthenticateAsync();
const getAccountForProjectAsync = async (projectId: string): Promise<AccountFragment> => {
return await getOwnerAccountForProjectIdAsync(ctx.graphqlClient, projectId);
};
const account = ctx.hasProjectContext
? await getAccountForProjectAsync(ctx.projectId)
: ensureActorHasPrimaryAccount(ctx.user);
let app = null;
let targets = null;
if (ctx.hasProjectContext) {
assert(buildProfile, 'buildProfile must be defined in project context');
const projectContext = await this.createProjectContextAsync(ctx, account, buildProfile);
app = projectContext.app;
targets = projectContext.targets;
}
await this.runProjectSpecificActionAsync(
ctx,
nullthrows(app, 'app must be defined in project context'),
nullthrows(targets, 'targets must be defined in project context'),
nullthrows(buildProfile, 'buildProfile must be defined in project context'),
IosActionType.SetUpBuildCredentials
);
}
}
+5
View File
@@ -1024,6 +1024,7 @@ export type AndroidSubmissionConfigInput = {
changesNotSentForReview?: InputMaybe<Scalars['Boolean']['input']>;
googleServiceAccountKeyId?: InputMaybe<Scalars['String']['input']>;
googleServiceAccountKeyJson?: InputMaybe<Scalars['String']['input']>;
isVerboseFastlaneEnabled?: InputMaybe<Scalars['Boolean']['input']>;
releaseStatus?: InputMaybe<SubmissionAndroidReleaseStatus>;
rollout?: InputMaybe<Scalars['Float']['input']>;
track: SubmissionAndroidTrack;
@@ -2152,6 +2153,7 @@ export type Build = ActivityTimelineProjectActivity & BuildOrBuildJob & {
platform: AppPlatform;
priority: BuildPriority;
project: Project;
projectMetadataFileUrl?: Maybe<Scalars['String']['output']>;
projectRootDirectory?: Maybe<Scalars['String']['output']>;
provisioningStartedAt?: Maybe<Scalars['DateTime']['output']>;
/** Queue position is 1-indexed */
@@ -3924,6 +3926,7 @@ export type IosSubmissionConfigInput = {
ascApiKey?: InputMaybe<AscApiKeyInput>;
ascApiKeyId?: InputMaybe<Scalars['String']['input']>;
ascAppIdentifier: Scalars['String']['input'];
isVerboseFastlaneEnabled?: InputMaybe<Scalars['Boolean']['input']>;
};
export type KeystoreGenerationUrl = {
@@ -4285,6 +4288,7 @@ export type Project = {
export type ProjectArchiveSourceInput = {
bucketKey?: InputMaybe<Scalars['String']['input']>;
gitRef?: InputMaybe<Scalars['String']['input']>;
metadataLocation?: InputMaybe<Scalars['String']['input']>;
repositoryUrl?: InputMaybe<Scalars['String']['input']>;
type: ProjectArchiveSourceType;
url?: InputMaybe<Scalars['String']['input']>;
@@ -5435,6 +5439,7 @@ export type UploadSessionCreateUploadSessionArgs = {
};
export enum UploadSessionType {
EasBuildGcsProjectMetadata = 'EAS_BUILD_GCS_PROJECT_METADATA',
EasBuildGcsProjectSources = 'EAS_BUILD_GCS_PROJECT_SOURCES',
/** @deprecated Use EAS_BUILD_GCS_PROJECT_SOURCES instead. */
EasBuildProjectSources = 'EAS_BUILD_PROJECT_SOURCES',
@@ -112,6 +112,7 @@ export default class AndroidSubmitter extends BaseSubmitter<
changesNotSentForReview,
releaseStatus,
rollout,
isVerboseFastlaneEnabled: this.ctx.isVerboseFastlaneEnabled,
...serviceAccountKeyResult.result,
};
}
@@ -123,6 +123,7 @@ describe(AndroidSubmitCommand, () => {
changesNotSentForReview: false,
},
nonInteractive: true,
isVerboseFastlaneEnabled: false,
actor: mockJester,
graphqlClient,
analytics,
@@ -159,6 +160,7 @@ describe(AndroidSubmitCommand, () => {
changesNotSentForReview: false,
},
nonInteractive: false,
isVerboseFastlaneEnabled: false,
actor: mockJester,
graphqlClient,
analytics,
@@ -178,6 +180,7 @@ describe(AndroidSubmitCommand, () => {
releaseStatus: SubmissionAndroidReleaseStatus.Draft,
track: SubmissionAndroidTrack.Internal,
changesNotSentForReview: false,
isVerboseFastlaneEnabled: false,
},
});
});
@@ -203,6 +206,7 @@ describe(AndroidSubmitCommand, () => {
changesNotSentForReview: false,
},
nonInteractive: false,
isVerboseFastlaneEnabled: false,
actor: mockJester,
graphqlClient,
analytics,
@@ -222,6 +226,7 @@ describe(AndroidSubmitCommand, () => {
releaseStatus: SubmissionAndroidReleaseStatus.InProgress,
track: SubmissionAndroidTrack.Internal,
changesNotSentForReview: false,
isVerboseFastlaneEnabled: false,
},
});
});
@@ -250,6 +255,7 @@ describe(AndroidSubmitCommand, () => {
changesNotSentForReview: false,
},
nonInteractive: false,
isVerboseFastlaneEnabled: false,
actor: mockJester,
graphqlClient,
analytics,
@@ -267,6 +273,7 @@ describe(AndroidSubmitCommand, () => {
releaseStatus: SubmissionAndroidReleaseStatus.Draft,
track: SubmissionAndroidTrack.Internal,
changesNotSentForReview: false,
isVerboseFastlaneEnabled: false,
},
submittedBuildId: fakeBuildFragment.id,
});
@@ -312,6 +319,7 @@ describe(AndroidSubmitCommand, () => {
changesNotSentForReview: false,
},
nonInteractive: false,
isVerboseFastlaneEnabled: false,
actor: mockJester,
graphqlClient,
analytics,
@@ -334,6 +342,7 @@ describe(AndroidSubmitCommand, () => {
track: SubmissionAndroidTrack.Beta,
changesNotSentForReview: false,
rollout: undefined,
isVerboseFastlaneEnabled: false,
},
submittedBuildId: selectedBuild.id,
}
@@ -372,6 +381,7 @@ describe(AndroidSubmitCommand, () => {
changesNotSentForReview: false,
},
nonInteractive: false,
isVerboseFastlaneEnabled: false,
actor: mockJester,
graphqlClient,
analytics,
@@ -394,6 +404,7 @@ describe(AndroidSubmitCommand, () => {
track: SubmissionAndroidTrack.Internal,
changesNotSentForReview: false,
rollout: undefined,
isVerboseFastlaneEnabled: false,
},
submittedBuildId: selectedBuild.id,
}
@@ -439,6 +450,7 @@ describe(AndroidSubmitCommand, () => {
changesNotSentForReview: false,
},
nonInteractive: false,
isVerboseFastlaneEnabled: false,
actor: mockJester,
graphqlClient,
analytics,
@@ -462,6 +474,7 @@ describe(AndroidSubmitCommand, () => {
track: SubmissionAndroidTrack.Internal,
changesNotSentForReview: false,
rollout: undefined,
isVerboseFastlaneEnabled: false,
},
submittedBuildId: selectedBuild.id,
}
@@ -156,6 +156,7 @@ describe(getServiceAccountKeyResultAsync, () => {
changesNotSentForReview: false,
},
nonInteractive: true,
isVerboseFastlaneEnabled: false,
actor: mockJester,
graphqlClient,
analytics,
@@ -198,6 +199,7 @@ describe(getServiceAccountKeyResultAsync, () => {
changesNotSentForReview: false,
},
nonInteractive: true,
isVerboseFastlaneEnabled: false,
actor: mockJester,
graphqlClient,
analytics,
@@ -236,6 +238,7 @@ describe(getServiceAccountKeyResultAsync, () => {
changesNotSentForReview: false,
},
nonInteractive: true,
isVerboseFastlaneEnabled: false,
actor: mockJester,
graphqlClient,
analytics,
+2
View File
@@ -21,6 +21,7 @@ export interface SubmissionContext<T extends Platform> {
analyticsEventProperties: AnalyticsEventProperties;
exp: ExpoConfig;
nonInteractive: boolean;
isVerboseFastlaneEnabled: boolean;
platform: T;
profile: SubmitProfile<T>;
projectDir: string;
@@ -46,6 +47,7 @@ export async function createSubmissionContextAsync<T extends Platform>(params: {
credentialsCtx?: CredentialsContext;
env?: Record<string, string>;
nonInteractive: boolean;
isVerboseFastlaneEnabled: boolean;
platform: T;
profile: SubmitProfile<T>;
projectDir: string;
@@ -32,6 +32,7 @@ export interface IosSubmissionOptions
archiveSource: ArchiveSource;
appSpecificPasswordSource?: AppSpecificPasswordSource;
ascApiKeySource?: AscApiKeySource;
isVerboseFastlaneEnabled?: boolean;
}
interface ResolvedSourceOptions {
@@ -124,9 +125,11 @@ export default class IosSubmitter extends BaseSubmitter<
): IosSubmissionConfigInput {
const { appSpecificPassword, ascApiKeyResult } = credentials;
const { appleIdUsername, ascAppIdentifier } = options;
const { isVerboseFastlaneEnabled } = this.ctx;
return {
ascAppIdentifier,
appleIdUsername,
isVerboseFastlaneEnabled,
...(appSpecificPassword ? this.formatAppSpecificPassword(appSpecificPassword) : null),
...(ascApiKeyResult?.result ? this.formatAscApiKeyResult(ascApiKeyResult.result) : null),
};
@@ -57,6 +57,7 @@ async function getIosSubmissionContextAsync(): Promise<SubmissionContext<Platfor
language: 'en-US',
},
nonInteractive: true,
isVerboseFastlaneEnabled: false,
actor: mockJester,
graphqlClient,
analytics,
@@ -249,6 +250,7 @@ describe(getAscApiKeyResultAsync, () => {
language: 'en-US',
},
nonInteractive: true,
isVerboseFastlaneEnabled: false,
actor: mockJester,
graphqlClient,
analytics,
@@ -100,6 +100,7 @@ describe(IosSubmitCommand, () => {
ascAppId: '12345678',
},
nonInteractive: false,
isVerboseFastlaneEnabled: false,
actor: mockJester,
graphqlClient,
analytics,
@@ -134,6 +135,7 @@ describe(IosSubmitCommand, () => {
language: 'en-US',
},
nonInteractive: true,
isVerboseFastlaneEnabled: false,
actor: mockJester,
graphqlClient,
analytics,
@@ -169,6 +171,7 @@ describe(IosSubmitCommand, () => {
ascAppId: '12345678',
},
nonInteractive: false,
isVerboseFastlaneEnabled: false,
actor: mockJester,
graphqlClient,
analytics,
@@ -186,7 +189,9 @@ describe(IosSubmitCommand, () => {
appleIdUsername: '[email protected]',
appleAppSpecificPassword: 'abcd-abcd-abcd-abcd',
ascAppIdentifier: '12345678',
isVerboseFastlaneEnabled: false,
},
submittedBuildId: undefined,
});
delete process.env.EXPO_APPLE_APP_SPECIFIC_PASSWORD;
@@ -231,6 +236,7 @@ describe(IosSubmitCommand, () => {
ascAppId: '12345678',
},
nonInteractive: false,
isVerboseFastlaneEnabled: false,
actor: mockJester,
graphqlClient,
analytics,
@@ -248,6 +254,7 @@ describe(IosSubmitCommand, () => {
appleIdUsername: '[email protected]',
appleAppSpecificPassword: 'abcd-abcd-abcd-abcd',
ascAppIdentifier: '87654321',
isVerboseFastlaneEnabled: false,
},
archiveSource: undefined,
});
@@ -288,6 +295,7 @@ describe(IosSubmitCommand, () => {
ascAppId: '12345678',
},
nonInteractive: false,
isVerboseFastlaneEnabled: false,
actor: mockJester,
graphqlClient,
analytics,
@@ -305,6 +313,7 @@ describe(IosSubmitCommand, () => {
appleIdUsername: '[email protected]',
appleAppSpecificPassword: 'abcd-abcd-abcd-abcd',
ascAppIdentifier: '12345678',
isVerboseFastlaneEnabled: false,
},
archiveSource: undefined,
});
@@ -350,6 +359,7 @@ describe(IosSubmitCommand, () => {
ascAppId: '12345678',
},
nonInteractive: false,
isVerboseFastlaneEnabled: false,
actor: mockJester,
graphqlClient,
analytics,
@@ -368,6 +378,7 @@ describe(IosSubmitCommand, () => {
appleIdUsername: '[email protected]',
appleAppSpecificPassword: 'abcd-abcd-abcd-abcd',
ascAppIdentifier: '12345678',
isVerboseFastlaneEnabled: false,
},
archiveSource: undefined,
});
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "@expo/eas-json",
"description": "A library for interacting with eas.json",
"version": "7.6.1",
"version": "7.7.0",
"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.88",
"@expo/eas-build-job": "1.0.92",
"chalk": "4.1.2",
"env-string": "1.0.1",
"fs-extra": "11.2.0",
+15 -64
View File
@@ -24,19 +24,14 @@
"version": {
"type": "string",
"description": "The compatible versions of EAS CLI with this config",
"examples": [
">=0.54.1"
]
"examples": [">=0.54.1"]
},
"requireCommit": {
"type": "boolean",
"description": "If all changes required to be committed before building or submitting"
},
"appVersionSource": {
"enum": [
"local",
"remote"
],
"enum": ["local", "remote"],
"markdownDescription": "Version policy defines whether version of your app should be based on your local project or values stored on EAS servers (remote).\n\nThis is the configuration required for `eas build:version:set` and works with the `autoIncrement` options per platform.",
"markdownEnumDescriptions": [
"When using local, the `autoIncrement` is based on your local project values.",
@@ -107,10 +102,7 @@
"description": "The name of the build profile that the current one should inherit values from. This value can't be specified per platform."
},
"credentialsSource": {
"enum": [
"remote",
"local"
],
"enum": ["remote", "local"],
"description": "The source of credentials used to sign build artifacts. Learn more: https://docs.expo.dev/app-signing/local-credentials/",
"markdownDescription": "The source of credentials used to sign build artifacts.\n\n- `remote` - if you want to use the credentials managed by EAS.\n- `local` - if you want to provide your own `credentials.json` file. [learn more](https://docs.expo.dev/app-signing/local-credentials/)",
"default": "remote",
@@ -132,10 +124,7 @@
"markdownDescription": "The channel is a name we can give to multiple builds to identify them easily. [Learn more](https://docs.expo.dev/eas-update/how-eas-update-works/)\n\n**This field only applies to the EAS Update service**, if your project still uses Classic Updates then use the [releaseChannel](https://docs.expo.dev/build-reference/eas-json/#releasechannel) field instead."
},
"distribution": {
"enum": [
"internal",
"store"
],
"enum": ["internal", "store"],
"description": "The method of distributing your app. Learn more: https://docs.expo.dev/build/internal-distribution/",
"markdownDescription": "The method of distributing your app.\n\n- `internal` - with this option you'll be able to share your build URLs with anyone, and they will be able to install the builds to their devices straight from the Expo website. When using `internal`, make sure the build produces an APK or IPA file. Otherwise, the shareable URL will be useless. [Learn more](https://docs.expo.dev/build/internal-distribution/)\n- `store` - produces builds for store uploads, your build URLs won't be shareable.",
"markdownEnumDescriptions": [
@@ -214,11 +203,7 @@
"default": "default",
"anyOf": [
{
"enum": [
"default",
"medium",
"large"
]
"enum": ["default", "medium", "large"]
},
{
"type": "string"
@@ -282,11 +267,7 @@
"default": "default",
"anyOf": [
{
"enum": [
"default",
"medium",
"large"
]
"enum": ["default", "medium", "large"]
},
{
"type": "string"
@@ -298,12 +279,7 @@
"description": "The version of Android NDK."
},
"autoIncrement": {
"enum": [
false,
true,
"versionCode",
"version"
],
"enum": [false, true, "versionCode", "version"],
"description": "Controls how EAS CLI bumps your application build version.",
"markdownDescription": "Controls how EAS CLI bumps your application build version.\n\nAllowed values:\n- `\"version\"` - bumps the patch of `expo.version` (e.g. `1.2.3` -> `1.2.4`).\n- `\"versionCode\"` (or `true`) - bumps `expo.android.versionCode` (e.g. `3` -> `4`).\n- `false` - versions won't be bumped automatically (default)\n\nIn the case of a bare project, it also updates versions in native code. `expo.version` corresponds to `versionName` and `expo.android.versionCode` to `versionCode` in the `build.gradle`. Google Play uses these values to identify the app build, `versionName` is the version visible to users, whereas `versionCode` defines the version number. The combination of those needs to be unique, so you can bump either of them.\n\nThis feature is not intended for use with dynamic configuration (app.config.js). EAS CLI will throw an error if you don't use app.json.",
"default": false,
@@ -315,10 +291,7 @@
]
},
"buildType": {
"enum": [
"app-bundle",
"apk"
],
"enum": ["app-bundle", "apk"],
"description": "Type of the artifact you want to build.",
"markdownDescription": "Type of the artifact you want to build. It controls what Gradle task will be used, can be overridden by `gradleCommand` or `developmentClient: true` option.\n- `app-bundle` - `:app:bundleRelease`\n- `apk` - `:app:assembleRelease`",
"markdownEnumDescriptions": [
@@ -365,22 +338,14 @@
"default": false
},
"enterpriseProvisioning": {
"enum": [
"universal",
"adhoc"
],
"enum": ["universal", "adhoc"],
"markdownDescription": "Provisioning method used for `\"distribution\": \"internal\"` when you have an Apple account with Apple Developer Enterprise Program membership.\n\nYou can choose if you want to use `adhoc` or `universal` provisioning. The latter is recommended as it does not require you to register each individual device. If you don't provide this option and you still authenticate with an enterprise team, you'll be prompted which provisioning method to use.",
"markdownEnumDescriptions": [
"Recommended as it does not require you to register each individual device"
]
},
"autoIncrement": {
"enum": [
false,
true,
"buildNumber",
"version"
],
"enum": [false, true, "buildNumber", "version"],
"description": "Controls how EAS CLI bumps your application build version.",
"markdownDescription": "Controls how EAS CLI bumps your application build version.\n\nAllowed values:\n\n- `\"version\"` - bumps the patch of `expo.version` (e.g. `1.2.3` -> `1.2.4`).\n- `\"buildNumber\"` (or `true`) - bumps the last component of `expo.ios.buildNumber` (e.g. `1.2.3.39` -> `1.2.3.40`).\n- `false` - versions won't be bumped automatically (default)\n\nIn the case of a bare project, it also updates versions in native code. `expo.version` corresponds to `CFBundleShortVersionString` and `expo.ios.buildNumber` to `CFBundleVersion` in the `Info.plist`. The App Store is using those values to identify the app build, `CFBundleShortVersionString` is the version visible to users, whereas `CFBundleVersion` defines the build number. The combination of those needs to be unique, so you can bump either of them.\n\nThis feature is not intended for use with dynamic configuration (app.config.js). EAS CLI will throw an error if you don't use app.json.",
"default": false,
@@ -400,6 +365,7 @@
"enum": [
"default",
"latest",
"macos-sonoma-14.4-xcode-15.3",
"macos-ventura-13.6-xcode-15.2",
"macos-ventura-13.6-xcode-15.1",
"macos-ventura-13.6-xcode-15.0",
@@ -411,7 +377,7 @@
],
"markdownEnumDescriptions": [
"`macos-ventura-13.4-xcode-14.3.1`",
"`macos-ventura-13.6-xcode-15.2`"
"`macos-sonoma-14.4-xcode-15.3`"
]
},
{
@@ -435,12 +401,7 @@
"default": "default",
"anyOf": [
{
"enum": [
"default",
"medium",
"large",
"m-medium"
]
"enum": ["default", "medium", "large", "m-medium"]
},
{
"type": "string"
@@ -524,12 +485,7 @@
"markdownDescription": "Path to the JSON file with service account key used to authenticate with Google Play. [Learn more](https://expo.fyi/creating-google-service-account)"
},
"track": {
"enum": [
"beta",
"alpha",
"internal",
"production"
],
"enum": ["beta", "alpha", "internal", "production"],
"description": "The track of the application to use. Learn more: https://support.google.com/googleplay/android-developer/answer/9859348?hl=en",
"markdownDescription": "The [track of the application](https://support.google.com/googleplay/android-developer/answer/9859348?hl=en) to use.",
"markdownEnumDescriptions": [
@@ -540,12 +496,7 @@
]
},
"releaseStatus": {
"enum": [
"draft",
"inProgress",
"halted",
"completed"
],
"enum": ["draft", "inProgress", "halted", "completed"],
"description": "The status of a release. Learn more: https://developers.google.com/android-publisher/api-ref/rest/v3/edits.tracks",
"markdownDescription": "The status of a release. [Learn more](https://developers.google.com/android-publisher/api-ref/rest/v3/edits.tracks)",
"enumDescriptions": [
Generated
+40 -86
View File
@@ -1462,10 +1462,10 @@
slugify "^1.3.4"
sucrase "^3.20.0"
"@expo/[email protected].88":
version "1.0.88"
resolved "https://registry.yarnpkg.com/@expo/eas-build-job/-/eas-build-job-1.0.88.tgz#9ab0ab07f4f8fd0f172a0b8cc4715da91872f11e"
integrity sha512-r9t0G5ck/4ueWL5BZu9ZGRVZlGi03jPyBwq1tyXpJRHGokLAYPqw4TPcK92qZlKUUwMcBRk4/DpWjG2y4Cydlw==
"@expo/[email protected].92":
version "1.0.92"
resolved "https://registry.yarnpkg.com/@expo/eas-build-job/-/eas-build-job-1.0.92.tgz#e32a528a484b12292bc107c58a39374785ad65af"
integrity sha512-IcXt41YGN1Teo16PGCAHim745969jXKUTroQhZJiFAkam56xLoZeefvMBQUqS4bpustBkU1RBDU7bud5So/WQQ==
dependencies:
joi "^17.11.0"
semver "^7.5.4"
@@ -1666,12 +1666,12 @@
dependencies:
cross-spawn "^7.0.3"
"@expo/[email protected]1":
version "1.0.91"
resolved "https://registry.yarnpkg.com/@expo/steps/-/steps-1.0.91.tgz#f883fe1ce8cfdd01e2f729fa978b372098a13981"
integrity sha512-I1Rdt7w4EIgXo1uB693kw8CFeQGVlfUapIHZv9vuspNQfVPUl1I5s7EMku3EhtVkalcdXRN6Hximvvnwguhpqg==
"@expo/[email protected]2":
version "1.0.92"
resolved "https://registry.yarnpkg.com/@expo/steps/-/steps-1.0.92.tgz#79f760e176be82bbb9e678b88e2c343e9ae7c333"
integrity sha512-A/J6EGnqpw1928BPVMHwFyW+4UyCkdTYVAyCsHPTg4Pi76P0XFfhMdU5YQcgnZSWgum+CMMaN3AorDV52Mf11Q==
dependencies:
"@expo/eas-build-job" "1.0.88"
"@expo/eas-build-job" "1.0.92"
"@expo/logger" "1.0.57"
"@expo/spawn-async" "^1.7.2"
arg "^5.0.2"
@@ -4821,13 +4821,13 @@ bl@^4.0.3, bl@^4.1.0:
inherits "^2.0.4"
readable-stream "^3.4.0"
[email protected].1:
version "1.20.1"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668"
integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==
[email protected].2:
version "1.20.2"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd"
integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==
dependencies:
bytes "3.1.2"
content-type "~1.0.4"
content-type "~1.0.5"
debug "2.6.9"
depd "2.0.0"
destroy "1.2.0"
@@ -4835,7 +4835,7 @@ [email protected]:
iconv-lite "0.4.24"
on-finished "2.4.1"
qs "6.11.0"
raw-body "2.5.1"
raw-body "2.5.2"
type-is "~1.6.18"
unpipe "1.0.0"
@@ -5580,10 +5580,10 @@ [email protected]:
dependencies:
safe-buffer "5.2.1"
content-type@^1.0.4, content-type@~1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
content-type@^1.0.4, content-type@~1.0.4, content-type@~1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918"
integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
[email protected]:
version "7.0.0"
@@ -5675,10 +5675,10 @@ [email protected]:
resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
cookie@0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
cookie@0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051"
integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==
core-util-is@~1.0.0:
version "1.0.2"
@@ -5841,10 +5841,10 @@ [email protected], debug@^2.2.0:
dependencies:
ms "2.0.0"
debug@4, debug@^4.1.0, debug@^4.1.1:
version "4.2.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1"
integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==
debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4:
version "4.3.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
dependencies:
ms "2.1.2"
@@ -5855,27 +5855,6 @@ debug@^3.2.7:
dependencies:
ms "^2.1.1"
debug@^4.3.1:
version "4.3.2"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==
dependencies:
ms "2.1.2"
debug@^4.3.2, debug@^4.3.3:
version "4.3.3"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664"
integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
dependencies:
ms "2.1.2"
debug@^4.3.4:
version "4.3.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
dependencies:
ms "2.1.2"
debuglog@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
@@ -6832,17 +6811,17 @@ expect@^29.7.0:
jest-message-util "^29.7.0"
jest-util "^29.7.0"
[email protected]8.2:
version "4.18.2"
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==
[email protected]9.2:
version "4.19.2"
resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465"
integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==
dependencies:
accepts "~1.3.8"
array-flatten "1.1.1"
body-parser "1.20.1"
body-parser "1.20.2"
content-disposition "0.5.4"
content-type "~1.0.4"
cookie "0.5.0"
cookie "0.6.0"
cookie-signature "1.0.6"
debug "2.6.9"
depd "2.0.0"
@@ -11802,10 +11781,10 @@ range-parser@~1.2.1:
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
[email protected].1:
version "2.5.1"
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857"
integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==
[email protected].2:
version "2.5.2"
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a"
integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==
dependencies:
bytes "3.1.2"
http-errors "2.0.0"
@@ -12724,16 +12703,7 @@ string-length@^5.0.1:
char-regex "^2.0.0"
strip-ansi "^7.0.1"
"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:
"string-width-cjs@npm:string-width@^4.2.0", "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==
@@ -12850,7 +12820,7 @@ string_decoder@~1.1.1:
dependencies:
safe-buffer "~5.1.0"
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", 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==
@@ -12864,13 +12834,6 @@ 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"
@@ -14032,16 +13995,7 @@ 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":
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:
"wrap-ansi-cjs@npm:wrap-ansi@^7.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==