@expo/build-tools 0.1.164 → 0.1.166

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.
Files changed (49) hide show
  1. package/dist/buildErrors/userErrorHandlers.js +17 -0
  2. package/dist/buildErrors/userErrorHandlers.js.map +1 -1
  3. package/dist/builders/android.js +3 -3
  4. package/dist/builders/android.js.map +1 -1
  5. package/dist/builders/ios.js +41 -4
  6. package/dist/builders/ios.js.map +1 -1
  7. package/dist/common/easBuildInternal.d.ts +4 -0
  8. package/dist/common/easBuildInternal.js +106 -0
  9. package/dist/common/easBuildInternal.js.map +1 -0
  10. package/dist/common/installDependencies.d.ts +3 -0
  11. package/dist/common/installDependencies.js +38 -0
  12. package/dist/common/installDependencies.js.map +1 -0
  13. package/dist/{utils → common}/prebuild.d.ts +0 -0
  14. package/dist/{utils → common}/prebuild.js +3 -2
  15. package/dist/common/prebuild.js.map +1 -0
  16. package/dist/common/projectSources.d.ts +4 -0
  17. package/dist/common/projectSources.js +91 -0
  18. package/dist/common/projectSources.js.map +1 -0
  19. package/dist/common/setup.d.ts +3 -0
  20. package/dist/common/setup.js +97 -0
  21. package/dist/common/setup.js.map +1 -0
  22. package/dist/context.d.ts +8 -3
  23. package/dist/context.js +28 -4
  24. package/dist/context.js.map +1 -1
  25. package/dist/ios/credentials/distributionCertificate.d.ts +2 -2
  26. package/dist/ios/credentials/distributionCertificate.js +8 -1
  27. package/dist/ios/credentials/distributionCertificate.js.map +1 -1
  28. package/dist/ios/credentials/manager.d.ts +4 -3
  29. package/dist/ios/credentials/manager.js +13 -3
  30. package/dist/ios/credentials/manager.js.map +1 -1
  31. package/dist/ios/credentials/provisioningProfile.d.ts +6 -1
  32. package/dist/ios/credentials/provisioningProfile.js +6 -1
  33. package/dist/ios/credentials/provisioningProfile.js.map +1 -1
  34. package/dist/ios/fastfile.d.ts +8 -0
  35. package/dist/ios/fastfile.js +28 -0
  36. package/dist/ios/fastfile.js.map +1 -0
  37. package/dist/ios/fastlane.d.ts +4 -0
  38. package/dist/ios/fastlane.js +19 -1
  39. package/dist/ios/fastlane.js.map +1 -1
  40. package/dist/ios/gymfile.js.map +1 -1
  41. package/dist/ios/resign.d.ts +3 -0
  42. package/dist/ios/resign.js +33 -0
  43. package/dist/ios/resign.js.map +1 -0
  44. package/dist/utils/project.d.ts +0 -2
  45. package/dist/utils/project.js +2 -133
  46. package/dist/utils/project.js.map +1 -1
  47. package/package.json +7 -4
  48. package/templates/Fastfile.resign.template +8 -0
  49. package/dist/utils/prebuild.js.map +0 -1
@@ -20,10 +20,12 @@ var DistributionType;
20
20
  })(DistributionType = exports.DistributionType || (exports.DistributionType = {}));
21
21
  const PROVISIONING_PROFILES_DIRECTORY = path_1.default.join(os_1.default.homedir(), 'Library/MobileDevice/Provisioning Profiles');
22
22
  class ProvisioningProfile {
23
- constructor(ctx, profile, keychainPath) {
23
+ constructor(ctx, profile, keychainPath, target, certificateCommonName) {
24
24
  this.ctx = ctx;
25
25
  this.profile = profile;
26
26
  this.keychainPath = keychainPath;
27
+ this.target = target;
28
+ this.certificateCommonName = certificateCommonName;
27
29
  this.profilePath = path_1.default.join(PROVISIONING_PROFILES_DIRECTORY, `${(0, uuid_1.v4)()}.mobileprovision`);
28
30
  }
29
31
  get data() {
@@ -79,11 +81,14 @@ Profile's certificate fingerprint = ${devCertFingerprint}, distribution certific
79
81
  const applicationIdentifier = plistData.Entitlements['application-identifier'];
80
82
  const bundleIdentifier = applicationIdentifier.replace(/^.+?\./, '');
81
83
  this.profileData = {
84
+ path: this.keychainPath,
85
+ target: this.target,
82
86
  bundleIdentifier,
83
87
  teamId: plistData.TeamIdentifier[0],
84
88
  uuid: plistData.UUID,
85
89
  name: plistData.Name,
86
90
  developerCertificate: Buffer.from(plistData.DeveloperCertificates[0], 'base64'),
91
+ certificateCommonName: this.certificateCommonName,
87
92
  distributionType: this.resolveDistributionType(plistData),
88
93
  };
89
94
  }
@@ -1 +1 @@
1
- {"version":3,"file":"provisioningProfile.js","sourceRoot":"","sources":["../../../src/ios/credentials/provisioningProfile.ts"],"names":[],"mappings":"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","sourcesContent":["import crypto from 'crypto';\nimport os from 'os';\nimport path from 'path';\n\nimport { errors, Ios } from '@expo/eas-build-job';\nimport spawn from '@expo/turtle-spawn';\nimport fs from 'fs-extra';\nimport plist from 'plist';\nimport { v4 as uuid } from 'uuid';\n\nimport { BuildContext } from '../../context';\n\nexport interface ProvisioningProfileData {\n bundleIdentifier: string;\n teamId: string;\n uuid: string;\n name: string;\n developerCertificate: Buffer;\n distributionType: DistributionType;\n}\n\nexport enum DistributionType {\n AD_HOC = 'ad-hoc',\n APP_STORE = 'app-store',\n ENTERPRISE = 'enterprise',\n}\n\nconst PROVISIONING_PROFILES_DIRECTORY = path.join(\n os.homedir(),\n 'Library/MobileDevice/Provisioning Profiles'\n);\n\nexport default class ProvisioningProfile<TJob extends Ios.Job> {\n get data(): ProvisioningProfileData {\n if (!this.profileData) {\n throw new Error('You must init the profile first!');\n } else {\n return this.profileData;\n }\n }\n\n private readonly profilePath: string;\n private profileData?: ProvisioningProfileData;\n\n constructor(\n private readonly ctx: BuildContext<TJob>,\n private readonly profile: Buffer,\n private readonly keychainPath: string\n ) {\n this.profilePath = path.join(PROVISIONING_PROFILES_DIRECTORY, `${uuid()}.mobileprovision`);\n }\n\n public async init(): Promise<void> {\n this.ctx.logger.debug(`Making sure ${PROVISIONING_PROFILES_DIRECTORY} exits`);\n await fs.ensureDir(PROVISIONING_PROFILES_DIRECTORY);\n\n this.ctx.logger.debug(`Writing provisioning profile to ${this.profilePath}`);\n await fs.writeFile(this.profilePath, this.profile);\n\n this.ctx.logger.debug('Loading provisioning profile');\n await this.load();\n }\n\n public async destroy(): Promise<void> {\n if (!this.profilePath) {\n this.ctx.logger.warn(\n \"There is nothing to destroy, a provisioning profile hasn't been created yet.\"\n );\n return;\n }\n this.ctx.logger.info('Removing provisioning profile');\n await fs.remove(this.profilePath);\n }\n\n public verifyCertificate(fingerprint: string): void {\n const devCertFingerprint = this.genDerCertFingerprint();\n if (devCertFingerprint !== fingerprint) {\n throw new errors.CredentialsDistCertMismatchError(\n `Provisioning profile and distribution certificate don't match.\nProfile's certificate fingerprint = ${devCertFingerprint}, distribution certificate fingerprint = ${fingerprint}`\n );\n }\n }\n\n private async load(): Promise<void> {\n let result;\n try {\n result = await spawn(\n 'security',\n ['cms', '-D', '-k', this.keychainPath, '-i', this.profilePath],\n {\n stdio: 'pipe',\n }\n );\n } catch (err: any) {\n throw new Error(err.stderr.trim());\n }\n const { output } = result;\n\n const plistRaw = output.join('');\n let plistData;\n try {\n plistData = plist.parse(plistRaw) as plist.PlistObject;\n } catch (error: any) {\n throw new Error(`Error when parsing plist: ${error.message}`);\n }\n\n const applicationIdentifier = (plistData.Entitlements as plist.PlistObject)[\n 'application-identifier'\n ] as string;\n const bundleIdentifier = applicationIdentifier.replace(/^.+?\\./, '');\n\n this.profileData = {\n bundleIdentifier,\n teamId: (plistData.TeamIdentifier as string[])[0],\n uuid: plistData.UUID as string,\n name: plistData.Name as string,\n developerCertificate: Buffer.from((plistData.DeveloperCertificates as string[])[0], 'base64'),\n distributionType: this.resolveDistributionType(plistData),\n };\n }\n\n private resolveDistributionType(plistData: plist.PlistObject): DistributionType {\n if (plistData.ProvisionsAllDevices) {\n return DistributionType.ENTERPRISE;\n } else if (plistData.ProvisionedDevices) {\n return DistributionType.AD_HOC;\n } else {\n return DistributionType.APP_STORE;\n }\n }\n\n private genDerCertFingerprint(): string {\n return crypto\n .createHash('sha1')\n .update(this.data.developerCertificate)\n .digest('hex')\n .toUpperCase();\n }\n}\n"]}
1
+ {"version":3,"file":"provisioningProfile.js","sourceRoot":"","sources":["../../../src/ios/credentials/provisioningProfile.ts"],"names":[],"mappings":"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","sourcesContent":["import crypto from 'crypto';\nimport os from 'os';\nimport path from 'path';\n\nimport { errors, Ios } from '@expo/eas-build-job';\nimport spawn from '@expo/turtle-spawn';\nimport fs from 'fs-extra';\nimport plist from 'plist';\nimport { v4 as uuid } from 'uuid';\n\nimport { BuildContext } from '../../context';\n\nexport interface ProvisioningProfileData {\n path: string;\n target: string;\n bundleIdentifier: string;\n teamId: string;\n uuid: string;\n name: string;\n developerCertificate: Buffer;\n certificateCommonName: string;\n distributionType: DistributionType;\n}\n\nexport enum DistributionType {\n AD_HOC = 'ad-hoc',\n APP_STORE = 'app-store',\n ENTERPRISE = 'enterprise',\n}\n\nconst PROVISIONING_PROFILES_DIRECTORY = path.join(\n os.homedir(),\n 'Library/MobileDevice/Provisioning Profiles'\n);\n\nexport default class ProvisioningProfile<TJob extends Ios.Job> {\n get data(): ProvisioningProfileData {\n if (!this.profileData) {\n throw new Error('You must init the profile first!');\n } else {\n return this.profileData;\n }\n }\n\n private readonly profilePath: string;\n private profileData?: ProvisioningProfileData;\n\n constructor(\n private readonly ctx: BuildContext<TJob>,\n private readonly profile: Buffer,\n private readonly keychainPath: string,\n private readonly target: string,\n private readonly certificateCommonName: string\n ) {\n this.profilePath = path.join(PROVISIONING_PROFILES_DIRECTORY, `${uuid()}.mobileprovision`);\n }\n\n public async init(): Promise<void> {\n this.ctx.logger.debug(`Making sure ${PROVISIONING_PROFILES_DIRECTORY} exits`);\n await fs.ensureDir(PROVISIONING_PROFILES_DIRECTORY);\n\n this.ctx.logger.debug(`Writing provisioning profile to ${this.profilePath}`);\n await fs.writeFile(this.profilePath, this.profile);\n\n this.ctx.logger.debug('Loading provisioning profile');\n await this.load();\n }\n\n public async destroy(): Promise<void> {\n if (!this.profilePath) {\n this.ctx.logger.warn(\n \"There is nothing to destroy, a provisioning profile hasn't been created yet.\"\n );\n return;\n }\n this.ctx.logger.info('Removing provisioning profile');\n await fs.remove(this.profilePath);\n }\n\n public verifyCertificate(fingerprint: string): void {\n const devCertFingerprint = this.genDerCertFingerprint();\n if (devCertFingerprint !== fingerprint) {\n throw new errors.CredentialsDistCertMismatchError(\n `Provisioning profile and distribution certificate don't match.\nProfile's certificate fingerprint = ${devCertFingerprint}, distribution certificate fingerprint = ${fingerprint}`\n );\n }\n }\n\n private async load(): Promise<void> {\n let result;\n try {\n result = await spawn(\n 'security',\n ['cms', '-D', '-k', this.keychainPath, '-i', this.profilePath],\n {\n stdio: 'pipe',\n }\n );\n } catch (err: any) {\n throw new Error(err.stderr.trim());\n }\n const { output } = result;\n\n const plistRaw = output.join('');\n let plistData;\n try {\n plistData = plist.parse(plistRaw) as plist.PlistObject;\n } catch (error: any) {\n throw new Error(`Error when parsing plist: ${error.message}`);\n }\n\n const applicationIdentifier = (plistData.Entitlements as plist.PlistObject)[\n 'application-identifier'\n ] as string;\n const bundleIdentifier = applicationIdentifier.replace(/^.+?\\./, '');\n\n this.profileData = {\n path: this.keychainPath,\n target: this.target,\n bundleIdentifier,\n teamId: (plistData.TeamIdentifier as string[])[0],\n uuid: plistData.UUID as string,\n name: plistData.Name as string,\n developerCertificate: Buffer.from((plistData.DeveloperCertificates as string[])[0], 'base64'),\n certificateCommonName: this.certificateCommonName,\n distributionType: this.resolveDistributionType(plistData),\n };\n }\n\n private resolveDistributionType(plistData: plist.PlistObject): DistributionType {\n if (plistData.ProvisionsAllDevices) {\n return DistributionType.ENTERPRISE;\n } else if (plistData.ProvisionedDevices) {\n return DistributionType.AD_HOC;\n } else {\n return DistributionType.APP_STORE;\n }\n }\n\n private genDerCertFingerprint(): string {\n return crypto\n .createHash('sha1')\n .update(this.data.developerCertificate)\n .digest('hex')\n .toUpperCase();\n }\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import { TargetProvisioningProfiles } from './credentials/manager';
2
+ export declare function createFastfileForResigningBuild({ outputFile, ipaPath, signingIdentity, keychainPath, targetProvisioningProfiles, }: {
3
+ outputFile: string;
4
+ ipaPath: string;
5
+ signingIdentity: string;
6
+ keychainPath: string;
7
+ targetProvisioningProfiles: TargetProvisioningProfiles;
8
+ }): Promise<void>;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createFastfileForResigningBuild = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const template_file_1 = __importDefault(require("@expo/template-file"));
9
+ const RESIGN_TEMPLATE_FILE_PATH = path_1.default.join(__dirname, '../../templates/Fastfile.resign.template');
10
+ async function createFastfileForResigningBuild({ outputFile, ipaPath, signingIdentity, keychainPath, targetProvisioningProfiles, }) {
11
+ const PROFILES = [];
12
+ const targets = Object.keys(targetProvisioningProfiles);
13
+ for (const target of targets) {
14
+ const profile = targetProvisioningProfiles[target];
15
+ PROFILES.push({
16
+ BUNDLE_ID: profile.bundleIdentifier,
17
+ PATH: profile.path,
18
+ });
19
+ }
20
+ await (0, template_file_1.default)(RESIGN_TEMPLATE_FILE_PATH, {
21
+ IPA_PATH: ipaPath,
22
+ SIGNING_IDENTITY: signingIdentity,
23
+ PROFILES,
24
+ KEYCHAIN_PATH: keychainPath,
25
+ }, outputFile, { mustache: false });
26
+ }
27
+ exports.createFastfileForResigningBuild = createFastfileForResigningBuild;
28
+ //# sourceMappingURL=fastfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastfile.js","sourceRoot":"","sources":["../../src/ios/fastfile.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,wEAA+C;AAI/C,MAAM,yBAAyB,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,0CAA0C,CAAC,CAAC;AAE5F,KAAK,UAAU,+BAA+B,CAAC,EACpD,UAAU,EACV,OAAO,EACP,eAAe,EACf,YAAY,EACZ,0BAA0B,GAO3B;IACC,MAAM,QAAQ,GAA0C,EAAE,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACxD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;QAC5B,MAAM,OAAO,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;QACnD,QAAQ,CAAC,IAAI,CAAC;YACZ,SAAS,EAAE,OAAO,CAAC,gBAAgB;YACnC,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC,CAAC;KACJ;IAED,MAAM,IAAA,uBAAY,EAChB,yBAAyB,EACzB;QACE,QAAQ,EAAE,OAAO;QACjB,gBAAgB,EAAE,eAAe;QACjC,QAAQ;QACR,aAAa,EAAE,YAAY;KAC5B,EACD,UAAU,EACV,EAAE,QAAQ,EAAE,KAAK,EAAE,CACpB,CAAC;AACJ,CAAC;AAlCD,0EAkCC","sourcesContent":["import path from 'path';\n\nimport templateFile from '@expo/template-file';\n\nimport { TargetProvisioningProfiles } from './credentials/manager';\n\nconst RESIGN_TEMPLATE_FILE_PATH = path.join(__dirname, '../../templates/Fastfile.resign.template');\n\nexport async function createFastfileForResigningBuild({\n outputFile,\n ipaPath,\n signingIdentity,\n keychainPath,\n targetProvisioningProfiles,\n}: {\n outputFile: string;\n ipaPath: string;\n signingIdentity: string;\n keychainPath: string;\n targetProvisioningProfiles: TargetProvisioningProfiles;\n}): Promise<void> {\n const PROFILES: { BUNDLE_ID: string; PATH: string }[] = [];\n const targets = Object.keys(targetProvisioningProfiles);\n for (const target of targets) {\n const profile = targetProvisioningProfiles[target];\n PROFILES.push({\n BUNDLE_ID: profile.bundleIdentifier,\n PATH: profile.path,\n });\n }\n\n await templateFile(\n RESIGN_TEMPLATE_FILE_PATH,\n {\n IPA_PATH: ipaPath,\n SIGNING_IDENTITY: signingIdentity,\n PROFILES,\n KEYCHAIN_PATH: keychainPath,\n },\n outputFile,\n { mustache: false }\n );\n}\n"]}
@@ -9,6 +9,10 @@ export declare function runFastlaneGym<TJob extends Ios.Job>(ctx: BuildContext<T
9
9
  credentials: Credentials | null;
10
10
  entitlements: object | null;
11
11
  }): Promise<void>;
12
+ export declare function runFastlaneResign<TJob extends Ios.Job>(ctx: BuildContext<TJob>, { credentials, ipaPath }: {
13
+ credentials: Credentials;
14
+ ipaPath: string;
15
+ }): Promise<void>;
12
16
  export declare function runFastlane(fastlaneArgs: string[], { logger, env, cwd, }?: {
13
17
  logger?: bunyan;
14
18
  env?: Record<string, 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.runFastlane = exports.runFastlaneGym = void 0;
6
+ exports.runFastlane = exports.runFastlaneResign = exports.runFastlaneGym = 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"));
@@ -12,6 +12,7 @@ const context_1 = require("../context");
12
12
  const gymfile_1 = require("./gymfile");
13
13
  const xcpretty_1 = require("./xcpretty");
14
14
  const tvos_1 = require("./tvos");
15
+ const fastfile_1 = require("./fastfile");
15
16
  async function runFastlaneGym(ctx, { scheme, buildConfiguration, credentials, entitlements, }) {
16
17
  await ensureGymfileExists(ctx, {
17
18
  scheme,
@@ -37,6 +38,23 @@ async function runFastlaneGym(ctx, { scheme, buildConfiguration, credentials, en
37
38
  }
38
39
  }
39
40
  exports.runFastlaneGym = runFastlaneGym;
41
+ async function runFastlaneResign(ctx, { credentials, ipaPath }) {
42
+ const { certificateCommonName } = credentials.applicationTargetProvisioningProfile.data;
43
+ const fastfilePath = path_1.default.join(ctx.buildDirectory, 'Fastfile');
44
+ await (0, fastfile_1.createFastfileForResigningBuild)({
45
+ outputFile: fastfilePath,
46
+ ipaPath,
47
+ keychainPath: credentials.keychainPath,
48
+ signingIdentity: certificateCommonName,
49
+ targetProvisioningProfiles: credentials.targetProvisioningProfiles,
50
+ });
51
+ await runFastlane(['resign'], {
52
+ cwd: ctx.buildDirectory,
53
+ logger: ctx.logger,
54
+ env: ctx.env,
55
+ });
56
+ }
57
+ exports.runFastlaneResign = runFastlaneResign;
40
58
  async function runFastlane(fastlaneArgs, { logger, env, cwd, } = {}) {
41
59
  const fastlaneEnvVars = Object.assign({ FASTLANE_DISABLE_COLORS: '1', FASTLANE_SKIP_UPDATE_CHECK: '1', SKIP_SLOW_FASTLANE_WARNING: 'true', FASTLANE_HIDE_TIMESTAMP: 'true', LC_ALL: 'en_US.UTF-8' }, (env !== null && env !== void 0 ? env : process.env));
42
60
  return await (0, turtle_spawn_1.default)('fastlane', fastlaneArgs, {
@@ -1 +1 @@
1
- {"version":3,"file":"fastlane.js","sourceRoot":"","sources":["../../src/ios/fastlane.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAIxB,sEAAwD;AACxD,wDAA0B;AAC1B,4DAAoC;AAEpC,wCAAgE;AAEhE,uCAAyF;AAEzF,yCAA8C;AAC9C,iCAAgC;AAEzB,KAAK,UAAU,cAAc,CAClC,GAAuB,EACvB,EACE,MAAM,EACN,kBAAkB,EAClB,WAAW,EACX,YAAY,GAMb;IAED,MAAM,mBAAmB,CAAC,GAAG,EAAE;QAC7B,MAAM;QACN,kBAAkB;QAClB,WAAW;QACX,aAAa,EAAE,GAAG,CAAC,kBAAkB;QACrC,YAAY;KACb,CAAC,CAAC;IACH,IAAI,GAAG,CAAC,eAAe,EAAE;QACvB,MAAM,IAAI,8BAAoB,CAAC,yBAAyB,CAAC,CAAC;KAC3D;IACD,MAAM,WAAW,GAAG,IAAI,2BAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACtF,KAAK,WAAW,CAAC,aAAa,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACvD,IAAI;QACF,MAAM,WAAW,CAAC,CAAC,KAAK,CAAC,EAAE;YACzB,GAAG,EAAE,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,2BAA2B,EAAE,KAAK,CAAC;YACtD,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,GAAG,EAAE,GAAG,CAAC,GAAG;SACb,CAAC,CAAC;KACJ;YAAS;QACR,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC;KAC3B;AACH,CAAC;AAnCD,wCAmCC;AAEM,KAAK,UAAU,WAAW,CAC/B,YAAsB,EACtB,EACE,MAAM,EACN,GAAG,EACH,GAAG,MAKD,EAAE;IAEN,MAAM,eAAe,mBACnB,uBAAuB,EAAE,GAAG,EAC5B,0BAA0B,EAAE,GAAG,EAC/B,0BAA0B,EAAE,MAAM,EAClC,uBAAuB,EAAE,MAAM,EAC/B,MAAM,EAAE,aAAa,IAClB,CAAC,GAAG,aAAH,GAAG,cAAH,GAAG,GAAI,OAAO,CAAC,GAAG,CAAC,CACxB,CAAC;IACF,OAAO,MAAM,IAAA,sBAAK,EAAC,UAAU,EAAE,YAAY,EAAE;QAC3C,GAAG,EAAE,eAAe;QACpB,MAAM;QACN,GAAG;KACJ,CAAC,CAAC;AACL,CAAC;AAzBD,kCAyBC;AAED,KAAK,UAAU,mBAAmB,CAChC,GAAuB,EACvB,EACE,MAAM,EACN,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,YAAY,GAOb;IAED,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,2BAA2B,EAAE,aAAa,CAAC,CAAC;IAE9E,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE;QACpC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC1C,OAAO;KACR;IAED,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACpC,IAAI,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE;QACrB,MAAM,IAAI,GAAG,MAAM,IAAA,aAAM,EAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,oBAAoB,GAAG,oBAAoB,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC;QAEnF,MAAM,IAAA,wCAA8B,EAAC;YACnC,UAAU,EAAE,WAAW;YACvB,MAAM;YACN,kBAAkB,EAAE,kBAAkB,aAAlB,kBAAkB,cAAlB,kBAAkB,GAAI,SAAS;YACnD,eAAe,EAAE,SAAS;YAC1B,KAAK,EAAE,KAAK;YACZ,aAAa;YACb,oBAAoB;SACrB,CAAC,CAAC;KACJ;SAAM;QACL,MAAM,IAAA,sCAA4B,EAAC;YACjC,UAAU,EAAE,WAAW;YACvB,WAAW,EAAE,IAAA,oBAAU,EAAC,WAAW,EAAE,iDAAiD,CAAC;YACvF,MAAM;YACN,kBAAkB;YAClB,eAAe,EAAE,SAAS;YAC1B,KAAK,EAAE,KAAK;YACZ,aAAa;YACb,YAAY,EAAE,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAI,SAAS;SACxC,CAAC,CAAC;KACJ;IAED,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AACrC,CAAC","sourcesContent":["import path from 'path';\n\nimport { Ios } from '@expo/eas-build-job';\nimport { bunyan } from '@expo/logger';\nimport spawn, { SpawnResult } from '@expo/turtle-spawn';\nimport fs from 'fs-extra';\nimport nullthrows from 'nullthrows';\n\nimport { BuildContext, SkipNativeBuildError } from '../context';\n\nimport { createGymfileForArchiveBuild, createGymfileForSimulatorBuild } from './gymfile';\nimport { Credentials } from './credentials/manager';\nimport { XcodeBuildLogger } from './xcpretty';\nimport { isTVOS } from './tvos';\n\nexport async function runFastlaneGym<TJob extends Ios.Job>(\n ctx: BuildContext<TJob>,\n {\n scheme,\n buildConfiguration,\n credentials,\n entitlements,\n }: {\n scheme: string;\n buildConfiguration?: string;\n credentials: Credentials | null;\n entitlements: object | null;\n }\n): Promise<void> {\n await ensureGymfileExists(ctx, {\n scheme,\n buildConfiguration,\n credentials,\n logsDirectory: ctx.buildLogsDirectory,\n entitlements,\n });\n if (ctx.skipNativeBuild) {\n throw new SkipNativeBuildError('Skipping fastlane build');\n }\n const buildLogger = new XcodeBuildLogger(ctx.logger, ctx.reactNativeProjectDirectory);\n void buildLogger.watchLogFiles(ctx.buildLogsDirectory);\n try {\n await runFastlane(['gym'], {\n cwd: path.join(ctx.reactNativeProjectDirectory, 'ios'),\n logger: ctx.logger,\n env: ctx.env,\n });\n } finally {\n await buildLogger.flush();\n }\n}\n\nexport async function runFastlane(\n fastlaneArgs: string[],\n {\n logger,\n env,\n cwd,\n }: {\n logger?: bunyan;\n env?: Record<string, string>;\n cwd?: string;\n } = {}\n): Promise<SpawnResult> {\n const fastlaneEnvVars = {\n FASTLANE_DISABLE_COLORS: '1',\n FASTLANE_SKIP_UPDATE_CHECK: '1',\n SKIP_SLOW_FASTLANE_WARNING: 'true',\n FASTLANE_HIDE_TIMESTAMP: 'true',\n LC_ALL: 'en_US.UTF-8',\n ...(env ?? process.env),\n };\n return await spawn('fastlane', fastlaneArgs, {\n env: fastlaneEnvVars,\n logger,\n cwd,\n });\n}\n\nasync function ensureGymfileExists<TJob extends Ios.Job>(\n ctx: BuildContext<TJob>,\n {\n scheme,\n buildConfiguration,\n credentials,\n logsDirectory,\n entitlements,\n }: {\n scheme: string;\n buildConfiguration?: string;\n credentials: Credentials | null;\n logsDirectory: string;\n entitlements: object | null;\n }\n): Promise<void> {\n const gymfilePath = path.join(ctx.reactNativeProjectDirectory, 'ios/Gymfile');\n\n if (await fs.pathExists(gymfilePath)) {\n ctx.logger.info('Gymfile already exists');\n return;\n }\n\n ctx.logger.info('Creating Gymfile');\n if (ctx.job.simulator) {\n const isTV = await isTVOS(ctx);\n const simulatorDestination = `generic/platform=${isTV ? 'tvOS' : 'iOS'} Simulator`;\n\n await createGymfileForSimulatorBuild({\n outputFile: gymfilePath,\n scheme,\n buildConfiguration: buildConfiguration ?? 'release',\n derivedDataPath: './build',\n clean: false,\n logsDirectory,\n simulatorDestination,\n });\n } else {\n await createGymfileForArchiveBuild({\n outputFile: gymfilePath,\n credentials: nullthrows(credentials, 'credentials must exist for non-simulator builds'),\n scheme,\n buildConfiguration,\n outputDirectory: './build',\n clean: false,\n logsDirectory,\n entitlements: entitlements ?? undefined,\n });\n }\n\n ctx.logger.info('Gymfile created');\n}\n"]}
1
+ {"version":3,"file":"fastlane.js","sourceRoot":"","sources":["../../src/ios/fastlane.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\n\nimport { Ios } from '@expo/eas-build-job';\nimport { bunyan } from '@expo/logger';\nimport spawn, { SpawnResult } from '@expo/turtle-spawn';\nimport fs from 'fs-extra';\nimport nullthrows from 'nullthrows';\n\nimport { BuildContext, SkipNativeBuildError } from '../context';\n\nimport { createGymfileForArchiveBuild, createGymfileForSimulatorBuild } from './gymfile';\nimport { Credentials } from './credentials/manager';\nimport { XcodeBuildLogger } from './xcpretty';\nimport { isTVOS } from './tvos';\nimport { createFastfileForResigningBuild } from './fastfile';\n\nexport async function runFastlaneGym<TJob extends Ios.Job>(\n ctx: BuildContext<TJob>,\n {\n scheme,\n buildConfiguration,\n credentials,\n entitlements,\n }: {\n scheme: string;\n buildConfiguration?: string;\n credentials: Credentials | null;\n entitlements: object | null;\n }\n): Promise<void> {\n await ensureGymfileExists(ctx, {\n scheme,\n buildConfiguration,\n credentials,\n logsDirectory: ctx.buildLogsDirectory,\n entitlements,\n });\n if (ctx.skipNativeBuild) {\n throw new SkipNativeBuildError('Skipping fastlane build');\n }\n const buildLogger = new XcodeBuildLogger(ctx.logger, ctx.reactNativeProjectDirectory);\n void buildLogger.watchLogFiles(ctx.buildLogsDirectory);\n try {\n await runFastlane(['gym'], {\n cwd: path.join(ctx.reactNativeProjectDirectory, 'ios'),\n logger: ctx.logger,\n env: ctx.env,\n });\n } finally {\n await buildLogger.flush();\n }\n}\n\nexport async function runFastlaneResign<TJob extends Ios.Job>(\n ctx: BuildContext<TJob>,\n { credentials, ipaPath }: { credentials: Credentials; ipaPath: string }\n): Promise<void> {\n const { certificateCommonName } = credentials.applicationTargetProvisioningProfile.data;\n\n const fastfilePath = path.join(ctx.buildDirectory, 'Fastfile');\n await createFastfileForResigningBuild({\n outputFile: fastfilePath,\n ipaPath,\n keychainPath: credentials.keychainPath,\n signingIdentity: certificateCommonName,\n targetProvisioningProfiles: credentials.targetProvisioningProfiles,\n });\n\n await runFastlane(['resign'], {\n cwd: ctx.buildDirectory,\n logger: ctx.logger,\n env: ctx.env,\n });\n}\n\nexport async function runFastlane(\n fastlaneArgs: string[],\n {\n logger,\n env,\n cwd,\n }: {\n logger?: bunyan;\n env?: Record<string, string>;\n cwd?: string;\n } = {}\n): Promise<SpawnResult> {\n const fastlaneEnvVars = {\n FASTLANE_DISABLE_COLORS: '1',\n FASTLANE_SKIP_UPDATE_CHECK: '1',\n SKIP_SLOW_FASTLANE_WARNING: 'true',\n FASTLANE_HIDE_TIMESTAMP: 'true',\n LC_ALL: 'en_US.UTF-8',\n ...(env ?? process.env),\n };\n return await spawn('fastlane', fastlaneArgs, {\n env: fastlaneEnvVars,\n logger,\n cwd,\n });\n}\n\nasync function ensureGymfileExists<TJob extends Ios.Job>(\n ctx: BuildContext<TJob>,\n {\n scheme,\n buildConfiguration,\n credentials,\n logsDirectory,\n entitlements,\n }: {\n scheme: string;\n buildConfiguration?: string;\n credentials: Credentials | null;\n logsDirectory: string;\n entitlements: object | null;\n }\n): Promise<void> {\n const gymfilePath = path.join(ctx.reactNativeProjectDirectory, 'ios/Gymfile');\n\n if (await fs.pathExists(gymfilePath)) {\n ctx.logger.info('Gymfile already exists');\n return;\n }\n\n ctx.logger.info('Creating Gymfile');\n if (ctx.job.simulator) {\n const isTV = await isTVOS(ctx);\n const simulatorDestination = `generic/platform=${isTV ? 'tvOS' : 'iOS'} Simulator`;\n\n await createGymfileForSimulatorBuild({\n outputFile: gymfilePath,\n scheme,\n buildConfiguration: buildConfiguration ?? 'release',\n derivedDataPath: './build',\n clean: false,\n logsDirectory,\n simulatorDestination,\n });\n } else {\n await createGymfileForArchiveBuild({\n outputFile: gymfilePath,\n credentials: nullthrows(credentials, 'credentials must exist for non-simulator builds'),\n scheme,\n buildConfiguration,\n outputDirectory: './build',\n clean: false,\n logsDirectory,\n entitlements: entitlements ?? undefined,\n });\n }\n\n ctx.logger.info('Gymfile created');\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"gymfile.js","sourceRoot":"","sources":["../../src/ios/gymfile.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,wEAA+C;AAC/C,wDAA0B;AAI1B,MAAM,0BAA0B,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,0CAA0C,CAAC,CAAC;AACpG,MAAM,4BAA4B,GAAG,cAAI,CAAC,IAAI,CAC5C,SAAS,EACT,4CAA4C,CAC7C,CAAC;AAuBK,KAAK,UAAU,4BAA4B,CAAC,EACjD,UAAU,EACV,KAAK,EACL,WAAW,EACX,MAAM,EACN,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,aAAa,GACO;IACpB,MAAM,QAAQ,GAAG,EAAE,CAAC;IACpB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC;IACpE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;QAC5B,MAAM,OAAO,GAAG,WAAW,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC;QAC/D,QAAQ,CAAC,IAAI,CAAC;YACZ,SAAS,EAAE,OAAO,CAAC,gBAAgB;YACnC,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC,CAAC;KACJ;IAED,MAAM,4BAA4B,GAAI,YAGpC,aAHoC,YAAY,uBAAZ,YAAY,CAG7C,kDAAkD,CAAuB,CAAC;IAE/E,MAAM,kBAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC/B,MAAM,aAAa,CAAC;QAClB,QAAQ,EAAE,0BAA0B;QACpC,UAAU;QACV,IAAI,EAAE;YACJ,aAAa,EAAE,WAAW,CAAC,YAAY;YACvC,MAAM,EAAE,MAAM;YACd,0BAA0B,EAAE,kBAAkB;YAC9C,gBAAgB,EAAE,eAAe;YACjC,aAAa,EAAE,WAAW,CAAC,gBAAgB;YAC3C,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;YACpB,cAAc,EAAE,aAAa;YAC7B,QAAQ;YACR,4BAA4B;SAC7B;KACF,CAAC,CAAC;AACL,CAAC;AAzCD,oEAyCC;AAEM,KAAK,UAAU,8BAA8B,CAAC,EACnD,UAAU,EACV,KAAK,EACL,MAAM,EACN,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,oBAAoB,GACE;IACtB,MAAM,kBAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC/B,MAAM,aAAa,CAAC;QAClB,QAAQ,EAAE,4BAA4B;QACtC,UAAU;QACV,IAAI,EAAE;YACJ,MAAM,EAAE,MAAM;YACd,0BAA0B,EAAE,kBAAkB;YAC9C,4BAA4B,EAAE,oBAAoB;YAClD,iBAAiB,EAAE,eAAe;YAClC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;YACpB,cAAc,EAAE,aAAa;SAC9B;KACF,CAAC,CAAC;AACL,CAAC;AAtBD,wEAsBC;AAED,KAAK,UAAU,aAAa,CAAC,EAC3B,QAAQ,EACR,UAAU,EACV,IAAI,GAKL;IACC,MAAM,IAAA,uBAAY,EAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AACtE,CAAC","sourcesContent":["import path from 'path';\n\nimport templateFile from '@expo/template-file';\nimport fs from 'fs-extra';\n\nimport { Credentials } from './credentials/manager';\n\nconst ARCHIVE_TEMPLATE_FILE_PATH = path.join(__dirname, '../../templates/Gymfile.archive.template');\nconst SIMULATOR_TEMPLATE_FILE_PATH = path.join(\n __dirname,\n '../../templates/Gymfile.simulator.template'\n);\n\ninterface ArchiveBuildOptions {\n outputFile: string;\n credentials: Credentials;\n scheme: string;\n buildConfiguration?: string;\n outputDirectory: string;\n clean: boolean;\n logsDirectory: string;\n entitlements?: object;\n}\n\ninterface SimulatorBuildOptions {\n outputFile: string;\n scheme: string;\n buildConfiguration?: string;\n derivedDataPath: string;\n clean: boolean;\n logsDirectory: string;\n simulatorDestination: string;\n}\n\nexport async function createGymfileForArchiveBuild({\n outputFile,\n clean,\n credentials,\n scheme,\n buildConfiguration,\n entitlements,\n outputDirectory,\n logsDirectory,\n}: ArchiveBuildOptions): Promise<void> {\n const PROFILES = [];\n const targets = Object.keys(credentials.targetProvisioningProfiles);\n for (const target of targets) {\n const profile = credentials.targetProvisioningProfiles[target];\n PROFILES.push({\n BUNDLE_ID: profile.bundleIdentifier,\n UUID: profile.uuid,\n });\n }\n\n const ICLOUD_CONTAINER_ENVIRONMENT = (entitlements as Record<\n string,\n string | Record<string, string>\n >)?.['com.apple.developer.icloud-container-environment'] as string | undefined;\n\n await fs.mkdirp(logsDirectory);\n await createGymfile({\n template: ARCHIVE_TEMPLATE_FILE_PATH,\n outputFile,\n vars: {\n KEYCHAIN_PATH: credentials.keychainPath,\n SCHEME: scheme,\n SCHEME_BUILD_CONFIGURATION: buildConfiguration,\n OUTPUT_DIRECTORY: outputDirectory,\n EXPORT_METHOD: credentials.distributionType,\n CLEAN: String(clean),\n LOGS_DIRECTORY: logsDirectory,\n PROFILES,\n ICLOUD_CONTAINER_ENVIRONMENT,\n },\n });\n}\n\nexport async function createGymfileForSimulatorBuild({\n outputFile,\n clean,\n scheme,\n buildConfiguration,\n derivedDataPath,\n logsDirectory,\n simulatorDestination,\n}: SimulatorBuildOptions): Promise<void> {\n await fs.mkdirp(logsDirectory);\n await createGymfile({\n template: SIMULATOR_TEMPLATE_FILE_PATH,\n outputFile,\n vars: {\n SCHEME: scheme,\n SCHEME_BUILD_CONFIGURATION: buildConfiguration,\n SCHEME_SIMULATOR_DESTINATION: simulatorDestination,\n DERIVED_DATA_PATH: derivedDataPath,\n CLEAN: String(clean),\n LOGS_DIRECTORY: logsDirectory,\n },\n });\n}\n\nasync function createGymfile({\n template,\n outputFile,\n vars,\n}: {\n template: string;\n outputFile: string;\n vars: Record<string, string | number | any>;\n}): Promise<void> {\n await templateFile(template, vars, outputFile, { mustache: false });\n}\n"]}
1
+ {"version":3,"file":"gymfile.js","sourceRoot":"","sources":["../../src/ios/gymfile.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,wEAA+C;AAC/C,wDAA0B;AAI1B,MAAM,0BAA0B,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,0CAA0C,CAAC,CAAC;AACpG,MAAM,4BAA4B,GAAG,cAAI,CAAC,IAAI,CAC5C,SAAS,EACT,4CAA4C,CAC7C,CAAC;AAuBK,KAAK,UAAU,4BAA4B,CAAC,EACjD,UAAU,EACV,KAAK,EACL,WAAW,EACX,MAAM,EACN,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,aAAa,GACO;IACpB,MAAM,QAAQ,GAA0C,EAAE,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC;IACpE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;QAC5B,MAAM,OAAO,GAAG,WAAW,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC;QAC/D,QAAQ,CAAC,IAAI,CAAC;YACZ,SAAS,EAAE,OAAO,CAAC,gBAAgB;YACnC,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC,CAAC;KACJ;IAED,MAAM,4BAA4B,GAAI,YAGpC,aAHoC,YAAY,uBAAZ,YAAY,CAG7C,kDAAkD,CAAuB,CAAC;IAE/E,MAAM,kBAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC/B,MAAM,aAAa,CAAC;QAClB,QAAQ,EAAE,0BAA0B;QACpC,UAAU;QACV,IAAI,EAAE;YACJ,aAAa,EAAE,WAAW,CAAC,YAAY;YACvC,MAAM,EAAE,MAAM;YACd,0BAA0B,EAAE,kBAAkB;YAC9C,gBAAgB,EAAE,eAAe;YACjC,aAAa,EAAE,WAAW,CAAC,gBAAgB;YAC3C,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;YACpB,cAAc,EAAE,aAAa;YAC7B,QAAQ;YACR,4BAA4B;SAC7B;KACF,CAAC,CAAC;AACL,CAAC;AAzCD,oEAyCC;AAEM,KAAK,UAAU,8BAA8B,CAAC,EACnD,UAAU,EACV,KAAK,EACL,MAAM,EACN,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,oBAAoB,GACE;IACtB,MAAM,kBAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC/B,MAAM,aAAa,CAAC;QAClB,QAAQ,EAAE,4BAA4B;QACtC,UAAU;QACV,IAAI,EAAE;YACJ,MAAM,EAAE,MAAM;YACd,0BAA0B,EAAE,kBAAkB;YAC9C,4BAA4B,EAAE,oBAAoB;YAClD,iBAAiB,EAAE,eAAe;YAClC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;YACpB,cAAc,EAAE,aAAa;SAC9B;KACF,CAAC,CAAC;AACL,CAAC;AAtBD,wEAsBC;AAED,KAAK,UAAU,aAAa,CAAC,EAC3B,QAAQ,EACR,UAAU,EACV,IAAI,GAKL;IACC,MAAM,IAAA,uBAAY,EAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AACtE,CAAC","sourcesContent":["import path from 'path';\n\nimport templateFile from '@expo/template-file';\nimport fs from 'fs-extra';\n\nimport { Credentials } from './credentials/manager';\n\nconst ARCHIVE_TEMPLATE_FILE_PATH = path.join(__dirname, '../../templates/Gymfile.archive.template');\nconst SIMULATOR_TEMPLATE_FILE_PATH = path.join(\n __dirname,\n '../../templates/Gymfile.simulator.template'\n);\n\ninterface ArchiveBuildOptions {\n outputFile: string;\n credentials: Credentials;\n scheme: string;\n buildConfiguration?: string;\n outputDirectory: string;\n clean: boolean;\n logsDirectory: string;\n entitlements?: object;\n}\n\ninterface SimulatorBuildOptions {\n outputFile: string;\n scheme: string;\n buildConfiguration?: string;\n derivedDataPath: string;\n clean: boolean;\n logsDirectory: string;\n simulatorDestination: string;\n}\n\nexport async function createGymfileForArchiveBuild({\n outputFile,\n clean,\n credentials,\n scheme,\n buildConfiguration,\n entitlements,\n outputDirectory,\n logsDirectory,\n}: ArchiveBuildOptions): Promise<void> {\n const PROFILES: { BUNDLE_ID: string; UUID: string }[] = [];\n const targets = Object.keys(credentials.targetProvisioningProfiles);\n for (const target of targets) {\n const profile = credentials.targetProvisioningProfiles[target];\n PROFILES.push({\n BUNDLE_ID: profile.bundleIdentifier,\n UUID: profile.uuid,\n });\n }\n\n const ICLOUD_CONTAINER_ENVIRONMENT = (entitlements as Record<\n string,\n string | Record<string, string>\n >)?.['com.apple.developer.icloud-container-environment'] as string | undefined;\n\n await fs.mkdirp(logsDirectory);\n await createGymfile({\n template: ARCHIVE_TEMPLATE_FILE_PATH,\n outputFile,\n vars: {\n KEYCHAIN_PATH: credentials.keychainPath,\n SCHEME: scheme,\n SCHEME_BUILD_CONFIGURATION: buildConfiguration,\n OUTPUT_DIRECTORY: outputDirectory,\n EXPORT_METHOD: credentials.distributionType,\n CLEAN: String(clean),\n LOGS_DIRECTORY: logsDirectory,\n PROFILES,\n ICLOUD_CONTAINER_ENVIRONMENT,\n },\n });\n}\n\nexport async function createGymfileForSimulatorBuild({\n outputFile,\n clean,\n scheme,\n buildConfiguration,\n derivedDataPath,\n logsDirectory,\n simulatorDestination,\n}: SimulatorBuildOptions): Promise<void> {\n await fs.mkdirp(logsDirectory);\n await createGymfile({\n template: SIMULATOR_TEMPLATE_FILE_PATH,\n outputFile,\n vars: {\n SCHEME: scheme,\n SCHEME_BUILD_CONFIGURATION: buildConfiguration,\n SCHEME_SIMULATOR_DESTINATION: simulatorDestination,\n DERIVED_DATA_PATH: derivedDataPath,\n CLEAN: String(clean),\n LOGS_DIRECTORY: logsDirectory,\n },\n });\n}\n\nasync function createGymfile({\n template,\n outputFile,\n vars,\n}: {\n template: string;\n outputFile: string;\n vars: Record<string, string | number | any>;\n}): Promise<void> {\n await templateFile(template, vars, outputFile, { mustache: false });\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import { Ios } from '@expo/eas-build-job';
2
+ import { BuildContext } from '../context';
3
+ export declare function downloadApplicationArchiveAsync(ctx: BuildContext<Ios.Job>): Promise<string>;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.downloadApplicationArchiveAsync = void 0;
7
+ const assert_1 = __importDefault(require("assert"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const downloader_1 = __importDefault(require("@expo/downloader"));
10
+ const eas_build_job_1 = require("@expo/eas-build-job");
11
+ async function downloadApplicationArchiveAsync(ctx) {
12
+ var _a;
13
+ (0, assert_1.default)(ctx.job.resign);
14
+ const applicationArchivePath = path_1.default.join(ctx.workingdir, 'application.ipa');
15
+ const { applicationArchiveSource } = ctx.job.resign;
16
+ if (applicationArchiveSource.type === eas_build_job_1.ArchiveSourceType.URL) {
17
+ try {
18
+ await (0, downloader_1.default)(applicationArchiveSource.url, applicationArchivePath, { retry: 3 });
19
+ }
20
+ catch (err) {
21
+ (_a = ctx.reportError) === null || _a === void 0 ? void 0 : _a.call(ctx, 'Failed to download the application archive', err, {
22
+ extras: { buildId: ctx.env.EAS_BUILD_ID },
23
+ });
24
+ throw err;
25
+ }
26
+ }
27
+ else {
28
+ throw new Error('Only application archive URLs are supported');
29
+ }
30
+ return applicationArchivePath;
31
+ }
32
+ exports.downloadApplicationArchiveAsync = downloadApplicationArchiveAsync;
33
+ //# sourceMappingURL=resign.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resign.js","sourceRoot":"","sources":["../../src/ios/resign.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAC5B,gDAAwB;AAExB,kEAA4C;AAC5C,uDAA6D;AAItD,KAAK,UAAU,+BAA+B,CAAC,GAA0B;;IAC9E,IAAA,gBAAM,EAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEvB,MAAM,sBAAsB,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IAE5E,MAAM,EAAE,wBAAwB,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;IACpD,IAAI,wBAAwB,CAAC,IAAI,KAAK,iCAAiB,CAAC,GAAG,EAAE;QAC3D,IAAI;YACF,MAAM,IAAA,oBAAY,EAAC,wBAAwB,CAAC,GAAG,EAAE,sBAAsB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;SACxF;QAAC,OAAO,GAAQ,EAAE;YACjB,MAAA,GAAG,CAAC,WAAW,oDAAG,4CAA4C,EAAE,GAAG,EAAE;gBACnE,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE;aAC1C,CAAC,CAAC;YACH,MAAM,GAAG,CAAC;SACX;KACF;SAAM;QACL,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;KAChE;IAED,OAAO,sBAAsB,CAAC;AAChC,CAAC;AApBD,0EAoBC","sourcesContent":["import assert from 'assert';\nimport path from 'path';\n\nimport downloadFile from '@expo/downloader';\nimport { ArchiveSourceType, Ios } from '@expo/eas-build-job';\n\nimport { BuildContext } from '../context';\n\nexport async function downloadApplicationArchiveAsync(ctx: BuildContext<Ios.Job>): Promise<string> {\n assert(ctx.job.resign);\n\n const applicationArchivePath = path.join(ctx.workingdir, 'application.ipa');\n\n const { applicationArchiveSource } = ctx.job.resign;\n if (applicationArchiveSource.type === ArchiveSourceType.URL) {\n try {\n await downloadFile(applicationArchiveSource.url, applicationArchivePath, { retry: 3 });\n } catch (err: any) {\n ctx.reportError?.('Failed to download the application archive', err, {\n extras: { buildId: ctx.env.EAS_BUILD_ID },\n });\n throw err;\n }\n } else {\n throw new Error('Only application archive URLs are supported');\n }\n\n return applicationArchivePath;\n}\n"]}
@@ -1,8 +1,6 @@
1
1
  import { Job } from '@expo/eas-build-job';
2
2
  import { SpawnOptions, SpawnPromise, SpawnResult } from '@expo/turtle-spawn';
3
3
  import { BuildContext } from '../context';
4
- export declare function setup<TJob extends Job>(ctx: BuildContext<TJob>): Promise<void>;
5
- export declare function installDependencies<TJob extends Job>(ctx: BuildContext<TJob>): Promise<void>;
6
4
  /**
7
5
  * check if .yarnrc.yml exists in the project dir or in the workspace root dir
8
6
  */
@@ -3,117 +3,12 @@ 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.shouldUseGlobalExpoCli = exports.runExpoCliCommand = exports.isUsingYarn2 = exports.installDependencies = exports.setup = void 0;
6
+ exports.readPackageJson = exports.shouldUseGlobalExpoCli = exports.runExpoCliCommand = exports.isUsingYarn2 = void 0;
7
7
  const path_1 = __importDefault(require("path"));
8
- const downloader_1 = __importDefault(require("@expo/downloader"));
9
- const eas_build_job_1 = require("@expo/eas-build-job");
10
8
  const turtle_spawn_1 = __importDefault(require("@expo/turtle-spawn"));
11
9
  const fs_extra_1 = __importDefault(require("fs-extra"));
12
10
  const semver_1 = __importDefault(require("semver"));
13
- const xcodeEnv_1 = require("../ios/xcodeEnv");
14
- const hooks_1 = require("./hooks");
15
- const npmrc_1 = require("./npmrc");
16
- const packageManager_1 = require("./packageManager");
17
- const MAX_EXPO_DOCTOR_TIMEOUT_MS = 20 * 1000;
18
- async function setup(ctx) {
19
- var _a;
20
- const packageJson = await ctx.runBuildPhase(eas_build_job_1.BuildPhase.PREPARE_PROJECT, async () => {
21
- await downloadAndUnpackProject(ctx);
22
- if (ctx.env.NPM_TOKEN) {
23
- await (0, npmrc_1.createNpmrcIfNotExistsAsync)(ctx);
24
- }
25
- else {
26
- await (0, npmrc_1.logIfNpmrcExistsAsync)(ctx);
27
- }
28
- if (ctx.job.platform === eas_build_job_1.Platform.IOS && ctx.env.EAS_BUILD_RUNNER === 'eas-build') {
29
- await (0, xcodeEnv_1.deleteXcodeEnvLocalIfExistsAsync)(ctx);
30
- }
31
- // try to read package.json to see if it exists and is valid
32
- return readPackageJson(ctx.reactNativeProjectDirectory);
33
- });
34
- await ctx.runBuildPhase(eas_build_job_1.BuildPhase.PRE_INSTALL_HOOK, async () => {
35
- await (0, hooks_1.runHookIfPresent)(ctx, hooks_1.Hook.PRE_INSTALL);
36
- });
37
- await ctx.runBuildPhase(eas_build_job_1.BuildPhase.READ_PACKAGE_JSON, async () => {
38
- ctx.logger.info('Using package.json:');
39
- ctx.logger.info(JSON.stringify(packageJson, null, 2));
40
- });
41
- await ctx.runBuildPhase(eas_build_job_1.BuildPhase.INSTALL_DEPENDENCIES, async () => {
42
- await installDependencies(ctx);
43
- });
44
- await ctx.runBuildPhase(eas_build_job_1.BuildPhase.READ_APP_CONFIG, async () => {
45
- ctx.logger.info('Using app configuration:');
46
- ctx.logger.info(JSON.stringify(ctx.appConfig, null, 2));
47
- });
48
- const hasExpoPackage = !!((_a = packageJson.dependencies) === null || _a === void 0 ? void 0 : _a.expo);
49
- if (hasExpoPackage) {
50
- await ctx.runBuildPhase(eas_build_job_1.BuildPhase.RUN_EXPO_DOCTOR, async () => {
51
- try {
52
- const { stdout } = await runExpoDoctor(ctx);
53
- if (!stdout.match(/Didn't find any issues with the project/)) {
54
- ctx.markBuildPhaseHasWarnings();
55
- }
56
- }
57
- catch (err) {
58
- ctx.logger.error({ err }, 'Command "expo doctor" failed.');
59
- ctx.markBuildPhaseHasWarnings();
60
- }
61
- });
62
- }
63
- }
64
- exports.setup = setup;
65
- async function downloadAndUnpackProject(ctx) {
66
- var _a;
67
- const projectTarball = path_1.default.join(ctx.workingdir, 'project.tar.gz');
68
- if ([eas_build_job_1.ArchiveSourceType.S3, eas_build_job_1.ArchiveSourceType.GCS].includes(ctx.job.projectArchive.type)) {
69
- throw new Error('GCS and S3 project sources should be resolved earlier to url');
70
- }
71
- else if (ctx.job.projectArchive.type === eas_build_job_1.ArchiveSourceType.PATH) {
72
- await fs_extra_1.default.copy(ctx.job.projectArchive.path, projectTarball); // used in eas-build-cli
73
- }
74
- else if (ctx.job.projectArchive.type === eas_build_job_1.ArchiveSourceType.URL) {
75
- try {
76
- await (0, downloader_1.default)(ctx.job.projectArchive.url, projectTarball, { retry: 3 });
77
- }
78
- catch (err) {
79
- (_a = ctx.reportError) === null || _a === void 0 ? void 0 : _a.call(ctx, 'Failed to download project archive', err, {
80
- extras: { buildId: ctx.env.EAS_BUILD_ID },
81
- });
82
- throw err;
83
- }
84
- }
85
- await (0, turtle_spawn_1.default)('tar', ['--strip-components', '1', '-zxf', 'project.tar.gz', '-C', ctx.buildDirectory], {
86
- cwd: ctx.workingdir,
87
- logger: ctx.logger,
88
- });
89
- }
90
- async function installDependencies(ctx) {
91
- const packagerRunDir = (0, packageManager_1.findPackagerRootDir)(ctx.reactNativeProjectDirectory);
92
- if (packagerRunDir !== ctx.reactNativeProjectDirectory) {
93
- const relativeReactNativeProjectDirectory = path_1.default.relative(ctx.buildDirectory, ctx.reactNativeProjectDirectory);
94
- ctx.logger.info(`We detected that '${relativeReactNativeProjectDirectory}' is a ${ctx.packageManager} workspace`);
95
- }
96
- const relativePackagerRunDir = path_1.default.relative(ctx.buildDirectory, packagerRunDir);
97
- let args = ['install'];
98
- if (ctx.packageManager === packageManager_1.PackageManager.PNPM) {
99
- args = ['install', '--no-frozen-lockfile'];
100
- }
101
- else if (ctx.packageManager === packageManager_1.PackageManager.YARN) {
102
- const isYarn2 = await isUsingYarn2(ctx.reactNativeProjectDirectory);
103
- if (isYarn2) {
104
- args = ['install', '--no-immutable'];
105
- }
106
- }
107
- ctx.logger.info(`Running "${ctx.packageManager} ${args.join(' ')}" in ${relativePackagerRunDir
108
- ? `directory '${relativePackagerRunDir}'`
109
- : 'the root dir of your repository'} `);
110
- await (0, turtle_spawn_1.default)(ctx.packageManager, args, {
111
- cwd: packagerRunDir,
112
- logger: ctx.logger,
113
- env: ctx.env,
114
- });
115
- }
116
- exports.installDependencies = installDependencies;
11
+ const packageManager_1 = require("../utils/packageManager");
117
12
  /**
118
13
  * check if .yarnrc.yml exists in the project dir or in the workspace root dir
119
14
  */
@@ -151,32 +46,6 @@ function shouldUseGlobalExpoCli(ctx, forceUseGlobalExpoCli = false) {
151
46
  semver_1.default.satisfies(ctx.appConfig.sdkVersion, '<46'));
152
47
  }
153
48
  exports.shouldUseGlobalExpoCli = shouldUseGlobalExpoCli;
154
- async function runExpoDoctor(ctx) {
155
- ctx.logger.info('Running "expo doctor"');
156
- let timeout;
157
- try {
158
- const promise = runExpoCliCommand(ctx, ['doctor'], {
159
- cwd: ctx.reactNativeProjectDirectory,
160
- logger: ctx.logger,
161
- env: ctx.env,
162
- },
163
- // local Expo CLI does not have "doctor" for now
164
- { forceUseGlobalExpoCli: true });
165
- timeout = setTimeout(() => {
166
- var _a;
167
- promise.child.kill();
168
- (_a = ctx.reportError) === null || _a === void 0 ? void 0 : _a.call(ctx, `"expo doctor" timed out`, undefined, {
169
- extras: { buildId: ctx.env.EAS_BUILD_ID },
170
- });
171
- }, MAX_EXPO_DOCTOR_TIMEOUT_MS);
172
- return await promise;
173
- }
174
- finally {
175
- if (timeout) {
176
- clearTimeout(timeout);
177
- }
178
- }
179
- }
180
49
  function readPackageJson(projectDir) {
181
50
  const packageJsonPath = path_1.default.join(projectDir, 'package.json');
182
51
  if (!fs_extra_1.default.pathExistsSync(packageJsonPath)) {
@@ -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, Ios, Job, Platform } from '@expo/eas-build-job';\nimport spawn, { SpawnOptions, SpawnPromise, SpawnResult } from '@expo/turtle-spawn';\nimport fs from 'fs-extra';\nimport semver from 'semver';\n\nimport { BuildContext } from '../context';\nimport { deleteXcodeEnvLocalIfExistsAsync } from '../ios/xcodeEnv';\n\nimport { Hook, runHookIfPresent } from './hooks';\nimport { createNpmrcIfNotExistsAsync, logIfNpmrcExistsAsync } from './npmrc';\nimport { findPackagerRootDir, PackageManager } 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 const packageJson = await ctx.runBuildPhase(BuildPhase.PREPARE_PROJECT, async () => {\n await downloadAndUnpackProject(ctx);\n if (ctx.env.NPM_TOKEN) {\n await createNpmrcIfNotExistsAsync(ctx);\n } else {\n await logIfNpmrcExistsAsync(ctx);\n }\n if (ctx.job.platform === Platform.IOS && ctx.env.EAS_BUILD_RUNNER === 'eas-build') {\n await deleteXcodeEnvLocalIfExistsAsync(ctx as BuildContext<Ios.Job>);\n }\n // try to read package.json to see if it exists and is valid\n return readPackageJson(ctx.reactNativeProjectDirectory);\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.READ_PACKAGE_JSON, async () => {\n ctx.logger.info('Using package.json:');\n ctx.logger.info(JSON.stringify(packageJson, null, 2));\n });\n\n await ctx.runBuildPhase(BuildPhase.INSTALL_DEPENDENCIES, async () => {\n await installDependencies(ctx);\n });\n\n await ctx.runBuildPhase(BuildPhase.READ_APP_CONFIG, async () => {\n ctx.logger.info('Using app configuration:');\n ctx.logger.info(JSON.stringify(ctx.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 ([ArchiveSourceType.S3, ArchiveSourceType.GCS].includes(ctx.job.projectArchive.type)) {\n throw new Error('GCS and S3 project sources 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 extras: { buildId: ctx.env.EAS_BUILD_ID },\n });\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\nexport function runExpoCliCommand<TJob extends Job>(\n ctx: BuildContext<TJob>,\n args: string[],\n options: SpawnOptions,\n { forceUseGlobalExpoCli = false } = {}\n): SpawnPromise<SpawnResult> {\n if (shouldUseGlobalExpoCli(ctx, forceUseGlobalExpoCli)) {\n return ctx.runGlobalExpoCliCommand(args.join(' '), options);\n } else {\n const argsWithExpo = ['expo', ...args];\n if (ctx.packageManager === PackageManager.NPM) {\n return spawn('npx', argsWithExpo, options);\n } else if (ctx.packageManager === PackageManager.YARN) {\n return spawn('yarn', argsWithExpo, options);\n } else if (ctx.packageManager === PackageManager.PNPM) {\n return spawn('pnpm', argsWithExpo, options);\n } else {\n throw new Error(`Unsupported package manager: ${ctx.packageManager}`);\n }\n }\n}\n\nexport function shouldUseGlobalExpoCli<TJob extends Job>(\n ctx: BuildContext<TJob>,\n forceUseGlobalExpoCli = false\n): boolean {\n return (\n forceUseGlobalExpoCli ||\n ctx.env.EXPO_USE_LOCAL_CLI === '0' ||\n !ctx.appConfig.sdkVersion ||\n semver.satisfies(ctx.appConfig.sdkVersion, '<46')\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 = runExpoCliCommand(\n ctx,\n ['doctor'],\n {\n cwd: ctx.reactNativeProjectDirectory,\n logger: ctx.logger,\n env: ctx.env,\n },\n // local Expo CLI does not have \"doctor\" for now\n { forceUseGlobalExpoCli: true }\n );\n timeout = setTimeout(() => {\n promise.child.kill();\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 } finally {\n if (timeout) {\n clearTimeout(timeout);\n }\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;AAGxB,sEAAoF;AACpF,wDAA0B;AAC1B,oDAA4B;AAG5B,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,CAC/B,GAAuB,EACvB,IAAc,EACd,OAAqB,EACrB,EAAE,qBAAqB,GAAG,KAAK,EAAE,GAAG,EAAE;IAEtC,IAAI,sBAAsB,CAAC,GAAG,EAAE,qBAAqB,CAAC,EAAE;QACtD,OAAO,GAAG,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;KAC7D;SAAM;QACL,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;QACvC,IAAI,GAAG,CAAC,cAAc,KAAK,+BAAc,CAAC,GAAG,EAAE;YAC7C,OAAO,IAAA,sBAAK,EAAC,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;SAC5C;aAAM,IAAI,GAAG,CAAC,cAAc,KAAK,+BAAc,CAAC,IAAI,EAAE;YACrD,OAAO,IAAA,sBAAK,EAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;SAC7C;aAAM,IAAI,GAAG,CAAC,cAAc,KAAK,+BAAc,CAAC,IAAI,EAAE;YACrD,OAAO,IAAA,sBAAK,EAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;SAC7C;aAAM;YACL,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;SACvE;KACF;AACH,CAAC;AApBD,8CAoBC;AAED,SAAgB,sBAAsB,CACpC,GAAuB,EACvB,qBAAqB,GAAG,KAAK;IAE7B,OAAO,CACL,qBAAqB;QACrB,GAAG,CAAC,GAAG,CAAC,kBAAkB,KAAK,GAAG;QAClC,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU;QACzB,gBAAM,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAClD,CAAC;AACJ,CAAC;AAVD,wDAUC;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;QACvC,MAAM,IAAI,KAAK,CAAC,kCAAkC,UAAU,EAAE,CAAC,CAAC;KACjE;IACD,IAAI;QACF,OAAO,kBAAE,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;KACzC;IAAC,OAAO,GAAQ,EAAE;QACjB,MAAM,IAAI,KAAK,CAAC,yCAAyC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;KACzE;AACH,CAAC;AAVD,0CAUC","sourcesContent":["import path from 'path';\n\nimport { Job } from '@expo/eas-build-job';\nimport spawn, { SpawnOptions, SpawnPromise, SpawnResult } from '@expo/turtle-spawn';\nimport fs from 'fs-extra';\nimport semver from 'semver';\n\nimport { BuildContext } from '../context';\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<TJob extends Job>(\n ctx: BuildContext<TJob>,\n args: string[],\n options: SpawnOptions,\n { forceUseGlobalExpoCli = false } = {}\n): SpawnPromise<SpawnResult> {\n if (shouldUseGlobalExpoCli(ctx, forceUseGlobalExpoCli)) {\n return ctx.runGlobalExpoCliCommand(args.join(' '), options);\n } else {\n const argsWithExpo = ['expo', ...args];\n if (ctx.packageManager === PackageManager.NPM) {\n return spawn('npx', argsWithExpo, options);\n } else if (ctx.packageManager === PackageManager.YARN) {\n return spawn('yarn', argsWithExpo, options);\n } else if (ctx.packageManager === PackageManager.PNPM) {\n return spawn('pnpm', argsWithExpo, options);\n } else {\n throw new Error(`Unsupported package manager: ${ctx.packageManager}`);\n }\n }\n}\n\nexport function shouldUseGlobalExpoCli<TJob extends Job>(\n ctx: BuildContext<TJob>,\n forceUseGlobalExpoCli = false\n): boolean {\n return (\n forceUseGlobalExpoCli ||\n ctx.env.EXPO_USE_LOCAL_CLI === '0' ||\n !ctx.appConfig.sdkVersion ||\n semver.satisfies(ctx.appConfig.sdkVersion, '<46')\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": "0.1.164",
3
+ "version": "0.1.166",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "files": [
@@ -22,15 +22,17 @@
22
22
  "@expo/config": "7.0.1",
23
23
  "@expo/config-plugins": "5.0.1",
24
24
  "@expo/downloader": "0.0.21",
25
- "@expo/eas-build-job": "0.2.98",
26
- "@expo/logger": "0.0.24",
25
+ "@expo/eas-build-job": "0.2.100",
26
+ "@expo/logger": "0.0.25",
27
27
  "@expo/package-manager": "0.0.54",
28
28
  "@expo/plist": "^0.0.11",
29
29
  "@expo/template-file": "0.1.23",
30
- "@expo/turtle-spawn": "0.0.25",
30
+ "@expo/turtle-spawn": "0.0.26",
31
31
  "@expo/xcpretty": "4.1.3",
32
32
  "fast-glob": "^3.2.5",
33
33
  "fs-extra": "^10.0.1",
34
+ "joi": "^17.4.2",
35
+ "lodash": "^4.17.21",
34
36
  "node-forge": "^1.2.1",
35
37
  "nullthrows": "^1.1.1",
36
38
  "plist": "^3.0.1",
@@ -39,6 +41,7 @@
39
41
  "devDependencies": {
40
42
  "@types/fs-extra": "^9.0.13",
41
43
  "@types/jest": "^26.0.20",
44
+ "@types/lodash": "^4.14.191",
42
45
  "@types/node": "^16.11.26",
43
46
  "@types/node-forge": "^1.0.1",
44
47
  "@types/plist": "^3.0.2",
@@ -0,0 +1,8 @@
1
+ resign(
2
+ ipa: "<%- IPA_PATH %>",
3
+ signing_identity: "<%- SIGNING_IDENTITY %>",
4
+ provisioning_profile: {<% _.forEach(PROFILES, function(profile) { %>
5
+ "<%- profile.BUNDLE_ID %>" => "<%- profile.PATH %>",<% }); %>
6
+ },
7
+ keychain_path: "<%- KEYCHAIN_PATH %>"
8
+ )
@@ -1 +0,0 @@
1
- {"version":3,"file":"prebuild.js","sourceRoot":"","sources":["../../src/utils/prebuild.ts"],"names":[],"mappings":";;;;;;AAEA,oDAA4B;AAI5B,uCAA2F;AAMpF,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,mBAAmB,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IACxD,MAAM,IAAA,2BAAiB,EAAC,GAAG,EAAE,mBAAmB,EAAE,YAAY,CAAC,CAAC;IAChE,MAAM,IAAA,6BAAmB,EAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AArBD,sCAqBC;AAED,SAAS,sBAAsB,CAAmB,GAAuB;;IACvE,IAAI,eAAe,GACjB,MAAA,MAAA,GAAG,CAAC,GAAG,CAAC,YAAY,0CAAE,eAAe,mCACrC,sDAAsD,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IAC3E,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE;QAChD,eAAe,GAAG,GAAG,eAAe,eAAe,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;KACvE;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,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;KAC7E;IACD,IAAI,eAAe,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE;QACjD,eAAe,GAAG,eAAe,CAAC,SAAS,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;KAC9E;IACD,IAAI,eAAe,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE;QACpD,eAAe,GAAG,eAAe,CAAC,SAAS,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;KACjF;IACD,IAAI,CAAC,IAAA,gCAAsB,EAAC,GAAG,CAAC,EAAE;QAChC,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;KACrE;IACD,OAAO,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACpC,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, runExpoCliCommand, shouldUseGlobalExpoCli } 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 const prebuildCommandArgs = getPrebuildCommandArgs(ctx);\n await runExpoCliCommand(ctx, prebuildCommandArgs, spawnOptions);\n await installDependencies(ctx);\n}\n\nfunction getPrebuildCommandArgs<TJob extends Job>(ctx: BuildContext<TJob>): string[] {\n let prebuildCommand =\n ctx.job.experimental?.prebuildCommand ??\n `prebuild --non-interactive --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 if (!shouldUseGlobalExpoCli(ctx)) {\n prebuildCommand = prebuildCommand.replace(' --non-interactive', '');\n }\n return prebuildCommand.split(' ');\n}\n"]}