@expo/build-tools 1.0.60 → 1.0.62
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/steps/easFunctions.js +6 -0
- package/dist/steps/easFunctions.js.map +1 -1
- package/dist/steps/functions/installMaestro.d.ts +2 -0
- package/dist/steps/functions/installMaestro.js +182 -0
- package/dist/steps/functions/installMaestro.js.map +1 -0
- package/dist/steps/functions/startAndroidEmulator.d.ts +2 -0
- package/dist/steps/functions/startAndroidEmulator.js +126 -0
- package/dist/steps/functions/startAndroidEmulator.js.map +1 -0
- package/dist/steps/functions/startIosSimulator.d.ts +2 -0
- package/dist/steps/functions/startIosSimulator.js +95 -0
- package/dist/steps/functions/startIosSimulator.js.map +1 -0
- package/dist/steps/functions/uploadArtifact.js +24 -1
- package/dist/steps/functions/uploadArtifact.js.map +1 -1
- package/dist/steps/utils/expoUpdates.js +3 -2
- package/dist/steps/utils/expoUpdates.js.map +1 -1
- package/dist/utils/expoUpdates.d.ts +1 -0
- package/dist/utils/expoUpdates.js +12 -4
- package/dist/utils/expoUpdates.js.map +1 -1
- package/dist/utils/getExpoUpdatesPackageVersionIfInstalledAsync.d.ts +1 -0
- package/dist/utils/getExpoUpdatesPackageVersionIfInstalledAsync.js +17 -0
- package/dist/utils/getExpoUpdatesPackageVersionIfInstalledAsync.js.map +1 -0
- package/dist/utils/retry.d.ts +11 -0
- package/dist/utils/retry.js +25 -0
- package/dist/utils/retry.js.map +1 -0
- package/package.json +4 -3
- package/dist/utils/isExpoUpdatesInstalled.d.ts +0 -1
- package/dist/utils/isExpoUpdatesInstalled.js +0 -14
- package/dist/utils/isExpoUpdatesInstalled.js.map +0 -1
|
@@ -16,6 +16,9 @@ const configureIosCredentials_1 = require("./functions/configureIosCredentials")
|
|
|
16
16
|
const configureIosVersion_1 = require("./functions/configureIosVersion");
|
|
17
17
|
const generateGymfileFromTemplate_1 = require("./functions/generateGymfileFromTemplate");
|
|
18
18
|
const runFastlane_1 = require("./functions/runFastlane");
|
|
19
|
+
const startAndroidEmulator_1 = require("./functions/startAndroidEmulator");
|
|
20
|
+
const startIosSimulator_1 = require("./functions/startIosSimulator");
|
|
21
|
+
const installMaestro_1 = require("./functions/installMaestro");
|
|
19
22
|
function getEasFunctions(ctx) {
|
|
20
23
|
return [
|
|
21
24
|
(0, checkout_1.createCheckoutBuildFunction)(),
|
|
@@ -33,6 +36,9 @@ function getEasFunctions(ctx) {
|
|
|
33
36
|
(0, configureIosVersion_1.configureIosVersionFunction)(),
|
|
34
37
|
(0, generateGymfileFromTemplate_1.generateGymfileFromTemplateFunction)(),
|
|
35
38
|
(0, runFastlane_1.runFastlaneFunction)(),
|
|
39
|
+
(0, startAndroidEmulator_1.createStartAndroidEmulatorBuildFunction)(),
|
|
40
|
+
(0, startIosSimulator_1.createStartIosSimulatorBuildFunction)(),
|
|
41
|
+
(0, installMaestro_1.createInstallMaestroBuildFunction)(),
|
|
36
42
|
];
|
|
37
43
|
}
|
|
38
44
|
exports.getEasFunctions = getEasFunctions;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"easFunctions.js","sourceRoot":"","sources":["../../src/steps/easFunctions.ts"],"names":[],"mappings":";;;AAIA,+DAA+E;AAC/E,mDAAmE;AACnE,yDAAwE;AACxE,uEAAuF;AACvF,mDAAmE;AACnE,yFAAyG;AACzG,6FAAkG;AAClG,mFAAwF;AACxF,iFAAsF;AACtF,qDAA0D;AAC1D,qGAA0G;AAC1G,iFAAsF;AACtF,yEAA8E;AAC9E,yFAA8F;AAC9F,yDAA8D;
|
|
1
|
+
{"version":3,"file":"easFunctions.js","sourceRoot":"","sources":["../../src/steps/easFunctions.ts"],"names":[],"mappings":";;;AAIA,+DAA+E;AAC/E,mDAAmE;AACnE,yDAAwE;AACxE,uEAAuF;AACvF,mDAAmE;AACnE,yFAAyG;AACzG,6FAAkG;AAClG,mFAAwF;AACxF,iFAAsF;AACtF,qDAA0D;AAC1D,qGAA0G;AAC1G,iFAAsF;AACtF,yEAA8E;AAC9E,yFAA8F;AAC9F,yDAA8D;AAC9D,2EAA2F;AAC3F,qEAAqF;AACrF,+DAA+E;AAE/E,SAAgB,eAAe,CAAC,GAAuB;IACrD,OAAO;QACL,IAAA,sCAA2B,GAAE;QAC7B,IAAA,kDAAiC,EAAC,GAAG,CAAC;QACtC,IAAA,2CAA6B,GAAE;QAC/B,IAAA,0DAAqC,GAAE;QACvC,IAAA,sCAA2B,GAAE;QAC7B,IAAA,4EAA8C,EAAC,GAAG,CAAC;QACnD,IAAA,qEAAqC,GAAE;QACvC,IAAA,2DAAgC,GAAE;QAClC,IAAA,yDAA+B,GAAE;QACjC,IAAA,6BAAiB,GAAE;QACnB,IAAA,6EAAyC,GAAE;QAC3C,IAAA,yDAA+B,GAAE;QACjC,IAAA,iDAA2B,GAAE;QAC7B,IAAA,iEAAmC,GAAE;QACrC,IAAA,iCAAmB,GAAE;QACrB,IAAA,8DAAuC,GAAE;QACzC,IAAA,wDAAoC,GAAE;QACtC,IAAA,kDAAiC,GAAE;KACpC,CAAC;AACJ,CAAC;AArBD,0CAqBC","sourcesContent":["import { BuildFunction } from '@expo/steps';\n\nimport { CustomBuildContext } from '../customBuildContext';\n\nimport { createUploadArtifactBuildFunction } from './functions/uploadArtifact';\nimport { createCheckoutBuildFunction } from './functions/checkout';\nimport { createSetUpNpmrcBuildFunction } from './functions/useNpmToken';\nimport { createInstallNodeModulesBuildFunction } from './functions/installNodeModules';\nimport { createPrebuildBuildFunction } from './functions/prebuild';\nimport { createFindAndUploadBuildArtifactsBuildFunction } from './functions/findAndUploadBuildArtifacts';\nimport { configureEASUpdateIfInstalledFunction } from './functions/configureEASUpdateIfInstalled';\nimport { injectAndroidCredentialsFunction } from './functions/injectAndroidCredentials';\nimport { configureAndroidVersionFunction } from './functions/configureAndroidVersion';\nimport { runGradleFunction } from './functions/runGradle';\nimport { resolveAppleTeamIdFromCredentialsFunction } from './functions/resolveAppleTeamIdFromCredentials';\nimport { configureIosCredentialsFunction } from './functions/configureIosCredentials';\nimport { configureIosVersionFunction } from './functions/configureIosVersion';\nimport { generateGymfileFromTemplateFunction } from './functions/generateGymfileFromTemplate';\nimport { runFastlaneFunction } from './functions/runFastlane';\nimport { createStartAndroidEmulatorBuildFunction } from './functions/startAndroidEmulator';\nimport { createStartIosSimulatorBuildFunction } from './functions/startIosSimulator';\nimport { createInstallMaestroBuildFunction } from './functions/installMaestro';\n\nexport function getEasFunctions(ctx: CustomBuildContext): BuildFunction[] {\n return [\n createCheckoutBuildFunction(),\n createUploadArtifactBuildFunction(ctx),\n createSetUpNpmrcBuildFunction(),\n createInstallNodeModulesBuildFunction(),\n createPrebuildBuildFunction(),\n createFindAndUploadBuildArtifactsBuildFunction(ctx),\n configureEASUpdateIfInstalledFunction(),\n injectAndroidCredentialsFunction(),\n configureAndroidVersionFunction(),\n runGradleFunction(),\n resolveAppleTeamIdFromCredentialsFunction(),\n configureIosCredentialsFunction(),\n configureIosVersionFunction(),\n generateGymfileFromTemplateFunction(),\n runFastlaneFunction(),\n createStartAndroidEmulatorBuildFunction(),\n createStartIosSimulatorBuildFunction(),\n createInstallMaestroBuildFunction(),\n ];\n}\n"]}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createInstallMaestroBuildFunction = void 0;
|
|
7
|
+
const assert_1 = __importDefault(require("assert"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
10
|
+
const steps_1 = require("@expo/steps");
|
|
11
|
+
const turtle_spawn_1 = __importDefault(require("@expo/turtle-spawn"));
|
|
12
|
+
function createInstallMaestroBuildFunction() {
|
|
13
|
+
return new steps_1.BuildFunction({
|
|
14
|
+
namespace: 'eas',
|
|
15
|
+
id: 'install_maestro',
|
|
16
|
+
name: 'Install Maestro',
|
|
17
|
+
inputProviders: [
|
|
18
|
+
steps_1.BuildStepInput.createProvider({
|
|
19
|
+
id: 'maestro_version',
|
|
20
|
+
required: false,
|
|
21
|
+
allowedValueTypeName: steps_1.BuildStepInputValueTypeName.STRING,
|
|
22
|
+
}),
|
|
23
|
+
],
|
|
24
|
+
fn: async ({ logger, global }, { inputs, env }) => {
|
|
25
|
+
const requestedMaestroVersion = inputs.maestro_version.value;
|
|
26
|
+
const currentMaestroVersion = await getMaestroVersion();
|
|
27
|
+
// When not running in EAS Build VM, do not modify local environment.
|
|
28
|
+
if (env.EAS_BUILD_RUNNER !== 'eas-build') {
|
|
29
|
+
const currentIsJavaInstalled = await isJavaInstalled();
|
|
30
|
+
const currentIsIdbInstalled = await isIdbInstalled();
|
|
31
|
+
if (!currentIsJavaInstalled) {
|
|
32
|
+
logger.warn('It seems Java is not installed. It is required to run Maestro. If the job fails, this may be the reason.');
|
|
33
|
+
logger.info('');
|
|
34
|
+
}
|
|
35
|
+
if (!currentIsIdbInstalled) {
|
|
36
|
+
logger.warn('It seems IDB is not installed. Maestro requires it to run flows on iOS Simulator. If the job fails, this may be the reason.');
|
|
37
|
+
logger.info('');
|
|
38
|
+
}
|
|
39
|
+
if (!currentMaestroVersion) {
|
|
40
|
+
logger.warn('It seems Maestro is not installed. Please install Maestro manually and rerun the job.');
|
|
41
|
+
logger.info('');
|
|
42
|
+
}
|
|
43
|
+
// Guide is helpful in these two cases, it doesn't mention Java.
|
|
44
|
+
if (!currentIsIdbInstalled || !currentMaestroVersion) {
|
|
45
|
+
logger.warn('For more info, check out Maestro installation guide: https://maestro.mobile.dev/getting-started/installing-maestro');
|
|
46
|
+
}
|
|
47
|
+
if (currentMaestroVersion) {
|
|
48
|
+
logger.info(`Maestro ${currentMaestroVersion} is ready.`);
|
|
49
|
+
}
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (!(await isJavaInstalled())) {
|
|
53
|
+
if (global.runtimePlatform === steps_1.BuildRuntimePlatform.DARWIN) {
|
|
54
|
+
logger.info('Installing Java');
|
|
55
|
+
await installJavaFromGcs({ logger });
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
// We expect Java to be pre-installed on Linux images,
|
|
59
|
+
// so this should only happen when running this step locally.
|
|
60
|
+
// We don't need to support installing Java on local computers.
|
|
61
|
+
throw new Error('Please install Java manually and rerun the job.');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// IDB is only a requirement on macOS.
|
|
65
|
+
if (global.runtimePlatform === steps_1.BuildRuntimePlatform.DARWIN && !(await isIdbInstalled())) {
|
|
66
|
+
logger.info('Installing IDB');
|
|
67
|
+
await installIdbFromBrew({ global, logger });
|
|
68
|
+
}
|
|
69
|
+
// Skip installing if the input sets a specific Maestro version to install
|
|
70
|
+
// and it is already installed which happens when developing on a local computer.
|
|
71
|
+
if (!currentMaestroVersion || requestedMaestroVersion !== currentMaestroVersion) {
|
|
72
|
+
await installMaestro({
|
|
73
|
+
version: requestedMaestroVersion,
|
|
74
|
+
global,
|
|
75
|
+
logger,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
const maestroVersion = await getMaestroVersion();
|
|
79
|
+
(0, assert_1.default)(maestroVersion, 'Failed to ensure Maestro is installed.');
|
|
80
|
+
logger.info(`Maestro ${maestroVersion} is ready.`);
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
exports.createInstallMaestroBuildFunction = createInstallMaestroBuildFunction;
|
|
85
|
+
async function getMaestroVersion() {
|
|
86
|
+
try {
|
|
87
|
+
const maestroVersion = await (0, turtle_spawn_1.default)('maestro', ['--version'], { stdio: 'pipe' });
|
|
88
|
+
return maestroVersion.stdout.trim();
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async function installMaestro({ global, version, logger, }) {
|
|
95
|
+
logger.info('Fetching install script');
|
|
96
|
+
const tempDirectory = await fs_extra_1.default.mkdtemp('install_maestro');
|
|
97
|
+
try {
|
|
98
|
+
const installMaestroScriptResponse = await fetch('https://get.maestro.mobile.dev');
|
|
99
|
+
const installMaestroScript = await installMaestroScriptResponse.text();
|
|
100
|
+
const installMaestroScriptFilePath = path_1.default.join(tempDirectory, 'install_maestro.sh');
|
|
101
|
+
await fs_extra_1.default.writeFile(installMaestroScriptFilePath, installMaestroScript, {
|
|
102
|
+
mode: 0o777,
|
|
103
|
+
});
|
|
104
|
+
logger.info('Installing Maestro');
|
|
105
|
+
await (0, turtle_spawn_1.default)(installMaestroScriptFilePath, [], {
|
|
106
|
+
logger,
|
|
107
|
+
env: {
|
|
108
|
+
...global.env,
|
|
109
|
+
MAESTRO_VERSION: version,
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
await fs_extra_1.default.remove(tempDirectory);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async function isIdbInstalled() {
|
|
118
|
+
try {
|
|
119
|
+
await (0, turtle_spawn_1.default)('idb', ['-h'], { ignoreStdio: true });
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
async function installIdbFromBrew({ global, logger, }) {
|
|
127
|
+
// Unfortunately our Mac images sometimes have two Homebrew
|
|
128
|
+
// installations. We should use the ARM64 one, located in /opt/homebrew.
|
|
129
|
+
const brewPath = '/opt/homebrew/bin/brew';
|
|
130
|
+
const env = {
|
|
131
|
+
...global.env,
|
|
132
|
+
HOMEBREW_NO_AUTO_UPDATE: '1',
|
|
133
|
+
};
|
|
134
|
+
await (0, turtle_spawn_1.default)(brewPath, ['tap', 'facebook/fb'], {
|
|
135
|
+
env,
|
|
136
|
+
logger,
|
|
137
|
+
});
|
|
138
|
+
await (0, turtle_spawn_1.default)(brewPath, ['install', 'idb-companion'], {
|
|
139
|
+
env,
|
|
140
|
+
logger,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
async function isJavaInstalled() {
|
|
144
|
+
try {
|
|
145
|
+
await (0, turtle_spawn_1.default)('java', ['-version'], { ignoreStdio: true });
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Installs Java 11 from a file uploaded manually to GCS as cache.
|
|
154
|
+
* Should not be run outside of EAS Build VMs not to break users' environments.
|
|
155
|
+
*/
|
|
156
|
+
async function installJavaFromGcs({ logger }) {
|
|
157
|
+
const downloadUrl = 'https://storage.googleapis.com/turtle-v2/zulu11.68.17-ca-jdk11.0.21-macosx_aarch64.dmg';
|
|
158
|
+
const filename = path_1.default.basename(downloadUrl);
|
|
159
|
+
const tempDirectory = await fs_extra_1.default.mkdtemp('install_java');
|
|
160
|
+
try {
|
|
161
|
+
const installerPath = path_1.default.join(tempDirectory, filename);
|
|
162
|
+
logger.info('Downloading Java installer');
|
|
163
|
+
// This is simpler than piping body into a write stream with node-fetch.
|
|
164
|
+
await (0, turtle_spawn_1.default)('curl', ['--output', installerPath, downloadUrl]);
|
|
165
|
+
const installerMountDirectory = path_1.default.join(tempDirectory, 'mountpoint');
|
|
166
|
+
await fs_extra_1.default.mkdir(installerMountDirectory);
|
|
167
|
+
logger.info('Mounting Java installer');
|
|
168
|
+
await (0, turtle_spawn_1.default)('hdiutil', ['attach', installerPath, '-noverify', '-mountpoint', installerMountDirectory], { logger });
|
|
169
|
+
logger.info('Installing Java');
|
|
170
|
+
await (0, turtle_spawn_1.default)('sudo', [
|
|
171
|
+
'installer',
|
|
172
|
+
'-pkg',
|
|
173
|
+
path_1.default.join(installerMountDirectory, 'Double-Click to Install Azul Zulu JDK 11.pkg'),
|
|
174
|
+
'-target',
|
|
175
|
+
'/',
|
|
176
|
+
], { logger });
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
await fs_extra_1.default.remove(tempDirectory);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=installMaestro.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installMaestro.js","sourceRoot":"","sources":["../../../src/steps/functions/installMaestro.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'assert';\nimport path from 'path';\n\nimport fs from 'fs-extra';\nimport {\n BuildFunction,\n BuildRuntimePlatform,\n BuildStepGlobalContext,\n BuildStepInput,\n BuildStepInputValueTypeName,\n} from '@expo/steps';\nimport spawn from '@expo/turtle-spawn';\nimport { bunyan } from '@expo/logger';\n\nexport function createInstallMaestroBuildFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'install_maestro',\n name: 'Install Maestro',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'maestro_version',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n ],\n fn: async ({ logger, global }, { inputs, env }) => {\n const requestedMaestroVersion = inputs.maestro_version.value as string | undefined;\n const currentMaestroVersion = await getMaestroVersion();\n\n // When not running in EAS Build VM, do not modify local environment.\n if (env.EAS_BUILD_RUNNER !== 'eas-build') {\n const currentIsJavaInstalled = await isJavaInstalled();\n const currentIsIdbInstalled = await isIdbInstalled();\n\n if (!currentIsJavaInstalled) {\n logger.warn(\n 'It seems Java is not installed. It is required to run Maestro. If the job fails, this may be the reason.'\n );\n logger.info('');\n }\n\n if (!currentIsIdbInstalled) {\n logger.warn(\n 'It seems IDB is not installed. Maestro requires it to run flows on iOS Simulator. If the job fails, this may be the reason.'\n );\n logger.info('');\n }\n\n if (!currentMaestroVersion) {\n logger.warn(\n 'It seems Maestro is not installed. Please install Maestro manually and rerun the job.'\n );\n logger.info('');\n }\n\n // Guide is helpful in these two cases, it doesn't mention Java.\n if (!currentIsIdbInstalled || !currentMaestroVersion) {\n logger.warn(\n 'For more info, check out Maestro installation guide: https://maestro.mobile.dev/getting-started/installing-maestro'\n );\n }\n\n if (currentMaestroVersion) {\n logger.info(`Maestro ${currentMaestroVersion} is ready.`);\n }\n\n return;\n }\n\n if (!(await isJavaInstalled())) {\n if (global.runtimePlatform === BuildRuntimePlatform.DARWIN) {\n logger.info('Installing Java');\n await installJavaFromGcs({ logger });\n } else {\n // We expect Java to be pre-installed on Linux images,\n // so this should only happen when running this step locally.\n // We don't need to support installing Java on local computers.\n throw new Error('Please install Java manually and rerun the job.');\n }\n }\n\n // IDB is only a requirement on macOS.\n if (global.runtimePlatform === BuildRuntimePlatform.DARWIN && !(await isIdbInstalled())) {\n logger.info('Installing IDB');\n await installIdbFromBrew({ global, logger });\n }\n\n // Skip installing if the input sets a specific Maestro version to install\n // and it is already installed which happens when developing on a local computer.\n if (!currentMaestroVersion || requestedMaestroVersion !== currentMaestroVersion) {\n await installMaestro({\n version: requestedMaestroVersion,\n global,\n logger,\n });\n }\n\n const maestroVersion = await getMaestroVersion();\n assert(maestroVersion, 'Failed to ensure Maestro is installed.');\n logger.info(`Maestro ${maestroVersion} is ready.`);\n },\n });\n}\n\nasync function getMaestroVersion(): Promise<string | null> {\n try {\n const maestroVersion = await spawn('maestro', ['--version'], { stdio: 'pipe' });\n return maestroVersion.stdout.trim();\n } catch {\n return null;\n }\n}\n\nasync function installMaestro({\n global,\n version,\n logger,\n}: {\n version?: string;\n logger: bunyan;\n global: BuildStepGlobalContext;\n}): Promise<void> {\n logger.info('Fetching install script');\n const tempDirectory = await fs.mkdtemp('install_maestro');\n try {\n const installMaestroScriptResponse = await fetch('https://get.maestro.mobile.dev');\n const installMaestroScript = await installMaestroScriptResponse.text();\n const installMaestroScriptFilePath = path.join(tempDirectory, 'install_maestro.sh');\n await fs.writeFile(installMaestroScriptFilePath, installMaestroScript, {\n mode: 0o777,\n });\n logger.info('Installing Maestro');\n await spawn(installMaestroScriptFilePath, [], {\n logger,\n env: {\n ...global.env,\n MAESTRO_VERSION: version,\n },\n });\n } finally {\n await fs.remove(tempDirectory);\n }\n}\n\nasync function isIdbInstalled(): Promise<boolean> {\n try {\n await spawn('idb', ['-h'], { ignoreStdio: true });\n return true;\n } catch {\n return false;\n }\n}\n\nasync function installIdbFromBrew({\n global,\n logger,\n}: {\n global: BuildStepGlobalContext;\n logger: bunyan;\n}): Promise<void> {\n // Unfortunately our Mac images sometimes have two Homebrew\n // installations. We should use the ARM64 one, located in /opt/homebrew.\n const brewPath = '/opt/homebrew/bin/brew';\n const env = {\n ...global.env,\n HOMEBREW_NO_AUTO_UPDATE: '1',\n };\n\n await spawn(brewPath, ['tap', 'facebook/fb'], {\n env,\n logger,\n });\n await spawn(brewPath, ['install', 'idb-companion'], {\n env,\n logger,\n });\n}\n\nasync function isJavaInstalled(): Promise<boolean> {\n try {\n await spawn('java', ['-version'], { ignoreStdio: true });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Installs Java 11 from a file uploaded manually to GCS as cache.\n * Should not be run outside of EAS Build VMs not to break users' environments.\n */\nasync function installJavaFromGcs({ logger }: { logger: bunyan }): Promise<void> {\n const downloadUrl =\n 'https://storage.googleapis.com/turtle-v2/zulu11.68.17-ca-jdk11.0.21-macosx_aarch64.dmg';\n const filename = path.basename(downloadUrl);\n const tempDirectory = await fs.mkdtemp('install_java');\n try {\n const installerPath = path.join(tempDirectory, filename);\n logger.info('Downloading Java installer');\n // This is simpler than piping body into a write stream with node-fetch.\n await spawn('curl', ['--output', installerPath, downloadUrl]);\n\n const installerMountDirectory = path.join(tempDirectory, 'mountpoint');\n await fs.mkdir(installerMountDirectory);\n logger.info('Mounting Java installer');\n await spawn(\n 'hdiutil',\n ['attach', installerPath, '-noverify', '-mountpoint', installerMountDirectory],\n { logger }\n );\n\n logger.info('Installing Java');\n await spawn(\n 'sudo',\n [\n 'installer',\n '-pkg',\n path.join(installerMountDirectory, 'Double-Click to Install Azul Zulu JDK 11.pkg'),\n '-target',\n '/',\n ],\n { logger }\n );\n } finally {\n await fs.remove(tempDirectory);\n }\n}\n"]}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createStartAndroidEmulatorBuildFunction = void 0;
|
|
7
|
+
const assert_1 = __importDefault(require("assert"));
|
|
8
|
+
const logger_1 = require("@expo/logger");
|
|
9
|
+
const steps_1 = require("@expo/steps");
|
|
10
|
+
const turtle_spawn_1 = __importDefault(require("@expo/turtle-spawn"));
|
|
11
|
+
const uuid_1 = require("uuid");
|
|
12
|
+
const retry_1 = require("../../utils/retry");
|
|
13
|
+
const defaultSystemImagePackage = `system-images;android-30;default;${process.arch === 'arm64' ? 'arm64-v8a' : 'x86_64'}`;
|
|
14
|
+
function createStartAndroidEmulatorBuildFunction() {
|
|
15
|
+
return new steps_1.BuildFunction({
|
|
16
|
+
namespace: 'eas',
|
|
17
|
+
id: 'start_android_emulator',
|
|
18
|
+
name: 'Start Android Emulator',
|
|
19
|
+
inputProviders: [
|
|
20
|
+
steps_1.BuildStepInput.createProvider({
|
|
21
|
+
id: 'device_name',
|
|
22
|
+
required: false,
|
|
23
|
+
defaultValue: 'EasAndroidDevice01',
|
|
24
|
+
allowedValueTypeName: steps_1.BuildStepInputValueTypeName.STRING,
|
|
25
|
+
}),
|
|
26
|
+
steps_1.BuildStepInput.createProvider({
|
|
27
|
+
id: 'system_image_package',
|
|
28
|
+
required: false,
|
|
29
|
+
defaultValue: defaultSystemImagePackage,
|
|
30
|
+
allowedValueTypeName: steps_1.BuildStepInputValueTypeName.STRING,
|
|
31
|
+
}),
|
|
32
|
+
],
|
|
33
|
+
fn: async ({ logger }, { inputs }) => {
|
|
34
|
+
var _a, _b;
|
|
35
|
+
const deviceName = `${inputs.device_name.value}`;
|
|
36
|
+
const systemImagePackage = `${inputs.system_image_package.value}`;
|
|
37
|
+
logger.info('Making sure system image is installed');
|
|
38
|
+
await (0, turtle_spawn_1.default)('sdkmanager', [systemImagePackage], {
|
|
39
|
+
logger,
|
|
40
|
+
});
|
|
41
|
+
logger.info('Creating emulator device');
|
|
42
|
+
const avdManager = (0, turtle_spawn_1.default)('avdmanager', ['create', 'avd', '--name', deviceName, '--package', systemImagePackage, '--force'], {
|
|
43
|
+
stdio: 'pipe',
|
|
44
|
+
});
|
|
45
|
+
// `avdmanager create` always asks about creating a custom hardware profile.
|
|
46
|
+
// > Do you wish to create a custom hardware profile? [no]
|
|
47
|
+
// We answer "no".
|
|
48
|
+
(_a = avdManager.child.stdin) === null || _a === void 0 ? void 0 : _a.write('no');
|
|
49
|
+
(_b = avdManager.child.stdin) === null || _b === void 0 ? void 0 : _b.end();
|
|
50
|
+
await avdManager;
|
|
51
|
+
const qemuPropId = (0, uuid_1.v4)();
|
|
52
|
+
logger.info('Starting emulator device');
|
|
53
|
+
await startAndroidSimulator({ deviceName, qemuPropId });
|
|
54
|
+
logger.info('Waiting for emulator to become ready');
|
|
55
|
+
const serialId = await (0, retry_1.retryAsync)(async () => {
|
|
56
|
+
const serialId = await getEmulatorSerialId({ qemuPropId });
|
|
57
|
+
(0, assert_1.default)(serialId, 'Failed to configure emulator: emulator with required ID not found.');
|
|
58
|
+
return serialId;
|
|
59
|
+
}, {
|
|
60
|
+
logger,
|
|
61
|
+
retryOptions: {
|
|
62
|
+
// Emulators usually take 30 second tops to boot.
|
|
63
|
+
retries: 60,
|
|
64
|
+
retryIntervalMs: 1000,
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
await (0, retry_1.retryAsync)(async () => {
|
|
68
|
+
const { stdout } = await (0, turtle_spawn_1.default)('adb', ['-s', serialId, 'shell', 'getprop', 'sys.boot_completed'], {
|
|
69
|
+
mode: logger_1.PipeMode.COMBINED,
|
|
70
|
+
});
|
|
71
|
+
if (!stdout.startsWith('1')) {
|
|
72
|
+
throw new Error('Emulator boot has not completed.');
|
|
73
|
+
}
|
|
74
|
+
}, {
|
|
75
|
+
// Retry every second for 3 minutes.
|
|
76
|
+
retryOptions: {
|
|
77
|
+
retries: 3 * 60,
|
|
78
|
+
retryIntervalMs: 1000,
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
logger.info(`${deviceName} is ready.`);
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
exports.createStartAndroidEmulatorBuildFunction = createStartAndroidEmulatorBuildFunction;
|
|
86
|
+
async function startAndroidSimulator({ deviceName, qemuPropId, }) {
|
|
87
|
+
const emulatorPromise = (0, turtle_spawn_1.default)(`${process.env.ANDROID_HOME}/emulator/emulator`, [
|
|
88
|
+
'-no-window',
|
|
89
|
+
'-no-boot-anim',
|
|
90
|
+
'-writable-system',
|
|
91
|
+
'-noaudio',
|
|
92
|
+
'-avd',
|
|
93
|
+
deviceName,
|
|
94
|
+
'-prop',
|
|
95
|
+
`qemu.uuid=${qemuPropId}`,
|
|
96
|
+
], {
|
|
97
|
+
detached: true,
|
|
98
|
+
stdio: 'ignore',
|
|
99
|
+
});
|
|
100
|
+
// If emulator fails to start, throw its error.
|
|
101
|
+
if (!emulatorPromise.child.pid) {
|
|
102
|
+
await emulatorPromise;
|
|
103
|
+
}
|
|
104
|
+
emulatorPromise.child.unref();
|
|
105
|
+
}
|
|
106
|
+
async function getEmulatorSerialId({ qemuPropId }) {
|
|
107
|
+
const adbDevices = await (0, turtle_spawn_1.default)('adb', ['devices'], { mode: logger_1.PipeMode.COMBINED });
|
|
108
|
+
for (const adbDeviceLine of adbDevices.stdout.split('\n')) {
|
|
109
|
+
if (!adbDeviceLine.startsWith('emulator')) {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const matches = adbDeviceLine.match(/^(\S+)/);
|
|
113
|
+
if (!matches) {
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
const [, serialId] = matches;
|
|
117
|
+
const getProp = await (0, turtle_spawn_1.default)('adb', ['-s', serialId, 'shell', 'getprop', 'qemu.uuid'], {
|
|
118
|
+
mode: logger_1.PipeMode.COMBINED,
|
|
119
|
+
});
|
|
120
|
+
if (getProp.stdout.startsWith(qemuPropId)) {
|
|
121
|
+
return serialId;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=startAndroidEmulator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"startAndroidEmulator.js","sourceRoot":"","sources":["../../../src/steps/functions/startAndroidEmulator.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'assert';\n\nimport { PipeMode } from '@expo/logger';\nimport { BuildFunction, BuildStepInput, BuildStepInputValueTypeName } from '@expo/steps';\nimport spawn from '@expo/turtle-spawn';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { retryAsync } from '../../utils/retry';\n\nconst defaultSystemImagePackage = `system-images;android-30;default;${\n process.arch === 'arm64' ? 'arm64-v8a' : 'x86_64'\n}`;\n\nexport function createStartAndroidEmulatorBuildFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'start_android_emulator',\n name: 'Start Android Emulator',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'device_name',\n required: false,\n defaultValue: 'EasAndroidDevice01',\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'system_image_package',\n required: false,\n defaultValue: defaultSystemImagePackage,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n ],\n fn: async ({ logger }, { inputs }) => {\n const deviceName = `${inputs.device_name.value}`;\n const systemImagePackage = `${inputs.system_image_package.value}`;\n logger.info('Making sure system image is installed');\n await spawn('sdkmanager', [systemImagePackage], {\n logger,\n });\n\n logger.info('Creating emulator device');\n const avdManager = spawn(\n 'avdmanager',\n ['create', 'avd', '--name', deviceName, '--package', systemImagePackage, '--force'],\n {\n stdio: 'pipe',\n }\n );\n // `avdmanager create` always asks about creating a custom hardware profile.\n // > Do you wish to create a custom hardware profile? [no]\n // We answer \"no\".\n avdManager.child.stdin?.write('no');\n avdManager.child.stdin?.end();\n await avdManager;\n\n const qemuPropId = uuidv4();\n\n logger.info('Starting emulator device');\n await startAndroidSimulator({ deviceName, qemuPropId });\n\n logger.info('Waiting for emulator to become ready');\n const serialId = await retryAsync(\n async () => {\n const serialId = await getEmulatorSerialId({ qemuPropId });\n assert(serialId, 'Failed to configure emulator: emulator with required ID not found.');\n return serialId;\n },\n {\n logger,\n retryOptions: {\n // Emulators usually take 30 second tops to boot.\n retries: 60,\n retryIntervalMs: 1_000,\n },\n }\n );\n\n await retryAsync(\n async () => {\n const { stdout } = await spawn(\n 'adb',\n ['-s', serialId, 'shell', 'getprop', 'sys.boot_completed'],\n {\n mode: PipeMode.COMBINED,\n }\n );\n\n if (!stdout.startsWith('1')) {\n throw new Error('Emulator boot has not completed.');\n }\n },\n {\n // Retry every second for 3 minutes.\n retryOptions: {\n retries: 3 * 60,\n retryIntervalMs: 1_000,\n },\n }\n );\n\n logger.info(`${deviceName} is ready.`);\n },\n });\n}\n\nasync function startAndroidSimulator({\n deviceName,\n qemuPropId,\n}: {\n deviceName: string;\n qemuPropId: string;\n}): Promise<void> {\n const emulatorPromise = spawn(\n `${process.env.ANDROID_HOME}/emulator/emulator`,\n [\n '-no-window',\n '-no-boot-anim',\n '-writable-system',\n '-noaudio',\n '-avd',\n deviceName,\n '-prop',\n `qemu.uuid=${qemuPropId}`,\n ],\n {\n detached: true,\n stdio: 'ignore',\n }\n );\n // If emulator fails to start, throw its error.\n if (!emulatorPromise.child.pid) {\n await emulatorPromise;\n }\n emulatorPromise.child.unref();\n}\n\nasync function getEmulatorSerialId({ qemuPropId }: { qemuPropId: string }): Promise<string | null> {\n const adbDevices = await spawn('adb', ['devices'], { mode: PipeMode.COMBINED });\n for (const adbDeviceLine of adbDevices.stdout.split('\\n')) {\n if (!adbDeviceLine.startsWith('emulator')) {\n continue;\n }\n\n const matches = adbDeviceLine.match(/^(\\S+)/);\n if (!matches) {\n continue;\n }\n\n const [, serialId] = matches;\n const getProp = await spawn('adb', ['-s', serialId, 'shell', 'getprop', 'qemu.uuid'], {\n mode: PipeMode.COMBINED,\n });\n if (getProp.stdout.startsWith(qemuPropId)) {\n return serialId;\n }\n }\n\n return null;\n}\n"]}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createStartIosSimulatorBuildFunction = void 0;
|
|
7
|
+
const logger_1 = require("@expo/logger");
|
|
8
|
+
const steps_1 = require("@expo/steps");
|
|
9
|
+
const turtle_spawn_1 = __importDefault(require("@expo/turtle-spawn"));
|
|
10
|
+
const lodash_1 = require("lodash");
|
|
11
|
+
const retry_1 = require("../../utils/retry");
|
|
12
|
+
function createStartIosSimulatorBuildFunction() {
|
|
13
|
+
return new steps_1.BuildFunction({
|
|
14
|
+
namespace: 'eas',
|
|
15
|
+
id: 'start_ios_simulator',
|
|
16
|
+
name: 'Start iOS Simulator',
|
|
17
|
+
inputProviders: [
|
|
18
|
+
steps_1.BuildStepInput.createProvider({
|
|
19
|
+
id: 'device_identifier',
|
|
20
|
+
required: false,
|
|
21
|
+
allowedValueTypeName: steps_1.BuildStepInputValueTypeName.STRING,
|
|
22
|
+
}),
|
|
23
|
+
],
|
|
24
|
+
fn: async ({ logger }, { inputs }) => {
|
|
25
|
+
var _a, _b, _c;
|
|
26
|
+
try {
|
|
27
|
+
const availableDevices = await getAvailableSimulatorDevices();
|
|
28
|
+
logger.info(`Available Simulator devices:\n- ${availableDevices
|
|
29
|
+
.map(formatSimulatorDevice)
|
|
30
|
+
.join(`\n- `)}`);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
logger.info('Failed to list available Simulator devices.', error);
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
logger.info('');
|
|
37
|
+
}
|
|
38
|
+
const deviceIdentifier = (_b = (_a = inputs.device_identifier.value) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : (_c = (await findMostGenericIphone())) === null || _c === void 0 ? void 0 : _c.name;
|
|
39
|
+
if (!deviceIdentifier) {
|
|
40
|
+
throw new Error('Could not find an iPhone among available simulator devices.');
|
|
41
|
+
}
|
|
42
|
+
const bootstatusResult = await (0, turtle_spawn_1.default)('xcrun', ['simctl', 'bootstatus', deviceIdentifier, '-b'], {
|
|
43
|
+
logger,
|
|
44
|
+
});
|
|
45
|
+
await (0, retry_1.retryAsync)(async () => {
|
|
46
|
+
await (0, turtle_spawn_1.default)('xcrun', ['simctl', 'io', deviceIdentifier, 'screenshot', '/dev/null']);
|
|
47
|
+
}, {
|
|
48
|
+
retryOptions: {
|
|
49
|
+
// There's 30 * 60 seconds in 30 minutes, which is the timeout.
|
|
50
|
+
retries: 30 * 60,
|
|
51
|
+
retryIntervalMs: 1000,
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
logger.info('');
|
|
55
|
+
const udid = parseUdidFromBootstatusStdout(bootstatusResult.stdout);
|
|
56
|
+
const device = udid ? await getSimulatorDevice(udid) : null;
|
|
57
|
+
logger.info(`${device ? formatSimulatorDevice(device) : deviceIdentifier} is ready.`);
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
exports.createStartIosSimulatorBuildFunction = createStartIosSimulatorBuildFunction;
|
|
62
|
+
async function findMostGenericIphone() {
|
|
63
|
+
const availableSimulatorDevices = await getAvailableSimulatorDevices();
|
|
64
|
+
const availableIphones = availableSimulatorDevices.filter((device) => device.name.startsWith('iPhone'));
|
|
65
|
+
// It's funny, but it works.
|
|
66
|
+
const iphoneWithShortestName = (0, lodash_1.minBy)(availableIphones, (device) => device.name.length);
|
|
67
|
+
return iphoneWithShortestName !== null && iphoneWithShortestName !== void 0 ? iphoneWithShortestName : null;
|
|
68
|
+
}
|
|
69
|
+
function formatSimulatorDevice(device) {
|
|
70
|
+
return `${device.name} (${device.udid}) on ${device.runtime}`;
|
|
71
|
+
}
|
|
72
|
+
function parseUdidFromBootstatusStdout(stdout) {
|
|
73
|
+
const matches = stdout.match(/^Monitoring boot status for .+ \((.+)\)\.$/m);
|
|
74
|
+
if (!matches) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
return matches[1];
|
|
78
|
+
}
|
|
79
|
+
async function getSimulatorDevice(udid) {
|
|
80
|
+
var _a;
|
|
81
|
+
const devices = await getAvailableSimulatorDevices();
|
|
82
|
+
return (_a = devices.find((device) => device.udid === udid)) !== null && _a !== void 0 ? _a : null;
|
|
83
|
+
}
|
|
84
|
+
async function getAvailableSimulatorDevices() {
|
|
85
|
+
const result = await (0, turtle_spawn_1.default)('xcrun', ['simctl', 'list', 'devices', '--json', '--no-escape-slashes', 'available'], {
|
|
86
|
+
mode: logger_1.PipeMode.COMBINED_AS_STDOUT,
|
|
87
|
+
});
|
|
88
|
+
const xcrunData = JSON.parse(result.stdout);
|
|
89
|
+
const allAvailableDevices = [];
|
|
90
|
+
for (const [runtime, devices] of Object.entries(xcrunData.devices)) {
|
|
91
|
+
allAvailableDevices.push(...devices.map((device) => ({ ...device, runtime })));
|
|
92
|
+
}
|
|
93
|
+
return allAvailableDevices;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=startIosSimulator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"startIosSimulator.js","sourceRoot":"","sources":["../../../src/steps/functions/startIosSimulator.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAwC;AACxC,uCAAyF;AACzF,sEAAuC;AACvC,mCAA+B;AAE/B,6CAA+C;AAE/C,SAAgB,oCAAoC;IAClD,OAAO,IAAI,qBAAa,CAAC;QACvB,SAAS,EAAE,KAAK;QAChB,EAAE,EAAE,qBAAqB;QACzB,IAAI,EAAE,qBAAqB;QAC3B,cAAc,EAAE;YACd,sBAAc,CAAC,cAAc,CAAC;gBAC5B,EAAE,EAAE,mBAAmB;gBACvB,QAAQ,EAAE,KAAK;gBACf,oBAAoB,EAAE,mCAA2B,CAAC,MAAM;aACzD,CAAC;SACH;QACD,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;;YACnC,IAAI,CAAC;gBACH,MAAM,gBAAgB,GAAG,MAAM,4BAA4B,EAAE,CAAC;gBAC9D,MAAM,CAAC,IAAI,CACT,mCAAmC,gBAAgB;qBAChD,GAAG,CAAC,qBAAqB,CAAC;qBAC1B,IAAI,CAAC,MAAM,CAAC,EAAE,CAClB,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,6CAA6C,EAAE,KAAK,CAAC,CAAC;YACpE,CAAC;oBAAS,CAAC;gBACT,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,gBAAgB,GACpB,MAAA,MAAA,MAAM,CAAC,iBAAiB,CAAC,KAAK,0CAAE,QAAQ,EAAE,mCAAI,MAAA,CAAC,MAAM,qBAAqB,EAAE,CAAC,0CAAE,IAAI,CAAC;YAEtF,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;YACjF,CAAC;YAED,MAAM,gBAAgB,GAAG,MAAM,IAAA,sBAAK,EAClC,OAAO,EACP,CAAC,QAAQ,EAAE,YAAY,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAChD;gBACE,MAAM;aACP,CACF,CAAC;YAEF,MAAM,IAAA,kBAAU,EACd,KAAK,IAAI,EAAE;gBACT,MAAM,IAAA,sBAAK,EAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;YACtF,CAAC,EACD;gBACE,YAAY,EAAE;oBACZ,+DAA+D;oBAC/D,OAAO,EAAE,EAAE,GAAG,EAAE;oBAChB,eAAe,EAAE,IAAK;iBACvB;aACF,CACF,CAAC;YAEF,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEhB,MAAM,IAAI,GAAG,6BAA6B,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACpE,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5D,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,gBAAgB,YAAY,CAAC,CAAC;QACxF,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AA7DD,oFA6DC;AAED,KAAK,UAAU,qBAAqB;IAClC,MAAM,yBAAyB,GAAG,MAAM,4BAA4B,EAAE,CAAC;IACvE,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CACnE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CACjC,CAAC;IACF,4BAA4B;IAC5B,MAAM,sBAAsB,GAAG,IAAA,cAAK,EAAC,gBAAgB,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvF,OAAO,sBAAsB,aAAtB,sBAAsB,cAAtB,sBAAsB,GAAI,IAAI,CAAC;AACxC,CAAC;AAED,SAAS,qBAAqB,CAAC,MAA+C;IAC5E,OAAO,GAAG,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC;AAChE,CAAC;AAED,SAAS,6BAA6B,CAAC,MAAc;IACnD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAC5E,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,IAAY;;IAC5C,MAAM,OAAO,GAAG,MAAM,4BAA4B,EAAE,CAAC;IACrD,OAAO,MAAA,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,mCAAI,IAAI,CAAC;AAChE,CAAC;AAED,KAAK,UAAU,4BAA4B;IACzC,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAK,EACxB,OAAO,EACP,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,qBAAqB,EAAE,WAAW,CAAC,EAC3E;QACE,IAAI,EAAE,iBAAQ,CAAC,kBAAkB;KAClC,CACF,CAAC;IACF,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAC1B,MAAM,CAAC,MAAM,CACkD,CAAC;IAElE,MAAM,mBAAmB,GAAyD,EAAE,CAAC;IACrF,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QACnE,mBAAmB,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,OAAO,mBAAmB,CAAC;AAC7B,CAAC","sourcesContent":["import { PipeMode } from '@expo/logger';\nimport { BuildFunction, BuildStepInput, BuildStepInputValueTypeName } from '@expo/steps';\nimport spawn from '@expo/turtle-spawn';\nimport { minBy } from 'lodash';\n\nimport { retryAsync } from '../../utils/retry';\n\nexport function createStartIosSimulatorBuildFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'start_ios_simulator',\n name: 'Start iOS Simulator',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'device_identifier',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n ],\n fn: async ({ logger }, { inputs }) => {\n try {\n const availableDevices = await getAvailableSimulatorDevices();\n logger.info(\n `Available Simulator devices:\\n- ${availableDevices\n .map(formatSimulatorDevice)\n .join(`\\n- `)}`\n );\n } catch (error) {\n logger.info('Failed to list available Simulator devices.', error);\n } finally {\n logger.info('');\n }\n\n const deviceIdentifier =\n inputs.device_identifier.value?.toString() ?? (await findMostGenericIphone())?.name;\n\n if (!deviceIdentifier) {\n throw new Error('Could not find an iPhone among available simulator devices.');\n }\n\n const bootstatusResult = await spawn(\n 'xcrun',\n ['simctl', 'bootstatus', deviceIdentifier, '-b'],\n {\n logger,\n }\n );\n\n await retryAsync(\n async () => {\n await spawn('xcrun', ['simctl', 'io', deviceIdentifier, 'screenshot', '/dev/null']);\n },\n {\n retryOptions: {\n // There's 30 * 60 seconds in 30 minutes, which is the timeout.\n retries: 30 * 60,\n retryIntervalMs: 1_000,\n },\n }\n );\n\n logger.info('');\n\n const udid = parseUdidFromBootstatusStdout(bootstatusResult.stdout);\n const device = udid ? await getSimulatorDevice(udid) : null;\n logger.info(`${device ? formatSimulatorDevice(device) : deviceIdentifier} is ready.`);\n },\n });\n}\n\nasync function findMostGenericIphone(): Promise<AvailableXcrunSimctlDevice | null> {\n const availableSimulatorDevices = await getAvailableSimulatorDevices();\n const availableIphones = availableSimulatorDevices.filter((device) =>\n device.name.startsWith('iPhone')\n );\n // It's funny, but it works.\n const iphoneWithShortestName = minBy(availableIphones, (device) => device.name.length);\n return iphoneWithShortestName ?? null;\n}\n\nfunction formatSimulatorDevice(device: XcrunSimctlDevice & { runtime: string }): string {\n return `${device.name} (${device.udid}) on ${device.runtime}`;\n}\n\nfunction parseUdidFromBootstatusStdout(stdout: string): string | null {\n const matches = stdout.match(/^Monitoring boot status for .+ \\((.+)\\)\\.$/m);\n if (!matches) {\n return null;\n }\n return matches[1];\n}\n\nasync function getSimulatorDevice(udid: string): Promise<SimulatorDevice | null> {\n const devices = await getAvailableSimulatorDevices();\n return devices.find((device) => device.udid === udid) ?? null;\n}\n\nasync function getAvailableSimulatorDevices(): Promise<SimulatorDevice[]> {\n const result = await spawn(\n 'xcrun',\n ['simctl', 'list', 'devices', '--json', '--no-escape-slashes', 'available'],\n {\n mode: PipeMode.COMBINED_AS_STDOUT,\n }\n );\n const xcrunData = JSON.parse(\n result.stdout\n ) as XcrunSimctlListDevicesJsonOutput<AvailableXcrunSimctlDevice>;\n\n const allAvailableDevices: (AvailableXcrunSimctlDevice & { runtime: string })[] = [];\n for (const [runtime, devices] of Object.entries(xcrunData.devices)) {\n allAvailableDevices.push(...devices.map((device) => ({ ...device, runtime })));\n }\n\n return allAvailableDevices;\n}\n\ntype XcrunSimctlDevice = {\n availabilityError?: string;\n /** e.g. /Users/sjchmiela/Library/Developer/CoreSimulator/Devices/8272DEB1-42B5-4F78-AB2D-0BC5F320B822/data */\n dataPath: string;\n /** e.g. 18341888 */\n dataPathSize: number;\n /** e.g. /Users/sjchmiela/Library/Logs/CoreSimulator/8272DEB1-42B5-4F78-AB2D-0BC5F320B822 */\n logPath: string;\n /** e.g. 8272DEB1-42B5-4F78-AB2D-0BC5F320B822 */\n udid: string;\n isAvailable: boolean;\n /** e.g. com.apple.CoreSimulator.SimDeviceType.iPhone-13-mini */\n deviceTypeIdentifier: string;\n state: 'Shutdown' | 'Booted';\n /** e.g. iPhone 15 */\n name: string;\n /** e.g. 2024-01-22T19:28:56Z */\n lastBootedAt?: string;\n};\n\ntype SimulatorDevice = AvailableXcrunSimctlDevice & { runtime: string };\n\ntype AvailableXcrunSimctlDevice = XcrunSimctlDevice & {\n availabilityError?: never;\n isAvailable: true;\n};\n\ntype XcrunSimctlListDevicesJsonOutput<TDevice extends XcrunSimctlDevice = XcrunSimctlDevice> = {\n devices: {\n [runtime: string]: TDevice[];\n };\n};\n"]}
|
|
@@ -8,6 +8,10 @@ const path_1 = __importDefault(require("path"));
|
|
|
8
8
|
const eas_build_job_1 = require("@expo/eas-build-job");
|
|
9
9
|
const steps_1 = require("@expo/steps");
|
|
10
10
|
const nullthrows_1 = __importDefault(require("nullthrows"));
|
|
11
|
+
const artifactTypeInputToManagedArtifactType = {
|
|
12
|
+
'application-archive': eas_build_job_1.ManagedArtifactType.APPLICATION_ARCHIVE,
|
|
13
|
+
'build-artifact': eas_build_job_1.ManagedArtifactType.BUILD_ARTIFACTS,
|
|
14
|
+
};
|
|
11
15
|
function createUploadArtifactBuildFunction(ctx) {
|
|
12
16
|
return new steps_1.BuildFunction({
|
|
13
17
|
namespace: 'eas',
|
|
@@ -20,6 +24,7 @@ function createUploadArtifactBuildFunction(ctx) {
|
|
|
20
24
|
allowedValues: [
|
|
21
25
|
eas_build_job_1.ManagedArtifactType.APPLICATION_ARCHIVE,
|
|
22
26
|
eas_build_job_1.ManagedArtifactType.BUILD_ARTIFACTS,
|
|
27
|
+
...Object.keys(artifactTypeInputToManagedArtifactType),
|
|
23
28
|
...Object.values(eas_build_job_1.GenericArtifactType),
|
|
24
29
|
],
|
|
25
30
|
required: true,
|
|
@@ -40,7 +45,7 @@ function createUploadArtifactBuildFunction(ctx) {
|
|
|
40
45
|
fn: async (stepsCtx, { inputs }) => {
|
|
41
46
|
const filePath = path_1.default.resolve(stepsCtx.workingDirectory, (0, nullthrows_1.default)(inputs.path.value).toString());
|
|
42
47
|
const artifact = {
|
|
43
|
-
type: inputs.type.value,
|
|
48
|
+
type: parseArtifactTypeInput(`${inputs.type.value}`),
|
|
44
49
|
paths: [filePath],
|
|
45
50
|
key: inputs.key.value,
|
|
46
51
|
};
|
|
@@ -52,4 +57,22 @@ function createUploadArtifactBuildFunction(ctx) {
|
|
|
52
57
|
});
|
|
53
58
|
}
|
|
54
59
|
exports.createUploadArtifactBuildFunction = createUploadArtifactBuildFunction;
|
|
60
|
+
/**
|
|
61
|
+
* Initially, upload_artifact supported application-archive and build-artifact.
|
|
62
|
+
* Then, mistakenly, support for it was removed in favor of supporting ManagedArtifactType
|
|
63
|
+
* values. This makes sure we support all:
|
|
64
|
+
* - kebab-case managed artifact types (the original)
|
|
65
|
+
* - snake-caps-case managed artifact types (the mistake)
|
|
66
|
+
* - generic artifact types.
|
|
67
|
+
*/
|
|
68
|
+
function parseArtifactTypeInput(input) {
|
|
69
|
+
// Step's allowedValues ensures input is either
|
|
70
|
+
// a key of artifactTypeInputToManagedArtifactType
|
|
71
|
+
// or a value of an artifact type.
|
|
72
|
+
const translatedManagedArtifactType = artifactTypeInputToManagedArtifactType[input];
|
|
73
|
+
if (translatedManagedArtifactType) {
|
|
74
|
+
return translatedManagedArtifactType;
|
|
75
|
+
}
|
|
76
|
+
return input;
|
|
77
|
+
}
|
|
55
78
|
//# sourceMappingURL=uploadArtifact.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploadArtifact.js","sourceRoot":"","sources":["../../../src/steps/functions/uploadArtifact.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,uDAA+E;AAC/E,uCAAyF;AACzF,4DAAoC;AAIpC,SAAgB,iCAAiC,CAAC,GAAuB;IACvE,OAAO,IAAI,qBAAa,CAAC;QACvB,SAAS,EAAE,KAAK;QAChB,EAAE,EAAE,iBAAiB;QACrB,IAAI,EAAE,iBAAiB;QACvB,cAAc,EAAE;YACd,sBAAc,CAAC,cAAc,CAAC;gBAC5B,EAAE,EAAE,MAAM;gBACV,YAAY,EAAE,mCAAmB,CAAC,mBAAmB;gBACrD,aAAa,EAAE;oBACb,mCAAmB,CAAC,mBAAmB;oBACvC,mCAAmB,CAAC,eAAe;oBACnC,GAAG,MAAM,CAAC,MAAM,CAAC,mCAAmB,CAAC;iBACtC;gBACD,QAAQ,EAAE,IAAI;gBACd,oBAAoB,EAAE,mCAA2B,CAAC,MAAM;aACzD,CAAC;YACF,sBAAc,CAAC,cAAc,CAAC;gBAC5B,EAAE,EAAE,KAAK;gBACT,YAAY,EAAE,EAAE;gBAChB,QAAQ,EAAE,KAAK;gBACf,oBAAoB,EAAE,mCAA2B,CAAC,MAAM;aACzD,CAAC;YACF,sBAAc,CAAC,cAAc,CAAC;gBAC5B,EAAE,EAAE,MAAM;gBACV,QAAQ,EAAE,IAAI;gBACd,oBAAoB,EAAE,mCAA2B,CAAC,MAAM;aACzD,CAAC;SACH;QACD,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YACjC,MAAM,QAAQ,GAAG,cAAI,CAAC,OAAO,CAC3B,QAAQ,CAAC,gBAAgB,EACzB,IAAA,oBAAU,EAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CACzC,CAAC;YAEF,MAAM,QAAQ,GAAG;gBACf,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"uploadArtifact.js","sourceRoot":"","sources":["../../../src/steps/functions/uploadArtifact.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,uDAA+E;AAC/E,uCAAyF;AACzF,4DAAoC;AAIpC,MAAM,sCAAsC,GAAoD;IAC9F,qBAAqB,EAAE,mCAAmB,CAAC,mBAAmB;IAC9D,gBAAgB,EAAE,mCAAmB,CAAC,eAAe;CACtD,CAAC;AAEF,SAAgB,iCAAiC,CAAC,GAAuB;IACvE,OAAO,IAAI,qBAAa,CAAC;QACvB,SAAS,EAAE,KAAK;QAChB,EAAE,EAAE,iBAAiB;QACrB,IAAI,EAAE,iBAAiB;QACvB,cAAc,EAAE;YACd,sBAAc,CAAC,cAAc,CAAC;gBAC5B,EAAE,EAAE,MAAM;gBACV,YAAY,EAAE,mCAAmB,CAAC,mBAAmB;gBACrD,aAAa,EAAE;oBACb,mCAAmB,CAAC,mBAAmB;oBACvC,mCAAmB,CAAC,eAAe;oBACnC,GAAG,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC;oBACtD,GAAG,MAAM,CAAC,MAAM,CAAC,mCAAmB,CAAC;iBACtC;gBACD,QAAQ,EAAE,IAAI;gBACd,oBAAoB,EAAE,mCAA2B,CAAC,MAAM;aACzD,CAAC;YACF,sBAAc,CAAC,cAAc,CAAC;gBAC5B,EAAE,EAAE,KAAK;gBACT,YAAY,EAAE,EAAE;gBAChB,QAAQ,EAAE,KAAK;gBACf,oBAAoB,EAAE,mCAA2B,CAAC,MAAM;aACzD,CAAC;YACF,sBAAc,CAAC,cAAc,CAAC;gBAC5B,EAAE,EAAE,MAAM;gBACV,QAAQ,EAAE,IAAI;gBACd,oBAAoB,EAAE,mCAA2B,CAAC,MAAM;aACzD,CAAC;SACH;QACD,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YACjC,MAAM,QAAQ,GAAG,cAAI,CAAC,OAAO,CAC3B,QAAQ,CAAC,gBAAgB,EACzB,IAAA,oBAAU,EAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CACzC,CAAC;YAEF,MAAM,QAAQ,GAAG;gBACf,IAAI,EAAE,sBAAsB,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACpD,KAAK,EAAE,CAAC,QAAQ,CAAC;gBACjB,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,KAAe;aAChC,CAAC;YAEF,MAAM,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC;gBAClC,QAAQ;gBACR,MAAM,EAAE,QAAQ,CAAC,MAAM;aACxB,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAhDD,8EAgDC;AAED;;;;;;;GAOG;AACH,SAAS,sBAAsB,CAAC,KAAa;IAC3C,+CAA+C;IAC/C,kDAAkD;IAClD,kCAAkC;IAClC,MAAM,6BAA6B,GAAG,sCAAsC,CAAC,KAAK,CAAC,CAAC;IACpF,IAAI,6BAA6B,EAAE,CAAC;QAClC,OAAO,6BAA6B,CAAC;IACvC,CAAC;IAED,OAAO,KAAkD,CAAC;AAC5D,CAAC","sourcesContent":["import path from 'path';\n\nimport { GenericArtifactType, ManagedArtifactType } from '@expo/eas-build-job';\nimport { BuildFunction, BuildStepInput, BuildStepInputValueTypeName } from '@expo/steps';\nimport nullthrows from 'nullthrows';\n\nimport { CustomBuildContext } from '../../customBuildContext';\n\nconst artifactTypeInputToManagedArtifactType: Record<string, ManagedArtifactType | undefined> = {\n 'application-archive': ManagedArtifactType.APPLICATION_ARCHIVE,\n 'build-artifact': ManagedArtifactType.BUILD_ARTIFACTS,\n};\n\nexport function createUploadArtifactBuildFunction(ctx: CustomBuildContext): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'upload_artifact',\n name: 'Upload artifact',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'type',\n defaultValue: ManagedArtifactType.APPLICATION_ARCHIVE,\n allowedValues: [\n ManagedArtifactType.APPLICATION_ARCHIVE,\n ManagedArtifactType.BUILD_ARTIFACTS,\n ...Object.keys(artifactTypeInputToManagedArtifactType),\n ...Object.values(GenericArtifactType),\n ],\n required: true,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'key',\n defaultValue: '',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'path',\n required: true,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n ],\n fn: async (stepsCtx, { inputs }) => {\n const filePath = path.resolve(\n stepsCtx.workingDirectory,\n nullthrows(inputs.path.value).toString()\n );\n\n const artifact = {\n type: parseArtifactTypeInput(`${inputs.type.value}`),\n paths: [filePath],\n key: inputs.key.value as string,\n };\n\n await ctx.runtimeApi.uploadArtifact({\n artifact,\n logger: stepsCtx.logger,\n });\n },\n });\n}\n\n/**\n * Initially, upload_artifact supported application-archive and build-artifact.\n * Then, mistakenly, support for it was removed in favor of supporting ManagedArtifactType\n * values. This makes sure we support all:\n * - kebab-case managed artifact types (the original)\n * - snake-caps-case managed artifact types (the mistake)\n * - generic artifact types.\n */\nfunction parseArtifactTypeInput(input: string): GenericArtifactType | ManagedArtifactType {\n // Step's allowedValues ensures input is either\n // a key of artifactTypeInputToManagedArtifactType\n // or a value of an artifact type.\n const translatedManagedArtifactType = artifactTypeInputToManagedArtifactType[input];\n if (translatedManagedArtifactType) {\n return translatedManagedArtifactType;\n }\n\n return input as GenericArtifactType | ManagedArtifactType;\n}\n"]}
|
|
@@ -6,12 +6,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.isEASUpdateConfigured = exports.configureEASUpdateIfInstalledAsync = void 0;
|
|
7
7
|
const eas_build_job_1 = require("@expo/eas-build-job");
|
|
8
8
|
const Updates_1 = require("@expo/config-plugins/build/utils/Updates");
|
|
9
|
-
const
|
|
9
|
+
const getExpoUpdatesPackageVersionIfInstalledAsync_1 = __importDefault(require("../../utils/getExpoUpdatesPackageVersionIfInstalledAsync"));
|
|
10
10
|
const expoUpdates_1 = require("./ios/expoUpdates");
|
|
11
11
|
const expoUpdates_2 = require("./android/expoUpdates");
|
|
12
12
|
async function configureEASUpdateIfInstalledAsync({ job, workingDirectory, logger, inputs, appConfig, }) {
|
|
13
13
|
var _a, _b, _c, _d, _e;
|
|
14
|
-
|
|
14
|
+
const expoUpdatesPackageVersion = await (0, getExpoUpdatesPackageVersionIfInstalledAsync_1.default)(workingDirectory);
|
|
15
|
+
if (expoUpdatesPackageVersion === null) {
|
|
15
16
|
throw new Error(`Cannot configure Expo Updates because the expo-updates package is not installed.`);
|
|
16
17
|
}
|
|
17
18
|
const runtimeVersion = (_c = (_a = inputs.channel) !== null && _a !== void 0 ? _a : (_b = job.version) === null || _b === void 0 ? void 0 : _b.runtimeVersion) !== null && _c !== void 0 ? _c : (await (0, Updates_1.getRuntimeVersionNullableAsync)(workingDirectory, appConfig, job.platform));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expoUpdates.js","sourceRoot":"","sources":["../../../src/steps/utils/expoUpdates.ts"],"names":[],"mappings":";;;;;;AAAA,uDAAoD;AAGpD,sEAA0F;AAE1F,
|
|
1
|
+
{"version":3,"file":"expoUpdates.js","sourceRoot":"","sources":["../../../src/steps/utils/expoUpdates.ts"],"names":[],"mappings":"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","sourcesContent":["import { Job, Platform } from '@expo/eas-build-job';\nimport { bunyan } from '@expo/logger';\nimport { ExpoConfig } from '@expo/config';\nimport { getRuntimeVersionNullableAsync } from '@expo/config-plugins/build/utils/Updates';\n\nimport getExpoUpdatesPackageVersionIfInstalledAsync from '../../utils/getExpoUpdatesPackageVersionIfInstalledAsync';\n\nimport {\n iosGetNativelyDefinedChannelAsync,\n iosSetChannelNativelyAsync,\n iosSetRuntimeVersionNativelyAsync,\n} from './ios/expoUpdates';\nimport {\n androidGetNativelyDefinedChannelAsync,\n androidSetChannelNativelyAsync,\n androidSetRuntimeVersionNativelyAsync,\n} from './android/expoUpdates';\n\nexport async function configureEASUpdateIfInstalledAsync({\n job,\n workingDirectory,\n logger,\n inputs,\n appConfig,\n}: {\n job: Job;\n workingDirectory: string;\n logger: bunyan;\n inputs: {\n runtimeVersion?: string;\n channel?: string;\n };\n appConfig: ExpoConfig;\n}): Promise<void> {\n const expoUpdatesPackageVersion =\n await getExpoUpdatesPackageVersionIfInstalledAsync(workingDirectory);\n if (expoUpdatesPackageVersion === null) {\n throw new Error(\n `Cannot configure Expo Updates because the expo-updates package is not installed.`\n );\n }\n\n const runtimeVersion =\n inputs.channel ??\n job.version?.runtimeVersion ??\n (await getRuntimeVersionNullableAsync(workingDirectory, appConfig, job.platform));\n\n const jobOrInputChannel = inputs.channel ?? job.updates?.channel;\n\n if (isEASUpdateConfigured(appConfig, logger)) {\n const channel = jobOrInputChannel ?? (await getChannelAsync(job, workingDirectory));\n if (channel) {\n await configureEASUpdate(job, logger, channel, workingDirectory);\n } else {\n if (job.releaseChannel !== undefined) {\n logger.warn(\n `This build is configured with EAS Update however has a Classic Updates releaseChannel set instead of having an EAS Update channel.`\n );\n } else {\n logger.warn(\n `This build is configured to query EAS Update for updates, however no channel is set.`\n );\n }\n }\n } else {\n logger.info(`Expo Updates is not configured, skipping configuring Expo Updates.`);\n }\n\n if (runtimeVersion) {\n logger.info('Updating runtimeVersion in Expo.plist');\n await setRuntimeVersionNativelyAsync(job, runtimeVersion, workingDirectory);\n }\n}\n\nexport function isEASUpdateConfigured(appConfig: ExpoConfig, logger: bunyan): boolean {\n const rawUrl = appConfig.updates?.url;\n if (!rawUrl) {\n return false;\n }\n try {\n const url = new URL(rawUrl);\n return ['u.expo.dev', 'staging-u.expo.dev'].includes(url.hostname);\n } catch (err) {\n logger.error({ err }, `Cannot parse expo.updates.url = ${rawUrl} as URL`);\n logger.error(`Assuming EAS Update is not configured`);\n return false;\n }\n}\n\nasync function configureEASUpdate(\n job: Job,\n logger: bunyan,\n channel: string,\n workingDirectory: string\n): Promise<void> {\n const newUpdateRequestHeaders: Record<string, string> = {\n 'expo-channel-name': channel,\n };\n\n const configFile = job.platform === Platform.ANDROID ? 'AndroidManifest.xml' : 'Expo.plist';\n logger.info(\n `Setting the update request headers in '${configFile}' to '${JSON.stringify(\n newUpdateRequestHeaders\n )}'`\n );\n\n switch (job.platform) {\n case Platform.ANDROID: {\n await androidSetChannelNativelyAsync(channel, workingDirectory);\n return;\n }\n case Platform.IOS: {\n await iosSetChannelNativelyAsync(channel, workingDirectory);\n return;\n }\n default:\n throw new Error(`Platform is not supported.`);\n }\n}\n\nasync function getChannelAsync(job: Job, workingDirectory: string): Promise<string | null> {\n switch (job.platform) {\n case Platform.ANDROID: {\n return await androidGetNativelyDefinedChannelAsync(workingDirectory);\n }\n case Platform.IOS: {\n return await iosGetNativelyDefinedChannelAsync(workingDirectory);\n }\n default:\n throw new Error(`Platform is not supported.`);\n }\n}\n\nasync function setRuntimeVersionNativelyAsync(\n job: Job,\n runtimeVersion: string,\n workingDirectory: string\n): Promise<void> {\n switch (job.platform) {\n case Platform.ANDROID: {\n await androidSetRuntimeVersionNativelyAsync(runtimeVersion, workingDirectory);\n return;\n }\n case Platform.IOS: {\n await iosSetRuntimeVersionNativelyAsync(runtimeVersion, workingDirectory);\n return;\n }\n default:\n throw new Error(`Platform is not supported.`);\n }\n}\n"]}
|
|
@@ -19,3 +19,4 @@ export declare function configureExpoUpdatesIfInstalledAsync(ctx: BuildContext<J
|
|
|
19
19
|
export declare function getChannelAsync(ctx: BuildContext<Job>): Promise<string | null>;
|
|
20
20
|
export declare function getRuntimeVersionAsync(ctx: BuildContext<Job>): Promise<string | null>;
|
|
21
21
|
export declare function isEASUpdateConfigured(ctx: BuildContext<Job>): boolean;
|
|
22
|
+
export declare function shouldConfigureClassicUpdatesReleaseChannelAsFallback(expoUpdatesPackageVersion: string): boolean;
|
|
@@ -3,13 +3,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.isEASUpdateConfigured = exports.getRuntimeVersionAsync = exports.getChannelAsync = exports.configureExpoUpdatesIfInstalledAsync = exports.configureEASExpoUpdatesAsync = exports.configureClassicExpoUpdatesAsync = exports.getNativelyDefinedClassicReleaseChannelAsync = exports.setClassicReleaseChannelNativelyAsync = exports.setChannelNativelyAsync = exports.setRuntimeVersionNativelyAsync = void 0;
|
|
6
|
+
exports.shouldConfigureClassicUpdatesReleaseChannelAsFallback = exports.isEASUpdateConfigured = exports.getRuntimeVersionAsync = exports.getChannelAsync = exports.configureExpoUpdatesIfInstalledAsync = exports.configureEASExpoUpdatesAsync = exports.configureClassicExpoUpdatesAsync = exports.getNativelyDefinedClassicReleaseChannelAsync = exports.setClassicReleaseChannelNativelyAsync = exports.setChannelNativelyAsync = exports.setRuntimeVersionNativelyAsync = void 0;
|
|
7
7
|
const assert_1 = __importDefault(require("assert"));
|
|
8
8
|
const eas_build_job_1 = require("@expo/eas-build-job");
|
|
9
9
|
const Updates_1 = require("@expo/config-plugins/build/utils/Updates");
|
|
10
|
+
const semver_1 = __importDefault(require("semver"));
|
|
10
11
|
const expoUpdates_1 = require("../android/expoUpdates");
|
|
11
12
|
const expoUpdates_2 = require("../ios/expoUpdates");
|
|
12
|
-
const
|
|
13
|
+
const getExpoUpdatesPackageVersionIfInstalledAsync_1 = __importDefault(require("./getExpoUpdatesPackageVersionIfInstalledAsync"));
|
|
13
14
|
async function setRuntimeVersionNativelyAsync(ctx, runtimeVersion) {
|
|
14
15
|
switch (ctx.job.platform) {
|
|
15
16
|
case eas_build_job_1.Platform.ANDROID: {
|
|
@@ -114,7 +115,8 @@ async function configureEASExpoUpdatesAsync(ctx) {
|
|
|
114
115
|
exports.configureEASExpoUpdatesAsync = configureEASExpoUpdatesAsync;
|
|
115
116
|
async function configureExpoUpdatesIfInstalledAsync(ctx) {
|
|
116
117
|
var _a, _b, _c, _d, _e, _f;
|
|
117
|
-
|
|
118
|
+
const expoUpdatesVersion = await (0, getExpoUpdatesPackageVersionIfInstalledAsync_1.default)(ctx.getReactNativeProjectDirectory());
|
|
119
|
+
if (expoUpdatesVersion === null) {
|
|
118
120
|
return;
|
|
119
121
|
}
|
|
120
122
|
const appConfigRuntimeVersion = (_b = (_a = ctx.job.version) === null || _a === void 0 ? void 0 : _a.runtimeVersion) !== null && _b !== void 0 ? _b : (await (0, Updates_1.getRuntimeVersionNullableAsync)(ctx.getReactNativeProjectDirectory(), ctx.appConfig, ctx.job.platform));
|
|
@@ -144,7 +146,7 @@ async function configureExpoUpdatesIfInstalledAsync(ctx) {
|
|
|
144
146
|
}
|
|
145
147
|
}
|
|
146
148
|
}
|
|
147
|
-
else {
|
|
149
|
+
else if (shouldConfigureClassicUpdatesReleaseChannelAsFallback(expoUpdatesVersion)) {
|
|
148
150
|
await configureClassicExpoUpdatesAsync(ctx);
|
|
149
151
|
}
|
|
150
152
|
if ((_f = ctx.job.version) === null || _f === void 0 ? void 0 : _f.runtimeVersion) {
|
|
@@ -196,4 +198,10 @@ function isEASUpdateConfigured(ctx) {
|
|
|
196
198
|
}
|
|
197
199
|
}
|
|
198
200
|
exports.isEASUpdateConfigured = isEASUpdateConfigured;
|
|
201
|
+
function shouldConfigureClassicUpdatesReleaseChannelAsFallback(expoUpdatesPackageVersion) {
|
|
202
|
+
// Anything before SDK 50 should configure classic updates as a fallback. The first version
|
|
203
|
+
// of the expo-updates package published for SDK 50 was 0.19.0
|
|
204
|
+
return semver_1.default.lt(expoUpdatesPackageVersion, '0.19.0');
|
|
205
|
+
}
|
|
206
|
+
exports.shouldConfigureClassicUpdatesReleaseChannelAsFallback = shouldConfigureClassicUpdatesReleaseChannelAsFallback;
|
|
199
207
|
//# sourceMappingURL=expoUpdates.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expoUpdates.js","sourceRoot":"","sources":["../../src/utils/expoUpdates.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'assert';\n\nimport { Platform, Job } from '@expo/eas-build-job';\nimport { getRuntimeVersionNullableAsync } from '@expo/config-plugins/build/utils/Updates';\n\nimport {\n androidSetRuntimeVersionNativelyAsync,\n androidSetChannelNativelyAsync,\n androidSetClassicReleaseChannelNativelyAsync,\n androidGetNativelyDefinedClassicReleaseChannelAsync,\n androidGetNativelyDefinedRuntimeVersionAsync,\n androidGetNativelyDefinedChannelAsync,\n} from '../android/expoUpdates';\nimport {\n iosSetRuntimeVersionNativelyAsync,\n iosSetChannelNativelyAsync,\n iosSetClassicReleaseChannelNativelyAsync,\n iosGetNativelyDefinedClassicReleaseChannelAsync,\n iosGetNativelyDefinedRuntimeVersionAsync,\n iosGetNativelyDefinedChannelAsync,\n} from '../ios/expoUpdates';\nimport { BuildContext } from '../context';\n\nimport isExpoUpdatesInstalledAsync from './isExpoUpdatesInstalled';\n\nexport async function setRuntimeVersionNativelyAsync(\n ctx: BuildContext<Job>,\n runtimeVersion: string\n): Promise<void> {\n switch (ctx.job.platform) {\n case Platform.ANDROID: {\n await androidSetRuntimeVersionNativelyAsync(ctx, runtimeVersion);\n return;\n }\n case Platform.IOS: {\n await iosSetRuntimeVersionNativelyAsync(ctx, runtimeVersion);\n return;\n }\n default:\n throw new Error(`Platform is not supported.`);\n }\n}\n\n/**\n * Used for when Expo Updates is pointed at an EAS server.\n */\nexport async function setChannelNativelyAsync(ctx: BuildContext<Job>): Promise<void> {\n assert(ctx.job.updates?.channel, 'updates.channel must be defined');\n const newUpdateRequestHeaders: Record<string, string> = {\n 'expo-channel-name': ctx.job.updates.channel,\n };\n\n const configFile = ctx.job.platform === Platform.ANDROID ? 'AndroidManifest.xml' : 'Expo.plist';\n ctx.logger.info(\n `Setting the update request headers in '${configFile}' to '${JSON.stringify(\n newUpdateRequestHeaders\n )}'`\n );\n\n switch (ctx.job.platform) {\n case Platform.ANDROID: {\n await androidSetChannelNativelyAsync(ctx);\n return;\n }\n case Platform.IOS: {\n await iosSetChannelNativelyAsync(ctx);\n return;\n }\n default:\n throw new Error(`Platform is not supported.`);\n }\n}\n\n/**\n * Used for classic Expo Updates\n */\nexport async function setClassicReleaseChannelNativelyAsync(ctx: BuildContext<Job>): Promise<void> {\n assert(ctx.job.releaseChannel, 'releaseChannel must be defined');\n\n const configFile = ctx.job.platform === Platform.ANDROID ? 'AndroidManifest.xml' : 'Expo.plist';\n ctx.logger.info(`Setting the release channel in '${configFile}' to '${ctx.job.releaseChannel}'`);\n\n switch (ctx.job.platform) {\n case Platform.ANDROID: {\n await androidSetClassicReleaseChannelNativelyAsync(ctx);\n return;\n }\n case Platform.IOS: {\n await iosSetClassicReleaseChannelNativelyAsync(ctx);\n return;\n }\n default:\n throw new Error(`Platform is not supported.`);\n }\n}\n\n/**\n * Used for classic Expo Updates\n */\nexport async function getNativelyDefinedClassicReleaseChannelAsync(\n ctx: BuildContext<Job>\n): Promise<string | null> {\n switch (ctx.job.platform) {\n case Platform.ANDROID: {\n return androidGetNativelyDefinedClassicReleaseChannelAsync(ctx);\n }\n case Platform.IOS: {\n return iosGetNativelyDefinedClassicReleaseChannelAsync(ctx);\n }\n default:\n throw new Error(`Platform is not supported.`);\n }\n}\n\nexport async function configureClassicExpoUpdatesAsync(ctx: BuildContext<Job>): Promise<void> {\n if (ctx.job.releaseChannel) {\n await setClassicReleaseChannelNativelyAsync(ctx);\n } else {\n /**\n * If releaseChannel is not defined:\n * 1. Try to infer it from the native value.\n * 2. If it is not set, fallback to 'default'.\n */\n const releaseChannel = await getNativelyDefinedClassicReleaseChannelAsync(ctx);\n if (releaseChannel) {\n ctx.logger.info(\n `Using the release channel pre-configured in native project (${releaseChannel})`\n );\n ctx.logger.warn('Please add the \"releaseChannel\" field to your build profile (eas.json)');\n } else {\n ctx.logger.info(`Using default release channel for 'expo-updates' (default)`);\n }\n }\n}\n\nexport async function configureEASExpoUpdatesAsync(ctx: BuildContext<Job>): Promise<void> {\n await setChannelNativelyAsync(ctx);\n}\n\nexport async function configureExpoUpdatesIfInstalledAsync(ctx: BuildContext<Job>): Promise<void> {\n if (!(await isExpoUpdatesInstalledAsync(ctx.getReactNativeProjectDirectory()))) {\n return;\n }\n\n const appConfigRuntimeVersion =\n ctx.job.version?.runtimeVersion ??\n (await getRuntimeVersionNullableAsync(\n ctx.getReactNativeProjectDirectory(),\n ctx.appConfig,\n ctx.job.platform\n ));\n if (ctx.metadata?.runtimeVersion && ctx.metadata?.runtimeVersion !== appConfigRuntimeVersion) {\n ctx.markBuildPhaseHasWarnings();\n ctx.logger.warn(\n `Runtime version from the app config evaluated on your local machine (${ctx.metadata.runtimeVersion}) does not match the one resolved here (${appConfigRuntimeVersion}).`\n );\n ctx.logger.warn(\n \"If you're using conditional app configs, e.g. depending on an environment variable, make sure to set the variable in eas.json or configure it with EAS Secret.\"\n );\n }\n\n if (isEASUpdateConfigured(ctx)) {\n if (ctx.job.updates?.channel !== undefined) {\n await configureEASExpoUpdatesAsync(ctx);\n } else {\n const channel = await getChannelAsync(ctx);\n if (channel !== null) {\n const configFile =\n ctx.job.platform === Platform.ANDROID ? 'AndroidManifest.xml' : 'Expo.plist';\n ctx.logger.info(`The channel name for EAS Update in ${configFile} is set to \"${channel}\"`);\n } else {\n if (ctx.job.releaseChannel !== undefined) {\n ctx.logger.warn(\n `This build is configured with EAS Update however has a Classic Updates releaseChannel set instead of having an EAS Update channel.`\n );\n } else {\n ctx.logger.warn(\n `This build is configured to query EAS Update for updates, however no channel is set in eas.json.`\n );\n }\n ctx.markBuildPhaseHasWarnings();\n }\n }\n } else {\n await configureClassicExpoUpdatesAsync(ctx);\n }\n\n if (ctx.job.version?.runtimeVersion) {\n ctx.logger.info('Updating runtimeVersion in Expo.plist');\n await setRuntimeVersionNativelyAsync(ctx, ctx.job.version.runtimeVersion);\n }\n}\n\nexport async function getChannelAsync(ctx: BuildContext<Job>): Promise<string | null> {\n switch (ctx.job.platform) {\n case Platform.ANDROID: {\n return await androidGetNativelyDefinedChannelAsync(ctx);\n }\n case Platform.IOS: {\n return await iosGetNativelyDefinedChannelAsync(ctx);\n }\n default:\n throw new Error(`Platform is not supported.`);\n }\n}\n\nexport async function getRuntimeVersionAsync(ctx: BuildContext<Job>): Promise<string | null> {\n switch (ctx.job.platform) {\n case Platform.ANDROID: {\n return await androidGetNativelyDefinedRuntimeVersionAsync(ctx);\n }\n case Platform.IOS: {\n return await iosGetNativelyDefinedRuntimeVersionAsync(ctx);\n }\n default:\n throw new Error(`Platform is not supported.`);\n }\n}\n\nexport function isEASUpdateConfigured(ctx: BuildContext<Job>): boolean {\n const rawUrl = ctx.appConfig.updates?.url;\n if (!rawUrl) {\n return false;\n }\n try {\n const url = new URL(rawUrl);\n return ['u.expo.dev', 'staging-u.expo.dev'].includes(url.hostname);\n } catch (err) {\n ctx.logger.error({ err }, `Cannot parse expo.updates.url = ${rawUrl} as URL`);\n ctx.logger.error(`Assuming EAS Update is not configured`);\n return false;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"expoUpdates.js","sourceRoot":"","sources":["../../src/utils/expoUpdates.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'assert';\n\nimport { Platform, Job } from '@expo/eas-build-job';\nimport { getRuntimeVersionNullableAsync } from '@expo/config-plugins/build/utils/Updates';\nimport semver from 'semver';\n\nimport {\n androidSetRuntimeVersionNativelyAsync,\n androidSetChannelNativelyAsync,\n androidSetClassicReleaseChannelNativelyAsync,\n androidGetNativelyDefinedClassicReleaseChannelAsync,\n androidGetNativelyDefinedRuntimeVersionAsync,\n androidGetNativelyDefinedChannelAsync,\n} from '../android/expoUpdates';\nimport {\n iosSetRuntimeVersionNativelyAsync,\n iosSetChannelNativelyAsync,\n iosSetClassicReleaseChannelNativelyAsync,\n iosGetNativelyDefinedClassicReleaseChannelAsync,\n iosGetNativelyDefinedRuntimeVersionAsync,\n iosGetNativelyDefinedChannelAsync,\n} from '../ios/expoUpdates';\nimport { BuildContext } from '../context';\n\nimport getExpoUpdatesPackageVersionIfInstalledAsync from './getExpoUpdatesPackageVersionIfInstalledAsync';\n\nexport async function setRuntimeVersionNativelyAsync(\n ctx: BuildContext<Job>,\n runtimeVersion: string\n): Promise<void> {\n switch (ctx.job.platform) {\n case Platform.ANDROID: {\n await androidSetRuntimeVersionNativelyAsync(ctx, runtimeVersion);\n return;\n }\n case Platform.IOS: {\n await iosSetRuntimeVersionNativelyAsync(ctx, runtimeVersion);\n return;\n }\n default:\n throw new Error(`Platform is not supported.`);\n }\n}\n\n/**\n * Used for when Expo Updates is pointed at an EAS server.\n */\nexport async function setChannelNativelyAsync(ctx: BuildContext<Job>): Promise<void> {\n assert(ctx.job.updates?.channel, 'updates.channel must be defined');\n const newUpdateRequestHeaders: Record<string, string> = {\n 'expo-channel-name': ctx.job.updates.channel,\n };\n\n const configFile = ctx.job.platform === Platform.ANDROID ? 'AndroidManifest.xml' : 'Expo.plist';\n ctx.logger.info(\n `Setting the update request headers in '${configFile}' to '${JSON.stringify(\n newUpdateRequestHeaders\n )}'`\n );\n\n switch (ctx.job.platform) {\n case Platform.ANDROID: {\n await androidSetChannelNativelyAsync(ctx);\n return;\n }\n case Platform.IOS: {\n await iosSetChannelNativelyAsync(ctx);\n return;\n }\n default:\n throw new Error(`Platform is not supported.`);\n }\n}\n\n/**\n * Used for classic Expo Updates\n */\nexport async function setClassicReleaseChannelNativelyAsync(ctx: BuildContext<Job>): Promise<void> {\n assert(ctx.job.releaseChannel, 'releaseChannel must be defined');\n\n const configFile = ctx.job.platform === Platform.ANDROID ? 'AndroidManifest.xml' : 'Expo.plist';\n ctx.logger.info(`Setting the release channel in '${configFile}' to '${ctx.job.releaseChannel}'`);\n\n switch (ctx.job.platform) {\n case Platform.ANDROID: {\n await androidSetClassicReleaseChannelNativelyAsync(ctx);\n return;\n }\n case Platform.IOS: {\n await iosSetClassicReleaseChannelNativelyAsync(ctx);\n return;\n }\n default:\n throw new Error(`Platform is not supported.`);\n }\n}\n\n/**\n * Used for classic Expo Updates\n */\nexport async function getNativelyDefinedClassicReleaseChannelAsync(\n ctx: BuildContext<Job>\n): Promise<string | null> {\n switch (ctx.job.platform) {\n case Platform.ANDROID: {\n return androidGetNativelyDefinedClassicReleaseChannelAsync(ctx);\n }\n case Platform.IOS: {\n return iosGetNativelyDefinedClassicReleaseChannelAsync(ctx);\n }\n default:\n throw new Error(`Platform is not supported.`);\n }\n}\n\nexport async function configureClassicExpoUpdatesAsync(ctx: BuildContext<Job>): Promise<void> {\n if (ctx.job.releaseChannel) {\n await setClassicReleaseChannelNativelyAsync(ctx);\n } else {\n /**\n * If releaseChannel is not defined:\n * 1. Try to infer it from the native value.\n * 2. If it is not set, fallback to 'default'.\n */\n const releaseChannel = await getNativelyDefinedClassicReleaseChannelAsync(ctx);\n if (releaseChannel) {\n ctx.logger.info(\n `Using the release channel pre-configured in native project (${releaseChannel})`\n );\n ctx.logger.warn('Please add the \"releaseChannel\" field to your build profile (eas.json)');\n } else {\n ctx.logger.info(`Using default release channel for 'expo-updates' (default)`);\n }\n }\n}\n\nexport async function configureEASExpoUpdatesAsync(ctx: BuildContext<Job>): Promise<void> {\n await setChannelNativelyAsync(ctx);\n}\n\nexport async function configureExpoUpdatesIfInstalledAsync(ctx: BuildContext<Job>): Promise<void> {\n const expoUpdatesVersion = await getExpoUpdatesPackageVersionIfInstalledAsync(\n ctx.getReactNativeProjectDirectory()\n );\n if (expoUpdatesVersion === null) {\n return;\n }\n\n const appConfigRuntimeVersion =\n ctx.job.version?.runtimeVersion ??\n (await getRuntimeVersionNullableAsync(\n ctx.getReactNativeProjectDirectory(),\n ctx.appConfig,\n ctx.job.platform\n ));\n if (ctx.metadata?.runtimeVersion && ctx.metadata?.runtimeVersion !== appConfigRuntimeVersion) {\n ctx.markBuildPhaseHasWarnings();\n ctx.logger.warn(\n `Runtime version from the app config evaluated on your local machine (${ctx.metadata.runtimeVersion}) does not match the one resolved here (${appConfigRuntimeVersion}).`\n );\n ctx.logger.warn(\n \"If you're using conditional app configs, e.g. depending on an environment variable, make sure to set the variable in eas.json or configure it with EAS Secret.\"\n );\n }\n\n if (isEASUpdateConfigured(ctx)) {\n if (ctx.job.updates?.channel !== undefined) {\n await configureEASExpoUpdatesAsync(ctx);\n } else {\n const channel = await getChannelAsync(ctx);\n if (channel !== null) {\n const configFile =\n ctx.job.platform === Platform.ANDROID ? 'AndroidManifest.xml' : 'Expo.plist';\n ctx.logger.info(`The channel name for EAS Update in ${configFile} is set to \"${channel}\"`);\n } else {\n if (ctx.job.releaseChannel !== undefined) {\n ctx.logger.warn(\n `This build is configured with EAS Update however has a Classic Updates releaseChannel set instead of having an EAS Update channel.`\n );\n } else {\n ctx.logger.warn(\n `This build is configured to query EAS Update for updates, however no channel is set in eas.json.`\n );\n }\n ctx.markBuildPhaseHasWarnings();\n }\n }\n } else if (shouldConfigureClassicUpdatesReleaseChannelAsFallback(expoUpdatesVersion)) {\n await configureClassicExpoUpdatesAsync(ctx);\n }\n\n if (ctx.job.version?.runtimeVersion) {\n ctx.logger.info('Updating runtimeVersion in Expo.plist');\n await setRuntimeVersionNativelyAsync(ctx, ctx.job.version.runtimeVersion);\n }\n}\n\nexport async function getChannelAsync(ctx: BuildContext<Job>): Promise<string | null> {\n switch (ctx.job.platform) {\n case Platform.ANDROID: {\n return await androidGetNativelyDefinedChannelAsync(ctx);\n }\n case Platform.IOS: {\n return await iosGetNativelyDefinedChannelAsync(ctx);\n }\n default:\n throw new Error(`Platform is not supported.`);\n }\n}\n\nexport async function getRuntimeVersionAsync(ctx: BuildContext<Job>): Promise<string | null> {\n switch (ctx.job.platform) {\n case Platform.ANDROID: {\n return await androidGetNativelyDefinedRuntimeVersionAsync(ctx);\n }\n case Platform.IOS: {\n return await iosGetNativelyDefinedRuntimeVersionAsync(ctx);\n }\n default:\n throw new Error(`Platform is not supported.`);\n }\n}\n\nexport function isEASUpdateConfigured(ctx: BuildContext<Job>): boolean {\n const rawUrl = ctx.appConfig.updates?.url;\n if (!rawUrl) {\n return false;\n }\n try {\n const url = new URL(rawUrl);\n return ['u.expo.dev', 'staging-u.expo.dev'].includes(url.hostname);\n } catch (err) {\n ctx.logger.error({ err }, `Cannot parse expo.updates.url = ${rawUrl} as URL`);\n ctx.logger.error(`Assuming EAS Update is not configured`);\n return false;\n }\n}\n\nexport function shouldConfigureClassicUpdatesReleaseChannelAsFallback(\n expoUpdatesPackageVersion: string\n): boolean {\n // Anything before SDK 50 should configure classic updates as a fallback. The first version\n // of the expo-updates package published for SDK 50 was 0.19.0\n return semver.lt(expoUpdatesPackageVersion, '0.19.0');\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function getExpoUpdatesPackageVersionIfInstalledAsync(reactNativeProjectDirectory: string): Promise<string | null>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
7
|
+
const resolve_from_1 = __importDefault(require("resolve-from"));
|
|
8
|
+
async function getExpoUpdatesPackageVersionIfInstalledAsync(reactNativeProjectDirectory) {
|
|
9
|
+
const maybePackageJson = resolve_from_1.default.silent(reactNativeProjectDirectory, 'expo-updates/package.json');
|
|
10
|
+
if (maybePackageJson) {
|
|
11
|
+
const { version } = await fs_extra_1.default.readJson(maybePackageJson);
|
|
12
|
+
return version;
|
|
13
|
+
}
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
exports.default = getExpoUpdatesPackageVersionIfInstalledAsync;
|
|
17
|
+
//# sourceMappingURL=getExpoUpdatesPackageVersionIfInstalledAsync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getExpoUpdatesPackageVersionIfInstalledAsync.js","sourceRoot":"","sources":["../../src/utils/getExpoUpdatesPackageVersionIfInstalledAsync.ts"],"names":[],"mappings":";;;;;AAAA,wDAA0B;AAC1B,gEAAuC;AAExB,KAAK,UAAU,4CAA4C,CACxE,2BAAmC;IAEnC,MAAM,gBAAgB,GAAG,sBAAW,CAAC,MAAM,CACzC,2BAA2B,EAC3B,2BAA2B,CAC5B,CAAC;IAEF,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QACxD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAdD,+DAcC","sourcesContent":["import fs from 'fs-extra';\nimport resolveFrom from 'resolve-from';\n\nexport default async function getExpoUpdatesPackageVersionIfInstalledAsync(\n reactNativeProjectDirectory: string\n): Promise<string | null> {\n const maybePackageJson = resolveFrom.silent(\n reactNativeProjectDirectory,\n 'expo-updates/package.json'\n );\n\n if (maybePackageJson) {\n const { version } = await fs.readJson(maybePackageJson);\n return version;\n }\n\n return null;\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/// <reference types="bunyan" />
|
|
2
|
+
import { bunyan } from '@expo/logger';
|
|
3
|
+
export declare function sleepAsync(ms: number): Promise<void>;
|
|
4
|
+
export interface RetryOptions {
|
|
5
|
+
retries: number;
|
|
6
|
+
retryIntervalMs: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function retryAsync<T = void>(fn: (attemptCount: number) => Promise<T>, { retryOptions: { retries, retryIntervalMs }, logger, }: {
|
|
9
|
+
retryOptions: RetryOptions;
|
|
10
|
+
logger?: bunyan;
|
|
11
|
+
}): Promise<T>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.retryAsync = exports.sleepAsync = void 0;
|
|
4
|
+
async function sleepAsync(ms) {
|
|
5
|
+
await new Promise((res) => setTimeout(res, ms));
|
|
6
|
+
}
|
|
7
|
+
exports.sleepAsync = sleepAsync;
|
|
8
|
+
async function retryAsync(fn, { retryOptions: { retries, retryIntervalMs }, logger, }) {
|
|
9
|
+
let attemptCount = -1;
|
|
10
|
+
for (;;) {
|
|
11
|
+
try {
|
|
12
|
+
attemptCount += 1;
|
|
13
|
+
return await fn(attemptCount);
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
logger === null || logger === void 0 ? void 0 : logger.debug({ err, stdout: err.stdout, stderr: err.stderr }, `Retry attempt ${attemptCount}`);
|
|
17
|
+
await sleepAsync(retryIntervalMs);
|
|
18
|
+
if (attemptCount === retries) {
|
|
19
|
+
throw err;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.retryAsync = retryAsync;
|
|
25
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":";;;AAEO,KAAK,UAAU,UAAU,CAAC,EAAU;IACzC,MAAM,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AAClD,CAAC;AAFD,gCAEC;AAOM,KAAK,UAAU,UAAU,CAC9B,EAAwC,EACxC,EACE,YAAY,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,EAC1C,MAAM,GAIP;IAED,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;IACtB,SAAS,CAAC;QACR,IAAI,CAAC;YACH,YAAY,IAAI,CAAC,CAAC;YAClB,OAAO,MAAM,EAAE,CAAC,YAAY,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,CACX,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAC/C,iBAAiB,YAAY,EAAE,CAChC,CAAC;YACF,MAAM,UAAU,CAAC,eAAe,CAAC,CAAC;YAClC,IAAI,YAAY,KAAK,OAAO,EAAE,CAAC;gBAC7B,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AA1BD,gCA0BC","sourcesContent":["import { bunyan } from '@expo/logger';\n\nexport async function sleepAsync(ms: number): Promise<void> {\n await new Promise((res) => setTimeout(res, ms));\n}\n\nexport interface RetryOptions {\n retries: number;\n retryIntervalMs: number;\n}\n\nexport async function retryAsync<T = void>(\n fn: (attemptCount: number) => Promise<T>,\n {\n retryOptions: { retries, retryIntervalMs },\n logger,\n }: {\n retryOptions: RetryOptions;\n logger?: bunyan;\n }\n): Promise<T> {\n let attemptCount = -1;\n for (;;) {\n try {\n attemptCount += 1;\n return await fn(attemptCount);\n } catch (err: any) {\n logger?.debug(\n { err, stdout: err.stdout, stderr: err.stderr },\n `Retry attempt ${attemptCount}`\n );\n await sleepAsync(retryIntervalMs);\n if (attemptCount === retries) {\n throw err;\n }\n }\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@expo/build-tools",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.62",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"files": [
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"@expo/config": "8.5.4",
|
|
25
25
|
"@expo/config-plugins": "7.8.4",
|
|
26
26
|
"@expo/downloader": "1.0.57",
|
|
27
|
-
"@expo/eas-build-job": "1.0.
|
|
27
|
+
"@expo/eas-build-job": "1.0.61",
|
|
28
28
|
"@expo/env": "^0.0.5",
|
|
29
29
|
"@expo/logger": "1.0.57",
|
|
30
30
|
"@expo/package-manager": "1.1.2",
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
"node-forge": "^1.3.1",
|
|
41
41
|
"nullthrows": "^1.1.1",
|
|
42
42
|
"plist": "^3.1.0",
|
|
43
|
+
"resolve-from": "^5.0.0",
|
|
43
44
|
"semver": "^7.5.4"
|
|
44
45
|
},
|
|
45
46
|
"devDependencies": {
|
|
@@ -66,5 +67,5 @@
|
|
|
66
67
|
"node": "20.11.0",
|
|
67
68
|
"yarn": "1.22.21"
|
|
68
69
|
},
|
|
69
|
-
"gitHead": "
|
|
70
|
+
"gitHead": "17867d5bf0861a1028dd199bc19903c4294c39fd"
|
|
70
71
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default function isExpoUpdatesInstalledAsync(reactNativeProjectDirectory: string): Promise<boolean>;
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const path_1 = __importDefault(require("path"));
|
|
7
|
-
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
-
async function isExpoUpdatesInstalledAsync(reactNativeProjectDirectory) {
|
|
9
|
-
const packageJsonPath = path_1.default.join(reactNativeProjectDirectory, 'package.json');
|
|
10
|
-
const packageJson = JSON.parse(await fs_extra_1.default.readFile(packageJsonPath, 'utf8'));
|
|
11
|
-
return packageJson.dependencies ? 'expo-updates' in packageJson.dependencies : false;
|
|
12
|
-
}
|
|
13
|
-
exports.default = isExpoUpdatesInstalledAsync;
|
|
14
|
-
//# sourceMappingURL=isExpoUpdatesInstalled.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"isExpoUpdatesInstalled.js","sourceRoot":"","sources":["../../src/utils/isExpoUpdatesInstalled.ts"],"names":[],"mappings":";;;;;AAAA,gDAAwB;AAExB,wDAA0B;AAEX,KAAK,UAAU,2BAA2B,CACvD,2BAAmC;IAEnC,MAAM,eAAe,GAAG,cAAI,CAAC,IAAI,CAAC,2BAA2B,EAAE,cAAc,CAAC,CAAC;IAC/E,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,kBAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3E,OAAO,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,IAAI,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC;AACvF,CAAC;AAND,8CAMC","sourcesContent":["import path from 'path';\n\nimport fs from 'fs-extra';\n\nexport default async function isExpoUpdatesInstalledAsync(\n reactNativeProjectDirectory: string\n): Promise<boolean> {\n const packageJsonPath = path.join(reactNativeProjectDirectory, 'package.json');\n const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf8'));\n return packageJson.dependencies ? 'expo-updates' in packageJson.dependencies : false;\n}\n"]}
|