@expo/build-tools 0.1.124 → 0.1.127

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.
@@ -4,10 +4,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.runHookIfPresent = exports.Hook = void 0;
7
- const path_1 = __importDefault(require("path"));
8
7
  const turtle_spawn_1 = __importDefault(require("@expo/turtle-spawn"));
9
- const fs_extra_1 = __importDefault(require("fs-extra"));
10
8
  const packageManager_1 = require("./packageManager");
9
+ const project_1 = require("./project");
11
10
  var Hook;
12
11
  (function (Hook) {
13
12
  Hook["PRE_INSTALL"] = "eas-build-pre-install";
@@ -29,7 +28,7 @@ async function runHookIfPresent(ctx, hook) {
29
28
  ctx.logger.info(`Script '${hook}' is present in package.json, running it...`);
30
29
  // when using yarn 2, it's not possible to run any scripts before running 'yarn install'
31
30
  // use 'npm' in that case
32
- const packageManager = (await isUsingYarn2(projectDir)) && hook === Hook.PRE_INSTALL
31
+ const packageManager = (await (0, project_1.isUsingYarn2)(projectDir)) && hook === Hook.PRE_INSTALL
33
32
  ? packageManager_1.PackageManager.NPM
34
33
  : ctx.packageManager;
35
34
  await (0, turtle_spawn_1.default)(packageManager, ['run', hook], {
@@ -40,12 +39,4 @@ async function runHookIfPresent(ctx, hook) {
40
39
  }
41
40
  }
42
41
  exports.runHookIfPresent = runHookIfPresent;
43
- /**
44
- * check if .yarnrc.yml exists in the project dir or in the workspace root dir
45
- */
46
- async function isUsingYarn2(projectDir) {
47
- const yarnrcPath = path_1.default.join(projectDir, '.yarnrc.yml');
48
- const yarnrcRootPath = path_1.default.join((0, packageManager_1.findPackagerRootDir)(projectDir), '.yarnrc.yml');
49
- return (await fs_extra_1.default.pathExists(yarnrcPath)) || (await fs_extra_1.default.pathExists(yarnrcRootPath));
50
- }
51
42
  //# sourceMappingURL=hooks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/utils/hooks.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAGxB,sEAAuC;AACvC,wDAA0B;AAI1B,qDAAwF;AAExF,IAAY,IAIX;AAJD,WAAY,IAAI;IACd,6CAAqC,CAAA;IACrC,+CAAuC,CAAA;IACvC,+DAAuD,CAAA;AACzD,CAAC,EAJW,IAAI,GAAJ,YAAI,KAAJ,YAAI,QAIf;AAMM,KAAK,UAAU,gBAAgB,CACpC,GAAuB,EACvB,IAAU;;IAEV,MAAM,UAAU,GAAG,GAAG,CAAC,2BAA2B,CAAC;IACnD,IAAI,WAAwB,CAAC;IAC7B,IAAI;QACF,WAAW,GAAG,MAAM,IAAA,gCAAe,EAAC,UAAU,CAAC,CAAC;KACjD;IAAC,OAAO,GAAQ,EAAE;QACjB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,yCAAyC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxE,OAAO;KACR;IACD,IAAI,MAAA,WAAW,CAAC,OAAO,0CAAG,IAAI,CAAC,EAAE;QAC/B,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,6CAA6C,CAAC,CAAC;QAC9E,wFAAwF;QACxF,yBAAyB;QACzB,MAAM,cAAc,GAClB,CAAC,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC,IAAI,IAAI,KAAK,IAAI,CAAC,WAAW;YAC3D,CAAC,CAAC,+BAAc,CAAC,GAAG;YACpB,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC;QACzB,MAAM,IAAA,sBAAK,EAAC,cAAc,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE;YACzC,GAAG,EAAE,UAAU;YACf,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,GAAG,EAAE,GAAG,CAAC,GAAG;SACb,CAAC,CAAC;KACJ;AACH,CAAC;AA1BD,4CA0BC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CAAC,UAAkB;IAC5C,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","sourcesContent":["import path from 'path';\n\nimport { Job } from '@expo/eas-build-job';\nimport spawn from '@expo/turtle-spawn';\nimport fs from 'fs-extra';\n\nimport { BuildContext } from '../context';\n\nimport { PackageManager, findPackagerRootDir, readPackageJson } from './packageManager';\n\nexport enum Hook {\n PRE_INSTALL = 'eas-build-pre-install',\n POST_INSTALL = 'eas-build-post-install',\n PRE_UPLOAD_ARTIFACTS = 'eas-build-pre-upload-artifacts',\n}\n\ninterface PackageJson {\n scripts?: Record<string, string>;\n}\n\nexport async function runHookIfPresent<TJob extends Job>(\n ctx: BuildContext<TJob>,\n hook: Hook\n): Promise<void> {\n const projectDir = ctx.reactNativeProjectDirectory;\n let packageJson: PackageJson;\n try {\n packageJson = await readPackageJson(projectDir);\n } catch (err: any) {\n ctx.logger.warn(`Failed to parse or read package.json: ${err.message}`);\n return;\n }\n if (packageJson.scripts?.[hook]) {\n ctx.logger.info(`Script '${hook}' is present in package.json, running it...`);\n // when using yarn 2, it's not possible to run any scripts before running 'yarn install'\n // use 'npm' in that case\n const packageManager =\n (await isUsingYarn2(projectDir)) && hook === Hook.PRE_INSTALL\n ? PackageManager.NPM\n : ctx.packageManager;\n await spawn(packageManager, ['run', hook], {\n cwd: projectDir,\n logger: ctx.logger,\n env: ctx.env,\n });\n }\n}\n\n/**\n * check if .yarnrc.yml exists in the project dir or in the workspace root dir\n */\nasync 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"]}
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/utils/hooks.ts"],"names":[],"mappings":";;;;;;AACA,sEAAuC;AAIvC,qDAAmE;AACnE,uCAAyC;AAEzC,IAAY,IAIX;AAJD,WAAY,IAAI;IACd,6CAAqC,CAAA;IACrC,+CAAuC,CAAA;IACvC,+DAAuD,CAAA;AACzD,CAAC,EAJW,IAAI,GAAJ,YAAI,KAAJ,YAAI,QAIf;AAMM,KAAK,UAAU,gBAAgB,CACpC,GAAuB,EACvB,IAAU;;IAEV,MAAM,UAAU,GAAG,GAAG,CAAC,2BAA2B,CAAC;IACnD,IAAI,WAAwB,CAAC;IAC7B,IAAI;QACF,WAAW,GAAG,MAAM,IAAA,gCAAe,EAAC,UAAU,CAAC,CAAC;KACjD;IAAC,OAAO,GAAQ,EAAE;QACjB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,yCAAyC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxE,OAAO;KACR;IACD,IAAI,MAAA,WAAW,CAAC,OAAO,0CAAG,IAAI,CAAC,EAAE;QAC/B,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,6CAA6C,CAAC,CAAC;QAC9E,wFAAwF;QACxF,yBAAyB;QACzB,MAAM,cAAc,GAClB,CAAC,MAAM,IAAA,sBAAY,EAAC,UAAU,CAAC,CAAC,IAAI,IAAI,KAAK,IAAI,CAAC,WAAW;YAC3D,CAAC,CAAC,+BAAc,CAAC,GAAG;YACpB,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC;QACzB,MAAM,IAAA,sBAAK,EAAC,cAAc,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE;YACzC,GAAG,EAAE,UAAU;YACf,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,GAAG,EAAE,GAAG,CAAC,GAAG;SACb,CAAC,CAAC;KACJ;AACH,CAAC;AA1BD,4CA0BC","sourcesContent":["import { Job } from '@expo/eas-build-job';\nimport spawn from '@expo/turtle-spawn';\n\nimport { BuildContext } from '../context';\n\nimport { PackageManager, readPackageJson } from './packageManager';\nimport { isUsingYarn2 } from './project';\n\nexport enum Hook {\n PRE_INSTALL = 'eas-build-pre-install',\n POST_INSTALL = 'eas-build-post-install',\n PRE_UPLOAD_ARTIFACTS = 'eas-build-pre-upload-artifacts',\n}\n\ninterface PackageJson {\n scripts?: Record<string, string>;\n}\n\nexport async function runHookIfPresent<TJob extends Job>(\n ctx: BuildContext<TJob>,\n hook: Hook\n): Promise<void> {\n const projectDir = ctx.reactNativeProjectDirectory;\n let packageJson: PackageJson;\n try {\n packageJson = await readPackageJson(projectDir);\n } catch (err: any) {\n ctx.logger.warn(`Failed to parse or read package.json: ${err.message}`);\n return;\n }\n if (packageJson.scripts?.[hook]) {\n ctx.logger.info(`Script '${hook}' is present in package.json, running it...`);\n // when using yarn 2, it's not possible to run any scripts before running 'yarn install'\n // use 'npm' in that case\n const packageManager =\n (await isUsingYarn2(projectDir)) && hook === Hook.PRE_INSTALL\n ? PackageManager.NPM\n : ctx.packageManager;\n await spawn(packageManager, ['run', hook], {\n cwd: projectDir,\n logger: ctx.logger,\n env: ctx.env,\n });\n }\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  export declare enum PackageManager {
2
2
  YARN = "yarn",
3
- NPM = "npm"
3
+ NPM = "npm",
4
+ PNPM = "pnpm"
4
5
  }
5
6
  export declare function resolvePackageManager(directory: string): PackageManager;
6
7
  export declare function findPackagerRootDir(currentDir: string): string;
@@ -1,21 +1,53 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
27
  };
5
28
  Object.defineProperty(exports, "__esModule", { value: true });
6
29
  exports.readPackageJson = exports.findPackagerRootDir = exports.resolvePackageManager = exports.PackageManager = void 0;
7
30
  const path_1 = __importDefault(require("path"));
8
- const package_manager_1 = require("@expo/package-manager");
9
- const find_yarn_workspace_root_1 = __importDefault(require("find-yarn-workspace-root"));
31
+ const PackageManagerUtils = __importStar(require("@expo/package-manager"));
10
32
  const fs_extra_1 = __importDefault(require("fs-extra"));
11
33
  var PackageManager;
12
34
  (function (PackageManager) {
13
35
  PackageManager["YARN"] = "yarn";
14
36
  PackageManager["NPM"] = "npm";
37
+ PackageManager["PNPM"] = "pnpm";
15
38
  })(PackageManager = exports.PackageManager || (exports.PackageManager = {}));
16
39
  function resolvePackageManager(directory) {
17
40
  try {
18
- return (0, package_manager_1.isUsingYarn)(directory) ? PackageManager.YARN : PackageManager.NPM;
41
+ const manager = PackageManagerUtils.resolvePackageManager(directory);
42
+ if (manager === 'npm') {
43
+ return PackageManager.NPM;
44
+ }
45
+ else if (manager === 'pnpm') {
46
+ return PackageManager.PNPM;
47
+ }
48
+ else {
49
+ return PackageManager.YARN;
50
+ }
19
51
  }
20
52
  catch (_a) {
21
53
  return PackageManager.YARN;
@@ -24,7 +56,7 @@ function resolvePackageManager(directory) {
24
56
  exports.resolvePackageManager = resolvePackageManager;
25
57
  function findPackagerRootDir(currentDir) {
26
58
  var _a;
27
- return (_a = (0, find_yarn_workspace_root_1.default)(currentDir)) !== null && _a !== void 0 ? _a : currentDir;
59
+ return (_a = PackageManagerUtils.findWorkspaceRoot(currentDir)) !== null && _a !== void 0 ? _a : currentDir;
28
60
  }
29
61
  exports.findPackagerRootDir = findPackagerRootDir;
30
62
  async function readPackageJson(projectDir) {
@@ -1 +1 @@
1
- {"version":3,"file":"packageManager.js","sourceRoot":"","sources":["../../src/utils/packageManager.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,2DAAoD;AACpD,wFAA6D;AAC7D,wDAA0B;AAE1B,IAAY,cAGX;AAHD,WAAY,cAAc;IACxB,+BAAa,CAAA;IACb,6BAAW,CAAA;AACb,CAAC,EAHW,cAAc,GAAd,sBAAc,KAAd,sBAAc,QAGzB;AAED,SAAgB,qBAAqB,CAAC,SAAiB;IACrD,IAAI;QACF,OAAO,IAAA,6BAAW,EAAC,SAAS,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC;KAC1E;IAAC,WAAM;QACN,OAAO,cAAc,CAAC,IAAI,CAAC;KAC5B;AACH,CAAC;AAND,sDAMC;AAED,SAAgB,mBAAmB,CAAC,UAAkB;;IACpD,OAAO,MAAA,IAAA,kCAAqB,EAAC,UAAU,CAAC,mCAAI,UAAU,CAAC;AACzD,CAAC;AAFD,kDAEC;AAEM,KAAK,UAAU,eAAe,CAAC,UAAkB;IACtD,MAAM,eAAe,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAC9D,IAAI,CAAC,CAAC,MAAM,kBAAE,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,EAAE;QAC3C,MAAM,IAAI,KAAK,CAAC,kCAAkC,UAAU,EAAE,CAAC,CAAC;KACjE;IACD,MAAM,QAAQ,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAPD,0CAOC","sourcesContent":["import path from 'path';\n\nimport { isUsingYarn } from '@expo/package-manager';\nimport findYarnWorkspaceRoot from 'find-yarn-workspace-root';\nimport fs from 'fs-extra';\n\nexport enum PackageManager {\n YARN = 'yarn',\n NPM = 'npm',\n}\n\nexport function resolvePackageManager(directory: string): PackageManager {\n try {\n return isUsingYarn(directory) ? PackageManager.YARN : PackageManager.NPM;\n } catch {\n return PackageManager.YARN;\n }\n}\n\nexport function findPackagerRootDir(currentDir: string): string {\n return findYarnWorkspaceRoot(currentDir) ?? currentDir;\n}\n\nexport async function readPackageJson(projectDir: string): Promise<any> {\n const packageJsonPath = path.join(projectDir, 'package.json');\n if (!(await fs.pathExists(packageJsonPath))) {\n throw new Error(`package.json does not exist in ${projectDir}`);\n }\n const contents = await fs.readFile(packageJsonPath, 'utf-8');\n return JSON.parse(contents);\n}\n"]}
1
+ {"version":3,"file":"packageManager.js","sourceRoot":"","sources":["../../src/utils/packageManager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAwB;AAExB,2EAA6D;AAC7D,wDAA0B;AAE1B,IAAY,cAIX;AAJD,WAAY,cAAc;IACxB,+BAAa,CAAA;IACb,6BAAW,CAAA;IACX,+BAAa,CAAA;AACf,CAAC,EAJW,cAAc,GAAd,sBAAc,KAAd,sBAAc,QAIzB;AAED,SAAgB,qBAAqB,CAAC,SAAiB;IACrD,IAAI;QACF,MAAM,OAAO,GAAG,mBAAmB,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QACrE,IAAI,OAAO,KAAK,KAAK,EAAE;YACrB,OAAO,cAAc,CAAC,GAAG,CAAC;SAC3B;aAAM,IAAI,OAAO,KAAK,MAAM,EAAE;YAC7B,OAAO,cAAc,CAAC,IAAI,CAAC;SAC5B;aAAM;YACL,OAAO,cAAc,CAAC,IAAI,CAAC;SAC5B;KACF;IAAC,WAAM;QACN,OAAO,cAAc,CAAC,IAAI,CAAC;KAC5B;AACH,CAAC;AAbD,sDAaC;AAED,SAAgB,mBAAmB,CAAC,UAAkB;;IACpD,OAAO,MAAA,mBAAmB,CAAC,iBAAiB,CAAC,UAAU,CAAC,mCAAI,UAAU,CAAC;AACzE,CAAC;AAFD,kDAEC;AAEM,KAAK,UAAU,eAAe,CAAC,UAAkB;IACtD,MAAM,eAAe,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAC9D,IAAI,CAAC,CAAC,MAAM,kBAAE,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,EAAE;QAC3C,MAAM,IAAI,KAAK,CAAC,kCAAkC,UAAU,EAAE,CAAC,CAAC;KACjE;IACD,MAAM,QAAQ,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAPD,0CAOC","sourcesContent":["import path from 'path';\n\nimport * as PackageManagerUtils from '@expo/package-manager';\nimport fs from 'fs-extra';\n\nexport enum PackageManager {\n YARN = 'yarn',\n NPM = 'npm',\n PNPM = 'pnpm',\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 {\n return PackageManager.YARN;\n }\n } catch {\n return PackageManager.YARN;\n }\n}\n\nexport function findPackagerRootDir(currentDir: string): string {\n return PackageManagerUtils.findWorkspaceRoot(currentDir) ?? currentDir;\n}\n\nexport async function readPackageJson(projectDir: string): Promise<any> {\n const packageJsonPath = path.join(projectDir, 'package.json');\n if (!(await fs.pathExists(packageJsonPath))) {\n throw new Error(`package.json does not exist in ${projectDir}`);\n }\n const contents = await fs.readFile(packageJsonPath, 'utf-8');\n return JSON.parse(contents);\n}\n"]}
@@ -4,15 +4,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.prebuildAsync = void 0;
7
- const turtle_spawn_1 = __importDefault(require("@expo/turtle-spawn"));
7
+ const semver_1 = __importDefault(require("semver"));
8
+ const project_1 = require("./project");
8
9
  async function prebuildAsync(ctx, options) {
10
+ var _a;
11
+ const customExpoCliVersion = (_a = ctx.job.builderEnvironment) === null || _a === void 0 ? void 0 : _a.expoCli;
12
+ const shouldDisableSharp = !customExpoCliVersion || semver_1.default.satisfies(customExpoCliVersion, '>=5.4.4');
9
13
  const spawnOptions = {
10
14
  cwd: ctx.reactNativeProjectDirectory,
11
15
  logger: ctx.logger,
12
- env: Object.assign(Object.assign({}, options === null || options === void 0 ? void 0 : options.extraEnvs), ctx.env),
16
+ env: Object.assign(Object.assign(Object.assign({}, (shouldDisableSharp ? { EXPO_IMAGE_UTILS_NO_SHARP: '1' } : {})), options === null || options === void 0 ? void 0 : options.extraEnvs), ctx.env),
13
17
  };
14
18
  await ctx.runExpoCliCommand(getPrebuildCommand(ctx.job), spawnOptions);
15
- await (0, turtle_spawn_1.default)(ctx.packageManager, ['install'], spawnOptions);
19
+ await (0, project_1.installDependencies)(ctx);
16
20
  }
17
21
  exports.prebuildAsync = prebuildAsync;
18
22
  function getPrebuildCommand(job) {
@@ -1 +1 @@
1
- {"version":3,"file":"prebuild.js","sourceRoot":"","sources":["../../src/utils/prebuild.ts"],"names":[],"mappings":";;;;;;AACA,sEAA8D;AAQvD,KAAK,UAAU,aAAa,CACjC,GAAuB,EACvB,OAAyB;IAEzB,MAAM,YAAY,GAAiB;QACjC,GAAG,EAAE,GAAG,CAAC,2BAA2B;QACpC,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,GAAG,kCACE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,GAClB,GAAG,CAAC,GAAG,CACX;KACF,CAAC;IAEF,MAAM,GAAG,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;IACvE,MAAM,IAAA,sBAAU,EAAC,GAAG,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,EAAE,YAAY,CAAC,CAAC;AAClE,CAAC;AAfD,sCAeC;AAED,SAAS,kBAAkB,CAAC,GAAQ;;IAClC,IAAI,eAAe,GACjB,MAAA,MAAA,GAAG,CAAC,YAAY,0CAAE,eAAe,mCACjC,sDAAsD,GAAG,CAAC,QAAQ,EAAE,CAAC;IACvE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE;QAChD,eAAe,GAAG,GAAG,eAAe,eAAe,GAAG,CAAC,QAAQ,EAAE,CAAC;KACnE;IACD,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE;QAC/C,eAAe,GAAG,GAAG,eAAe,oBAAoB,CAAC;KAC1D;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;QAChD,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;KAC1E;IACD,IAAI,eAAe,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE;QACjD,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;KAC3E;IACD,IAAI,eAAe,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE;QACpD,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;KAC9E;IACD,OAAO,eAAe,CAAC;AACzB,CAAC","sourcesContent":["import { Job } from '@expo/eas-build-job';\nimport spawnAsync, { SpawnOptions } from '@expo/turtle-spawn';\n\nimport { BuildContext } from '../context';\n\nexport interface PrebuildOptions {\n extraEnvs?: Record<string, string>;\n}\n\nexport async function prebuildAsync<TJob extends Job>(\n ctx: BuildContext<TJob>,\n options?: PrebuildOptions\n): Promise<void> {\n const spawnOptions: SpawnOptions = {\n cwd: ctx.reactNativeProjectDirectory,\n logger: ctx.logger,\n env: {\n ...options?.extraEnvs,\n ...ctx.env,\n },\n };\n\n await ctx.runExpoCliCommand(getPrebuildCommand(ctx.job), spawnOptions);\n await spawnAsync(ctx.packageManager, ['install'], spawnOptions);\n}\n\nfunction getPrebuildCommand(job: Job): string {\n let prebuildCommand =\n job.experimental?.prebuildCommand ??\n `prebuild --non-interactive --no-install --platform ${job.platform}`;\n if (!prebuildCommand.match(/(?:--platform| -p)/)) {\n prebuildCommand = `${prebuildCommand} --platform ${job.platform}`;\n }\n if (!prebuildCommand.match(/--non-interactive/)) {\n prebuildCommand = `${prebuildCommand} --non-interactive`;\n }\n const npxCommandPrefix = 'npx ';\n const expoCommandPrefix = 'expo ';\n const expoCliCommandPrefix = 'expo-cli ';\n if (prebuildCommand.startsWith(npxCommandPrefix)) {\n prebuildCommand = prebuildCommand.substr(npxCommandPrefix.length).trim();\n }\n if (prebuildCommand.startsWith(expoCommandPrefix)) {\n prebuildCommand = prebuildCommand.substr(expoCommandPrefix.length).trim();\n }\n if (prebuildCommand.startsWith(expoCliCommandPrefix)) {\n prebuildCommand = prebuildCommand.substr(expoCliCommandPrefix.length).trim();\n }\n return prebuildCommand;\n}\n"]}
1
+ {"version":3,"file":"prebuild.js","sourceRoot":"","sources":["../../src/utils/prebuild.ts"],"names":[],"mappings":";;;;;;AAEA,oDAA4B;AAI5B,uCAAgD;AAMzC,KAAK,UAAU,aAAa,CACjC,GAAuB,EACvB,OAAyB;;IAEzB,MAAM,oBAAoB,GAAG,MAAA,GAAG,CAAC,GAAG,CAAC,kBAAkB,0CAAE,OAAO,CAAC;IACjE,MAAM,kBAAkB,GACtB,CAAC,oBAAoB,IAAI,gBAAM,CAAC,SAAS,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC;IAE7E,MAAM,YAAY,GAAiB;QACjC,GAAG,EAAE,GAAG,CAAC,2BAA2B;QACpC,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,GAAG,gDACE,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,yBAAyB,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAC9D,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,GAClB,GAAG,CAAC,GAAG,CACX;KACF,CAAC;IAEF,MAAM,GAAG,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;IACvE,MAAM,IAAA,6BAAmB,EAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AApBD,sCAoBC;AAED,SAAS,kBAAkB,CAAC,GAAQ;;IAClC,IAAI,eAAe,GACjB,MAAA,MAAA,GAAG,CAAC,YAAY,0CAAE,eAAe,mCACjC,sDAAsD,GAAG,CAAC,QAAQ,EAAE,CAAC;IACvE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE;QAChD,eAAe,GAAG,GAAG,eAAe,eAAe,GAAG,CAAC,QAAQ,EAAE,CAAC;KACnE;IACD,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE;QAC/C,eAAe,GAAG,GAAG,eAAe,oBAAoB,CAAC;KAC1D;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;QAChD,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;KAC1E;IACD,IAAI,eAAe,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE;QACjD,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;KAC3E;IACD,IAAI,eAAe,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE;QACpD,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;KAC9E;IACD,OAAO,eAAe,CAAC;AACzB,CAAC","sourcesContent":["import { Job } from '@expo/eas-build-job';\nimport { SpawnOptions } from '@expo/turtle-spawn';\nimport semver from 'semver';\n\nimport { BuildContext } from '../context';\n\nimport { installDependencies } from './project';\n\nexport interface PrebuildOptions {\n extraEnvs?: Record<string, string>;\n}\n\nexport async function prebuildAsync<TJob extends Job>(\n ctx: BuildContext<TJob>,\n options?: PrebuildOptions\n): Promise<void> {\n const customExpoCliVersion = ctx.job.builderEnvironment?.expoCli;\n const shouldDisableSharp =\n !customExpoCliVersion || semver.satisfies(customExpoCliVersion, '>=5.4.4');\n\n const spawnOptions: SpawnOptions = {\n cwd: ctx.reactNativeProjectDirectory,\n logger: ctx.logger,\n env: {\n ...(shouldDisableSharp ? { EXPO_IMAGE_UTILS_NO_SHARP: '1' } : {}),\n ...options?.extraEnvs,\n ...ctx.env,\n },\n };\n\n await ctx.runExpoCliCommand(getPrebuildCommand(ctx.job), spawnOptions);\n await installDependencies(ctx);\n}\n\nfunction getPrebuildCommand(job: Job): string {\n let prebuildCommand =\n job.experimental?.prebuildCommand ??\n `prebuild --non-interactive --no-install --platform ${job.platform}`;\n if (!prebuildCommand.match(/(?:--platform| -p)/)) {\n prebuildCommand = `${prebuildCommand} --platform ${job.platform}`;\n }\n if (!prebuildCommand.match(/--non-interactive/)) {\n prebuildCommand = `${prebuildCommand} --non-interactive`;\n }\n const npxCommandPrefix = 'npx ';\n const expoCommandPrefix = 'expo ';\n const expoCliCommandPrefix = 'expo-cli ';\n if (prebuildCommand.startsWith(npxCommandPrefix)) {\n prebuildCommand = prebuildCommand.substr(npxCommandPrefix.length).trim();\n }\n if (prebuildCommand.startsWith(expoCommandPrefix)) {\n prebuildCommand = prebuildCommand.substr(expoCommandPrefix.length).trim();\n }\n if (prebuildCommand.startsWith(expoCliCommandPrefix)) {\n prebuildCommand = prebuildCommand.substr(expoCliCommandPrefix.length).trim();\n }\n return prebuildCommand;\n}\n"]}
@@ -1,3 +1,8 @@
1
1
  import { Job } from '@expo/eas-build-job';
2
2
  import { BuildContext } from '../context';
3
3
  export declare function setup<TJob extends Job>(ctx: BuildContext<TJob>): Promise<void>;
4
+ export declare function installDependencies<TJob extends Job>(ctx: BuildContext<TJob>): Promise<void>;
5
+ /**
6
+ * check if .yarnrc.yml exists in the project dir or in the workspace root dir
7
+ */
8
+ export declare function isUsingYarn2(projectDir: string): Promise<boolean>;
@@ -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.setup = void 0;
6
+ exports.isUsingYarn2 = exports.installDependencies = exports.setup = void 0;
7
7
  const path_1 = __importDefault(require("path"));
8
8
  const downloader_1 = __importDefault(require("@expo/downloader"));
9
9
  const eas_build_job_1 = require("@expo/eas-build-job");
@@ -82,18 +82,38 @@ async function installDependencies(ctx) {
82
82
  const packagerRunDir = (0, packageManager_1.findPackagerRootDir)(ctx.reactNativeProjectDirectory);
83
83
  if (packagerRunDir !== ctx.reactNativeProjectDirectory) {
84
84
  const relativeReactNativeProjectDirectory = path_1.default.relative(ctx.buildDirectory, ctx.reactNativeProjectDirectory);
85
- ctx.logger.info(`We detected that '${relativeReactNativeProjectDirectory}' is a workspace`);
85
+ ctx.logger.info(`We detected that '${relativeReactNativeProjectDirectory}' is a ${ctx.packageManager} workspace`);
86
86
  }
87
87
  const relativePackagerRunDir = path_1.default.relative(ctx.buildDirectory, packagerRunDir);
88
- ctx.logger.info(`Running ${ctx.packageManager} in ${relativePackagerRunDir
88
+ let args = ['install'];
89
+ if (ctx.packageManager === packageManager_1.PackageManager.PNPM) {
90
+ args = ['install', '--no-frozen-lockfile'];
91
+ }
92
+ else if (ctx.packageManager === packageManager_1.PackageManager.YARN) {
93
+ const isYarn2 = await isUsingYarn2(ctx.reactNativeProjectDirectory);
94
+ if (isYarn2) {
95
+ args = ['install', '--no-immutable'];
96
+ }
97
+ }
98
+ ctx.logger.info(`Running "${ctx.packageManager} ${args.join(' ')}" in ${relativePackagerRunDir
89
99
  ? `directory '${relativePackagerRunDir}'`
90
100
  : 'the root dir of your repository'} `);
91
- await (0, turtle_spawn_1.default)(ctx.packageManager, ['install'], {
101
+ await (0, turtle_spawn_1.default)(ctx.packageManager, args, {
92
102
  cwd: packagerRunDir,
93
103
  logger: ctx.logger,
94
104
  env: ctx.env,
95
105
  });
96
106
  }
107
+ exports.installDependencies = installDependencies;
108
+ /**
109
+ * check if .yarnrc.yml exists in the project dir or in the workspace root dir
110
+ */
111
+ async function isUsingYarn2(projectDir) {
112
+ const yarnrcPath = path_1.default.join(projectDir, '.yarnrc.yml');
113
+ const yarnrcRootPath = path_1.default.join((0, packageManager_1.findPackagerRootDir)(projectDir), '.yarnrc.yml');
114
+ return (await fs_extra_1.default.pathExists(yarnrcPath)) || (await fs_extra_1.default.pathExists(yarnrcRootPath));
115
+ }
116
+ exports.isUsingYarn2 = isUsingYarn2;
97
117
  async function runExpoDoctor(ctx) {
98
118
  ctx.logger.info('Running "expo doctor"');
99
119
  let timeout;
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/utils/project.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\n\nimport downloadFile from '@expo/downloader';\nimport { ArchiveSourceType, BuildPhase, Job } from '@expo/eas-build-job';\nimport spawn, { SpawnResult } from '@expo/turtle-spawn';\nimport fs from 'fs-extra';\n\nimport { BuildContext } from '../context';\n\nimport { Hook, runHookIfPresent } from './hooks';\nimport { createNpmrcIfNotExistsAsync } from './npmrc';\nimport { findPackagerRootDir, readPackageJson } from './packageManager';\n\nconst MAX_EXPO_DOCTOR_TIMEOUT_MS = 20 * 1000;\n\nexport async function setup<TJob extends Job>(ctx: BuildContext<TJob>): Promise<void> {\n await ctx.runBuildPhase(BuildPhase.PREPARE_PROJECT, async () => {\n await downloadAndUnpackProject(ctx);\n if (ctx.env.NPM_TOKEN) {\n await createNpmrcIfNotExistsAsync(ctx);\n }\n });\n\n await ctx.runBuildPhase(BuildPhase.PRE_INSTALL_HOOK, async () => {\n await runHookIfPresent(ctx, Hook.PRE_INSTALL);\n });\n\n await ctx.runBuildPhase(BuildPhase.INSTALL_DEPENDENCIES, async () => {\n await installDependencies(ctx);\n });\n\n const packageJson = await ctx.runBuildPhase(BuildPhase.READ_PACKAGE_JSON, async () => {\n const packageJsonContents = await readPackageJson(ctx.reactNativeProjectDirectory);\n ctx.logger.info('Using package.json:');\n ctx.logger.info(JSON.stringify(packageJsonContents, null, 2));\n return packageJsonContents;\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 });\n\n const hasExpoPackage = !!packageJson?.dependencies?.expo;\n if (hasExpoPackage) {\n await ctx.runBuildPhase(BuildPhase.RUN_EXPO_DOCTOR, async () => {\n try {\n const { stdout } = await runExpoDoctor(ctx);\n if (!stdout.match(/Didn't find any issues with the project/)) {\n ctx.markBuildPhaseHasWarnings();\n }\n } catch (err) {\n ctx.logger.error({ err }, 'Command \"expo doctor\" failed.');\n ctx.markBuildPhaseHasWarnings();\n }\n });\n }\n}\n\nasync function downloadAndUnpackProject<TJob extends Job>(ctx: BuildContext<TJob>): Promise<void> {\n const projectTarball = path.join(ctx.workingdir, 'project.tar.gz');\n if (ctx.job.projectArchive.type === ArchiveSourceType.S3) {\n throw new Error('ArchiveSourceType.S3 should be resolved earlier to url');\n } else if (ctx.job.projectArchive.type === ArchiveSourceType.PATH) {\n await fs.copy(ctx.job.projectArchive.path, projectTarball); // used in eas-build-cli\n } else if (ctx.job.projectArchive.type === ArchiveSourceType.URL) {\n try {\n await downloadFile(ctx.job.projectArchive.url, projectTarball, { retry: 3 });\n } catch (err: any) {\n ctx?.reportError?.('Failed to download project archive', err);\n throw err;\n }\n }\n\n await spawn(\n 'tar',\n ['--strip-components', '1', '-zxf', 'project.tar.gz', '-C', ctx.buildDirectory],\n {\n cwd: ctx.workingdir,\n logger: ctx.logger,\n }\n );\n}\n\nasync function installDependencies<TJob extends Job>(ctx: BuildContext<TJob>): Promise<void> {\n const packagerRunDir = findPackagerRootDir(ctx.reactNativeProjectDirectory);\n if (packagerRunDir !== ctx.reactNativeProjectDirectory) {\n const relativeReactNativeProjectDirectory = path.relative(\n ctx.buildDirectory,\n ctx.reactNativeProjectDirectory\n );\n ctx.logger.info(`We detected that '${relativeReactNativeProjectDirectory}' is a workspace`);\n }\n\n const relativePackagerRunDir = path.relative(ctx.buildDirectory, packagerRunDir);\n ctx.logger.info(\n `Running ${ctx.packageManager} in ${\n relativePackagerRunDir\n ? `directory '${relativePackagerRunDir}'`\n : 'the root dir of your repository'\n } `\n );\n await spawn(ctx.packageManager, ['install'], {\n cwd: packagerRunDir,\n logger: ctx.logger,\n env: ctx.env,\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 try {\n const promise = ctx.runExpoCliCommand('doctor', {\n cwd: ctx.reactNativeProjectDirectory,\n logger: ctx.logger,\n env: ctx.env,\n });\n timeout = setTimeout(() => {\n promise.child.kill();\n ctx?.reportError?.(`\"expo doctor\" timed out`);\n }, MAX_EXPO_DOCTOR_TIMEOUT_MS);\n return await promise;\n } finally {\n if (timeout) {\n clearTimeout(timeout);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/utils/project.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\n\nimport downloadFile from '@expo/downloader';\nimport { ArchiveSourceType, BuildPhase, Job } from '@expo/eas-build-job';\nimport spawn, { SpawnResult } from '@expo/turtle-spawn';\nimport fs from 'fs-extra';\n\nimport { BuildContext } from '../context';\n\nimport { Hook, runHookIfPresent } from './hooks';\nimport { createNpmrcIfNotExistsAsync } from './npmrc';\nimport { findPackagerRootDir, PackageManager, readPackageJson } from './packageManager';\n\nconst MAX_EXPO_DOCTOR_TIMEOUT_MS = 20 * 1000;\n\nexport async function setup<TJob extends Job>(ctx: BuildContext<TJob>): Promise<void> {\n await ctx.runBuildPhase(BuildPhase.PREPARE_PROJECT, async () => {\n await downloadAndUnpackProject(ctx);\n if (ctx.env.NPM_TOKEN) {\n await createNpmrcIfNotExistsAsync(ctx);\n }\n });\n\n await ctx.runBuildPhase(BuildPhase.PRE_INSTALL_HOOK, async () => {\n await runHookIfPresent(ctx, Hook.PRE_INSTALL);\n });\n\n await ctx.runBuildPhase(BuildPhase.INSTALL_DEPENDENCIES, async () => {\n await installDependencies(ctx);\n });\n\n const packageJson = await ctx.runBuildPhase(BuildPhase.READ_PACKAGE_JSON, async () => {\n const packageJsonContents = await readPackageJson(ctx.reactNativeProjectDirectory);\n ctx.logger.info('Using package.json:');\n ctx.logger.info(JSON.stringify(packageJsonContents, null, 2));\n return packageJsonContents;\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 });\n\n const hasExpoPackage = !!packageJson?.dependencies?.expo;\n if (hasExpoPackage) {\n await ctx.runBuildPhase(BuildPhase.RUN_EXPO_DOCTOR, async () => {\n try {\n const { stdout } = await runExpoDoctor(ctx);\n if (!stdout.match(/Didn't find any issues with the project/)) {\n ctx.markBuildPhaseHasWarnings();\n }\n } catch (err) {\n ctx.logger.error({ err }, 'Command \"expo doctor\" failed.');\n ctx.markBuildPhaseHasWarnings();\n }\n });\n }\n}\n\nasync function downloadAndUnpackProject<TJob extends Job>(ctx: BuildContext<TJob>): Promise<void> {\n const projectTarball = path.join(ctx.workingdir, 'project.tar.gz');\n if (ctx.job.projectArchive.type === ArchiveSourceType.S3) {\n throw new Error('ArchiveSourceType.S3 should be resolved earlier to url');\n } else if (ctx.job.projectArchive.type === ArchiveSourceType.PATH) {\n await fs.copy(ctx.job.projectArchive.path, projectTarball); // used in eas-build-cli\n } else if (ctx.job.projectArchive.type === ArchiveSourceType.URL) {\n try {\n await downloadFile(ctx.job.projectArchive.url, projectTarball, { retry: 3 });\n } catch (err: any) {\n ctx?.reportError?.('Failed to download project archive', err);\n throw err;\n }\n }\n\n await spawn(\n 'tar',\n ['--strip-components', '1', '-zxf', 'project.tar.gz', '-C', ctx.buildDirectory],\n {\n cwd: ctx.workingdir,\n logger: ctx.logger,\n }\n );\n}\n\nexport async function installDependencies<TJob extends Job>(\n ctx: BuildContext<TJob>\n): Promise<void> {\n const packagerRunDir = findPackagerRootDir(ctx.reactNativeProjectDirectory);\n if (packagerRunDir !== ctx.reactNativeProjectDirectory) {\n const relativeReactNativeProjectDirectory = path.relative(\n ctx.buildDirectory,\n ctx.reactNativeProjectDirectory\n );\n ctx.logger.info(\n `We detected that '${relativeReactNativeProjectDirectory}' is a ${ctx.packageManager} workspace`\n );\n }\n\n const relativePackagerRunDir = path.relative(ctx.buildDirectory, packagerRunDir);\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.reactNativeProjectDirectory);\n if (isYarn2) {\n args = ['install', '--no-immutable'];\n }\n }\n ctx.logger.info(\n `Running \"${ctx.packageManager} ${args.join(' ')}\" in ${\n relativePackagerRunDir\n ? `directory '${relativePackagerRunDir}'`\n : 'the root dir of your repository'\n } `\n );\n await spawn(ctx.packageManager, args, {\n cwd: packagerRunDir,\n logger: ctx.logger,\n env: ctx.env,\n });\n}\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\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 try {\n const promise = ctx.runExpoCliCommand('doctor', {\n cwd: ctx.reactNativeProjectDirectory,\n logger: ctx.logger,\n env: ctx.env,\n });\n timeout = setTimeout(() => {\n promise.child.kill();\n ctx?.reportError?.(`\"expo doctor\" timed out`);\n }, MAX_EXPO_DOCTOR_TIMEOUT_MS);\n return await promise;\n } finally {\n if (timeout) {\n clearTimeout(timeout);\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expo/build-tools",
3
- "version": "0.1.124",
3
+ "version": "0.1.127",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "files": [
@@ -19,22 +19,22 @@
19
19
  "bugs": "https://github.com/expo/eas-build/issues",
20
20
  "license": "BUSL-1.1",
21
21
  "dependencies": {
22
- "@expo/config": "6.0.21",
23
- "@expo/config-plugins": "4.1.2",
22
+ "@expo/config": "6.0.24",
23
+ "@expo/config-plugins": "4.1.5",
24
24
  "@expo/downloader": "0.0.19",
25
- "@expo/eas-build-job": "0.2.73",
25
+ "@expo/eas-build-job": "0.2.75",
26
26
  "@expo/logger": "0.0.22",
27
- "@expo/package-manager": "^0.0.47",
27
+ "@expo/package-manager": "0.0.54",
28
28
  "@expo/plist": "^0.0.11",
29
29
  "@expo/template-file": "0.1.21",
30
30
  "@expo/turtle-spawn": "0.0.23",
31
31
  "@expo/xcpretty": "^4.1.1",
32
32
  "fast-glob": "^3.2.5",
33
- "find-yarn-workspace-root": "^2.0.0",
34
33
  "fs-extra": "^10.0.1",
35
34
  "node-forge": "^1.2.1",
36
35
  "nullthrows": "^1.1.1",
37
- "plist": "^3.0.1"
36
+ "plist": "^3.0.1",
37
+ "semver": "^7.3.7"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/fs-extra": "^9.0.13",
@@ -42,6 +42,7 @@
42
42
  "@types/node": "^16.11.26",
43
43
  "@types/node-forge": "^1.0.1",
44
44
  "@types/plist": "^3.0.2",
45
+ "@types/semver": "^7.3.9",
45
46
  "@types/uuid": "^3.4.5",
46
47
  "@types/xml2js": "^0.4.5",
47
48
  "jest": "^27.5.1",