mirror of
https://github.com/expo/eas-cli.git
synced 2026-11-14 10:08:06 -10:00
Compare commits
22
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e7787c0cf8 | ||
|
|
efd9213fab | ||
|
|
a3d9bc0eca | ||
|
|
39dc6299d2 | ||
|
|
37573bed50 | ||
|
|
2e49f6348e | ||
|
|
3a7ddbd025 | ||
|
|
a5c1100ce1 | ||
|
|
0b71812694 | ||
|
|
caf2403dfd | ||
|
|
09fe5dd1a3 | ||
|
|
048460f323 | ||
|
|
69b0edae8d | ||
|
|
9ee9ea39bb | ||
|
|
204a8b7eb4 | ||
|
|
a6e281b6c8 | ||
|
|
315b5b23f8 | ||
|
|
ceb561a4af | ||
|
|
63743cae65 | ||
|
|
e8e5eb622c | ||
|
|
fe8f1b32b3 | ||
|
|
3a1e5298a4 |
No files matched your search
@@ -152,7 +152,13 @@ jobs:
|
||||
VERSION=$(cat lerna.json | jq -r .version)
|
||||
echo //registry.npmjs.org/:_authToken=$NODE_AUTH_TOKEN > ~/.npmrc
|
||||
npm dist-tag add eas-cli@$VERSION latest-eas-build-staging
|
||||
echo "Run \"npm dist-tag add eas-cli@$VERSION latest-eas-build\" to promote it to production."
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }}
|
||||
- name: Add latest-eas-build tag
|
||||
run: |
|
||||
VERSION=$(cat lerna.json | jq -r .version)
|
||||
echo //registry.npmjs.org/:_authToken=$NODE_AUTH_TOKEN > ~/.npmrc
|
||||
npm dist-tag add eas-cli@$VERSION latest-eas-build
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }}
|
||||
release-changelog:
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
name: Open a PR bumping eas-build modules
|
||||
|
||||
on: workflow_dispatch
|
||||
|
||||
jobs:
|
||||
open-pr:
|
||||
name: Open a PR bumping eas-build modules
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: main
|
||||
token: ${{ secrets.EXPO_BOT_PAT }}
|
||||
|
||||
- name: Setup node
|
||||
uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 20
|
||||
|
||||
- run: yarn install --frozen-lockfile
|
||||
|
||||
- name: Configure git
|
||||
run: |
|
||||
git config --global user.email "[email protected]"
|
||||
git config --global user.name "Expo Bot"
|
||||
|
||||
- name: Upgrade eas-build modules
|
||||
run: |
|
||||
for DIR in packages/eas-cli packages/eas-json; do
|
||||
pushd $DIR >/dev/null 2>&1
|
||||
# packages are ordered according to output of `lerna list --toposort`
|
||||
# https://github.com/expo/turtle-v2/pull/568
|
||||
for PACKAGE in "@expo/downloader" "@expo/eas-build-job" "@expo/logger" "@expo/template-file" "@expo/steps" "@expo/turtle-spawn" "@expo/build-tools"; do
|
||||
if grep -q $PACKAGE package.json; then
|
||||
echo "[$DIR] yarn --exact add $PACKAGE"
|
||||
yarn add --exact $PACKAGE
|
||||
fi
|
||||
done
|
||||
popd >/dev/null 2>&1
|
||||
done
|
||||
|
||||
- name: Set a branch name
|
||||
id: bump-branch-name
|
||||
run: |
|
||||
HASH="$(echo $RANDOM | md5sum | head -c 10)"
|
||||
BRANCH_NAME="@expo-bot/eas-build-bump-$HASH"
|
||||
|
||||
echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Create a branch, commit, and push
|
||||
run: |
|
||||
BRANCH_NAME="${{ steps.bump-branch-name.outputs.BRANCH_NAME }}"
|
||||
|
||||
git checkout -b $BRANCH_NAME
|
||||
git add .
|
||||
git commit -m "Upgrade eas-build dependencies"
|
||||
git push origin $BRANCH_NAME
|
||||
|
||||
- name: Open a PR to main
|
||||
uses: repo-sync/pull-request@v2
|
||||
id: open-pr
|
||||
with:
|
||||
source_branch: '${{ steps.bump-branch-name.outputs.BRANCH_NAME }}'
|
||||
destination_branch: 'main'
|
||||
pr_title: 'Upgrade eas-build dependencies'
|
||||
pr_body: ':arrow_up: Upgrades [`eas-build`](https://github.com/expo/eas-build) dependencies.'
|
||||
pr_reviewer: 'szdziedzic,radoslawkrzemien,sjchmiela,khamilowicz'
|
||||
github_token: ${{ secrets.EXPO_BOT_PAT }}
|
||||
|
||||
- uses: actions/github-script@v3
|
||||
with:
|
||||
github-token: ${{ secrets.EXPO_BOT_PAT }}
|
||||
script: |
|
||||
github.issues.createComment({
|
||||
issue_number: ${{ steps.open-pr.outputs.pr_number }},
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
body: "/changelog-entry chore Upgrade [`eas-build`](https://github.com/expo/eas-build) dependencies."
|
||||
})
|
||||
+35
-1
@@ -10,10 +10,44 @@ This is the log of notable changes to EAS CLI and related packages.
|
||||
|
||||
### 🐛 Bug fixes
|
||||
|
||||
- Revert incorrect EAS Submit input validation changes. ([#2200](https://github.com/expo/eas-cli/pull/2200) by [@szdziedzic](https://github.com/szdziedzic))
|
||||
### 🧹 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))
|
||||
|
||||
## [7.2.0](https://github.com/expo/eas-cli/releases/tag/v7.2.0) - 2024-02-11
|
||||
|
||||
### 🎉 New features
|
||||
|
||||
- Support configuring a Google Service Account Key via eas credentials, for sending Android Notifications via FCM V1. ([#2197](https://github.com/expo/eas-cli/pull/2197) by [@christopherwalter](https://github.com/christopherwalter))
|
||||
|
||||
### 🐛 Bug fixes
|
||||
|
||||
- Revert expose expo export dev flag as an option in eas update. ([#2214](https://github.com/expo/eas-cli/pull/2214) by [@wschurman](https://github.com/wschurman))
|
||||
|
||||
### 🧹 Chores
|
||||
|
||||
- Upgrade [`eas-build`](https://github.com/expo/eas-build) dependencies. ([#2223](https://github.com/expo/eas-cli/pull/2223) by [@expo-bot](https://github.com/expo-bot))
|
||||
|
||||
## [7.1.3](https://github.com/expo/eas-cli/releases/tag/v7.1.3) - 2024-02-07
|
||||
|
||||
### 🧹 Chores
|
||||
|
||||
- Remove duplicated log message when creating ASC API key. ([#2208](https://github.com/expo/eas-cli/pull/2208) by [@radoslawkrzemien](https://github.com/radoslawkrzemien))
|
||||
- Add simulator flag to metadata. ([#2073](https://github.com/expo/eas-cli/pull/2073) by [@radoslawkrzemien](https://github.com/radoslawkrzemien))
|
||||
- Upgrade [`eas-build`](https://github.com/expo/eas-build) dependencies. ([#2220](https://github.com/expo/eas-cli/pull/2220) by [@expo-bot](https://github.com/expo-bot))
|
||||
|
||||
## [7.1.2](https://github.com/expo/eas-cli/releases/tag/v7.1.2) - 2024-01-30
|
||||
|
||||
### 🧹 Chores
|
||||
|
||||
- Add better validation for EAS Submit inputs. ([#2202](https://github.com/expo/eas-cli/pull/2202) by [@szdziedzic](https://github.com/szdziedzic))
|
||||
|
||||
## [7.1.1](https://github.com/expo/eas-cli/releases/tag/v7.1.1) - 2024-01-26
|
||||
|
||||
### 🐛 Bug fixes
|
||||
|
||||
- Revert incorrect EAS Submit input validation changes. ([#2200](https://github.com/expo/eas-cli/pull/2200) by [@szdziedzic](https://github.com/szdziedzic))
|
||||
|
||||
## [7.1.0](https://github.com/expo/eas-cli/releases/tag/v7.1.0) - 2024-01-26
|
||||
|
||||
### 🎉 New features
|
||||
|
||||
+6
-6
@@ -1,10 +1,10 @@
|
||||
* @szdziedzic @khamilowicz
|
||||
* @szdziedzic @khamilowicz @sjchmiela
|
||||
|
||||
packages/eas-cli/src/build @szdziedzic @khamilowicz
|
||||
packages/eas-cli/src/commands/build @szdziedzic @khamilowicz
|
||||
packages/eas-cli/src/build @szdziedzic @khamilowicz @sjchmiela
|
||||
packages/eas-cli/src/commands/build @szdziedzic @khamilowicz @sjchmiela
|
||||
|
||||
packages/eas-cli/src/submit @szdziedzic @khamilowicz
|
||||
packages/eas-cli/src/commands/submit.ts @szdziedzic @khamilowicz
|
||||
packages/eas-cli/src/submit @szdziedzic @khamilowicz @sjchmiela
|
||||
packages/eas-cli/src/commands/submit.ts @szdziedzic @khamilowicz @sjchmiela
|
||||
|
||||
packages/eas-cli/src/update @EvanBacon @byCedric @wschurman
|
||||
packages/eas-cli/src/commands/update @EvanBacon @byCedric @wschurman
|
||||
@@ -13,4 +13,4 @@ packages/eas-cli/schema @bycedric
|
||||
packages/eas-cli/src/metadata @bycedric
|
||||
packages/eas-cli/src/commands/metadata @bycedric
|
||||
|
||||
packages/eas-json @szdziedzic @khamilowicz
|
||||
packages/eas-json @szdziedzic @khamilowicz @sjchmiela
|
||||
@@ -12,7 +12,3 @@ The algorithm works as follows:
|
||||
- If there are any entries in the "🛠 Breaking changes" section, bump the MAJOR version.
|
||||
- Otherwise, if there are any entries in the "🎉 New features", bump the MINOR version.
|
||||
- Otherwise, bump the PATCH version.
|
||||
|
||||
## Updating EAS CLI version on EAS Build
|
||||
|
||||
The release process promotes the new version to staging. After verifying it works there, you can promote it to production with `npm dist-tag add eas-cli@{version} latest-eas-build`.
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"npmClient": "yarn",
|
||||
"version": "7.1.1",
|
||||
"version": "7.2.0",
|
||||
"$schema": "node_modules/lerna/schemas/lerna-schema.json"
|
||||
}
|
||||
+64
-62
@@ -136,7 +136,7 @@ ALIASES
|
||||
$ eas login
|
||||
```
|
||||
|
||||
_See code: [src/commands/account/login.ts](https://github.com/expo/eas-cli/blob/v7.1.1/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.1.1/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.1.1/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.1.1/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.1.1/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.1.1/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.1.1/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.1.1/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.1.1/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.1.1/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.1.1/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.1.1/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.1.1/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.1.1/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`
|
||||
|
||||
@@ -452,7 +452,7 @@ USAGE
|
||||
new|in-queue|in-progress|pending-cancel|errored|finished|canceled] [--distribution store|internal|simulator]
|
||||
[--channel <value>] [--appVersion <value>] [--appBuildVersion <value>] [--sdkVersion <value>] [--runtimeVersion
|
||||
<value>] [--appIdentifier <value>] [--buildProfile <value>] [--gitCommitHash <value>] [--offset <value>] [--limit
|
||||
<value>] [--json --non-interactive]
|
||||
<value>] [--json --non-interactive] [--simulator]
|
||||
|
||||
FLAGS
|
||||
--appBuildVersion=<value>
|
||||
@@ -472,13 +472,16 @@ FLAGS
|
||||
--platform=(all|android|ios)
|
||||
--runtimeVersion=<value>
|
||||
--sdkVersion=<value>
|
||||
--simulator Filter only iOS simulator builds. Can
|
||||
only be used with --platform flag set to
|
||||
"ios"
|
||||
--status=(new|in-queue|in-progress|pending-cancel|errored|finished|canceled)
|
||||
|
||||
DESCRIPTION
|
||||
list all builds for your project
|
||||
```
|
||||
|
||||
_See code: [src/commands/build/list.ts](https://github.com/expo/eas-cli/blob/v7.1.1/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`
|
||||
|
||||
@@ -504,7 +507,7 @@ DESCRIPTION
|
||||
re-sign a build archive
|
||||
```
|
||||
|
||||
_See code: [src/commands/build/resign.ts](https://github.com/expo/eas-cli/blob/v7.1.1/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`
|
||||
|
||||
@@ -530,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.1.1/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`
|
||||
|
||||
@@ -579,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.1.1/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`
|
||||
|
||||
@@ -598,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.1.1/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`
|
||||
|
||||
@@ -617,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.1.1/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]`
|
||||
|
||||
@@ -634,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.1.1/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]`
|
||||
|
||||
@@ -655,7 +658,7 @@ DESCRIPTION
|
||||
create a channel
|
||||
```
|
||||
|
||||
_See code: [src/commands/channel/create.ts](https://github.com/expo/eas-cli/blob/v7.1.1/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]`
|
||||
|
||||
@@ -677,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.1.1/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`
|
||||
|
||||
@@ -697,7 +700,7 @@ DESCRIPTION
|
||||
list all channels
|
||||
```
|
||||
|
||||
_See code: [src/commands/channel/list.ts](https://github.com/expo/eas-cli/blob/v7.1.1/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]`
|
||||
|
||||
@@ -729,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.1.1/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]`
|
||||
|
||||
@@ -752,7 +755,7 @@ DESCRIPTION
|
||||
view a channel
|
||||
```
|
||||
|
||||
_See code: [src/commands/channel/view.ts](https://github.com/expo/eas-cli/blob/v7.1.1/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`
|
||||
|
||||
@@ -773,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.1.1/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`
|
||||
|
||||
@@ -790,7 +793,7 @@ DESCRIPTION
|
||||
manage credentials
|
||||
```
|
||||
|
||||
_See code: [src/commands/credentials.ts](https://github.com/expo/eas-cli/blob/v7.1.1/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`
|
||||
|
||||
@@ -804,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.1.1/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`
|
||||
|
||||
@@ -824,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.1.1/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`
|
||||
|
||||
@@ -845,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.1.1/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`
|
||||
|
||||
@@ -866,7 +869,7 @@ DESCRIPTION
|
||||
rename a registered device
|
||||
```
|
||||
|
||||
_See code: [src/commands/device/rename.ts](https://github.com/expo/eas-cli/blob/v7.1.1/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]`
|
||||
|
||||
@@ -880,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.1.1/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`
|
||||
|
||||
@@ -894,7 +897,7 @@ DESCRIPTION
|
||||
display environment info
|
||||
```
|
||||
|
||||
_See code: [src/commands/diagnostics.ts](https://github.com/expo/eas-cli/blob/v7.1.1/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]`
|
||||
|
||||
@@ -982,7 +985,7 @@ DESCRIPTION
|
||||
validate the local store configuration
|
||||
```
|
||||
|
||||
_See code: [src/commands/metadata/lint.ts](https://github.com/expo/eas-cli/blob/v7.1.1/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`
|
||||
|
||||
@@ -999,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.1.1/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`
|
||||
|
||||
@@ -1016,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.1.1/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`
|
||||
|
||||
@@ -1030,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.1.1/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`
|
||||
|
||||
@@ -1044,7 +1047,7 @@ DESCRIPTION
|
||||
information about the current project
|
||||
```
|
||||
|
||||
_See code: [src/commands/project/info.ts](https://github.com/expo/eas-cli/blob/v7.1.1/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`
|
||||
|
||||
@@ -1066,7 +1069,7 @@ ALIASES
|
||||
$ eas init
|
||||
```
|
||||
|
||||
_See code: [src/commands/project/init.ts](https://github.com/expo/eas-cli/blob/v7.1.1/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`
|
||||
|
||||
@@ -1089,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.1.1/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`
|
||||
|
||||
@@ -1107,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.1.1/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`
|
||||
|
||||
@@ -1121,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.1.1/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`
|
||||
|
||||
@@ -1141,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.1.1/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`
|
||||
|
||||
@@ -1171,7 +1174,7 @@ ALIASES
|
||||
$ eas build:submit
|
||||
```
|
||||
|
||||
_See code: [src/commands/submit.ts](https://github.com/expo/eas-cli/blob/v7.1.1/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`
|
||||
|
||||
@@ -1180,8 +1183,8 @@ publish an update group
|
||||
```
|
||||
USAGE
|
||||
$ eas update [--branch <value>] [--channel <value>] [-m <value>] [--republish | --input-dir <value> |
|
||||
--skip-bundler] [--group <value> | | ] [--clear-cache] [-p android|ios|all] [--dev] [--auto] [--private-key-path
|
||||
<value>] [--json --non-interactive]
|
||||
--skip-bundler] [--group <value> | | ] [--clear-cache] [-p android|ios|all] [--auto] [--private-key-path <value>]
|
||||
[--json --non-interactive]
|
||||
|
||||
FLAGS
|
||||
-m, --message=<value> A short message describing the update
|
||||
@@ -1190,7 +1193,6 @@ FLAGS
|
||||
--branch=<value> Branch to publish the update group on
|
||||
--channel=<value> Channel that the published update should affect
|
||||
--clear-cache Clear the bundler cache before publishing
|
||||
--dev Publish a development bundle
|
||||
--group=<value> Update group to republish (deprecated, see republish command)
|
||||
--input-dir=<value> [default: dist] Location of the bundle
|
||||
--json Enable JSON output, non-JSON messages will be printed to stderr.
|
||||
@@ -1205,7 +1207,7 @@ DESCRIPTION
|
||||
publish an update group
|
||||
```
|
||||
|
||||
_See code: [src/commands/update/index.ts](https://github.com/expo/eas-cli/blob/v7.1.1/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`
|
||||
|
||||
@@ -1223,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.1.1/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`
|
||||
|
||||
@@ -1244,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.1.1/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`
|
||||
|
||||
@@ -1266,7 +1268,7 @@ DESCRIPTION
|
||||
view the recent updates
|
||||
```
|
||||
|
||||
_See code: [src/commands/update/list.ts](https://github.com/expo/eas-cli/blob/v7.1.1/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`
|
||||
|
||||
@@ -1293,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.1.1/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`
|
||||
|
||||
@@ -1320,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.1.1/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`
|
||||
|
||||
@@ -1339,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.1.1/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`
|
||||
|
||||
@@ -1359,7 +1361,7 @@ DESCRIPTION
|
||||
update group details
|
||||
```
|
||||
|
||||
_See code: [src/commands/update/view.ts](https://github.com/expo/eas-cli/blob/v7.1.1/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`
|
||||
|
||||
@@ -1380,7 +1382,7 @@ DESCRIPTION
|
||||
create a webhook
|
||||
```
|
||||
|
||||
_See code: [src/commands/webhook/create.ts](https://github.com/expo/eas-cli/blob/v7.1.1/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]`
|
||||
|
||||
@@ -1400,7 +1402,7 @@ DESCRIPTION
|
||||
delete a webhook
|
||||
```
|
||||
|
||||
_See code: [src/commands/webhook/delete.ts](https://github.com/expo/eas-cli/blob/v7.1.1/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`
|
||||
|
||||
@@ -1418,7 +1420,7 @@ DESCRIPTION
|
||||
list webhooks
|
||||
```
|
||||
|
||||
_See code: [src/commands/webhook/list.ts](https://github.com/expo/eas-cli/blob/v7.1.1/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`
|
||||
|
||||
@@ -1440,7 +1442,7 @@ DESCRIPTION
|
||||
update a webhook
|
||||
```
|
||||
|
||||
_See code: [src/commands/webhook/update.ts](https://github.com/expo/eas-cli/blob/v7.1.1/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`
|
||||
|
||||
@@ -1457,7 +1459,7 @@ DESCRIPTION
|
||||
view a webhook
|
||||
```
|
||||
|
||||
_See code: [src/commands/webhook/view.ts](https://github.com/expo/eas-cli/blob/v7.1.1/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`
|
||||
|
||||
|
||||
Generated
+260
@@ -4726,6 +4726,18 @@
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "googleServiceAccountKeyForFcmV1",
|
||||
"description": null,
|
||||
"args": [],
|
||||
"type": {
|
||||
"kind": "OBJECT",
|
||||
"name": "GoogleServiceAccountKey",
|
||||
"ofType": null
|
||||
},
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "googleServiceAccountKeyForSubmissions",
|
||||
"description": null,
|
||||
@@ -4829,6 +4841,18 @@
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "googleServiceAccountKeyForFcmV1Id",
|
||||
"description": null,
|
||||
"type": {
|
||||
"kind": "SCALAR",
|
||||
"name": "ID",
|
||||
"ofType": null
|
||||
},
|
||||
"defaultValue": null,
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "googleServiceAccountKeyForSubmissionsId",
|
||||
"description": null,
|
||||
@@ -4916,6 +4940,71 @@
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "createFcmV1Credential",
|
||||
"description": "Create a GoogleServiceAccountKeyEntity to store credential and\nconnect it with an edge from AndroidAppCredential",
|
||||
"args": [
|
||||
{
|
||||
"name": "accountId",
|
||||
"description": null,
|
||||
"type": {
|
||||
"kind": "NON_NULL",
|
||||
"name": null,
|
||||
"ofType": {
|
||||
"kind": "SCALAR",
|
||||
"name": "ID",
|
||||
"ofType": null
|
||||
}
|
||||
},
|
||||
"defaultValue": null,
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "androidAppCredentialsId",
|
||||
"description": null,
|
||||
"type": {
|
||||
"kind": "NON_NULL",
|
||||
"name": null,
|
||||
"ofType": {
|
||||
"kind": "SCALAR",
|
||||
"name": "String",
|
||||
"ofType": null
|
||||
}
|
||||
},
|
||||
"defaultValue": null,
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "credential",
|
||||
"description": null,
|
||||
"type": {
|
||||
"kind": "NON_NULL",
|
||||
"name": null,
|
||||
"ofType": {
|
||||
"kind": "SCALAR",
|
||||
"name": "String",
|
||||
"ofType": null
|
||||
}
|
||||
},
|
||||
"defaultValue": null,
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
"kind": "NON_NULL",
|
||||
"name": null,
|
||||
"ofType": {
|
||||
"kind": "OBJECT",
|
||||
"name": "AndroidAppCredentials",
|
||||
"ofType": null
|
||||
}
|
||||
},
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "deleteAndroidAppCredentials",
|
||||
"description": "Delete a set of credentials for an Android app",
|
||||
@@ -4998,6 +5087,55 @@
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "setGoogleServiceAccountKeyForFcmV1",
|
||||
"description": "Set the Google Service Account Key to be used for Firebase Cloud Messaging V1",
|
||||
"args": [
|
||||
{
|
||||
"name": "googleServiceAccountKeyId",
|
||||
"description": null,
|
||||
"type": {
|
||||
"kind": "NON_NULL",
|
||||
"name": null,
|
||||
"ofType": {
|
||||
"kind": "SCALAR",
|
||||
"name": "ID",
|
||||
"ofType": null
|
||||
}
|
||||
},
|
||||
"defaultValue": null,
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "id",
|
||||
"description": null,
|
||||
"type": {
|
||||
"kind": "NON_NULL",
|
||||
"name": null,
|
||||
"ofType": {
|
||||
"kind": "SCALAR",
|
||||
"name": "ID",
|
||||
"ofType": null
|
||||
}
|
||||
},
|
||||
"defaultValue": null,
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
}
|
||||
],
|
||||
"type": {
|
||||
"kind": "NON_NULL",
|
||||
"name": null,
|
||||
"ofType": {
|
||||
"kind": "OBJECT",
|
||||
"name": "AndroidAppCredentials",
|
||||
"ofType": null
|
||||
}
|
||||
},
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "setGoogleServiceAccountKeyForSubmissions",
|
||||
"description": "Set the Google Service Account Key to be used for submitting an Android app",
|
||||
@@ -14573,6 +14711,22 @@
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "isForIosSimulator",
|
||||
"description": null,
|
||||
"args": [],
|
||||
"type": {
|
||||
"kind": "NON_NULL",
|
||||
"name": null,
|
||||
"ofType": {
|
||||
"kind": "SCALAR",
|
||||
"name": "Boolean",
|
||||
"ofType": null
|
||||
}
|
||||
},
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "isGitWorkingTreeDirty",
|
||||
"description": null,
|
||||
@@ -15872,6 +16026,18 @@
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "simulator",
|
||||
"description": null,
|
||||
"type": {
|
||||
"kind": "SCALAR",
|
||||
"name": "Boolean",
|
||||
"ofType": null
|
||||
},
|
||||
"defaultValue": null,
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "status",
|
||||
"description": null,
|
||||
@@ -15970,6 +16136,18 @@
|
||||
"defaultValue": null,
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "simulator",
|
||||
"description": null,
|
||||
"type": {
|
||||
"kind": "SCALAR",
|
||||
"name": "Boolean",
|
||||
"ofType": null
|
||||
},
|
||||
"defaultValue": null,
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
}
|
||||
],
|
||||
"interfaces": null,
|
||||
@@ -16894,6 +17072,18 @@
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "simulator",
|
||||
"description": null,
|
||||
"type": {
|
||||
"kind": "SCALAR",
|
||||
"name": "Boolean",
|
||||
"ofType": null
|
||||
},
|
||||
"defaultValue": null,
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "trackingContext",
|
||||
"description": null,
|
||||
@@ -17959,6 +18149,22 @@
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "isForIosSimulator",
|
||||
"description": null,
|
||||
"args": [],
|
||||
"type": {
|
||||
"kind": "NON_NULL",
|
||||
"name": null,
|
||||
"ofType": {
|
||||
"kind": "SCALAR",
|
||||
"name": "Boolean",
|
||||
"ofType": null
|
||||
}
|
||||
},
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "platform",
|
||||
"description": null,
|
||||
@@ -19330,6 +19536,18 @@
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "submitProfile",
|
||||
"description": null,
|
||||
"type": {
|
||||
"kind": "SCALAR",
|
||||
"name": "String",
|
||||
"ofType": null
|
||||
},
|
||||
"defaultValue": null,
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "targetPattern",
|
||||
"description": "A branch name or a wildcard pattern that the pull request targets. For example, `main` or `release/*`.",
|
||||
@@ -23242,6 +23460,18 @@
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "submitProfile",
|
||||
"description": null,
|
||||
"args": [],
|
||||
"type": {
|
||||
"kind": "SCALAR",
|
||||
"name": "String",
|
||||
"ofType": null
|
||||
},
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "targetPattern",
|
||||
"description": null,
|
||||
@@ -27500,6 +27730,12 @@
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "DID_SUBSCRIBE_TO_EAS_AT_LEAST_ONCE",
|
||||
"description": null,
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "EAS_MASTER_LIST",
|
||||
"description": null,
|
||||
@@ -28447,6 +28683,12 @@
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "BUILD_ERRORED",
|
||||
"description": null,
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "BUILD_LIMIT_THRESHOLD_EXCEEDED",
|
||||
"description": null,
|
||||
@@ -28465,6 +28707,12 @@
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "SUBMISSION_ERRORED",
|
||||
"description": null,
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "TEST",
|
||||
"description": null,
|
||||
@@ -37050,6 +37298,18 @@
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "submitProfile",
|
||||
"description": null,
|
||||
"type": {
|
||||
"kind": "SCALAR",
|
||||
"name": "String",
|
||||
"ofType": null
|
||||
},
|
||||
"defaultValue": null,
|
||||
"isDeprecated": false,
|
||||
"deprecationReason": null
|
||||
},
|
||||
{
|
||||
"name": "targetPattern",
|
||||
"description": null,
|
||||
|
||||
@@ -1,20 +1,21 @@
|
||||
{
|
||||
"name": "eas-cli",
|
||||
"description": "EAS command line tool",
|
||||
"version": "7.1.1",
|
||||
"version": "7.2.0",
|
||||
"author": "Expo <[email protected]>",
|
||||
"bin": {
|
||||
"eas": "./bin/run"
|
||||
},
|
||||
"bugs": "https://github.com/expo/eas-cli/issues",
|
||||
"dependencies": {
|
||||
"@expo/apple-utils": "1.3.2",
|
||||
"@expo/apple-utils": "1.4.0",
|
||||
"@expo/code-signing-certificates": "0.0.5",
|
||||
"@expo/config": "8.5.4",
|
||||
"@expo/config-plugins": "7.8.4",
|
||||
"@expo/config-types": "50.0.0",
|
||||
"@expo/eas-build-job": "1.0.59",
|
||||
"@expo/eas-json": "7.1.1",
|
||||
"@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",
|
||||
@@ -27,7 +28,7 @@
|
||||
"@expo/results": "1.0.0",
|
||||
"@expo/rudder-sdk-node": "1.1.1",
|
||||
"@expo/spawn-async": "1.7.0",
|
||||
"@expo/steps": "1.0.51",
|
||||
"@expo/steps": "1.0.70",
|
||||
"@expo/timeago.js": "1.0.0",
|
||||
"@oclif/core": "^1.26.2",
|
||||
"@oclif/plugin-autocomplete": "^2.3.10",
|
||||
|
||||
@@ -92,5 +92,6 @@ function createMockBuildFragment({
|
||||
},
|
||||
status: BuildStatus.InQueue,
|
||||
resourceClass: BuildResourceClass.AndroidMedium,
|
||||
isForIosSimulator: false,
|
||||
};
|
||||
}
|
||||
@@ -92,5 +92,6 @@ function createMockBuildFragment({
|
||||
},
|
||||
status: BuildStatus.InQueue,
|
||||
resourceClass: BuildResourceClass.AndroidMedium,
|
||||
isForIosSimulator: false,
|
||||
};
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -8,6 +8,7 @@ import { maybeResolveVersionsAsync as maybeResolveAndroidVersionsAsync } from '.
|
||||
import { BuildContext } from './context';
|
||||
import { maybeResolveVersionsAsync as maybeResolveIosVersionsAsync } from './ios/version';
|
||||
import { LocalBuildMode } from './local';
|
||||
import { BuildDistributionType } from './types';
|
||||
import Log from '../log';
|
||||
import {
|
||||
getUsername,
|
||||
@@ -28,10 +29,7 @@ export async function collectMetadataAsync<T extends Platform>(
|
||||
ctx: BuildContext<T>
|
||||
): Promise<Metadata> {
|
||||
const channelOrReleaseChannel = await resolveChannelOrReleaseChannelAsync(ctx);
|
||||
const distribution =
|
||||
('simulator' in ctx.buildProfile && ctx.buildProfile.simulator
|
||||
? 'simulator'
|
||||
: ctx.buildProfile.distribution) ?? 'store';
|
||||
const distribution = ctx.buildProfile.distribution ?? BuildDistributionType.STORE;
|
||||
const metadata: Metadata = {
|
||||
trackingContext: ctx.analyticsEventProperties,
|
||||
...(await maybeResolveVersionsAsync(ctx)),
|
||||
@@ -70,6 +68,7 @@ export async function collectMetadataAsync<T extends Platform>(
|
||||
requiredPackageManager: ctx.requiredPackageManager ?? undefined,
|
||||
selectedImage: ctx.buildProfile.image,
|
||||
customNodeVersion: ctx.buildProfile.node,
|
||||
simulator: 'simulator' in ctx.buildProfile && ctx.buildProfile.simulator,
|
||||
};
|
||||
return sanitizeMetadata(metadata);
|
||||
}
|
||||
|
||||
@@ -11,5 +11,6 @@ export enum BuildStatus {
|
||||
export enum BuildDistributionType {
|
||||
STORE = 'store',
|
||||
INTERNAL = 'internal',
|
||||
/** @deprecated Use simulator flag instead */
|
||||
SIMULATOR = 'simulator',
|
||||
}
|
||||
@@ -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 }, [
|
||||
'.',
|
||||
]);
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
getPaginatedQueryOptions,
|
||||
} from '../../commandUtils/pagination';
|
||||
import { AppPlatform, BuildStatus as GraphQLBuildStatus } from '../../graphql/generated';
|
||||
import Log from '../../log';
|
||||
import { RequestedPlatform } from '../../platform';
|
||||
import { getDisplayNameForProjectIdAsync } from '../../project/projectUtils';
|
||||
import { buildDistributionTypeToGraphQLDistributionType } from '../../utils/buildDistribution';
|
||||
@@ -51,6 +52,10 @@ export default class BuildList extends EasCommand {
|
||||
...EasPaginatedQueryFlags,
|
||||
limit: getLimitFlagWithCustomValues({ defaultTo: 10, limit: BUILDS_LIMIT }),
|
||||
...EasNonInteractiveAndJsonFlags,
|
||||
simulator: Flags.boolean({
|
||||
description:
|
||||
'Filter only iOS simulator builds. Can only be used with --platform flag set to "ios"',
|
||||
}),
|
||||
};
|
||||
|
||||
static override contextDefinition = {
|
||||
@@ -69,6 +74,17 @@ export default class BuildList extends EasCommand {
|
||||
distribution: buildDistribution,
|
||||
'non-interactive': nonInteractive,
|
||||
} = flags;
|
||||
if (buildDistribution === BuildDistributionType.SIMULATOR) {
|
||||
Log.warn(
|
||||
`Using --distribution flag with "simulator" value is deprecated - use --simulator flag instead`
|
||||
);
|
||||
}
|
||||
if (flags.simulator && requestedPlatform !== RequestedPlatform.Ios) {
|
||||
Log.error(
|
||||
`The --simulator flag is only usable with --platform flag set to "ios", as it is used to filter specifically iOS simulator builds`
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
const {
|
||||
privateProjectConfig: { projectId },
|
||||
loggedIn: { graphqlClient },
|
||||
@@ -100,6 +116,7 @@ export default class BuildList extends EasCommand {
|
||||
appIdentifier: flags.appIdentifier,
|
||||
buildProfile: flags.buildProfile,
|
||||
gitCommitHash: flags.gitCommitHash,
|
||||
simulator: flags.simulator,
|
||||
},
|
||||
paginatedQueryOptions,
|
||||
});
|
||||
|
||||
@@ -11,7 +11,7 @@ import {
|
||||
PaginatedQueryOptions,
|
||||
getPaginatedQueryOptions,
|
||||
} from '../../commandUtils/pagination';
|
||||
import { AppPlatform, BuildFragment, BuildStatus, DistributionType } from '../../graphql/generated';
|
||||
import { AppPlatform, BuildFragment, BuildStatus } from '../../graphql/generated';
|
||||
import { BuildQuery } from '../../graphql/queries/BuildQuery';
|
||||
import Log from '../../log';
|
||||
import { appPlatformDisplayNames } from '../../platform';
|
||||
@@ -200,8 +200,7 @@ async function maybeGetBuildAsync(
|
||||
projectId: string,
|
||||
paginatedQueryOptions: PaginatedQueryOptions
|
||||
): Promise<BuildFragment | null> {
|
||||
const distributionType =
|
||||
flags.selectedPlatform === AppPlatform.Ios ? DistributionType.Simulator : undefined;
|
||||
const simulator = flags.selectedPlatform === AppPlatform.Ios ? true : undefined;
|
||||
|
||||
if (flags.runArchiveFlags.id) {
|
||||
const build = await BuildQuery.byIdAsync(graphqlClient, flags.runArchiveFlags.id);
|
||||
@@ -219,9 +218,9 @@ async function maybeGetBuildAsync(
|
||||
} build to run for ${await getDisplayNameForProjectIdAsync(graphqlClient, projectId)} app`,
|
||||
filter: {
|
||||
platform: flags.selectedPlatform,
|
||||
distribution: distributionType,
|
||||
status: BuildStatus.Finished,
|
||||
buildProfile: flags.profile,
|
||||
simulator,
|
||||
},
|
||||
paginatedQueryOptions,
|
||||
selectPromptDisabledFunction: build => !isRunnableOnSimulatorOrEmulator(build),
|
||||
@@ -235,9 +234,9 @@ async function maybeGetBuildAsync(
|
||||
projectId,
|
||||
filter: {
|
||||
platform: flags.selectedPlatform,
|
||||
distribution: distributionType,
|
||||
status: BuildStatus.Finished,
|
||||
buildProfile: flags.profile,
|
||||
simulator,
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -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.`
|
||||
|
||||
@@ -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}`);
|
||||
|
||||
@@ -56,7 +56,6 @@ import { maybeWarnAboutEasOutagesAsync } from '../../utils/statuspageService';
|
||||
|
||||
type RawUpdateFlags = {
|
||||
auto: boolean;
|
||||
dev: boolean;
|
||||
branch?: string;
|
||||
channel?: string;
|
||||
message?: string;
|
||||
@@ -75,7 +74,6 @@ type RawUpdateFlags = {
|
||||
|
||||
type UpdateFlags = {
|
||||
auto: boolean;
|
||||
dev: boolean;
|
||||
platform: ExpoCLIExportPlatformFlag;
|
||||
branchName?: string;
|
||||
channelName?: string;
|
||||
@@ -136,10 +134,6 @@ export default class UpdatePublish extends EasCommand {
|
||||
default: 'all',
|
||||
required: false,
|
||||
}),
|
||||
dev: Flags.boolean({
|
||||
description: 'Publish a development bundle',
|
||||
default: false,
|
||||
}),
|
||||
auto: Flags.boolean({
|
||||
description:
|
||||
'Use the current git branch and commit message for the EAS branch and update message',
|
||||
@@ -165,7 +159,6 @@ export default class UpdatePublish extends EasCommand {
|
||||
auto: autoFlag,
|
||||
platform: platformFlag,
|
||||
channelName: channelNameArg,
|
||||
dev,
|
||||
updateMessage: updateMessageArg,
|
||||
inputDir,
|
||||
skipBundler,
|
||||
@@ -234,7 +227,7 @@ export default class UpdatePublish extends EasCommand {
|
||||
if (!skipBundler) {
|
||||
const bundleSpinner = ora().start('Exporting...');
|
||||
try {
|
||||
await buildBundlesAsync({ projectDir, inputDir, dev, exp, platformFlag, clearCache });
|
||||
await buildBundlesAsync({ projectDir, inputDir, exp, platformFlag, clearCache });
|
||||
bundleSpinner.succeed('Exported bundle(s)');
|
||||
} catch (e) {
|
||||
bundleSpinner.fail('Export failed');
|
||||
@@ -366,12 +359,13 @@ export default class UpdatePublish extends EasCommand {
|
||||
throw e;
|
||||
}
|
||||
|
||||
const runtimeVersions = await getRuntimeVersionObjectAsync(
|
||||
const runtimeVersions = await getRuntimeVersionObjectAsync({
|
||||
exp,
|
||||
realizedPlatforms,
|
||||
platforms: realizedPlatforms,
|
||||
projectDir,
|
||||
vcsClient
|
||||
);
|
||||
vcsClient,
|
||||
nonInteractive,
|
||||
});
|
||||
const runtimeToPlatformMapping =
|
||||
getRuntimeToPlatformMappingFromRuntimeVersions(runtimeVersions);
|
||||
|
||||
@@ -547,7 +541,7 @@ export default class UpdatePublish extends EasCommand {
|
||||
private sanitizeFlags(flags: RawUpdateFlags): UpdateFlags {
|
||||
const nonInteractive = flags['non-interactive'] ?? false;
|
||||
|
||||
const { auto, branch: branchName, channel: channelName, dev, message: updateMessage } = flags;
|
||||
const { auto, branch: branchName, channel: channelName, message: updateMessage } = flags;
|
||||
if (nonInteractive && !auto && !(updateMessage && (branchName || channelName))) {
|
||||
Errors.error(
|
||||
'--branch and --message, or --channel and --message are required when updating in non-interactive mode unless --auto is specified',
|
||||
@@ -576,7 +570,6 @@ export default class UpdatePublish extends EasCommand {
|
||||
auto,
|
||||
branchName,
|
||||
channelName,
|
||||
dev,
|
||||
updateMessage,
|
||||
inputDir: flags['input-dir'],
|
||||
skipBundler: flags['skip-bundler'],
|
||||
|
||||
@@ -201,12 +201,13 @@ export default class UpdateRollBackToEmbedded extends EasCommand {
|
||||
const gitCommitHash = await vcsClient.getCommitHashAsync();
|
||||
const isGitWorkingTreeDirty = await vcsClient.hasUncommittedChangesAsync();
|
||||
|
||||
const runtimeVersions = await getRuntimeVersionObjectAsync(
|
||||
const runtimeVersions = await getRuntimeVersionObjectAsync({
|
||||
exp,
|
||||
realizedPlatforms,
|
||||
platforms: realizedPlatforms,
|
||||
projectDir,
|
||||
vcsClient
|
||||
);
|
||||
vcsClient,
|
||||
nonInteractive,
|
||||
});
|
||||
|
||||
let newUpdates: UpdatePublishMutation['updateBranch']['publishUpdateGroups'];
|
||||
const publishSpinner = ora('Publishing...').start();
|
||||
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
import {
|
||||
CommonAndroidAppCredentialsFragment,
|
||||
GoogleServiceAccountKeyFragment,
|
||||
} from '../../../graphql/generated';
|
||||
import Log from '../../../log';
|
||||
import { CredentialsContext } from '../../context';
|
||||
import { AppLookupParams } from '../api/GraphqlClient';
|
||||
|
||||
export class AssignGoogleServiceAccountKeyForFcmV1 {
|
||||
constructor(private app: AppLookupParams) {}
|
||||
|
||||
public async runAsync(
|
||||
ctx: CredentialsContext,
|
||||
googleServiceAccountKey: GoogleServiceAccountKeyFragment
|
||||
): Promise<CommonAndroidAppCredentialsFragment> {
|
||||
const appCredentials =
|
||||
await ctx.android.createOrGetExistingAndroidAppCredentialsWithBuildCredentialsAsync(
|
||||
ctx.graphqlClient,
|
||||
this.app
|
||||
);
|
||||
const updatedAppCredentials = await ctx.android.updateAndroidAppCredentialsAsync(
|
||||
ctx.graphqlClient,
|
||||
appCredentials,
|
||||
{
|
||||
googleServiceAccountKeyForFcmV1Id: googleServiceAccountKey.id,
|
||||
}
|
||||
);
|
||||
Log.succeed(
|
||||
`Google Service Account Key assigned to ${this.app.androidApplicationIdentifier} for FCM V1`
|
||||
);
|
||||
return updatedAppCredentials;
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -6,7 +6,7 @@ import Log from '../../../log';
|
||||
import { CredentialsContext } from '../../context';
|
||||
import { AppLookupParams } from '../api/GraphqlClient';
|
||||
|
||||
export class AssignGoogleServiceAccountKey {
|
||||
export class AssignGoogleServiceAccountKeyForSubmissions {
|
||||
constructor(private app: AppLookupParams) {}
|
||||
|
||||
public async runAsync(
|
||||
@@ -46,7 +46,7 @@ export class CreateGoogleServiceAccountKey {
|
||||
|
||||
Log.log(
|
||||
`${chalk.bold(
|
||||
'A Google Service Account JSON key is required to upload your app to Google Play Store'
|
||||
'A Google Service Account JSON key is required for uploading your app to Google Play Store, and for sending Android Notifications via FCM V1.'
|
||||
)}.\n` +
|
||||
`If you're not sure what this is or how to create one, ${learnMore(
|
||||
'https://expo.fyi/creating-google-service-account',
|
||||
|
||||
+87
@@ -0,0 +1,87 @@
|
||||
import nullthrows from 'nullthrows';
|
||||
|
||||
import { AssignGoogleServiceAccountKeyForFcmV1 } from './AssignGoogleServiceAccountKeyForFcmV1';
|
||||
import { CreateGoogleServiceAccountKey } from './CreateGoogleServiceAccountKey';
|
||||
import { UseExistingGoogleServiceAccountKey } from './UseExistingGoogleServiceAccountKey';
|
||||
import {
|
||||
CommonAndroidAppCredentialsFragment,
|
||||
GoogleServiceAccountKeyFragment,
|
||||
} from '../../../graphql/generated';
|
||||
import Log from '../../../log';
|
||||
import { promptAsync } from '../../../prompts';
|
||||
import { CredentialsContext } from '../../context';
|
||||
import { MissingCredentialsNonInteractiveError } from '../../errors';
|
||||
import { AppLookupParams } from '../api/GraphqlClient';
|
||||
|
||||
export class SetUpGoogleServiceAccountKeyForFcmV1 {
|
||||
constructor(private app: AppLookupParams) {}
|
||||
|
||||
public async runAsync(ctx: CredentialsContext): Promise<CommonAndroidAppCredentialsFragment> {
|
||||
const isKeySetup = await this.isGoogleServiceAccountKeySetupAsync(ctx);
|
||||
if (isKeySetup) {
|
||||
Log.succeed('Google Service Account Key for FCM V1 already set up.');
|
||||
return nullthrows(
|
||||
await ctx.android.getAndroidAppCredentialsWithCommonFieldsAsync(
|
||||
ctx.graphqlClient,
|
||||
this.app
|
||||
),
|
||||
'androidAppCredentials cannot be null if google service account key is already set up'
|
||||
);
|
||||
}
|
||||
if (ctx.nonInteractive) {
|
||||
throw new MissingCredentialsNonInteractiveError(
|
||||
'Google Service Account Keys cannot be set up in --non-interactive mode.'
|
||||
);
|
||||
}
|
||||
|
||||
const keysForAccount = await ctx.android.getGoogleServiceAccountKeysForAccountAsync(
|
||||
ctx.graphqlClient,
|
||||
this.app.account
|
||||
);
|
||||
let googleServiceAccountKey = null;
|
||||
if (keysForAccount.length === 0) {
|
||||
googleServiceAccountKey = await new CreateGoogleServiceAccountKey(this.app.account).runAsync(
|
||||
ctx
|
||||
);
|
||||
} else {
|
||||
googleServiceAccountKey = await this.createOrUseExistingKeyAsync(ctx);
|
||||
}
|
||||
return await new AssignGoogleServiceAccountKeyForFcmV1(this.app).runAsync(
|
||||
ctx,
|
||||
googleServiceAccountKey
|
||||
);
|
||||
}
|
||||
|
||||
private async isGoogleServiceAccountKeySetupAsync(ctx: CredentialsContext): Promise<boolean> {
|
||||
const appCredentials = await ctx.android.getAndroidAppCredentialsWithCommonFieldsAsync(
|
||||
ctx.graphqlClient,
|
||||
this.app
|
||||
);
|
||||
return !!appCredentials?.googleServiceAccountKeyForFcmV1;
|
||||
}
|
||||
|
||||
private async createOrUseExistingKeyAsync(
|
||||
ctx: CredentialsContext
|
||||
): Promise<GoogleServiceAccountKeyFragment> {
|
||||
const { action } = await promptAsync({
|
||||
type: 'select',
|
||||
name: 'action',
|
||||
message: 'Select the Google Service Account Key to use for FCM V1:',
|
||||
choices: [
|
||||
{
|
||||
title: '[Choose an existing key]',
|
||||
value: 'CHOOSE_EXISTING',
|
||||
},
|
||||
{ title: '[Upload a new service account key]', value: 'GENERATE' },
|
||||
],
|
||||
});
|
||||
|
||||
if (action === 'GENERATE') {
|
||||
return await new CreateGoogleServiceAccountKey(this.app.account).runAsync(ctx);
|
||||
}
|
||||
return (
|
||||
(await new UseExistingGoogleServiceAccountKey(this.app.account).runAsync(ctx)) ??
|
||||
(await this.createOrUseExistingKeyAsync(ctx))
|
||||
);
|
||||
}
|
||||
}
|
||||
+6
-3
@@ -1,6 +1,6 @@
|
||||
import nullthrows from 'nullthrows';
|
||||
|
||||
import { AssignGoogleServiceAccountKey } from './AssignGoogleServiceAccountKey';
|
||||
import { AssignGoogleServiceAccountKeyForSubmissions } from './AssignGoogleServiceAccountKeyForSubmissions';
|
||||
import { CreateGoogleServiceAccountKey } from './CreateGoogleServiceAccountKey';
|
||||
import { UseExistingGoogleServiceAccountKey } from './UseExistingGoogleServiceAccountKey';
|
||||
import {
|
||||
@@ -13,7 +13,7 @@ import { CredentialsContext } from '../../context';
|
||||
import { MissingCredentialsNonInteractiveError } from '../../errors';
|
||||
import { AppLookupParams } from '../api/GraphqlClient';
|
||||
|
||||
export class SetUpGoogleServiceAccountKey {
|
||||
export class SetUpGoogleServiceAccountKeyForSubmissions {
|
||||
constructor(private app: AppLookupParams) {}
|
||||
|
||||
public async runAsync(ctx: CredentialsContext): Promise<CommonAndroidAppCredentialsFragment> {
|
||||
@@ -46,7 +46,10 @@ export class SetUpGoogleServiceAccountKey {
|
||||
} else {
|
||||
googleServiceAccountKey = await this.createOrUseExistingKeyAsync(ctx);
|
||||
}
|
||||
return await new AssignGoogleServiceAccountKey(this.app).runAsync(ctx, googleServiceAccountKey);
|
||||
return await new AssignGoogleServiceAccountKeyForSubmissions(this.app).runAsync(
|
||||
ctx,
|
||||
googleServiceAccountKey
|
||||
);
|
||||
}
|
||||
|
||||
private async isGoogleServiceAccountKeySetupAsync(ctx: CredentialsContext): Promise<boolean> {
|
||||
+8
-4
@@ -2,12 +2,12 @@ import { AppQuery } from '../../../../graphql/queries/AppQuery';
|
||||
import { testGoogleServiceAccountKeyFragment } from '../../../__tests__/fixtures-android';
|
||||
import { testAppQueryByIdResponse } from '../../../__tests__/fixtures-constants';
|
||||
import { createCtxMock } from '../../../__tests__/fixtures-context';
|
||||
import { AssignGoogleServiceAccountKey } from '../AssignGoogleServiceAccountKey';
|
||||
import { AssignGoogleServiceAccountKeyForSubmissions } from '../AssignGoogleServiceAccountKeyForSubmissions';
|
||||
import { getAppLookupParamsFromContextAsync } from '../BuildCredentialsUtils';
|
||||
|
||||
jest.mock('../../../../graphql/queries/AppQuery');
|
||||
|
||||
describe(AssignGoogleServiceAccountKey, () => {
|
||||
describe(AssignGoogleServiceAccountKeyForSubmissions, () => {
|
||||
beforeEach(() => {
|
||||
jest.mocked(AppQuery.byIdAsync).mockResolvedValue(testAppQueryByIdResponse);
|
||||
});
|
||||
@@ -16,7 +16,9 @@ describe(AssignGoogleServiceAccountKey, () => {
|
||||
nonInteractive: false,
|
||||
});
|
||||
const appLookupParams = await getAppLookupParamsFromContextAsync(ctx);
|
||||
const assignGoogleServiceAccountKeyAction = new AssignGoogleServiceAccountKey(appLookupParams);
|
||||
const assignGoogleServiceAccountKeyAction = new AssignGoogleServiceAccountKeyForSubmissions(
|
||||
appLookupParams
|
||||
);
|
||||
await assignGoogleServiceAccountKeyAction.runAsync(ctx, testGoogleServiceAccountKeyFragment);
|
||||
|
||||
// expect app credentials to be fetched/created, then updated
|
||||
@@ -30,7 +32,9 @@ describe(AssignGoogleServiceAccountKey, () => {
|
||||
nonInteractive: true,
|
||||
});
|
||||
const appLookupParams = await getAppLookupParamsFromContextAsync(ctx);
|
||||
const assignGoogleServiceAccountKeyAction = new AssignGoogleServiceAccountKey(appLookupParams);
|
||||
const assignGoogleServiceAccountKeyAction = new AssignGoogleServiceAccountKeyForSubmissions(
|
||||
appLookupParams
|
||||
);
|
||||
|
||||
// dont fail if users are running in non-interactive mode
|
||||
await expect(
|
||||
+11
-5
@@ -11,7 +11,7 @@ import { testAppQueryByIdResponse } from '../../../__tests__/fixtures-constants'
|
||||
import { createCtxMock } from '../../../__tests__/fixtures-context';
|
||||
import { MissingCredentialsNonInteractiveError } from '../../../errors';
|
||||
import { getAppLookupParamsFromContextAsync } from '../BuildCredentialsUtils';
|
||||
import { SetUpGoogleServiceAccountKey } from '../SetUpGoogleServiceAccountKey';
|
||||
import { SetUpGoogleServiceAccountKeyForSubmissions } from '../SetUpGoogleServiceAccountKeyForSubmissions';
|
||||
|
||||
jest.mock('../../../../prompts');
|
||||
jest.mock('fs');
|
||||
@@ -24,7 +24,7 @@ beforeEach(() => {
|
||||
vol.reset();
|
||||
});
|
||||
|
||||
describe(SetUpGoogleServiceAccountKey, () => {
|
||||
describe(SetUpGoogleServiceAccountKeyForSubmissions, () => {
|
||||
beforeEach(() => {
|
||||
jest.mocked(AppQuery.byIdAsync).mockResolvedValue(testAppQueryByIdResponse);
|
||||
});
|
||||
@@ -39,7 +39,9 @@ describe(SetUpGoogleServiceAccountKey, () => {
|
||||
},
|
||||
});
|
||||
const appLookupParams = await getAppLookupParamsFromContextAsync(ctx);
|
||||
const setupGoogleServiceAccountKeyAction = new SetUpGoogleServiceAccountKey(appLookupParams);
|
||||
const setupGoogleServiceAccountKeyAction = new SetUpGoogleServiceAccountKeyForSubmissions(
|
||||
appLookupParams
|
||||
);
|
||||
await setupGoogleServiceAccountKeyAction.runAsync(ctx);
|
||||
|
||||
expect(ctx.android.createGoogleServiceAccountKeyAsync).not.toHaveBeenCalled();
|
||||
@@ -62,7 +64,9 @@ describe(SetUpGoogleServiceAccountKey, () => {
|
||||
},
|
||||
});
|
||||
const appLookupParams = await getAppLookupParamsFromContextAsync(ctx);
|
||||
const setupGoogleServiceAccountKeyAction = new SetUpGoogleServiceAccountKey(appLookupParams);
|
||||
const setupGoogleServiceAccountKeyAction = new SetUpGoogleServiceAccountKeyForSubmissions(
|
||||
appLookupParams
|
||||
);
|
||||
await setupGoogleServiceAccountKeyAction.runAsync(ctx);
|
||||
|
||||
expect(ctx.android.createGoogleServiceAccountKeyAsync).toHaveBeenCalledTimes(1);
|
||||
@@ -73,7 +77,9 @@ describe(SetUpGoogleServiceAccountKey, () => {
|
||||
nonInteractive: true,
|
||||
});
|
||||
const appLookupParams = await getAppLookupParamsFromContextAsync(ctx);
|
||||
const setupGoogleServiceAccountKeyAction = new SetUpGoogleServiceAccountKey(appLookupParams);
|
||||
const setupGoogleServiceAccountKeyAction = new SetUpGoogleServiceAccountKeyForSubmissions(
|
||||
appLookupParams
|
||||
);
|
||||
await expect(setupGoogleServiceAccountKeyAction.runAsync(ctx)).rejects.toThrowError(
|
||||
MissingCredentialsNonInteractiveError
|
||||
);
|
||||
|
||||
@@ -106,9 +106,11 @@ export async function updateAndroidAppCredentialsAsync(
|
||||
{
|
||||
androidFcmId,
|
||||
googleServiceAccountKeyForSubmissionsId,
|
||||
googleServiceAccountKeyForFcmV1Id,
|
||||
}: {
|
||||
androidFcmId?: string;
|
||||
googleServiceAccountKeyForSubmissionsId?: string;
|
||||
googleServiceAccountKeyForFcmV1Id?: string;
|
||||
}
|
||||
): Promise<CommonAndroidAppCredentialsFragment> {
|
||||
let updatedAppCredentials = appCredentials;
|
||||
@@ -127,6 +129,14 @@ export async function updateAndroidAppCredentialsAsync(
|
||||
googleServiceAccountKeyForSubmissionsId
|
||||
);
|
||||
}
|
||||
if (googleServiceAccountKeyForFcmV1Id) {
|
||||
updatedAppCredentials =
|
||||
await AndroidAppCredentialsMutation.setGoogleServiceAccountKeyForFcmV1Async(
|
||||
graphqlClient,
|
||||
appCredentials.id,
|
||||
googleServiceAccountKeyForFcmV1Id
|
||||
);
|
||||
}
|
||||
return updatedAppCredentials;
|
||||
}
|
||||
|
||||
|
||||
+39
@@ -8,6 +8,7 @@ import {
|
||||
CommonAndroidAppCredentialsFragment,
|
||||
CreateAndroidAppCredentialsMutation,
|
||||
SetFcmMutation,
|
||||
SetGoogleServiceAccountKeyForFcmV1Mutation,
|
||||
SetGoogleServiceAccountKeyForSubmissionsMutation,
|
||||
} from '../../../../../graphql/generated';
|
||||
import { CommonAndroidAppCredentialsFragmentNode } from '../../../../../graphql/types/credentials/AndroidAppCredentials';
|
||||
@@ -124,4 +125,42 @@ export const AndroidAppCredentialsMutation = {
|
||||
);
|
||||
return data.androidAppCredentials.setGoogleServiceAccountKeyForSubmissions;
|
||||
},
|
||||
async setGoogleServiceAccountKeyForFcmV1Async(
|
||||
graphqlClient: ExpoGraphqlClient,
|
||||
androidAppCredentialsId: string,
|
||||
googleServiceAccountKeyId: string
|
||||
): Promise<CommonAndroidAppCredentialsFragment> {
|
||||
const data = await withErrorHandlingAsync(
|
||||
graphqlClient
|
||||
.mutation<SetGoogleServiceAccountKeyForFcmV1Mutation>(
|
||||
gql`
|
||||
mutation SetGoogleServiceAccountKeyForFcmV1Mutation(
|
||||
$androidAppCredentialsId: ID!
|
||||
$googleServiceAccountKeyId: ID!
|
||||
) {
|
||||
androidAppCredentials {
|
||||
setGoogleServiceAccountKeyForFcmV1(
|
||||
id: $androidAppCredentialsId
|
||||
googleServiceAccountKeyId: $googleServiceAccountKeyId
|
||||
) {
|
||||
id
|
||||
...CommonAndroidAppCredentialsFragment
|
||||
}
|
||||
}
|
||||
}
|
||||
${print(CommonAndroidAppCredentialsFragmentNode)}
|
||||
`,
|
||||
{
|
||||
androidAppCredentialsId,
|
||||
googleServiceAccountKeyId,
|
||||
}
|
||||
)
|
||||
.toPromise()
|
||||
);
|
||||
assert(
|
||||
data.androidAppCredentials.setGoogleServiceAccountKeyForFcmV1,
|
||||
'GraphQL: `setGoogleServiceAccountKeyForFcmV1` not defined in server response'
|
||||
);
|
||||
return data.androidAppCredentials.setGoogleServiceAccountKeyForFcmV1;
|
||||
},
|
||||
};
|
||||
+2
-2
@@ -3,8 +3,8 @@
|
||||
exports[`print credentials prints the AndroidAppCredentials fragment 1`] = `
|
||||
"Android Credentials
|
||||
Project testApp
|
||||
Application Identifier test.com.appPush Notifications (FCM) Key abcd...efgh
|
||||
Updated 0 second agoGoogle Service Account Key For Submissions Project ID sdf.sdf.sdf
|
||||
Application Identifier test.com.appPush Notifications (FCM Legacy) Key abcd...efgh
|
||||
Updated 0 second agoPush Notifications (FCM V1): Google Service Account Key For FCM V1 None assigned yetSubmissions: Google Service Account Key for Play Store Submissions Project ID sdf.sdf.sdf
|
||||
Client Email [email protected]
|
||||
Client ID test-client-identifier
|
||||
Private Key ID test-private-key-identifier
|
||||
|
||||
@@ -13,7 +13,11 @@ import { getAppLookupParamsFromContextAsync } from '../../actions/BuildCredentia
|
||||
import { displayAndroidAppCredentials } from '../printCredentials';
|
||||
|
||||
jest.mock('../../../../log');
|
||||
jest.mock('chalk', () => ({ bold: jest.fn(log => log), cyan: { bold: jest.fn(log => log) } }));
|
||||
jest.mock('chalk', () => ({
|
||||
bold: jest.fn(log => log),
|
||||
cyan: { bold: jest.fn(log => log) },
|
||||
dim: jest.fn(log => log),
|
||||
}));
|
||||
jest.mock('../../../../graphql/queries/AppQuery');
|
||||
|
||||
mockdate.set(testLegacyAndroidFcmFragment.updatedAt);
|
||||
|
||||
@@ -96,7 +96,7 @@ export async function detectGoogleServiceAccountKeyPathAsync(
|
||||
): Promise<string | null> {
|
||||
const foundFilePaths = await glob('**/*.json', {
|
||||
cwd: projectDir,
|
||||
ignore: ['app.json', 'package*.json', 'tsconfig.json', 'node_modules'],
|
||||
ignore: ['app.json', 'package*.json', 'tsconfig.json', 'node_modules', 'google-services.json'],
|
||||
});
|
||||
|
||||
const googleServiceFiles = foundFilePaths
|
||||
|
||||
@@ -29,7 +29,7 @@ export function displayEmptyAndroidCredentials(appLookupParams: AppLookupParams)
|
||||
function displayAndroidFcmCredentials(appCredentials: CommonAndroidAppCredentialsFragment): void {
|
||||
const maybeFcm = appCredentials.androidFcm;
|
||||
Log.log(
|
||||
formatFields([{ label: 'Push Notifications (FCM)', value: '' }], {
|
||||
formatFields([{ label: 'Push Notifications (FCM Legacy)', value: '' }], {
|
||||
labelFormat: chalk.cyan.bold,
|
||||
})
|
||||
);
|
||||
@@ -60,9 +60,43 @@ function displayGoogleServiceAccountKeyForSubmissions(
|
||||
): void {
|
||||
const maybeGsaKey = appCredentials.googleServiceAccountKeyForSubmissions;
|
||||
Log.log(
|
||||
formatFields([{ label: 'Google Service Account Key For Submissions', value: '' }], {
|
||||
labelFormat: chalk.cyan.bold,
|
||||
})
|
||||
formatFields(
|
||||
[{ label: 'Submissions: Google Service Account Key for Play Store Submissions', value: '' }],
|
||||
{
|
||||
labelFormat: chalk.cyan.bold,
|
||||
}
|
||||
)
|
||||
);
|
||||
if (!maybeGsaKey) {
|
||||
Log.log(formatFields([{ label: '', value: 'None assigned yet' }]));
|
||||
Log.newLine();
|
||||
return;
|
||||
}
|
||||
const { projectIdentifier, privateKeyIdentifier, clientEmail, clientIdentifier, updatedAt } =
|
||||
maybeGsaKey;
|
||||
|
||||
const fields = [
|
||||
{ label: 'Project ID', value: projectIdentifier },
|
||||
{ label: 'Client Email', value: clientEmail },
|
||||
{ label: 'Client ID', value: clientIdentifier },
|
||||
{ label: 'Private Key ID', value: privateKeyIdentifier },
|
||||
{ label: 'Updated', value: `${fromNow(new Date(updatedAt))} ago` },
|
||||
];
|
||||
Log.log(formatFields(fields, { labelFormat: chalk.cyan.bold }));
|
||||
Log.newLine();
|
||||
}
|
||||
|
||||
function displayGoogleServiceAccountKeyForFcmV1(
|
||||
appCredentials: CommonAndroidAppCredentialsFragment
|
||||
): void {
|
||||
const maybeGsaKey = appCredentials.googleServiceAccountKeyForFcmV1;
|
||||
Log.log(
|
||||
formatFields(
|
||||
[{ label: 'Push Notifications (FCM V1): Google Service Account Key For FCM V1', value: '' }],
|
||||
{
|
||||
labelFormat: chalk.cyan.bold,
|
||||
}
|
||||
)
|
||||
);
|
||||
if (!maybeGsaKey) {
|
||||
Log.log(formatFields([{ label: '', value: 'None assigned yet' }]));
|
||||
@@ -87,6 +121,7 @@ function displayEASAndroidAppCredentials(
|
||||
appCredentials: CommonAndroidAppCredentialsFragment
|
||||
): void {
|
||||
displayAndroidFcmCredentials(appCredentials);
|
||||
displayGoogleServiceAccountKeyForFcmV1(appCredentials);
|
||||
displayGoogleServiceAccountKeyForSubmissions(appCredentials);
|
||||
const sortedBuildCredentialsList = sortBuildCredentials(
|
||||
appCredentials.androidAppBuildCredentialsList
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import { AppStoreApiKeyPurpose, provideOrGenerateAscApiKeyAsync } from './AscApiKeyUtils';
|
||||
import { AccountFragment, AppStoreConnectApiKeyFragment } from '../../../graphql/generated';
|
||||
import Log from '../../../log';
|
||||
import { CredentialsContext } from '../../context';
|
||||
|
||||
export class CreateAscApiKey {
|
||||
@@ -15,8 +14,6 @@ export class CreateAscApiKey {
|
||||
}
|
||||
|
||||
const ascApiKey = await provideOrGenerateAscApiKeyAsync(ctx, purpose);
|
||||
const result = await ctx.ios.createAscApiKeyAsync(ctx.graphqlClient, this.account, ascApiKey);
|
||||
Log.succeed('Created App Store Connect API Key');
|
||||
return result;
|
||||
return await ctx.ios.createAscApiKeyAsync(ctx.graphqlClient, this.account, ascApiKey);
|
||||
}
|
||||
}
|
||||
@@ -13,7 +13,9 @@ export enum Scope {
|
||||
export enum AndroidActionType {
|
||||
ManageBuildCredentials,
|
||||
ManageFcm,
|
||||
ManageGoogleServiceAccountKey,
|
||||
ManageGoogleServiceAccountKeyForSubmissions,
|
||||
ManageGoogleServiceAccount,
|
||||
ManageGoogleServiceAccountKeyForFcmV1,
|
||||
ManageCredentialsJson,
|
||||
GoBackToCaller,
|
||||
GoBackToHighLevelActions,
|
||||
@@ -24,9 +26,13 @@ export enum AndroidActionType {
|
||||
CreateFcm,
|
||||
RemoveFcm,
|
||||
CreateGsaKey,
|
||||
UseExistingGsaKey,
|
||||
UseExistingGsaKeyForSubmissions,
|
||||
RemoveGsaKey,
|
||||
SetUpGsaKey,
|
||||
SetUpGsaKeyForSubmissions,
|
||||
CreateGsaKeyForFcmV1,
|
||||
UseExistingGsaKeyForFcmV1,
|
||||
RemoveGsaKeyForFcmV1,
|
||||
SetUpGsaKeyForFcmV1,
|
||||
UpdateCredentialsJson,
|
||||
SetUpBuildCredentialsFromCredentialsJson,
|
||||
}
|
||||
|
||||
@@ -7,13 +7,13 @@ export const highLevelActions: ActionInfo[] = [
|
||||
scope: Scope.Manager,
|
||||
},
|
||||
{
|
||||
value: AndroidActionType.ManageFcm,
|
||||
title: 'Push Notifications: Manage your FCM API Key',
|
||||
value: AndroidActionType.ManageGoogleServiceAccount,
|
||||
title: 'Google Service Account',
|
||||
scope: Scope.Manager,
|
||||
},
|
||||
{
|
||||
value: AndroidActionType.ManageGoogleServiceAccountKey,
|
||||
title: 'Google Service Account: Manage your Service Account Key',
|
||||
value: AndroidActionType.ManageFcm,
|
||||
title: 'Push Notifications (Legacy): Manage your FCM (Legacy) API Key',
|
||||
scope: Scope.Manager,
|
||||
},
|
||||
{
|
||||
@@ -92,22 +92,58 @@ export const fcmActions: ActionInfo[] = [
|
||||
},
|
||||
];
|
||||
|
||||
export const gsaKeyActions: ActionInfo[] = [
|
||||
export const gsaKeyActionsForFcmV1: ActionInfo[] = [
|
||||
{
|
||||
value: AndroidActionType.SetUpGsaKey,
|
||||
title: 'Set up a Google Service Account Key',
|
||||
value: AndroidActionType.SetUpGsaKeyForFcmV1,
|
||||
title: 'Set up a Google Service Account Key for Push Notifications (FCM V1)',
|
||||
scope: Scope.Project,
|
||||
},
|
||||
{
|
||||
value: AndroidActionType.UseExistingGsaKeyForFcmV1,
|
||||
title: 'Select an existing Google Service Account Key for Push Notifications (FCM V1)',
|
||||
scope: Scope.Project,
|
||||
},
|
||||
{
|
||||
value: AndroidActionType.GoBackToHighLevelActions,
|
||||
title: 'Go back',
|
||||
scope: Scope.Manager,
|
||||
},
|
||||
];
|
||||
|
||||
export const gsaKeyActionsForSubmissions: ActionInfo[] = [
|
||||
{
|
||||
value: AndroidActionType.SetUpGsaKeyForSubmissions,
|
||||
title: 'Set up a Google Service Account Key for Play Store Submissions',
|
||||
scope: Scope.Project,
|
||||
},
|
||||
{
|
||||
value: AndroidActionType.UseExistingGsaKeyForSubmissions,
|
||||
title: 'Select an existing Google Service Account Key for Play Store Submissions',
|
||||
scope: Scope.Project,
|
||||
},
|
||||
{
|
||||
value: AndroidActionType.GoBackToHighLevelActions,
|
||||
title: 'Go back',
|
||||
scope: Scope.Manager,
|
||||
},
|
||||
];
|
||||
|
||||
export const gsaActions: ActionInfo[] = [
|
||||
{
|
||||
value: AndroidActionType.ManageGoogleServiceAccountKeyForSubmissions,
|
||||
title: 'Manage your Google Service Account Key for Play Store Submissions',
|
||||
scope: Scope.Manager,
|
||||
},
|
||||
{
|
||||
value: AndroidActionType.ManageGoogleServiceAccountKeyForFcmV1,
|
||||
title: 'Manage your Google Service Account Key for Push Notifications (FCM V1)',
|
||||
scope: Scope.Manager,
|
||||
},
|
||||
{
|
||||
value: AndroidActionType.CreateGsaKey,
|
||||
title: 'Upload a Google Service Account Key',
|
||||
scope: Scope.Project,
|
||||
},
|
||||
{
|
||||
value: AndroidActionType.UseExistingGsaKey,
|
||||
title: 'Use an existing Google Service Account Key',
|
||||
scope: Scope.Project,
|
||||
},
|
||||
{
|
||||
value: AndroidActionType.RemoveGsaKey,
|
||||
title: 'Delete a Google Service Account Key',
|
||||
|
||||
@@ -7,7 +7,9 @@ import {
|
||||
buildCredentialsActions,
|
||||
credentialsJsonActions,
|
||||
fcmActions,
|
||||
gsaKeyActions,
|
||||
gsaActions,
|
||||
gsaKeyActionsForFcmV1,
|
||||
gsaKeyActionsForSubmissions,
|
||||
highLevelActions,
|
||||
} from './AndroidActions';
|
||||
import { CreateAndroidBuildCredentials } from './CreateAndroidBuildCredentials';
|
||||
@@ -19,7 +21,8 @@ import Log, { learnMore } from '../../log';
|
||||
import { GradleBuildContext, resolveGradleBuildContextAsync } from '../../project/android/gradle';
|
||||
import { promptAsync } from '../../prompts';
|
||||
import { AssignFcm } from '../android/actions/AssignFcm';
|
||||
import { AssignGoogleServiceAccountKey } from '../android/actions/AssignGoogleServiceAccountKey';
|
||||
import { AssignGoogleServiceAccountKeyForFcmV1 } from '../android/actions/AssignGoogleServiceAccountKeyForFcmV1';
|
||||
import { AssignGoogleServiceAccountKeyForSubmissions } from '../android/actions/AssignGoogleServiceAccountKeyForSubmissions';
|
||||
import {
|
||||
canCopyLegacyCredentialsAsync,
|
||||
getAppLookupParamsFromContextAsync,
|
||||
@@ -32,7 +35,8 @@ import { RemoveFcm } from '../android/actions/RemoveFcm';
|
||||
import { SelectAndRemoveGoogleServiceAccountKey } from '../android/actions/RemoveGoogleServiceAccountKey';
|
||||
import { RemoveKeystore } from '../android/actions/RemoveKeystore';
|
||||
import { SetUpBuildCredentialsFromCredentialsJson } from '../android/actions/SetUpBuildCredentialsFromCredentialsJson';
|
||||
import { SetUpGoogleServiceAccountKey } from '../android/actions/SetUpGoogleServiceAccountKey';
|
||||
import { SetUpGoogleServiceAccountKeyForFcmV1 } from '../android/actions/SetUpGoogleServiceAccountKeyForFcmV1';
|
||||
import { SetUpGoogleServiceAccountKeyForSubmissions } from '../android/actions/SetUpGoogleServiceAccountKeyForSubmissions';
|
||||
import { UpdateCredentialsJson } from '../android/actions/UpdateCredentialsJson';
|
||||
import { UseExistingGoogleServiceAccountKey } from '../android/actions/UseExistingGoogleServiceAccountKey';
|
||||
import {
|
||||
@@ -120,8 +124,16 @@ export class ManageAndroid {
|
||||
} else if (chosenAction === AndroidActionType.ManageFcm) {
|
||||
currentActions = fcmActions;
|
||||
continue;
|
||||
} else if (chosenAction === AndroidActionType.ManageGoogleServiceAccountKey) {
|
||||
currentActions = gsaKeyActions;
|
||||
} else if (chosenAction === AndroidActionType.ManageGoogleServiceAccount) {
|
||||
currentActions = gsaActions;
|
||||
continue;
|
||||
} else if (
|
||||
chosenAction === AndroidActionType.ManageGoogleServiceAccountKeyForSubmissions
|
||||
) {
|
||||
currentActions = gsaKeyActionsForSubmissions;
|
||||
continue;
|
||||
} else if (chosenAction === AndroidActionType.ManageGoogleServiceAccountKeyForFcmV1) {
|
||||
currentActions = gsaKeyActionsForFcmV1;
|
||||
continue;
|
||||
} else if (chosenAction === AndroidActionType.ManageCredentialsJson) {
|
||||
currentActions = credentialsJsonActions;
|
||||
@@ -193,20 +205,31 @@ export class ManageAndroid {
|
||||
await new AssignFcm(appLookupParams).runAsync(ctx, fcm);
|
||||
} else if (action === AndroidActionType.RemoveFcm) {
|
||||
await new RemoveFcm(appLookupParams).runAsync(ctx);
|
||||
} else if (action === AndroidActionType.CreateGsaKey) {
|
||||
const gsaKey = await new CreateGoogleServiceAccountKey(appLookupParams.account).runAsync(ctx);
|
||||
await new AssignGoogleServiceAccountKey(appLookupParams).runAsync(ctx, gsaKey);
|
||||
} else if (action === AndroidActionType.UseExistingGsaKey) {
|
||||
} else if (action === AndroidActionType.SetUpGsaKeyForSubmissions) {
|
||||
await new SetUpGoogleServiceAccountKeyForSubmissions(appLookupParams).runAsync(ctx);
|
||||
} else if (action === AndroidActionType.UseExistingGsaKeyForSubmissions) {
|
||||
const gsaKey = await new UseExistingGoogleServiceAccountKey(appLookupParams.account).runAsync(
|
||||
ctx
|
||||
);
|
||||
if (gsaKey) {
|
||||
await new AssignGoogleServiceAccountKey(appLookupParams).runAsync(ctx, gsaKey);
|
||||
await new AssignGoogleServiceAccountKeyForSubmissions(appLookupParams).runAsync(
|
||||
ctx,
|
||||
gsaKey
|
||||
);
|
||||
}
|
||||
} else if (action === AndroidActionType.SetUpGsaKeyForFcmV1) {
|
||||
await new SetUpGoogleServiceAccountKeyForFcmV1(appLookupParams).runAsync(ctx);
|
||||
} else if (action === AndroidActionType.UseExistingGsaKeyForFcmV1) {
|
||||
const gsaKey = await new UseExistingGoogleServiceAccountKey(appLookupParams.account).runAsync(
|
||||
ctx
|
||||
);
|
||||
if (gsaKey) {
|
||||
await new AssignGoogleServiceAccountKeyForFcmV1(appLookupParams).runAsync(ctx, gsaKey);
|
||||
}
|
||||
} else if (action === AndroidActionType.CreateGsaKey) {
|
||||
await new CreateGoogleServiceAccountKey(appLookupParams.account).runAsync(ctx);
|
||||
} else if (action === AndroidActionType.RemoveGsaKey) {
|
||||
await new SelectAndRemoveGoogleServiceAccountKey(appLookupParams.account).runAsync(ctx);
|
||||
} else if (action === AndroidActionType.SetUpGsaKey) {
|
||||
await new SetUpGoogleServiceAccountKey(appLookupParams).runAsync(ctx);
|
||||
} else if (action === AndroidActionType.UpdateCredentialsJson) {
|
||||
const buildCredentials = await new SelectExistingAndroidBuildCredentials(
|
||||
appLookupParams
|
||||
|
||||
+55
-14
@@ -759,6 +759,7 @@ export type AndroidAppCredentials = {
|
||||
androidFcm?: Maybe<AndroidFcm>;
|
||||
app: App;
|
||||
applicationIdentifier?: Maybe<Scalars['String']['output']>;
|
||||
googleServiceAccountKeyForFcmV1?: Maybe<GoogleServiceAccountKey>;
|
||||
googleServiceAccountKeyForSubmissions?: Maybe<GoogleServiceAccountKey>;
|
||||
id: Scalars['ID']['output'];
|
||||
isLegacy: Scalars['Boolean']['output'];
|
||||
@@ -771,6 +772,7 @@ export type AndroidAppCredentialsFilter = {
|
||||
|
||||
export type AndroidAppCredentialsInput = {
|
||||
fcmId?: InputMaybe<Scalars['ID']['input']>;
|
||||
googleServiceAccountKeyForFcmV1Id?: InputMaybe<Scalars['ID']['input']>;
|
||||
googleServiceAccountKeyForSubmissionsId?: InputMaybe<Scalars['ID']['input']>;
|
||||
};
|
||||
|
||||
@@ -778,10 +780,17 @@ export type AndroidAppCredentialsMutation = {
|
||||
__typename?: 'AndroidAppCredentialsMutation';
|
||||
/** Create a set of credentials for an Android app */
|
||||
createAndroidAppCredentials: AndroidAppCredentials;
|
||||
/**
|
||||
* Create a GoogleServiceAccountKeyEntity to store credential and
|
||||
* connect it with an edge from AndroidAppCredential
|
||||
*/
|
||||
createFcmV1Credential: AndroidAppCredentials;
|
||||
/** Delete a set of credentials for an Android app */
|
||||
deleteAndroidAppCredentials: DeleteAndroidAppCredentialsResult;
|
||||
/** Set the FCM push key to be used in an Android app */
|
||||
setFcm: AndroidAppCredentials;
|
||||
/** Set the Google Service Account Key to be used for Firebase Cloud Messaging V1 */
|
||||
setGoogleServiceAccountKeyForFcmV1: AndroidAppCredentials;
|
||||
/** Set the Google Service Account Key to be used for submitting an Android app */
|
||||
setGoogleServiceAccountKeyForSubmissions: AndroidAppCredentials;
|
||||
};
|
||||
@@ -794,6 +803,13 @@ export type AndroidAppCredentialsMutationCreateAndroidAppCredentialsArgs = {
|
||||
};
|
||||
|
||||
|
||||
export type AndroidAppCredentialsMutationCreateFcmV1CredentialArgs = {
|
||||
accountId: Scalars['ID']['input'];
|
||||
androidAppCredentialsId: Scalars['String']['input'];
|
||||
credential: Scalars['String']['input'];
|
||||
};
|
||||
|
||||
|
||||
export type AndroidAppCredentialsMutationDeleteAndroidAppCredentialsArgs = {
|
||||
id: Scalars['ID']['input'];
|
||||
};
|
||||
@@ -805,6 +821,12 @@ export type AndroidAppCredentialsMutationSetFcmArgs = {
|
||||
};
|
||||
|
||||
|
||||
export type AndroidAppCredentialsMutationSetGoogleServiceAccountKeyForFcmV1Args = {
|
||||
googleServiceAccountKeyId: Scalars['ID']['input'];
|
||||
id: Scalars['ID']['input'];
|
||||
};
|
||||
|
||||
|
||||
export type AndroidAppCredentialsMutationSetGoogleServiceAccountKeyForSubmissionsArgs = {
|
||||
googleServiceAccountKeyId: Scalars['ID']['input'];
|
||||
id: Scalars['ID']['input'];
|
||||
@@ -2117,6 +2139,7 @@ export type Build = ActivityTimelineProjectActivity & BuildOrBuildJob & {
|
||||
/** @deprecated User type is deprecated */
|
||||
initiatingUser?: Maybe<User>;
|
||||
iosEnterpriseProvisioning?: Maybe<BuildIosEnterpriseProvisioning>;
|
||||
isForIosSimulator: Scalars['Boolean']['output'];
|
||||
isGitWorkingTreeDirty?: Maybe<Scalars['Boolean']['output']>;
|
||||
isWaived: Scalars['Boolean']['output'];
|
||||
logFiles: Array<Scalars['String']['output']>;
|
||||
@@ -2282,6 +2305,7 @@ export type BuildFilter = {
|
||||
platform?: InputMaybe<AppPlatform>;
|
||||
runtimeVersion?: InputMaybe<Scalars['String']['input']>;
|
||||
sdkVersion?: InputMaybe<Scalars['String']['input']>;
|
||||
simulator?: InputMaybe<Scalars['Boolean']['input']>;
|
||||
status?: InputMaybe<BuildStatus>;
|
||||
};
|
||||
|
||||
@@ -2291,6 +2315,7 @@ export type BuildFilterInput = {
|
||||
distributions?: InputMaybe<Array<DistributionType>>;
|
||||
platforms?: InputMaybe<Array<AppPlatform>>;
|
||||
releaseChannel?: InputMaybe<Scalars['String']['input']>;
|
||||
simulator?: InputMaybe<Scalars['Boolean']['input']>;
|
||||
};
|
||||
|
||||
export enum BuildIosEnterpriseProvisioning {
|
||||
@@ -2408,6 +2433,7 @@ export type BuildMetadataInput = {
|
||||
runtimeVersion?: InputMaybe<Scalars['String']['input']>;
|
||||
sdkVersion?: InputMaybe<Scalars['String']['input']>;
|
||||
selectedImage?: InputMaybe<Scalars['String']['input']>;
|
||||
simulator?: InputMaybe<Scalars['Boolean']['input']>;
|
||||
trackingContext?: InputMaybe<Scalars['JSONObject']['input']>;
|
||||
username?: InputMaybe<Scalars['String']['input']>;
|
||||
workflow?: InputMaybe<BuildWorkflow>;
|
||||
@@ -2588,6 +2614,7 @@ export type BuildPublicData = {
|
||||
artifacts: PublicArtifacts;
|
||||
distribution?: Maybe<DistributionType>;
|
||||
id: Scalars['ID']['output'];
|
||||
isForIosSimulator: Scalars['Boolean']['output'];
|
||||
platform: AppPlatform;
|
||||
project: ProjectPublicData;
|
||||
status: BuildStatus;
|
||||
@@ -2791,6 +2818,7 @@ export type CreateGitHubBuildTriggerInput = {
|
||||
platform: AppPlatform;
|
||||
/** A branch or tag name, or a wildcard pattern where the code change originates from. For example, `main` or `release/*`. */
|
||||
sourcePattern: Scalars['String']['input'];
|
||||
submitProfile?: InputMaybe<Scalars['String']['input']>;
|
||||
/** A branch name or a wildcard pattern that the pull request targets. For example, `main` or `release/*`. */
|
||||
targetPattern?: InputMaybe<Scalars['String']['input']>;
|
||||
type: GitHubBuildTriggerType;
|
||||
@@ -3371,6 +3399,7 @@ export type GitHubBuildTrigger = {
|
||||
lastRunStatus?: Maybe<GitHubBuildTriggerRunStatus>;
|
||||
platform: AppPlatform;
|
||||
sourcePattern: Scalars['String']['output'];
|
||||
submitProfile?: Maybe<Scalars['String']['output']>;
|
||||
targetPattern?: Maybe<Scalars['String']['output']>;
|
||||
type: GitHubBuildTriggerType;
|
||||
updatedAt: Scalars['DateTime']['output'];
|
||||
@@ -3939,6 +3968,7 @@ export enum MailchimpAudience {
|
||||
|
||||
export enum MailchimpTag {
|
||||
DevClientUsers = 'DEV_CLIENT_USERS',
|
||||
DidSubscribeToEasAtLeastOnce = 'DID_SUBSCRIBE_TO_EAS_AT_LEAST_ONCE',
|
||||
EasMasterList = 'EAS_MASTER_LIST',
|
||||
NewsletterSignupList = 'NEWSLETTER_SIGNUP_LIST'
|
||||
}
|
||||
@@ -4106,9 +4136,11 @@ export type Notification = {
|
||||
|
||||
export enum NotificationEvent {
|
||||
BuildComplete = 'BUILD_COMPLETE',
|
||||
BuildErrored = 'BUILD_ERRORED',
|
||||
BuildLimitThresholdExceeded = 'BUILD_LIMIT_THRESHOLD_EXCEEDED',
|
||||
BuildPlanCreditThresholdExceeded = 'BUILD_PLAN_CREDIT_THRESHOLD_EXCEEDED',
|
||||
SubmissionComplete = 'SUBMISSION_COMPLETE',
|
||||
SubmissionErrored = 'SUBMISSION_ERRORED',
|
||||
Test = 'TEST'
|
||||
}
|
||||
|
||||
@@ -5334,6 +5366,7 @@ export type UpdateGitHubBuildTriggerInput = {
|
||||
isActive: Scalars['Boolean']['input'];
|
||||
platform: AppPlatform;
|
||||
sourcePattern: Scalars['String']['input'];
|
||||
submitProfile?: InputMaybe<Scalars['String']['input']>;
|
||||
targetPattern?: InputMaybe<Scalars['String']['input']>;
|
||||
type: GitHubBuildTriggerType;
|
||||
};
|
||||
@@ -6110,7 +6143,7 @@ export type CreateAndroidAppCredentialsMutationVariables = Exact<{
|
||||
}>;
|
||||
|
||||
|
||||
export type CreateAndroidAppCredentialsMutation = { __typename?: 'RootMutation', androidAppCredentials: { __typename?: 'AndroidAppCredentialsMutation', createAndroidAppCredentials: { __typename?: 'AndroidAppCredentials', id: string, applicationIdentifier?: string | null, isLegacy: boolean, app: { __typename?: 'App', id: string, fullName: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string, ownerUserActor?: { __typename?: 'SSOUser', id: string, username: string } | { __typename?: 'User', id: string, username: string } | null, users: Array<{ __typename?: 'UserPermission', role: Role, actor: { __typename?: 'Robot', id: string } | { __typename?: 'SSOUser', id: string } | { __typename?: 'User', id: string } }> } }, androidFcm?: { __typename?: 'AndroidFcm', id: string, credential: any, version: AndroidFcmVersion, createdAt: any, updatedAt: any, snippet: { __typename?: 'FcmSnippetLegacy', firstFourCharacters: string, lastFourCharacters: string } | { __typename?: 'FcmSnippetV1', projectId: string, keyId: string, serviceAccountEmail: string, clientId?: string | null } } | null, googleServiceAccountKeyForSubmissions?: { __typename?: 'GoogleServiceAccountKey', id: string, projectIdentifier: string, privateKeyIdentifier: string, clientEmail: string, clientIdentifier: string, createdAt: any, updatedAt: any } | null, androidAppBuildCredentialsList: Array<{ __typename?: 'AndroidAppBuildCredentials', id: string, isDefault: boolean, isLegacy: boolean, name: string, androidKeystore?: { __typename?: 'AndroidKeystore', id: string, type: AndroidKeystoreType, keystore: string, keystorePassword: string, keyAlias: string, keyPassword?: string | null, md5CertificateFingerprint?: string | null, sha1CertificateFingerprint?: string | null, sha256CertificateFingerprint?: string | null, createdAt: any, updatedAt: any } | null }> } } };
|
||||
export type CreateAndroidAppCredentialsMutation = { __typename?: 'RootMutation', androidAppCredentials: { __typename?: 'AndroidAppCredentialsMutation', createAndroidAppCredentials: { __typename?: 'AndroidAppCredentials', id: string, applicationIdentifier?: string | null, isLegacy: boolean, app: { __typename?: 'App', id: string, fullName: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string, ownerUserActor?: { __typename?: 'SSOUser', id: string, username: string } | { __typename?: 'User', id: string, username: string } | null, users: Array<{ __typename?: 'UserPermission', role: Role, actor: { __typename?: 'Robot', id: string } | { __typename?: 'SSOUser', id: string } | { __typename?: 'User', id: string } }> } }, androidFcm?: { __typename?: 'AndroidFcm', id: string, credential: any, version: AndroidFcmVersion, createdAt: any, updatedAt: any, snippet: { __typename?: 'FcmSnippetLegacy', firstFourCharacters: string, lastFourCharacters: string } | { __typename?: 'FcmSnippetV1', projectId: string, keyId: string, serviceAccountEmail: string, clientId?: string | null } } | null, googleServiceAccountKeyForFcmV1?: { __typename?: 'GoogleServiceAccountKey', id: string, projectIdentifier: string, privateKeyIdentifier: string, clientEmail: string, clientIdentifier: string, createdAt: any, updatedAt: any } | null, googleServiceAccountKeyForSubmissions?: { __typename?: 'GoogleServiceAccountKey', id: string, projectIdentifier: string, privateKeyIdentifier: string, clientEmail: string, clientIdentifier: string, createdAt: any, updatedAt: any } | null, androidAppBuildCredentialsList: Array<{ __typename?: 'AndroidAppBuildCredentials', id: string, isDefault: boolean, isLegacy: boolean, name: string, androidKeystore?: { __typename?: 'AndroidKeystore', id: string, type: AndroidKeystoreType, keystore: string, keystorePassword: string, keyAlias: string, keyPassword?: string | null, md5CertificateFingerprint?: string | null, sha1CertificateFingerprint?: string | null, sha256CertificateFingerprint?: string | null, createdAt: any, updatedAt: any } | null }> } } };
|
||||
|
||||
export type SetFcmMutationVariables = Exact<{
|
||||
androidAppCredentialsId: Scalars['ID']['input'];
|
||||
@@ -6118,7 +6151,7 @@ export type SetFcmMutationVariables = Exact<{
|
||||
}>;
|
||||
|
||||
|
||||
export type SetFcmMutation = { __typename?: 'RootMutation', androidAppCredentials: { __typename?: 'AndroidAppCredentialsMutation', setFcm: { __typename?: 'AndroidAppCredentials', id: string, applicationIdentifier?: string | null, isLegacy: boolean, app: { __typename?: 'App', id: string, fullName: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string, ownerUserActor?: { __typename?: 'SSOUser', id: string, username: string } | { __typename?: 'User', id: string, username: string } | null, users: Array<{ __typename?: 'UserPermission', role: Role, actor: { __typename?: 'Robot', id: string } | { __typename?: 'SSOUser', id: string } | { __typename?: 'User', id: string } }> } }, androidFcm?: { __typename?: 'AndroidFcm', id: string, credential: any, version: AndroidFcmVersion, createdAt: any, updatedAt: any, snippet: { __typename?: 'FcmSnippetLegacy', firstFourCharacters: string, lastFourCharacters: string } | { __typename?: 'FcmSnippetV1', projectId: string, keyId: string, serviceAccountEmail: string, clientId?: string | null } } | null, googleServiceAccountKeyForSubmissions?: { __typename?: 'GoogleServiceAccountKey', id: string, projectIdentifier: string, privateKeyIdentifier: string, clientEmail: string, clientIdentifier: string, createdAt: any, updatedAt: any } | null, androidAppBuildCredentialsList: Array<{ __typename?: 'AndroidAppBuildCredentials', id: string, isDefault: boolean, isLegacy: boolean, name: string, androidKeystore?: { __typename?: 'AndroidKeystore', id: string, type: AndroidKeystoreType, keystore: string, keystorePassword: string, keyAlias: string, keyPassword?: string | null, md5CertificateFingerprint?: string | null, sha1CertificateFingerprint?: string | null, sha256CertificateFingerprint?: string | null, createdAt: any, updatedAt: any } | null }> } } };
|
||||
export type SetFcmMutation = { __typename?: 'RootMutation', androidAppCredentials: { __typename?: 'AndroidAppCredentialsMutation', setFcm: { __typename?: 'AndroidAppCredentials', id: string, applicationIdentifier?: string | null, isLegacy: boolean, app: { __typename?: 'App', id: string, fullName: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string, ownerUserActor?: { __typename?: 'SSOUser', id: string, username: string } | { __typename?: 'User', id: string, username: string } | null, users: Array<{ __typename?: 'UserPermission', role: Role, actor: { __typename?: 'Robot', id: string } | { __typename?: 'SSOUser', id: string } | { __typename?: 'User', id: string } }> } }, androidFcm?: { __typename?: 'AndroidFcm', id: string, credential: any, version: AndroidFcmVersion, createdAt: any, updatedAt: any, snippet: { __typename?: 'FcmSnippetLegacy', firstFourCharacters: string, lastFourCharacters: string } | { __typename?: 'FcmSnippetV1', projectId: string, keyId: string, serviceAccountEmail: string, clientId?: string | null } } | null, googleServiceAccountKeyForFcmV1?: { __typename?: 'GoogleServiceAccountKey', id: string, projectIdentifier: string, privateKeyIdentifier: string, clientEmail: string, clientIdentifier: string, createdAt: any, updatedAt: any } | null, googleServiceAccountKeyForSubmissions?: { __typename?: 'GoogleServiceAccountKey', id: string, projectIdentifier: string, privateKeyIdentifier: string, clientEmail: string, clientIdentifier: string, createdAt: any, updatedAt: any } | null, androidAppBuildCredentialsList: Array<{ __typename?: 'AndroidAppBuildCredentials', id: string, isDefault: boolean, isLegacy: boolean, name: string, androidKeystore?: { __typename?: 'AndroidKeystore', id: string, type: AndroidKeystoreType, keystore: string, keystorePassword: string, keyAlias: string, keyPassword?: string | null, md5CertificateFingerprint?: string | null, sha1CertificateFingerprint?: string | null, sha256CertificateFingerprint?: string | null, createdAt: any, updatedAt: any } | null }> } } };
|
||||
|
||||
export type SetGoogleServiceAccountKeyForSubmissionsMutationVariables = Exact<{
|
||||
androidAppCredentialsId: Scalars['ID']['input'];
|
||||
@@ -6126,7 +6159,15 @@ export type SetGoogleServiceAccountKeyForSubmissionsMutationVariables = Exact<{
|
||||
}>;
|
||||
|
||||
|
||||
export type SetGoogleServiceAccountKeyForSubmissionsMutation = { __typename?: 'RootMutation', androidAppCredentials: { __typename?: 'AndroidAppCredentialsMutation', setGoogleServiceAccountKeyForSubmissions: { __typename?: 'AndroidAppCredentials', id: string, applicationIdentifier?: string | null, isLegacy: boolean, app: { __typename?: 'App', id: string, fullName: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string, ownerUserActor?: { __typename?: 'SSOUser', id: string, username: string } | { __typename?: 'User', id: string, username: string } | null, users: Array<{ __typename?: 'UserPermission', role: Role, actor: { __typename?: 'Robot', id: string } | { __typename?: 'SSOUser', id: string } | { __typename?: 'User', id: string } }> } }, androidFcm?: { __typename?: 'AndroidFcm', id: string, credential: any, version: AndroidFcmVersion, createdAt: any, updatedAt: any, snippet: { __typename?: 'FcmSnippetLegacy', firstFourCharacters: string, lastFourCharacters: string } | { __typename?: 'FcmSnippetV1', projectId: string, keyId: string, serviceAccountEmail: string, clientId?: string | null } } | null, googleServiceAccountKeyForSubmissions?: { __typename?: 'GoogleServiceAccountKey', id: string, projectIdentifier: string, privateKeyIdentifier: string, clientEmail: string, clientIdentifier: string, createdAt: any, updatedAt: any } | null, androidAppBuildCredentialsList: Array<{ __typename?: 'AndroidAppBuildCredentials', id: string, isDefault: boolean, isLegacy: boolean, name: string, androidKeystore?: { __typename?: 'AndroidKeystore', id: string, type: AndroidKeystoreType, keystore: string, keystorePassword: string, keyAlias: string, keyPassword?: string | null, md5CertificateFingerprint?: string | null, sha1CertificateFingerprint?: string | null, sha256CertificateFingerprint?: string | null, createdAt: any, updatedAt: any } | null }> } } };
|
||||
export type SetGoogleServiceAccountKeyForSubmissionsMutation = { __typename?: 'RootMutation', androidAppCredentials: { __typename?: 'AndroidAppCredentialsMutation', setGoogleServiceAccountKeyForSubmissions: { __typename?: 'AndroidAppCredentials', id: string, applicationIdentifier?: string | null, isLegacy: boolean, app: { __typename?: 'App', id: string, fullName: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string, ownerUserActor?: { __typename?: 'SSOUser', id: string, username: string } | { __typename?: 'User', id: string, username: string } | null, users: Array<{ __typename?: 'UserPermission', role: Role, actor: { __typename?: 'Robot', id: string } | { __typename?: 'SSOUser', id: string } | { __typename?: 'User', id: string } }> } }, androidFcm?: { __typename?: 'AndroidFcm', id: string, credential: any, version: AndroidFcmVersion, createdAt: any, updatedAt: any, snippet: { __typename?: 'FcmSnippetLegacy', firstFourCharacters: string, lastFourCharacters: string } | { __typename?: 'FcmSnippetV1', projectId: string, keyId: string, serviceAccountEmail: string, clientId?: string | null } } | null, googleServiceAccountKeyForFcmV1?: { __typename?: 'GoogleServiceAccountKey', id: string, projectIdentifier: string, privateKeyIdentifier: string, clientEmail: string, clientIdentifier: string, createdAt: any, updatedAt: any } | null, googleServiceAccountKeyForSubmissions?: { __typename?: 'GoogleServiceAccountKey', id: string, projectIdentifier: string, privateKeyIdentifier: string, clientEmail: string, clientIdentifier: string, createdAt: any, updatedAt: any } | null, androidAppBuildCredentialsList: Array<{ __typename?: 'AndroidAppBuildCredentials', id: string, isDefault: boolean, isLegacy: boolean, name: string, androidKeystore?: { __typename?: 'AndroidKeystore', id: string, type: AndroidKeystoreType, keystore: string, keystorePassword: string, keyAlias: string, keyPassword?: string | null, md5CertificateFingerprint?: string | null, sha1CertificateFingerprint?: string | null, sha256CertificateFingerprint?: string | null, createdAt: any, updatedAt: any } | null }> } } };
|
||||
|
||||
export type SetGoogleServiceAccountKeyForFcmV1MutationVariables = Exact<{
|
||||
androidAppCredentialsId: Scalars['ID']['input'];
|
||||
googleServiceAccountKeyId: Scalars['ID']['input'];
|
||||
}>;
|
||||
|
||||
|
||||
export type SetGoogleServiceAccountKeyForFcmV1Mutation = { __typename?: 'RootMutation', androidAppCredentials: { __typename?: 'AndroidAppCredentialsMutation', setGoogleServiceAccountKeyForFcmV1: { __typename?: 'AndroidAppCredentials', id: string, applicationIdentifier?: string | null, isLegacy: boolean, app: { __typename?: 'App', id: string, fullName: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string, ownerUserActor?: { __typename?: 'SSOUser', id: string, username: string } | { __typename?: 'User', id: string, username: string } | null, users: Array<{ __typename?: 'UserPermission', role: Role, actor: { __typename?: 'Robot', id: string } | { __typename?: 'SSOUser', id: string } | { __typename?: 'User', id: string } }> } }, androidFcm?: { __typename?: 'AndroidFcm', id: string, credential: any, version: AndroidFcmVersion, createdAt: any, updatedAt: any, snippet: { __typename?: 'FcmSnippetLegacy', firstFourCharacters: string, lastFourCharacters: string } | { __typename?: 'FcmSnippetV1', projectId: string, keyId: string, serviceAccountEmail: string, clientId?: string | null } } | null, googleServiceAccountKeyForFcmV1?: { __typename?: 'GoogleServiceAccountKey', id: string, projectIdentifier: string, privateKeyIdentifier: string, clientEmail: string, clientIdentifier: string, createdAt: any, updatedAt: any } | null, googleServiceAccountKeyForSubmissions?: { __typename?: 'GoogleServiceAccountKey', id: string, projectIdentifier: string, privateKeyIdentifier: string, clientEmail: string, clientIdentifier: string, createdAt: any, updatedAt: any } | null, androidAppBuildCredentialsList: Array<{ __typename?: 'AndroidAppBuildCredentials', id: string, isDefault: boolean, isLegacy: boolean, name: string, androidKeystore?: { __typename?: 'AndroidKeystore', id: string, type: AndroidKeystoreType, keystore: string, keystorePassword: string, keyAlias: string, keyPassword?: string | null, md5CertificateFingerprint?: string | null, sha1CertificateFingerprint?: string | null, sha256CertificateFingerprint?: string | null, createdAt: any, updatedAt: any } | null }> } } };
|
||||
|
||||
export type CreateAndroidFcmMutationVariables = Exact<{
|
||||
androidFcmInput: AndroidFcmInput;
|
||||
@@ -6180,7 +6221,7 @@ export type CommonAndroidAppCredentialsWithBuildCredentialsByApplicationIdentifi
|
||||
}>;
|
||||
|
||||
|
||||
export type CommonAndroidAppCredentialsWithBuildCredentialsByApplicationIdentifierQuery = { __typename?: 'RootQuery', app: { __typename?: 'AppQuery', byFullName: { __typename?: 'App', id: string, androidAppCredentials: Array<{ __typename?: 'AndroidAppCredentials', id: string, applicationIdentifier?: string | null, isLegacy: boolean, app: { __typename?: 'App', id: string, fullName: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string, ownerUserActor?: { __typename?: 'SSOUser', id: string, username: string } | { __typename?: 'User', id: string, username: string } | null, users: Array<{ __typename?: 'UserPermission', role: Role, actor: { __typename?: 'Robot', id: string } | { __typename?: 'SSOUser', id: string } | { __typename?: 'User', id: string } }> } }, androidFcm?: { __typename?: 'AndroidFcm', id: string, credential: any, version: AndroidFcmVersion, createdAt: any, updatedAt: any, snippet: { __typename?: 'FcmSnippetLegacy', firstFourCharacters: string, lastFourCharacters: string } | { __typename?: 'FcmSnippetV1', projectId: string, keyId: string, serviceAccountEmail: string, clientId?: string | null } } | null, googleServiceAccountKeyForSubmissions?: { __typename?: 'GoogleServiceAccountKey', id: string, projectIdentifier: string, privateKeyIdentifier: string, clientEmail: string, clientIdentifier: string, createdAt: any, updatedAt: any } | null, androidAppBuildCredentialsList: Array<{ __typename?: 'AndroidAppBuildCredentials', id: string, isDefault: boolean, isLegacy: boolean, name: string, androidKeystore?: { __typename?: 'AndroidKeystore', id: string, type: AndroidKeystoreType, keystore: string, keystorePassword: string, keyAlias: string, keyPassword?: string | null, md5CertificateFingerprint?: string | null, sha1CertificateFingerprint?: string | null, sha256CertificateFingerprint?: string | null, createdAt: any, updatedAt: any } | null }> }> } } };
|
||||
export type CommonAndroidAppCredentialsWithBuildCredentialsByApplicationIdentifierQuery = { __typename?: 'RootQuery', app: { __typename?: 'AppQuery', byFullName: { __typename?: 'App', id: string, androidAppCredentials: Array<{ __typename?: 'AndroidAppCredentials', id: string, applicationIdentifier?: string | null, isLegacy: boolean, app: { __typename?: 'App', id: string, fullName: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string, ownerUserActor?: { __typename?: 'SSOUser', id: string, username: string } | { __typename?: 'User', id: string, username: string } | null, users: Array<{ __typename?: 'UserPermission', role: Role, actor: { __typename?: 'Robot', id: string } | { __typename?: 'SSOUser', id: string } | { __typename?: 'User', id: string } }> } }, androidFcm?: { __typename?: 'AndroidFcm', id: string, credential: any, version: AndroidFcmVersion, createdAt: any, updatedAt: any, snippet: { __typename?: 'FcmSnippetLegacy', firstFourCharacters: string, lastFourCharacters: string } | { __typename?: 'FcmSnippetV1', projectId: string, keyId: string, serviceAccountEmail: string, clientId?: string | null } } | null, googleServiceAccountKeyForFcmV1?: { __typename?: 'GoogleServiceAccountKey', id: string, projectIdentifier: string, privateKeyIdentifier: string, clientEmail: string, clientIdentifier: string, createdAt: any, updatedAt: any } | null, googleServiceAccountKeyForSubmissions?: { __typename?: 'GoogleServiceAccountKey', id: string, projectIdentifier: string, privateKeyIdentifier: string, clientEmail: string, clientIdentifier: string, createdAt: any, updatedAt: any } | null, androidAppBuildCredentialsList: Array<{ __typename?: 'AndroidAppBuildCredentials', id: string, isDefault: boolean, isLegacy: boolean, name: string, androidKeystore?: { __typename?: 'AndroidKeystore', id: string, type: AndroidKeystoreType, keystore: string, keystorePassword: string, keyAlias: string, keyPassword?: string | null, md5CertificateFingerprint?: string | null, sha1CertificateFingerprint?: string | null, sha256CertificateFingerprint?: string | null, createdAt: any, updatedAt: any } | null }> }> } } };
|
||||
|
||||
export type GoogleServiceAccountKeyByAccountQueryVariables = Exact<{
|
||||
accountName: Scalars['String']['input'];
|
||||
@@ -6492,7 +6533,7 @@ export type CreateAndroidBuildMutationVariables = Exact<{
|
||||
}>;
|
||||
|
||||
|
||||
export type CreateAndroidBuildMutation = { __typename?: 'RootMutation', build: { __typename?: 'BuildMutation', createAndroidBuild: { __typename?: 'CreateBuildResult', build: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, releaseChannel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, resourceClass: BuildResourceClass, expirationDate?: any | null, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } }, deprecationInfo?: { __typename?: 'EASBuildDeprecationInfo', type: EasBuildDeprecationInfoType, message: string } | null } } };
|
||||
export type CreateAndroidBuildMutation = { __typename?: 'RootMutation', build: { __typename?: 'BuildMutation', createAndroidBuild: { __typename?: 'CreateBuildResult', build: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, releaseChannel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, resourceClass: BuildResourceClass, expirationDate?: any | null, isForIosSimulator: boolean, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } }, deprecationInfo?: { __typename?: 'EASBuildDeprecationInfo', type: EasBuildDeprecationInfoType, message: string } | null } } };
|
||||
|
||||
export type CreateIosBuildMutationVariables = Exact<{
|
||||
appId: Scalars['ID']['input'];
|
||||
@@ -6502,7 +6543,7 @@ export type CreateIosBuildMutationVariables = Exact<{
|
||||
}>;
|
||||
|
||||
|
||||
export type CreateIosBuildMutation = { __typename?: 'RootMutation', build: { __typename?: 'BuildMutation', createIosBuild: { __typename?: 'CreateBuildResult', build: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, releaseChannel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, resourceClass: BuildResourceClass, expirationDate?: any | null, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } }, deprecationInfo?: { __typename?: 'EASBuildDeprecationInfo', type: EasBuildDeprecationInfoType, message: string } | null } } };
|
||||
export type CreateIosBuildMutation = { __typename?: 'RootMutation', build: { __typename?: 'BuildMutation', createIosBuild: { __typename?: 'CreateBuildResult', build: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, releaseChannel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, resourceClass: BuildResourceClass, expirationDate?: any | null, isForIosSimulator: boolean, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } }, deprecationInfo?: { __typename?: 'EASBuildDeprecationInfo', type: EasBuildDeprecationInfoType, message: string } | null } } };
|
||||
|
||||
export type UpdateBuildMetadataMutationVariables = Exact<{
|
||||
buildId: Scalars['ID']['input'];
|
||||
@@ -6510,7 +6551,7 @@ export type UpdateBuildMetadataMutationVariables = Exact<{
|
||||
}>;
|
||||
|
||||
|
||||
export type UpdateBuildMetadataMutation = { __typename?: 'RootMutation', build: { __typename?: 'BuildMutation', updateBuildMetadata: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, releaseChannel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, resourceClass: BuildResourceClass, expirationDate?: any | null, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } } } };
|
||||
export type UpdateBuildMetadataMutation = { __typename?: 'RootMutation', build: { __typename?: 'BuildMutation', updateBuildMetadata: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, releaseChannel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, resourceClass: BuildResourceClass, expirationDate?: any | null, isForIosSimulator: boolean, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } } } };
|
||||
|
||||
export type RetryIosBuildMutationVariables = Exact<{
|
||||
buildId: Scalars['ID']['input'];
|
||||
@@ -6518,7 +6559,7 @@ export type RetryIosBuildMutationVariables = Exact<{
|
||||
}>;
|
||||
|
||||
|
||||
export type RetryIosBuildMutation = { __typename?: 'RootMutation', build: { __typename?: 'BuildMutation', retryIosBuild: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, releaseChannel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, resourceClass: BuildResourceClass, expirationDate?: any | null, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } } } };
|
||||
export type RetryIosBuildMutation = { __typename?: 'RootMutation', build: { __typename?: 'BuildMutation', retryIosBuild: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, releaseChannel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, resourceClass: BuildResourceClass, expirationDate?: any | null, isForIosSimulator: boolean, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } } } };
|
||||
|
||||
export type CreateEnvironmentSecretForAccountMutationVariables = Exact<{
|
||||
input: CreateEnvironmentSecretInput;
|
||||
@@ -6686,14 +6727,14 @@ export type BuildsByIdQueryVariables = Exact<{
|
||||
}>;
|
||||
|
||||
|
||||
export type BuildsByIdQuery = { __typename?: 'RootQuery', builds: { __typename?: 'BuildQuery', byId: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, releaseChannel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, resourceClass: BuildResourceClass, expirationDate?: any | null, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } } } };
|
||||
export type BuildsByIdQuery = { __typename?: 'RootQuery', builds: { __typename?: 'BuildQuery', byId: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, releaseChannel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, resourceClass: BuildResourceClass, expirationDate?: any | null, isForIosSimulator: boolean, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } } } };
|
||||
|
||||
export type BuildsWithSubmissionsByIdQueryVariables = Exact<{
|
||||
buildId: Scalars['ID']['input'];
|
||||
}>;
|
||||
|
||||
|
||||
export type BuildsWithSubmissionsByIdQuery = { __typename?: 'RootQuery', builds: { __typename?: 'BuildQuery', byId: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, releaseChannel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, resourceClass: BuildResourceClass, expirationDate?: any | null, submissions: Array<{ __typename?: 'Submission', id: string, status: SubmissionStatus, platform: AppPlatform, logsUrl?: string | null, app: { __typename?: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } }, androidConfig?: { __typename?: 'AndroidSubmissionConfig', applicationIdentifier?: string | null, track: SubmissionAndroidTrack, releaseStatus?: SubmissionAndroidReleaseStatus | null, rollout?: number | null } | null, iosConfig?: { __typename?: 'IosSubmissionConfig', ascAppIdentifier: string, appleIdUsername?: string | null } | null, error?: { __typename?: 'SubmissionError', errorCode?: string | null, message?: string | null } | null }>, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } } } };
|
||||
export type BuildsWithSubmissionsByIdQuery = { __typename?: 'RootQuery', builds: { __typename?: 'BuildQuery', byId: { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, releaseChannel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, resourceClass: BuildResourceClass, expirationDate?: any | null, isForIosSimulator: boolean, submissions: Array<{ __typename?: 'Submission', id: string, status: SubmissionStatus, platform: AppPlatform, logsUrl?: string | null, app: { __typename?: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } }, androidConfig?: { __typename?: 'AndroidSubmissionConfig', applicationIdentifier?: string | null, track: SubmissionAndroidTrack, releaseStatus?: SubmissionAndroidReleaseStatus | null, rollout?: number | null } | null, iosConfig?: { __typename?: 'IosSubmissionConfig', ascAppIdentifier: string, appleIdUsername?: string | null } | null, error?: { __typename?: 'SubmissionError', errorCode?: string | null, message?: string | null } | null }>, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } } } };
|
||||
|
||||
export type ViewBuildsOnAppQueryVariables = Exact<{
|
||||
appId: Scalars['String']['input'];
|
||||
@@ -6703,7 +6744,7 @@ export type ViewBuildsOnAppQueryVariables = Exact<{
|
||||
}>;
|
||||
|
||||
|
||||
export type ViewBuildsOnAppQuery = { __typename?: 'RootQuery', app: { __typename?: 'AppQuery', byId: { __typename?: 'App', id: string, builds: Array<{ __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, releaseChannel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, resourceClass: BuildResourceClass, expirationDate?: any | null, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } }> } } };
|
||||
export type ViewBuildsOnAppQuery = { __typename?: 'RootQuery', app: { __typename?: 'AppQuery', byId: { __typename?: 'App', id: string, builds: Array<{ __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, releaseChannel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, resourceClass: BuildResourceClass, expirationDate?: any | null, isForIosSimulator: boolean, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } }> } } };
|
||||
|
||||
export type ViewUpdateChannelOnAppQueryVariables = Exact<{
|
||||
appId: Scalars['String']['input'];
|
||||
@@ -6845,9 +6886,9 @@ export type AccountFragment = { __typename?: 'Account', id: string, name: string
|
||||
|
||||
export type AppFragment = { __typename?: 'App', id: string, fullName: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string, ownerUserActor?: { __typename?: 'SSOUser', id: string, username: string } | { __typename?: 'User', id: string, username: string } | null, users: Array<{ __typename?: 'UserPermission', role: Role, actor: { __typename?: 'Robot', id: string } | { __typename?: 'SSOUser', id: string } | { __typename?: 'User', id: string } }> } };
|
||||
|
||||
export type BuildFragment = { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, releaseChannel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, resourceClass: BuildResourceClass, expirationDate?: any | null, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } };
|
||||
export type BuildFragment = { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, releaseChannel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, resourceClass: BuildResourceClass, expirationDate?: any | null, isForIosSimulator: boolean, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } };
|
||||
|
||||
export type BuildWithSubmissionsFragment = { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, releaseChannel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, resourceClass: BuildResourceClass, expirationDate?: any | null, submissions: Array<{ __typename?: 'Submission', id: string, status: SubmissionStatus, platform: AppPlatform, logsUrl?: string | null, app: { __typename?: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } }, androidConfig?: { __typename?: 'AndroidSubmissionConfig', applicationIdentifier?: string | null, track: SubmissionAndroidTrack, releaseStatus?: SubmissionAndroidReleaseStatus | null, rollout?: number | null } | null, iosConfig?: { __typename?: 'IosSubmissionConfig', ascAppIdentifier: string, appleIdUsername?: string | null } | null, error?: { __typename?: 'SubmissionError', errorCode?: string | null, message?: string | null } | null }>, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } };
|
||||
export type BuildWithSubmissionsFragment = { __typename?: 'Build', id: string, status: BuildStatus, platform: AppPlatform, channel?: string | null, releaseChannel?: string | null, distribution?: DistributionType | null, iosEnterpriseProvisioning?: BuildIosEnterpriseProvisioning | null, buildProfile?: string | null, sdkVersion?: string | null, appVersion?: string | null, appBuildVersion?: string | null, runtimeVersion?: string | null, gitCommitHash?: string | null, gitCommitMessage?: string | null, initialQueuePosition?: number | null, queuePosition?: number | null, estimatedWaitTimeLeftSeconds?: number | null, priority: BuildPriority, createdAt: any, updatedAt: any, message?: string | null, completedAt?: any | null, resourceClass: BuildResourceClass, expirationDate?: any | null, isForIosSimulator: boolean, submissions: Array<{ __typename?: 'Submission', id: string, status: SubmissionStatus, platform: AppPlatform, logsUrl?: string | null, app: { __typename?: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } }, androidConfig?: { __typename?: 'AndroidSubmissionConfig', applicationIdentifier?: string | null, track: SubmissionAndroidTrack, releaseStatus?: SubmissionAndroidReleaseStatus | null, rollout?: number | null } | null, iosConfig?: { __typename?: 'IosSubmissionConfig', ascAppIdentifier: string, appleIdUsername?: string | null } | null, error?: { __typename?: 'SubmissionError', errorCode?: string | null, message?: string | null } | null }>, error?: { __typename?: 'BuildError', errorCode: string, message: string, docsUrl?: string | null } | null, artifacts?: { __typename?: 'BuildArtifacts', buildUrl?: string | null, xcodeBuildLogsUrl?: string | null, applicationArchiveUrl?: string | null, buildArtifactsUrl?: string | null } | null, initiatingActor?: { __typename: 'Robot', id: string, displayName: string } | { __typename: 'SSOUser', id: string, displayName: string } | { __typename: 'User', id: string, displayName: string } | null, project: { __typename: 'App', id: string, name: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string } } | { __typename: 'Snack', id: string, name: string, slug: string } };
|
||||
|
||||
export type EnvironmentSecretFragment = { __typename?: 'EnvironmentSecret', id: string, name: string, type: EnvironmentSecretType, createdAt: any };
|
||||
|
||||
@@ -6869,7 +6910,7 @@ export type WebhookFragment = { __typename?: 'Webhook', id: string, event: Webho
|
||||
|
||||
export type AndroidAppBuildCredentialsFragment = { __typename?: 'AndroidAppBuildCredentials', id: string, isDefault: boolean, isLegacy: boolean, name: string, androidKeystore?: { __typename?: 'AndroidKeystore', id: string, type: AndroidKeystoreType, keystore: string, keystorePassword: string, keyAlias: string, keyPassword?: string | null, md5CertificateFingerprint?: string | null, sha1CertificateFingerprint?: string | null, sha256CertificateFingerprint?: string | null, createdAt: any, updatedAt: any } | null };
|
||||
|
||||
export type CommonAndroidAppCredentialsFragment = { __typename?: 'AndroidAppCredentials', id: string, applicationIdentifier?: string | null, isLegacy: boolean, app: { __typename?: 'App', id: string, fullName: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string, ownerUserActor?: { __typename?: 'SSOUser', id: string, username: string } | { __typename?: 'User', id: string, username: string } | null, users: Array<{ __typename?: 'UserPermission', role: Role, actor: { __typename?: 'Robot', id: string } | { __typename?: 'SSOUser', id: string } | { __typename?: 'User', id: string } }> } }, androidFcm?: { __typename?: 'AndroidFcm', id: string, credential: any, version: AndroidFcmVersion, createdAt: any, updatedAt: any, snippet: { __typename?: 'FcmSnippetLegacy', firstFourCharacters: string, lastFourCharacters: string } | { __typename?: 'FcmSnippetV1', projectId: string, keyId: string, serviceAccountEmail: string, clientId?: string | null } } | null, googleServiceAccountKeyForSubmissions?: { __typename?: 'GoogleServiceAccountKey', id: string, projectIdentifier: string, privateKeyIdentifier: string, clientEmail: string, clientIdentifier: string, createdAt: any, updatedAt: any } | null, androidAppBuildCredentialsList: Array<{ __typename?: 'AndroidAppBuildCredentials', id: string, isDefault: boolean, isLegacy: boolean, name: string, androidKeystore?: { __typename?: 'AndroidKeystore', id: string, type: AndroidKeystoreType, keystore: string, keystorePassword: string, keyAlias: string, keyPassword?: string | null, md5CertificateFingerprint?: string | null, sha1CertificateFingerprint?: string | null, sha256CertificateFingerprint?: string | null, createdAt: any, updatedAt: any } | null }> };
|
||||
export type CommonAndroidAppCredentialsFragment = { __typename?: 'AndroidAppCredentials', id: string, applicationIdentifier?: string | null, isLegacy: boolean, app: { __typename?: 'App', id: string, fullName: string, slug: string, ownerAccount: { __typename?: 'Account', id: string, name: string, ownerUserActor?: { __typename?: 'SSOUser', id: string, username: string } | { __typename?: 'User', id: string, username: string } | null, users: Array<{ __typename?: 'UserPermission', role: Role, actor: { __typename?: 'Robot', id: string } | { __typename?: 'SSOUser', id: string } | { __typename?: 'User', id: string } }> } }, androidFcm?: { __typename?: 'AndroidFcm', id: string, credential: any, version: AndroidFcmVersion, createdAt: any, updatedAt: any, snippet: { __typename?: 'FcmSnippetLegacy', firstFourCharacters: string, lastFourCharacters: string } | { __typename?: 'FcmSnippetV1', projectId: string, keyId: string, serviceAccountEmail: string, clientId?: string | null } } | null, googleServiceAccountKeyForFcmV1?: { __typename?: 'GoogleServiceAccountKey', id: string, projectIdentifier: string, privateKeyIdentifier: string, clientEmail: string, clientIdentifier: string, createdAt: any, updatedAt: any } | null, googleServiceAccountKeyForSubmissions?: { __typename?: 'GoogleServiceAccountKey', id: string, projectIdentifier: string, privateKeyIdentifier: string, clientEmail: string, clientIdentifier: string, createdAt: any, updatedAt: any } | null, androidAppBuildCredentialsList: Array<{ __typename?: 'AndroidAppBuildCredentials', id: string, isDefault: boolean, isLegacy: boolean, name: string, androidKeystore?: { __typename?: 'AndroidKeystore', id: string, type: AndroidKeystoreType, keystore: string, keystorePassword: string, keyAlias: string, keyPassword?: string | null, md5CertificateFingerprint?: string | null, sha1CertificateFingerprint?: string | null, sha256CertificateFingerprint?: string | null, createdAt: any, updatedAt: any } | null }> };
|
||||
|
||||
export type AndroidFcmFragment = { __typename?: 'AndroidFcm', id: string, credential: any, version: AndroidFcmVersion, createdAt: any, updatedAt: any, snippet: { __typename?: 'FcmSnippetLegacy', firstFourCharacters: string, lastFourCharacters: string } | { __typename?: 'FcmSnippetV1', projectId: string, keyId: string, serviceAccountEmail: string, clientId?: string | null } };
|
||||
|
||||
|
||||
@@ -57,6 +57,7 @@ export const BuildFragmentNode = gql`
|
||||
completedAt
|
||||
resourceClass
|
||||
expirationDate
|
||||
isForIosSimulator
|
||||
}
|
||||
`;
|
||||
|
||||
|
||||
@@ -18,6 +18,10 @@ export const CommonAndroidAppCredentialsFragmentNode = gql`
|
||||
id
|
||||
...AndroidFcmFragment
|
||||
}
|
||||
googleServiceAccountKeyForFcmV1 {
|
||||
id
|
||||
...GoogleServiceAccountKeyFragment
|
||||
}
|
||||
googleServiceAccountKeyForSubmissions {
|
||||
id
|
||||
...GoogleServiceAccountKeyFragment
|
||||
|
||||
@@ -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
|
||||
@@ -41,7 +45,7 @@ export async function validateCustomBuildConfigAsync({
|
||||
|
||||
try {
|
||||
const config = await readAndValidateBuildConfigAsync(configPath, {
|
||||
skipNamespacedFunctionsCheck: true,
|
||||
skipNamespacedFunctionsOrFunctionGroupsCheck: true,
|
||||
});
|
||||
return {
|
||||
workflowName: config.build.name,
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 ??
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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';
|
||||
@@ -185,14 +185,12 @@ export async function buildBundlesAsync({
|
||||
exp,
|
||||
platformFlag,
|
||||
clearCache,
|
||||
dev = false,
|
||||
}: {
|
||||
projectDir: string;
|
||||
inputDir: string;
|
||||
exp: Pick<ExpoConfig, 'sdkVersion' | 'web'>;
|
||||
platformFlag: ExpoCLIExportPlatformFlag;
|
||||
clearCache?: boolean;
|
||||
dev?: boolean;
|
||||
}): Promise<void> {
|
||||
const packageJSON = JsonFile.read(path.resolve(projectDir, 'package.json'));
|
||||
if (!packageJSON) {
|
||||
@@ -210,7 +208,6 @@ export async function buildBundlesAsync({
|
||||
'--dump-sourcemap',
|
||||
'--dump-assetmap',
|
||||
`--platform=${platformFlag}`,
|
||||
...(dev ? ['--dev'] : []),
|
||||
...(clearCache ? ['--clear'] : []),
|
||||
]);
|
||||
}
|
||||
@@ -230,7 +227,6 @@ export async function buildBundlesAsync({
|
||||
'--dump-sourcemap',
|
||||
'--dump-assetmap',
|
||||
...platformArgs,
|
||||
...(dev ? ['--dev'] : []),
|
||||
...(clearCache ? ['--clear'] : []),
|
||||
]);
|
||||
}
|
||||
@@ -252,7 +248,6 @@ export async function buildBundlesAsync({
|
||||
'--dump-sourcemap',
|
||||
'--dump-assetmap',
|
||||
`--platform=${platformFlag}`,
|
||||
...(dev ? ['--dev'] : []),
|
||||
...(clearCache ? ['--clear'] : []),
|
||||
]);
|
||||
}
|
||||
@@ -680,47 +675,123 @@ export function getRequestedPlatform(
|
||||
}
|
||||
|
||||
/** Get runtime versions grouped by platform. Runtime version is always `null` on web where the platform is always backwards compatible. */
|
||||
export async function getRuntimeVersionObjectAsync(
|
||||
exp: ExpoConfig,
|
||||
platforms: Platform[],
|
||||
projectDir: string,
|
||||
vcsClient: Client
|
||||
): Promise<{ platform: string; runtimeVersion: string }[]> {
|
||||
export async function getRuntimeVersionObjectAsync({
|
||||
exp,
|
||||
platforms,
|
||||
projectDir,
|
||||
vcsClient,
|
||||
nonInteractive,
|
||||
}: {
|
||||
exp: ExpoConfig;
|
||||
platforms: Platform[];
|
||||
projectDir: string;
|
||||
vcsClient: Client;
|
||||
nonInteractive: boolean;
|
||||
}): Promise<{ platform: string; runtimeVersion: string }[]> {
|
||||
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) {
|
||||
if (platform === 'web') {
|
||||
continue;
|
||||
}
|
||||
const isPolicy = typeof (exp[platform]?.runtimeVersion ?? exp.runtimeVersion) === 'object';
|
||||
if (isPolicy) {
|
||||
const isManaged =
|
||||
(await resolveWorkflowAsync(projectDir, platform as EASBuildJobPlatform, vcsClient)) ===
|
||||
Workflow.MANAGED;
|
||||
if (!isManaged) {
|
||||
throw new Error(
|
||||
`You're currently using the bare workflow, where runtime version policies are not supported. You must set your runtime version manually. For example, define your runtime version as "1.0.0", not {"policy": "appVersion"} in your app config. ${learnMore(
|
||||
'https://docs.expo.dev/eas-update/runtime-versions'
|
||||
)}`
|
||||
);
|
||||
runtimeVersionObjects.push({
|
||||
platform,
|
||||
runtimeVersion: await getRuntimeVersionForPlatformAsync({
|
||||
exp,
|
||||
platform,
|
||||
projectDir,
|
||||
vcsClient,
|
||||
nonInteractive,
|
||||
}),
|
||||
});
|
||||
}
|
||||
|
||||
return runtimeVersionObjects;
|
||||
}
|
||||
|
||||
async function getRuntimeVersionForPlatformAsync({
|
||||
exp,
|
||||
platform,
|
||||
projectDir,
|
||||
vcsClient,
|
||||
nonInteractive,
|
||||
}: {
|
||||
exp: ExpoConfig;
|
||||
platform: Platform;
|
||||
projectDir: string;
|
||||
vcsClient: Client;
|
||||
nonInteractive: boolean;
|
||||
}): Promise<string> {
|
||||
if (platform === 'web') {
|
||||
return 'UNVERSIONED';
|
||||
}
|
||||
|
||||
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') {
|
||||
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,
|
||||
{ useEASIgnoreIfAvailableWhenEvaluatingFileIgnores: true }
|
||||
);
|
||||
if (workflow !== Workflow.MANAGED) {
|
||||
throw new Error(
|
||||
`You're currently using the bare workflow, where runtime version policies are not supported. You must set your runtime version manually. For example, define your runtime version as "1.0.0", not {"policy": "appVersion"} in your app config. ${learnMore(
|
||||
'https://docs.expo.dev/eas-update/runtime-versions'
|
||||
)}`
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return await Promise.all(
|
||||
[...new Set(platforms)].map(async platform => {
|
||||
if (platform === 'web') {
|
||||
return { platform: 'web', runtimeVersion: 'UNVERSIONED' };
|
||||
}
|
||||
return {
|
||||
platform,
|
||||
runtimeVersion: nullthrows(
|
||||
await Updates.getRuntimeVersionAsync(projectDir, exp, platform),
|
||||
`Unable to determine runtime version for ${
|
||||
requestedPlatformDisplayNames[platform]
|
||||
}. ${learnMore('https://docs.expo.dev/eas-update/runtime-versions/')}`
|
||||
),
|
||||
};
|
||||
})
|
||||
);
|
||||
const resolvedRuntimeVersion = await Updates.getRuntimeVersionAsync(projectDir, exp, platform);
|
||||
if (!resolvedRuntimeVersion) {
|
||||
throw new Error(
|
||||
`Unable to determine runtime version for ${
|
||||
requestedPlatformDisplayNames[platform]
|
||||
}. ${learnMore('https://docs.expo.dev/eas-update/runtime-versions/')}`
|
||||
);
|
||||
}
|
||||
|
||||
return resolvedRuntimeVersion;
|
||||
}
|
||||
|
||||
export function getRuntimeToPlatformMappingFromRuntimeVersions(
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { AppPlatform, BuildFragment, BuildStatus, DistributionType } from '../graphql/generated';
|
||||
import { AppPlatform, BuildFragment, BuildStatus } from '../graphql/generated';
|
||||
|
||||
function isAab(build: BuildFragment): boolean {
|
||||
return build.artifacts?.applicationArchiveUrl?.endsWith('.aab') ?? false;
|
||||
@@ -12,7 +12,7 @@ export function isRunnableOnSimulatorOrEmulator(build: BuildFragment): boolean {
|
||||
return (
|
||||
build.status === BuildStatus.Finished &&
|
||||
!!build.artifacts?.applicationArchiveUrl &&
|
||||
((build.platform === AppPlatform.Ios && build.distribution === DistributionType.Simulator) ||
|
||||
((build.platform === AppPlatform.Ios && build.isForIosSimulator) ||
|
||||
(build.platform === AppPlatform.Android && !isAab(build))) &&
|
||||
!didArtifactsExpire(build)
|
||||
);
|
||||
|
||||
@@ -3,7 +3,7 @@ import chalk from 'chalk';
|
||||
import fs from 'fs-extra';
|
||||
import nullthrows from 'nullthrows';
|
||||
|
||||
import { SetUpGoogleServiceAccountKey } from '../../credentials/android/actions/SetUpGoogleServiceAccountKey';
|
||||
import { SetUpGoogleServiceAccountKeyForSubmissions } from '../../credentials/android/actions/SetUpGoogleServiceAccountKeyForSubmissions';
|
||||
import { readAndValidateServiceAccountKey } from '../../credentials/android/utils/googleServiceAccountKey';
|
||||
import Log, { learnMore } from '../../log';
|
||||
import {
|
||||
@@ -126,7 +126,9 @@ export async function getServiceAccountFromCredentialsServiceAsync(
|
||||
Log.log(
|
||||
`Looking up credentials configuration for ${appLookupParams.androidApplicationIdentifier}...`
|
||||
);
|
||||
const setupGoogleServiceAccountKeyAction = new SetUpGoogleServiceAccountKey(appLookupParams);
|
||||
const setupGoogleServiceAccountKeyAction = new SetUpGoogleServiceAccountKeyForSubmissions(
|
||||
appLookupParams
|
||||
);
|
||||
const androidAppCredentials = await setupGoogleServiceAccountKeyAction.runAsync(
|
||||
ctx.credentialsCtx
|
||||
);
|
||||
|
||||
@@ -11,7 +11,7 @@ import {
|
||||
jester as mockJester,
|
||||
testProjectId,
|
||||
} from '../../../credentials/__tests__/fixtures-constants';
|
||||
import { SetUpGoogleServiceAccountKey } from '../../../credentials/android/actions/SetUpGoogleServiceAccountKey';
|
||||
import { SetUpGoogleServiceAccountKeyForSubmissions } from '../../../credentials/android/actions/SetUpGoogleServiceAccountKeyForSubmissions';
|
||||
import { createTestProject } from '../../../project/__tests__/project-utils';
|
||||
import { getOwnerAccountForProjectIdAsync } from '../../../project/projectUtils';
|
||||
import { promptAsync } from '../../../prompts';
|
||||
@@ -27,7 +27,7 @@ import {
|
||||
jest.mock('fs');
|
||||
jest.mock('../../../prompts');
|
||||
jest.mock('../../../project/projectUtils');
|
||||
jest.mock('../../../credentials/android/actions/SetUpGoogleServiceAccountKey');
|
||||
jest.mock('../../../credentials/android/actions/SetUpGoogleServiceAccountKeyForSubmissions');
|
||||
jest.mock('../../../user/User', () => ({
|
||||
getUserAsync: jest.fn(() => mockJester),
|
||||
}));
|
||||
@@ -55,7 +55,7 @@ beforeAll(() => {
|
||||
'/other_dir/invalid_file.txt': 'this is not even a JSON',
|
||||
});
|
||||
jest
|
||||
.spyOn(SetUpGoogleServiceAccountKey.prototype, 'runAsync')
|
||||
.spyOn(SetUpGoogleServiceAccountKeyForSubmissions.prototype, 'runAsync')
|
||||
.mockImplementation(async () => testAndroidAppCredentialsFragment);
|
||||
});
|
||||
afterAll(() => {
|
||||
|
||||
@@ -111,6 +111,11 @@ export default class IosSubmitCommand {
|
||||
const envAppSpecificPassword = getenv.string('EXPO_APPLE_APP_SPECIFIC_PASSWORD', '');
|
||||
|
||||
if (envAppSpecificPassword) {
|
||||
if (!/^[a-z]{4}-[a-z]{4}-[a-z]{4}-[a-z]{4}$/.test(envAppSpecificPassword)) {
|
||||
throw new Error(
|
||||
'EXPO_APPLE_APP_SPECIFIC_PASSWORD must be in the format xxxx-xxxx-xxxx-xxxx, where x is a lowercase letter.'
|
||||
);
|
||||
}
|
||||
return result({
|
||||
sourceType: AppSpecificPasswordSourceType.userDefined,
|
||||
appSpecificPassword: envAppSpecificPassword,
|
||||
|
||||
@@ -78,6 +78,43 @@ describe(IosSubmitCommand, () => {
|
||||
jest.mocked(getOwnerAccountForProjectIdAsync).mockResolvedValue(mockJester.accounts[0]);
|
||||
});
|
||||
|
||||
it('throws an error if using app specific password in invalid format', async () => {
|
||||
const projectId = uuidv4();
|
||||
const graphqlClient = {} as any as ExpoGraphqlClient;
|
||||
const analytics = instance(mock<Analytics>());
|
||||
jest
|
||||
.mocked(getArchiveAsync)
|
||||
.mockImplementation(jest.requireActual('../../ArchiveSource').getArchiveAsync);
|
||||
|
||||
process.env.EXPO_APPLE_APP_SPECIFIC_PASSWORD = 'ls -la';
|
||||
|
||||
const ctx = await createSubmissionContextAsync({
|
||||
platform: Platform.IOS,
|
||||
projectDir: testProject.projectRoot,
|
||||
archiveFlags: {
|
||||
url: 'http://expo.dev/fake.ipa',
|
||||
},
|
||||
profile: {
|
||||
language: 'en-US',
|
||||
appleId: '[email protected]',
|
||||
ascAppId: '12345678',
|
||||
},
|
||||
nonInteractive: false,
|
||||
actor: mockJester,
|
||||
graphqlClient,
|
||||
analytics,
|
||||
exp: testProject.appJSON.expo,
|
||||
projectId,
|
||||
vcsClient,
|
||||
});
|
||||
const command = new IosSubmitCommand(ctx);
|
||||
await expect(command.runAsync()).rejects.toThrow(
|
||||
'EXPO_APPLE_APP_SPECIFIC_PASSWORD must be in the format xxxx-xxxx-xxxx-xxxx, where x is a lowercase letter.'
|
||||
);
|
||||
|
||||
delete process.env.EXPO_APPLE_APP_SPECIFIC_PASSWORD;
|
||||
});
|
||||
|
||||
describe('non-interactive mode', () => {
|
||||
it("throws error if didn't provide appleId and ascAppId in the submit profile", async () => {
|
||||
const projectId = uuidv4();
|
||||
@@ -118,7 +155,7 @@ describe(IosSubmitCommand, () => {
|
||||
.mocked(getArchiveAsync)
|
||||
.mockImplementation(jest.requireActual('../../ArchiveSource').getArchiveAsync);
|
||||
|
||||
process.env.EXPO_APPLE_APP_SPECIFIC_PASSWORD = 'supersecret';
|
||||
process.env.EXPO_APPLE_APP_SPECIFIC_PASSWORD = 'abcd-abcd-abcd-abcd';
|
||||
|
||||
const ctx = await createSubmissionContextAsync({
|
||||
platform: Platform.IOS,
|
||||
@@ -147,7 +184,7 @@ describe(IosSubmitCommand, () => {
|
||||
archiveSource: { type: SubmissionArchiveSourceType.Url, url: 'http://expo.dev/fake.ipa' },
|
||||
config: {
|
||||
appleIdUsername: '[email protected]',
|
||||
appleAppSpecificPassword: 'supersecret',
|
||||
appleAppSpecificPassword: 'abcd-abcd-abcd-abcd',
|
||||
ascAppIdentifier: '12345678',
|
||||
},
|
||||
});
|
||||
@@ -182,7 +219,7 @@ describe(IosSubmitCommand, () => {
|
||||
return ctx;
|
||||
});
|
||||
|
||||
process.env.EXPO_APPLE_APP_SPECIFIC_PASSWORD = 'supersecret';
|
||||
process.env.EXPO_APPLE_APP_SPECIFIC_PASSWORD = 'abcd-abcd-abcd-abcd';
|
||||
|
||||
const ctx = await createSubmissionContextAsync({
|
||||
platform: Platform.IOS,
|
||||
@@ -209,7 +246,7 @@ describe(IosSubmitCommand, () => {
|
||||
submittedBuildId: selectedBuild.id,
|
||||
config: {
|
||||
appleIdUsername: '[email protected]',
|
||||
appleAppSpecificPassword: 'supersecret',
|
||||
appleAppSpecificPassword: 'abcd-abcd-abcd-abcd',
|
||||
ascAppIdentifier: '87654321',
|
||||
},
|
||||
archiveSource: undefined,
|
||||
@@ -239,7 +276,7 @@ describe(IosSubmitCommand, () => {
|
||||
return ctx;
|
||||
});
|
||||
|
||||
process.env.EXPO_APPLE_APP_SPECIFIC_PASSWORD = 'supersecret';
|
||||
process.env.EXPO_APPLE_APP_SPECIFIC_PASSWORD = 'abcd-abcd-abcd-abcd';
|
||||
|
||||
const ctx = await createSubmissionContextAsync({
|
||||
platform: Platform.IOS,
|
||||
@@ -266,7 +303,7 @@ describe(IosSubmitCommand, () => {
|
||||
submittedBuildId: selectedBuild.id,
|
||||
config: {
|
||||
appleIdUsername: '[email protected]',
|
||||
appleAppSpecificPassword: 'supersecret',
|
||||
appleAppSpecificPassword: 'abcd-abcd-abcd-abcd',
|
||||
ascAppIdentifier: '12345678',
|
||||
},
|
||||
archiveSource: undefined,
|
||||
@@ -301,7 +338,7 @@ describe(IosSubmitCommand, () => {
|
||||
return ctx;
|
||||
});
|
||||
|
||||
process.env.EXPO_APPLE_APP_SPECIFIC_PASSWORD = 'supersecret';
|
||||
process.env.EXPO_APPLE_APP_SPECIFIC_PASSWORD = 'abcd-abcd-abcd-abcd';
|
||||
|
||||
const ctx = await createSubmissionContextAsync({
|
||||
platform: Platform.IOS,
|
||||
@@ -329,7 +366,7 @@ describe(IosSubmitCommand, () => {
|
||||
submittedBuildId: selectedBuild.id,
|
||||
config: {
|
||||
appleIdUsername: '[email protected]',
|
||||
appleAppSpecificPassword: 'supersecret',
|
||||
appleAppSpecificPassword: 'abcd-abcd-abcd-abcd',
|
||||
ascAppIdentifier: '12345678',
|
||||
},
|
||||
archiveSource: undefined,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@expo/eas-json",
|
||||
"description": "A library for interacting with eas.json",
|
||||
"version": "7.1.1",
|
||||
"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.56",
|
||||
"@expo/eas-build-job": "1.0.70",
|
||||
"chalk": "4.1.2",
|
||||
"env-string": "1.0.1",
|
||||
"fs-extra": "11.2.0",
|
||||
|
||||
@@ -107,10 +107,10 @@ test('ios config with all required values', async () => {
|
||||
ios: {
|
||||
appleId: '[email protected]',
|
||||
ascAppId: '1223423523',
|
||||
appleTeamId: 'QWERTY',
|
||||
appleTeamId: 'AB32CZE81F',
|
||||
ascApiKeyPath: './path-ABCD.p8',
|
||||
ascApiKeyIssuerId: 'abc-123-def-456',
|
||||
ascApiKeyId: 'ABCD',
|
||||
ascApiKeyIssuerId: 'b4d78f58-48c6-4f2c-96cb-94d8cd76970a',
|
||||
ascApiKeyId: 'AB32CZE81F',
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -121,11 +121,11 @@ test('ios config with all required values', async () => {
|
||||
|
||||
expect(iosProfile).toEqual({
|
||||
appleId: '[email protected]',
|
||||
appleTeamId: 'QWERTY',
|
||||
appleTeamId: 'AB32CZE81F',
|
||||
ascAppId: '1223423523',
|
||||
ascApiKeyPath: './path-ABCD.p8',
|
||||
ascApiKeyIssuerId: 'abc-123-def-456',
|
||||
ascApiKeyId: 'ABCD',
|
||||
ascApiKeyIssuerId: 'b4d78f58-48c6-4f2c-96cb-94d8cd76970a',
|
||||
ascApiKeyId: 'AB32CZE81F',
|
||||
language: 'en-US',
|
||||
});
|
||||
});
|
||||
@@ -137,7 +137,7 @@ test('ios config with ascApiKey fields set to env var', async () => {
|
||||
ios: {
|
||||
appleId: '[email protected]',
|
||||
ascAppId: '1223423523',
|
||||
appleTeamId: 'QWERTY',
|
||||
appleTeamId: 'AB32CZE81F',
|
||||
ascApiKeyPath: '$ASC_API_KEY_PATH',
|
||||
ascApiKeyIssuerId: '$ASC_API_KEY_ISSUER_ID',
|
||||
ascApiKeyId: '$ASC_API_KEY_ID',
|
||||
@@ -148,18 +148,18 @@ test('ios config with ascApiKey fields set to env var', async () => {
|
||||
|
||||
try {
|
||||
process.env.ASC_API_KEY_PATH = './path-ABCD.p8';
|
||||
process.env.ASC_API_KEY_ISSUER_ID = 'abc-123-def-456';
|
||||
process.env.ASC_API_KEY_ID = 'ABCD';
|
||||
process.env.ASC_API_KEY_ISSUER_ID = 'b4d78f58-48c6-4f2c-96cb-94d8cd76970a';
|
||||
process.env.ASC_API_KEY_ID = 'AB32CZE81F';
|
||||
const accessor = EasJsonAccessor.fromProjectPath('/project');
|
||||
const iosProfile = await EasJsonUtils.getSubmitProfileAsync(accessor, Platform.IOS, 'release');
|
||||
|
||||
expect(iosProfile).toEqual({
|
||||
appleId: '[email protected]',
|
||||
ascAppId: '1223423523',
|
||||
appleTeamId: 'QWERTY',
|
||||
appleTeamId: 'AB32CZE81F',
|
||||
ascApiKeyPath: './path-ABCD.p8',
|
||||
ascApiKeyIssuerId: 'abc-123-def-456',
|
||||
ascApiKeyId: 'ABCD',
|
||||
ascApiKeyIssuerId: 'b4d78f58-48c6-4f2c-96cb-94d8cd76970a',
|
||||
ascApiKeyId: 'AB32CZE81F',
|
||||
language: 'en-US',
|
||||
});
|
||||
} finally {
|
||||
@@ -176,16 +176,16 @@ test('valid profile extending other profile', async () => {
|
||||
ios: {
|
||||
appleId: '[email protected]',
|
||||
ascAppId: '1223423523',
|
||||
appleTeamId: 'QWERTY',
|
||||
appleTeamId: 'AB32CZE81F',
|
||||
},
|
||||
},
|
||||
extension: {
|
||||
extends: 'base',
|
||||
ios: {
|
||||
appleTeamId: 'ABCDEF',
|
||||
appleTeamId: 'AB32CZE81F',
|
||||
ascApiKeyPath: './path-ABCD.p8',
|
||||
ascApiKeyIssuerId: 'abc-123-def-456',
|
||||
ascApiKeyId: 'ABCD',
|
||||
ascApiKeyIssuerId: '2af70a7a-2ac5-44d4-924e-ae97a7ca9333',
|
||||
ascApiKeyId: 'AB32CZE81F',
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -202,19 +202,134 @@ test('valid profile extending other profile', async () => {
|
||||
language: 'en-US',
|
||||
appleId: '[email protected]',
|
||||
ascAppId: '1223423523',
|
||||
appleTeamId: 'QWERTY',
|
||||
appleTeamId: 'AB32CZE81F',
|
||||
});
|
||||
expect(extendedProfile).toEqual({
|
||||
language: 'en-US',
|
||||
appleId: '[email protected]',
|
||||
ascAppId: '1223423523',
|
||||
appleTeamId: 'ABCDEF',
|
||||
appleTeamId: 'AB32CZE81F',
|
||||
ascApiKeyPath: './path-ABCD.p8',
|
||||
ascApiKeyIssuerId: 'abc-123-def-456',
|
||||
ascApiKeyId: 'ABCD',
|
||||
ascApiKeyIssuerId: '2af70a7a-2ac5-44d4-924e-ae97a7ca9333',
|
||||
ascApiKeyId: 'AB32CZE81F',
|
||||
});
|
||||
});
|
||||
|
||||
test('ios config with with invalid appleId', async () => {
|
||||
await fs.writeJson('/project/eas.json', {
|
||||
submit: {
|
||||
release: {
|
||||
ios: {
|
||||
appleId: '| /bin/bash echo "hello"',
|
||||
ascAppId: '1223423523',
|
||||
appleTeamId: 'AB32CZE81F',
|
||||
ascApiKeyPath: './path-ABCD.p8',
|
||||
ascApiKeyIssuerId: '2af70a7a-2ac5-44d4-924e-ae97a7ca9333',
|
||||
ascApiKeyId: 'AB32CZE81F',
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const accessor = EasJsonAccessor.fromProjectPath('/project');
|
||||
const promise = EasJsonUtils.getSubmitProfileAsync(accessor, Platform.IOS, 'release');
|
||||
await expect(promise).rejects.toThrow(
|
||||
'Invalid Apple ID was specified. It should be a valid email address. Example: "[email protected]".'
|
||||
);
|
||||
});
|
||||
|
||||
test('ios config with with invalid ascAppId', async () => {
|
||||
await fs.writeJson('/project/eas.json', {
|
||||
submit: {
|
||||
release: {
|
||||
ios: {
|
||||
appleId: '[email protected]',
|
||||
ascAppId: 'othervalue',
|
||||
appleTeamId: 'AB32CZE81F',
|
||||
ascApiKeyPath: './path-ABCD.p8',
|
||||
ascApiKeyIssuerId: '2af70a7a-2ac5-44d4-924e-ae97a7ca9333',
|
||||
ascApiKeyId: 'AB32CZE81F',
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const accessor = EasJsonAccessor.fromProjectPath('/project');
|
||||
const promise = EasJsonUtils.getSubmitProfileAsync(accessor, Platform.IOS, 'release');
|
||||
await expect(promise).rejects.toThrow(
|
||||
'Invalid Apple App Store Connect App ID ("ascAppId") was specified. It should consist only of digits. Example: "1234567891". Learn more: https://expo.fyi/asc-app-id.'
|
||||
);
|
||||
});
|
||||
|
||||
test('ios config with with invalid appleTeamId', async () => {
|
||||
await fs.writeJson('/project/eas.json', {
|
||||
submit: {
|
||||
release: {
|
||||
ios: {
|
||||
appleId: '[email protected]',
|
||||
ascAppId: '1223423523',
|
||||
appleTeamId: 'ls -la',
|
||||
ascApiKeyPath: './path-ABCD.p8',
|
||||
ascApiKeyIssuerId: '2af70a7a-2ac5-44d4-924e-ae97a7ca9333',
|
||||
ascApiKeyId: 'AB32CZE81F',
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const accessor = EasJsonAccessor.fromProjectPath('/project');
|
||||
const promise = EasJsonUtils.getSubmitProfileAsync(accessor, Platform.IOS, 'release');
|
||||
await expect(promise).rejects.toThrow(
|
||||
'Invalid Apple Team ID was specified. It should consist of 10 uppercase letters or digits. Example: "AB32CZE81F".'
|
||||
);
|
||||
});
|
||||
|
||||
test('ios config with with invalid ascApiKeyIssuerId', async () => {
|
||||
await fs.writeJson('/project/eas.json', {
|
||||
submit: {
|
||||
release: {
|
||||
ios: {
|
||||
appleId: '[email protected]',
|
||||
ascAppId: '1223423523',
|
||||
appleTeamId: 'AB32CZE81F',
|
||||
ascApiKeyPath: './path-ABCD.p8',
|
||||
ascApiKeyIssuerId: 'notanuuid',
|
||||
ascApiKeyId: 'AB32CZE81F',
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const accessor = EasJsonAccessor.fromProjectPath('/project');
|
||||
const promise = EasJsonUtils.getSubmitProfileAsync(accessor, Platform.IOS, 'release');
|
||||
await expect(promise).rejects.toThrow(
|
||||
'Invalid Apple App Store Connect API Key Issuer ID ("ascApiKeyIssuerId") was specified. It should be a valid UUID. Example: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx". Learn more: https://expo.fyi/creating-asc-api-key.'
|
||||
);
|
||||
});
|
||||
|
||||
test('ios config with with invalid ascApiKeyId', async () => {
|
||||
await fs.writeJson('/project/eas.json', {
|
||||
submit: {
|
||||
release: {
|
||||
ios: {
|
||||
appleId: '[email protected]',
|
||||
ascAppId: '1223423523',
|
||||
appleTeamId: 'AB32CZE81F',
|
||||
ascApiKeyPath: './path-ABCD.p8',
|
||||
ascApiKeyIssuerId: 'b4d78f58-48c6-4f2c-96cb-94d8cd76970a',
|
||||
ascApiKeyId: 'wrong value',
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const accessor = EasJsonAccessor.fromProjectPath('/project');
|
||||
const promise = EasJsonUtils.getSubmitProfileAsync(accessor, Platform.IOS, 'release');
|
||||
await expect(promise).rejects.toThrow(
|
||||
`Invalid Apple App Store Connect API Key ID ("ascApiKeyId") was specified. It should consist of uppercase letters or digits. Example: "AB32CZE81F". Learn more: https://expo.fyi/creating-asc-api-key.`
|
||||
);
|
||||
});
|
||||
|
||||
test('get profile names', async () => {
|
||||
await fs.writeJson('/project/eas.json', {
|
||||
submit: {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import Joi from 'joi';
|
||||
|
||||
import { BuildProfileSchema } from './build/schema';
|
||||
import { SubmitProfileSchema } from './submit/schema';
|
||||
import { UnresolvedSubmitProfileSchema } from './submit/schema';
|
||||
import { AppVersionSource } from './types';
|
||||
|
||||
export const EasJsonSchema = Joi.object({
|
||||
@@ -12,5 +12,5 @@ export const EasJsonSchema = Joi.object({
|
||||
promptToConfigurePushNotifications: Joi.boolean(),
|
||||
}),
|
||||
build: Joi.object().pattern(Joi.string(), BuildProfileSchema),
|
||||
submit: Joi.object().pattern(Joi.string(), SubmitProfileSchema),
|
||||
submit: Joi.object().pattern(Joi.string(), UnresolvedSubmitProfileSchema),
|
||||
});
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Platform } from '@expo/eas-build-job';
|
||||
import envString from 'env-string';
|
||||
|
||||
import { AndroidSubmitProfileSchema, IosSubmitProfileSchema } from './schema';
|
||||
import { AndroidSubmitProfileSchema, ResolvedIosSubmitProfileSchema } from './schema';
|
||||
import {
|
||||
AndroidSubmitProfileFieldsToEvaluate,
|
||||
IosSubmitProfileFieldsToEvaluate,
|
||||
@@ -99,7 +99,7 @@ function mergeProfiles<T extends Platform>(
|
||||
|
||||
export function getDefaultProfile<T extends Platform>(platform: T): SubmitProfile<T> {
|
||||
const Schema =
|
||||
platform === Platform.ANDROID ? AndroidSubmitProfileSchema : IosSubmitProfileSchema;
|
||||
platform === Platform.ANDROID ? AndroidSubmitProfileSchema : ResolvedIosSubmitProfileSchema;
|
||||
return Schema.validate({}, { allowUnknown: false, abortEarly: false, convert: true }).value;
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,9 @@ export const AndroidSubmitProfileSchema = Joi.object({
|
||||
}),
|
||||
});
|
||||
|
||||
export const IosSubmitProfileSchema = Joi.object({
|
||||
// it is less strict submission schema allowing for magic syntax like "$ASC_API_KEY_PATH"
|
||||
// to read value from environment variable later on
|
||||
export const UnresolvedIosSubmitProfileSchema = Joi.object({
|
||||
ascApiKeyPath: Joi.string(),
|
||||
ascApiKeyId: Joi.string(),
|
||||
ascApiKeyIssuerId: Joi.string(),
|
||||
@@ -34,8 +36,46 @@ export const IosSubmitProfileSchema = Joi.object({
|
||||
metadataPath: Joi.string(),
|
||||
});
|
||||
|
||||
export const SubmitProfileSchema = Joi.object({
|
||||
// more strict version after resolving all of the values
|
||||
export const ResolvedIosSubmitProfileSchema = Joi.object({
|
||||
ascApiKeyPath: Joi.string(),
|
||||
ascApiKeyId: Joi.string()
|
||||
.regex(/^[\dA-Z]+$/)
|
||||
.message(
|
||||
'Invalid Apple App Store Connect API Key ID ("ascApiKeyId") was specified. It should consist of uppercase letters or digits. Example: "AB32CZE81F". Learn more: https://expo.fyi/creating-asc-api-key.'
|
||||
)
|
||||
.max(30), // I didn't find any docs about it, but all of the ones I've seen are 10 characters long so 30 characters limit should be enough
|
||||
ascApiKeyIssuerId: Joi.string()
|
||||
.uuid() // All of the issuer IDs I've seen are UUIDs, but again, I didn't find any docs about it
|
||||
.message(
|
||||
'Invalid Apple App Store Connect API Key Issuer ID ("ascApiKeyIssuerId") was specified. It should be a valid UUID. Example: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx". Learn more: https://expo.fyi/creating-asc-api-key.'
|
||||
),
|
||||
appleId: Joi.string()
|
||||
.email()
|
||||
.message(
|
||||
'Invalid Apple ID was specified. It should be a valid email address. Example: "[email protected]".'
|
||||
),
|
||||
ascAppId: Joi.string()
|
||||
.regex(/^\d+$/)
|
||||
.message(
|
||||
'Invalid Apple App Store Connect App ID ("ascAppId") was specified. It should consist only of digits. Example: "1234567891". Learn more: https://expo.fyi/asc-app-id.'
|
||||
)
|
||||
.max(30), // I didn't find any docs about it, but the longest app ID I've seen is 10 digits long so 30 characters limit should be enough
|
||||
appleTeamId: Joi.string()
|
||||
.regex(/^[\dA-Z]{10}$/) // Apple says that it always has to be 10 characters long https://developer.apple.com/help/account/manage-your-team/locate-your-team-id/
|
||||
.message(
|
||||
'Invalid Apple Team ID was specified. It should consist of 10 uppercase letters or digits. Example: "AB32CZE81F".'
|
||||
),
|
||||
sku: Joi.string(),
|
||||
language: Joi.string().default('en-US'),
|
||||
companyName: Joi.string(),
|
||||
appName: Joi.string(),
|
||||
bundleIdentifier: Joi.string(),
|
||||
metadataPath: Joi.string(),
|
||||
});
|
||||
|
||||
export const UnresolvedSubmitProfileSchema = Joi.object({
|
||||
extends: Joi.string(),
|
||||
android: AndroidSubmitProfileSchema,
|
||||
ios: IosSubmitProfileSchema,
|
||||
ios: UnresolvedIosSubmitProfileSchema,
|
||||
});
|
||||
@@ -5,6 +5,7 @@ import { resolveBuildProfile } from './build/resolver';
|
||||
import { BuildProfile } from './build/types';
|
||||
import { MissingEasJsonError } from './errors';
|
||||
import { resolveSubmitProfile } from './submit/resolver';
|
||||
import { AndroidSubmitProfileSchema, ResolvedIosSubmitProfileSchema } from './submit/schema';
|
||||
import { SubmitProfile } from './submit/types';
|
||||
import { EasJson } from './types';
|
||||
|
||||
@@ -102,6 +103,17 @@ export class EasJsonUtils {
|
||||
profileName?: string
|
||||
): Promise<SubmitProfile<T>> {
|
||||
const easJson = await accessor.readAsync();
|
||||
return resolveSubmitProfile({ easJson, platform, profileName });
|
||||
const profile = resolveSubmitProfile({ easJson, platform, profileName });
|
||||
const Schema =
|
||||
platform === Platform.ANDROID ? AndroidSubmitProfileSchema : ResolvedIosSubmitProfileSchema;
|
||||
const { value, error } = Schema.validate(profile, {
|
||||
allowUnknown: false,
|
||||
abortEarly: false,
|
||||
convert: true,
|
||||
});
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
}
|
||||
@@ -1354,10 +1354,10 @@
|
||||
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b"
|
||||
integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==
|
||||
|
||||
"@expo/apple-utils@1.3.2":
|
||||
version "1.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@expo/apple-utils/-/apple-utils-1.3.2.tgz#c2c80e03bb4c310e183b109ea37bbc88cef59313"
|
||||
integrity sha512-8utf2r+ka9uI1qhazBEbLzjPX0CIBvvpBHy0o4XFoLUiZDvBqGBEctduvJc49hvu/16hxVtNqGXs1U97OVKe4g==
|
||||
"@expo/apple-utils@1.4.0":
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/@expo/apple-utils/-/apple-utils-1.4.0.tgz#5b8be01673da488886ec8df9ea4b7ba21ad3b775"
|
||||
integrity sha512-tbSWy10f/xdfUb3TZkshRLk4zIuG2wNIyuypUX1jvDrOt0bokSbwmIVYkkLRazZ+mOR0ZRcDUuBHKkZmyGuegQ==
|
||||
|
||||
"@expo/bunyan@^4.0.0":
|
||||
version "4.0.0"
|
||||
@@ -1462,23 +1462,15 @@
|
||||
slugify "^1.3.4"
|
||||
sucrase "^3.20.0"
|
||||
|
||||
"@expo/[email protected].56":
|
||||
version "1.0.56"
|
||||
resolved "https://registry.yarnpkg.com/@expo/eas-build-job/-/eas-build-job-1.0.56.tgz#01f8782e3956a6782487f9b4da183b1a2fb95daa"
|
||||
integrity sha512-OfPSvvcFIpt1SRnoxWMmUgHT7YuhZM10iYftBX4UqjgwjKIkmOpJUOgkmTd3cJMOaZRLP4MI4zsmk2gy9RCO9g==
|
||||
dependencies:
|
||||
joi "^17.9.2"
|
||||
semver "^7.5.4"
|
||||
|
||||
"@expo/[email protected]":
|
||||
version "1.0.59"
|
||||
resolved "https://registry.yarnpkg.com/@expo/eas-build-job/-/eas-build-job-1.0.59.tgz#cd86ce33bebe1e7c60bef4754d798aff381e0ff3"
|
||||
integrity sha512-oFOn8hbJbfpjrYM39yejnvlD9qMgK/zRuQ9PnzruIygOxDrBn1nnOAO9Jm0kWBGAPJVDAJRQ2exOgHVY+tAAEw==
|
||||
"@expo/[email protected].70":
|
||||
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==
|
||||
@@ -1525,10 +1517,10 @@
|
||||
json5 "^2.2.2"
|
||||
write-file-atomic "^2.3.0"
|
||||
|
||||
"@expo/[email protected].37":
|
||||
version "1.0.37"
|
||||
resolved "https://registry.yarnpkg.com/@expo/logger/-/logger-1.0.37.tgz#79b2336d4e9ed70bd19a53168eb91d6a899f11d8"
|
||||
integrity sha512-Xx3pt7FCsUkjsnu3lJoGp/LXYqoa5TyYx1/lgvfz4NSRgUT+5f6LNiYIowUjXab80PbW3gA/KqHYY9V7iZm8aQ==
|
||||
"@expo/[email protected].57":
|
||||
version "1.0.57"
|
||||
resolved "https://registry.yarnpkg.com/@expo/logger/-/logger-1.0.57.tgz#b64dfb29a06e8ca476905dd445a0e105fd919bcc"
|
||||
integrity sha512-kd/1MOrVST9gQtnTD+qAV3KdrYCV9oShzIqYek+5XI3M/6QNvfv8IPr2pv+xaYZoCZgnNdI4ViWo0eYBDJMngA==
|
||||
dependencies:
|
||||
"@types/bunyan" "^1.8.8"
|
||||
bunyan "^1.8.15"
|
||||
@@ -1673,21 +1665,21 @@
|
||||
dependencies:
|
||||
cross-spawn "^7.0.3"
|
||||
|
||||
"@expo/[email protected].51":
|
||||
version "1.0.51"
|
||||
resolved "https://registry.yarnpkg.com/@expo/steps/-/steps-1.0.51.tgz#79aad4eb556e38a9f1c21703ebbea3af4f068807"
|
||||
integrity sha512-S+2ESok2+kMjqWqJIK6p7Uk3aXf0hEbl7x10n1QBQdFzpkQmcNmpyNguOiFYyaj9dRleG2aPbwCv942m37VQWw==
|
||||
"@expo/[email protected].70":
|
||||
version "1.0.70"
|
||||
resolved "https://registry.yarnpkg.com/@expo/steps/-/steps-1.0.70.tgz#b8d9c7373dc6a247d9254bfcae9ae11a1932517a"
|
||||
integrity sha512-Na2m9Scll5TWtm/MF2/mPDGRDWEI6NFpYR2W9jvjbJNOtidYxNjLvq+o4Jy8j9KXo8ofm201w3c9ckfkuvdu1w==
|
||||
dependencies:
|
||||
"@expo/logger" "1.0.37"
|
||||
"@expo/logger" "1.0.57"
|
||||
"@expo/spawn-async" "^1.7.2"
|
||||
arg "^5.0.2"
|
||||
fs-extra "^11.1.1"
|
||||
joi "^17.9.2"
|
||||
fs-extra "^11.2.0"
|
||||
joi "^17.11.0"
|
||||
lodash.clonedeep "^4.5.0"
|
||||
lodash.get "^4.4.2"
|
||||
this-file "^2.0.3"
|
||||
uuid "^9.0.0"
|
||||
yaml "^2.3.1"
|
||||
uuid "^9.0.1"
|
||||
yaml "^2.3.4"
|
||||
|
||||
"@expo/[email protected]":
|
||||
version "1.0.0"
|
||||
@@ -7160,7 +7152,7 @@ fs-constants@^1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
|
||||
integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
|
||||
|
||||
[email protected]:
|
||||
[email protected], fs-extra@^11.2.0:
|
||||
version "11.2.0"
|
||||
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b"
|
||||
integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==
|
||||
@@ -9302,17 +9294,6 @@ joi@^17.11.0:
|
||||
"@sideway/formula" "^3.0.1"
|
||||
"@sideway/pinpoint" "^2.0.0"
|
||||
|
||||
joi@^17.9.2:
|
||||
version "17.9.2"
|
||||
resolved "https://registry.yarnpkg.com/joi/-/joi-17.9.2.tgz#8b2e4724188369f55451aebd1d0b1d9482470690"
|
||||
integrity sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==
|
||||
dependencies:
|
||||
"@hapi/hoek" "^9.0.0"
|
||||
"@hapi/topo" "^5.0.0"
|
||||
"@sideway/address" "^4.1.3"
|
||||
"@sideway/formula" "^3.0.1"
|
||||
"@sideway/pinpoint" "^2.0.0"
|
||||
|
||||
join-component@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/join-component/-/join-component-1.1.0.tgz#b8417b750661a392bee2c2537c68b2a9d4977cd5"
|
||||
@@ -13724,7 +13705,7 @@ [email protected]:
|
||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.0.0.tgz#bc6ccf91b5ff0ac07bbcdbf1c7c4e150db4dbb6c"
|
||||
integrity sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==
|
||||
|
||||
[email protected]:
|
||||
[email protected], uuid@^9.0.1:
|
||||
version "9.0.1"
|
||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30"
|
||||
integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==
|
||||
@@ -14192,6 +14173,11 @@ yaml@^2.3.1:
|
||||
resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b"
|
||||
integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==
|
||||
|
||||
yaml@^2.3.4:
|
||||
version "2.3.4"
|
||||
resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2"
|
||||
integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==
|
||||
|
||||
[email protected], yargs-parser@^20.2.2:
|
||||
version "20.2.4"
|
||||
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54"
|
||||
|
||||
Reference in new issue
Block a user