Compare commits

..
41 changed files with 371 additions and 244 deletions

No files matched your search

-5
View File
@@ -8,16 +8,11 @@ This is the log of notable changes to EAS CLI and related packages.
### 🎉 New features
- Fix expo-updates fingerprinting during update. ([#2231](https://github.com/expo/eas-cli/pull/2231) by [@wschurman](https://github.com/wschurman))
### 🐛 Bug fixes
- Don't require expo on fresh react-native project. ([#2235](https://github.com/expo/eas-cli/pull/2235) by [@radoslawkrzemien](https://github.com/radoslawkrzemien))
### 🧹 Chores
- Upgrade [`eas-build`](https://github.com/expo/eas-build) dependencies. ([#2229](https://github.com/expo/eas-cli/pull/2229) by [@expo-bot](https://github.com/expo-bot))
- Upgrade [`eas-build`](https://github.com/expo/eas-build) dependencies. ([#2230](https://github.com/expo/eas-cli/pull/2230) by [@expo-bot](https://github.com/expo-bot))
## [7.2.0](https://github.com/expo/eas-cli/releases/tag/v7.2.0) - 2024-02-11
+1 -1
View File
@@ -1,5 +1,5 @@
{
"npmClient": "yarn",
"version": "7.3.0",
"version": "7.2.0",
"$schema": "node_modules/lerna/schemas/lerna-schema.json"
}
+58 -58
View File
@@ -136,7 +136,7 @@ ALIASES
$ eas login
```
_See code: [src/commands/account/login.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/account/login.ts)_
_See code: [src/commands/account/login.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/account/login.ts)_
## `eas account:logout`
@@ -153,7 +153,7 @@ ALIASES
$ eas logout
```
_See code: [src/commands/account/logout.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/account/logout.ts)_
_See code: [src/commands/account/logout.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/account/logout.ts)_
## `eas account:view`
@@ -170,7 +170,7 @@ ALIASES
$ eas whoami
```
_See code: [src/commands/account/view.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/account/view.ts)_
_See code: [src/commands/account/view.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/account/view.ts)_
## `eas analytics [STATUS]`
@@ -184,7 +184,7 @@ DESCRIPTION
display or change analytics settings
```
_See code: [src/commands/analytics.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/analytics.ts)_
_See code: [src/commands/analytics.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/analytics.ts)_
## `eas autocomplete [SHELL]`
@@ -236,7 +236,7 @@ DESCRIPTION
create a branch
```
_See code: [src/commands/branch/create.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/branch/create.ts)_
_See code: [src/commands/branch/create.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/branch/create.ts)_
## `eas branch:delete [NAME]`
@@ -257,7 +257,7 @@ DESCRIPTION
delete a branch
```
_See code: [src/commands/branch/delete.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/branch/delete.ts)_
_See code: [src/commands/branch/delete.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/branch/delete.ts)_
## `eas branch:list`
@@ -277,7 +277,7 @@ DESCRIPTION
list all branches
```
_See code: [src/commands/branch/list.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/branch/list.ts)_
_See code: [src/commands/branch/list.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/branch/list.ts)_
## `eas branch:rename`
@@ -297,7 +297,7 @@ DESCRIPTION
rename a branch
```
_See code: [src/commands/branch/rename.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/branch/rename.ts)_
_See code: [src/commands/branch/rename.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/branch/rename.ts)_
## `eas branch:view [NAME]`
@@ -320,7 +320,7 @@ DESCRIPTION
view a branch
```
_See code: [src/commands/branch/view.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/branch/view.ts)_
_See code: [src/commands/branch/view.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/branch/view.ts)_
## `eas build`
@@ -350,7 +350,7 @@ DESCRIPTION
start a build
```
_See code: [src/commands/build/index.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/build/index.ts)_
_See code: [src/commands/build/index.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/build/index.ts)_
## `eas build:cancel [BUILD_ID]`
@@ -369,7 +369,7 @@ DESCRIPTION
cancel a build
```
_See code: [src/commands/build/cancel.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/build/cancel.ts)_
_See code: [src/commands/build/cancel.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/build/cancel.ts)_
## `eas build:configure`
@@ -386,7 +386,7 @@ DESCRIPTION
configure the project to support EAS Build
```
_See code: [src/commands/build/configure.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/build/configure.ts)_
_See code: [src/commands/build/configure.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/build/configure.ts)_
## `eas build:delete [BUILD_ID]`
@@ -405,7 +405,7 @@ DESCRIPTION
delete a build
```
_See code: [src/commands/build/delete.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/build/delete.ts)_
_See code: [src/commands/build/delete.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/build/delete.ts)_
## `eas build:inspect`
@@ -440,7 +440,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.3.0/src/commands/build/inspect.ts)_
_See code: [src/commands/build/inspect.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/build/inspect.ts)_
## `eas build:list`
@@ -481,7 +481,7 @@ DESCRIPTION
list all builds for your project
```
_See code: [src/commands/build/list.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/build/list.ts)_
_See code: [src/commands/build/list.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/build/list.ts)_
## `eas build:resign`
@@ -507,7 +507,7 @@ DESCRIPTION
re-sign a build archive
```
_See code: [src/commands/build/resign.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/build/resign.ts)_
_See code: [src/commands/build/resign.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/build/resign.ts)_
## `eas build:run`
@@ -533,7 +533,7 @@ DESCRIPTION
run simulator/emulator builds from eas-cli
```
_See code: [src/commands/build/run.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/build/run.ts)_
_See code: [src/commands/build/run.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/build/run.ts)_
## `eas build:submit`
@@ -582,7 +582,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.3.0/src/commands/build/version/get.ts)_
_See code: [src/commands/build/version/get.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/build/version/get.ts)_
## `eas build:version:set`
@@ -601,7 +601,7 @@ DESCRIPTION
update version of an app
```
_See code: [src/commands/build/version/set.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/build/version/set.ts)_
_See code: [src/commands/build/version/set.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/build/version/set.ts)_
## `eas build:version:sync`
@@ -620,7 +620,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.3.0/src/commands/build/version/sync.ts)_
_See code: [src/commands/build/version/sync.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/build/version/sync.ts)_
## `eas build:view [BUILD_ID]`
@@ -637,7 +637,7 @@ DESCRIPTION
view a build for your project
```
_See code: [src/commands/build/view.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/build/view.ts)_
_See code: [src/commands/build/view.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/build/view.ts)_
## `eas channel:create [NAME]`
@@ -658,7 +658,7 @@ DESCRIPTION
create a channel
```
_See code: [src/commands/channel/create.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/channel/create.ts)_
_See code: [src/commands/channel/create.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/channel/create.ts)_
## `eas channel:edit [NAME]`
@@ -680,7 +680,7 @@ DESCRIPTION
point a channel at a new branch
```
_See code: [src/commands/channel/edit.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/channel/edit.ts)_
_See code: [src/commands/channel/edit.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/channel/edit.ts)_
## `eas channel:list`
@@ -700,7 +700,7 @@ DESCRIPTION
list all channels
```
_See code: [src/commands/channel/list.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/channel/list.ts)_
_See code: [src/commands/channel/list.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/channel/list.ts)_
## `eas channel:rollout [CHANNEL]`
@@ -732,7 +732,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.3.0/src/commands/channel/rollout.ts)_
_See code: [src/commands/channel/rollout.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/channel/rollout.ts)_
## `eas channel:view [NAME]`
@@ -755,7 +755,7 @@ DESCRIPTION
view a channel
```
_See code: [src/commands/channel/view.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/channel/view.ts)_
_See code: [src/commands/channel/view.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/channel/view.ts)_
## `eas config`
@@ -776,7 +776,7 @@ DESCRIPTION
display project configuration (app.json + eas.json)
```
_See code: [src/commands/config.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/config.ts)_
_See code: [src/commands/config.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/config.ts)_
## `eas credentials`
@@ -793,7 +793,7 @@ DESCRIPTION
manage credentials
```
_See code: [src/commands/credentials.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/credentials.ts)_
_See code: [src/commands/credentials.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/credentials.ts)_
## `eas device:create`
@@ -807,7 +807,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.3.0/src/commands/device/create.ts)_
_See code: [src/commands/device/create.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/device/create.ts)_
## `eas device:delete`
@@ -827,7 +827,7 @@ DESCRIPTION
remove a registered device from your account
```
_See code: [src/commands/device/delete.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/device/delete.ts)_
_See code: [src/commands/device/delete.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/device/delete.ts)_
## `eas device:list`
@@ -848,7 +848,7 @@ DESCRIPTION
list all registered devices for your account
```
_See code: [src/commands/device/list.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/device/list.ts)_
_See code: [src/commands/device/list.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/device/list.ts)_
## `eas device:rename`
@@ -869,7 +869,7 @@ DESCRIPTION
rename a registered device
```
_See code: [src/commands/device/rename.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/device/rename.ts)_
_See code: [src/commands/device/rename.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/device/rename.ts)_
## `eas device:view [UDID]`
@@ -883,7 +883,7 @@ DESCRIPTION
view a device for your project
```
_See code: [src/commands/device/view.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/device/view.ts)_
_See code: [src/commands/device/view.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/device/view.ts)_
## `eas diagnostics`
@@ -897,7 +897,7 @@ DESCRIPTION
display environment info
```
_See code: [src/commands/diagnostics.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/diagnostics.ts)_
_See code: [src/commands/diagnostics.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/diagnostics.ts)_
## `eas help [COMMAND]`
@@ -985,7 +985,7 @@ DESCRIPTION
validate the local store configuration
```
_See code: [src/commands/metadata/lint.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/metadata/lint.ts)_
_See code: [src/commands/metadata/lint.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/metadata/lint.ts)_
## `eas metadata:pull`
@@ -1002,7 +1002,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.3.0/src/commands/metadata/pull.ts)_
_See code: [src/commands/metadata/pull.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/metadata/pull.ts)_
## `eas metadata:push`
@@ -1019,7 +1019,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.3.0/src/commands/metadata/push.ts)_
_See code: [src/commands/metadata/push.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/metadata/push.ts)_
## `eas open`
@@ -1033,7 +1033,7 @@ DESCRIPTION
open the project page in a web browser
```
_See code: [src/commands/open.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/open.ts)_
_See code: [src/commands/open.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/open.ts)_
## `eas project:info`
@@ -1047,7 +1047,7 @@ DESCRIPTION
information about the current project
```
_See code: [src/commands/project/info.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/project/info.ts)_
_See code: [src/commands/project/info.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/project/info.ts)_
## `eas project:init`
@@ -1069,7 +1069,7 @@ ALIASES
$ eas init
```
_See code: [src/commands/project/init.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/project/init.ts)_
_See code: [src/commands/project/init.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/project/init.ts)_
## `eas secret:create`
@@ -1092,7 +1092,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.3.0/src/commands/secret/create.ts)_
_See code: [src/commands/secret/create.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/secret/create.ts)_
## `eas secret:delete`
@@ -1110,7 +1110,7 @@ DESCRIPTION
delete an environment secret by ID
```
_See code: [src/commands/secret/delete.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/secret/delete.ts)_
_See code: [src/commands/secret/delete.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/secret/delete.ts)_
## `eas secret:list`
@@ -1124,7 +1124,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.3.0/src/commands/secret/list.ts)_
_See code: [src/commands/secret/list.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/secret/list.ts)_
## `eas secret:push`
@@ -1144,7 +1144,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.3.0/src/commands/secret/push.ts)_
_See code: [src/commands/secret/push.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/secret/push.ts)_
## `eas submit`
@@ -1174,7 +1174,7 @@ ALIASES
$ eas build:submit
```
_See code: [src/commands/submit.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/submit.ts)_
_See code: [src/commands/submit.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/submit.ts)_
## `eas update`
@@ -1207,7 +1207,7 @@ DESCRIPTION
publish an update group
```
_See code: [src/commands/update/index.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/update/index.ts)_
_See code: [src/commands/update/index.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/update/index.ts)_
## `eas update:configure`
@@ -1225,7 +1225,7 @@ DESCRIPTION
configure the project to support EAS Update
```
_See code: [src/commands/update/configure.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/update/configure.ts)_
_See code: [src/commands/update/configure.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/update/configure.ts)_
## `eas update:delete GROUPID`
@@ -1246,7 +1246,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.3.0/src/commands/update/delete.ts)_
_See code: [src/commands/update/delete.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/update/delete.ts)_
## `eas update:list`
@@ -1268,7 +1268,7 @@ DESCRIPTION
view the recent updates
```
_See code: [src/commands/update/list.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/update/list.ts)_
_See code: [src/commands/update/list.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/update/list.ts)_
## `eas update:republish`
@@ -1295,7 +1295,7 @@ DESCRIPTION
roll back to an existing update
```
_See code: [src/commands/update/republish.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/update/republish.ts)_
_See code: [src/commands/update/republish.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/update/republish.ts)_
## `eas update:roll-back-to-embedded`
@@ -1322,7 +1322,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.3.0/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.2.0/src/commands/update/roll-back-to-embedded.ts)_
## `eas update:rollback`
@@ -1341,7 +1341,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.3.0/src/commands/update/rollback.ts)_
_See code: [src/commands/update/rollback.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/update/rollback.ts)_
## `eas update:view GROUPID`
@@ -1361,7 +1361,7 @@ DESCRIPTION
update group details
```
_See code: [src/commands/update/view.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/update/view.ts)_
_See code: [src/commands/update/view.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/update/view.ts)_
## `eas webhook:create`
@@ -1382,7 +1382,7 @@ DESCRIPTION
create a webhook
```
_See code: [src/commands/webhook/create.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/webhook/create.ts)_
_See code: [src/commands/webhook/create.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/webhook/create.ts)_
## `eas webhook:delete [ID]`
@@ -1402,7 +1402,7 @@ DESCRIPTION
delete a webhook
```
_See code: [src/commands/webhook/delete.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/webhook/delete.ts)_
_See code: [src/commands/webhook/delete.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/webhook/delete.ts)_
## `eas webhook:list`
@@ -1420,7 +1420,7 @@ DESCRIPTION
list webhooks
```
_See code: [src/commands/webhook/list.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/webhook/list.ts)_
_See code: [src/commands/webhook/list.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/webhook/list.ts)_
## `eas webhook:update`
@@ -1442,7 +1442,7 @@ DESCRIPTION
update a webhook
```
_See code: [src/commands/webhook/update.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/webhook/update.ts)_
_See code: [src/commands/webhook/update.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/webhook/update.ts)_
## `eas webhook:view ID`
@@ -1459,7 +1459,7 @@ DESCRIPTION
view a webhook
```
_See code: [src/commands/webhook/view.ts](https://github.com/expo/eas-cli/blob/v7.3.0/src/commands/webhook/view.ts)_
_See code: [src/commands/webhook/view.ts](https://github.com/expo/eas-cli/blob/v7.2.0/src/commands/webhook/view.ts)_
## `eas whoami`
+4 -3
View File
@@ -1,7 +1,7 @@
{
"name": "eas-cli",
"description": "EAS command line tool",
"version": "7.3.0",
"version": "7.2.0",
"author": "Expo <[email protected]>",
"bin": {
"eas": "./bin/run"
@@ -13,8 +13,9 @@
"@expo/config": "8.5.4",
"@expo/config-plugins": "7.8.4",
"@expo/config-types": "50.0.0",
"@expo/eas-build-job": "1.0.71",
"@expo/eas-json": "7.3.0",
"@expo/eas-build-job": "1.0.70",
"@expo/eas-json": "7.1.3",
"@expo/fingerprint": "0.6.0",
"@expo/json-file": "8.2.37",
"@expo/multipart-body-parser": "1.1.0",
"@expo/osascript": "2.0.33",
@@ -24,7 +24,9 @@ export async function syncProjectConfigurationAsync({
localAutoIncrement?: AndroidVersionAutoIncrement;
vcsClient: Client;
}): Promise<void> {
const workflow = await resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient);
const workflow = await resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
});
const versionBumpStrategy = resolveVersionBumpStrategy(localAutoIncrement ?? false);
if (workflow === Workflow.GENERIC) {
@@ -100,7 +100,9 @@ export async function maybeResolveVersionsAsync(
buildProfile: BuildProfile<Platform.ANDROID>,
vcsClient: Client
): Promise<{ appVersion?: string; appBuildVersion?: string }> {
const workflow = await resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient);
const workflow = await resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
});
if (workflow === Workflow.GENERIC) {
const buildGradle = await getAppBuildGradleAsync(projectDir);
try {
+3 -1
View File
@@ -61,7 +61,9 @@ export async function createBuildContextAsync<T extends Platform>({
const { exp, projectId } = await getDynamicPrivateProjectConfigAsync({ env: buildProfile.env });
const projectName = exp.slug;
const account = await getOwnerAccountForProjectIdAsync(graphqlClient, projectId);
const workflow = await resolveWorkflowAsync(projectDir, platform, vcsClient);
const workflow = await resolveWorkflowAsync(projectDir, platform, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
});
const accountId = account.id;
const runFromCI = getenv.boolish('CI', false);
const developmentClient =
@@ -22,7 +22,9 @@ export async function syncProjectConfigurationAsync({
localAutoIncrement?: IosVersionAutoIncrement;
vcsClient: Client;
}): Promise<void> {
const workflow = await resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient);
const workflow = await resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
});
const versionBumpStrategy = resolveVersionBumpStrategy(localAutoIncrement ?? false);
if (workflow === Workflow.GENERIC) {
+6 -2
View File
@@ -114,7 +114,9 @@ export async function readShortVersionAsync(
buildSettings: XCBuildConfiguration['buildSettings'],
vcsClient: Client
): Promise<string | undefined> {
const workflow = await resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient);
const workflow = await resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
});
if (workflow === Workflow.GENERIC) {
const infoPlist = await readInfoPlistAsync(projectDir, buildSettings);
@@ -136,7 +138,9 @@ export async function readBuildNumberAsync(
buildSettings: XCBuildConfiguration['buildSettings'],
vcsClient: Client
): Promise<string | undefined> {
const workflow = await resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient);
const workflow = await resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
});
if (workflow === Workflow.GENERIC) {
const infoPlist = await readInfoPlistAsync(projectDir, buildSettings);
return (
+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.71';
const PLUGIN_PACKAGE_VERSION = '1.0.60';
export enum LocalBuildMode {
/**
@@ -43,7 +43,11 @@ export async function ensureExpoDevClientInstalledForDevClientBuildsAsync({
);
const workflowPerPlatformList = await Promise.all(
platformsToCheck.map(platform => resolveWorkflowAsync(projectDir, platform, vcsClient))
platformsToCheck.map(platform =>
resolveWorkflowAsync(projectDir, platform, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
})
)
);
Log.newLine();
@@ -107,7 +107,9 @@ export async function makeProjectTarballAsync(
startTimer(compressTimerLabel);
try {
await vcsClient.makeShallowCopyAsync(shallowClonePath);
await vcsClient.makeShallowCopyAsync(shallowClonePath, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
});
await tar.create({ cwd: shallowClonePath, file: tarPath, prefix: 'project', gzip: true }, [
'.',
]);
+3 -1
View File
@@ -32,7 +32,9 @@ export async function checkGoogleServicesFileAsync<T extends Platform>(
if (
(await fs.pathExists(absGoogleServicesFilePath)) &&
(!isInsideDirectory(absGoogleServicesFilePath, rootDir) ||
(await ctx.vcsClient.isFileIgnoredAsync(path.relative(rootDir, absGoogleServicesFilePath))))
(await ctx.vcsClient.isFileIgnoredAsync(path.relative(rootDir, absGoogleServicesFilePath), {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
})))
) {
Log.warn(
`File specified via "${ctx.platform}.googleServicesFile" field in your app.json is not checked in to your repository and won't be uploaded to the builder.`
@@ -72,14 +72,18 @@ export default class BuildConfigure extends EasCommand {
// configure expo-updates
if (expoUpdatesIsInstalled) {
if ([RequestedPlatform.Android, RequestedPlatform.All].includes(platform)) {
const workflow = await resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient);
const workflow = await resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
});
if (workflow === Workflow.GENERIC) {
await syncAndroidUpdatesConfigurationAsync(projectDir, exp);
}
}
if ([RequestedPlatform.Ios, RequestedPlatform.All].includes(platform)) {
const workflow = await resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient);
const workflow = await resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
});
if (workflow === Workflow.GENERIC) {
await syncIosUpdatesConfigurationAsync(vcsClient, projectDir, exp);
}
@@ -94,7 +94,9 @@ export default class BuildInspect extends EasCommand {
if (flags.stage === InspectStage.ARCHIVE) {
await vcsClient.ensureRepoExistsAsync();
await vcsClient.makeShallowCopyAsync(tmpWorkingdir);
await vcsClient.makeShallowCopyAsync(tmpWorkingdir, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
});
await this.copyToOutputDirAsync(tmpWorkingdir, outputDirectory);
} else {
try {
@@ -109,7 +109,9 @@ export default class BuildVersionSyncView extends EasCommand {
toAppPlatform(profileInfo.platform),
applicationIdentifier
);
const workflow = await resolveWorkflowAsync(projectDir, profileInfo.platform, vcsClient);
const workflow = await resolveWorkflowAsync(projectDir, profileInfo.platform, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
});
if (!remoteVersions?.buildVersion) {
Log.warn(
`Skipping versions sync for ${platformDisplayName}. There are no versions configured on Expo servers, use "eas build:version:set" or run a build to initialize it.`
+6 -2
View File
@@ -50,8 +50,12 @@ export default class Diagnostics extends EasCommand {
}
private async printWorkflowAsync(projectDir: string, vcsClient: Client): Promise<void> {
const androidWorkflow = await resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient);
const iosWorkflow = await resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient);
const androidWorkflow = await resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
});
const iosWorkflow = await resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
});
if (androidWorkflow === iosWorkflow) {
Log.log(` Project workflow: ${androidWorkflow}`);
+2 -14
View File
@@ -1,4 +1,4 @@
import { ConfigError, getProjectConfigDescription } from '@expo/config';
import { getProjectConfigDescription } from '@expo/config';
import { ExpoConfig } from '@expo/config-types';
import { Flags } from '@oclif/core';
import chalk from 'chalk';
@@ -60,19 +60,7 @@ export default class ProjectInit extends EasCommand {
projectDir: string,
modifications: Partial<ExpoConfig>
): Promise<void> {
let result;
try {
result = await createOrModifyExpoConfigAsync(projectDir, modifications);
} catch (error) {
if (error instanceof ConfigError && error.code === 'MODULE_NOT_FOUND') {
Log.warn(
'Cannot determine which native SDK version your project uses because the module `expo` is not installed.'
);
return;
} else {
throw error;
}
}
const result = await createOrModifyExpoConfigAsync(projectDir, modifications);
switch (result.type) {
case 'success':
break;
@@ -364,6 +364,7 @@ export default class UpdatePublish extends EasCommand {
platforms: realizedPlatforms,
projectDir,
vcsClient,
nonInteractive,
});
const runtimeToPlatformMapping =
getRuntimeToPlatformMappingFromRuntimeVersions(runtimeVersions);
@@ -206,6 +206,7 @@ export default class UpdateRollBackToEmbedded extends EasCommand {
platforms: realizedPlatforms,
projectDir,
vcsClient,
nonInteractive,
});
let newUpdates: UpdatePublishMutation['updateBranch']['publishUpdateGroups'];
@@ -23,12 +23,16 @@ describe(resolveWorkflowAsync, () => {
projectDir
);
await expect(resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient)).resolves.toBe(
Workflow.GENERIC
);
await expect(resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient)).resolves.toBe(
Workflow.GENERIC
);
await expect(
resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
})
).resolves.toBe(Workflow.GENERIC);
await expect(
resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
})
).resolves.toBe(Workflow.GENERIC);
});
test('bare workflow for single platform', async () => {
@@ -39,12 +43,16 @@ describe(resolveWorkflowAsync, () => {
projectDir
);
await expect(resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient)).resolves.toBe(
Workflow.MANAGED
);
await expect(resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient)).resolves.toBe(
Workflow.GENERIC
);
await expect(
resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
})
).resolves.toBe(Workflow.MANAGED);
await expect(
resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
})
).resolves.toBe(Workflow.GENERIC);
});
test('android/ios directories are ignored', async () => {
@@ -57,12 +65,16 @@ describe(resolveWorkflowAsync, () => {
projectDir
);
await expect(resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient)).resolves.toBe(
Workflow.MANAGED
);
await expect(resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient)).resolves.toBe(
Workflow.MANAGED
);
await expect(
resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
})
).resolves.toBe(Workflow.MANAGED);
await expect(
resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
})
).resolves.toBe(Workflow.MANAGED);
});
});
@@ -80,7 +92,11 @@ describe(resolveWorkflowPerPlatformAsync, () => {
projectDir
);
await expect(resolveWorkflowPerPlatformAsync(projectDir, vcsClient)).resolves.toEqual({
await expect(
resolveWorkflowPerPlatformAsync(projectDir, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
})
).resolves.toEqual({
android: Workflow.GENERIC,
ios: Workflow.GENERIC,
});
@@ -35,7 +35,9 @@ export async function ensureApplicationIdIsDefinedForManagedProjectAsync({
exp: ExpoConfig;
vcsClient: Client;
}): Promise<string> {
const workflow = await resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient);
const workflow = await resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
});
assert(workflow === Workflow.MANAGED, 'This function should be called only for managed projects');
try {
@@ -101,7 +103,9 @@ export async function getApplicationIdAsync(
vcsClient: Client,
gradleContext?: GradleBuildContext
): Promise<string> {
const workflow = await resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient);
const workflow = await resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
});
if (workflow === Workflow.GENERIC) {
warnIfAndroidPackageDefinedInAppConfigForBareWorkflowProject(projectDir, exp);
@@ -16,7 +16,9 @@ export async function resolveGradleBuildContextAsync(
buildProfile: BuildProfile<Platform.ANDROID>,
vcsClient: Client
): Promise<GradleBuildContext | undefined> {
const workflow = await resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient);
const workflow = await resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
});
if (workflow === Workflow.GENERIC) {
try {
if (buildProfile.gradleCommand) {
@@ -36,7 +36,9 @@ export async function getApplicationIdentifierAsync({
}): Promise<string> {
if (platform === Platform.ANDROID) {
const profile = buildProfile as BuildProfile<Platform.ANDROID>;
const workflow = await resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient);
const workflow = await resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
});
if (workflow === Workflow.MANAGED) {
return await ensureApplicationIdIsDefinedForManagedProjectAsync({
@@ -51,7 +53,9 @@ export async function getApplicationIdentifierAsync({
const gradleContext = await resolveGradleBuildContextAsync(projectDir, profile, vcsClient);
return await getApplicationIdAsync(projectDir, exp, vcsClient, gradleContext);
} else {
const workflow = await resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient);
const workflow = await resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
});
const profile = buildProfile as BuildProfile<Platform.IOS>;
if (workflow === Workflow.MANAGED) {
return await ensureBundleIdentifierIsDefinedForManagedProjectAsync({
@@ -31,7 +31,11 @@ export async function validateCustomBuildConfigAsync({
`Custom build configuration file ${chalk.bold(relativeConfigPath)} does not exist.`
);
}
if (await vcsClient.isFileIgnoredAsync(relativeConfigPath)) {
if (
await vcsClient.isFileIgnoredAsync(relativeConfigPath, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
})
) {
throw new Error(
`Custom build configuration file ${chalk.bold(
relativeConfigPath
@@ -28,7 +28,9 @@ export async function ensureBundleIdentifierIsDefinedForManagedProjectAsync({
exp: ExpoConfig;
vcsClient: Client;
}): Promise<string> {
const workflow = await resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient);
const workflow = await resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
});
assert(workflow === Workflow.MANAGED, 'This function should be called only for managed projects');
try {
@@ -55,7 +57,9 @@ export async function getBundleIdentifierAsync(
vcsClient: Client,
xcodeContext?: { targetName?: string; buildConfiguration?: string }
): Promise<string> {
const workflow = await resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient);
const workflow = await resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
});
if (workflow === Workflow.GENERIC) {
warnIfBundleIdentifierDefinedInAppConfigForBareWorkflowProject(projectDir, exp);
@@ -28,7 +28,9 @@ export async function getManagedApplicationTargetEntitlementsAsync(
projectRoot: projectDir,
platforms: ['ios'],
introspect: true,
ignoreExistingNativeFiles: await hasIgnoredIosProjectAsync(projectDir, vcsClient),
ignoreExistingNativeFiles: await hasIgnoredIosProjectAsync(projectDir, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
}),
});
return expWithMods.ios?.entitlements || {};
} finally {
+3 -1
View File
@@ -24,7 +24,9 @@ export async function resolveXcodeBuildContextAsync(
}: { exp: ExpoConfig; projectDir: string; nonInteractive: boolean; vcsClient: Client },
buildProfile: BuildProfile<Platform.IOS>
): Promise<XcodeBuildContext> {
const workflow = await resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient);
const workflow = await resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
});
if (workflow === Workflow.GENERIC) {
const buildScheme =
buildProfile.scheme ??
+3 -1
View File
@@ -145,7 +145,9 @@ export async function resolveBareProjectTargetsAsync({
}
export async function resolveTargetsAsync(opts: ResolveTargetOptions): Promise<Target[]> {
const workflow = await resolveWorkflowAsync(opts.projectDir, Platform.IOS, opts.vcsClient);
const workflow = await resolveWorkflowAsync(opts.projectDir, Platform.IOS, opts.vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
});
if (workflow === Workflow.GENERIC) {
return await resolveBareProjectTargetsAsync(opts);
} else if (workflow === Workflow.MANAGED) {
+60 -34
View File
@@ -1,6 +1,7 @@
import { ExpoConfig, Platform } from '@expo/config';
import { Updates } from '@expo/config-plugins';
import { Platform as EASBuildJobPlatform, Workflow } from '@expo/eas-build-job';
import * as Fingerprint from '@expo/fingerprint';
import JsonFile from '@expo/json-file';
import assert from 'assert';
import chalk from 'chalk';
@@ -8,7 +9,6 @@ import crypto from 'crypto';
import fs from 'fs-extra';
import Joi from 'joi';
import mime from 'mime';
import nullthrows from 'nullthrows';
import path from 'path';
import promiseLimit from 'promise-limit';
@@ -22,7 +22,7 @@ import { PublishMutation } from '../graphql/mutations/PublishMutation';
import { PublishQuery } from '../graphql/queries/PublishQuery';
import Log, { learnMore } from '../log';
import { RequestedPlatform, requestedPlatformDisplayNames } from '../platform';
import { promptAsync } from '../prompts';
import { confirmAsync, promptAsync } from '../prompts';
import { getBranchNameFromChannelNameAsync } from '../update/getBranchNameFromChannelNameAsync';
import { formatUpdateMessage, truncateString as truncateUpdateMessage } from '../update/utils';
import { PresignedPost, uploadWithPresignedPostWithRetryAsync } from '../uploads';
@@ -31,7 +31,6 @@ import {
shouldUseVersionedExpoCLI,
shouldUseVersionedExpoCLIWithExplicitPlatforms,
} from '../utils/expoCli';
import { expoUpdatesCommandAsync } from '../utils/expoUpdatesCli';
import chunk from '../utils/expodash/chunk';
import { truthy } from '../utils/expodash/filter';
import uniqBy from '../utils/expodash/uniqBy';
@@ -681,25 +680,32 @@ export async function getRuntimeVersionObjectAsync({
platforms,
projectDir,
vcsClient,
nonInteractive,
}: {
exp: ExpoConfig;
platforms: Platform[];
projectDir: string;
vcsClient: Client;
nonInteractive: boolean;
}): Promise<{ platform: string; runtimeVersion: string }[]> {
return await Promise.all(
platforms.map(async platform => {
return {
const runtimeVersionObjects: { platform: string; runtimeVersion: string }[] = [];
// calculate these serially since in some cases (fingerprint) we need to prompt the user to confirm that
// the runtime version is ready to be calculated
for (const platform of platforms) {
runtimeVersionObjects.push({
platform,
runtimeVersion: await getRuntimeVersionForPlatformAsync({
exp,
platform,
runtimeVersion: await getRuntimeVersionForPlatformAsync({
exp,
platform,
projectDir,
vcsClient,
}),
};
})
);
projectDir,
vcsClient,
nonInteractive,
}),
});
}
return runtimeVersionObjects;
}
async function getRuntimeVersionForPlatformAsync({
@@ -707,11 +713,13 @@ async function getRuntimeVersionForPlatformAsync({
platform,
projectDir,
vcsClient,
nonInteractive,
}: {
exp: ExpoConfig;
platform: Platform;
projectDir: string;
vcsClient: Client;
nonInteractive: boolean;
}): Promise<string> {
if (platform === 'web') {
return 'UNVERSIONED';
@@ -719,33 +727,51 @@ async function getRuntimeVersionForPlatformAsync({
const runtimeVersion = exp[platform]?.runtimeVersion ?? exp.runtimeVersion;
if (typeof runtimeVersion === 'object') {
const workflowIgnoringEASIgnoreToMatchExpoUpdatesDetection = await resolveWorkflowAsync(
projectDir,
platform as EASBuildJobPlatform,
vcsClient,
{ useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: false }
);
const policy = runtimeVersion.policy;
if (policy === 'fingerprintExperimental') {
// log to inform the user that the fingerprint has been calculated
Log.warn(
`Calculating native fingerprint for platform ${platform} using current state of the "${platform}" directory. ` +
`If the fingerprint differs from the build's fingerint, ensure the state of your project is consistent ` +
`(repository is clean, ios and android native directories are in the same state as the build if applicable).`
);
const fingerprintRawString = await expoUpdatesCommandAsync(projectDir, [
'fingerprint:generate',
'--platform',
platform,
]);
const fingerprintObject = JSON.parse(fingerprintRawString);
const hash = nullthrows(
fingerprintObject.hash,
'invalid response from expo-update CLI for fingerprint generation'
);
return hash;
if (workflowIgnoringEASIgnoreToMatchExpoUpdatesDetection === Workflow.GENERIC) {
if (nonInteractive) {
// log to inform the user that the fingerprint has been calculated
Log.warn(
`Calculating native fingerprint for platform ${platform} using current state of the "${platform}" directory.`
);
} else {
// prompt the user to confirm that their native projects are in a state that is ready
// for the fingerprint to be calculated
const confirm = await confirmAsync({
message: `Calculating native fingerprint for platform ${platform} using current state of the "${platform}" directory. Do you want to continue?`,
});
if (!confirm) {
throw new Error('Aborted');
}
}
return await Fingerprint.createProjectHashAsync(projectDir, {
platforms: [platform],
});
} else if (workflowIgnoringEASIgnoreToMatchExpoUpdatesDetection === Workflow.MANAGED) {
// ignore everything in native directories to ensure fingerprint is the same
// no matter whether project has been prebuilt
return await Fingerprint.createProjectHashAsync(projectDir, {
platforms: [platform],
ignorePaths: ['/android/**/*', '/ios/**/*'],
});
} else {
throw new Error('Unknown workflow');
}
}
const workflow = await resolveWorkflowAsync(
projectDir,
platform as EASBuildJobPlatform,
vcsClient
vcsClient,
{ useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true }
);
if (workflow !== Workflow.MANAGED) {
throw new Error(
+16 -7
View File
@@ -8,7 +8,10 @@ import { Client } from '../vcs/vcs';
export async function resolveWorkflowAsync(
projectDir: string,
platform: Platform,
vcsClient: Client
vcsClient: Client,
options: {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: boolean;
}
): Promise<Workflow> {
let platformWorkflowMarkers: string[];
try {
@@ -27,7 +30,7 @@ export async function resolveWorkflowAsync(
for (const marker of platformWorkflowMarkers) {
if (
(await fs.pathExists(marker)) &&
!(await vcsClient.isFileIgnoredAsync(path.relative(vcsRootPath, marker)))
!(await vcsClient.isFileIgnoredAsync(path.relative(vcsRootPath, marker), options))
) {
return Workflow.GENERIC;
}
@@ -37,24 +40,30 @@ export async function resolveWorkflowAsync(
export async function resolveWorkflowPerPlatformAsync(
projectDir: string,
vcsClient: Client
vcsClient: Client,
options: {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: boolean;
}
): Promise<Record<Platform, Workflow>> {
const [android, ios] = await Promise.all([
resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient),
resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient),
resolveWorkflowAsync(projectDir, Platform.ANDROID, vcsClient, options),
resolveWorkflowAsync(projectDir, Platform.IOS, vcsClient, options),
]);
return { android, ios };
}
export async function hasIgnoredIosProjectAsync(
projectDir: string,
vcsClient: Client
vcsClient: Client,
options: {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: boolean;
}
): Promise<boolean> {
const vcsRootPath = path.normalize(await vcsClient.getRootPathAsync());
try {
const pbxProjectPath = IOSConfig.Paths.getPBXProjectPath(projectDir);
return await vcsClient.isFileIgnoredAsync(path.relative(vcsRootPath, pbxProjectPath));
return await vcsClient.isFileIgnoredAsync(path.relative(vcsRootPath, pbxProjectPath), options);
} finally {
return false;
}
+3 -1
View File
@@ -384,7 +384,9 @@ export async function ensureEASUpdateIsConfiguredAsync({
return;
}
const workflows = await resolveWorkflowPerPlatformAsync(projectDir, vcsClient);
const workflows = await resolveWorkflowPerPlatformAsync(projectDir, vcsClient, {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true,
});
const { projectChanged, exp: expWithUpdates } =
await ensureEASUpdatesIsConfiguredInExpoConfigAsync({
exp: expMaybeWithoutUpdates,
@@ -1,40 +0,0 @@
import spawnAsync from '@expo/spawn-async';
import chalk from 'chalk';
import resolveFrom, { silent as silentResolveFrom } from 'resolve-from';
import Log, { link } from '../log';
export async function expoUpdatesCommandAsync(projectDir: string, args: string[]): Promise<string> {
let expoUpdatesCli;
try {
expoUpdatesCli =
silentResolveFrom(projectDir, 'expo-updates/bin/cli') ??
resolveFrom(projectDir, 'expo-updates/bin/cli.js');
} catch (e: any) {
if (e.code === 'MODULE_NOT_FOUND') {
throw new Error(
`The \`expo-updates\` package was not found. Follow the installation directions at ${link(
'https://docs.expo.dev/bare/installing-expo-modules/'
)}`
);
}
throw e;
}
const spawnPromise = spawnAsync(expoUpdatesCli, args, {
stdio: ['inherit', 'pipe', 'pipe'], // inherit stdin so user can install a missing expo-cli from inside this command
});
const {
child: { stderr },
} = spawnPromise;
if (!stderr) {
throw new Error('Failed to spawn expo-updates cli');
}
stderr.on('data', data => {
for (const line of data.toString().trim().split('\n')) {
Log.warn(`${chalk.gray('[expo-cli]')} ${line}`);
}
});
const result = await spawnPromise;
return result.stdout;
}
@@ -18,7 +18,7 @@ describe(Ignore, () => {
'/root'
);
const ignore = new Ignore('/root');
const ignore = new Ignore('/root', { useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true });
await ignore.initIgnoreAsync();
expect(ignore.ignores('aaa')).toBe(true);
expect(ignore.ignores('bbb')).toBe(false);
@@ -36,7 +36,7 @@ describe(Ignore, () => {
'/root'
);
const ignore = new Ignore('/root');
const ignore = new Ignore('/root', { useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true });
await ignore.initIgnoreAsync();
expect(ignore.ignores('aaa')).toBe(false);
expect(ignore.ignores('bbb')).toBe(false);
@@ -44,6 +44,25 @@ describe(Ignore, () => {
expect((ignore as any).ignoreMapping.map((i: any) => i[0])).toEqual(['', '']);
});
it('uses .gitignore files if .easignore is present but useEASIgnoreIfAvailableWhenEvaluatingFileIgnores is false', async () => {
vol.fromJSON(
{
'.gitignore': 'aaa',
'.easignore': 'ccc',
'dir/.gitignore': 'bbb',
},
'/root'
);
const ignore = new Ignore('/root', { useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: false });
await ignore.initIgnoreAsync();
expect(ignore.ignores('aaa')).toBe(true);
expect(ignore.ignores('bbb')).toBe(false);
expect(ignore.ignores('ccc')).toBe(false);
expect(ignore.ignores('dir/aaa')).toBe(true);
expect(ignore.ignores('dir/bbb')).toBe(true);
});
it('ignores .gitignore files in node_modules content', async () => {
vol.fromJSON(
{
@@ -54,7 +73,7 @@ describe(Ignore, () => {
'/root'
);
const ignore = new Ignore('/root');
const ignore = new Ignore('/root', { useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true });
await ignore.initIgnoreAsync();
expect(ignore.ignores('aaa')).toBe(true);
expect(ignore.ignores('bbb')).toBe(false);
@@ -72,7 +91,7 @@ describe(Ignore, () => {
'/root'
);
const ignore = new Ignore('/root');
const ignore = new Ignore('/root', { useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true });
await ignore.initIgnoreAsync();
expect(ignore.ignores('dir/ccc')).toBe(true);
});
@@ -80,7 +99,7 @@ describe(Ignore, () => {
it('ignores .git', async () => {
vol.fromJSON({}, '/root');
const ignore = new Ignore('/root');
const ignore = new Ignore('/root', { useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true });
await ignore.initIgnoreAsync();
expect(ignore.ignores('.git')).toBe(true);
});
@@ -93,7 +112,7 @@ describe(Ignore, () => {
'/root'
);
const ignore = new Ignore('/root');
const ignore = new Ignore('/root', { useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true });
await ignore.initIgnoreAsync();
expect(() => ignore.ignores('dir/test')).not.toThrowError();
});
+12 -2
View File
@@ -120,7 +120,12 @@ export default class GitClient extends Client {
return (await spawnAsync('git', ['rev-parse', '--show-toplevel'])).stdout.trim();
}
public async makeShallowCopyAsync(destinationPath: string): Promise<void> {
public async makeShallowCopyAsync(
destinationPath: string,
_options: {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: boolean;
}
): Promise<void> {
if (await this.hasUncommittedChangesAsync()) {
// it should already be checked before this function is called, but in case it wasn't
// we want to ensure that any changes were introduced by call to `setGitCaseSensitivityAsync`
@@ -207,7 +212,12 @@ export default class GitClient extends Client {
);
}
public override async isFileIgnoredAsync(filePath: string): Promise<boolean> {
public override async isFileIgnoredAsync(
filePath: string,
_options: {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: boolean;
}
): Promise<boolean> {
try {
await spawnAsync('git', ['check-ignore', '-q', filePath], {
cwd: path.normalize(await this.getRootPathAsync()),
@@ -15,16 +15,26 @@ export default class GitNoCommitClient extends GitClient {
return (await spawnAsync('git', ['rev-parse', '--show-toplevel'])).stdout.trim();
}
public override async makeShallowCopyAsync(destinationPath: string): Promise<void> {
public override async makeShallowCopyAsync(
destinationPath: string,
options: {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: boolean;
}
): Promise<void> {
// normalize converts C:/some/path to C:\some\path on windows
const srcPath = path.normalize(await this.getRootPathAsync());
await makeShallowCopyAsync(srcPath, destinationPath);
await makeShallowCopyAsync(srcPath, destinationPath, options);
}
public override async isFileIgnoredAsync(filePath: string): Promise<boolean> {
public override async isFileIgnoredAsync(
filePath: string,
options: {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: boolean;
}
): Promise<boolean> {
// normalize converts C:/some/path to C:\some\path on windows
const rootPath = path.normalize(await this.getRootPathAsync());
const ignore = new Ignore(rootPath);
const ignore = new Ignore(rootPath, options);
await ignore.initIgnoreAsync();
return ignore.ignores(filePath);
}
+14 -4
View File
@@ -6,13 +6,23 @@ export default class NoVcsClient extends Client {
return getRootPath();
}
public async makeShallowCopyAsync(destinationPath: string): Promise<void> {
public async makeShallowCopyAsync(
destinationPath: string,
options: {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: boolean;
}
): Promise<void> {
const srcPath = getRootPath();
await makeShallowCopyAsync(srcPath, destinationPath);
await makeShallowCopyAsync(srcPath, destinationPath, options);
}
public override async isFileIgnoredAsync(filePath: string): Promise<boolean> {
const ignore = new Ignore(getRootPath());
public override async isFileIgnoredAsync(
filePath: string,
options: {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: boolean;
}
): Promise<boolean> {
const ignore = new Ignore(getRootPath(), options);
await ignore.initIgnoreAsync();
return ignore.ignores(filePath);
}
+23 -10
View File
@@ -32,16 +32,23 @@ export function getRootPath(): string {
export class Ignore {
private ignoreMapping: (readonly [string, SingleFileIgnore])[] = [];
constructor(private rootDir: string) {}
constructor(
private readonly rootDir: string,
private readonly options: {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: boolean;
}
) {}
public async initIgnoreAsync(): Promise<void> {
const easIgnorePath = path.join(this.rootDir, EASIGNORE_FILENAME);
if (await fs.pathExists(easIgnorePath)) {
this.ignoreMapping = [
['', createIgnore().add(DEFAULT_IGNORE)],
['', createIgnore().add(await fs.readFile(easIgnorePath, 'utf-8'))],
];
return;
if (this.options.useEASIgnoreIfAvailableWhenEvaluatingFileIgnores) {
const easIgnorePath = path.join(this.rootDir, EASIGNORE_FILENAME);
if (await fs.pathExists(easIgnorePath)) {
this.ignoreMapping = [
['', createIgnore().add(DEFAULT_IGNORE)],
['', createIgnore().add(await fs.readFile(easIgnorePath, 'utf-8'))],
];
return;
}
}
const ignoreFilePaths = (
await fg(`**/${GITIGNORE_FILENAME}`, {
@@ -74,8 +81,14 @@ export class Ignore {
}
}
export async function makeShallowCopyAsync(src: string, dst: string): Promise<void> {
const ignore = new Ignore(src);
export async function makeShallowCopyAsync(
src: string,
dst: string,
options: {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: boolean;
}
): Promise<void> {
const ignore = new Ignore(src, options);
await ignore.initIgnoreAsync();
await fs.copy(src, dst, {
filter: (srcFilePath: string) => {
+12 -2
View File
@@ -3,7 +3,12 @@ export abstract class Client {
// destination, folder created this way will be uploaded "as is", so implementation should skip
// anything that is not committed to the repository. Most optimal solution is to create shallow clone
// using tooling provided by specific VCS, that respects all ignore rules
public abstract makeShallowCopyAsync(destinationPath: string): Promise<void>;
public abstract makeShallowCopyAsync(
destinationPath: string,
options: {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: boolean;
}
): Promise<void>;
// Find root of the repository.
//
@@ -75,7 +80,12 @@ export abstract class Client {
//
// @param filePath has to be a relative normalized path pointing to a file
// located under the root of the repository
public async isFileIgnoredAsync(_filePath: string): Promise<boolean> {
public async isFileIgnoredAsync(
_filePath: string,
_options: {
useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: boolean;
}
): Promise<boolean> {
return false;
}
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "@expo/eas-json",
"description": "A library for interacting with eas.json",
"version": "7.3.0",
"version": "7.1.3",
"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.71",
"@expo/eas-build-job": "1.0.70",
"chalk": "4.1.2",
"env-string": "1.0.1",
"fs-extra": "11.2.0",
Generated
+5 -5
View File
@@ -1462,15 +1462,15 @@
slugify "^1.3.4"
sucrase "^3.20.0"
"@expo/[email protected]1":
version "1.0.71"
resolved "https://registry.yarnpkg.com/@expo/eas-build-job/-/eas-build-job-1.0.71.tgz#1cf5826cfb00c168508e1bde350500e32353a131"
integrity sha512-FeArnHOxzK4vppATHscihhXeLW7IeIu4iP4lsJIiVVbPwuuAJaLkVwwASNM6YepV5cwLXhpOP5R1JWi2Frrt0g==
"@expo/[email protected]0":
version "1.0.70"
resolved "https://registry.yarnpkg.com/@expo/eas-build-job/-/eas-build-job-1.0.70.tgz#2ea8b7bc532735669568285adb7d0bbc028643d3"
integrity sha512-22DWjuCmd4ajax7+z9ojuv7/MsnAfC4rza31qJRgVV9q7HbxdUuBMt4pxtdTuZbZ/JA79xyCSrSjdRxFkXr2xw==
dependencies:
joi "^17.11.0"
semver "^7.5.4"
"@expo/fingerprint@^0.6.0":
"@expo/[email protected]", "@expo/fingerprint@^0.6.0":
version "0.6.0"
resolved "https://registry.yarnpkg.com/@expo/fingerprint/-/fingerprint-0.6.0.tgz#77366934673d4ecea37284109b4dd67f9e6a7487"
integrity sha512-KfpoVRTMwMNJ/Cf5o+Ou8M/Y0EGSTqK+rbi70M2Y0K2qgWNfMJ1gm6sYO9uc8lcTr7YSYM1Rme3dk7QXhpScNA==