Compare commits

...
Author SHA1 Message Date
Expo CI b92a9cc5a7 v22.0.0 2026-08-14 14:24:53 +00:00
763cbadaaa [eas-cli] remove deprecated GraphQL field usage (#4021)
* Remove deprecated GraphQL field usage

* Keep flat runtimeVersion in update:republish --json output

* Revert "Keep flat runtimeVersion in update:republish --json output"

This reverts commit 32264aea2d5c200bba7ee6be46d80598433fee08.

* Clarify CHANGELOG entry for update:republish --json shape

* Limit breaking-changes note to user-facing output changes

* Migrate account fixtures in accountSelection tests

* Migrate remaining account fixtures in getProjectIdAsync tests

Co-authored-by: tchayen <[email protected]>

* [eas-cli] Restore submission Application Identifier from the submitted build

Read it from Build.appIdentifier instead of the deprecated
androidConfig.applicationIdentifier.

Co-authored-by: tchayen <[email protected]>

* Regenerate GraphQL code and update channel fixture after rebase

---------

Co-authored-by: expo-tuft[bot] <288127324+expo-tuft[bot]@users.noreply.github.com>
Co-authored-by: tchayen <[email protected]>
2026-08-14 17:21:27 +03:00
81 changed files with 2121 additions and 939 deletions

No files matched your search

+2
View File
@@ -6,6 +6,8 @@ This is the log of notable changes to EAS CLI and related packages.
### 🛠 Breaking changes
- [eas-cli] Build objects in `--json` output (`eas build`, `eas build:list`, `eas build:view`, `eas build:resign`) now have `app`, `updateChannel` (object with `id` and `name`), and `runtime` (object with `id` and `version`) instead of `project`, `channel`, and `runtimeVersion`. `eas update:republish --json` output likewise has `runtime` instead of `runtimeVersion`. Other update commands' `--json` output and `eas-update-metadata.json` are unchanged. ([#4021](https://github.com/expo/eas-cli/pull/4021) by [@tchayen](https://github.com/tchayen))
### 🎉 New features
- [build-tools] Upload JavaScript source maps generated by builds. ([#4170](https://github.com/expo/eas-cli/pull/4170) by [@AbbanMustafa](https://github.com/AbbanMustafa))
+1 -1
View File
@@ -1,5 +1,5 @@
{
"npmClient": "yarn",
"version": "21.8.0",
"version": "22.0.0",
"$schema": "node_modules/lerna/schemas/lerna-schema.json"
}
+7 -7
View File
@@ -1,6 +1,6 @@
{
"name": "@expo/build-tools",
"version": "21.8.0",
"version": "22.0.0",
"bugs": "https://github.com/expo/eas-cli/issues",
"license": "BUSL-1.1",
"author": "Expo <[email protected]>",
@@ -38,17 +38,17 @@
"dependencies": {
"@expo/config": "55.0.10",
"@expo/config-plugins": "55.0.7",
"@expo/downloader": "21.0.0",
"@expo/eas-build-job": "21.6.0",
"@expo/downloader": "22.0.0",
"@expo/eas-build-job": "22.0.0",
"@expo/env": "^0.4.0",
"@expo/logger": "21.0.0",
"@expo/logger": "22.0.0",
"@expo/package-manager": "1.9.10",
"@expo/plist": "^0.3.5",
"@expo/results": "^1.0.0",
"@expo/spawn-async": "1.7.2",
"@expo/steps": "21.7.1",
"@expo/template-file": "21.0.2",
"@expo/turtle-spawn": "21.0.0",
"@expo/steps": "22.0.0",
"@expo/template-file": "22.0.0",
"@expo/turtle-spawn": "22.0.0",
"@expo/xcpretty": "^4.3.1",
"@ngrok/ngrok": "1.7.0",
"@sentry/node": "7.77.0",
@@ -1,6 +1,6 @@
{
"name": "create-eas-build-function",
"version": "21.7.1",
"version": "22.0.0",
"description": "Create functions for use in EAS Build custom builds.",
"keywords": [
"expo",
@@ -35,7 +35,7 @@
"clean": "rimraf ./build/ \"*.tsbuildinfo\""
},
"dependencies": {
"@expo/steps": "21.7.1"
"@expo/steps": "22.0.0"
},
"devDependencies": {
"@expo/package-manager": "1.9.10",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@expo/downloader",
"version": "21.0.0",
"version": "22.0.0",
"bugs": "https://github.com/expo/eas-cli/issues",
"license": "BUSL-1.1",
"author": "Expo <[email protected]>",
@@ -1,6 +1,6 @@
{
"name": "eas-build-cache-provider",
"version": "21.0.0",
"version": "22.0.0",
"description": "A build cache provider plugin for the Expo CLI",
"homepage": "https://github.com/expo/eas-cli",
"bugs": "https://github.com/expo/eas-cli/issues",
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@expo/eas-build-job",
"version": "21.6.0",
"version": "22.0.0",
"bugs": "https://github.com/expo/eas-cli/issues",
"license": "MIT",
"author": "Expo <[email protected]>",
@@ -25,9 +25,9 @@
"clean": "rimraf node_modules dist coverage \"*.tsbuildinfo\""
},
"dependencies": {
"@expo/logger": "21.0.0",
"@expo/logger": "22.0.0",
"@expo/results": "1.0.0",
"@expo/turtle-spawn": "21.0.0",
"@expo/turtle-spawn": "22.0.0",
"joi": "^17.13.1",
"semver": "^7.6.2",
"zod": "^4.3.5"
+162 -152
View File
File diff suppressed because it is too large. Load diff
+1199 -49
View File
File diff suppressed because it is too large. Load diff
+5 -5
View File
@@ -1,6 +1,6 @@
{
"name": "eas-cli",
"version": "21.8.0",
"version": "22.0.0",
"description": "EAS command line tool",
"keywords": [
"cli",
@@ -48,11 +48,11 @@
"@expo/code-signing-certificates": "0.0.5",
"@expo/config": "55.0.10",
"@expo/config-plugins": "55.0.7",
"@expo/eas-build-job": "21.6.0",
"@expo/eas-json": "21.6.0",
"@expo/eas-build-job": "22.0.0",
"@expo/eas-json": "22.0.0",
"@expo/env": "^1.0.0",
"@expo/json-file": "8.3.3",
"@expo/logger": "21.0.0",
"@expo/logger": "22.0.0",
"@expo/multipart-body-parser": "2.0.0",
"@expo/osascript": "2.1.4",
"@expo/package-manager": "1.9.10",
@@ -64,7 +64,7 @@
"@expo/results": "1.0.0",
"@expo/rudder-sdk-node": "1.1.1",
"@expo/spawn-async": "1.7.2",
"@expo/steps": "21.7.1",
"@expo/steps": "22.0.0",
"@expo/timeago.js": "1.0.0",
"@oclif/core": "^4.8.3",
"@oclif/plugin-autocomplete": "^3.2.40",
@@ -38,14 +38,9 @@ export function getMockAppFragment(): AppFragment {
ownerAccount: {
id: 'test-account-id',
name: 'testuser',
users: [
{
role: Role.Owner,
actor: {
id: 'test-user-id',
},
},
],
viewerUserPermission: {
role: Role.Owner,
},
},
};
}
@@ -180,7 +180,7 @@ describe(WorkflowLogView, () => {
createdAt: '2022-01-01T00:00:00.000Z',
updatedAt: '2022-01-01T00:00:00.000Z',
isForIosSimulator: false,
project: {
app: {
id: mockProjectId,
__typename: 'App',
name: 'App',
@@ -74,7 +74,7 @@ function createMockBuildFragment({
id: buildId ?? uuid(),
logFiles: [],
priority: BuildPriority.Normal,
project: {
app: {
__typename: 'App',
slug: 'test-project',
id: projectId,
@@ -74,7 +74,7 @@ function createMockBuildFragment({
platform: AppPlatform.Android,
id: buildId ?? uuid(),
priority: BuildPriority.Normal,
project: {
app: {
__typename: 'App',
slug: 'test-project',
id: projectId,
-1
View File
@@ -76,7 +76,6 @@ export async function collectMetadataAsync<T extends Platform>(
customWorkflowName: ctx.customBuildConfigMetadata?.workflowName,
developmentClient: ctx.developmentClient,
requiredPackageManager: ctx.requiredPackageManager ?? undefined,
selectedImage: ctx.buildProfile.image,
customNodeVersion: ctx.buildProfile.node,
simulator: 'simulator' in ctx.buildProfile && ctx.buildProfile.simulator,
};
@@ -597,7 +597,7 @@ export async function downloadAndRunAsync(
simulator?: SimulatorRunTarget
): Promise<void> {
assert(build.artifacts?.applicationArchiveUrl);
const cachedAppPath = getEasBuildRunCachedAppPath(build.project.id, build.id, build.platform);
const cachedAppPath = getEasBuildRunCachedAppPath(build.app.id, build.id, build.platform);
if (await pathExists(cachedAppPath)) {
Log.newLine();
@@ -93,7 +93,7 @@ export function formatGraphQLBuild(build: BuildFragment): string {
},
{
label: 'Channel',
value: build.channel,
value: build.updateChannel?.name,
},
{
label: 'SDK Version',
@@ -101,7 +101,7 @@ export function formatGraphQLBuild(build: BuildFragment): string {
},
{
label: 'Runtime Version',
value: build.runtimeVersion,
value: build.runtime?.version,
},
{
label: 'Version',
+5 -8
View File
@@ -19,13 +19,10 @@ export function getProjectPageUrl(
}
export function getBuildLogsUrl(build: BuildFragment, hash?: string): string {
const { project } = build;
const url =
project.__typename !== 'App'
? `/builds/${build.id}`
: `/accounts/${project.ownerAccount.name}/projects/${project.slug}/builds/${build.id}${
hash ? `#${hash}` : ''
}`;
const { app } = build;
const url = `/accounts/${app.ownerAccount.name}/projects/${app.slug}/builds/${build.id}${
hash ? `#${hash}` : ''
}`;
return new URL(url, getExpoWebsiteBaseUrl()).toString();
}
@@ -37,7 +34,7 @@ export function getArtifactUrl(artifactId: string): string {
export function getInternalDistributionInstallUrl(build: BuildFragment): string {
if (build.platform === AppPlatform.Ios) {
return `itms-services://?action=download-manifest;url=${getExpoApiBaseUrl()}/v2/projects/${
build.project.id
build.app.id
}/builds/${build.id}/manifest.plist`;
}
@@ -11,7 +11,7 @@ export const testUpdateBranch1: UpdateBranchObject = {
group: '16ca6dba-e63b-48b0-baa3-15a894ee9434',
message: 'fix bug',
createdAt: '2023-07-17T22:48:59.278Z',
runtimeVersion: 'exposdk:48.0.0',
runtime: { id: 'runtime-exposdk-48', version: 'exposdk:48.0.0' },
platform: 'ios',
manifestFragment:
'{"extra":{"expoClient":{"ios":{"supportsTablet":true,"bundleIdentifier":"com.quintest113.updatestest4"},"web":{"favicon":"./assets/favicon.png"},"icon":"./assets/icon.png","name":"updates-test-4","slug":"updates-test-4","extra":{"eas":{"projectId":"789a8784-0186-4f41-8bd2-7f219291a2b8"}},"splash":{"image":"./assets/splash.png","resizeMode":"contain","backgroundColor":"#ffffff"},"android":{"package":"com.quintest113.updatestest4","adaptiveIcon":{"backgroundColor":"#ffffff","foregroundImage":"./assets/adaptive-icon.png"}},"updates":{"url":"https://u.expo.dev/789a8784-0186-4f41-8bd2-7f219291a2b8"},"version":"1.0.0","platforms":["ios","android"],"sdkVersion":"48.0.0","orientation":"portrait","runtimeVersion":{"policy":"sdkVersion"},"currentFullName":"@quintest113/updates-test-4","originalFullName":"@quintest113/updates-test-4","userInterfaceStyle":"light","assetBundlePatterns":["**/*"]}},"assets":[{"bundleKey":"7d40544b395c5949f4646f5e150fe020","fileSHA256":"LN_rjlzN55dvcBL7jM5zryIpAp7iHU8VCf7RFIccbNg","storageKey":"Pi65ns2w9xLI5G_m9aGrJ5wK5FpWcGcInSSFwnA_0aA","contentType":"image/png","fileExtension":".png"},{"bundleKey":"cdd04e13d4ec83ff0cd13ec8dabdc341","fileSHA256":"irHji01LPI9giDYxtJo9bTPHaEHzuUcCMTlb4xn90Ks","storageKey":"oJZ9JX1m8IKNDgnIqcKOo5KUFOoa_NCaxruigZu65E0","contentType":"image/png","fileExtension":".png"},{"bundleKey":"a132ecc4ba5c1517ff83c0fb321bc7fc","fileSHA256":"K3RDqaWOksoRpXW9wRWYYVpX3eMFzYznDWAmBrMCzZg","storageKey":"X3OAkUu5P_LqyKFx1bNkA_qDQFLlSjCYNAlVEaOamHE","contentType":"image/png","fileExtension":".png"},{"bundleKey":"0ea69b5077e7c4696db85dbcba75b0e1","fileSHA256":"Pd0Hc-0n4j0leJ8wFzGzrEVa2L5aonoKG4OPicbSciU","storageKey":"FwJkAbrRNahBGX1KXnTAgiiwyzENu3D7DeEzCwmInyo","contentType":"image/png","fileExtension":".png"},{"bundleKey":"f5b790e2ac193b3d41015edb3551f9b8","fileSHA256":"vCfIss7SLYKt1AAi0hxjsgOMEDceLJB6ZWjQf6gTU4k","storageKey":"GQtYm7r0G9N3WJyrymjZ26p8eNMIb7rzqwSVgGco5EU","contentType":"image/png","fileExtension":".png"},{"bundleKey":"5223c8d9b0d08b82a5670fb5f71faf78","fileSHA256":"LJXowmdeeZM1_QBGuwfb2gbLfs_1HtN5IsYwnWGcxNM","storageKey":"jeqOrdQBNY4hgl04B3wtGs8QNWMDmjvbjIMUXPtOBpw","contentType":"image/png","fileExtension":".png"},{"bundleKey":"02d5848f62ade9617cf96894727d32e7","fileSHA256":"u1-8zHOj9oxS8maH-7JbShJIq1-KEV7FXnrGpEUcR-4","storageKey":"LMUvUZZpdGFb7KqaB_l9N4TXTkFn1Pw92ws9fWDNZPw","contentType":"model/gltf-binary","fileExtension":".glb"},{"bundleKey":"6013c27e421ab23c826713af3ebec891","fileSHA256":"dutQNnvzTCS4NgwvbeMbvhro5QnW0GJUeY_4rrvlcLY","storageKey":"85KB9Jr7eqz1Jwt1mYQGRzTy6ZXyO0j7ZcaLImCbzkU","contentType":"image/jpeg","fileExtension":".jpg"}],"launchAsset":{"bundleKey":"3d0ac172fe41ab941a8c68cd7e3a17ee","fileSHA256":"jjnar-ZPrb_g0Bx5tcFfjJrP3v8HdeAlXMk__xN7I1U","storageKey":"bimf-UXq5IFH5nNHCIHdcQ2MyJwTnwDVBb-P8hr2CZw","contentType":"application/javascript","fileExtension":".bundle"}}',
@@ -37,7 +37,7 @@ export const testUpdateBranch1: UpdateBranchObject = {
group: '16ca6dba-e63b-48b0-baa3-15a894ee9434',
message: 'fix bug',
createdAt: '2023-07-17T22:48:59.278Z',
runtimeVersion: 'exposdk:48.0.0',
runtime: { id: 'runtime-exposdk-48', version: 'exposdk:48.0.0' },
platform: 'android',
manifestFragment:
'{"extra":{"expoClient":{"ios":{"supportsTablet":true,"bundleIdentifier":"com.quintest113.updatestest4"},"web":{"favicon":"./assets/favicon.png"},"icon":"./assets/icon.png","name":"updates-test-4","slug":"updates-test-4","extra":{"eas":{"projectId":"789a8784-0186-4f41-8bd2-7f219291a2b8"}},"splash":{"image":"./assets/splash.png","resizeMode":"contain","backgroundColor":"#ffffff"},"android":{"package":"com.quintest113.updatestest4","adaptiveIcon":{"backgroundColor":"#ffffff","foregroundImage":"./assets/adaptive-icon.png"}},"updates":{"url":"https://u.expo.dev/789a8784-0186-4f41-8bd2-7f219291a2b8"},"version":"1.0.0","platforms":["ios","android"],"sdkVersion":"48.0.0","orientation":"portrait","runtimeVersion":{"policy":"sdkVersion"},"currentFullName":"@quintest113/updates-test-4","originalFullName":"@quintest113/updates-test-4","userInterfaceStyle":"light","assetBundlePatterns":["**/*"]}},"assets":[{"bundleKey":"778ffc9fe8773a878e9c30a6304784de","fileSHA256":"i2Gkx-9w3JJ1PwSUl2SC9m_UFQ7CPfx3KrZeEDc6-lU","storageKey":"idnX8z03q4vGLzhYMPaQGBADjhqvWe67_afPqJ1vGzM","contentType":"image/png","fileExtension":".png"},{"bundleKey":"376d6a4c7f622917c39feb23671ef71d","fileSHA256":"QJsG0VpGM-5viirUgoKq0M4zQ_TYyPfLhAhN5mrM54I","storageKey":"46DQ95-UdSKiRkQgt5FyXkE1FrKOT9tBZP3nS7auKlg","contentType":"image/png","fileExtension":".png"},{"bundleKey":"c79c3606a1cf168006ad3979763c7e0c","fileSHA256":"kGZm3WiTRq2iMs42ia3vkHtCV_obWT8DY40rlJf2SIQ","storageKey":"k-3xHp3vP8mR36WdccUZVPTRJKpP-zlyboWdkXCIQpQ","contentType":"image/png","fileExtension":".png"},{"bundleKey":"02bc1fa7c0313217bde2d65ccbff40c9","fileSHA256":"_6fuRbdkBbpzkhSVAI99aMneY5X0tpQdsGNGX244IyA","storageKey":"lfqeUjiWFXwowhxVDBEzxsbTOEzYxMLebljy5Bh1mpU","contentType":"image/png","fileExtension":".png"},{"bundleKey":"35ba0eaec5a4f5ed12ca16fabeae451d","fileSHA256":"hM9es7ICUPaeDkczvrTaX0F_BoKJKlrRteYlcHU8IbE","storageKey":"fMoMrsUeB5xWw_Ugn8FqGJf-M2pld2hkXKR704z0MM8","contentType":"image/png","fileExtension":".png"},{"bundleKey":"5223c8d9b0d08b82a5670fb5f71faf78","fileSHA256":"LJXowmdeeZM1_QBGuwfb2gbLfs_1HtN5IsYwnWGcxNM","storageKey":"jeqOrdQBNY4hgl04B3wtGs8QNWMDmjvbjIMUXPtOBpw","contentType":"image/png","fileExtension":".png"},{"bundleKey":"02d5848f62ade9617cf96894727d32e7","fileSHA256":"u1-8zHOj9oxS8maH-7JbShJIq1-KEV7FXnrGpEUcR-4","storageKey":"LMUvUZZpdGFb7KqaB_l9N4TXTkFn1Pw92ws9fWDNZPw","contentType":"model/gltf-binary","fileExtension":".glb"},{"bundleKey":"6013c27e421ab23c826713af3ebec891","fileSHA256":"dutQNnvzTCS4NgwvbeMbvhro5QnW0GJUeY_4rrvlcLY","storageKey":"85KB9Jr7eqz1Jwt1mYQGRzTy6ZXyO0j7ZcaLImCbzkU","contentType":"image/jpeg","fileExtension":".jpg"}],"launchAsset":{"bundleKey":"4cc2ee49988e438ac066827b809721de","fileSHA256":"ctfK72f8EdS1IQmDvJLya38RMSma16beJcMoQToZIe0","storageKey":"QdEoKuCQPvVPA71gY52wqJ9vmtV4ObnCcPE2FP4SIdo","contentType":"application/javascript","fileExtension":".bundle"}}',
@@ -73,7 +73,7 @@ export const testUpdateBranch2: UpdateBranchObject = {
group: 'e40ad156-e9af-4cc2-8e9d-c7b5c328db48',
message: 'fix bug',
createdAt: '2023-06-23T23:37:10.004Z',
runtimeVersion: 'exposdk:48.0.0',
runtime: { id: 'runtime-exposdk-48', version: 'exposdk:48.0.0' },
platform: 'ios',
manifestFragment:
'{"extra":{"expoClient":{"ios":{"supportsTablet":true,"bundleIdentifier":"com.quintest113.updatestest4"},"web":{"favicon":"./assets/favicon.png"},"icon":"./assets/icon.png","name":"updates-test-4","slug":"updates-test-4","extra":{"eas":{"projectId":"789a8784-0186-4f41-8bd2-7f219291a2b8"}},"splash":{"image":"./assets/splash.png","resizeMode":"contain","backgroundColor":"#ffffff"},"android":{"package":"com.quintest113.updatestest4","adaptiveIcon":{"backgroundColor":"#ffffff","foregroundImage":"./assets/adaptive-icon.png"}},"updates":{"url":"https://u.expo.dev/789a8784-0186-4f41-8bd2-7f219291a2b8"},"version":"1.0.0","platforms":["ios","android"],"sdkVersion":"48.0.0","orientation":"portrait","runtimeVersion":{"policy":"sdkVersion"},"currentFullName":"@quintest113/updates-test-4","originalFullName":"@quintest113/updates-test-4","userInterfaceStyle":"light","assetBundlePatterns":["**/*"]}},"assets":[{"bundleKey":"7d40544b395c5949f4646f5e150fe020","fileSHA256":"LN_rjlzN55dvcBL7jM5zryIpAp7iHU8VCf7RFIccbNg","storageKey":"Pi65ns2w9xLI5G_m9aGrJ5wK5FpWcGcInSSFwnA_0aA","contentType":"image/png","fileExtension":".png"},{"bundleKey":"cdd04e13d4ec83ff0cd13ec8dabdc341","fileSHA256":"irHji01LPI9giDYxtJo9bTPHaEHzuUcCMTlb4xn90Ks","storageKey":"oJZ9JX1m8IKNDgnIqcKOo5KUFOoa_NCaxruigZu65E0","contentType":"image/png","fileExtension":".png"},{"bundleKey":"a132ecc4ba5c1517ff83c0fb321bc7fc","fileSHA256":"K3RDqaWOksoRpXW9wRWYYVpX3eMFzYznDWAmBrMCzZg","storageKey":"X3OAkUu5P_LqyKFx1bNkA_qDQFLlSjCYNAlVEaOamHE","contentType":"image/png","fileExtension":".png"},{"bundleKey":"0ea69b5077e7c4696db85dbcba75b0e1","fileSHA256":"Pd0Hc-0n4j0leJ8wFzGzrEVa2L5aonoKG4OPicbSciU","storageKey":"FwJkAbrRNahBGX1KXnTAgiiwyzENu3D7DeEzCwmInyo","contentType":"image/png","fileExtension":".png"},{"bundleKey":"f5b790e2ac193b3d41015edb3551f9b8","fileSHA256":"vCfIss7SLYKt1AAi0hxjsgOMEDceLJB6ZWjQf6gTU4k","storageKey":"GQtYm7r0G9N3WJyrymjZ26p8eNMIb7rzqwSVgGco5EU","contentType":"image/png","fileExtension":".png"},{"bundleKey":"5223c8d9b0d08b82a5670fb5f71faf78","fileSHA256":"LJXowmdeeZM1_QBGuwfb2gbLfs_1HtN5IsYwnWGcxNM","storageKey":"jeqOrdQBNY4hgl04B3wtGs8QNWMDmjvbjIMUXPtOBpw","contentType":"image/png","fileExtension":".png"},{"bundleKey":"02d5848f62ade9617cf96894727d32e7","fileSHA256":"u1-8zHOj9oxS8maH-7JbShJIq1-KEV7FXnrGpEUcR-4","storageKey":"LMUvUZZpdGFb7KqaB_l9N4TXTkFn1Pw92ws9fWDNZPw","contentType":"model/gltf-binary","fileExtension":".glb"},{"bundleKey":"6013c27e421ab23c826713af3ebec891","fileSHA256":"dutQNnvzTCS4NgwvbeMbvhro5QnW0GJUeY_4rrvlcLY","storageKey":"85KB9Jr7eqz1Jwt1mYQGRzTy6ZXyO0j7ZcaLImCbzkU","contentType":"image/jpeg","fileExtension":".jpg"}],"launchAsset":{"bundleKey":"76ec49faddaef30ba78fe50edc5ab3d6","fileSHA256":"OLUdgP-fZI2shwGS5qlIk7nWnybL_13RJl5xR85CDBU","storageKey":"OCvI0-34zApbdo3eSGfIaQUbWdZeLeKH-nJSeedKTFs","contentType":"application/javascript","fileExtension":".bundle"}}',
@@ -99,7 +99,7 @@ export const testUpdateBranch2: UpdateBranchObject = {
group: 'e40ad156-e9af-4cc2-8e9d-c7b5c328db48',
message: 'fix bug',
createdAt: '2023-06-23T23:37:10.004Z',
runtimeVersion: 'exposdk:48.0.0',
runtime: { id: 'runtime-exposdk-48', version: 'exposdk:48.0.0' },
platform: 'android',
manifestFragment:
'{"extra":{"expoClient":{"ios":{"supportsTablet":true,"bundleIdentifier":"com.quintest113.updatestest4"},"web":{"favicon":"./assets/favicon.png"},"icon":"./assets/icon.png","name":"updates-test-4","slug":"updates-test-4","extra":{"eas":{"projectId":"789a8784-0186-4f41-8bd2-7f219291a2b8"}},"splash":{"image":"./assets/splash.png","resizeMode":"contain","backgroundColor":"#ffffff"},"android":{"package":"com.quintest113.updatestest4","adaptiveIcon":{"backgroundColor":"#ffffff","foregroundImage":"./assets/adaptive-icon.png"}},"updates":{"url":"https://u.expo.dev/789a8784-0186-4f41-8bd2-7f219291a2b8"},"version":"1.0.0","platforms":["ios","android"],"sdkVersion":"48.0.0","orientation":"portrait","runtimeVersion":{"policy":"sdkVersion"},"currentFullName":"@quintest113/updates-test-4","originalFullName":"@quintest113/updates-test-4","userInterfaceStyle":"light","assetBundlePatterns":["**/*"]}},"assets":[{"bundleKey":"778ffc9fe8773a878e9c30a6304784de","fileSHA256":"i2Gkx-9w3JJ1PwSUl2SC9m_UFQ7CPfx3KrZeEDc6-lU","storageKey":"idnX8z03q4vGLzhYMPaQGBADjhqvWe67_afPqJ1vGzM","contentType":"image/png","fileExtension":".png"},{"bundleKey":"376d6a4c7f622917c39feb23671ef71d","fileSHA256":"QJsG0VpGM-5viirUgoKq0M4zQ_TYyPfLhAhN5mrM54I","storageKey":"46DQ95-UdSKiRkQgt5FyXkE1FrKOT9tBZP3nS7auKlg","contentType":"image/png","fileExtension":".png"},{"bundleKey":"c79c3606a1cf168006ad3979763c7e0c","fileSHA256":"kGZm3WiTRq2iMs42ia3vkHtCV_obWT8DY40rlJf2SIQ","storageKey":"k-3xHp3vP8mR36WdccUZVPTRJKpP-zlyboWdkXCIQpQ","contentType":"image/png","fileExtension":".png"},{"bundleKey":"02bc1fa7c0313217bde2d65ccbff40c9","fileSHA256":"_6fuRbdkBbpzkhSVAI99aMneY5X0tpQdsGNGX244IyA","storageKey":"lfqeUjiWFXwowhxVDBEzxsbTOEzYxMLebljy5Bh1mpU","contentType":"image/png","fileExtension":".png"},{"bundleKey":"35ba0eaec5a4f5ed12ca16fabeae451d","fileSHA256":"hM9es7ICUPaeDkczvrTaX0F_BoKJKlrRteYlcHU8IbE","storageKey":"fMoMrsUeB5xWw_Ugn8FqGJf-M2pld2hkXKR704z0MM8","contentType":"image/png","fileExtension":".png"},{"bundleKey":"5223c8d9b0d08b82a5670fb5f71faf78","fileSHA256":"LJXowmdeeZM1_QBGuwfb2gbLfs_1HtN5IsYwnWGcxNM","storageKey":"jeqOrdQBNY4hgl04B3wtGs8QNWMDmjvbjIMUXPtOBpw","contentType":"image/png","fileExtension":".png"},{"bundleKey":"02d5848f62ade9617cf96894727d32e7","fileSHA256":"u1-8zHOj9oxS8maH-7JbShJIq1-KEV7FXnrGpEUcR-4","storageKey":"LMUvUZZpdGFb7KqaB_l9N4TXTkFn1Pw92ws9fWDNZPw","contentType":"model/gltf-binary","fileExtension":".glb"},{"bundleKey":"6013c27e421ab23c826713af3ebec891","fileSHA256":"dutQNnvzTCS4NgwvbeMbvhro5QnW0GJUeY_4rrvlcLY","storageKey":"85KB9Jr7eqz1Jwt1mYQGRzTy6ZXyO0j7ZcaLImCbzkU","contentType":"image/jpeg","fileExtension":".jpg"}],"launchAsset":{"bundleKey":"f4c6981626dbabcf51078d07a1611f4e","fileSHA256":"q-k1hSWl49aXpSg4jOSaVVnYFSFL6xf7HVl_TQE-ObM","storageKey":"FwK1PaZqtpL0QZIgaHsxU1AV93JhMdu9K1wZizXROAc","contentType":"application/javascript","fileExtension":".bundle"}}',
@@ -46,7 +46,11 @@ function makeInsights(
id: u.id,
group: u.group,
message: u.message,
runtimeVersion: u.runtimeVersion,
runtime: {
__typename: 'Runtime' as const,
id: `${u.id}-runtime`,
version: u.runtimeVersion,
},
platform: u.platform,
insights: {
__typename: 'UpdateInsights' as const,
@@ -48,18 +48,18 @@ describe(getProjectIdAsync, () => {
primaryAccount: {
id: 'account_id_1',
name: 'notnotbrent',
users: [{ role: Role.Owner, actor: { id: 'user_id' } }],
viewerUserPermission: { role: Role.Owner },
},
accounts: [
{
id: 'account_id_1',
name: 'notnotbrent',
users: [{ role: Role.Owner, actor: { id: 'user_id' } }],
viewerUserPermission: { role: Role.Owner },
},
{
id: 'account_id_2',
name: 'dominik',
users: [{ role: Role.ViewOnly, actor: { id: 'user_id' } }],
viewerUserPermission: { role: Role.ViewOnly },
},
],
isExpoAdmin: false,
@@ -198,12 +198,12 @@ describe(getProjectIdAsync, () => {
{
id: 'account_id_1',
name: 'notnotbrent',
users: [{ role: Role.Admin, actor: { id: 'robot_id' } }],
viewerUserPermission: { role: Role.Admin },
},
{
id: 'account_id_2',
name: 'dominik',
users: [{ role: Role.ViewOnly, actor: { id: 'robot_id' } }],
viewerUserPermission: { role: Role.ViewOnly },
},
],
isExpoAdmin: false,
@@ -423,13 +423,13 @@ describe(getProjectIdAsync, () => {
primaryAccount: {
id: 'account_id_1',
name: 'notnotbrent',
users: [{ role: Role.Owner, actor: { id: 'user_id' } }],
viewerUserPermission: { role: Role.Owner },
},
accounts: [
{
id: 'account_id_1',
name: 'notnotbrent',
users: [{ role: Role.Owner, actor: { id: 'user_id' } }],
viewerUserPermission: { role: Role.Owner },
},
],
isExpoAdmin: false,
@@ -465,7 +465,7 @@ describe(getProjectIdAsync, () => {
{
id: 'account_id_1',
name: 'notnotbrent',
users: [{ role: Role.Admin, actor: { id: 'robot_id' } }],
viewerUserPermission: { role: Role.Admin },
},
],
isExpoAdmin: false,
@@ -2,7 +2,7 @@ import { ExpoConfig } from '@expo/config';
import fs from 'fs-extra';
import { getEASUpdateURL } from '../../../api';
import { AppFragment } from '../../../graphql/generated';
import { AppFragment, Role } from '../../../graphql/generated';
import { easCliVersion } from '../../../utils/easCli';
import {
cleanAndPrefix,
@@ -62,7 +62,7 @@ describe('projectFiles', () => {
ownerAccount: {
id: 'testowner-account-id',
name: 'testowner',
users: [],
viewerUserPermission: { role: Role.Owner },
},
...overrides,
});
@@ -126,7 +126,7 @@ describe('projectFiles', () => {
ownerAccount: {
id: 'test-owner-account-id',
name: 'test-owner',
users: [],
viewerUserPermission: { role: Role.Owner },
},
});
@@ -151,7 +151,7 @@ describe('projectFiles', () => {
ownerAccount: {
id: 'test-owner-123-account-id',
name: 'test-owner-123',
users: [],
viewerUserPermission: { role: Role.Owner },
},
});
@@ -80,8 +80,7 @@ function getAccountPermissionsMap(actor: Actor): Map<string, boolean> {
const permissionsMap = new Map<string, boolean>();
for (const account of actor.accounts) {
const hasPermission =
account.users.find(it => it.actor.id === actor.id)?.role !== Role.ViewOnly;
const hasPermission = account.viewerUserPermission.role !== Role.ViewOnly;
permissionsMap.set(account.name, hasPermission);
}
@@ -1,5 +1,4 @@
import chalk from 'chalk';
import nullthrows from 'nullthrows';
import EasCommand from '../../commandUtils/EasCommand';
import { Role } from '../../graphql/generated';
@@ -52,7 +51,7 @@ export default class AccountView extends EasCommand {
return Role.Owner;
}
return nullthrows(account.users.find(user => user.actor.id === actor.id)?.role);
return account.viewerUserPermission.role;
}
private static getLabelForRole(role: Role): string {
@@ -27,8 +27,8 @@ async function cancelBuildAsync(
.mutation<CancelBuildMutation, CancelBuildMutationVariables>(
gql`
mutation CancelBuildMutation($buildId: ID!) {
build(buildId: $buildId) {
cancel {
build {
cancelBuild(buildId: $buildId) {
id
status
}
@@ -39,7 +39,7 @@ async function cancelBuildAsync(
)
.toPromise()
);
return data.build.cancel;
return data.build.cancelBuild;
}
export async function selectBuildToCancelAsync(
@@ -235,7 +235,7 @@ export default class Download extends EasCommand {
async getPathToBuildArtifactAsync(build: BuildFragment, platform: AppPlatform): Promise<string> {
const cachedBuildArtifactPath = getEasBuildRunCachedAppPath(
build.project.id,
build.app.id,
build.id,
platform
);
@@ -26,7 +26,7 @@ const insightsResponse = {
id: 'u1',
group: 'group-a',
message: 'first',
runtimeVersion: '1.0.0',
runtime: { __typename: 'Runtime' as const, id: 'u1-runtime', version: '1.0.0' },
platform: 'ios',
insights: { __typename: 'UpdateInsights' as const, id: 'u1-i', totalUniqueUsers: 200 },
},
@@ -6,6 +6,7 @@ import { AppStoreConnectApiKeyQuery } from '../../../../credentials/ios/api/grap
import { AscAppLinkMutation } from '../../../../graphql/mutations/AscAppLinkMutation';
import { AscAppLinkQuery } from '../../../../graphql/queries/AscAppLinkQuery';
import IntegrationsAscConnect from '../connect';
import { Role } from '../../../../graphql/generated';
jest.mock('../../../../graphql/queries/AscAppLinkQuery');
jest.mock('../../../../graphql/mutations/AscAppLinkMutation');
@@ -18,7 +19,12 @@ const testProjectId = 'test-project-id';
const mockMetadataConnected = {
id: testProjectId,
fullName: '@testuser/testapp',
ownerAccount: { id: 'account-id', name: 'testuser', ownerUserActor: null, users: [] },
ownerAccount: {
id: 'account-id',
name: 'testuser',
ownerUserActor: null,
viewerUserPermission: { role: Role.Owner },
},
appStoreConnectApp: {
id: 'asc-app-link-id',
ascAppIdentifier: '1234567890',
@@ -34,7 +40,12 @@ const mockMetadataConnected = {
const mockMetadataDisconnected = {
id: testProjectId,
fullName: '@testuser/testapp',
ownerAccount: { id: 'account-id', name: 'testuser', ownerUserActor: null, users: [] },
ownerAccount: {
id: 'account-id',
name: 'testuser',
ownerUserActor: null,
viewerUserPermission: { role: Role.Owner },
},
appStoreConnectApp: null,
};
@@ -8,6 +8,7 @@ import { AscAppLinkQuery } from '../../../../graphql/queries/AscAppLinkQuery';
import Log from '../../../../log';
import { toggleConfirmAsync } from '../../../../prompts';
import IntegrationsAscDisconnect from '../disconnect';
import { Role } from '../../../../graphql/generated';
jest.mock('../../../../graphql/queries/AscAppLinkQuery');
jest.mock('../../../../graphql/mutations/AscAppLinkMutation');
@@ -19,7 +20,12 @@ const testProjectId = 'test-project-id';
const mockMetadataConnected = {
id: testProjectId,
fullName: '@testuser/testapp',
ownerAccount: { id: 'account-id', name: 'testuser', ownerUserActor: null, users: [] },
ownerAccount: {
id: 'account-id',
name: 'testuser',
ownerUserActor: null,
viewerUserPermission: { role: Role.Owner },
},
appStoreConnectApp: {
id: 'asc-app-link-id',
ascAppIdentifier: '1234567890',
@@ -35,7 +41,12 @@ const mockMetadataConnected = {
const mockMetadataDisconnected = {
id: testProjectId,
fullName: '@testuser/testapp',
ownerAccount: { id: 'account-id', name: 'testuser', ownerUserActor: null, users: [] },
ownerAccount: {
id: 'account-id',
name: 'testuser',
ownerUserActor: null,
viewerUserPermission: { role: Role.Owner },
},
appStoreConnectApp: null,
};
@@ -6,6 +6,7 @@ import { ExpoGraphqlClient } from '../../../../commandUtils/context/contextUtils
import { AscAppLinkQuery } from '../../../../graphql/queries/AscAppLinkQuery';
import Log from '../../../../log';
import IntegrationsAscStatus from '../status';
import { Role } from '../../../../graphql/generated';
jest.mock('../../../../graphql/queries/AscAppLinkQuery');
jest.mock('../../../../log');
@@ -15,7 +16,12 @@ const testProjectId = 'test-project-id';
const mockMetadataConnected = {
id: testProjectId,
fullName: '@testuser/testapp',
ownerAccount: { id: 'account-id', name: 'testuser', ownerUserActor: null, users: [] },
ownerAccount: {
id: 'account-id',
name: 'testuser',
ownerUserActor: null,
viewerUserPermission: { role: Role.Owner },
},
appStoreConnectApp: {
id: 'asc-app-link-id',
ascAppIdentifier: '1234567890',
@@ -31,7 +37,12 @@ const mockMetadataConnected = {
const mockMetadataDisconnected = {
id: testProjectId,
fullName: '@testuser/testapp',
ownerAccount: { id: 'account-id', name: 'testuser', ownerUserActor: null, users: [] },
ownerAccount: {
id: 'account-id',
name: 'testuser',
ownerUserActor: null,
viewerUserPermission: { role: Role.Owner },
},
appStoreConnectApp: null,
};
@@ -9,6 +9,7 @@ import {
EnvironmentSecretType,
EnvironmentVariableScope,
EnvironmentVariableVisibility,
Role,
} from '../../../../graphql/generated';
import { ConvexMutation } from '../../../../graphql/mutations/ConvexMutation';
import { EnvironmentVariableMutation } from '../../../../graphql/mutations/EnvironmentVariableMutation';
@@ -59,7 +60,7 @@ describe(IntegrationsConvexConnect, () => {
id: testAccountId,
name: testAccountName,
ownerUserActor: null,
users: [],
viewerUserPermission: { role: Role.Owner },
},
accounts: [],
};
@@ -76,7 +77,7 @@ describe(IntegrationsConvexConnect, () => {
id: testAccountId,
name: testAccountName,
ownerUserActor: { id: 'test-user-id', username: testAccountName },
users: [{ role: 'OWNER' as any, actor: { id: 'test-user-id' } }],
viewerUserPermission: { role: 'OWNER' as any },
};
const mockConnection: ConvexTeamConnectionData = {
@@ -32,7 +32,7 @@ describe(IntegrationsConvexTeamDelete, () => {
id: testAccountId,
name: testAccountName,
ownerUserActor: { id: 'test-user-id', username: testAccountName },
users: [{ role: 'OWNER' as any, actor: { id: 'test-user-id' } }],
viewerUserPermission: { role: 'OWNER' as any },
};
const mockConnection: ConvexTeamConnectionData = {
@@ -41,7 +41,7 @@ describe(IntegrationsConvexTeamInvite, () => {
id: testAccountId,
name: testAccountName,
ownerUserActor: { id: 'test-user-id', username: testAccountName },
users: [{ role: 'OWNER' as any, actor: { id: 'test-user-id' } }],
viewerUserPermission: { role: 'OWNER' as any },
};
const mockConnection: ConvexTeamConnectionData = {
@@ -21,7 +21,7 @@ describe(IntegrationsConvexTeam, () => {
id: testAccountId,
name: testAccountName,
ownerUserActor: { id: 'test-user-id', username: testAccountName },
users: [{ role: 'OWNER' as any, actor: { id: 'test-user-id' } }],
viewerUserPermission: { role: 'OWNER' as any },
};
const mockConnection: ConvexTeamConnectionData = {
@@ -62,7 +62,12 @@ describe(IntegrationsPostHogConnect, () => {
email: '[email protected]',
featureGates: {},
isExpoAdmin: false,
primaryAccount: { id: testAccountId, name: testAccountName, ownerUserActor: null, users: [] },
primaryAccount: {
id: testAccountId,
name: testAccountName,
ownerUserActor: null,
viewerUserPermission: { role: Role.Owner },
},
accounts: [],
};
@@ -70,7 +75,7 @@ describe(IntegrationsPostHogConnect, () => {
id: testAccountId,
name: testAccountName,
ownerUserActor: { id: 'test-user-id', username: testAccountName },
users: [{ role: Role.Owner, actor: { id: 'test-user-id' } }],
viewerUserPermission: { role: Role.Owner },
};
const mockConnection: PostHogOrganizationConnectionData = {
@@ -35,7 +35,7 @@ const updateStub: UpdateFragment = {
group: 'group-1234',
branch: { id: 'branch-1234', name: 'main' },
message: 'test message',
runtimeVersion: 'exposdk:47.0.0',
runtime: { id: 'runtime-1234', version: 'exposdk:47.0.0' },
platform: 'ios',
gitCommitHash: 'commit',
isGitWorkingTreeDirty: false,
@@ -30,7 +30,7 @@ const updateStub: UpdateFragment = {
group: 'group-1234',
branch: { id: 'branch-1234', name: 'main' },
message: 'test message',
runtimeVersion: 'exposdk:47.0.0',
runtime: { id: 'runtime-1234', version: 'exposdk:47.0.0' },
platform: 'ios',
gitCommitHash: 'commit',
isGitWorkingTreeDirty: false,
@@ -154,7 +154,7 @@ describe(UpdateRepublish.name, () => {
expect.arrayContaining([
expect.objectContaining({
branchId: updateStub.branch.id,
runtimeVersion: updateStub.runtimeVersion,
runtimeVersion: updateStub.runtime.version,
updateInfoGroup: expect.objectContaining({
ios: expect.any(Object),
}),
@@ -225,7 +225,7 @@ describe(UpdateRepublish.name, () => {
expect.arrayContaining([
expect.objectContaining({
branchId: updateStub.branch.id,
runtimeVersion: updateStub.runtimeVersion,
runtimeVersion: updateStub.runtime.version,
updateInfoGroup: expect.objectContaining({
ios: expect.any(Object),
}),
@@ -270,7 +270,7 @@ describe(UpdateRepublish.name, () => {
expect.arrayContaining([
expect.objectContaining({
branchId: updateStub.branch.id,
runtimeVersion: updateStub.runtimeVersion,
runtimeVersion: updateStub.runtime.version,
updateInfoGroup: expect.objectContaining({
ios: expect.any(Object),
}),
@@ -313,7 +313,7 @@ describe(UpdateRepublish.name, () => {
expect.arrayContaining([
expect.objectContaining({
branchId: updateStub.branch.id,
runtimeVersion: updateStub.runtimeVersion,
runtimeVersion: updateStub.runtime.version,
updateInfoGroup: expect.objectContaining({
ios: expect.any(Object),
}),
@@ -357,7 +357,7 @@ describe(UpdateRepublish.name, () => {
expect.arrayContaining([
expect.objectContaining({
branchId: 'other-id',
runtimeVersion: updateStub.runtimeVersion,
runtimeVersion: updateStub.runtime.version,
updateInfoGroup: expect.objectContaining({
ios: expect.any(Object),
}),
@@ -401,7 +401,7 @@ describe(UpdateRepublish.name, () => {
expect.arrayContaining([
expect.objectContaining({
branchId: 'blah-id',
runtimeVersion: updateStub.runtimeVersion,
runtimeVersion: updateStub.runtime.version,
updateInfoGroup: expect.objectContaining({
ios: expect.any(Object),
}),
@@ -30,7 +30,7 @@ const updateStub: UpdateFragment = {
group: 'group-1234',
branch: { id: 'branch-1234', name: 'main' },
message: 'test message',
runtimeVersion: 'exposdk:47.0.0',
runtime: { id: 'runtime-1234', version: 'exposdk:47.0.0' },
platform: 'ios',
gitCommitHash: 'commit',
isGitWorkingTreeDirty: false,
@@ -24,7 +24,7 @@ const updateStub: UpdateFragment = {
group: 'group-source',
branch: { id: 'branch-1234', name: 'main' },
message: 'source message',
runtimeVersion: 'exposdk:47.0.0',
runtime: { id: 'runtime-1234', version: 'exposdk:47.0.0' },
platform: 'ios',
gitCommitHash: 'commit',
isGitWorkingTreeDirty: false,
@@ -33,7 +33,7 @@ const updateGroup = [
actor: null,
createdAt: '2026-04-09T00:00:00.000Z',
message: 'first',
runtimeVersion: '1.0.0',
runtime: { __typename: 'Runtime' as const, id: 'runtime-1', version: '1.0.0' },
platform: 'ios',
manifestPermalink: 'https://expo.dev/manifest/u1',
isRollBackToEmbedded: false,
@@ -670,7 +670,7 @@ export default class UpdatePublish extends EasCommand {
version => version.runtimeVersion
)) {
const newUpdatesForRuntimeVersion = newUpdates.filter(
update => update.runtimeVersion === runtime.runtimeVersion
update => update.runtime.version === runtime.runtimeVersion
);
if (newUpdatesForRuntimeVersion.length === 0) {
throw new Error(
@@ -322,7 +322,7 @@ export default class UpdateRevertUpdateRollout extends EasCommand {
});
const platforms = rolloutUpdateGroup.map(update => update.platform) as UpdatePublishPlatform[];
const runtimeVersion = rolloutUpdateGroup[0].runtimeVersion;
const runtimeVersion = rolloutUpdateGroup[0].runtime.version;
const targetBranch = {
name: rolloutUpdateGroup[0].branchName,
id: rolloutUpdateGroup[0].branchId,
@@ -147,7 +147,7 @@ async function getSourceUpdateGroupAsync(
return {
groupId,
branchName: arbitraryUpdate.branch.name,
runtimeVersion: arbitraryUpdate.runtimeVersion,
runtimeVersion: arbitraryUpdate.runtime.version,
};
}
@@ -60,14 +60,7 @@ export const testAppFragment: AppFragment = {
ownerAccount: {
id: 'test-account-id',
name: 'testuser',
users: [
{
role: Role.Owner,
actor: {
id: 'test-user-id',
},
},
],
viewerUserPermission: { role: Role.Owner },
},
};
@@ -11,18 +11,18 @@ export const jester: Actor = {
primaryAccount: {
id: 'jester-account-id',
name: 'jester',
users: [{ role: Role.Admin, actor: { id: 'jester-id' } }],
viewerUserPermission: { role: Role.Admin },
},
accounts: [
{
id: 'jester-account-id',
name: 'jester',
users: [{ role: Role.Admin, actor: { id: 'jester-id' } }],
viewerUserPermission: { role: Role.Admin },
},
{
id: 'other-account-id',
name: 'other',
users: [{ role: Role.ViewOnly, actor: { id: 'jester-id' } }],
viewerUserPermission: { role: Role.ViewOnly },
},
],
isExpoAdmin: false,
@@ -37,7 +37,7 @@ export const jester2 = {
{
id: 'jester2-account-id',
name: 'jester2',
users: [{ role: Role.Admin, actor: { id: 'jester2-id' } }],
viewerUserPermission: { role: Role.Admin },
},
],
isExpoAdmin: false,
@@ -52,7 +52,7 @@ export const robot: Actor = {
{
id: 'robot-account-id',
name: 'robot-account',
users: [],
viewerUserPermission: { role: Role.Owner },
},
],
isExpoAdmin: false,
@@ -60,14 +60,7 @@ export const testAppFragment: AppFragment = {
ownerAccount: {
id: 'test-account-id',
name: 'testuser',
users: [
{
role: Role.Owner,
actor: {
id: 'test-user-id',
},
},
],
viewerUserPermission: { role: Role.Owner },
},
};
@@ -1,7 +1,7 @@
import { CredentialsSource } from '@expo/eas-json';
import { vol } from 'memfs';
import { IosAppBuildCredentialsFragment } from '../../../graphql/generated';
import { IosAppBuildCredentialsFragment, Role } from '../../../graphql/generated';
import { AppQuery } from '../../../graphql/queries/AppQuery';
import { findApplicationTarget } from '../../../project/ios/target';
import { getAppstoreMock } from '../../__tests__/fixtures-appstore';
@@ -58,7 +58,7 @@ describe(IosCredentialsProvider, () => {
account: {
id: `id-${appLookupParams.account.name}`,
name: appLookupParams.account.name,
users: [],
viewerUserPermission: { role: Role.Owner },
},
projectName: appLookupParams.projectName,
},
@@ -102,7 +102,7 @@ describe(IosCredentialsProvider, () => {
account: {
id: `id-${appLookupParams.account.name}`,
name: appLookupParams.account.name,
users: [],
viewerUserPermission: { role: Role.Owner },
},
projectName: appLookupParams.projectName,
},
@@ -1,4 +1,8 @@
import { IosAppBuildCredentialsFragment, IosDistributionType } from '../../../../graphql/generated';
import {
IosAppBuildCredentialsFragment,
IosDistributionType,
Role,
} from '../../../../graphql/generated';
import { promptAsync } from '../../../../prompts';
import { getAppstoreMock, testAuthCtx } from '../../../__tests__/fixtures-appstore';
import { createCtxMock } from '../../../__tests__/fixtures-context';
@@ -43,7 +47,11 @@ describe(SetUpInternalProvisioningProfile, () => {
});
const action = new SetUpInternalProvisioningProfile({
app: {
account: { id: 'account-id', name: 'account-name', users: [] },
account: {
id: 'account-id',
name: 'account-name',
viewerUserPermission: { role: Role.Owner },
},
bundleIdentifier: 'com.expo.test',
projectName: 'testproject',
},
@@ -77,7 +85,11 @@ describe(SetUpInternalProvisioningProfile, () => {
const action = new SetUpInternalProvisioningProfile({
app: {
account: { id: 'account-id', name: 'account-name', users: [] },
account: {
id: 'account-id',
name: 'account-name',
viewerUserPermission: { role: Role.Owner },
},
bundleIdentifier: 'com.expo.test',
projectName: 'testproject',
},
@@ -118,7 +130,11 @@ describe(SetUpInternalProvisioningProfile, () => {
const action = new SetUpInternalProvisioningProfile({
app: {
account: { id: 'account-id', name: 'account-name', users: [] },
account: {
id: 'account-id',
name: 'account-name',
viewerUserPermission: { role: Role.Owner },
},
bundleIdentifier: 'com.expo.test',
projectName: 'testproject',
},
@@ -152,7 +168,11 @@ describe(SetUpInternalProvisioningProfile, () => {
const action = new SetUpInternalProvisioningProfile({
app: {
account: { id: 'account-id', name: 'account-name', users: [] },
account: {
id: 'account-id',
name: 'account-name',
viewerUserPermission: { role: Role.Owner },
},
bundleIdentifier: 'com.expo.test',
projectName: 'testproject',
},
@@ -188,7 +208,11 @@ describe(SetUpInternalProvisioningProfile, () => {
const action = new SetUpInternalProvisioningProfile({
app: {
account: { id: 'account-id', name: 'account-name', users: [] },
account: {
id: 'account-id',
name: 'account-name',
viewerUserPermission: { role: Role.Owner },
},
bundleIdentifier: 'com.expo.test',
projectName: 'testproject',
},
@@ -222,7 +246,11 @@ describe(SetUpInternalProvisioningProfile, () => {
const action = new SetUpInternalProvisioningProfile({
app: {
account: { id: 'account-id', name: 'account-name', users: [] },
account: {
id: 'account-id',
name: 'account-name',
viewerUserPermission: { role: Role.Owner },
},
bundleIdentifier: 'com.expo.test',
projectName: 'testproject',
},
@@ -255,7 +283,11 @@ describe(SetUpInternalProvisioningProfile, () => {
});
const action = new SetUpInternalProvisioningProfile({
app: {
account: { id: 'account-id', name: 'account-name', users: [] },
account: {
id: 'account-id',
name: 'account-name',
viewerUserPermission: { role: Role.Owner },
},
bundleIdentifier: 'com.expo.test',
projectName: 'testproject',
},
@@ -276,7 +308,11 @@ describe(SetUpInternalProvisioningProfile, () => {
});
const action = new SetUpInternalProvisioningProfile({
app: {
account: { id: 'account-id', name: 'account-name', users: [] },
account: {
id: 'account-id',
name: 'account-name',
viewerUserPermission: { role: Role.Owner },
},
bundleIdentifier: 'com.expo.test',
projectName: 'testproject',
},
@@ -295,7 +331,11 @@ describe(SetUpInternalProvisioningProfile, () => {
});
const action = new SetUpInternalProvisioningProfile({
app: {
account: { id: 'account-id', name: 'account-name', users: [] },
account: {
id: 'account-id',
name: 'account-name',
viewerUserPermission: { role: Role.Owner },
},
bundleIdentifier: 'com.expo.test',
projectName: 'testproject',
},
@@ -320,7 +360,11 @@ describe(SetUpInternalProvisioningProfile, () => {
});
const action = new SetUpInternalProvisioningProfile({
app: {
account: { id: 'account-id', name: 'account-name', users: [] },
account: {
id: 'account-id',
name: 'account-name',
viewerUserPermission: { role: Role.Owner },
},
bundleIdentifier: 'com.expo.test',
projectName: 'testproject',
},
@@ -76,18 +76,22 @@ export const AppleDeviceQuery = {
account {
byName(accountName: $accountName) {
id
appleTeams(appleTeamIdentifier: $appleTeamIdentifier) {
id
appleTeamIdentifier
appleTeamName
appleDevices(offset: $offset, limit: $limit) {
id
identifier
name
deviceClass
enabled
model
createdAt
appleTeamsPaginated(first: 1, filter: { appleTeamIdentifier: $appleTeamIdentifier }) {
edges {
node {
id
appleTeamIdentifier
appleTeamName
appleDevices(offset: $offset, limit: $limit) {
id
identifier
name
deviceClass
enabled
model
createdAt
}
}
}
}
}
@@ -101,7 +105,12 @@ export const AppleDeviceQuery = {
)
.toPromise()
);
const [appleTeam] = data.account.byName.appleTeams;
const appleTeam = data.account.byName.appleTeamsPaginated.edges[0]?.node;
if (!appleTeam) {
throw new Error(
`Could not find Apple team with the identifier ${appleTeamIdentifier} on account ${accountName}`
);
}
const { appleDevices } = appleTeam;
if (!appleDevices) {
throw new Error(`Could not find devices on Apple team -- ${formatAppleTeam(appleTeam)}`);
@@ -5,35 +5,100 @@ import { ExpoGraphqlClient } from '../../../../../commandUtils/context/contextUt
import { withErrorHandlingAsync } from '../../../../../graphql/client';
import {
AppleTeamByIdentifierQuery,
AppleTeamFilterInput,
AppleTeamFragment,
AppleTeamsByAccountNameQuery,
AppleTeamsByAccountNameQueryVariables,
AppleTeamsPaginatedByAccountQuery,
} from '../../../../../graphql/generated';
import { AppleTeamFragmentNode } from '../../../../../graphql/types/credentials/AppleTeam';
import { Connection } from '../../../../../utils/relay';
export const AppleTeamQuery = {
async getAllForAccountAsync(
graphqlClient: ExpoGraphqlClient,
{ accountName, offset, limit }: AppleTeamsByAccountNameQueryVariables
{
accountName,
offset,
limit,
}: { accountName: string; offset?: number | null; limit?: number | null }
): Promise<AppleTeamFragment[]> {
// appleTeamsPaginated is cursor-based, so emulate offset/limit by fetching
// pages from the start until enough nodes are collected
const start = offset ?? 0;
const teams: AppleTeamFragment[] = [];
let after: string | undefined;
while (limit == null || teams.length < start + limit) {
const connection = await AppleTeamQuery.getAllForAccountPaginatedAsync(
graphqlClient,
accountName,
{ first: 100, after }
);
teams.push(...connection.edges.map(edge => edge.node));
if (!connection.pageInfo.hasNextPage) {
break;
}
after = connection.pageInfo.endCursor ?? undefined;
}
return limit == null ? teams.slice(start) : teams.slice(start, start + limit);
},
async getAllForAccountPaginatedAsync(
graphqlClient: ExpoGraphqlClient,
accountName: string,
{
after,
first,
before,
last,
filter,
}: {
after?: string;
first?: number;
before?: string;
last?: number;
filter?: AppleTeamFilterInput;
}
): Promise<Connection<AppleTeamFragment>> {
const data = await withErrorHandlingAsync(
graphqlClient
.query<AppleTeamsByAccountNameQuery>(
.query<AppleTeamsPaginatedByAccountQuery>(
gql`
query AppleTeamsByAccountName($accountName: String!, $offset: Int, $limit: Int) {
query AppleTeamsPaginatedByAccountQuery(
$accountName: String!
$after: String
$first: Int
$before: String
$last: Int
$filter: AppleTeamFilterInput
) {
account {
byName(accountName: $accountName) {
id
appleTeams(offset: $offset, limit: $limit) {
id
...AppleTeamFragment
appleTeamsPaginated(
after: $after
first: $first
before: $before
last: $last
filter: $filter
) {
edges {
cursor
node {
id
...AppleTeamFragment
}
}
pageInfo {
hasNextPage
hasPreviousPage
startCursor
endCursor
}
}
}
}
}
${print(AppleTeamFragmentNode)}
`,
{ accountName, offset, limit },
{ accountName, after, first, before, last, filter },
{
additionalTypenames: ['AppleTeam'],
}
@@ -41,7 +106,7 @@ export const AppleTeamQuery = {
.toPromise()
);
return data.account.byName.appleTeams ?? [];
return data.account.byName.appleTeamsPaginated;
},
async getByAppleTeamIdentifierAsync(
graphqlClient: ExpoGraphqlClient,
@@ -7,6 +7,7 @@ import Log from '../../../../log';
import { IosAppCredentialsQuery } from '../../api/graphql/queries/IosAppCredentialsQuery';
import { App, Target } from '../../types';
import { displayIosCredentials } from '../printCredentials';
import { Role } from '../../../../graphql/generated';
jest.mock('../../../../log');
jest.mock('chalk', () => ({
@@ -29,7 +30,7 @@ describe('print credentials', () => {
account: {
id: 'account-id',
name: 'quinlanj',
users: [],
viewerUserPermission: { role: Role.Owner },
},
projectName: 'test52',
};
@@ -29,18 +29,18 @@ describe(AccountResolver, () => {
primaryAccount: {
id: 'account_id_777',
name: 'dominik',
users: [{ role: Role.Owner, actor: { id: 'user_id_666' } }],
viewerUserPermission: { role: Role.Owner },
},
accounts: [
{
id: 'account_id_777',
name: 'dominik',
users: [{ role: Role.Owner, actor: { id: 'user_id_666' } }],
viewerUserPermission: { role: Role.Owner },
},
{
id: 'account_id_888',
name: 'foo',
users: [{ role: Role.Owner, actor: { id: 'user_id_666' } }],
viewerUserPermission: { role: Role.Owner },
},
],
isExpoAdmin: false,
@@ -57,7 +57,7 @@ describe(AccountResolver, () => {
ownerAccount: {
id: 'account_id_888',
name: 'foo',
users: [{ role: Role.Owner, actor: { id: 'user_id_666' } }],
viewerUserPermission: { role: Role.Owner },
},
});
});
@@ -73,7 +73,7 @@ describe(AccountResolver, () => {
expect(account).toEqual({
id: user.accounts[1].id,
name: user.accounts[1].name,
users: user.accounts[1].users,
viewerUserPermission: user.accounts[1].viewerUserPermission,
});
});
@@ -40,14 +40,7 @@ describe(DeviceCreateAction, () => {
const account: AccountFragment = {
id: 'account_id',
name: 'foobar',
users: [
{
role: Role.Owner,
actor: {
id: 'user_id',
},
},
],
viewerUserPermission: { role: Role.Owner },
};
const appleTeam = {
id: 'apple-team-id',
@@ -71,14 +64,7 @@ describe(DeviceCreateAction, () => {
const account: AccountFragment = {
id: 'account_id',
name: 'foobar',
users: [
{
role: Role.Owner,
actor: {
id: 'user_id',
},
},
],
viewerUserPermission: { role: Role.Owner },
};
const appleTeam = {
id: 'apple-team-id',
@@ -102,14 +88,7 @@ describe(DeviceCreateAction, () => {
const account: AccountFragment = {
id: 'account_id',
name: 'foobar',
users: [
{
role: Role.Owner,
actor: {
id: 'user_id',
},
},
],
viewerUserPermission: { role: Role.Owner },
};
const appleTeam = {
id: 'apple-team-id',
@@ -133,14 +112,7 @@ describe(DeviceCreateAction, () => {
const account: AccountFragment = {
id: 'account_id',
name: 'foobar',
users: [
{
role: Role.Owner,
actor: {
id: 'user_id',
},
},
],
viewerUserPermission: { role: Role.Owner },
};
const appleTeam = {
id: 'apple-team-id',
+324 -421
View File
File diff suppressed because it is too large. Load diff
@@ -52,7 +52,10 @@ export const ChannelInsightsQuery = {
id
group
message
runtimeVersion
runtime {
id
version
}
platform
insights {
id
@@ -10,10 +10,7 @@ export const AccountFragmentNode = gql`
id
username
}
users {
actor {
id
}
viewerUserPermission {
role
}
}
+13 -8
View File
@@ -30,26 +30,31 @@ export const BuildFragmentNode = gql`
displayName
}
logFiles
project {
app {
__typename
id
name
slug
... on App {
ownerAccount {
id
name
}
ownerAccount {
id
name
}
}
channel
updateChannel {
id
name
}
distribution
iosEnterpriseProvisioning
buildProfile
appIdentifier
sdkVersion
appVersion
appBuildVersion
runtimeVersion
runtime {
id
version
}
gitCommitHash
gitCommitMessage
initialQueuePosition
@@ -15,7 +15,6 @@ export const SubmissionFragmentNode = gql`
}
}
androidConfig {
applicationIdentifier
track
releaseStatus
rollout
+4 -1
View File
@@ -6,7 +6,10 @@ export const UpdateFragmentNode = gql`
group
message
createdAt
runtimeVersion
runtime {
id
version
}
platform
manifestFragment
isRollBackToEmbedded
@@ -7,11 +7,17 @@ import {
formatAscAppLinkStatus,
isAscAuthenticationError,
} from '../utils';
import { Role } from '../../../graphql/generated';
const mockMetadataConnected = {
id: 'app-id',
fullName: '@testuser/testapp',
ownerAccount: { id: 'account-id', name: 'testuser', ownerUserActor: null, users: [] },
ownerAccount: {
id: 'account-id',
name: 'testuser',
ownerUserActor: null,
viewerUserPermission: { role: Role.Owner },
},
appStoreConnectApp: {
id: 'asc-app-link-id',
ascAppIdentifier: '1234567890',
@@ -27,7 +33,12 @@ const mockMetadataConnected = {
const mockMetadataDisconnected = {
id: 'app-id',
fullName: '@testuser/testapp',
ownerAccount: { id: 'account-id', name: 'testuser', ownerUserActor: null, users: [] },
ownerAccount: {
id: 'account-id',
name: 'testuser',
ownerUserActor: null,
viewerUserPermission: { role: Role.Owner },
},
appStoreConnectApp: null,
};
@@ -13,26 +13,26 @@ const userActor: Actor = {
primaryAccount: {
id: 'account-id-personal',
name: 'jane',
users: [{ role: Role.Owner, actor: { id: 'user-id' } }],
viewerUserPermission: { role: Role.Owner },
},
accounts: [
{
id: 'account-id-org',
name: 'acme',
ownerUserActor: null,
users: [{ role: Role.ViewOnly, actor: { id: 'user-id' } }],
viewerUserPermission: { role: Role.ViewOnly },
},
{
id: 'account-id-personal',
name: 'jane',
ownerUserActor: { id: 'user-id' },
users: [{ role: Role.Owner, actor: { id: 'user-id' } }],
viewerUserPermission: { role: Role.Owner },
},
{
id: 'account-id-team',
name: 'bob',
ownerUserActor: { id: 'other-user-id' },
users: [{ role: Role.Admin, actor: { id: 'user-id' } }],
viewerUserPermission: { role: Role.Admin },
},
],
isExpoAdmin: false,
@@ -46,12 +46,12 @@ const robotActor: Actor = {
{
id: 'account-id-1',
name: 'acme',
users: [{ role: Role.Admin, actor: { id: 'robot-id' } }],
viewerUserPermission: { role: Role.Admin },
},
{
id: 'account-id-2',
name: 'other-org',
users: [{ role: Role.ViewOnly, actor: { id: 'robot-id' } }],
viewerUserPermission: { role: Role.ViewOnly },
},
],
isExpoAdmin: false,
@@ -87,7 +87,7 @@ describe(getAccountChoices, () => {
id: 'account-id-personal',
name: 'jane',
ownerUserActor: { id: 'user-id' },
users: [{ role: Role.ViewOnly, actor: { id: 'user-id' } }],
viewerUserPermission: { role: Role.ViewOnly },
},
],
} as any as Actor;
@@ -6,9 +6,7 @@ export function getAccountNamesWhereUserHasSufficientPermissionsToCreateApp(
actor: Actor
): Set<string> {
return new Set(
actor.accounts
.filter(a => a.users.find(it => it.actor.id === actor.id)?.role !== Role.ViewOnly)
.map(it => it.name)
actor.accounts.filter(a => a.viewerUserPermission.role !== Role.ViewOnly).map(it => it.name)
);
}
@@ -33,9 +33,7 @@ export async function fetchOrCreateProjectIDForWriteToConfigWithConfirmationAsyn
const allAccounts = actor.accounts;
const accountNamesWhereUserHasSufficientPublishPermissions = new Set(
allAccounts
.filter(a => a.users.find(it => it.actor.id === actor.id)?.role !== Role.ViewOnly)
.map(it => it.name)
allAccounts.filter(a => a.viewerUserPermission.role !== Role.ViewOnly).map(it => it.name)
);
if (options.nonInteractive) {
+4 -4
View File
@@ -348,11 +348,11 @@ function formatBuildChoice(build: BuildFragment): prompts.Choice {
const {
id,
updatedAt,
runtimeVersion,
runtime,
buildProfile,
gitCommitHash,
gitCommitMessage,
channel,
updateChannel,
message,
status,
} = build;
@@ -370,8 +370,8 @@ function formatBuildChoice(build: BuildFragment): prompts.Choice {
const descriptionItems: { name: string; value: string | null }[] = [
{ name: 'Profile', value: buildProfile ? chalk.bold(buildProfile) : null },
{ name: 'Channel', value: channel ? chalk.bold(channel) : null },
{ name: 'Runtime version', value: runtimeVersion ? chalk.bold(runtimeVersion) : null },
{ name: 'Channel', value: updateChannel ? chalk.bold(updateChannel.name) : null },
{ name: 'Runtime version', value: runtime ? chalk.bold(runtime.version) : null },
{ name: 'Commit', value: formattedCommitData },
{
name: 'Message',
+1 -1
View File
@@ -99,7 +99,7 @@ function toEasBuildLinkage(
return {
easSubmissionId: easSubmission?.id ?? null,
easBuildId: easSubmission?.submittedBuild?.id ?? null,
runtimeVersion: easSubmission?.submittedBuild?.runtimeVersion ?? null,
runtimeVersion: easSubmission?.submittedBuild?.runtime?.version ?? null,
fingerprintHash: easSubmission?.submittedBuild?.fingerprint?.hash ?? null,
};
}
@@ -49,7 +49,7 @@ export function formatGraphQLSubmission(submission: SubmissionWithSubmittedBuild
? [
{
label: 'Application Identifier',
value: sanitize(submission.androidConfig?.applicationIdentifier),
value: sanitize(submittedBuild?.appIdentifier),
},
{ label: 'Track', value: sanitize(submission.androidConfig?.track)?.toLowerCase() },
{
@@ -65,7 +65,7 @@ export function formatGraphQLSubmission(submission: SubmissionWithSubmittedBuild
label: submission.platform === AppPlatform.Android ? 'Version code' : 'Build number',
value: sanitize(submittedBuild?.appBuildVersion),
},
{ label: 'Runtime Version', value: sanitize(submittedBuild?.runtimeVersion) },
{ label: 'Runtime Version', value: sanitize(submittedBuild?.runtime?.version) },
{ label: 'Fingerprint', value: submittedBuild?.fingerprint?.hash },
{ label: 'Commit', value: sanitize(submittedBuild?.gitCommitHash) },
{ label: 'Error Code', value: sanitize(submission.error?.errorCode) },
@@ -161,6 +161,7 @@ function mockUpdateChannel({
pageInfo: { hasNextPage: false, hasPreviousPage: false },
},
embeddedUpdateCount: 0,
isProtected: false,
latestRuntimes: { edges: [], pageInfo: { hasNextPage: false, hasPreviousPage: false } },
runtimeInsights: {} as UpdateChannelRuntimeInsights,
name: channelName ?? 'default-channel-name',
+1 -1
View File
@@ -202,7 +202,7 @@ export async function selectUpdateGroupOnBranchAsync(
.map(group => {
const first = group[0];
return first
? `${first.group} (runtime: ${first.runtimeVersion}, message: ${first.message ?? 'N/A'})`
? `${first.group} (runtime: ${first.runtime.version}, message: ${first.message ?? 'N/A'})`
: 'unknown';
})
.join('\n ');
+3 -3
View File
@@ -71,7 +71,7 @@ export async function republishAsync({
update.groupId === arbitraryUpdate.groupId &&
update.branchId === arbitraryUpdate.branchId &&
update.branchName === arbitraryUpdate.branchName &&
update.runtimeVersion === arbitraryUpdate.runtimeVersion &&
update.runtime.version === arbitraryUpdate.runtime.version &&
update.manifestHostOverride === arbitraryUpdate.manifestHostOverride &&
update.assetHostOverride === arbitraryUpdate.assetHostOverride;
assert(
@@ -90,7 +90,7 @@ export async function republishAsync({
'Cannot republish an update that is being rolled-out. Either complete the update rollout and then republish or publish a new rollout update.'
);
const { runtimeVersion } = arbitraryUpdate;
const runtimeVersion = arbitraryUpdate.runtime.version;
// If codesigning was created for the original update, we need to add it to the republish.
// If one wishes to not sign the republish or sign with a different key, a normal publish should
@@ -246,7 +246,7 @@ export async function republishAsync({
Log.log(
formatFields([
{ label: 'Branch', value: targetBranchName },
{ label: 'Runtime version', value: arbitraryRepublishedUpdate.runtimeVersion },
{ label: 'Runtime version', value: arbitraryRepublishedUpdate.runtime.version },
{ label: 'Platform', value: updatesRepublished.map(update => update.platform).join(', ') },
{ label: 'Update group ID', value: arbitraryRepublishedUpdate.group },
...(updatesRepublishedByPlatform.android
@@ -84,7 +84,7 @@ export async function publishRollBackToEmbeddedUpdateAsync({
version => version.runtimeVersion
)) {
const newUpdatesForRuntimeVersion = newUpdates.filter(
update => update.runtimeVersion === runtime.runtimeVersion
update => update.runtime.version === runtime.runtimeVersion
);
if (newUpdatesForRuntimeVersion.length === 0) {
throw new Error(
+9 -16
View File
@@ -34,16 +34,9 @@ export type FormatUpdateParameter = Pick<Update, 'id' | 'createdAt' | 'message'>
| null;
};
export type UpdateJsonInfo = { branch: string } & Pick<
export type UpdateJsonInfo = { branch: string; runtimeVersion: string } & Pick<
UpdateFragment,
| 'id'
| 'createdAt'
| 'group'
| 'message'
| 'runtimeVersion'
| 'platform'
| 'manifestPermalink'
| 'gitCommitHash'
'id' | 'createdAt' | 'group' | 'message' | 'platform' | 'manifestPermalink' | 'gitCommitHash'
>;
export type UpdateGroupDescription = FormatUpdateParameter & {
@@ -191,7 +184,7 @@ export function ensureValidVersions(exp: ExpoConfig, platform: RequestedPlatform
}
export function formatUpdateTitle(update: UpdateFragment): string {
const { message, createdAt, actor, runtimeVersion } = update;
const { message, createdAt, actor, runtime } = update;
let actorName: string;
switch (actor?.__typename) {
@@ -213,7 +206,7 @@ export function formatUpdateTitle(update: UpdateFragment): string {
return `[${dateFormat(
createdAt,
'mmm dd HH:MM'
)} by ${actorName}, runtimeVersion: ${runtimeVersion}] ${message}`;
)} by ${actorName}, runtimeVersion: ${runtime.version}] ${message}`;
}
export function getUpdateJsonInfosForUpdates(updates: UpdateFragment[]): UpdateJsonInfo[] {
@@ -223,7 +216,7 @@ export function getUpdateJsonInfosForUpdates(updates: UpdateFragment[]): UpdateJ
group: update.group,
branch: update.branch.name,
message: update.message,
runtimeVersion: update.runtimeVersion,
runtimeVersion: update.runtime.version,
platform: update.platform,
manifestPermalink: update.manifestPermalink,
isRollBackToEmbedded: update.isRollBackToEmbedded,
@@ -236,7 +229,7 @@ export function getUpdateGroupDescriptions(
): FormattedUpdateGroupDescription[] {
return updateGroups.map(updateGroup => ({
message: formatUpdateMessage(updateGroup[0]),
runtimeVersion: updateGroup[0].runtimeVersion,
runtimeVersion: updateGroup[0].runtime.version,
isRollBackToEmbedded: updateGroup[0].isRollBackToEmbedded,
rolloutPercentage: updateGroup[0].rolloutPercentage ?? undefined,
codeSigningKey: updateGroup[0].codeSigningInfo?.keyid,
@@ -251,7 +244,7 @@ export function getUpdateGroupDescriptionsWithBranch(
return updateGroups.map(updateGroup => ({
branch: updateGroup[0].branch.name,
message: formatUpdateMessage(updateGroup[0]),
runtimeVersion: updateGroup[0].runtimeVersion,
runtimeVersion: updateGroup[0].runtime.version,
isRollBackToEmbedded: updateGroup[0].isRollBackToEmbedded,
rolloutPercentage: updateGroup[0].rolloutPercentage ?? undefined,
codeSigningKey: updateGroup[0].codeSigningInfo?.keyid,
@@ -270,7 +263,7 @@ export function getBranchDescription(branch: UpdateBranchFragment): FormattedBra
branch: branch.name,
update: {
message: formatUpdateMessage(latestUpdate),
runtimeVersion: latestUpdate.runtimeVersion,
runtimeVersion: latestUpdate.runtime.version,
isRollBackToEmbedded: latestUpdate.isRollBackToEmbedded,
rolloutPercentage: latestUpdate.rolloutPercentage ?? undefined,
codeSigningKey: latestUpdate.codeSigningInfo?.keyid,
@@ -322,7 +315,7 @@ export async function prewarmDiffingAsync(
appId,
branchName: update.branch.name,
platform: updatePublishPlatformToAppPlatform[updatePublishPlatform],
runtimeVersion: update.runtimeVersion,
runtimeVersion: update.runtime.version,
limit: 2,
});
if (updateIds.length !== 2) {
+1 -1
View File
@@ -9,7 +9,7 @@ export type Actor = NonNullable<CurrentUserQuery['meActor']>;
*/
export function getCreatableAccountNames(actor: Actor): string[] {
const creatableAccounts = actor.accounts.filter(
a => a.users.find(it => it.actor.id === actor.id)?.role !== Role.ViewOnly
a => a.viewerUserPermission.role !== Role.ViewOnly
);
if (actor.__typename === 'Robot') {
return creatableAccounts.map(it => it.name);
@@ -9,13 +9,13 @@ const userStub: Actor = {
primaryAccount: {
id: 'account_id_777',
name: 'username',
users: [{ role: Role.Owner, actor: { id: 'userId' } }],
viewerUserPermission: { role: Role.Owner },
},
accounts: [
{
id: 'account_id_777',
name: 'username',
users: [{ role: Role.Owner, actor: { id: 'userId' } }],
viewerUserPermission: { role: Role.Owner },
},
],
isExpoAdmin: false,
@@ -29,13 +29,13 @@ const ssoUserStub: Actor = {
primaryAccount: {
id: 'account_id_888',
name: 'ssoUsername',
users: [{ role: Role.Owner, actor: { id: 'ssoUserId' } }],
viewerUserPermission: { role: Role.Owner },
},
accounts: [
{
id: 'account_id_888',
name: 'ssoUsername',
users: [{ role: Role.Owner, actor: { id: 'ssoUserId' } }],
viewerUserPermission: { role: Role.Owner },
},
],
isExpoAdmin: false,
@@ -81,24 +81,24 @@ describe('getCreatableAccountNames', () => {
{
id: 'account_id_1',
name: 'some-org',
users: [{ role: Role.Owner, actor: { id: 'userId' } }],
viewerUserPermission: { role: Role.Owner },
},
{
id: 'account_id_2',
name: 'other-user-team',
ownerUserActor: { id: 'otherUserId', username: 'other-user' },
users: [{ role: Role.Admin, actor: { id: 'userId' } }],
viewerUserPermission: { role: Role.Admin },
},
{
id: 'account_id_3',
name: 'view-only-org',
users: [{ role: Role.ViewOnly, actor: { id: 'userId' } }],
viewerUserPermission: { role: Role.ViewOnly },
},
{
id: 'account_id_4',
name: 'username',
ownerUserActor: { id: 'userId', username: 'username' },
users: [{ role: Role.Owner, actor: { id: 'userId' } }],
viewerUserPermission: { role: Role.Owner },
},
],
};
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@expo/eas-json",
"version": "21.6.0",
"version": "22.0.0",
"description": "A library for interacting with eas.json",
"homepage": "https://github.com/expo/eas-cli",
"bugs": "https://github.com/expo/eas-cli/issues",
@@ -32,7 +32,7 @@
},
"dependencies": {
"@babel/code-frame": "7.23.5",
"@expo/eas-build-job": "21.6.0",
"@expo/eas-build-job": "22.0.0",
"chalk": "4.1.2",
"env-string": "1.0.1",
"fs-extra": "11.2.0",
+5 -5
View File
@@ -1,6 +1,6 @@
{
"name": "eas-cli-local-build-plugin",
"version": "21.8.0",
"version": "22.0.0",
"description": "Tool for running EAS compatible builds on a local machine.",
"bugs": "https://github.com/expo/eas-cli/issues",
"license": "BUSL-1.1",
@@ -26,11 +26,11 @@
"clean": "rimraf node_modules dist coverage \"*.tsbuildinfo\""
},
"dependencies": {
"@expo/build-tools": "21.8.0",
"@expo/eas-build-job": "21.6.0",
"@expo/logger": "21.0.0",
"@expo/build-tools": "22.0.0",
"@expo/eas-build-job": "22.0.0",
"@expo/logger": "22.0.0",
"@expo/spawn-async": "^1.7.2",
"@expo/turtle-spawn": "21.0.0",
"@expo/turtle-spawn": "22.0.0",
"bunyan": "^1.8.15",
"chalk": "4.1.2",
"env-paths": "^2.2.1",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@expo/logger",
"version": "21.0.0",
"version": "22.0.0",
"bugs": "https://github.com/expo/eas-cli/issues",
"license": "BUSL-1.1",
"author": "Expo <[email protected]>",
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@expo/steps",
"version": "21.7.1",
"version": "22.0.0",
"bugs": "https://github.com/expo/eas-cli/issues",
"license": "BUSL-1.1",
"author": "Expo <[email protected]>",
@@ -27,8 +27,8 @@
"clean": "rimraf node_modules dist coverage \"*.tsbuildinfo\""
},
"dependencies": {
"@expo/eas-build-job": "21.6.0",
"@expo/logger": "21.0.0",
"@expo/eas-build-job": "22.0.0",
"@expo/logger": "22.0.0",
"@expo/spawn-async": "^1.7.2",
"arg": "^5.0.2",
"fast-glob": "^3.3.2",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@expo/template-file",
"version": "21.0.2",
"version": "22.0.0",
"bugs": "https://github.com/expo/eas-cli/issues",
"license": "BUSL-1.1",
"author": "Expo <[email protected]>",
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@expo/turtle-spawn",
"version": "21.0.0",
"version": "22.0.0",
"bugs": "https://github.com/expo/eas-cli/issues",
"license": "BUSL-1.1",
"author": "Expo <[email protected]>",
@@ -25,7 +25,7 @@
"clean": "rimraf node_modules dist coverage \"*.tsbuildinfo\""
},
"dependencies": {
"@expo/logger": "21.0.0",
"@expo/logger": "22.0.0",
"@expo/spawn-async": "^1.7.2"
},
"devDependencies": {
+8 -8
View File
@@ -1,6 +1,6 @@
{
"name": "@expo/worker",
"version": "21.8.0",
"version": "22.0.0",
"private": true,
"scripts": {
"start": "yarn watch",
@@ -19,18 +19,18 @@
},
"dependencies": {
"@babel/core": "7.24.7",
"@expo/build-tools": "21.8.0",
"@expo/build-tools": "22.0.0",
"@expo/config-plugins": "55.0.7",
"@expo/config-types": "55.0.5",
"@expo/downloader": "21.0.0",
"@expo/eas-build-job": "21.6.0",
"@expo/logger": "21.0.0",
"@expo/downloader": "22.0.0",
"@expo/eas-build-job": "22.0.0",
"@expo/logger": "22.0.0",
"@expo/results": "1.0.0",
"@expo/rudder-sdk-node": "1.1.1",
"@expo/spawn-async": "1.7.2",
"@expo/steps": "21.7.1",
"@expo/template-file": "21.0.2",
"@expo/turtle-spawn": "21.0.0",
"@expo/steps": "22.0.0",
"@expo/template-file": "22.0.0",
"@expo/turtle-spawn": "22.0.0",
"@hapi/boom": "10.0.1",
"check-disk-space": "3.4.0",
"fast-glob": "3.3.2",
Generated
+36 -36
View File
@@ -2291,24 +2291,24 @@ __metadata:
languageName: node
linkType: hard
"@expo/build-tools@npm:21.8.0, @expo/build-tools@workspace:packages/build-tools":
"@expo/build-tools@npm:22.0.0, @expo/build-tools@workspace:packages/build-tools":
version: 0.0.0-use.local
resolution: "@expo/build-tools@workspace:packages/build-tools"
dependencies:
"@expo/config": "npm:55.0.10"
"@expo/config-plugins": "npm:55.0.7"
"@expo/downloader": "npm:21.0.0"
"@expo/eas-build-job": "npm:21.6.0"
"@expo/downloader": "npm:22.0.0"
"@expo/eas-build-job": "npm:22.0.0"
"@expo/env": "npm:^0.4.0"
"@expo/logger": "npm:21.0.0"
"@expo/logger": "npm:22.0.0"
"@expo/package-manager": "npm:1.9.10"
"@expo/plist": "npm:^0.3.5"
"@expo/repack-app": "npm:~0.6.1"
"@expo/results": "npm:^1.0.0"
"@expo/spawn-async": "npm:1.7.2"
"@expo/steps": "npm:21.7.1"
"@expo/template-file": "npm:21.0.2"
"@expo/turtle-spawn": "npm:21.0.0"
"@expo/steps": "npm:22.0.0"
"@expo/template-file": "npm:22.0.0"
"@expo/turtle-spawn": "npm:22.0.0"
"@expo/xcpretty": "npm:^4.3.1"
"@ngrok/ngrok": "npm:1.7.0"
"@sentry/node": "npm:7.77.0"
@@ -2531,7 +2531,7 @@ __metadata:
languageName: node
linkType: hard
"@expo/downloader@npm:21.0.0, @expo/downloader@workspace:packages/downloader":
"@expo/downloader@npm:22.0.0, @expo/downloader@workspace:packages/downloader":
version: 0.0.0-use.local
resolution: "@expo/downloader@workspace:packages/downloader"
dependencies:
@@ -2547,13 +2547,13 @@ __metadata:
languageName: unknown
linkType: soft
"@expo/eas-build-job@npm:21.6.0, @expo/eas-build-job@workspace:packages/eas-build-job":
"@expo/eas-build-job@npm:22.0.0, @expo/eas-build-job@workspace:packages/eas-build-job":
version: 0.0.0-use.local
resolution: "@expo/eas-build-job@workspace:packages/eas-build-job"
dependencies:
"@expo/logger": "npm:21.0.0"
"@expo/logger": "npm:22.0.0"
"@expo/results": "npm:1.0.0"
"@expo/turtle-spawn": "npm:21.0.0"
"@expo/turtle-spawn": "npm:22.0.0"
"@types/jest": "npm:^29.5.12"
"@types/node": "npm:20.14.2"
jest: "npm:^29.7.0"
@@ -2566,12 +2566,12 @@ __metadata:
languageName: unknown
linkType: soft
"@expo/eas-json@npm:21.6.0, @expo/eas-json@workspace:packages/eas-json":
"@expo/eas-json@npm:22.0.0, @expo/eas-json@workspace:packages/eas-json":
version: 0.0.0-use.local
resolution: "@expo/eas-json@workspace:packages/eas-json"
dependencies:
"@babel/code-frame": "npm:7.23.5"
"@expo/eas-build-job": "npm:21.6.0"
"@expo/eas-build-job": "npm:22.0.0"
"@tsconfig/node20": "npm:20.1.8"
"@types/babel__code-frame": "npm:7.0.3"
"@types/fs-extra": "npm:11.0.4"
@@ -2685,7 +2685,7 @@ __metadata:
languageName: node
linkType: hard
"@expo/logger@npm:21.0.0, @expo/logger@workspace:packages/logger":
"@expo/logger@npm:22.0.0, @expo/logger@workspace:packages/logger":
version: 0.0.0-use.local
resolution: "@expo/logger@workspace:packages/logger"
dependencies:
@@ -2884,12 +2884,12 @@ __metadata:
languageName: node
linkType: hard
"@expo/steps@npm:21.7.1, @expo/steps@workspace:packages/steps":
"@expo/steps@npm:22.0.0, @expo/steps@workspace:packages/steps":
version: 0.0.0-use.local
resolution: "@expo/steps@workspace:packages/steps"
dependencies:
"@expo/eas-build-job": "npm:21.6.0"
"@expo/logger": "npm:21.0.0"
"@expo/eas-build-job": "npm:22.0.0"
"@expo/logger": "npm:22.0.0"
"@expo/spawn-async": "npm:^1.7.2"
"@jest/globals": "npm:^29.7.0"
"@types/jest": "npm:^29.5.12"
@@ -2916,7 +2916,7 @@ __metadata:
languageName: unknown
linkType: soft
"@expo/template-file@npm:21.0.2, @expo/template-file@workspace:packages/template-file":
"@expo/template-file@npm:22.0.0, @expo/template-file@workspace:packages/template-file":
version: 0.0.0-use.local
resolution: "@expo/template-file@workspace:packages/template-file"
dependencies:
@@ -2939,11 +2939,11 @@ __metadata:
languageName: node
linkType: hard
"@expo/turtle-spawn@npm:21.0.0, @expo/turtle-spawn@workspace:packages/turtle-spawn":
"@expo/turtle-spawn@npm:22.0.0, @expo/turtle-spawn@workspace:packages/turtle-spawn":
version: 0.0.0-use.local
resolution: "@expo/turtle-spawn@workspace:packages/turtle-spawn"
dependencies:
"@expo/logger": "npm:21.0.0"
"@expo/logger": "npm:22.0.0"
"@expo/spawn-async": "npm:^1.7.2"
"@types/jest": "npm:^29.5.12"
"@types/node": "npm:20.14.2"
@@ -2959,18 +2959,18 @@ __metadata:
resolution: "@expo/worker@workspace:packages/worker"
dependencies:
"@babel/core": "npm:7.24.7"
"@expo/build-tools": "npm:21.8.0"
"@expo/build-tools": "npm:22.0.0"
"@expo/config-plugins": "npm:55.0.7"
"@expo/config-types": "npm:55.0.5"
"@expo/downloader": "npm:21.0.0"
"@expo/eas-build-job": "npm:21.6.0"
"@expo/logger": "npm:21.0.0"
"@expo/downloader": "npm:22.0.0"
"@expo/eas-build-job": "npm:22.0.0"
"@expo/logger": "npm:22.0.0"
"@expo/results": "npm:1.0.0"
"@expo/rudder-sdk-node": "npm:1.1.1"
"@expo/spawn-async": "npm:1.7.2"
"@expo/steps": "npm:21.7.1"
"@expo/template-file": "npm:21.0.2"
"@expo/turtle-spawn": "npm:21.0.0"
"@expo/steps": "npm:22.0.0"
"@expo/template-file": "npm:22.0.0"
"@expo/turtle-spawn": "npm:22.0.0"
"@hapi/boom": "npm:10.0.1"
"@types/babel__core": "npm:7.20.5"
"@types/fs-extra": "npm:11.0.4"
@@ -9724,7 +9724,7 @@ __metadata:
resolution: "create-eas-build-function@workspace:packages/create-eas-build-function"
dependencies:
"@expo/package-manager": "npm:1.9.10"
"@expo/steps": "npm:21.7.1"
"@expo/steps": "npm:22.0.0"
"@jest/globals": "npm:^29.7.0"
"@types/jest": "npm:^29.5.12"
"@types/node": "npm:20.14.2"
@@ -10297,11 +10297,11 @@ __metadata:
version: 0.0.0-use.local
resolution: "eas-cli-local-build-plugin@workspace:packages/local-build-plugin"
dependencies:
"@expo/build-tools": "npm:21.8.0"
"@expo/eas-build-job": "npm:21.6.0"
"@expo/logger": "npm:21.0.0"
"@expo/build-tools": "npm:22.0.0"
"@expo/eas-build-job": "npm:22.0.0"
"@expo/logger": "npm:22.0.0"
"@expo/spawn-async": "npm:^1.7.2"
"@expo/turtle-spawn": "npm:21.0.0"
"@expo/turtle-spawn": "npm:22.0.0"
"@types/bunyan": "npm:^1.8.11"
"@types/fs-extra": "npm:^11.0.4"
"@types/hapi__joi": "npm:^17.1.14"
@@ -10355,11 +10355,11 @@ __metadata:
"@expo/code-signing-certificates": "npm:0.0.5"
"@expo/config": "npm:55.0.10"
"@expo/config-plugins": "npm:55.0.7"
"@expo/eas-build-job": "npm:21.6.0"
"@expo/eas-json": "npm:21.6.0"
"@expo/eas-build-job": "npm:22.0.0"
"@expo/eas-json": "npm:22.0.0"
"@expo/env": "npm:^1.0.0"
"@expo/json-file": "npm:8.3.3"
"@expo/logger": "npm:21.0.0"
"@expo/logger": "npm:22.0.0"
"@expo/multipart-body-parser": "npm:2.0.0"
"@expo/osascript": "npm:2.1.4"
"@expo/package-manager": "npm:1.9.10"
@@ -10371,7 +10371,7 @@ __metadata:
"@expo/results": "npm:1.0.0"
"@expo/rudder-sdk-node": "npm:1.1.1"
"@expo/spawn-async": "npm:1.7.2"
"@expo/steps": "npm:21.7.1"
"@expo/steps": "npm:22.0.0"
"@expo/timeago.js": "npm:1.0.0"
"@graphql-codegen/cli": "npm:6.3.1"
"@graphql-codegen/introspection": "npm:5.0.2"