@expo/build-tools 1.0.176 → 1.0.178

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/LICENSE CHANGED
@@ -12,7 +12,7 @@ Additional Use Grant: You may make use of the Licensed Work, provided that you d
12
12
  to access the functionality of and directly benefit from the
13
13
  functionality of the Licensed Work.
14
14
 
15
- Change Date: 2028-01-01
15
+ Change Date: 2028-04-01
16
16
 
17
17
  Change License: MIT
18
18
 
@@ -22,7 +22,8 @@ exports.ensureLFLineEndingsInGradlewScript = ensureLFLineEndingsInGradlewScript;
22
22
  async function runGradleCommand(ctx, { logger, gradleCommand, androidDir, extraEnv, }) {
23
23
  logger.info(`Running 'gradlew ${gradleCommand}' in ${androidDir}`);
24
24
  await fs_extra_1.default.chmod(path_1.default.join(androidDir, 'gradlew'), 0o755);
25
- const spawnPromise = (0, turtle_spawn_1.default)('bash', ['-c', `./gradlew ${gradleCommand}`], {
25
+ const verboseFlag = ctx.env['EAS_VERBOSE'] === '1' ? '--info' : '';
26
+ const spawnPromise = (0, turtle_spawn_1.default)('bash', ['-c', `./gradlew ${gradleCommand} ${verboseFlag}`], {
26
27
  cwd: androidDir,
27
28
  logger,
28
29
  lineTransformer: (line) => {
@@ -1 +1 @@
1
- {"version":3,"file":"gradle.js","sourceRoot":"","sources":["../../src/android/gradle.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\nimport assert from 'assert';\n\nimport spawn, { SpawnPromise, SpawnResult } from '@expo/turtle-spawn';\nimport { Android, Env, Job, Platform } from '@expo/eas-build-job';\nimport fs from 'fs-extra';\nimport { bunyan } from '@expo/logger';\n\nimport { BuildContext } from '../context';\nimport { getParentAndDescendantProcessPidsAsync } from '../utils/processes';\n\nexport async function ensureLFLineEndingsInGradlewScript<TJob extends Job>(\n ctx: BuildContext<TJob>\n): Promise<void> {\n const gradlewPath = path.join(ctx.getReactNativeProjectDirectory(), 'android', 'gradlew');\n const gradlewContent = await fs.readFile(gradlewPath, 'utf8');\n if (gradlewContent.includes('\\r')) {\n ctx.logger.info('Replacing CRLF line endings with LF in gradlew script');\n await fs.writeFile(gradlewPath, gradlewContent.replace(/\\r\\n/g, '\\n'), 'utf8');\n }\n}\n\nexport async function runGradleCommand(\n ctx: BuildContext<Job>,\n {\n logger,\n gradleCommand,\n androidDir,\n extraEnv,\n }: { logger: bunyan; gradleCommand: string; androidDir: string; extraEnv?: Env }\n): Promise<void> {\n logger.info(`Running 'gradlew ${gradleCommand}' in ${androidDir}`);\n await fs.chmod(path.join(androidDir, 'gradlew'), 0o755);\n const spawnPromise = spawn('bash', ['-c', `./gradlew ${gradleCommand}`], {\n cwd: androidDir,\n logger,\n lineTransformer: (line?: string) => {\n if (!line || /^\\.+$/.exec(line)) {\n return null;\n } else {\n return line;\n }\n },\n env: { ...ctx.env, ...extraEnv, ...resolveVersionOverridesEnvs(ctx) },\n });\n if (ctx.env.EAS_BUILD_RUNNER === 'eas-build' && process.platform === 'linux') {\n adjustOOMScore(spawnPromise, logger);\n }\n\n await spawnPromise;\n}\n\n/**\n * OOM Killer sometimes kills worker server while build is exceeding memory limits.\n * `oom_score_adj` is a value between -1000 and 1000 and it defaults to 0.\n * It defines which process is more likely to get killed (higher value more likely).\n *\n * This function sets oom_score_adj for Gradle process and all its child processes.\n */\nfunction adjustOOMScore(spawnPromise: SpawnPromise<SpawnResult>, logger: bunyan): void {\n setTimeout(\n async () => {\n try {\n assert(spawnPromise.child.pid);\n const pids = await getParentAndDescendantProcessPidsAsync(spawnPromise.child.pid);\n await Promise.all(\n pids.map(async (pid: number) => {\n // Value 800 is just a guess here. It's probably higher than most other\n // process. I didn't want to set it any higher, because I'm not sure if OOM Killer\n // can start killing processes when there is still enough memory left.\n const oomScoreOverride = 800;\n await fs.writeFile(`/proc/${pid}/oom_score_adj`, `${oomScoreOverride}\\n`);\n })\n );\n } catch (err: any) {\n logger.debug({ err, stderr: err?.stderr }, 'Failed to override oom_score_adj');\n }\n },\n // Wait 20 seconds to make sure all child processes are started\n 20000\n );\n}\n\n// Version envs should be set at the beginning of the build, but when building\n// from github those values are resolved later.\nfunction resolveVersionOverridesEnvs(ctx: BuildContext<Job>): Env {\n const extraEnvs: Env = {};\n if (\n ctx.job.platform === Platform.ANDROID &&\n ctx.job.version?.versionCode &&\n !ctx.env.EAS_BUILD_ANDROID_VERSION_CODE\n ) {\n extraEnvs.EAS_BUILD_ANDROID_VERSION_CODE = ctx.job.version.versionCode;\n }\n if (\n ctx.job.platform === Platform.ANDROID &&\n ctx.job.version?.versionName &&\n !ctx.env.EAS_BUILD_ANDROID_VERSION_NAME\n ) {\n extraEnvs.EAS_BUILD_ANDROID_VERSION_NAME = ctx.job.version.versionName;\n }\n return extraEnvs;\n}\n\nexport function resolveGradleCommand(job: Android.Job): string {\n if (job.gradleCommand) {\n return job.gradleCommand;\n } else if (job.developmentClient) {\n return ':app:assembleDebug';\n } else if (!job.buildType) {\n return ':app:bundleRelease';\n } else if (job.buildType === Android.BuildType.APK) {\n return ':app:assembleRelease';\n } else {\n return ':app:bundleRelease';\n }\n}\n"]}
1
+ {"version":3,"file":"gradle.js","sourceRoot":"","sources":["../../src/android/gradle.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\nimport assert from 'assert';\n\nimport spawn, { SpawnPromise, SpawnResult } from '@expo/turtle-spawn';\nimport { Android, Env, Job, Platform } from '@expo/eas-build-job';\nimport fs from 'fs-extra';\nimport { bunyan } from '@expo/logger';\n\nimport { BuildContext } from '../context';\nimport { getParentAndDescendantProcessPidsAsync } from '../utils/processes';\n\nexport async function ensureLFLineEndingsInGradlewScript<TJob extends Job>(\n ctx: BuildContext<TJob>\n): Promise<void> {\n const gradlewPath = path.join(ctx.getReactNativeProjectDirectory(), 'android', 'gradlew');\n const gradlewContent = await fs.readFile(gradlewPath, 'utf8');\n if (gradlewContent.includes('\\r')) {\n ctx.logger.info('Replacing CRLF line endings with LF in gradlew script');\n await fs.writeFile(gradlewPath, gradlewContent.replace(/\\r\\n/g, '\\n'), 'utf8');\n }\n}\n\nexport async function runGradleCommand(\n ctx: BuildContext<Job>,\n {\n logger,\n gradleCommand,\n androidDir,\n extraEnv,\n }: { logger: bunyan; gradleCommand: string; androidDir: string; extraEnv?: Env }\n): Promise<void> {\n logger.info(`Running 'gradlew ${gradleCommand}' in ${androidDir}`);\n await fs.chmod(path.join(androidDir, 'gradlew'), 0o755);\n const verboseFlag = ctx.env['EAS_VERBOSE'] === '1' ? '--info' : '';\n\n const spawnPromise = spawn('bash', ['-c', `./gradlew ${gradleCommand} ${verboseFlag}`], {\n cwd: androidDir,\n logger,\n lineTransformer: (line?: string) => {\n if (!line || /^\\.+$/.exec(line)) {\n return null;\n } else {\n return line;\n }\n },\n env: { ...ctx.env, ...extraEnv, ...resolveVersionOverridesEnvs(ctx) },\n });\n if (ctx.env.EAS_BUILD_RUNNER === 'eas-build' && process.platform === 'linux') {\n adjustOOMScore(spawnPromise, logger);\n }\n\n await spawnPromise;\n}\n\n/**\n * OOM Killer sometimes kills worker server while build is exceeding memory limits.\n * `oom_score_adj` is a value between -1000 and 1000 and it defaults to 0.\n * It defines which process is more likely to get killed (higher value more likely).\n *\n * This function sets oom_score_adj for Gradle process and all its child processes.\n */\nfunction adjustOOMScore(spawnPromise: SpawnPromise<SpawnResult>, logger: bunyan): void {\n setTimeout(\n async () => {\n try {\n assert(spawnPromise.child.pid);\n const pids = await getParentAndDescendantProcessPidsAsync(spawnPromise.child.pid);\n await Promise.all(\n pids.map(async (pid: number) => {\n // Value 800 is just a guess here. It's probably higher than most other\n // process. I didn't want to set it any higher, because I'm not sure if OOM Killer\n // can start killing processes when there is still enough memory left.\n const oomScoreOverride = 800;\n await fs.writeFile(`/proc/${pid}/oom_score_adj`, `${oomScoreOverride}\\n`);\n })\n );\n } catch (err: any) {\n logger.debug({ err, stderr: err?.stderr }, 'Failed to override oom_score_adj');\n }\n },\n // Wait 20 seconds to make sure all child processes are started\n 20000\n );\n}\n\n// Version envs should be set at the beginning of the build, but when building\n// from github those values are resolved later.\nfunction resolveVersionOverridesEnvs(ctx: BuildContext<Job>): Env {\n const extraEnvs: Env = {};\n if (\n ctx.job.platform === Platform.ANDROID &&\n ctx.job.version?.versionCode &&\n !ctx.env.EAS_BUILD_ANDROID_VERSION_CODE\n ) {\n extraEnvs.EAS_BUILD_ANDROID_VERSION_CODE = ctx.job.version.versionCode;\n }\n if (\n ctx.job.platform === Platform.ANDROID &&\n ctx.job.version?.versionName &&\n !ctx.env.EAS_BUILD_ANDROID_VERSION_NAME\n ) {\n extraEnvs.EAS_BUILD_ANDROID_VERSION_NAME = ctx.job.version.versionName;\n }\n return extraEnvs;\n}\n\nexport function resolveGradleCommand(job: Android.Job): string {\n if (job.gradleCommand) {\n return job.gradleCommand;\n } else if (job.developmentClient) {\n return ':app:assembleDebug';\n } else if (!job.buildType) {\n return ':app:bundleRelease';\n } else if (job.buildType === Android.BuildType.APK) {\n return ':app:assembleRelease';\n } else {\n return ':app:bundleRelease';\n }\n}\n"]}
@@ -1,7 +1,15 @@
1
1
  import { Job } from '@expo/eas-build-job';
2
2
  import { SpawnPromise, SpawnResult, SpawnOptions } from '@expo/turtle-spawn';
3
3
  import { BuildContext } from '../context';
4
- export declare function installDependenciesAsync<TJob extends Job>(ctx: BuildContext<TJob>, { logger, infoCallbackFn, cwd }: SpawnOptions): Promise<{
4
+ import { PackageManager } from '../utils/packageManager';
5
+ export declare function installDependenciesAsync({ packageManager, env, logger, infoCallbackFn, cwd, useFrozenLockfile, }: {
6
+ packageManager: PackageManager;
7
+ env: Record<string, string | undefined>;
8
+ cwd: string;
9
+ logger: Exclude<SpawnOptions['logger'], undefined>;
10
+ infoCallbackFn?: SpawnOptions['infoCallbackFn'];
11
+ useFrozenLockfile: boolean;
12
+ }): Promise<{
5
13
  spawnPromise: SpawnPromise<SpawnResult>;
6
14
  }>;
7
15
  export declare function resolvePackagerDir(ctx: BuildContext<Job>): string;
@@ -8,24 +8,43 @@ const path_1 = __importDefault(require("path"));
8
8
  const turtle_spawn_1 = __importDefault(require("@expo/turtle-spawn"));
9
9
  const packageManager_1 = require("../utils/packageManager");
10
10
  const project_1 = require("../utils/project");
11
- async function installDependenciesAsync(ctx, { logger, infoCallbackFn, cwd }) {
12
- let args = ['install'];
13
- if (ctx.packageManager === packageManager_1.PackageManager.PNPM) {
14
- args = ['install', '--no-frozen-lockfile'];
15
- }
16
- else if (ctx.packageManager === packageManager_1.PackageManager.YARN) {
17
- const isYarn2 = await (0, project_1.isUsingYarn2)(ctx.getReactNativeProjectDirectory());
18
- if (isYarn2) {
19
- args = ['install', '--no-immutable', '--inline-builds'];
11
+ async function installDependenciesAsync({ packageManager, env, logger, infoCallbackFn, cwd, useFrozenLockfile, }) {
12
+ let args;
13
+ switch (packageManager) {
14
+ case packageManager_1.PackageManager.NPM: {
15
+ args = [useFrozenLockfile ? 'ci' : 'install'];
16
+ break;
17
+ }
18
+ case packageManager_1.PackageManager.PNPM: {
19
+ args = ['install', useFrozenLockfile ? '--frozen-lockfile' : '--no-frozen-lockfile'];
20
+ break;
20
21
  }
22
+ case packageManager_1.PackageManager.YARN: {
23
+ const isModernYarnVersion = await (0, project_1.isUsingModernYarnVersion)(cwd);
24
+ if (isModernYarnVersion) {
25
+ args = ['install', '--inline-builds', useFrozenLockfile ? '--immutable' : '--no-immutable'];
26
+ }
27
+ else {
28
+ args = ['install', ...(useFrozenLockfile ? ['--frozen-lockfile'] : [])];
29
+ }
30
+ break;
31
+ }
32
+ case packageManager_1.PackageManager.BUN:
33
+ args = ['install', ...(useFrozenLockfile ? ['--frozen-lockfile'] : [])];
34
+ break;
35
+ default:
36
+ throw new Error(`Unsupported package manager: ${packageManager}`);
37
+ }
38
+ if (env['EAS_VERBOSE'] === '1') {
39
+ args = [...args, '--verbose'];
21
40
  }
22
- logger === null || logger === void 0 ? void 0 : logger.info(`Running "${ctx.packageManager} ${args.join(' ')}" in ${cwd} directory`);
41
+ logger.info(`Running "${packageManager} ${args.join(' ')}" in ${cwd} directory`);
23
42
  return {
24
- spawnPromise: (0, turtle_spawn_1.default)(ctx.packageManager, args, {
43
+ spawnPromise: (0, turtle_spawn_1.default)(packageManager, args, {
25
44
  cwd,
26
45
  logger,
27
46
  infoCallbackFn,
28
- env: ctx.env,
47
+ env,
29
48
  }),
30
49
  };
31
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"installDependencies.js","sourceRoot":"","sources":["../../src/common/installDependencies.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAGxB,sEAAoF;AAGpF,4DAA8E;AAC9E,8CAAgD;AAEzC,KAAK,UAAU,wBAAwB,CAC5C,GAAuB,EACvB,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAgB;IAE7C,IAAI,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IACvB,IAAI,GAAG,CAAC,cAAc,KAAK,+BAAc,CAAC,IAAI,EAAE,CAAC;QAC/C,IAAI,GAAG,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC;IAC7C,CAAC;SAAM,IAAI,GAAG,CAAC,cAAc,KAAK,+BAAc,CAAC,IAAI,EAAE,CAAC;QACtD,MAAM,OAAO,GAAG,MAAM,IAAA,sBAAY,EAAC,GAAG,CAAC,8BAA8B,EAAE,CAAC,CAAC;QACzE,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,GAAG,CAAC,SAAS,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IACD,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,CAAC,YAAY,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,YAAY,CAAC,CAAC;IACtF,OAAO;QACL,YAAY,EAAE,IAAA,sBAAK,EAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE;YAC5C,GAAG;YACH,MAAM;YACN,cAAc;YACd,GAAG,EAAE,GAAG,CAAC,GAAG;SACb,CAAC;KACH,CAAC;AACJ,CAAC;AAtBD,4DAsBC;AAED,SAAgB,kBAAkB,CAAC,GAAsB;IACvD,MAAM,cAAc,GAAG,IAAA,oCAAmB,EAAC,GAAG,CAAC,8BAA8B,EAAE,CAAC,CAAC;IACjF,IAAI,cAAc,KAAK,GAAG,CAAC,8BAA8B,EAAE,EAAE,CAAC;QAC5D,MAAM,mCAAmC,GAAG,cAAI,CAAC,QAAQ,CACvD,GAAG,CAAC,cAAc,EAClB,GAAG,CAAC,8BAA8B,EAAE,CACrC,CAAC;QACF,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,qBAAqB,mCAAmC,UAAU,GAAG,CAAC,cAAc,YAAY,CACjG,CAAC;IACJ,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAZD,gDAYC","sourcesContent":["import path from 'path';\n\nimport { Job } from '@expo/eas-build-job';\nimport spawn, { SpawnPromise, SpawnResult, SpawnOptions } from '@expo/turtle-spawn';\n\nimport { BuildContext } from '../context';\nimport { PackageManager, findPackagerRootDir } from '../utils/packageManager';\nimport { isUsingYarn2 } from '../utils/project';\n\nexport async function installDependenciesAsync<TJob extends Job>(\n ctx: BuildContext<TJob>,\n { logger, infoCallbackFn, cwd }: SpawnOptions\n): Promise<{ spawnPromise: SpawnPromise<SpawnResult> }> {\n let args = ['install'];\n if (ctx.packageManager === PackageManager.PNPM) {\n args = ['install', '--no-frozen-lockfile'];\n } else if (ctx.packageManager === PackageManager.YARN) {\n const isYarn2 = await isUsingYarn2(ctx.getReactNativeProjectDirectory());\n if (isYarn2) {\n args = ['install', '--no-immutable', '--inline-builds'];\n }\n }\n logger?.info(`Running \"${ctx.packageManager} ${args.join(' ')}\" in ${cwd} directory`);\n return {\n spawnPromise: spawn(ctx.packageManager, args, {\n cwd,\n logger,\n infoCallbackFn,\n env: ctx.env,\n }),\n };\n}\n\nexport function resolvePackagerDir(ctx: BuildContext<Job>): string {\n const packagerRunDir = findPackagerRootDir(ctx.getReactNativeProjectDirectory());\n if (packagerRunDir !== ctx.getReactNativeProjectDirectory()) {\n const relativeReactNativeProjectDirectory = path.relative(\n ctx.buildDirectory,\n ctx.getReactNativeProjectDirectory()\n );\n ctx.logger.info(\n `We detected that '${relativeReactNativeProjectDirectory}' is a ${ctx.packageManager} workspace`\n );\n }\n return packagerRunDir;\n}\n"]}
1
+ {"version":3,"file":"installDependencies.js","sourceRoot":"","sources":["../../src/common/installDependencies.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAGxB,sEAAoF;AAGpF,4DAA8E;AAC9E,8CAA4D;AAErD,KAAK,UAAU,wBAAwB,CAAC,EAC7C,cAAc,EACd,GAAG,EACH,MAAM,EACN,cAAc,EACd,GAAG,EACH,iBAAiB,GAQlB;IACC,IAAI,IAAc,CAAC;IACnB,QAAQ,cAAc,EAAE,CAAC;QACvB,KAAK,+BAAc,CAAC,GAAG,CAAC,CAAC,CAAC;YACxB,IAAI,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAC9C,MAAM;QACR,CAAC;QACD,KAAK,+BAAc,CAAC,IAAI,CAAC,CAAC,CAAC;YACzB,IAAI,GAAG,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC;YACrF,MAAM;QACR,CAAC;QACD,KAAK,+BAAc,CAAC,IAAI,CAAC,CAAC,CAAC;YACzB,MAAM,mBAAmB,GAAG,MAAM,IAAA,kCAAwB,EAAC,GAAG,CAAC,CAAC;YAChE,IAAI,mBAAmB,EAAE,CAAC;gBACxB,IAAI,GAAG,CAAC,SAAS,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;YAC9F,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1E,CAAC;YACD,MAAM;QACR,CAAC;QACD,KAAK,+BAAc,CAAC,GAAG;YACrB,IAAI,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxE,MAAM;QACR;YACE,MAAM,IAAI,KAAK,CAAC,gCAAgC,cAAc,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,GAAG,CAAC,aAAa,CAAC,KAAK,GAAG,EAAE,CAAC;QAC/B,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,WAAW,CAAC,CAAC;IAChC,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,YAAY,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,YAAY,CAAC,CAAC;IACjF,OAAO;QACL,YAAY,EAAE,IAAA,sBAAK,EAAC,cAAc,EAAE,IAAI,EAAE;YACxC,GAAG;YACH,MAAM;YACN,cAAc;YACd,GAAG;SACJ,CAAC;KACH,CAAC;AACJ,CAAC;AApDD,4DAoDC;AAED,SAAgB,kBAAkB,CAAC,GAAsB;IACvD,MAAM,cAAc,GAAG,IAAA,oCAAmB,EAAC,GAAG,CAAC,8BAA8B,EAAE,CAAC,CAAC;IACjF,IAAI,cAAc,KAAK,GAAG,CAAC,8BAA8B,EAAE,EAAE,CAAC;QAC5D,MAAM,mCAAmC,GAAG,cAAI,CAAC,QAAQ,CACvD,GAAG,CAAC,cAAc,EAClB,GAAG,CAAC,8BAA8B,EAAE,CACrC,CAAC;QACF,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,qBAAqB,mCAAmC,UAAU,GAAG,CAAC,cAAc,YAAY,CACjG,CAAC;IACJ,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAZD,gDAYC","sourcesContent":["import path from 'path';\n\nimport { Job } from '@expo/eas-build-job';\nimport spawn, { SpawnPromise, SpawnResult, SpawnOptions } from '@expo/turtle-spawn';\n\nimport { BuildContext } from '../context';\nimport { PackageManager, findPackagerRootDir } from '../utils/packageManager';\nimport { isUsingModernYarnVersion } from '../utils/project';\n\nexport async function installDependenciesAsync({\n packageManager,\n env,\n logger,\n infoCallbackFn,\n cwd,\n useFrozenLockfile,\n}: {\n packageManager: PackageManager;\n env: Record<string, string | undefined>;\n cwd: string;\n logger: Exclude<SpawnOptions['logger'], undefined>;\n infoCallbackFn?: SpawnOptions['infoCallbackFn'];\n useFrozenLockfile: boolean;\n}): Promise<{ spawnPromise: SpawnPromise<SpawnResult> }> {\n let args: string[];\n switch (packageManager) {\n case PackageManager.NPM: {\n args = [useFrozenLockfile ? 'ci' : 'install'];\n break;\n }\n case PackageManager.PNPM: {\n args = ['install', useFrozenLockfile ? '--frozen-lockfile' : '--no-frozen-lockfile'];\n break;\n }\n case PackageManager.YARN: {\n const isModernYarnVersion = await isUsingModernYarnVersion(cwd);\n if (isModernYarnVersion) {\n args = ['install', '--inline-builds', useFrozenLockfile ? '--immutable' : '--no-immutable'];\n } else {\n args = ['install', ...(useFrozenLockfile ? ['--frozen-lockfile'] : [])];\n }\n break;\n }\n case PackageManager.BUN:\n args = ['install', ...(useFrozenLockfile ? ['--frozen-lockfile'] : [])];\n break;\n default:\n throw new Error(`Unsupported package manager: ${packageManager}`);\n }\n if (env['EAS_VERBOSE'] === '1') {\n args = [...args, '--verbose'];\n }\n logger.info(`Running \"${packageManager} ${args.join(' ')}\" in ${cwd} directory`);\n return {\n spawnPromise: spawn(packageManager, args, {\n cwd,\n logger,\n infoCallbackFn,\n env,\n }),\n };\n}\n\nexport function resolvePackagerDir(ctx: BuildContext<Job>): string {\n const packagerRunDir = findPackagerRootDir(ctx.getReactNativeProjectDirectory());\n if (packagerRunDir !== ctx.getReactNativeProjectDirectory()) {\n const relativeReactNativeProjectDirectory = path.relative(\n ctx.buildDirectory,\n ctx.getReactNativeProjectDirectory()\n );\n ctx.logger.info(\n `We detected that '${relativeReactNativeProjectDirectory}' is a ${ctx.packageManager} workspace`\n );\n }\n return packagerRunDir;\n}\n"]}
@@ -19,9 +19,13 @@ async function prebuildAsync(ctx, { logger, workingDir, options }) {
19
19
  options: spawnOptions,
20
20
  packageManager: ctx.packageManager,
21
21
  });
22
- const installDependenciesSpawnPromise = (await (0, installDependencies_1.installDependenciesAsync)(ctx, {
22
+ const installDependenciesSpawnPromise = (await (0, installDependencies_1.installDependenciesAsync)({
23
+ packageManager: ctx.packageManager,
24
+ env: ctx.env,
23
25
  logger,
24
26
  cwd: (0, installDependencies_1.resolvePackagerDir)(ctx),
27
+ // prebuild sometimes modifies package.json, so we don't want to use frozen lockfile
28
+ useFrozenLockfile: false,
25
29
  })).spawnPromise;
26
30
  await installDependenciesSpawnPromise;
27
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"prebuild.js","sourceRoot":"","sources":["../../src/common/prebuild.ts"],"names":[],"mappings":";;;AAKA,8CAAqD;AAErD,+DAAqF;AAM9E,KAAK,UAAU,aAAa,CACjC,GAAuB,EACvB,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAqE;IAElG,MAAM,YAAY,GAAiB;QACjC,GAAG,EAAE,UAAU;QACf,MAAM;QACN,GAAG,EAAE;YACH,yBAAyB,EAAE,GAAG;YAC9B,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS;YACrB,GAAG,GAAG,CAAC,GAAG;SACX;KACF,CAAC;IAEF,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IACxD,MAAM,IAAA,2BAAiB,EAAC;QACtB,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,YAAY;QACrB,cAAc,EAAE,GAAG,CAAC,cAAc;KACnC,CAAC,CAAC;IACH,MAAM,+BAA+B,GAAG,CACtC,MAAM,IAAA,8CAAwB,EAAC,GAAG,EAAE;QAClC,MAAM;QACN,GAAG,EAAE,IAAA,wCAAkB,EAAC,GAAG,CAAC;KAC7B,CAAC,CACH,CAAC,YAAY,CAAC;IACf,MAAM,+BAA+B,CAAC;AACxC,CAAC;AA3BD,sCA2BC;AAED,SAAS,sBAAsB,CAAwB,GAAuB;;IAC5E,IAAI,eAAe,GACjB,MAAA,MAAA,GAAG,CAAC,GAAG,CAAC,YAAY,0CAAE,eAAe,mCAAI,oCAAoC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IAClG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACjD,eAAe,GAAG,GAAG,eAAe,eAAe,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IACxE,CAAC;IACD,MAAM,gBAAgB,GAAG,MAAM,CAAC;IAChC,MAAM,iBAAiB,GAAG,OAAO,CAAC;IAClC,MAAM,oBAAoB,GAAG,WAAW,CAAC;IACzC,IAAI,eAAe,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjD,eAAe,GAAG,eAAe,CAAC,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9E,CAAC;IACD,IAAI,eAAe,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAClD,eAAe,GAAG,eAAe,CAAC,SAAS,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/E,CAAC;IACD,IAAI,eAAe,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACrD,eAAe,GAAG,eAAe,CAAC,SAAS,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAClF,CAAC;IAED,OAAO,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC","sourcesContent":["import { BuildJob } from '@expo/eas-build-job';\nimport { SpawnOptions } from '@expo/turtle-spawn';\nimport { bunyan } from '@expo/logger';\n\nimport { BuildContext } from '../context';\nimport { runExpoCliCommand } from '../utils/project';\n\nimport { installDependenciesAsync, resolvePackagerDir } from './installDependencies';\n\nexport interface PrebuildOptions {\n extraEnvs?: Record<string, string>;\n}\n\nexport async function prebuildAsync<TJob extends BuildJob>(\n ctx: BuildContext<TJob>,\n { logger, workingDir, options }: { logger: bunyan; workingDir: string; options?: PrebuildOptions }\n): Promise<void> {\n const spawnOptions: SpawnOptions = {\n cwd: workingDir,\n logger,\n env: {\n EXPO_IMAGE_UTILS_NO_SHARP: '1',\n ...options?.extraEnvs,\n ...ctx.env,\n },\n };\n\n const prebuildCommandArgs = getPrebuildCommandArgs(ctx);\n await runExpoCliCommand({\n args: prebuildCommandArgs,\n options: spawnOptions,\n packageManager: ctx.packageManager,\n });\n const installDependenciesSpawnPromise = (\n await installDependenciesAsync(ctx, {\n logger,\n cwd: resolvePackagerDir(ctx),\n })\n ).spawnPromise;\n await installDependenciesSpawnPromise;\n}\n\nfunction getPrebuildCommandArgs<TJob extends BuildJob>(ctx: BuildContext<TJob>): string[] {\n let prebuildCommand =\n ctx.job.experimental?.prebuildCommand ?? `prebuild --no-install --platform ${ctx.job.platform}`;\n if (!prebuildCommand.match(/(?:--platform| -p)/)) {\n prebuildCommand = `${prebuildCommand} --platform ${ctx.job.platform}`;\n }\n const npxCommandPrefix = 'npx ';\n const expoCommandPrefix = 'expo ';\n const expoCliCommandPrefix = 'expo-cli ';\n if (prebuildCommand.startsWith(npxCommandPrefix)) {\n prebuildCommand = prebuildCommand.substring(npxCommandPrefix.length).trim();\n }\n if (prebuildCommand.startsWith(expoCommandPrefix)) {\n prebuildCommand = prebuildCommand.substring(expoCommandPrefix.length).trim();\n }\n if (prebuildCommand.startsWith(expoCliCommandPrefix)) {\n prebuildCommand = prebuildCommand.substring(expoCliCommandPrefix.length).trim();\n }\n\n return prebuildCommand.split(' ');\n}\n"]}
1
+ {"version":3,"file":"prebuild.js","sourceRoot":"","sources":["../../src/common/prebuild.ts"],"names":[],"mappings":";;;AAKA,8CAAqD;AAErD,+DAAqF;AAM9E,KAAK,UAAU,aAAa,CACjC,GAAuB,EACvB,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAqE;IAElG,MAAM,YAAY,GAAiB;QACjC,GAAG,EAAE,UAAU;QACf,MAAM;QACN,GAAG,EAAE;YACH,yBAAyB,EAAE,GAAG;YAC9B,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS;YACrB,GAAG,GAAG,CAAC,GAAG;SACX;KACF,CAAC;IAEF,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IACxD,MAAM,IAAA,2BAAiB,EAAC;QACtB,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,YAAY;QACrB,cAAc,EAAE,GAAG,CAAC,cAAc;KACnC,CAAC,CAAC;IACH,MAAM,+BAA+B,GAAG,CACtC,MAAM,IAAA,8CAAwB,EAAC;QAC7B,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,MAAM;QACN,GAAG,EAAE,IAAA,wCAAkB,EAAC,GAAG,CAAC;QAC5B,oFAAoF;QACpF,iBAAiB,EAAE,KAAK;KACzB,CAAC,CACH,CAAC,YAAY,CAAC;IACf,MAAM,+BAA+B,CAAC;AACxC,CAAC;AA/BD,sCA+BC;AAED,SAAS,sBAAsB,CAAwB,GAAuB;;IAC5E,IAAI,eAAe,GACjB,MAAA,MAAA,GAAG,CAAC,GAAG,CAAC,YAAY,0CAAE,eAAe,mCAAI,oCAAoC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IAClG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACjD,eAAe,GAAG,GAAG,eAAe,eAAe,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IACxE,CAAC;IACD,MAAM,gBAAgB,GAAG,MAAM,CAAC;IAChC,MAAM,iBAAiB,GAAG,OAAO,CAAC;IAClC,MAAM,oBAAoB,GAAG,WAAW,CAAC;IACzC,IAAI,eAAe,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjD,eAAe,GAAG,eAAe,CAAC,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9E,CAAC;IACD,IAAI,eAAe,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAClD,eAAe,GAAG,eAAe,CAAC,SAAS,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/E,CAAC;IACD,IAAI,eAAe,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACrD,eAAe,GAAG,eAAe,CAAC,SAAS,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAClF,CAAC;IAED,OAAO,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC","sourcesContent":["import { BuildJob } from '@expo/eas-build-job';\nimport { SpawnOptions } from '@expo/turtle-spawn';\nimport { bunyan } from '@expo/logger';\n\nimport { BuildContext } from '../context';\nimport { runExpoCliCommand } from '../utils/project';\n\nimport { installDependenciesAsync, resolvePackagerDir } from './installDependencies';\n\nexport interface PrebuildOptions {\n extraEnvs?: Record<string, string>;\n}\n\nexport async function prebuildAsync<TJob extends BuildJob>(\n ctx: BuildContext<TJob>,\n { logger, workingDir, options }: { logger: bunyan; workingDir: string; options?: PrebuildOptions }\n): Promise<void> {\n const spawnOptions: SpawnOptions = {\n cwd: workingDir,\n logger,\n env: {\n EXPO_IMAGE_UTILS_NO_SHARP: '1',\n ...options?.extraEnvs,\n ...ctx.env,\n },\n };\n\n const prebuildCommandArgs = getPrebuildCommandArgs(ctx);\n await runExpoCliCommand({\n args: prebuildCommandArgs,\n options: spawnOptions,\n packageManager: ctx.packageManager,\n });\n const installDependenciesSpawnPromise = (\n await installDependenciesAsync({\n packageManager: ctx.packageManager,\n env: ctx.env,\n logger,\n cwd: resolvePackagerDir(ctx),\n // prebuild sometimes modifies package.json, so we don't want to use frozen lockfile\n useFrozenLockfile: false,\n })\n ).spawnPromise;\n await installDependenciesSpawnPromise;\n}\n\nfunction getPrebuildCommandArgs<TJob extends BuildJob>(ctx: BuildContext<TJob>): string[] {\n let prebuildCommand =\n ctx.job.experimental?.prebuildCommand ?? `prebuild --no-install --platform ${ctx.job.platform}`;\n if (!prebuildCommand.match(/(?:--platform| -p)/)) {\n prebuildCommand = `${prebuildCommand} --platform ${ctx.job.platform}`;\n }\n const npxCommandPrefix = 'npx ';\n const expoCommandPrefix = 'expo ';\n const expoCliCommandPrefix = 'expo-cli ';\n if (prebuildCommand.startsWith(npxCommandPrefix)) {\n prebuildCommand = prebuildCommand.substring(npxCommandPrefix.length).trim();\n }\n if (prebuildCommand.startsWith(expoCommandPrefix)) {\n prebuildCommand = prebuildCommand.substring(expoCommandPrefix.length).trim();\n }\n if (prebuildCommand.startsWith(expoCliCommandPrefix)) {\n prebuildCommand = prebuildCommand.substring(expoCliCommandPrefix.length).trim();\n }\n\n return prebuildCommand.split(' ');\n}\n"]}
@@ -54,7 +54,22 @@ async function setupAsync(ctx) {
54
54
  return packageJson;
55
55
  });
56
56
  await ctx.runBuildPhase(eas_build_job_1.BuildPhase.INSTALL_DEPENDENCIES, async () => {
57
- await runInstallDependenciesAsync(ctx);
57
+ var _a, _b, _c, _d;
58
+ const expoVersion = (_b = (_a = ctx.metadata) === null || _a === void 0 ? void 0 : _a.sdkVersion) !== null && _b !== void 0 ? _b : (0, packageManager_1.getPackageVersionFromPackageJson)({
59
+ packageJson,
60
+ packageName: 'expo',
61
+ });
62
+ const reactNativeVersion = (_d = (_c = ctx.metadata) === null || _c === void 0 ? void 0 : _c.reactNativeVersion) !== null && _d !== void 0 ? _d : (0, packageManager_1.getPackageVersionFromPackageJson)({
63
+ packageJson,
64
+ packageName: 'react-native',
65
+ });
66
+ await runInstallDependenciesAsync(ctx, {
67
+ useFrozenLockfile: (0, packageManager_1.shouldUseFrozenLockfile)({
68
+ env: ctx.env,
69
+ sdkVersion: expoVersion,
70
+ reactNativeVersion,
71
+ }),
72
+ });
58
73
  });
59
74
  await ctx.runBuildPhase(eas_build_job_1.BuildPhase.READ_APP_CONFIG, async () => {
60
75
  const appConfig = ctx.appConfig;
@@ -138,12 +153,14 @@ async function runExpoDoctor(ctx) {
138
153
  }
139
154
  }
140
155
  }
141
- async function runInstallDependenciesAsync(ctx) {
156
+ async function runInstallDependenciesAsync(ctx, { useFrozenLockfile, }) {
142
157
  let warnTimeout;
143
158
  let killTimeout;
144
159
  let killTimedOut = false;
145
160
  try {
146
- const installDependenciesSpawnPromise = (await (0, installDependencies_1.installDependenciesAsync)(ctx, {
161
+ const installDependenciesSpawnPromise = (await (0, installDependencies_1.installDependenciesAsync)({
162
+ packageManager: ctx.packageManager,
163
+ env: ctx.env,
147
164
  logger: ctx.logger,
148
165
  infoCallbackFn: () => {
149
166
  if (warnTimeout) {
@@ -154,6 +171,7 @@ async function runInstallDependenciesAsync(ctx) {
154
171
  }
155
172
  },
156
173
  cwd: (0, installDependencies_1.resolvePackagerDir)(ctx),
174
+ useFrozenLockfile,
157
175
  })).spawnPromise;
158
176
  warnTimeout = setTimeout(() => {
159
177
  ctx.logger.warn('"Install dependencies" phase takes longer then expected and it did not produce any logs in the past 15 minutes. Consider evaluating your package.json file for possible issues with dependencies');
@@ -1 +1 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/common/setup.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\n\nimport spawn, { SpawnResult } from '@expo/turtle-spawn';\nimport fs from 'fs-extra';\nimport { BuildJob, BuildPhase, Ios, Job, Platform } from '@expo/eas-build-job';\nimport { BuildTrigger } from '@expo/eas-build-job/dist/common';\nimport nullthrows from 'nullthrows';\nimport { ExpoConfig } from '@expo/config';\nimport { UserFacingError } from '@expo/eas-build-job/dist/errors';\n\nimport { BuildContext } from '../context';\nimport { deleteXcodeEnvLocalIfExistsAsync } from '../ios/xcodeEnv';\nimport { Hook, runHookIfPresent } from '../utils/hooks';\nimport { setUpNpmrcAsync } from '../utils/npmrc';\nimport { isAtLeastNpm7Async } from '../utils/packageManager';\nimport { readPackageJson } from '../utils/project';\nimport { getParentAndDescendantProcessPidsAsync } from '../utils/processes';\n\nimport { prepareProjectSourcesAsync } from './projectSources';\nimport { installDependenciesAsync, resolvePackagerDir } from './installDependencies';\nimport { resolveEnvFromBuildProfileAsync, runEasBuildInternalAsync } from './easBuildInternal';\n\nconst MAX_EXPO_DOCTOR_TIMEOUT_MS = 30 * 1000;\nconst INSTALL_DEPENDENCIES_WARN_TIMEOUT_MS = 15 * 60 * 1000;\nconst INSTALL_DEPENDENCIES_KILL_TIMEOUT_MS = 30 * 60 * 1000;\n\nclass DoctorTimeoutError extends Error {}\nclass InstallDependenciesTimeoutError extends Error {}\n\nexport async function setupAsync<TJob extends BuildJob>(ctx: BuildContext<TJob>): Promise<void> {\n await ctx.runBuildPhase(BuildPhase.PREPARE_PROJECT, async () => {\n await prepareProjectSourcesAsync(ctx);\n await setUpNpmrcAsync(ctx, ctx.logger);\n if (ctx.job.platform === Platform.IOS && ctx.env.EAS_BUILD_RUNNER === 'eas-build') {\n await deleteXcodeEnvLocalIfExistsAsync(ctx as BuildContext<Ios.Job>);\n }\n if (ctx.job.triggeredBy === BuildTrigger.GIT_BASED_INTEGRATION) {\n // We need to setup envs from eas.json before\n // eas-build-pre-install hook is called.\n const env = await resolveEnvFromBuildProfileAsync(ctx, {\n cwd: ctx.getReactNativeProjectDirectory(),\n });\n ctx.updateEnv(env);\n }\n });\n\n await ctx.runBuildPhase(BuildPhase.PRE_INSTALL_HOOK, async () => {\n await runHookIfPresent(ctx, Hook.PRE_INSTALL);\n });\n\n const packageJson = await ctx.runBuildPhase(BuildPhase.READ_PACKAGE_JSON, async () => {\n ctx.logger.info('Using package.json:');\n const packageJson = readPackageJson(ctx.getReactNativeProjectDirectory());\n ctx.logger.info(JSON.stringify(packageJson, null, 2));\n return packageJson;\n });\n\n await ctx.runBuildPhase(BuildPhase.INSTALL_DEPENDENCIES, async () => {\n await runInstallDependenciesAsync(ctx);\n });\n\n await ctx.runBuildPhase(BuildPhase.READ_APP_CONFIG, async () => {\n const appConfig = ctx.appConfig;\n ctx.logger.info('Using app configuration:');\n ctx.logger.info(JSON.stringify(appConfig, null, 2));\n await validateAppConfigAsync(ctx, appConfig);\n });\n\n if (ctx.job.triggeredBy === BuildTrigger.GIT_BASED_INTEGRATION) {\n await ctx.runBuildPhase(BuildPhase.EAS_BUILD_INTERNAL, async () => {\n if (!ctx.appConfig.ios?.bundleIdentifier && ctx.job.platform === Platform.IOS) {\n throw new Error(\n 'The \"ios.bundleIdentifier\" is required to be set in app config for builds triggered by GitHub integration. Learn more: https://docs.expo.dev/versions/latest/config/app/#bundleidentifier.'\n );\n }\n if (!ctx.appConfig.android?.package && ctx.job.platform === Platform.ANDROID) {\n throw new Error(\n 'The \"android.package\" is required to be set in app config for builds triggered by GitHub integration. Learn more: https://docs.expo.dev/versions/latest/config/app/#package.'\n );\n }\n const { newJob, newMetadata } = await runEasBuildInternalAsync({\n job: ctx.job,\n env: ctx.env,\n logger: ctx.logger,\n cwd: ctx.getReactNativeProjectDirectory(),\n projectRootOverride: ctx.env.EAS_NO_VCS ? ctx.buildDirectory : undefined,\n });\n ctx.updateJobInformation(newJob, newMetadata);\n });\n }\n\n const hasExpoPackage = !!packageJson.dependencies?.expo;\n if (!ctx.env.EAS_BUILD_DISABLE_EXPO_DOCTOR_STEP && hasExpoPackage) {\n await ctx.runBuildPhase(BuildPhase.RUN_EXPO_DOCTOR, async () => {\n try {\n await runExpoDoctor(ctx);\n } catch (err) {\n if (err instanceof DoctorTimeoutError) {\n ctx.logger.error(err.message);\n } else {\n ctx.logger.error({ err }, 'Command \"expo doctor\" failed.');\n }\n ctx.markBuildPhaseHasWarnings();\n }\n });\n }\n}\n\nasync function runExpoDoctor<TJob extends Job>(ctx: BuildContext<TJob>): Promise<SpawnResult> {\n ctx.logger.info('Running \"expo doctor\"');\n let timeout: NodeJS.Timeout | undefined;\n let timedOut = false;\n const isAtLeastNpm7 = await isAtLeastNpm7Async();\n try {\n const argsPrefix = isAtLeastNpm7 ? ['-y'] : [];\n const promise = spawn('npx', [...argsPrefix, 'expo-doctor'], {\n cwd: ctx.getReactNativeProjectDirectory(),\n logger: ctx.logger,\n env: ctx.env,\n });\n timeout = setTimeout(async () => {\n timedOut = true;\n const ppid = nullthrows(promise.child.pid);\n const pids = await getParentAndDescendantProcessPidsAsync(ppid);\n pids.forEach((pid) => {\n process.kill(pid);\n });\n ctx.reportError?.(`\"expo doctor\" timed out`, undefined, {\n extras: { buildId: ctx.env.EAS_BUILD_ID },\n });\n }, MAX_EXPO_DOCTOR_TIMEOUT_MS);\n return await promise;\n } catch (err: any) {\n if (timedOut) {\n throw new DoctorTimeoutError('\"expo doctor\" timed out, skipping...');\n }\n throw err;\n } finally {\n if (timeout) {\n clearTimeout(timeout);\n }\n }\n}\n\nasync function runInstallDependenciesAsync<TJob extends Job>(\n ctx: BuildContext<TJob>\n): Promise<void> {\n let warnTimeout: NodeJS.Timeout | undefined;\n let killTimeout: NodeJS.Timeout | undefined;\n let killTimedOut: boolean = false;\n try {\n const installDependenciesSpawnPromise = (\n await installDependenciesAsync(ctx, {\n logger: ctx.logger,\n infoCallbackFn: () => {\n if (warnTimeout) {\n warnTimeout.refresh();\n }\n if (killTimeout) {\n killTimeout.refresh();\n }\n },\n cwd: resolvePackagerDir(ctx),\n })\n ).spawnPromise;\n\n warnTimeout = setTimeout(() => {\n ctx.logger.warn(\n '\"Install dependencies\" phase takes longer then expected and it did not produce any logs in the past 15 minutes. Consider evaluating your package.json file for possible issues with dependencies'\n );\n }, INSTALL_DEPENDENCIES_WARN_TIMEOUT_MS);\n\n killTimeout = setTimeout(async () => {\n killTimedOut = true;\n ctx.logger.error(\n '\"Install dependencies\" phase takes a very long time and it did not produce any logs in the past 30 minutes. Most likely an unexpected error happened with your dependencies which caused the process to hang and it will be terminated'\n );\n const ppid = nullthrows(installDependenciesSpawnPromise.child.pid);\n const pids = await getParentAndDescendantProcessPidsAsync(ppid);\n pids.forEach((pid) => {\n process.kill(pid);\n });\n ctx.reportError?.('\"Install dependencies\" phase takes a very long time', undefined, {\n extras: { buildId: ctx.env.EAS_BUILD_ID },\n });\n }, INSTALL_DEPENDENCIES_KILL_TIMEOUT_MS);\n\n await installDependenciesSpawnPromise;\n } catch (err: any) {\n if (killTimedOut) {\n throw new InstallDependenciesTimeoutError(\n '\"Install dependencies\" phase was inactive for over 30 minutes. Please evaluate your package.json file'\n );\n }\n throw err;\n } finally {\n if (warnTimeout) {\n clearTimeout(warnTimeout);\n }\n if (killTimeout) {\n clearTimeout(killTimeout);\n }\n }\n}\n\nasync function validateAppConfigAsync(\n ctx: BuildContext<Job>,\n appConfig: ExpoConfig\n): Promise<void> {\n if (\n appConfig?.extra?.eas?.projectId &&\n ctx.env.EAS_BUILD_PROJECT_ID &&\n appConfig.extra.eas.projectId !== ctx.env.EAS_BUILD_PROJECT_ID\n ) {\n const isUsingDynamicConfig =\n (await fs.pathExists(path.join(ctx.getReactNativeProjectDirectory(), 'app.config.ts'))) ||\n (await fs.pathExists(path.join(ctx.getReactNativeProjectDirectory(), 'app.config.js')));\n const isGitHubBuild = ctx.job.triggeredBy === BuildTrigger.GIT_BASED_INTEGRATION;\n let extraMessage = '';\n if (isGitHubBuild && isUsingDynamicConfig) {\n extraMessage =\n 'Make sure you connected your GitHub repository to the correct Expo project and if you are using environment variables to switch between projects in app.config.js/app.config.ts remember to set those variables in eas.json too. ';\n } else if (isGitHubBuild) {\n extraMessage = 'Make sure you connected your GitHub repository to the correct Expo project. ';\n } else if (isUsingDynamicConfig) {\n extraMessage =\n 'If you are using environment variables to switch between projects in app.config.js/app.config.ts, make sure those variables are also set inside EAS Build. You can do that using \"env\" field in eas.json or EAS environment variables. ';\n }\n throw new UserFacingError(\n 'EAS_BUILD_PROJECT_ID_MISMATCH',\n `The value of the \"extra.eas.projectId\" field (${appConfig.extra.eas.projectId}) in the app config does not match the current project id (${ctx.env.EAS_BUILD_PROJECT_ID}). ${extraMessage}Learn more: https://expo.fyi/eas-config-mismatch.`\n );\n } else if (ctx.env.EAS_BUILD_PROJECT_ID && !appConfig?.extra?.eas?.projectId) {\n ctx.logger.error(`The \"extra.eas.projectId\" field is missing from your app config.`);\n ctx.markBuildPhaseHasWarnings();\n }\n}\n"]}
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/common/setup.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\n\nimport spawn, { SpawnResult } from '@expo/turtle-spawn';\nimport fs from 'fs-extra';\nimport { BuildJob, BuildPhase, Ios, Job, Platform } from '@expo/eas-build-job';\nimport { BuildTrigger } from '@expo/eas-build-job/dist/common';\nimport nullthrows from 'nullthrows';\nimport { ExpoConfig } from '@expo/config';\nimport { UserFacingError } from '@expo/eas-build-job/dist/errors';\n\nimport { BuildContext } from '../context';\nimport { deleteXcodeEnvLocalIfExistsAsync } from '../ios/xcodeEnv';\nimport { Hook, runHookIfPresent } from '../utils/hooks';\nimport { setUpNpmrcAsync } from '../utils/npmrc';\nimport {\n shouldUseFrozenLockfile,\n isAtLeastNpm7Async,\n getPackageVersionFromPackageJson,\n} from '../utils/packageManager';\nimport { readPackageJson } from '../utils/project';\nimport { getParentAndDescendantProcessPidsAsync } from '../utils/processes';\n\nimport { prepareProjectSourcesAsync } from './projectSources';\nimport { installDependenciesAsync, resolvePackagerDir } from './installDependencies';\nimport { resolveEnvFromBuildProfileAsync, runEasBuildInternalAsync } from './easBuildInternal';\n\nconst MAX_EXPO_DOCTOR_TIMEOUT_MS = 30 * 1000;\nconst INSTALL_DEPENDENCIES_WARN_TIMEOUT_MS = 15 * 60 * 1000;\nconst INSTALL_DEPENDENCIES_KILL_TIMEOUT_MS = 30 * 60 * 1000;\n\nclass DoctorTimeoutError extends Error {}\nclass InstallDependenciesTimeoutError extends Error {}\n\nexport async function setupAsync<TJob extends BuildJob>(ctx: BuildContext<TJob>): Promise<void> {\n await ctx.runBuildPhase(BuildPhase.PREPARE_PROJECT, async () => {\n await prepareProjectSourcesAsync(ctx);\n await setUpNpmrcAsync(ctx, ctx.logger);\n if (ctx.job.platform === Platform.IOS && ctx.env.EAS_BUILD_RUNNER === 'eas-build') {\n await deleteXcodeEnvLocalIfExistsAsync(ctx as BuildContext<Ios.Job>);\n }\n if (ctx.job.triggeredBy === BuildTrigger.GIT_BASED_INTEGRATION) {\n // We need to setup envs from eas.json before\n // eas-build-pre-install hook is called.\n const env = await resolveEnvFromBuildProfileAsync(ctx, {\n cwd: ctx.getReactNativeProjectDirectory(),\n });\n ctx.updateEnv(env);\n }\n });\n\n await ctx.runBuildPhase(BuildPhase.PRE_INSTALL_HOOK, async () => {\n await runHookIfPresent(ctx, Hook.PRE_INSTALL);\n });\n\n const packageJson = await ctx.runBuildPhase(BuildPhase.READ_PACKAGE_JSON, async () => {\n ctx.logger.info('Using package.json:');\n const packageJson = readPackageJson(ctx.getReactNativeProjectDirectory());\n ctx.logger.info(JSON.stringify(packageJson, null, 2));\n return packageJson;\n });\n\n await ctx.runBuildPhase(BuildPhase.INSTALL_DEPENDENCIES, async () => {\n const expoVersion =\n ctx.metadata?.sdkVersion ??\n getPackageVersionFromPackageJson({\n packageJson,\n packageName: 'expo',\n });\n\n const reactNativeVersion =\n ctx.metadata?.reactNativeVersion ??\n getPackageVersionFromPackageJson({\n packageJson,\n packageName: 'react-native',\n });\n\n await runInstallDependenciesAsync(ctx, {\n useFrozenLockfile: shouldUseFrozenLockfile({\n env: ctx.env,\n sdkVersion: expoVersion,\n reactNativeVersion,\n }),\n });\n });\n\n await ctx.runBuildPhase(BuildPhase.READ_APP_CONFIG, async () => {\n const appConfig = ctx.appConfig;\n ctx.logger.info('Using app configuration:');\n ctx.logger.info(JSON.stringify(appConfig, null, 2));\n await validateAppConfigAsync(ctx, appConfig);\n });\n\n if (ctx.job.triggeredBy === BuildTrigger.GIT_BASED_INTEGRATION) {\n await ctx.runBuildPhase(BuildPhase.EAS_BUILD_INTERNAL, async () => {\n if (!ctx.appConfig.ios?.bundleIdentifier && ctx.job.platform === Platform.IOS) {\n throw new Error(\n 'The \"ios.bundleIdentifier\" is required to be set in app config for builds triggered by GitHub integration. Learn more: https://docs.expo.dev/versions/latest/config/app/#bundleidentifier.'\n );\n }\n if (!ctx.appConfig.android?.package && ctx.job.platform === Platform.ANDROID) {\n throw new Error(\n 'The \"android.package\" is required to be set in app config for builds triggered by GitHub integration. Learn more: https://docs.expo.dev/versions/latest/config/app/#package.'\n );\n }\n const { newJob, newMetadata } = await runEasBuildInternalAsync({\n job: ctx.job,\n env: ctx.env,\n logger: ctx.logger,\n cwd: ctx.getReactNativeProjectDirectory(),\n projectRootOverride: ctx.env.EAS_NO_VCS ? ctx.buildDirectory : undefined,\n });\n ctx.updateJobInformation(newJob, newMetadata);\n });\n }\n\n const hasExpoPackage = !!packageJson.dependencies?.expo;\n if (!ctx.env.EAS_BUILD_DISABLE_EXPO_DOCTOR_STEP && hasExpoPackage) {\n await ctx.runBuildPhase(BuildPhase.RUN_EXPO_DOCTOR, async () => {\n try {\n await runExpoDoctor(ctx);\n } catch (err) {\n if (err instanceof DoctorTimeoutError) {\n ctx.logger.error(err.message);\n } else {\n ctx.logger.error({ err }, 'Command \"expo doctor\" failed.');\n }\n ctx.markBuildPhaseHasWarnings();\n }\n });\n }\n}\n\nasync function runExpoDoctor<TJob extends Job>(ctx: BuildContext<TJob>): Promise<SpawnResult> {\n ctx.logger.info('Running \"expo doctor\"');\n let timeout: NodeJS.Timeout | undefined;\n let timedOut = false;\n const isAtLeastNpm7 = await isAtLeastNpm7Async();\n try {\n const argsPrefix = isAtLeastNpm7 ? ['-y'] : [];\n const promise = spawn('npx', [...argsPrefix, 'expo-doctor'], {\n cwd: ctx.getReactNativeProjectDirectory(),\n logger: ctx.logger,\n env: ctx.env,\n });\n timeout = setTimeout(async () => {\n timedOut = true;\n const ppid = nullthrows(promise.child.pid);\n const pids = await getParentAndDescendantProcessPidsAsync(ppid);\n pids.forEach((pid) => {\n process.kill(pid);\n });\n ctx.reportError?.(`\"expo doctor\" timed out`, undefined, {\n extras: { buildId: ctx.env.EAS_BUILD_ID },\n });\n }, MAX_EXPO_DOCTOR_TIMEOUT_MS);\n return await promise;\n } catch (err: any) {\n if (timedOut) {\n throw new DoctorTimeoutError('\"expo doctor\" timed out, skipping...');\n }\n throw err;\n } finally {\n if (timeout) {\n clearTimeout(timeout);\n }\n }\n}\n\nasync function runInstallDependenciesAsync<TJob extends Job>(\n ctx: BuildContext<TJob>,\n {\n useFrozenLockfile,\n }: {\n useFrozenLockfile: boolean;\n }\n): Promise<void> {\n let warnTimeout: NodeJS.Timeout | undefined;\n let killTimeout: NodeJS.Timeout | undefined;\n let killTimedOut: boolean = false;\n try {\n const installDependenciesSpawnPromise = (\n await installDependenciesAsync({\n packageManager: ctx.packageManager,\n env: ctx.env,\n logger: ctx.logger,\n infoCallbackFn: () => {\n if (warnTimeout) {\n warnTimeout.refresh();\n }\n if (killTimeout) {\n killTimeout.refresh();\n }\n },\n cwd: resolvePackagerDir(ctx),\n useFrozenLockfile,\n })\n ).spawnPromise;\n\n warnTimeout = setTimeout(() => {\n ctx.logger.warn(\n '\"Install dependencies\" phase takes longer then expected and it did not produce any logs in the past 15 minutes. Consider evaluating your package.json file for possible issues with dependencies'\n );\n }, INSTALL_DEPENDENCIES_WARN_TIMEOUT_MS);\n\n killTimeout = setTimeout(async () => {\n killTimedOut = true;\n ctx.logger.error(\n '\"Install dependencies\" phase takes a very long time and it did not produce any logs in the past 30 minutes. Most likely an unexpected error happened with your dependencies which caused the process to hang and it will be terminated'\n );\n const ppid = nullthrows(installDependenciesSpawnPromise.child.pid);\n const pids = await getParentAndDescendantProcessPidsAsync(ppid);\n pids.forEach((pid) => {\n process.kill(pid);\n });\n ctx.reportError?.('\"Install dependencies\" phase takes a very long time', undefined, {\n extras: { buildId: ctx.env.EAS_BUILD_ID },\n });\n }, INSTALL_DEPENDENCIES_KILL_TIMEOUT_MS);\n\n await installDependenciesSpawnPromise;\n } catch (err: any) {\n if (killTimedOut) {\n throw new InstallDependenciesTimeoutError(\n '\"Install dependencies\" phase was inactive for over 30 minutes. Please evaluate your package.json file'\n );\n }\n throw err;\n } finally {\n if (warnTimeout) {\n clearTimeout(warnTimeout);\n }\n if (killTimeout) {\n clearTimeout(killTimeout);\n }\n }\n}\n\nasync function validateAppConfigAsync(\n ctx: BuildContext<Job>,\n appConfig: ExpoConfig\n): Promise<void> {\n if (\n appConfig?.extra?.eas?.projectId &&\n ctx.env.EAS_BUILD_PROJECT_ID &&\n appConfig.extra.eas.projectId !== ctx.env.EAS_BUILD_PROJECT_ID\n ) {\n const isUsingDynamicConfig =\n (await fs.pathExists(path.join(ctx.getReactNativeProjectDirectory(), 'app.config.ts'))) ||\n (await fs.pathExists(path.join(ctx.getReactNativeProjectDirectory(), 'app.config.js')));\n const isGitHubBuild = ctx.job.triggeredBy === BuildTrigger.GIT_BASED_INTEGRATION;\n let extraMessage = '';\n if (isGitHubBuild && isUsingDynamicConfig) {\n extraMessage =\n 'Make sure you connected your GitHub repository to the correct Expo project and if you are using environment variables to switch between projects in app.config.js/app.config.ts remember to set those variables in eas.json too. ';\n } else if (isGitHubBuild) {\n extraMessage = 'Make sure you connected your GitHub repository to the correct Expo project. ';\n } else if (isUsingDynamicConfig) {\n extraMessage =\n 'If you are using environment variables to switch between projects in app.config.js/app.config.ts, make sure those variables are also set inside EAS Build. You can do that using \"env\" field in eas.json or EAS environment variables. ';\n }\n throw new UserFacingError(\n 'EAS_BUILD_PROJECT_ID_MISMATCH',\n `The value of the \"extra.eas.projectId\" field (${appConfig.extra.eas.projectId}) in the app config does not match the current project id (${ctx.env.EAS_BUILD_PROJECT_ID}). ${extraMessage}Learn more: https://expo.fyi/eas-config-mismatch.`\n );\n } else if (ctx.env.EAS_BUILD_PROJECT_ID && !appConfig?.extra?.eas?.projectId) {\n ctx.logger.error(`The \"extra.eas.projectId\" field is missing from your app config.`);\n ctx.markBuildPhaseHasWarnings();\n }\n}\n"]}
package/dist/ios/pod.js CHANGED
@@ -8,8 +8,9 @@ const path_1 = __importDefault(require("path"));
8
8
  const turtle_spawn_1 = __importDefault(require("@expo/turtle-spawn"));
9
9
  async function installPods(ctx, { infoCallbackFn }) {
10
10
  const iosDir = path_1.default.join(ctx.getReactNativeProjectDirectory(), 'ios');
11
+ const verboseFlag = ctx.env['EAS_VERBOSE'] === '1' ? ['--verbose'] : [];
11
12
  return {
12
- spawnPromise: (0, turtle_spawn_1.default)('pod', ['install'], {
13
+ spawnPromise: (0, turtle_spawn_1.default)('pod', ['install', ...verboseFlag], {
13
14
  cwd: iosDir,
14
15
  logger: ctx.logger,
15
16
  env: {
@@ -1 +1 @@
1
- {"version":3,"file":"pod.js","sourceRoot":"","sources":["../../src/ios/pod.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAGxB,sEAAoF;AAI7E,KAAK,UAAU,WAAW,CAC/B,GAAuB,EACvB,EAAE,cAAc,EAAgB;IAEhC,MAAM,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,8BAA8B,EAAE,EAAE,KAAK,CAAC,CAAC;IAEtE,OAAO;QACL,YAAY,EAAE,IAAA,sBAAK,EAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE;YACtC,GAAG,EAAE,MAAM;YACX,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,GAAG,EAAE;gBACH,GAAG,GAAG,CAAC,GAAG;gBACV,IAAI,EAAE,aAAa;gBACnB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,6BAA6B;oBACvC,CAAC,CAAC,EAAE,wBAAwB,EAAE,GAAG,CAAC,GAAG,CAAC,6BAA6B,EAAE;oBACrE,CAAC,CAAC,EAAE,CAAC;aACR;YACD,eAAe,EAAE,CAAC,IAAa,EAAE,EAAE;gBACjC,IACE,CAAC,IAAI;oBACL,2EAA2E,CAAC,IAAI,CAAC,IAAI,CAAC,EACtF,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC;qBAAM,CAAC;oBACN,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YACD,cAAc;SACf,CAAC;KACH,CAAC;AACJ,CAAC;AA9BD,kCA8BC","sourcesContent":["import path from 'path';\n\nimport { Ios } from '@expo/eas-build-job';\nimport spawn, { SpawnOptions, SpawnPromise, SpawnResult } from '@expo/turtle-spawn';\n\nimport { BuildContext } from '../context';\n\nexport async function installPods<TJob extends Ios.Job>(\n ctx: BuildContext<TJob>,\n { infoCallbackFn }: SpawnOptions\n): Promise<{ spawnPromise: SpawnPromise<SpawnResult> }> {\n const iosDir = path.join(ctx.getReactNativeProjectDirectory(), 'ios');\n\n return {\n spawnPromise: spawn('pod', ['install'], {\n cwd: iosDir,\n logger: ctx.logger,\n env: {\n ...ctx.env,\n LANG: 'en_US.UTF-8',\n ...(ctx.env.EAS_BUILD_COCOAPODS_CACHE_URL\n ? { NEXUS_COCOAPODS_REPO_URL: ctx.env.EAS_BUILD_COCOAPODS_CACHE_URL }\n : {}),\n },\n lineTransformer: (line?: string) => {\n if (\n !line ||\n /\\[!\\] '[\\w-]+' uses the unencrypted 'http' protocol to transfer the Pod\\./.exec(line)\n ) {\n return null;\n } else {\n return line;\n }\n },\n infoCallbackFn,\n }),\n };\n}\n"]}
1
+ {"version":3,"file":"pod.js","sourceRoot":"","sources":["../../src/ios/pod.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAGxB,sEAAoF;AAI7E,KAAK,UAAU,WAAW,CAC/B,GAAuB,EACvB,EAAE,cAAc,EAAgB;IAEhC,MAAM,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,8BAA8B,EAAE,EAAE,KAAK,CAAC,CAAC;IAEtE,MAAM,WAAW,GAAG,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAExE,OAAO;QACL,YAAY,EAAE,IAAA,sBAAK,EAAC,KAAK,EAAE,CAAC,SAAS,EAAE,GAAG,WAAW,CAAC,EAAE;YACtD,GAAG,EAAE,MAAM;YACX,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,GAAG,EAAE;gBACH,GAAG,GAAG,CAAC,GAAG;gBACV,IAAI,EAAE,aAAa;gBACnB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,6BAA6B;oBACvC,CAAC,CAAC,EAAE,wBAAwB,EAAE,GAAG,CAAC,GAAG,CAAC,6BAA6B,EAAE;oBACrE,CAAC,CAAC,EAAE,CAAC;aACR;YACD,eAAe,EAAE,CAAC,IAAa,EAAE,EAAE;gBACjC,IACE,CAAC,IAAI;oBACL,2EAA2E,CAAC,IAAI,CAAC,IAAI,CAAC,EACtF,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC;qBAAM,CAAC;oBACN,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YACD,cAAc;SACf,CAAC;KACH,CAAC;AACJ,CAAC;AAhCD,kCAgCC","sourcesContent":["import path from 'path';\n\nimport { Ios } from '@expo/eas-build-job';\nimport spawn, { SpawnOptions, SpawnPromise, SpawnResult } from '@expo/turtle-spawn';\n\nimport { BuildContext } from '../context';\n\nexport async function installPods<TJob extends Ios.Job>(\n ctx: BuildContext<TJob>,\n { infoCallbackFn }: SpawnOptions\n): Promise<{ spawnPromise: SpawnPromise<SpawnResult> }> {\n const iosDir = path.join(ctx.getReactNativeProjectDirectory(), 'ios');\n\n const verboseFlag = ctx.env['EAS_VERBOSE'] === '1' ? ['--verbose'] : [];\n\n return {\n spawnPromise: spawn('pod', ['install', ...verboseFlag], {\n cwd: iosDir,\n logger: ctx.logger,\n env: {\n ...ctx.env,\n LANG: 'en_US.UTF-8',\n ...(ctx.env.EAS_BUILD_COCOAPODS_CACHE_URL\n ? { NEXUS_COCOAPODS_REPO_URL: ctx.env.EAS_BUILD_COCOAPODS_CACHE_URL }\n : {}),\n },\n lineTransformer: (line?: string) => {\n if (\n !line ||\n /\\[!\\] '[\\w-]+' uses the unencrypted 'http' protocol to transfer the Pod\\./.exec(line)\n ) {\n return null;\n } else {\n return line;\n }\n },\n infoCallbackFn,\n }),\n };\n}\n"]}
@@ -6,8 +6,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.installNodeModules = exports.createInstallNodeModulesBuildFunction = void 0;
7
7
  const path_1 = __importDefault(require("path"));
8
8
  const steps_1 = require("@expo/steps");
9
- const turtle_spawn_1 = __importDefault(require("@expo/turtle-spawn"));
10
9
  const packageManager_1 = require("../../utils/packageManager");
10
+ const installDependencies_1 = require("../../common/installDependencies");
11
11
  const project_1 = require("../../utils/project");
12
12
  function createInstallNodeModulesBuildFunction() {
13
13
  return new steps_1.BuildFunction({
@@ -21,6 +21,7 @@ function createInstallNodeModulesBuildFunction() {
21
21
  }
22
22
  exports.createInstallNodeModulesBuildFunction = createInstallNodeModulesBuildFunction;
23
23
  async function installNodeModules(stepCtx, env) {
24
+ var _a, _b, _c, _d;
24
25
  const { logger } = stepCtx;
25
26
  const packageManager = (0, packageManager_1.resolvePackageManager)(stepCtx.workingDirectory);
26
27
  const packagerRunDir = (0, packageManager_1.findPackagerRootDir)(stepCtx.workingDirectory);
@@ -28,22 +29,33 @@ async function installNodeModules(stepCtx, env) {
28
29
  const relativeReactNativeProjectDirectory = path_1.default.relative(stepCtx.global.projectTargetDirectory, stepCtx.workingDirectory);
29
30
  logger.info(`We detected that '${relativeReactNativeProjectDirectory}' is a ${packageManager} workspace`);
30
31
  }
31
- let args = ['install'];
32
- if (packageManager === packageManager_1.PackageManager.PNPM) {
33
- args = ['install', '--no-frozen-lockfile'];
32
+ let packageJson = {};
33
+ try {
34
+ packageJson = (0, project_1.readPackageJson)(stepCtx.workingDirectory);
34
35
  }
35
- else if (packageManager === packageManager_1.PackageManager.YARN) {
36
- const isYarn2 = await (0, project_1.isUsingYarn2)(stepCtx.workingDirectory);
37
- if (isYarn2) {
38
- args = ['install', '--no-immutable', '--inline-builds'];
39
- }
36
+ catch {
37
+ logger.info(`Failed to read package.json, defaulting to installing dependencies with a frozen lockfile. You can use EAS_NO_FROZEN_LOCKFILE=1 to disable it.`);
40
38
  }
41
- logger.info(`Running "${packageManager} ${args.join(' ')}" in ${packagerRunDir} directory`);
42
- await (0, turtle_spawn_1.default)(packageManager, args, {
43
- cwd: packagerRunDir,
44
- logger: stepCtx.logger,
39
+ const expoVersion = (_b = (_a = stepCtx.global.staticContext.metadata) === null || _a === void 0 ? void 0 : _a.sdkVersion) !== null && _b !== void 0 ? _b : (0, packageManager_1.getPackageVersionFromPackageJson)({
40
+ packageJson,
41
+ packageName: 'expo',
42
+ });
43
+ const reactNativeVersion = (_d = (_c = stepCtx.global.staticContext.metadata) === null || _c === void 0 ? void 0 : _c.reactNativeVersion) !== null && _d !== void 0 ? _d : (0, packageManager_1.getPackageVersionFromPackageJson)({
44
+ packageJson,
45
+ packageName: 'react-native',
46
+ });
47
+ const { spawnPromise } = await (0, installDependencies_1.installDependenciesAsync)({
48
+ packageManager,
45
49
  env,
50
+ logger: stepCtx.logger,
51
+ cwd: packagerRunDir,
52
+ useFrozenLockfile: (0, packageManager_1.shouldUseFrozenLockfile)({
53
+ env,
54
+ sdkVersion: expoVersion,
55
+ reactNativeVersion,
56
+ }),
46
57
  });
58
+ await spawnPromise;
47
59
  }
48
60
  exports.installNodeModules = installNodeModules;
49
61
  //# sourceMappingURL=installNodeModules.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"installNodeModules.js","sourceRoot":"","sources":["../../../src/steps/functions/installNodeModules.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,uCAA0D;AAE1D,sEAAuC;AAEvC,+DAIoC;AACpC,iDAAmD;AAEnD,SAAgB,qCAAqC;IACnD,OAAO,IAAI,qBAAa,CAAC;QACvB,SAAS,EAAE,KAAK;QAChB,EAAE,EAAE,sBAAsB;QAC1B,IAAI,EAAE,sBAAsB;QAC5B,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;YAC7B,MAAM,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACzC,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AATD,sFASC;AAEM,KAAK,UAAU,kBAAkB,CACtC,OAAyB,EACzB,GAAiB;IAEjB,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3B,MAAM,cAAc,GAAG,IAAA,sCAAqB,EAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvE,MAAM,cAAc,GAAG,IAAA,oCAAmB,EAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAErE,IAAI,cAAc,KAAK,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAChD,MAAM,mCAAmC,GAAG,cAAI,CAAC,QAAQ,CACvD,OAAO,CAAC,MAAM,CAAC,sBAAsB,EACrC,OAAO,CAAC,gBAAgB,CACzB,CAAC;QACF,MAAM,CAAC,IAAI,CACT,qBAAqB,mCAAmC,UAAU,cAAc,YAAY,CAC7F,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IACvB,IAAI,cAAc,KAAK,+BAAc,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,GAAG,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC;IAC7C,CAAC;SAAM,IAAI,cAAc,KAAK,+BAAc,CAAC,IAAI,EAAE,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,IAAA,sBAAY,EAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC7D,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,GAAG,CAAC,SAAS,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,YAAY,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,cAAc,YAAY,CAAC,CAAC;IAC5F,MAAM,IAAA,sBAAK,EAAC,cAAc,EAAE,IAAI,EAAE;QAChC,GAAG,EAAE,cAAc;QACnB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,GAAG;KACJ,CAAC,CAAC;AACL,CAAC;AAjCD,gDAiCC","sourcesContent":["import path from 'path';\n\nimport { BuildFunction, BuildStepEnv } from '@expo/steps';\nimport { BuildStepContext } from '@expo/steps/dist_esm/BuildStepContext';\nimport spawn from '@expo/turtle-spawn';\n\nimport {\n findPackagerRootDir,\n PackageManager,\n resolvePackageManager,\n} from '../../utils/packageManager';\nimport { isUsingYarn2 } from '../../utils/project';\n\nexport function createInstallNodeModulesBuildFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'install_node_modules',\n name: 'Install node modules',\n fn: async (stepCtx, { env }) => {\n await installNodeModules(stepCtx, env);\n },\n });\n}\n\nexport async function installNodeModules(\n stepCtx: BuildStepContext,\n env: BuildStepEnv\n): Promise<void> {\n const { logger } = stepCtx;\n const packageManager = resolvePackageManager(stepCtx.workingDirectory);\n const packagerRunDir = findPackagerRootDir(stepCtx.workingDirectory);\n\n if (packagerRunDir !== stepCtx.workingDirectory) {\n const relativeReactNativeProjectDirectory = path.relative(\n stepCtx.global.projectTargetDirectory,\n stepCtx.workingDirectory\n );\n logger.info(\n `We detected that '${relativeReactNativeProjectDirectory}' is a ${packageManager} workspace`\n );\n }\n\n let args = ['install'];\n if (packageManager === PackageManager.PNPM) {\n args = ['install', '--no-frozen-lockfile'];\n } else if (packageManager === PackageManager.YARN) {\n const isYarn2 = await isUsingYarn2(stepCtx.workingDirectory);\n if (isYarn2) {\n args = ['install', '--no-immutable', '--inline-builds'];\n }\n }\n logger.info(`Running \"${packageManager} ${args.join(' ')}\" in ${packagerRunDir} directory`);\n await spawn(packageManager, args, {\n cwd: packagerRunDir,\n logger: stepCtx.logger,\n env,\n });\n}\n"]}
1
+ {"version":3,"file":"installNodeModules.js","sourceRoot":"","sources":["../../../src/steps/functions/installNodeModules.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,uCAA0D;AAG1D,+DAKoC;AACpC,0EAA4E;AAC5E,iDAAsD;AAEtD,SAAgB,qCAAqC;IACnD,OAAO,IAAI,qBAAa,CAAC;QACvB,SAAS,EAAE,KAAK;QAChB,EAAE,EAAE,sBAAsB;QAC1B,IAAI,EAAE,sBAAsB;QAC5B,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;YAC7B,MAAM,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACzC,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AATD,sFASC;AAEM,KAAK,UAAU,kBAAkB,CACtC,OAAyB,EACzB,GAAiB;;IAEjB,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3B,MAAM,cAAc,GAAG,IAAA,sCAAqB,EAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvE,MAAM,cAAc,GAAG,IAAA,oCAAmB,EAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAErE,IAAI,cAAc,KAAK,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAChD,MAAM,mCAAmC,GAAG,cAAI,CAAC,QAAQ,CACvD,OAAO,CAAC,MAAM,CAAC,sBAAsB,EACrC,OAAO,CAAC,gBAAgB,CACzB,CAAC;QACF,MAAM,CAAC,IAAI,CACT,qBAAqB,mCAAmC,UAAU,cAAc,YAAY,CAC7F,CAAC;IACJ,CAAC;IAED,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,CAAC;QACH,WAAW,GAAG,IAAA,yBAAe,EAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,IAAI,CACT,gJAAgJ,CACjJ,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GACf,MAAA,MAAA,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,0CAAE,UAAU,mCACjD,IAAA,iDAAgC,EAAC;QAC/B,WAAW;QACX,WAAW,EAAE,MAAM;KACpB,CAAC,CAAC;IAEL,MAAM,kBAAkB,GACtB,MAAA,MAAA,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,0CAAE,kBAAkB,mCACzD,IAAA,iDAAgC,EAAC;QAC/B,WAAW;QACX,WAAW,EAAE,cAAc;KAC5B,CAAC,CAAC;IAEL,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,IAAA,8CAAwB,EAAC;QACtD,cAAc;QACd,GAAG;QACH,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,GAAG,EAAE,cAAc;QACnB,iBAAiB,EAAE,IAAA,wCAAuB,EAAC;YACzC,GAAG;YACH,UAAU,EAAE,WAAW;YACvB,kBAAkB;SACnB,CAAC;KACH,CAAC,CAAC;IACH,MAAM,YAAY,CAAC;AACrB,CAAC;AArDD,gDAqDC","sourcesContent":["import path from 'path';\n\nimport { BuildFunction, BuildStepEnv } from '@expo/steps';\nimport { BuildStepContext } from '@expo/steps/dist_esm/BuildStepContext';\n\nimport {\n findPackagerRootDir,\n getPackageVersionFromPackageJson,\n resolvePackageManager,\n shouldUseFrozenLockfile,\n} from '../../utils/packageManager';\nimport { installDependenciesAsync } from '../../common/installDependencies';\nimport { readPackageJson } from '../../utils/project';\n\nexport function createInstallNodeModulesBuildFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'install_node_modules',\n name: 'Install node modules',\n fn: async (stepCtx, { env }) => {\n await installNodeModules(stepCtx, env);\n },\n });\n}\n\nexport async function installNodeModules(\n stepCtx: BuildStepContext,\n env: BuildStepEnv\n): Promise<void> {\n const { logger } = stepCtx;\n const packageManager = resolvePackageManager(stepCtx.workingDirectory);\n const packagerRunDir = findPackagerRootDir(stepCtx.workingDirectory);\n\n if (packagerRunDir !== stepCtx.workingDirectory) {\n const relativeReactNativeProjectDirectory = path.relative(\n stepCtx.global.projectTargetDirectory,\n stepCtx.workingDirectory\n );\n logger.info(\n `We detected that '${relativeReactNativeProjectDirectory}' is a ${packageManager} workspace`\n );\n }\n\n let packageJson = {};\n try {\n packageJson = readPackageJson(stepCtx.workingDirectory);\n } catch {\n logger.info(\n `Failed to read package.json, defaulting to installing dependencies with a frozen lockfile. You can use EAS_NO_FROZEN_LOCKFILE=1 to disable it.`\n );\n }\n\n const expoVersion =\n stepCtx.global.staticContext.metadata?.sdkVersion ??\n getPackageVersionFromPackageJson({\n packageJson,\n packageName: 'expo',\n });\n\n const reactNativeVersion =\n stepCtx.global.staticContext.metadata?.reactNativeVersion ??\n getPackageVersionFromPackageJson({\n packageJson,\n packageName: 'react-native',\n });\n\n const { spawnPromise } = await installDependenciesAsync({\n packageManager,\n env,\n logger: stepCtx.logger,\n cwd: packagerRunDir,\n useFrozenLockfile: shouldUseFrozenLockfile({\n env,\n sdkVersion: expoVersion,\n reactNativeVersion,\n }),\n });\n await spawnPromise;\n}\n"]}
@@ -13,7 +13,8 @@ function createInstallPodsBuildFunction() {
13
13
  name: 'Install Pods',
14
14
  fn: async (stepsCtx, { env }) => {
15
15
  stepsCtx.logger.info('Installing pods');
16
- await (0, turtle_spawn_1.default)('pod', ['install'], {
16
+ const verboseFlag = stepsCtx.global.env['EAS_VERBOSE'] === '1' ? ['--verbose'] : [];
17
+ await (0, turtle_spawn_1.default)('pod', ['install', ...verboseFlag], {
17
18
  logger: stepsCtx.logger,
18
19
  env: {
19
20
  ...env,
@@ -1 +1 @@
1
- {"version":3,"file":"installPods.js","sourceRoot":"","sources":["../../../src/steps/functions/installPods.ts"],"names":[],"mappings":";;;;;;AAAA,uCAA4C;AAC5C,sEAAuC;AAEvC,SAAgB,8BAA8B;IAC5C,OAAO,IAAI,qBAAa,CAAC;QACvB,SAAS,EAAE,KAAK;QAChB,EAAE,EAAE,cAAc;QAClB,IAAI,EAAE,cAAc;QACpB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;YAC9B,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACxC,MAAM,IAAA,sBAAK,EAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE;gBAC9B,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,GAAG,EAAE;oBACH,GAAG,GAAG;oBACN,IAAI,EAAE,aAAa;iBACpB;gBACD,GAAG,EAAE,QAAQ,CAAC,gBAAgB;gBAC9B,eAAe,EAAE,CAAC,IAAa,EAAE,EAAE;oBACjC,IACE,CAAC,IAAI;wBACL,2EAA2E,CAAC,IAAI,CAAC,IAAI,CAAC,EACtF,CAAC;wBACD,OAAO,IAAI,CAAC;oBACd,CAAC;yBAAM,CAAC;wBACN,OAAO,IAAI,CAAC;oBACd,CAAC;gBACH,CAAC;aACF,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AA3BD,wEA2BC","sourcesContent":["import { BuildFunction } from '@expo/steps';\nimport spawn from '@expo/turtle-spawn';\n\nexport function createInstallPodsBuildFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'install_pods',\n name: 'Install Pods',\n fn: async (stepsCtx, { env }) => {\n stepsCtx.logger.info('Installing pods');\n await spawn('pod', ['install'], {\n logger: stepsCtx.logger,\n env: {\n ...env,\n LANG: 'en_US.UTF-8',\n },\n cwd: stepsCtx.workingDirectory,\n lineTransformer: (line?: string) => {\n if (\n !line ||\n /\\[!\\] '[\\w-]+' uses the unencrypted 'http' protocol to transfer the Pod\\./.exec(line)\n ) {\n return null;\n } else {\n return line;\n }\n },\n });\n },\n });\n}\n"]}
1
+ {"version":3,"file":"installPods.js","sourceRoot":"","sources":["../../../src/steps/functions/installPods.ts"],"names":[],"mappings":";;;;;;AAAA,uCAA4C;AAC5C,sEAAuC;AAEvC,SAAgB,8BAA8B;IAC5C,OAAO,IAAI,qBAAa,CAAC;QACvB,SAAS,EAAE,KAAK;QAChB,EAAE,EAAE,cAAc;QAClB,IAAI,EAAE,cAAc;QACpB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;YAC9B,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACxC,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAEpF,MAAM,IAAA,sBAAK,EAAC,KAAK,EAAE,CAAC,SAAS,EAAE,GAAG,WAAW,CAAC,EAAE;gBAC9C,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,GAAG,EAAE;oBACH,GAAG,GAAG;oBACN,IAAI,EAAE,aAAa;iBACpB;gBACD,GAAG,EAAE,QAAQ,CAAC,gBAAgB;gBAC9B,eAAe,EAAE,CAAC,IAAa,EAAE,EAAE;oBACjC,IACE,CAAC,IAAI;wBACL,2EAA2E,CAAC,IAAI,CAAC,IAAI,CAAC,EACtF,CAAC;wBACD,OAAO,IAAI,CAAC;oBACd,CAAC;yBAAM,CAAC;wBACN,OAAO,IAAI,CAAC;oBACd,CAAC;gBACH,CAAC;aACF,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AA7BD,wEA6BC","sourcesContent":["import { BuildFunction } from '@expo/steps';\nimport spawn from '@expo/turtle-spawn';\n\nexport function createInstallPodsBuildFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'install_pods',\n name: 'Install Pods',\n fn: async (stepsCtx, { env }) => {\n stepsCtx.logger.info('Installing pods');\n const verboseFlag = stepsCtx.global.env['EAS_VERBOSE'] === '1' ? ['--verbose'] : [];\n\n await spawn('pod', ['install', ...verboseFlag], {\n logger: stepsCtx.logger,\n env: {\n ...env,\n LANG: 'en_US.UTF-8',\n },\n cwd: stepsCtx.workingDirectory,\n lineTransformer: (line?: string) => {\n if (\n !line ||\n /\\[!\\] '[\\w-]+' uses the unencrypted 'http' protocol to transfer the Pod\\./.exec(line)\n ) {\n return null;\n } else {\n return line;\n }\n },\n });\n },\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"runGradle.js","sourceRoot":"","sources":["../../../src/steps/functions/runGradle.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AACxB,oDAA4B;AAE5B,uDAA+C;AAC/C,uCAKqB;AAErB,oDAAiF;AACjF,kFAA0F;AAE1F,SAAgB,iBAAiB;IAC/B,OAAO,IAAI,qBAAa,CAAC;QACvB,SAAS,EAAE,KAAK;QAChB,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,YAAY;QAClB,cAAc,EAAE;YACd,sBAAc,CAAC,cAAc,CAAC;gBAC5B,EAAE,EAAE,SAAS;gBACb,QAAQ,EAAE,KAAK;gBACf,oBAAoB,EAAE,mCAA2B,CAAC,MAAM;aACzD,CAAC;YACF,sBAAc,CAAC,cAAc,CAAC;gBAC5B,EAAE,EAAE,qCAAqC;gBACzC,QAAQ,EAAE,KAAK;gBACf,oBAAoB,EAAE,mCAA2B,CAAC,MAAM;aACzD,CAAC;SACH;QACD,eAAe,EAAE;YACf,uBAAe,CAAC,cAAc,CAAC;gBAC7B,EAAE,EAAE,+CAAmB,CAAC,WAAW;gBACnC,QAAQ,EAAE,IAAI;aACf,CAAC;YACF,uBAAe,CAAC,cAAc,CAAC;gBAC7B,EAAE,EAAE,+CAAmB,CAAC,UAAU;gBAClC,QAAQ,EAAE,KAAK;aAChB,CAAC;SACH;QACD,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;YAC9C,OAAO,CAAC,+CAAmB,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,2CAAe,CAAC,OAAO,CAAC,CAAC;YACtE,IAAA,gBAAM,EAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;YAC5D,IAAA,gBAAM,EACJ,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,KAAK,wBAAQ,CAAC,OAAO,EAC9D,2DAA2D,CAC5D,CAAC;YACF,MAAM,OAAO,GAAG,IAAA,6BAAoB,EAClC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,EAChC,MAAM,CAAC,OAAO,CAAC,KAA2B,CAC3C,CAAC;YACF,MAAM,+BAA+B,GAAG,MAAM,CAAC,mCAAmC,CAAC,KAEtE,CAAC;YACd,IAAI,CAAC;gBACH,MAAM,IAAA,yBAAgB,EAAC;oBACrB,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,aAAa,EAAE,OAAO;oBACtB,UAAU,EAAE,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,SAAS,CAAC;oBAC1D,GAAG;oBACH,GAAG,CAAC,+BAA+B;wBACjC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,iCAAiC,EAAE,+BAA+B,EAAE,EAAE;wBACtF,CAAC,CAAC,IAAI,CAAC;iBACV,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,+CAAmB,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,2CAAe,CAAC,KAAK,CAAC,CAAC;gBACpE,OAAO,CAAC,+CAAmB,CAAC,UAAU,CAAC,CAAC,GAAG,CAAE,KAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACzE,MAAM,KAAK,CAAC;YACd,CAAC;YACD,OAAO,CAAC,+CAAmB,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,2CAAe,CAAC,OAAO,CAAC,CAAC;QACxE,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AA3DD,8CA2DC","sourcesContent":["import path from 'path';\nimport assert from 'assert';\n\nimport { Platform } from '@expo/eas-build-job';\nimport {\n BuildFunction,\n BuildStepInput,\n BuildStepInputValueTypeName,\n BuildStepOutput,\n} from '@expo/steps';\n\nimport { resolveGradleCommand, runGradleCommand } from '../utils/android/gradle';\nimport { BuildStatusText, BuildStepOutputName } from '../utils/slackMessageDynamicFields';\n\nexport function runGradleFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'run_gradle',\n name: 'Run gradle',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'command',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'resolved_eas_update_runtime_version',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n ],\n outputProviders: [\n BuildStepOutput.createProvider({\n id: BuildStepOutputName.STATUS_TEXT,\n required: true,\n }),\n BuildStepOutput.createProvider({\n id: BuildStepOutputName.ERROR_TEXT,\n required: false,\n }),\n ],\n fn: async (stepCtx, { env, inputs, outputs }) => {\n outputs[BuildStepOutputName.STATUS_TEXT].set(BuildStatusText.STARTED);\n assert(stepCtx.global.staticContext.job, 'Job is required');\n assert(\n stepCtx.global.staticContext.job.platform === Platform.ANDROID,\n 'This function is only available when building for Android'\n );\n const command = resolveGradleCommand(\n stepCtx.global.staticContext.job,\n inputs.command.value as string | undefined\n );\n const resolvedEASUpdateRuntimeVersion = inputs.resolved_eas_update_runtime_version.value as\n | string\n | undefined;\n try {\n await runGradleCommand({\n logger: stepCtx.logger,\n gradleCommand: command,\n androidDir: path.join(stepCtx.workingDirectory, 'android'),\n env,\n ...(resolvedEASUpdateRuntimeVersion\n ? { extraEnv: { EXPO_UPDATES_FINGERPRINT_OVERRIDE: resolvedEASUpdateRuntimeVersion } }\n : null),\n });\n } catch (error) {\n outputs[BuildStepOutputName.STATUS_TEXT].set(BuildStatusText.ERROR);\n outputs[BuildStepOutputName.ERROR_TEXT].set((error as Error).toString());\n throw error;\n }\n outputs[BuildStepOutputName.STATUS_TEXT].set(BuildStatusText.SUCCESS);\n },\n });\n}\n"]}
1
+ {"version":3,"file":"runGradle.js","sourceRoot":"","sources":["../../../src/steps/functions/runGradle.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AACxB,oDAA4B;AAE5B,uDAA+C;AAC/C,uCAKqB;AAErB,oDAAiF;AACjF,kFAA0F;AAE1F,SAAgB,iBAAiB;IAC/B,OAAO,IAAI,qBAAa,CAAC;QACvB,SAAS,EAAE,KAAK;QAChB,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,YAAY;QAClB,cAAc,EAAE;YACd,sBAAc,CAAC,cAAc,CAAC;gBAC5B,EAAE,EAAE,SAAS;gBACb,QAAQ,EAAE,KAAK;gBACf,oBAAoB,EAAE,mCAA2B,CAAC,MAAM;aACzD,CAAC;YACF,sBAAc,CAAC,cAAc,CAAC;gBAC5B,EAAE,EAAE,qCAAqC;gBACzC,QAAQ,EAAE,KAAK;gBACf,oBAAoB,EAAE,mCAA2B,CAAC,MAAM;aACzD,CAAC;SACH;QACD,eAAe,EAAE;YACf,uBAAe,CAAC,cAAc,CAAC;gBAC7B,EAAE,EAAE,+CAAmB,CAAC,WAAW;gBACnC,QAAQ,EAAE,IAAI;aACf,CAAC;YACF,uBAAe,CAAC,cAAc,CAAC;gBAC7B,EAAE,EAAE,+CAAmB,CAAC,UAAU;gBAClC,QAAQ,EAAE,KAAK;aAChB,CAAC;SACH;QACD,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;YAC9C,OAAO,CAAC,+CAAmB,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,2CAAe,CAAC,OAAO,CAAC,CAAC;YACtE,IAAA,gBAAM,EAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;YAC5D,IAAA,gBAAM,EACJ,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,KAAK,wBAAQ,CAAC,OAAO,EAC9D,2DAA2D,CAC5D,CAAC;YACF,MAAM,OAAO,GAAG,IAAA,6BAAoB,EAClC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,EAChC,MAAM,CAAC,OAAO,CAAC,KAA2B,CAC3C,CAAC;YAEF,MAAM,+BAA+B,GAAG,MAAM,CAAC,mCAAmC,CAAC,KAEtE,CAAC;YACd,IAAI,CAAC;gBACH,MAAM,IAAA,yBAAgB,EAAC;oBACrB,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,aAAa,EAAE,OAAO;oBACtB,UAAU,EAAE,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,SAAS,CAAC;oBAC1D,GAAG;oBACH,GAAG,CAAC,+BAA+B;wBACjC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,iCAAiC,EAAE,+BAA+B,EAAE,EAAE;wBACtF,CAAC,CAAC,IAAI,CAAC;iBACV,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,+CAAmB,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,2CAAe,CAAC,KAAK,CAAC,CAAC;gBACpE,OAAO,CAAC,+CAAmB,CAAC,UAAU,CAAC,CAAC,GAAG,CAAE,KAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACzE,MAAM,KAAK,CAAC;YACd,CAAC;YACD,OAAO,CAAC,+CAAmB,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,2CAAe,CAAC,OAAO,CAAC,CAAC;QACxE,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AA5DD,8CA4DC","sourcesContent":["import path from 'path';\nimport assert from 'assert';\n\nimport { Platform } from '@expo/eas-build-job';\nimport {\n BuildFunction,\n BuildStepInput,\n BuildStepInputValueTypeName,\n BuildStepOutput,\n} from '@expo/steps';\n\nimport { resolveGradleCommand, runGradleCommand } from '../utils/android/gradle';\nimport { BuildStatusText, BuildStepOutputName } from '../utils/slackMessageDynamicFields';\n\nexport function runGradleFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'run_gradle',\n name: 'Run gradle',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'command',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'resolved_eas_update_runtime_version',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n ],\n outputProviders: [\n BuildStepOutput.createProvider({\n id: BuildStepOutputName.STATUS_TEXT,\n required: true,\n }),\n BuildStepOutput.createProvider({\n id: BuildStepOutputName.ERROR_TEXT,\n required: false,\n }),\n ],\n fn: async (stepCtx, { env, inputs, outputs }) => {\n outputs[BuildStepOutputName.STATUS_TEXT].set(BuildStatusText.STARTED);\n assert(stepCtx.global.staticContext.job, 'Job is required');\n assert(\n stepCtx.global.staticContext.job.platform === Platform.ANDROID,\n 'This function is only available when building for Android'\n );\n const command = resolveGradleCommand(\n stepCtx.global.staticContext.job,\n inputs.command.value as string | undefined\n );\n\n const resolvedEASUpdateRuntimeVersion = inputs.resolved_eas_update_runtime_version.value as\n | string\n | undefined;\n try {\n await runGradleCommand({\n logger: stepCtx.logger,\n gradleCommand: command,\n androidDir: path.join(stepCtx.workingDirectory, 'android'),\n env,\n ...(resolvedEASUpdateRuntimeVersion\n ? { extraEnv: { EXPO_UPDATES_FINGERPRINT_OVERRIDE: resolvedEASUpdateRuntimeVersion } }\n : null),\n });\n } catch (error) {\n outputs[BuildStepOutputName.STATUS_TEXT].set(BuildStatusText.ERROR);\n outputs[BuildStepOutputName.ERROR_TEXT].set((error as Error).toString());\n throw error;\n }\n outputs[BuildStepOutputName.STATUS_TEXT].set(BuildStatusText.SUCCESS);\n },\n });\n}\n"]}
@@ -9,7 +9,6 @@ const promises_1 = __importDefault(require("fs/promises"));
9
9
  const logger_1 = require("@expo/logger");
10
10
  const steps_1 = require("@expo/steps");
11
11
  const turtle_spawn_1 = __importDefault(require("@expo/turtle-spawn"));
12
- const uuid_1 = require("uuid");
13
12
  const retry_1 = require("../../utils/retry");
14
13
  const defaultSystemImagePackage = `system-images;android-30;default;${process.arch === 'arm64' ? 'arm64-v8a' : 'x86_64'}`;
15
14
  function createStartAndroidEmulatorBuildFunction() {
@@ -65,13 +64,11 @@ function createStartAndroidEmulatorBuildFunction() {
65
64
  (_a = avdManager.child.stdin) === null || _a === void 0 ? void 0 : _a.write('no');
66
65
  (_b = avdManager.child.stdin) === null || _b === void 0 ? void 0 : _b.end();
67
66
  await avdManager;
68
- const qemuPropId = (0, uuid_1.v4)();
69
67
  logger.info('Starting emulator device');
70
- const { emulatorPromise } = await startAndroidSimulator({ deviceName, qemuPropId, env });
68
+ const { emulatorPromise } = await startAndroidSimulator({ deviceName, env });
71
69
  logger.info('Waiting for emulator to become ready');
72
70
  const { serialId } = await ensureEmulatorIsReadyAsync({
73
71
  deviceName,
74
- qemuPropId,
75
72
  env,
76
73
  logger,
77
74
  });
@@ -114,13 +111,11 @@ function createStartAndroidEmulatorBuildFunction() {
114
111
  const updatedTxtFile = txtFile.replace(replaceRegex, cloneIdentifier);
115
112
  await promises_1.default.writeFile(file, updatedTxtFile);
116
113
  }
117
- const qemuPropId = (0, uuid_1.v4)();
118
114
  logger.info('Starting emulator device');
119
- await startAndroidSimulator({ deviceName: cloneIdentifier, qemuPropId, env });
115
+ await startAndroidSimulator({ deviceName: cloneIdentifier, env });
120
116
  logger.info('Waiting for emulator to become ready');
121
117
  await ensureEmulatorIsReadyAsync({
122
118
  deviceName: cloneIdentifier,
123
- qemuPropId,
124
119
  env,
125
120
  logger,
126
121
  });
@@ -131,7 +126,7 @@ function createStartAndroidEmulatorBuildFunction() {
131
126
  });
132
127
  }
133
128
  exports.createStartAndroidEmulatorBuildFunction = createStartAndroidEmulatorBuildFunction;
134
- async function startAndroidSimulator({ deviceName, qemuPropId, env, }) {
129
+ async function startAndroidSimulator({ deviceName, env, }) {
135
130
  const emulatorPromise = (0, turtle_spawn_1.default)(`${process.env.ANDROID_HOME}/emulator/emulator`, [
136
131
  '-no-window',
137
132
  '-no-boot-anim',
@@ -142,8 +137,6 @@ async function startAndroidSimulator({ deviceName, qemuPropId, env, }) {
142
137
  '-no-snapshot-save',
143
138
  '-avd',
144
139
  deviceName,
145
- '-prop',
146
- `qemu.uuid=${qemuPropId}`,
147
140
  ], {
148
141
  detached: true,
149
142
  stdio: 'inherit',
@@ -158,7 +151,7 @@ async function startAndroidSimulator({ deviceName, qemuPropId, env, }) {
158
151
  // eslint-disable-next-line @typescript-eslint/return-await
159
152
  return { emulatorPromise };
160
153
  }
161
- async function getEmulatorSerialId({ qemuPropId, env, }) {
154
+ async function getEmulatorSerialId({ deviceName, env, }) {
162
155
  const adbDevices = await (0, turtle_spawn_1.default)('adb', ['devices'], { mode: logger_1.PipeMode.COMBINED, env });
163
156
  for (const adbDeviceLine of adbDevices.stdout.split('\n')) {
164
157
  if (!adbDeviceLine.startsWith('emulator')) {
@@ -169,26 +162,29 @@ async function getEmulatorSerialId({ qemuPropId, env, }) {
169
162
  continue;
170
163
  }
171
164
  const [, serialId] = matches;
172
- const getProp = await (0, turtle_spawn_1.default)('adb', ['-s', serialId, 'shell', 'getprop', 'qemu.uuid'], {
165
+ // Previously we were using `qemu.uuid` to identify the emulator,
166
+ // but this does not work for newer emulators, because there is
167
+ // a limit on properties and custom properties get ignored.
168
+ // See https://stackoverflow.com/questions/2214377/how-to-get-serial-number-or-id-of-android-emulator-after-it-runs#comment98259121_42038655
169
+ const adbEmuAvdName = await (0, turtle_spawn_1.default)('adb', ['-s', serialId, 'emu', 'avd', 'name'], {
173
170
  mode: logger_1.PipeMode.COMBINED,
174
171
  env,
175
172
  });
176
- if (getProp.stdout.startsWith(qemuPropId)) {
173
+ if (adbEmuAvdName.stdout.replace(/\r\n/g, '\n').split('\n')[0] === deviceName) {
177
174
  return serialId;
178
175
  }
179
176
  }
180
177
  return null;
181
178
  }
182
- async function ensureEmulatorIsReadyAsync({ deviceName, qemuPropId, env, logger, }) {
179
+ async function ensureEmulatorIsReadyAsync({ deviceName, env, logger, }) {
183
180
  const serialId = await (0, retry_1.retryAsync)(async () => {
184
- const serialId = await getEmulatorSerialId({ qemuPropId, env });
181
+ const serialId = await getEmulatorSerialId({ deviceName, env });
185
182
  (0, assert_1.default)(serialId, `Failed to configure emulator (${deviceName}): emulator with required ID not found.`);
186
183
  return serialId;
187
184
  }, {
188
185
  logger,
189
186
  retryOptions: {
190
- // Emulators usually take 30 second tops to boot.
191
- retries: 60,
187
+ retries: 3 * 60,
192
188
  retryIntervalMs: 1000,
193
189
  },
194
190
  });
@@ -1 +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';\nimport fs from 'fs/promises';\n\nimport { PipeMode, bunyan } from '@expo/logger';\nimport {\n BuildFunction,\n BuildStepEnv,\n BuildStepInput,\n BuildStepInputValueTypeName,\n spawnAsync,\n} from '@expo/steps';\nimport spawn, { SpawnPromise, SpawnResult } 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 BuildStepInput.createProvider({\n id: 'count',\n required: false,\n defaultValue: 1,\n allowedValueTypeName: BuildStepInputValueTypeName.NUMBER,\n }),\n ],\n fn: async ({ logger }, { inputs, env }) => {\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 retryAsync(\n async () => {\n await spawn('sdkmanager', [systemImagePackage], {\n env,\n logger,\n });\n },\n {\n logger,\n retryOptions: {\n retries: 3, // Retry 3 times\n retryIntervalMs: 1_000,\n },\n }\n );\n\n logger.info('Creating emulator device');\n const avdManager = spawn(\n 'avdmanager',\n ['create', 'avd', '--name', deviceName, '--package', systemImagePackage, '--force'],\n {\n env,\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 const { emulatorPromise } = await startAndroidSimulator({ deviceName, qemuPropId, env });\n\n logger.info('Waiting for emulator to become ready');\n const { serialId } = await ensureEmulatorIsReadyAsync({\n deviceName,\n qemuPropId,\n env,\n logger,\n });\n\n logger.info(`${deviceName} is ready.`);\n\n const count = Number(inputs.count.value ?? 1);\n if (count > 1) {\n logger.info(`Requested ${count} emulators, shutting down ${deviceName} for cloning.`);\n await spawn('adb', ['-s', serialId, 'shell', 'reboot', '-p'], {\n logger,\n env,\n });\n // Waiting for source emulator to shutdown.\n await emulatorPromise;\n\n for (let i = 0; i < count; i++) {\n const cloneIdentifier = `eas-simulator-${i + 1}`;\n logger.info(`Cloning ${deviceName} to ${cloneIdentifier}...`);\n const cloneIniFile = `${process.env.HOME}/.android/avd/${cloneIdentifier}.ini`;\n\n await fs.rm(`${process.env.HOME}/.android/avd/${cloneIdentifier}.avd`, {\n recursive: true,\n force: true,\n });\n await fs.rm(cloneIniFile, { force: true });\n\n await fs.cp(\n `${process.env.HOME}/.android/avd/${deviceName}.avd`,\n `${process.env.HOME}/.android/avd/${cloneIdentifier}.avd`,\n { recursive: true, verbatimSymlinks: true, force: true }\n );\n\n await fs.cp(`${process.env.HOME}/.android/avd/${deviceName}.ini`, cloneIniFile, {\n verbatimSymlinks: true,\n force: true,\n });\n\n const filesToReplaceDeviceNameIn = (\n await spawnAsync('grep', [\n '--binary-files=without-match',\n '--recursive',\n '--files-with-matches',\n `${deviceName}`,\n `${process.env.HOME}/.android/avd/${cloneIdentifier}.avd`,\n ])\n ).stdout\n .split('\\n')\n .filter((file) => file !== '');\n\n for (const file of [...filesToReplaceDeviceNameIn, cloneIniFile]) {\n const txtFile = await fs.readFile(file, 'utf-8');\n const replaceRegex = new RegExp(`${deviceName}`, 'g');\n const updatedTxtFile = txtFile.replace(replaceRegex, cloneIdentifier);\n await fs.writeFile(file, updatedTxtFile);\n }\n\n const qemuPropId = uuidv4();\n\n logger.info('Starting emulator device');\n await startAndroidSimulator({ deviceName: cloneIdentifier, qemuPropId, env });\n\n logger.info('Waiting for emulator to become ready');\n await ensureEmulatorIsReadyAsync({\n deviceName: cloneIdentifier,\n qemuPropId,\n env,\n logger,\n });\n\n logger.info(`${cloneIdentifier} is ready.`);\n }\n }\n },\n });\n}\n\nasync function startAndroidSimulator({\n deviceName,\n qemuPropId,\n env,\n}: {\n deviceName: string;\n qemuPropId: string;\n env: BuildStepEnv;\n}): Promise<{ emulatorPromise: SpawnPromise<SpawnResult> }> {\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 '-memory',\n '8192',\n '-no-snapshot-save',\n '-avd',\n deviceName,\n '-prop',\n `qemu.uuid=${qemuPropId}`,\n ],\n {\n detached: true,\n stdio: 'inherit',\n env,\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 // We don't want to await the SpawnPromise here.\n // eslint-disable-next-line @typescript-eslint/return-await\n return { emulatorPromise };\n}\n\nasync function getEmulatorSerialId({\n qemuPropId,\n env,\n}: {\n qemuPropId: string;\n env: BuildStepEnv;\n}): Promise<string | null> {\n const adbDevices = await spawn('adb', ['devices'], { mode: PipeMode.COMBINED, env });\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 env,\n });\n if (getProp.stdout.startsWith(qemuPropId)) {\n return serialId;\n }\n }\n\n return null;\n}\n\nasync function ensureEmulatorIsReadyAsync({\n deviceName,\n qemuPropId,\n env,\n logger,\n}: {\n deviceName: string;\n qemuPropId: string;\n env: BuildStepEnv;\n logger: bunyan;\n}): Promise<{ serialId: string }> {\n const serialId = await retryAsync(\n async () => {\n const serialId = await getEmulatorSerialId({ qemuPropId, env });\n assert(\n serialId,\n `Failed to configure emulator (${deviceName}): emulator with required ID not found.`\n );\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 env,\n mode: PipeMode.COMBINED,\n }\n );\n\n if (!stdout.startsWith('1')) {\n throw new Error(`Emulator (${deviceName}) 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 return { serialId };\n}\n"]}
1
+ {"version":3,"file":"startAndroidEmulator.js","sourceRoot":"","sources":["../../../src/steps/functions/startAndroidEmulator.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'assert';\nimport fs from 'fs/promises';\n\nimport { PipeMode, bunyan } from '@expo/logger';\nimport {\n BuildFunction,\n BuildStepEnv,\n BuildStepInput,\n BuildStepInputValueTypeName,\n spawnAsync,\n} from '@expo/steps';\nimport spawn, { SpawnPromise, SpawnResult } from '@expo/turtle-spawn';\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 BuildStepInput.createProvider({\n id: 'count',\n required: false,\n defaultValue: 1,\n allowedValueTypeName: BuildStepInputValueTypeName.NUMBER,\n }),\n ],\n fn: async ({ logger }, { inputs, env }) => {\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 retryAsync(\n async () => {\n await spawn('sdkmanager', [systemImagePackage], {\n env,\n logger,\n });\n },\n {\n logger,\n retryOptions: {\n retries: 3, // Retry 3 times\n retryIntervalMs: 1_000,\n },\n }\n );\n\n logger.info('Creating emulator device');\n const avdManager = spawn(\n 'avdmanager',\n ['create', 'avd', '--name', deviceName, '--package', systemImagePackage, '--force'],\n {\n env,\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 logger.info('Starting emulator device');\n const { emulatorPromise } = await startAndroidSimulator({ deviceName, env });\n\n logger.info('Waiting for emulator to become ready');\n const { serialId } = await ensureEmulatorIsReadyAsync({\n deviceName,\n env,\n logger,\n });\n\n logger.info(`${deviceName} is ready.`);\n\n const count = Number(inputs.count.value ?? 1);\n if (count > 1) {\n logger.info(`Requested ${count} emulators, shutting down ${deviceName} for cloning.`);\n await spawn('adb', ['-s', serialId, 'shell', 'reboot', '-p'], {\n logger,\n env,\n });\n // Waiting for source emulator to shutdown.\n await emulatorPromise;\n\n for (let i = 0; i < count; i++) {\n const cloneIdentifier = `eas-simulator-${i + 1}`;\n logger.info(`Cloning ${deviceName} to ${cloneIdentifier}...`);\n const cloneIniFile = `${process.env.HOME}/.android/avd/${cloneIdentifier}.ini`;\n\n await fs.rm(`${process.env.HOME}/.android/avd/${cloneIdentifier}.avd`, {\n recursive: true,\n force: true,\n });\n await fs.rm(cloneIniFile, { force: true });\n\n await fs.cp(\n `${process.env.HOME}/.android/avd/${deviceName}.avd`,\n `${process.env.HOME}/.android/avd/${cloneIdentifier}.avd`,\n { recursive: true, verbatimSymlinks: true, force: true }\n );\n\n await fs.cp(`${process.env.HOME}/.android/avd/${deviceName}.ini`, cloneIniFile, {\n verbatimSymlinks: true,\n force: true,\n });\n\n const filesToReplaceDeviceNameIn = (\n await spawnAsync('grep', [\n '--binary-files=without-match',\n '--recursive',\n '--files-with-matches',\n `${deviceName}`,\n `${process.env.HOME}/.android/avd/${cloneIdentifier}.avd`,\n ])\n ).stdout\n .split('\\n')\n .filter((file) => file !== '');\n\n for (const file of [...filesToReplaceDeviceNameIn, cloneIniFile]) {\n const txtFile = await fs.readFile(file, 'utf-8');\n const replaceRegex = new RegExp(`${deviceName}`, 'g');\n const updatedTxtFile = txtFile.replace(replaceRegex, cloneIdentifier);\n await fs.writeFile(file, updatedTxtFile);\n }\n\n logger.info('Starting emulator device');\n await startAndroidSimulator({ deviceName: cloneIdentifier, env });\n\n logger.info('Waiting for emulator to become ready');\n await ensureEmulatorIsReadyAsync({\n deviceName: cloneIdentifier,\n env,\n logger,\n });\n\n logger.info(`${cloneIdentifier} is ready.`);\n }\n }\n },\n });\n}\n\nasync function startAndroidSimulator({\n deviceName,\n env,\n}: {\n deviceName: string;\n env: BuildStepEnv;\n}): Promise<{ emulatorPromise: SpawnPromise<SpawnResult> }> {\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 '-memory',\n '8192',\n '-no-snapshot-save',\n '-avd',\n deviceName,\n ],\n {\n detached: true,\n stdio: 'inherit',\n env,\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 // We don't want to await the SpawnPromise here.\n // eslint-disable-next-line @typescript-eslint/return-await\n return { emulatorPromise };\n}\n\nasync function getEmulatorSerialId({\n deviceName,\n env,\n}: {\n deviceName: string;\n env: BuildStepEnv;\n}): Promise<string | null> {\n const adbDevices = await spawn('adb', ['devices'], { mode: PipeMode.COMBINED, env });\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 // Previously we were using `qemu.uuid` to identify the emulator,\n // but this does not work for newer emulators, because there is\n // a limit on properties and custom properties get ignored.\n // See https://stackoverflow.com/questions/2214377/how-to-get-serial-number-or-id-of-android-emulator-after-it-runs#comment98259121_42038655\n const adbEmuAvdName = await spawn('adb', ['-s', serialId, 'emu', 'avd', 'name'], {\n mode: PipeMode.COMBINED,\n env,\n });\n if (adbEmuAvdName.stdout.replace(/\\r\\n/g, '\\n').split('\\n')[0] === deviceName) {\n return serialId;\n }\n }\n\n return null;\n}\n\nasync function ensureEmulatorIsReadyAsync({\n deviceName,\n env,\n logger,\n}: {\n deviceName: string;\n env: BuildStepEnv;\n logger: bunyan;\n}): Promise<{ serialId: string }> {\n const serialId = await retryAsync(\n async () => {\n const serialId = await getEmulatorSerialId({ deviceName, env });\n assert(\n serialId,\n `Failed to configure emulator (${deviceName}): emulator with required ID not found.`\n );\n return serialId;\n },\n {\n logger,\n retryOptions: {\n retries: 3 * 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 env,\n mode: PipeMode.COMBINED,\n }\n );\n\n if (!stdout.startsWith('1')) {\n throw new Error(`Emulator (${deviceName}) 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 return { serialId };\n}\n"]}
@@ -10,9 +10,10 @@ const fs_extra_1 = __importDefault(require("fs-extra"));
10
10
  const turtle_spawn_1 = __importDefault(require("@expo/turtle-spawn"));
11
11
  const eas_build_job_1 = require("@expo/eas-build-job");
12
12
  async function runGradleCommand({ logger, gradleCommand, androidDir, env, extraEnv, }) {
13
- logger.info(`Running 'gradlew ${gradleCommand}' in ${androidDir}`);
13
+ const verboseFlag = env['EAS_VERBOSE'] === '1' ? '--info' : '';
14
+ logger.info(`Running 'gradlew ${gradleCommand} ${verboseFlag}' in ${androidDir}`);
14
15
  await fs_extra_1.default.chmod(path_1.default.join(androidDir, 'gradlew'), 0o755);
15
- const spawnPromise = (0, turtle_spawn_1.default)('bash', ['-c', `./gradlew ${gradleCommand}`], {
16
+ const spawnPromise = (0, turtle_spawn_1.default)('bash', ['-c', `./gradlew ${gradleCommand} ${verboseFlag}`], {
16
17
  cwd: androidDir,
17
18
  logger,
18
19
  lineTransformer: (line) => {
@@ -1 +1 @@
1
- {"version":3,"file":"gradle.js","sourceRoot":"","sources":["../../../../src/steps/utils/android/gradle.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'assert';\nimport path from 'path';\n\nimport fs from 'fs-extra';\nimport { bunyan } from '@expo/logger';\nimport { BuildStepEnv } from '@expo/steps';\nimport spawn, { SpawnPromise, SpawnResult } from '@expo/turtle-spawn';\nimport { Android } from '@expo/eas-build-job';\n\nexport async function runGradleCommand({\n logger,\n gradleCommand,\n androidDir,\n env,\n extraEnv,\n}: {\n logger: bunyan;\n gradleCommand: string;\n androidDir: string;\n env: BuildStepEnv;\n extraEnv?: BuildStepEnv;\n}): Promise<void> {\n logger.info(`Running 'gradlew ${gradleCommand}' in ${androidDir}`);\n await fs.chmod(path.join(androidDir, 'gradlew'), 0o755);\n const spawnPromise = spawn('bash', ['-c', `./gradlew ${gradleCommand}`], {\n cwd: androidDir,\n logger,\n lineTransformer: (line?: string) => {\n if (!line || /^\\.+$/.exec(line)) {\n return null;\n } else {\n return line;\n }\n },\n env: { ...env, ...extraEnv },\n });\n if (env.EAS_BUILD_RUNNER === 'eas-build' && process.platform === 'linux') {\n adjustOOMScore(spawnPromise, logger);\n }\n\n await spawnPromise;\n}\n\n/**\n * OOM Killer sometimes kills worker server while build is exceeding memory limits.\n * `oom_score_adj` is a value between -1000 and 1000 and it defaults to 0.\n * It defines which process is more likely to get killed (higher value more likely).\n *\n * This function sets oom_score_adj for Gradle process and all its child processes.\n */\nfunction adjustOOMScore(spawnPromise: SpawnPromise<SpawnResult>, logger: bunyan): void {\n setTimeout(\n async () => {\n try {\n assert(spawnPromise.child.pid);\n const pids = await getParentAndDescendantProcessPidsAsync(spawnPromise.child.pid);\n await Promise.all(\n pids.map(async (pid: number) => {\n // Value 800 is just a guess here. It's probably higher than most other\n // process. I didn't want to set it any higher, because I'm not sure if OOM Killer\n // can start killing processes when there is still enough memory left.\n const oomScoreOverride = 800;\n await fs.writeFile(`/proc/${pid}/oom_score_adj`, `${oomScoreOverride}\\n`);\n })\n );\n } catch (err: any) {\n logger.debug({ err, stderr: err?.stderr }, 'Failed to override oom_score_adj');\n }\n },\n // Wait 20 seconds to make sure all child processes are started\n 20000\n );\n}\n\nasync function getChildrenPidsAsync(parentPids: number[]): Promise<number[]> {\n try {\n const result = await spawn('pgrep', ['-P', parentPids.join(',')], {\n stdio: 'pipe',\n });\n return result.stdout\n .toString()\n .split('\\n')\n .map((i) => Number(i.trim()))\n .filter((i) => i);\n } catch {\n return [];\n }\n}\n\nasync function getParentAndDescendantProcessPidsAsync(ppid: number): Promise<number[]> {\n const children = new Set<number>([ppid]);\n let shouldCheckAgain = true;\n while (shouldCheckAgain) {\n const pids = await getChildrenPidsAsync([...children]);\n shouldCheckAgain = false;\n for (const pid of pids) {\n if (!children.has(pid)) {\n shouldCheckAgain = true;\n children.add(pid);\n }\n }\n }\n return [...children];\n}\n\nexport function resolveGradleCommand(job: Android.Job, command?: string): string {\n if (command) {\n return command;\n } else if (job.gradleCommand) {\n return job.gradleCommand;\n } else if (job.developmentClient) {\n return ':app:assembleDebug';\n } else if (!job.buildType) {\n return ':app:bundleRelease';\n } else if (job.buildType === Android.BuildType.APK) {\n return ':app:assembleRelease';\n } else {\n return ':app:bundleRelease';\n }\n}\n"]}
1
+ {"version":3,"file":"gradle.js","sourceRoot":"","sources":["../../../../src/steps/utils/android/gradle.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'assert';\nimport path from 'path';\n\nimport fs from 'fs-extra';\nimport { bunyan } from '@expo/logger';\nimport { BuildStepEnv } from '@expo/steps';\nimport spawn, { SpawnPromise, SpawnResult } from '@expo/turtle-spawn';\nimport { Android } from '@expo/eas-build-job';\n\nexport async function runGradleCommand({\n logger,\n gradleCommand,\n androidDir,\n env,\n extraEnv,\n}: {\n logger: bunyan;\n gradleCommand: string;\n androidDir: string;\n env: BuildStepEnv;\n extraEnv?: BuildStepEnv;\n}): Promise<void> {\n const verboseFlag = env['EAS_VERBOSE'] === '1' ? '--info' : '';\n\n logger.info(`Running 'gradlew ${gradleCommand} ${verboseFlag}' in ${androidDir}`);\n await fs.chmod(path.join(androidDir, 'gradlew'), 0o755);\n const spawnPromise = spawn('bash', ['-c', `./gradlew ${gradleCommand} ${verboseFlag}`], {\n cwd: androidDir,\n logger,\n lineTransformer: (line?: string) => {\n if (!line || /^\\.+$/.exec(line)) {\n return null;\n } else {\n return line;\n }\n },\n env: { ...env, ...extraEnv },\n });\n if (env.EAS_BUILD_RUNNER === 'eas-build' && process.platform === 'linux') {\n adjustOOMScore(spawnPromise, logger);\n }\n\n await spawnPromise;\n}\n\n/**\n * OOM Killer sometimes kills worker server while build is exceeding memory limits.\n * `oom_score_adj` is a value between -1000 and 1000 and it defaults to 0.\n * It defines which process is more likely to get killed (higher value more likely).\n *\n * This function sets oom_score_adj for Gradle process and all its child processes.\n */\nfunction adjustOOMScore(spawnPromise: SpawnPromise<SpawnResult>, logger: bunyan): void {\n setTimeout(\n async () => {\n try {\n assert(spawnPromise.child.pid);\n const pids = await getParentAndDescendantProcessPidsAsync(spawnPromise.child.pid);\n await Promise.all(\n pids.map(async (pid: number) => {\n // Value 800 is just a guess here. It's probably higher than most other\n // process. I didn't want to set it any higher, because I'm not sure if OOM Killer\n // can start killing processes when there is still enough memory left.\n const oomScoreOverride = 800;\n await fs.writeFile(`/proc/${pid}/oom_score_adj`, `${oomScoreOverride}\\n`);\n })\n );\n } catch (err: any) {\n logger.debug({ err, stderr: err?.stderr }, 'Failed to override oom_score_adj');\n }\n },\n // Wait 20 seconds to make sure all child processes are started\n 20000\n );\n}\n\nasync function getChildrenPidsAsync(parentPids: number[]): Promise<number[]> {\n try {\n const result = await spawn('pgrep', ['-P', parentPids.join(',')], {\n stdio: 'pipe',\n });\n return result.stdout\n .toString()\n .split('\\n')\n .map((i) => Number(i.trim()))\n .filter((i) => i);\n } catch {\n return [];\n }\n}\n\nasync function getParentAndDescendantProcessPidsAsync(ppid: number): Promise<number[]> {\n const children = new Set<number>([ppid]);\n let shouldCheckAgain = true;\n while (shouldCheckAgain) {\n const pids = await getChildrenPidsAsync([...children]);\n shouldCheckAgain = false;\n for (const pid of pids) {\n if (!children.has(pid)) {\n shouldCheckAgain = true;\n children.add(pid);\n }\n }\n }\n return [...children];\n}\n\nexport function resolveGradleCommand(job: Android.Job, command?: string): string {\n if (command) {\n return command;\n } else if (job.gradleCommand) {\n return job.gradleCommand;\n } else if (job.developmentClient) {\n return ':app:assembleDebug';\n } else if (!job.buildType) {\n return ':app:bundleRelease';\n } else if (job.buildType === Android.BuildType.APK) {\n return ':app:assembleRelease';\n } else {\n return ':app:bundleRelease';\n }\n}\n"]}
@@ -7,3 +7,12 @@ export declare enum PackageManager {
7
7
  export declare function resolvePackageManager(directory: string): PackageManager;
8
8
  export declare function findPackagerRootDir(currentDir: string): string;
9
9
  export declare function isAtLeastNpm7Async(): Promise<boolean>;
10
+ export declare function shouldUseFrozenLockfile({ env, sdkVersion, reactNativeVersion, }: {
11
+ env: Record<string, string | undefined>;
12
+ sdkVersion: string | undefined;
13
+ reactNativeVersion: string | undefined;
14
+ }): boolean;
15
+ export declare function getPackageVersionFromPackageJson({ packageJson, packageName, }: {
16
+ packageJson: unknown;
17
+ packageName: string;
18
+ }): string | undefined;
@@ -26,10 +26,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.isAtLeastNpm7Async = exports.findPackagerRootDir = exports.resolvePackageManager = exports.PackageManager = void 0;
29
+ exports.getPackageVersionFromPackageJson = exports.shouldUseFrozenLockfile = exports.isAtLeastNpm7Async = exports.findPackagerRootDir = exports.resolvePackageManager = exports.PackageManager = void 0;
30
30
  const turtle_spawn_1 = __importDefault(require("@expo/turtle-spawn"));
31
31
  const PackageManagerUtils = __importStar(require("@expo/package-manager"));
32
32
  const semver_1 = __importDefault(require("semver"));
33
+ const zod_1 = require("zod");
33
34
  var PackageManager;
34
35
  (function (PackageManager) {
35
36
  PackageManager["YARN"] = "yarn";
@@ -68,4 +69,39 @@ async function isAtLeastNpm7Async() {
68
69
  return semver_1.default.gte(version, '7.0.0');
69
70
  }
70
71
  exports.isAtLeastNpm7Async = isAtLeastNpm7Async;
72
+ function shouldUseFrozenLockfile({ env, sdkVersion, reactNativeVersion, }) {
73
+ if (env.EAS_NO_FROZEN_LOCKFILE) {
74
+ return false;
75
+ }
76
+ if (sdkVersion && semver_1.default.lt(sdkVersion, '53.0.0')) {
77
+ // Before SDK 53 we could not have used frozen lockfile.
78
+ return false;
79
+ }
80
+ if (reactNativeVersion && semver_1.default.lt(reactNativeVersion, '0.79.0')) {
81
+ // Before react-native 0.79 we could not have used frozen lockfile.
82
+ return false;
83
+ }
84
+ // We either don't know expo and react-native versions,
85
+ // so we can try to use frozen lockfile, or the versions are
86
+ // new enough that we do want to use it.
87
+ return true;
88
+ }
89
+ exports.shouldUseFrozenLockfile = shouldUseFrozenLockfile;
90
+ const PackageJsonZ = zod_1.z.object({
91
+ dependencies: zod_1.z.record(zod_1.z.string(), zod_1.z.string()).optional(),
92
+ devDependencies: zod_1.z.record(zod_1.z.string(), zod_1.z.string()).optional(),
93
+ });
94
+ function getPackageVersionFromPackageJson({ packageJson, packageName, }) {
95
+ var _a, _b, _c, _d;
96
+ const parsedPackageJson = PackageJsonZ.safeParse(packageJson);
97
+ if (!parsedPackageJson.success) {
98
+ return undefined;
99
+ }
100
+ const version = (_b = (_a = parsedPackageJson.data.dependencies) === null || _a === void 0 ? void 0 : _a[packageName]) !== null && _b !== void 0 ? _b : (_c = parsedPackageJson.data.devDependencies) === null || _c === void 0 ? void 0 : _c[packageName];
101
+ if (!version) {
102
+ return undefined;
103
+ }
104
+ return (_d = semver_1.default.coerce(version)) === null || _d === void 0 ? void 0 : _d.version;
105
+ }
106
+ exports.getPackageVersionFromPackageJson = getPackageVersionFromPackageJson;
71
107
  //# sourceMappingURL=packageManager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"packageManager.js","sourceRoot":"","sources":["../../src/utils/packageManager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sEAA4C;AAC5C,2EAA6D;AAC7D,oDAA4B;AAE5B,IAAY,cAKX;AALD,WAAY,cAAc;IACxB,+BAAa,CAAA;IACb,6BAAW,CAAA;IACX,+BAAa,CAAA;IACb,6BAAW,CAAA;AACb,CAAC,EALW,cAAc,8BAAd,cAAc,QAKzB;AAED,SAAgB,qBAAqB,CAAC,SAAiB;IACrD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,mBAAmB,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QACrE,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;YACtB,OAAO,cAAc,CAAC,GAAG,CAAC;QAC5B,CAAC;aAAM,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YAC9B,OAAO,cAAc,CAAC,IAAI,CAAC;QAC7B,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;YAC7B,OAAO,cAAc,CAAC,GAAG,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,OAAO,cAAc,CAAC,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,cAAc,CAAC,IAAI,CAAC;IAC7B,CAAC;AACH,CAAC;AAfD,sDAeC;AAED,SAAgB,mBAAmB,CAAC,UAAkB;;IACpD,OAAO,MAAA,mBAAmB,CAAC,oBAAoB,CAAC,UAAU,CAAC,mCAAI,UAAU,CAAC;AAC5E,CAAC;AAFD,kDAEC;AAEM,KAAK,UAAU,kBAAkB;IACtC,MAAM,OAAO,GAAG,CAAC,MAAM,IAAA,sBAAU,EAAC,KAAK,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC1F,OAAO,gBAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC;AAHD,gDAGC","sourcesContent":["import spawnAsync from '@expo/turtle-spawn';\nimport * as PackageManagerUtils from '@expo/package-manager';\nimport semver from 'semver';\n\nexport enum PackageManager {\n YARN = 'yarn',\n NPM = 'npm',\n PNPM = 'pnpm',\n BUN = 'bun',\n}\n\nexport function resolvePackageManager(directory: string): PackageManager {\n try {\n const manager = PackageManagerUtils.resolvePackageManager(directory);\n if (manager === 'npm') {\n return PackageManager.NPM;\n } else if (manager === 'pnpm') {\n return PackageManager.PNPM;\n } else if (manager === 'bun') {\n return PackageManager.BUN;\n } else {\n return PackageManager.YARN;\n }\n } catch {\n return PackageManager.YARN;\n }\n}\n\nexport function findPackagerRootDir(currentDir: string): string {\n return PackageManagerUtils.resolveWorkspaceRoot(currentDir) ?? currentDir;\n}\n\nexport async function isAtLeastNpm7Async(): Promise<boolean> {\n const version = (await spawnAsync('npm', ['--version'], { stdio: 'pipe' })).stdout.trim();\n return semver.gte(version, '7.0.0');\n}\n"]}
1
+ {"version":3,"file":"packageManager.js","sourceRoot":"","sources":["../../src/utils/packageManager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sEAA4C;AAC5C,2EAA6D;AAC7D,oDAA4B;AAC5B,6BAAwB;AAExB,IAAY,cAKX;AALD,WAAY,cAAc;IACxB,+BAAa,CAAA;IACb,6BAAW,CAAA;IACX,+BAAa,CAAA;IACb,6BAAW,CAAA;AACb,CAAC,EALW,cAAc,8BAAd,cAAc,QAKzB;AAED,SAAgB,qBAAqB,CAAC,SAAiB;IACrD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,mBAAmB,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QACrE,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;YACtB,OAAO,cAAc,CAAC,GAAG,CAAC;QAC5B,CAAC;aAAM,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YAC9B,OAAO,cAAc,CAAC,IAAI,CAAC;QAC7B,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;YAC7B,OAAO,cAAc,CAAC,GAAG,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,OAAO,cAAc,CAAC,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,cAAc,CAAC,IAAI,CAAC;IAC7B,CAAC;AACH,CAAC;AAfD,sDAeC;AAED,SAAgB,mBAAmB,CAAC,UAAkB;;IACpD,OAAO,MAAA,mBAAmB,CAAC,oBAAoB,CAAC,UAAU,CAAC,mCAAI,UAAU,CAAC;AAC5E,CAAC;AAFD,kDAEC;AAEM,KAAK,UAAU,kBAAkB;IACtC,MAAM,OAAO,GAAG,CAAC,MAAM,IAAA,sBAAU,EAAC,KAAK,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC1F,OAAO,gBAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC;AAHD,gDAGC;AAED,SAAgB,uBAAuB,CAAC,EACtC,GAAG,EACH,UAAU,EACV,kBAAkB,GAKnB;IACC,IAAI,GAAG,CAAC,sBAAsB,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,UAAU,IAAI,gBAAM,CAAC,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC;QAClD,wDAAwD;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,kBAAkB,IAAI,gBAAM,CAAC,EAAE,CAAC,kBAAkB,EAAE,QAAQ,CAAC,EAAE,CAAC;QAClE,mEAAmE;QACnE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,uDAAuD;IACvD,4DAA4D;IAC5D,wCAAwC;IACxC,OAAO,IAAI,CAAC;AACd,CAAC;AA3BD,0DA2BC;AAED,MAAM,YAAY,GAAG,OAAC,CAAC,MAAM,CAAC;IAC5B,YAAY,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACzD,eAAe,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC7D,CAAC,CAAC;AAEH,SAAgB,gCAAgC,CAAC,EAC/C,WAAW,EACX,WAAW,GAIZ;;IACC,MAAM,iBAAiB,GAAG,YAAY,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC9D,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GACX,MAAA,MAAA,iBAAiB,CAAC,IAAI,CAAC,YAAY,0CAAG,WAAW,CAAC,mCAClD,MAAA,iBAAiB,CAAC,IAAI,CAAC,eAAe,0CAAG,WAAW,CAAC,CAAC;IACxD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,MAAA,gBAAM,CAAC,MAAM,CAAC,OAAO,CAAC,0CAAE,OAAO,CAAC;AACzC,CAAC;AApBD,4EAoBC","sourcesContent":["import spawnAsync from '@expo/turtle-spawn';\nimport * as PackageManagerUtils from '@expo/package-manager';\nimport semver from 'semver';\nimport { z } from 'zod';\n\nexport enum PackageManager {\n YARN = 'yarn',\n NPM = 'npm',\n PNPM = 'pnpm',\n BUN = 'bun',\n}\n\nexport function resolvePackageManager(directory: string): PackageManager {\n try {\n const manager = PackageManagerUtils.resolvePackageManager(directory);\n if (manager === 'npm') {\n return PackageManager.NPM;\n } else if (manager === 'pnpm') {\n return PackageManager.PNPM;\n } else if (manager === 'bun') {\n return PackageManager.BUN;\n } else {\n return PackageManager.YARN;\n }\n } catch {\n return PackageManager.YARN;\n }\n}\n\nexport function findPackagerRootDir(currentDir: string): string {\n return PackageManagerUtils.resolveWorkspaceRoot(currentDir) ?? currentDir;\n}\n\nexport async function isAtLeastNpm7Async(): Promise<boolean> {\n const version = (await spawnAsync('npm', ['--version'], { stdio: 'pipe' })).stdout.trim();\n return semver.gte(version, '7.0.0');\n}\n\nexport function shouldUseFrozenLockfile({\n env,\n sdkVersion,\n reactNativeVersion,\n}: {\n env: Record<string, string | undefined>;\n sdkVersion: string | undefined;\n reactNativeVersion: string | undefined;\n}): boolean {\n if (env.EAS_NO_FROZEN_LOCKFILE) {\n return false;\n }\n\n if (sdkVersion && semver.lt(sdkVersion, '53.0.0')) {\n // Before SDK 53 we could not have used frozen lockfile.\n return false;\n }\n\n if (reactNativeVersion && semver.lt(reactNativeVersion, '0.79.0')) {\n // Before react-native 0.79 we could not have used frozen lockfile.\n return false;\n }\n\n // We either don't know expo and react-native versions,\n // so we can try to use frozen lockfile, or the versions are\n // new enough that we do want to use it.\n return true;\n}\n\nconst PackageJsonZ = z.object({\n dependencies: z.record(z.string(), z.string()).optional(),\n devDependencies: z.record(z.string(), z.string()).optional(),\n});\n\nexport function getPackageVersionFromPackageJson({\n packageJson,\n packageName,\n}: {\n packageJson: unknown;\n packageName: string;\n}): string | undefined {\n const parsedPackageJson = PackageJsonZ.safeParse(packageJson);\n if (!parsedPackageJson.success) {\n return undefined;\n }\n\n const version =\n parsedPackageJson.data.dependencies?.[packageName] ??\n parsedPackageJson.data.devDependencies?.[packageName];\n if (!version) {\n return undefined;\n }\n\n return semver.coerce(version)?.version;\n}\n"]}
@@ -3,7 +3,7 @@ import { PackageManager } from '../utils/packageManager';
3
3
  /**
4
4
  * check if .yarnrc.yml exists in the project dir or in the workspace root dir
5
5
  */
6
- export declare function isUsingYarn2(projectDir: string): Promise<boolean>;
6
+ export declare function isUsingModernYarnVersion(projectDir: string): Promise<boolean>;
7
7
  export declare function runExpoCliCommand({ packageManager, args, options, }: {
8
8
  packageManager: PackageManager;
9
9
  args: string[];
@@ -3,7 +3,7 @@ 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.readPackageJson = exports.runExpoCliCommand = exports.isUsingYarn2 = void 0;
6
+ exports.readPackageJson = exports.runExpoCliCommand = exports.isUsingModernYarnVersion = void 0;
7
7
  const path_1 = __importDefault(require("path"));
8
8
  const turtle_spawn_1 = __importDefault(require("@expo/turtle-spawn"));
9
9
  const fs_extra_1 = __importDefault(require("fs-extra"));
@@ -11,12 +11,12 @@ const packageManager_1 = require("../utils/packageManager");
11
11
  /**
12
12
  * check if .yarnrc.yml exists in the project dir or in the workspace root dir
13
13
  */
14
- async function isUsingYarn2(projectDir) {
14
+ async function isUsingModernYarnVersion(projectDir) {
15
15
  const yarnrcPath = path_1.default.join(projectDir, '.yarnrc.yml');
16
16
  const yarnrcRootPath = path_1.default.join((0, packageManager_1.findPackagerRootDir)(projectDir), '.yarnrc.yml');
17
17
  return (await fs_extra_1.default.pathExists(yarnrcPath)) || (await fs_extra_1.default.pathExists(yarnrcRootPath));
18
18
  }
19
- exports.isUsingYarn2 = isUsingYarn2;
19
+ exports.isUsingModernYarnVersion = isUsingModernYarnVersion;
20
20
  function runExpoCliCommand({ packageManager, args, options, }) {
21
21
  const argsWithExpo = ['expo', ...args];
22
22
  if (packageManager === packageManager_1.PackageManager.NPM) {
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/utils/project.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,sEAAoF;AACpF,wDAA0B;AAE1B,4DAA8E;AAE9E;;GAEG;AACI,KAAK,UAAU,YAAY,CAAC,UAAkB;IACnD,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,cAAI,CAAC,IAAI,CAAC,IAAA,oCAAmB,EAAC,UAAU,CAAC,EAAE,aAAa,CAAC,CAAC;IACjF,OAAO,CAAC,MAAM,kBAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,kBAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;AACpF,CAAC;AAJD,oCAIC;AAED,SAAgB,iBAAiB,CAAC,EAChC,cAAc,EACd,IAAI,EACJ,OAAO,GAKR;IACC,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;IACvC,IAAI,cAAc,KAAK,+BAAc,CAAC,GAAG,EAAE,CAAC;QAC1C,OAAO,IAAA,sBAAK,EAAC,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;SAAM,IAAI,cAAc,KAAK,+BAAc,CAAC,IAAI,EAAE,CAAC;QAClD,OAAO,IAAA,sBAAK,EAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;SAAM,IAAI,cAAc,KAAK,+BAAc,CAAC,IAAI,EAAE,CAAC;QAClD,OAAO,IAAA,sBAAK,EAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;SAAM,IAAI,cAAc,KAAK,+BAAc,CAAC,GAAG,EAAE,CAAC;QACjD,OAAO,IAAA,sBAAK,EAAC,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,gCAAgC,cAAc,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AArBD,8CAqBC;AAED,SAAgB,eAAe,CAAC,UAAkB;IAChD,MAAM,eAAe,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAC9D,IAAI,CAAC,kBAAE,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,kCAAkC,UAAU,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,CAAC;QACH,OAAO,kBAAE,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,yCAAyC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAVD,0CAUC","sourcesContent":["import path from 'path';\n\nimport spawn, { SpawnOptions, SpawnPromise, SpawnResult } from '@expo/turtle-spawn';\nimport fs from 'fs-extra';\n\nimport { findPackagerRootDir, PackageManager } from '../utils/packageManager';\n\n/**\n * check if .yarnrc.yml exists in the project dir or in the workspace root dir\n */\nexport async function isUsingYarn2(projectDir: string): Promise<boolean> {\n const yarnrcPath = path.join(projectDir, '.yarnrc.yml');\n const yarnrcRootPath = path.join(findPackagerRootDir(projectDir), '.yarnrc.yml');\n return (await fs.pathExists(yarnrcPath)) || (await fs.pathExists(yarnrcRootPath));\n}\n\nexport function runExpoCliCommand({\n packageManager,\n args,\n options,\n}: {\n packageManager: PackageManager;\n args: string[];\n options: SpawnOptions;\n}): SpawnPromise<SpawnResult> {\n const argsWithExpo = ['expo', ...args];\n if (packageManager === PackageManager.NPM) {\n return spawn('npx', argsWithExpo, options);\n } else if (packageManager === PackageManager.YARN) {\n return spawn('yarn', argsWithExpo, options);\n } else if (packageManager === PackageManager.PNPM) {\n return spawn('pnpm', argsWithExpo, options);\n } else if (packageManager === PackageManager.BUN) {\n return spawn('bun', argsWithExpo, options);\n } else {\n throw new Error(`Unsupported package manager: ${packageManager}`);\n }\n}\n\nexport function readPackageJson(projectDir: string): any {\n const packageJsonPath = path.join(projectDir, 'package.json');\n if (!fs.pathExistsSync(packageJsonPath)) {\n throw new Error(`package.json does not exist in ${projectDir}`);\n }\n try {\n return fs.readJSONSync(packageJsonPath);\n } catch (err: any) {\n throw new Error(`Failed to parse or read package.json: ${err.message}`);\n }\n}\n"]}
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/utils/project.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,sEAAoF;AACpF,wDAA0B;AAE1B,4DAA8E;AAE9E;;GAEG;AACI,KAAK,UAAU,wBAAwB,CAAC,UAAkB;IAC/D,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,cAAI,CAAC,IAAI,CAAC,IAAA,oCAAmB,EAAC,UAAU,CAAC,EAAE,aAAa,CAAC,CAAC;IACjF,OAAO,CAAC,MAAM,kBAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,kBAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;AACpF,CAAC;AAJD,4DAIC;AAED,SAAgB,iBAAiB,CAAC,EAChC,cAAc,EACd,IAAI,EACJ,OAAO,GAKR;IACC,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;IACvC,IAAI,cAAc,KAAK,+BAAc,CAAC,GAAG,EAAE,CAAC;QAC1C,OAAO,IAAA,sBAAK,EAAC,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;SAAM,IAAI,cAAc,KAAK,+BAAc,CAAC,IAAI,EAAE,CAAC;QAClD,OAAO,IAAA,sBAAK,EAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;SAAM,IAAI,cAAc,KAAK,+BAAc,CAAC,IAAI,EAAE,CAAC;QAClD,OAAO,IAAA,sBAAK,EAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;SAAM,IAAI,cAAc,KAAK,+BAAc,CAAC,GAAG,EAAE,CAAC;QACjD,OAAO,IAAA,sBAAK,EAAC,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,gCAAgC,cAAc,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AArBD,8CAqBC;AAED,SAAgB,eAAe,CAAC,UAAkB;IAChD,MAAM,eAAe,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAC9D,IAAI,CAAC,kBAAE,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,kCAAkC,UAAU,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,CAAC;QACH,OAAO,kBAAE,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,yCAAyC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAVD,0CAUC","sourcesContent":["import path from 'path';\n\nimport spawn, { SpawnOptions, SpawnPromise, SpawnResult } from '@expo/turtle-spawn';\nimport fs from 'fs-extra';\n\nimport { findPackagerRootDir, PackageManager } from '../utils/packageManager';\n\n/**\n * check if .yarnrc.yml exists in the project dir or in the workspace root dir\n */\nexport async function isUsingModernYarnVersion(projectDir: string): Promise<boolean> {\n const yarnrcPath = path.join(projectDir, '.yarnrc.yml');\n const yarnrcRootPath = path.join(findPackagerRootDir(projectDir), '.yarnrc.yml');\n return (await fs.pathExists(yarnrcPath)) || (await fs.pathExists(yarnrcRootPath));\n}\n\nexport function runExpoCliCommand({\n packageManager,\n args,\n options,\n}: {\n packageManager: PackageManager;\n args: string[];\n options: SpawnOptions;\n}): SpawnPromise<SpawnResult> {\n const argsWithExpo = ['expo', ...args];\n if (packageManager === PackageManager.NPM) {\n return spawn('npx', argsWithExpo, options);\n } else if (packageManager === PackageManager.YARN) {\n return spawn('yarn', argsWithExpo, options);\n } else if (packageManager === PackageManager.PNPM) {\n return spawn('pnpm', argsWithExpo, options);\n } else if (packageManager === PackageManager.BUN) {\n return spawn('bun', argsWithExpo, options);\n } else {\n throw new Error(`Unsupported package manager: ${packageManager}`);\n }\n}\n\nexport function readPackageJson(projectDir: string): any {\n const packageJsonPath = path.join(projectDir, 'package.json');\n if (!fs.pathExistsSync(packageJsonPath)) {\n throw new Error(`package.json does not exist in ${projectDir}`);\n }\n try {\n return fs.readJSONSync(packageJsonPath);\n } catch (err: any) {\n throw new Error(`Failed to parse or read package.json: ${err.message}`);\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expo/build-tools",
3
- "version": "1.0.176",
3
+ "version": "1.0.178",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "files": [
@@ -75,5 +75,5 @@
75
75
  "node": "20.14.0",
76
76
  "yarn": "1.22.21"
77
77
  },
78
- "gitHead": "986319b035bbb22f05aedfb8d45db27971e46b79"
78
+ "gitHead": "4f6c5a1eaa3fd24586d304e33e8edf8731791659"
79
79
  }