@expo/build-tools 0.1.130 → 0.1.133

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 (43) hide show
  1. package/README.md +1 -1
  2. package/dist/android/credentials.js +3 -4
  3. package/dist/android/credentials.js.map +1 -1
  4. package/dist/android/expoUpdates.d.ts +1 -0
  5. package/dist/android/expoUpdates.js +12 -1
  6. package/dist/android/expoUpdates.js.map +1 -1
  7. package/dist/android/gradle.d.ts +2 -2
  8. package/dist/android/gradle.js.map +1 -1
  9. package/dist/android/gradleConfig.js +4 -0
  10. package/dist/android/gradleConfig.js.map +1 -1
  11. package/dist/builders/android.js +12 -1
  12. package/dist/builders/android.js.map +1 -1
  13. package/dist/builders/ios.js +2 -1
  14. package/dist/builders/ios.js.map +1 -1
  15. package/dist/context.d.ts +17 -5
  16. package/dist/context.js +2 -2
  17. package/dist/context.js.map +1 -1
  18. package/dist/ios/configure.d.ts +3 -2
  19. package/dist/ios/configure.js +74 -2
  20. package/dist/ios/configure.js.map +1 -1
  21. package/dist/ios/expoUpdates.d.ts +1 -0
  22. package/dist/ios/expoUpdates.js +26 -14
  23. package/dist/ios/expoUpdates.js.map +1 -1
  24. package/dist/utils/detectUserError.js +0 -12
  25. package/dist/utils/detectUserError.js.map +1 -1
  26. package/dist/utils/expoUpdates.d.ts +8 -13
  27. package/dist/utils/expoUpdates.js +43 -30
  28. package/dist/utils/expoUpdates.js.map +1 -1
  29. package/dist/utils/handleNpmError.d.ts +3 -0
  30. package/dist/utils/handleNpmError.js +32 -0
  31. package/dist/utils/handleNpmError.js.map +1 -0
  32. package/dist/utils/hooks.js +1 -9
  33. package/dist/utils/hooks.js.map +1 -1
  34. package/dist/utils/packageManager.d.ts +0 -1
  35. package/dist/utils/packageManager.js +1 -15
  36. package/dist/utils/packageManager.js.map +1 -1
  37. package/dist/utils/prebuild.js +7 -6
  38. package/dist/utils/prebuild.js.map +1 -1
  39. package/dist/utils/project.d.ts +5 -0
  40. package/dist/utils/project.js +58 -21
  41. package/dist/utils/project.js.map +1 -1
  42. package/package.json +13 -7
  43. package/templates/eas-build.gradle +23 -5
package/README.md CHANGED
@@ -4,4 +4,4 @@
4
4
 
5
5
  ## Repository
6
6
 
7
- https://github.com/expo/eas-build/tree/main/src/packages/build-tools
7
+ https://github.com/expo/eas-build/tree/main/packages/build-tools
@@ -14,9 +14,8 @@ async function restoreCredentials(ctx) {
14
14
  throw new Error('secrets are missing in the job object');
15
15
  }
16
16
  ctx.logger.info("Writing secrets to the project's directory");
17
- const projectDir = ctx.reactNativeProjectDirectory;
18
- const keystorePath = `keystore-${(0, uuid_1.v4)()}`;
19
- await fs_extra_1.default.writeFile(path_1.default.join(projectDir, keystorePath), Buffer.from(buildCredentials.keystore.dataBase64, 'base64'));
17
+ const keystorePath = path_1.default.join(ctx.buildDirectory, `keystore-${(0, uuid_1.v4)()}`);
18
+ await fs_extra_1.default.writeFile(keystorePath, Buffer.from(buildCredentials.keystore.dataBase64, 'base64'));
20
19
  const credentialsJson = {
21
20
  android: {
22
21
  keystore: {
@@ -27,7 +26,7 @@ async function restoreCredentials(ctx) {
27
26
  },
28
27
  },
29
28
  };
30
- await fs_extra_1.default.writeFile(path_1.default.join(projectDir, 'credentials.json'), JSON.stringify(credentialsJson));
29
+ await fs_extra_1.default.writeFile(path_1.default.join(ctx.buildDirectory, 'credentials.json'), JSON.stringify(credentialsJson));
31
30
  }
32
31
  exports.restoreCredentials = restoreCredentials;
33
32
  //# sourceMappingURL=credentials.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/android/credentials.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAGxB,wDAA0B;AAC1B,+BAAoC;AAIpC,KAAK,UAAU,kBAAkB,CAAC,GAA8B;IAC9D,MAAM,EAAE,gBAAgB,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;IAC7C,IAAI,CAAC,gBAAgB,EAAE;QACrB,4CAA4C;QAC5C,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;KAC1D;IACD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,GAAG,CAAC,2BAA2B,CAAC;IACnD,MAAM,YAAY,GAAG,YAAY,IAAA,SAAM,GAAE,EAAE,CAAC;IAC5C,MAAM,kBAAE,CAAC,SAAS,CAChB,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,EACnC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAC5D,CAAC;IACF,MAAM,eAAe,GAAG;QACtB,OAAO,EAAE;YACP,QAAQ,EAAE;gBACR,YAAY;gBACZ,gBAAgB,EAAE,gBAAgB,CAAC,QAAQ,CAAC,gBAAgB;gBAC5D,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,CAAC,QAAQ;gBAC5C,WAAW,EAAE,gBAAgB,CAAC,QAAQ,CAAC,WAAW;aACnD;SACF;KACF,CAAC;IACF,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC;AACjG,CAAC;AAEQ,gDAAkB","sourcesContent":["import path from 'path';\n\nimport { Android } from '@expo/eas-build-job';\nimport fs from 'fs-extra';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { BuildContext } from '../context';\n\nasync function restoreCredentials(ctx: BuildContext<Android.Job>): Promise<void> {\n const { buildCredentials } = ctx.job.secrets;\n if (!buildCredentials) {\n // TODO: sentry (should be detected earlier)\n throw new Error('secrets are missing in the job object');\n }\n ctx.logger.info(\"Writing secrets to the project's directory\");\n const projectDir = ctx.reactNativeProjectDirectory;\n const keystorePath = `keystore-${uuidv4()}`;\n await fs.writeFile(\n path.join(projectDir, keystorePath),\n Buffer.from(buildCredentials.keystore.dataBase64, 'base64')\n );\n const credentialsJson = {\n android: {\n keystore: {\n keystorePath,\n keystorePassword: buildCredentials.keystore.keystorePassword,\n keyAlias: buildCredentials.keystore.keyAlias,\n keyPassword: buildCredentials.keystore.keyPassword,\n },\n },\n };\n await fs.writeFile(path.join(projectDir, 'credentials.json'), JSON.stringify(credentialsJson));\n}\n\nexport { restoreCredentials };\n"]}
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/android/credentials.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAGxB,wDAA0B;AAC1B,+BAAoC;AAIpC,KAAK,UAAU,kBAAkB,CAAC,GAA8B;IAC9D,MAAM,EAAE,gBAAgB,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;IAC7C,IAAI,CAAC,gBAAgB,EAAE;QACrB,4CAA4C;QAC5C,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;KAC1D;IACD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAC9D,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,YAAY,IAAA,SAAM,GAAE,EAAE,CAAC,CAAC;IAC3E,MAAM,kBAAE,CAAC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC9F,MAAM,eAAe,GAAG;QACtB,OAAO,EAAE;YACP,QAAQ,EAAE;gBACR,YAAY;gBACZ,gBAAgB,EAAE,gBAAgB,CAAC,QAAQ,CAAC,gBAAgB;gBAC5D,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,CAAC,QAAQ;gBAC5C,WAAW,EAAE,gBAAgB,CAAC,QAAQ,CAAC,WAAW;aACnD;SACF;KACF,CAAC;IACF,MAAM,kBAAE,CAAC,SAAS,CAChB,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,EACjD,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAChC,CAAC;AACJ,CAAC;AAEQ,gDAAkB","sourcesContent":["import path from 'path';\n\nimport { Android } from '@expo/eas-build-job';\nimport fs from 'fs-extra';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { BuildContext } from '../context';\n\nasync function restoreCredentials(ctx: BuildContext<Android.Job>): Promise<void> {\n const { buildCredentials } = ctx.job.secrets;\n if (!buildCredentials) {\n // TODO: sentry (should be detected earlier)\n throw new Error('secrets are missing in the job object');\n }\n ctx.logger.info(\"Writing secrets to the project's directory\");\n const keystorePath = path.join(ctx.buildDirectory, `keystore-${uuidv4()}`);\n await fs.writeFile(keystorePath, Buffer.from(buildCredentials.keystore.dataBase64, 'base64'));\n const credentialsJson = {\n android: {\n keystore: {\n keystorePath,\n keystorePassword: buildCredentials.keystore.keystorePassword,\n keyAlias: buildCredentials.keystore.keyAlias,\n keyPassword: buildCredentials.keystore.keyPassword,\n },\n },\n };\n await fs.writeFile(\n path.join(ctx.buildDirectory, 'credentials.json'),\n JSON.stringify(credentialsJson)\n );\n}\n\nexport { restoreCredentials };\n"]}
@@ -5,6 +5,7 @@ export declare enum AndroidMetadataName {
5
5
  RELEASE_CHANNEL = "expo.modules.updates.EXPO_RELEASE_CHANNEL",
6
6
  RUNTIME_VERSION = "expo.modules.updates.EXPO_RUNTIME_VERSION"
7
7
  }
8
+ export declare function androidSetRuntimeVersionNativelyAsync(ctx: BuildContext<Job>, runtimeVersion: string): Promise<void>;
8
9
  export declare function androidSetChannelNativelyAsync(ctx: BuildContext<Job>): Promise<void>;
9
10
  export declare function androidSetClassicReleaseChannelNativelyAsync(ctx: BuildContext<Job>): Promise<void>;
10
11
  export declare function androidGetNativelyDefinedClassicReleaseChannelAsync(ctx: BuildContext<Job>): Promise<string | null>;
@@ -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.androidGetNativelyDefinedRuntimeVersionAsync = exports.androidGetNativelyDefinedClassicReleaseChannelAsync = exports.androidSetClassicReleaseChannelNativelyAsync = exports.androidSetChannelNativelyAsync = exports.AndroidMetadataName = void 0;
6
+ exports.androidGetNativelyDefinedRuntimeVersionAsync = exports.androidGetNativelyDefinedClassicReleaseChannelAsync = exports.androidSetClassicReleaseChannelNativelyAsync = exports.androidSetChannelNativelyAsync = exports.androidSetRuntimeVersionNativelyAsync = exports.AndroidMetadataName = void 0;
7
7
  const assert_1 = __importDefault(require("assert"));
8
8
  const fs_extra_1 = __importDefault(require("fs-extra"));
9
9
  const config_plugins_1 = require("@expo/config-plugins");
@@ -13,6 +13,17 @@ var AndroidMetadataName;
13
13
  AndroidMetadataName["RELEASE_CHANNEL"] = "expo.modules.updates.EXPO_RELEASE_CHANNEL";
14
14
  AndroidMetadataName["RUNTIME_VERSION"] = "expo.modules.updates.EXPO_RUNTIME_VERSION";
15
15
  })(AndroidMetadataName = exports.AndroidMetadataName || (exports.AndroidMetadataName = {}));
16
+ async function androidSetRuntimeVersionNativelyAsync(ctx, runtimeVersion) {
17
+ const manifestPath = await config_plugins_1.AndroidConfig.Paths.getAndroidManifestAsync(ctx.reactNativeProjectDirectory);
18
+ if (!(await fs_extra_1.default.pathExists(manifestPath))) {
19
+ throw new Error(`Couldn't find Android manifest at ${manifestPath}`);
20
+ }
21
+ const androidManifest = await config_plugins_1.AndroidConfig.Manifest.readAndroidManifestAsync(manifestPath);
22
+ const mainApp = config_plugins_1.AndroidConfig.Manifest.getMainApplicationOrThrow(androidManifest);
23
+ config_plugins_1.AndroidConfig.Manifest.addMetaDataItemToMainApplication(mainApp, AndroidMetadataName.RUNTIME_VERSION, runtimeVersion, 'value');
24
+ await config_plugins_1.AndroidConfig.Manifest.writeAndroidManifestAsync(manifestPath, androidManifest);
25
+ }
26
+ exports.androidSetRuntimeVersionNativelyAsync = androidSetRuntimeVersionNativelyAsync;
16
27
  async function androidSetChannelNativelyAsync(ctx) {
17
28
  var _a;
18
29
  (0, assert_1.default)((_a = ctx.job.updates) === null || _a === void 0 ? void 0 : _a.channel, 'updates.channel must be defined');
@@ -1 +1 @@
1
- {"version":3,"file":"expoUpdates.js","sourceRoot":"","sources":["../../src/android/expoUpdates.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'assert';\n\nimport fs from 'fs-extra';\nimport { AndroidConfig, XML } from '@expo/config-plugins';\nimport { Job } from '@expo/eas-build-job';\n\nimport { BuildContext } from '../context';\n\nexport enum AndroidMetadataName {\n UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY = 'expo.modules.updates.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY',\n RELEASE_CHANNEL = 'expo.modules.updates.EXPO_RELEASE_CHANNEL',\n RUNTIME_VERSION = 'expo.modules.updates.EXPO_RUNTIME_VERSION',\n}\n\nexport async function androidSetChannelNativelyAsync(ctx: BuildContext<Job>): Promise<void> {\n assert(ctx.job.updates?.channel, 'updates.channel must be defined');\n\n const manifestPath = await AndroidConfig.Paths.getAndroidManifestAsync(\n ctx.reactNativeProjectDirectory\n );\n\n if (!(await fs.pathExists(manifestPath))) {\n throw new Error(`Couldn't find Android manifest at ${manifestPath}`);\n }\n\n const androidManifest = await AndroidConfig.Manifest.readAndroidManifestAsync(manifestPath);\n const mainApp = AndroidConfig.Manifest.getMainApplicationOrThrow(androidManifest);\n const stringifiedUpdatesRequestHeaders = AndroidConfig.Manifest.getMainApplicationMetaDataValue(\n androidManifest,\n AndroidMetadataName.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY\n );\n AndroidConfig.Manifest.addMetaDataItemToMainApplication(\n mainApp,\n AndroidMetadataName.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY,\n JSON.stringify({\n ...JSON.parse(stringifiedUpdatesRequestHeaders ?? '{}'),\n 'expo-channel-name': ctx.job.updates.channel,\n }),\n 'value'\n );\n await AndroidConfig.Manifest.writeAndroidManifestAsync(manifestPath, androidManifest);\n}\n\nexport async function androidSetClassicReleaseChannelNativelyAsync(\n ctx: BuildContext<Job>\n): Promise<void> {\n const { releaseChannel } = ctx.job;\n assert(releaseChannel, 'releaseChannel must be defined');\n const escapedReleaseChannel = XML.escapeAndroidString(releaseChannel);\n\n const manifestPath = await AndroidConfig.Paths.getAndroidManifestAsync(\n ctx.reactNativeProjectDirectory\n );\n if (!(await fs.pathExists(manifestPath))) {\n throw new Error(`Couldn't find Android manifest at ${manifestPath}`);\n }\n\n // Store the release channel in a string resource to ensure it is interpreted as a string\n const stringResourcePath = await AndroidConfig.Strings.getProjectStringsXMLPathAsync(\n ctx.reactNativeProjectDirectory\n );\n const stringResourceObject = await AndroidConfig.Resources.readResourcesXMLAsync({\n path: stringResourcePath,\n });\n\n const resourceName = 'release_channel';\n const releaseChannelResourceItem = AndroidConfig.Resources.buildResourceItem({\n name: resourceName,\n value: escapedReleaseChannel,\n });\n const newStringResourceObject = AndroidConfig.Strings.setStringItem(\n [releaseChannelResourceItem],\n stringResourceObject\n );\n await XML.writeXMLAsync({ path: stringResourcePath, xml: newStringResourceObject });\n\n const androidManifest = await AndroidConfig.Manifest.readAndroidManifestAsync(manifestPath);\n const mainApp = AndroidConfig.Manifest.getMainApplicationOrThrow(androidManifest);\n AndroidConfig.Manifest.addMetaDataItemToMainApplication(\n mainApp,\n AndroidMetadataName.RELEASE_CHANNEL,\n `@string/${resourceName}`,\n 'value'\n );\n await AndroidConfig.Manifest.writeAndroidManifestAsync(manifestPath, androidManifest);\n}\n\nexport async function androidGetNativelyDefinedClassicReleaseChannelAsync(\n ctx: BuildContext<Job>\n): Promise<string | null> {\n const manifestPath = await AndroidConfig.Paths.getAndroidManifestAsync(\n ctx.reactNativeProjectDirectory\n );\n if (!(await fs.pathExists(manifestPath))) {\n return null;\n }\n\n const androidManifest = await AndroidConfig.Manifest.readAndroidManifestAsync(manifestPath);\n return AndroidConfig.Manifest.getMainApplicationMetaDataValue(\n androidManifest,\n AndroidMetadataName.RELEASE_CHANNEL\n );\n}\n\nexport async function androidGetNativelyDefinedRuntimeVersionAsync(\n ctx: BuildContext<Job>\n): Promise<string | null> {\n const manifestPath = await AndroidConfig.Paths.getAndroidManifestAsync(\n ctx.reactNativeProjectDirectory\n );\n if (!(await fs.pathExists(manifestPath))) {\n return null;\n }\n\n const androidManifest = await AndroidConfig.Manifest.readAndroidManifestAsync(manifestPath);\n return AndroidConfig.Manifest.getMainApplicationMetaDataValue(\n androidManifest,\n AndroidMetadataName.RUNTIME_VERSION\n );\n}\n"]}
1
+ {"version":3,"file":"expoUpdates.js","sourceRoot":"","sources":["../../src/android/expoUpdates.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'assert';\n\nimport fs from 'fs-extra';\nimport { AndroidConfig, XML } from '@expo/config-plugins';\nimport { Job } from '@expo/eas-build-job';\n\nimport { BuildContext } from '../context';\n\nexport enum AndroidMetadataName {\n UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY = 'expo.modules.updates.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY',\n RELEASE_CHANNEL = 'expo.modules.updates.EXPO_RELEASE_CHANNEL',\n RUNTIME_VERSION = 'expo.modules.updates.EXPO_RUNTIME_VERSION',\n}\n\nexport async function androidSetRuntimeVersionNativelyAsync(\n ctx: BuildContext<Job>,\n runtimeVersion: string\n): Promise<void> {\n const manifestPath = await AndroidConfig.Paths.getAndroidManifestAsync(\n ctx.reactNativeProjectDirectory\n );\n\n if (!(await fs.pathExists(manifestPath))) {\n throw new Error(`Couldn't find Android manifest at ${manifestPath}`);\n }\n\n const androidManifest = await AndroidConfig.Manifest.readAndroidManifestAsync(manifestPath);\n const mainApp = AndroidConfig.Manifest.getMainApplicationOrThrow(androidManifest);\n AndroidConfig.Manifest.addMetaDataItemToMainApplication(\n mainApp,\n AndroidMetadataName.RUNTIME_VERSION,\n runtimeVersion,\n 'value'\n );\n await AndroidConfig.Manifest.writeAndroidManifestAsync(manifestPath, androidManifest);\n}\n\nexport async function androidSetChannelNativelyAsync(ctx: BuildContext<Job>): Promise<void> {\n assert(ctx.job.updates?.channel, 'updates.channel must be defined');\n\n const manifestPath = await AndroidConfig.Paths.getAndroidManifestAsync(\n ctx.reactNativeProjectDirectory\n );\n\n if (!(await fs.pathExists(manifestPath))) {\n throw new Error(`Couldn't find Android manifest at ${manifestPath}`);\n }\n\n const androidManifest = await AndroidConfig.Manifest.readAndroidManifestAsync(manifestPath);\n const mainApp = AndroidConfig.Manifest.getMainApplicationOrThrow(androidManifest);\n const stringifiedUpdatesRequestHeaders = AndroidConfig.Manifest.getMainApplicationMetaDataValue(\n androidManifest,\n AndroidMetadataName.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY\n );\n AndroidConfig.Manifest.addMetaDataItemToMainApplication(\n mainApp,\n AndroidMetadataName.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY,\n JSON.stringify({\n ...JSON.parse(stringifiedUpdatesRequestHeaders ?? '{}'),\n 'expo-channel-name': ctx.job.updates.channel,\n }),\n 'value'\n );\n await AndroidConfig.Manifest.writeAndroidManifestAsync(manifestPath, androidManifest);\n}\n\nexport async function androidSetClassicReleaseChannelNativelyAsync(\n ctx: BuildContext<Job>\n): Promise<void> {\n const { releaseChannel } = ctx.job;\n assert(releaseChannel, 'releaseChannel must be defined');\n const escapedReleaseChannel = XML.escapeAndroidString(releaseChannel);\n\n const manifestPath = await AndroidConfig.Paths.getAndroidManifestAsync(\n ctx.reactNativeProjectDirectory\n );\n if (!(await fs.pathExists(manifestPath))) {\n throw new Error(`Couldn't find Android manifest at ${manifestPath}`);\n }\n\n // Store the release channel in a string resource to ensure it is interpreted as a string\n const stringResourcePath = await AndroidConfig.Strings.getProjectStringsXMLPathAsync(\n ctx.reactNativeProjectDirectory\n );\n const stringResourceObject = await AndroidConfig.Resources.readResourcesXMLAsync({\n path: stringResourcePath,\n });\n\n const resourceName = 'release_channel';\n const releaseChannelResourceItem = AndroidConfig.Resources.buildResourceItem({\n name: resourceName,\n value: escapedReleaseChannel,\n });\n const newStringResourceObject = AndroidConfig.Strings.setStringItem(\n [releaseChannelResourceItem],\n stringResourceObject\n );\n await XML.writeXMLAsync({ path: stringResourcePath, xml: newStringResourceObject });\n\n const androidManifest = await AndroidConfig.Manifest.readAndroidManifestAsync(manifestPath);\n const mainApp = AndroidConfig.Manifest.getMainApplicationOrThrow(androidManifest);\n AndroidConfig.Manifest.addMetaDataItemToMainApplication(\n mainApp,\n AndroidMetadataName.RELEASE_CHANNEL,\n `@string/${resourceName}`,\n 'value'\n );\n await AndroidConfig.Manifest.writeAndroidManifestAsync(manifestPath, androidManifest);\n}\n\nexport async function androidGetNativelyDefinedClassicReleaseChannelAsync(\n ctx: BuildContext<Job>\n): Promise<string | null> {\n const manifestPath = await AndroidConfig.Paths.getAndroidManifestAsync(\n ctx.reactNativeProjectDirectory\n );\n if (!(await fs.pathExists(manifestPath))) {\n return null;\n }\n\n const androidManifest = await AndroidConfig.Manifest.readAndroidManifestAsync(manifestPath);\n return AndroidConfig.Manifest.getMainApplicationMetaDataValue(\n androidManifest,\n AndroidMetadataName.RELEASE_CHANNEL\n );\n}\n\nexport async function androidGetNativelyDefinedRuntimeVersionAsync(\n ctx: BuildContext<Job>\n): Promise<string | null> {\n const manifestPath = await AndroidConfig.Paths.getAndroidManifestAsync(\n ctx.reactNativeProjectDirectory\n );\n if (!(await fs.pathExists(manifestPath))) {\n return null;\n }\n\n const androidManifest = await AndroidConfig.Manifest.readAndroidManifestAsync(manifestPath);\n return AndroidConfig.Manifest.getMainApplicationMetaDataValue(\n androidManifest,\n AndroidMetadataName.RUNTIME_VERSION\n );\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { Job } from '@expo/eas-build-job';
1
+ import { Android, Job } from '@expo/eas-build-job';
2
2
  import { BuildContext } from '../context';
3
3
  export declare function ensureLFLineEndingsInGradlewScript<TJob extends Job>(ctx: BuildContext<TJob>): Promise<void>;
4
- export declare function runGradleCommand<TJob extends Job>(ctx: BuildContext<TJob>, gradleCommand: string): Promise<void>;
4
+ export declare function runGradleCommand(ctx: BuildContext<Android.Job>, gradleCommand: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"gradle.js","sourceRoot":"","sources":["../../src/android/gradle.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,sEAAuC;AAEvC,wDAA0B;AAInB,KAAK,UAAU,kCAAkC,CACtD,GAAuB;IAEvB,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,2BAA2B,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACrF,MAAM,cAAc,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC9D,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;QACjC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACzE,MAAM,kBAAE,CAAC,SAAS,CAAC,WAAW,EAAE,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;KAChF;AACH,CAAC;AATD,gFASC;AAEM,KAAK,UAAU,gBAAgB,CACpC,GAAuB,EACvB,aAAqB;IAErB,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,2BAA2B,EAAE,SAAS,CAAC,CAAC;IACzE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,aAAa,QAAQ,UAAU,EAAE,CAAC,CAAC;IACzE,MAAM,IAAA,sBAAK,EAAC,IAAI,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE;QAC5C,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,eAAe,EAAE,CAAC,IAAa,EAAE,EAAE;YACjC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC/B,OAAO,IAAI,CAAC;aACb;iBAAM;gBACL,OAAO,IAAI,CAAC;aACb;QACH,CAAC;QACD,GAAG,EAAE,GAAG,CAAC,GAAG;KACb,CAAC,CAAC;AACL,CAAC;AAlBD,4CAkBC","sourcesContent":["import path from 'path';\n\nimport spawn from '@expo/turtle-spawn';\nimport { Job } from '@expo/eas-build-job';\nimport fs from 'fs-extra';\n\nimport { BuildContext } from '../context';\n\nexport async function ensureLFLineEndingsInGradlewScript<TJob extends Job>(\n ctx: BuildContext<TJob>\n): Promise<void> {\n const gradlewPath = path.join(ctx.reactNativeProjectDirectory, 'android', 'gradlew');\n const gradlewContent = await fs.readFile(gradlewPath, 'utf8');\n if (gradlewContent.includes('\\r')) {\n ctx.logger.info('Replacing CRLF line endings with LF in gradlew script');\n await fs.writeFile(gradlewPath, gradlewContent.replace(/\\r\\n/g, '\\n'), 'utf8');\n }\n}\n\nexport async function runGradleCommand<TJob extends Job>(\n ctx: BuildContext<TJob>,\n gradleCommand: string\n): Promise<void> {\n const androidDir = path.join(ctx.reactNativeProjectDirectory, 'android');\n ctx.logger.info(`Running './gradlew ${gradleCommand}' in ${androidDir}`);\n await spawn('sh', ['gradlew', gradleCommand], {\n cwd: androidDir,\n logger: ctx.logger,\n lineTransformer: (line?: string) => {\n if (!line || /^\\.+$/.exec(line)) {\n return null;\n } else {\n return line;\n }\n },\n env: ctx.env,\n });\n}\n"]}
1
+ {"version":3,"file":"gradle.js","sourceRoot":"","sources":["../../src/android/gradle.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,sEAAuC;AAEvC,wDAA0B;AAInB,KAAK,UAAU,kCAAkC,CACtD,GAAuB;IAEvB,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,2BAA2B,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACrF,MAAM,cAAc,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC9D,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;QACjC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACzE,MAAM,kBAAE,CAAC,SAAS,CAAC,WAAW,EAAE,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;KAChF;AACH,CAAC;AATD,gFASC;AAEM,KAAK,UAAU,gBAAgB,CACpC,GAA8B,EAC9B,aAAqB;IAErB,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,2BAA2B,EAAE,SAAS,CAAC,CAAC;IACzE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,aAAa,QAAQ,UAAU,EAAE,CAAC,CAAC;IACzE,MAAM,IAAA,sBAAK,EAAC,IAAI,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE;QAC5C,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,eAAe,EAAE,CAAC,IAAa,EAAE,EAAE;YACjC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC/B,OAAO,IAAI,CAAC;aACb;iBAAM;gBACL,OAAO,IAAI,CAAC;aACb;QACH,CAAC;QACD,GAAG,EAAE,GAAG,CAAC,GAAG;KACb,CAAC,CAAC;AACL,CAAC;AAlBD,4CAkBC","sourcesContent":["import path from 'path';\n\nimport spawn from '@expo/turtle-spawn';\nimport { Android, Job } from '@expo/eas-build-job';\nimport fs from 'fs-extra';\n\nimport { BuildContext } from '../context';\n\nexport async function ensureLFLineEndingsInGradlewScript<TJob extends Job>(\n ctx: BuildContext<TJob>\n): Promise<void> {\n const gradlewPath = path.join(ctx.reactNativeProjectDirectory, 'android', 'gradlew');\n const gradlewContent = await fs.readFile(gradlewPath, 'utf8');\n if (gradlewContent.includes('\\r')) {\n ctx.logger.info('Replacing CRLF line endings with LF in gradlew script');\n await fs.writeFile(gradlewPath, gradlewContent.replace(/\\r\\n/g, '\\n'), 'utf8');\n }\n}\n\nexport async function runGradleCommand(\n ctx: BuildContext<Android.Job>,\n gradleCommand: string\n): Promise<void> {\n const androidDir = path.join(ctx.reactNativeProjectDirectory, 'android');\n ctx.logger.info(`Running './gradlew ${gradleCommand}' in ${androidDir}`);\n await spawn('sh', ['gradlew', gradleCommand], {\n cwd: androidDir,\n logger: ctx.logger,\n lineTransformer: (line?: string) => {\n if (!line || /^\\.+$/.exec(line)) {\n return null;\n } else {\n return line;\n }\n },\n env: ctx.env,\n });\n}\n"]}
@@ -11,6 +11,10 @@ const EAS_BUILD_GRADLE_TEMPLATE_PATH = path_1.default.join(__dirname, '../../tem
11
11
  const APPLY_EAS_BUILD_GRADLE_LINE = 'apply from: "./eas-build.gradle"';
12
12
  async function configureBuildGradle(ctx) {
13
13
  ctx.logger.info('Injecting signing config into build.gradle');
14
+ if (await fs_extra_1.default.pathExists(getEasBuildGradlePath(ctx.reactNativeProjectDirectory))) {
15
+ ctx.markBuildPhaseHasWarnings();
16
+ ctx.logger.warn('eas-build.gradle script is deprecated, please remove it from your project.');
17
+ }
14
18
  await deleteEasBuildGradle(ctx.reactNativeProjectDirectory);
15
19
  await createEasBuildGradle(ctx.reactNativeProjectDirectory);
16
20
  await addApplyToBuildGradle(ctx.reactNativeProjectDirectory);
@@ -1 +1 @@
1
- {"version":3,"file":"gradleConfig.js","sourceRoot":"","sources":["../../src/android/gradleConfig.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,yDAAqD;AAErD,wDAA0B;AAI1B,MAAM,8BAA8B,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,kCAAkC,CAAC,CAAC;AAChG,MAAM,2BAA2B,GAAG,kCAAkC,CAAC;AAEhE,KAAK,UAAU,oBAAoB,CAAC,GAA8B;IACvE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAC9D,MAAM,oBAAoB,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAC5D,MAAM,oBAAoB,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAC5D,MAAM,qBAAqB,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AAC/D,CAAC;AALD,oDAKC;AAED,KAAK,UAAU,oBAAoB,CAAC,WAAmB;IACrD,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAC9D,MAAM,kBAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,qBAAqB,CAAC,WAAmB;IAChD,OAAO,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,8BAA8B,CAAC,CAAC;AAChE,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,WAAmB;IACrD,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAC9D,MAAM,kBAAE,CAAC,IAAI,CAAC,8BAA8B,EAAE,kBAAkB,CAAC,CAAC;AACpE,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,WAAmB;IACtD,MAAM,eAAe,GAAG,8BAAa,CAAC,KAAK,CAAC,yBAAyB,CAAC,WAAW,CAAC,CAAC;IACnF,MAAM,mBAAmB,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,cAAI,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,CAAC;IAElF,IAAI,OAAO,CAAC,mBAAmB,EAAE,2BAA2B,CAAC,EAAE;QAC7D,OAAO;KACR;IAED,MAAM,kBAAE,CAAC,SAAS,CAChB,eAAe,EACf,GAAG,mBAAmB,CAAC,IAAI,EAAE,KAAK,2BAA2B,IAAI,CAClE,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,QAAgB,EAAE,MAAc;IAC/C,OAAO,CACL,QAAQ;SACL,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;SACtB,KAAK,CAAC,IAAI,CAAC;QACZ,0CAA0C;SACzC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CACzE,CAAC;AACJ,CAAC","sourcesContent":["import path from 'path';\n\nimport { AndroidConfig } from '@expo/config-plugins';\nimport { Android } from '@expo/eas-build-job';\nimport fs from 'fs-extra';\n\nimport { BuildContext } from '../context';\n\nconst EAS_BUILD_GRADLE_TEMPLATE_PATH = path.join(__dirname, '../../templates/eas-build.gradle');\nconst APPLY_EAS_BUILD_GRADLE_LINE = 'apply from: \"./eas-build.gradle\"';\n\nexport async function configureBuildGradle(ctx: BuildContext<Android.Job>): Promise<void> {\n ctx.logger.info('Injecting signing config into build.gradle');\n await deleteEasBuildGradle(ctx.reactNativeProjectDirectory);\n await createEasBuildGradle(ctx.reactNativeProjectDirectory);\n await addApplyToBuildGradle(ctx.reactNativeProjectDirectory);\n}\n\nasync function deleteEasBuildGradle(projectRoot: string): Promise<void> {\n const easBuildGradlePath = getEasBuildGradlePath(projectRoot);\n await fs.remove(easBuildGradlePath);\n}\n\nfunction getEasBuildGradlePath(projectRoot: string): string {\n return path.join(projectRoot, 'android/app/eas-build.gradle');\n}\n\nasync function createEasBuildGradle(projectRoot: string): Promise<void> {\n const easBuildGradlePath = getEasBuildGradlePath(projectRoot);\n await fs.copy(EAS_BUILD_GRADLE_TEMPLATE_PATH, easBuildGradlePath);\n}\n\nasync function addApplyToBuildGradle(projectRoot: string): Promise<void> {\n const buildGradlePath = AndroidConfig.Paths.getAppBuildGradleFilePath(projectRoot);\n const buildGradleContents = await fs.readFile(path.join(buildGradlePath), 'utf8');\n\n if (hasLine(buildGradleContents, APPLY_EAS_BUILD_GRADLE_LINE)) {\n return;\n }\n\n await fs.writeFile(\n buildGradlePath,\n `${buildGradleContents.trim()}\\n${APPLY_EAS_BUILD_GRADLE_LINE}\\n`\n );\n}\n\nfunction hasLine(haystack: string, needle: string): boolean {\n return (\n haystack\n .replace(/\\r\\n/g, '\\n')\n .split('\\n')\n // Check for both single and double quotes\n .some((line) => line === needle || line === needle.replace(/\"/g, \"'\"))\n );\n}\n"]}
1
+ {"version":3,"file":"gradleConfig.js","sourceRoot":"","sources":["../../src/android/gradleConfig.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,yDAAqD;AAErD,wDAA0B;AAI1B,MAAM,8BAA8B,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,kCAAkC,CAAC,CAAC;AAChG,MAAM,2BAA2B,GAAG,kCAAkC,CAAC;AAEhE,KAAK,UAAU,oBAAoB,CAAC,GAA8B;IACvE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAC9D,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,qBAAqB,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,EAAE;QAC/E,GAAG,CAAC,yBAAyB,EAAE,CAAC;QAChC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;KAC/F;IACD,MAAM,oBAAoB,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAC5D,MAAM,oBAAoB,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAC5D,MAAM,qBAAqB,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AAC/D,CAAC;AATD,oDASC;AAED,KAAK,UAAU,oBAAoB,CAAC,WAAmB;IACrD,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAC9D,MAAM,kBAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,qBAAqB,CAAC,WAAmB;IAChD,OAAO,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,8BAA8B,CAAC,CAAC;AAChE,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,WAAmB;IACrD,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAC9D,MAAM,kBAAE,CAAC,IAAI,CAAC,8BAA8B,EAAE,kBAAkB,CAAC,CAAC;AACpE,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,WAAmB;IACtD,MAAM,eAAe,GAAG,8BAAa,CAAC,KAAK,CAAC,yBAAyB,CAAC,WAAW,CAAC,CAAC;IACnF,MAAM,mBAAmB,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,cAAI,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,CAAC;IAElF,IAAI,OAAO,CAAC,mBAAmB,EAAE,2BAA2B,CAAC,EAAE;QAC7D,OAAO;KACR;IAED,MAAM,kBAAE,CAAC,SAAS,CAChB,eAAe,EACf,GAAG,mBAAmB,CAAC,IAAI,EAAE,KAAK,2BAA2B,IAAI,CAClE,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,QAAgB,EAAE,MAAc;IAC/C,OAAO,CACL,QAAQ;SACL,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;SACtB,KAAK,CAAC,IAAI,CAAC;QACZ,0CAA0C;SACzC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CACzE,CAAC;AACJ,CAAC","sourcesContent":["import path from 'path';\n\nimport { AndroidConfig } from '@expo/config-plugins';\nimport { Android } from '@expo/eas-build-job';\nimport fs from 'fs-extra';\n\nimport { BuildContext } from '../context';\n\nconst EAS_BUILD_GRADLE_TEMPLATE_PATH = path.join(__dirname, '../../templates/eas-build.gradle');\nconst APPLY_EAS_BUILD_GRADLE_LINE = 'apply from: \"./eas-build.gradle\"';\n\nexport async function configureBuildGradle(ctx: BuildContext<Android.Job>): Promise<void> {\n ctx.logger.info('Injecting signing config into build.gradle');\n if (await fs.pathExists(getEasBuildGradlePath(ctx.reactNativeProjectDirectory))) {\n ctx.markBuildPhaseHasWarnings();\n ctx.logger.warn('eas-build.gradle script is deprecated, please remove it from your project.');\n }\n await deleteEasBuildGradle(ctx.reactNativeProjectDirectory);\n await createEasBuildGradle(ctx.reactNativeProjectDirectory);\n await addApplyToBuildGradle(ctx.reactNativeProjectDirectory);\n}\n\nasync function deleteEasBuildGradle(projectRoot: string): Promise<void> {\n const easBuildGradlePath = getEasBuildGradlePath(projectRoot);\n await fs.remove(easBuildGradlePath);\n}\n\nfunction getEasBuildGradlePath(projectRoot: string): string {\n return path.join(projectRoot, 'android/app/eas-build.gradle');\n}\n\nasync function createEasBuildGradle(projectRoot: string): Promise<void> {\n const easBuildGradlePath = getEasBuildGradlePath(projectRoot);\n await fs.copy(EAS_BUILD_GRADLE_TEMPLATE_PATH, easBuildGradlePath);\n}\n\nasync function addApplyToBuildGradle(projectRoot: string): Promise<void> {\n const buildGradlePath = AndroidConfig.Paths.getAppBuildGradleFilePath(projectRoot);\n const buildGradleContents = await fs.readFile(path.join(buildGradlePath), 'utf8');\n\n if (hasLine(buildGradleContents, APPLY_EAS_BUILD_GRADLE_LINE)) {\n return;\n }\n\n await fs.writeFile(\n buildGradlePath,\n `${buildGradleContents.trim()}\\n${APPLY_EAS_BUILD_GRADLE_LINE}\\n`\n );\n}\n\nfunction hasLine(haystack: string, needle: string): boolean {\n return (\n haystack\n .replace(/\\r\\n/g, '\\n')\n .split('\\n')\n // Check for both single and double quotes\n .some((line) => line === needle || line === needle.replace(/\"/g, \"'\"))\n );\n}\n"]}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const eas_build_job_1 = require("@expo/eas-build-job");
4
4
  const context_1 = require("../context");
5
+ const handleNpmError_1 = require("../utils/handleNpmError");
5
6
  const expoUpdates_1 = require("../utils/expoUpdates");
6
7
  const gradle_1 = require("../android/gradle");
7
8
  const project_1 = require("../utils/project");
@@ -21,7 +22,7 @@ async function androidBuilder(ctx) {
21
22
  else {
22
23
  await ctx.runBuildPhase(eas_build_job_1.BuildPhase.PREBUILD, async () => {
23
24
  await (0, prebuild_1.prebuildAsync)(ctx);
24
- });
25
+ }, { onError: (0, handleNpmError_1.createNpmErrorHandler)(ctx) });
25
26
  }
26
27
  await ctx.runBuildPhase(eas_build_job_1.BuildPhase.RESTORE_CACHE, async () => {
27
28
  var _a;
@@ -45,6 +46,16 @@ async function androidBuilder(ctx) {
45
46
  await ctx.runBuildPhase(eas_build_job_1.BuildPhase.RUN_GRADLEW, async () => {
46
47
  const gradleCommand = resolveGradleCommand(ctx.job);
47
48
  await (0, gradle_1.runGradleCommand)(ctx, gradleCommand);
49
+ }, {
50
+ onError: (err, logLines) => {
51
+ var _a;
52
+ if (ctx.env.EAS_BUILD_MAVEN_CACHE_URL &&
53
+ logLines.some((line) => line.includes(ctx.env.EAS_BUILD_MAVEN_CACHE_URL))) {
54
+ (_a = ctx.reportError) === null || _a === void 0 ? void 0 : _a.call(ctx, 'Maven cache error', err, {
55
+ extras: { buildId: ctx.env.EAS_BUILD_ID, logs: logLines.join('\n') },
56
+ });
57
+ }
58
+ },
48
59
  });
49
60
  await ctx.runBuildPhase(eas_build_job_1.BuildPhase.PRE_UPLOAD_ARTIFACTS_HOOK, async () => {
50
61
  await (0, hooks_1.runHookIfPresent)(ctx, hooks_1.Hook.PRE_UPLOAD_ARTIFACTS);
@@ -1 +1 @@
1
- {"version":3,"file":"android.js","sourceRoot":"","sources":["../../src/builders/android.ts"],"names":[],"mappings":"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","sourcesContent":["import { Android, BuildPhase, Workflow } from '@expo/eas-build-job';\n\nimport { BuildContext, SkipNativeBuildError } from '../context';\nimport { configureExpoUpdatesIfInstalledAsync } from '../utils/expoUpdates';\nimport { runGradleCommand, ensureLFLineEndingsInGradlewScript } from '../android/gradle';\nimport { setup } from '../utils/project';\nimport { findBuildArtifacts } from '../utils/buildArtifacts';\nimport { Hook, runHookIfPresent } from '../utils/hooks';\nimport { restoreCredentials } from '../android/credentials';\nimport { configureBuildGradle } from '../android/gradleConfig';\nimport { prebuildAsync } from '../utils/prebuild';\n\nexport default async function androidBuilder(ctx: BuildContext<Android.Job>): Promise<string[]> {\n await setup(ctx);\n const hasNativeCode = ctx.job.type === Workflow.GENERIC;\n\n if (hasNativeCode) {\n await ctx.runBuildPhase(BuildPhase.FIX_GRADLEW, async () => {\n await ensureLFLineEndingsInGradlewScript(ctx);\n });\n } else {\n await ctx.runBuildPhase(BuildPhase.PREBUILD, async () => {\n await prebuildAsync(ctx);\n });\n }\n\n await ctx.runBuildPhase(BuildPhase.RESTORE_CACHE, async () => {\n await ctx.cacheManager?.restoreCache(ctx);\n });\n\n await ctx.runBuildPhase(BuildPhase.POST_INSTALL_HOOK, async () => {\n await runHookIfPresent(ctx, Hook.POST_INSTALL);\n });\n\n if (ctx.job.secrets.buildCredentials) {\n await ctx.runBuildPhase(BuildPhase.PREPARE_CREDENTIALS, async () => {\n await restoreCredentials(ctx);\n await configureBuildGradle(ctx);\n });\n }\n await ctx.runBuildPhase(BuildPhase.CONFIGURE_EXPO_UPDATES, async () => {\n await configureExpoUpdatesIfInstalledAsync(ctx);\n });\n\n if (ctx.skipNativeBuild) {\n throw new SkipNativeBuildError('Skipping Gradle build');\n }\n await ctx.runBuildPhase(BuildPhase.RUN_GRADLEW, async () => {\n const gradleCommand = resolveGradleCommand(ctx.job);\n await runGradleCommand(ctx, gradleCommand);\n });\n\n await ctx.runBuildPhase(BuildPhase.PRE_UPLOAD_ARTIFACTS_HOOK, async () => {\n await runHookIfPresent(ctx, Hook.PRE_UPLOAD_ARTIFACTS);\n });\n\n await ctx.runBuildPhase(BuildPhase.SAVE_CACHE, async () => {\n await ctx.cacheManager?.saveCache(ctx);\n });\n\n return await ctx.runBuildPhase(\n BuildPhase.UPLOAD_ARTIFACTS,\n async () => {\n const buildArtifacts = await findBuildArtifacts(\n ctx.reactNativeProjectDirectory,\n ctx.job.artifactPath ?? 'android/app/build/outputs/**/*.{apk,aab}',\n ctx.logger\n );\n ctx.logger.info(`Build artifacts: ${buildArtifacts.join(', ')}`);\n return buildArtifacts;\n },\n { doNotMarkEnd: true }\n );\n}\n\nfunction resolveGradleCommand(job: Android.Job): string {\n if (job.gradleCommand) {\n return job.gradleCommand;\n } else if (job.developmentClient) {\n return ':app:assembleDebug';\n } else if (!job.buildType) {\n return ':app:bundleRelease';\n } else if (job.buildType === Android.BuildType.APK) {\n return ':app:assembleRelease';\n } else {\n return ':app:bundleRelease';\n }\n}\n"]}
1
+ {"version":3,"file":"android.js","sourceRoot":"","sources":["../../src/builders/android.ts"],"names":[],"mappings":"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","sourcesContent":["import { Android, BuildPhase, Workflow } from '@expo/eas-build-job';\n\nimport { BuildContext, SkipNativeBuildError } from '../context';\nimport { createNpmErrorHandler } from '../utils/handleNpmError';\nimport { configureExpoUpdatesIfInstalledAsync } from '../utils/expoUpdates';\nimport { runGradleCommand, ensureLFLineEndingsInGradlewScript } from '../android/gradle';\nimport { setup } from '../utils/project';\nimport { findBuildArtifacts } from '../utils/buildArtifacts';\nimport { Hook, runHookIfPresent } from '../utils/hooks';\nimport { restoreCredentials } from '../android/credentials';\nimport { configureBuildGradle } from '../android/gradleConfig';\nimport { prebuildAsync } from '../utils/prebuild';\n\nexport default async function androidBuilder(ctx: BuildContext<Android.Job>): Promise<string[]> {\n await setup(ctx);\n const hasNativeCode = ctx.job.type === Workflow.GENERIC;\n\n if (hasNativeCode) {\n await ctx.runBuildPhase(BuildPhase.FIX_GRADLEW, async () => {\n await ensureLFLineEndingsInGradlewScript(ctx);\n });\n } else {\n await ctx.runBuildPhase(\n BuildPhase.PREBUILD,\n async () => {\n await prebuildAsync(ctx);\n },\n { onError: createNpmErrorHandler(ctx) }\n );\n }\n\n await ctx.runBuildPhase(BuildPhase.RESTORE_CACHE, async () => {\n await ctx.cacheManager?.restoreCache(ctx);\n });\n\n await ctx.runBuildPhase(BuildPhase.POST_INSTALL_HOOK, async () => {\n await runHookIfPresent(ctx, Hook.POST_INSTALL);\n });\n\n if (ctx.job.secrets.buildCredentials) {\n await ctx.runBuildPhase(BuildPhase.PREPARE_CREDENTIALS, async () => {\n await restoreCredentials(ctx);\n await configureBuildGradle(ctx);\n });\n }\n await ctx.runBuildPhase(BuildPhase.CONFIGURE_EXPO_UPDATES, async () => {\n await configureExpoUpdatesIfInstalledAsync(ctx);\n });\n\n if (ctx.skipNativeBuild) {\n throw new SkipNativeBuildError('Skipping Gradle build');\n }\n await ctx.runBuildPhase(\n BuildPhase.RUN_GRADLEW,\n async () => {\n const gradleCommand = resolveGradleCommand(ctx.job);\n await runGradleCommand(ctx, gradleCommand);\n },\n {\n onError: (err, logLines) => {\n if (\n ctx.env.EAS_BUILD_MAVEN_CACHE_URL &&\n logLines.some((line) => line.includes(ctx.env.EAS_BUILD_MAVEN_CACHE_URL))\n ) {\n ctx.reportError?.('Maven cache error', err, {\n extras: { buildId: ctx.env.EAS_BUILD_ID, logs: logLines.join('\\n') },\n });\n }\n },\n }\n );\n\n await ctx.runBuildPhase(BuildPhase.PRE_UPLOAD_ARTIFACTS_HOOK, async () => {\n await runHookIfPresent(ctx, Hook.PRE_UPLOAD_ARTIFACTS);\n });\n\n await ctx.runBuildPhase(BuildPhase.SAVE_CACHE, async () => {\n await ctx.cacheManager?.saveCache(ctx);\n });\n\n return await ctx.runBuildPhase(\n BuildPhase.UPLOAD_ARTIFACTS,\n async () => {\n const buildArtifacts = await findBuildArtifacts(\n ctx.reactNativeProjectDirectory,\n ctx.job.artifactPath ?? 'android/app/build/outputs/**/*.{apk,aab}',\n ctx.logger\n );\n ctx.logger.info(`Build artifacts: ${buildArtifacts.join(', ')}`);\n return buildArtifacts;\n },\n { doNotMarkEnd: true }\n );\n}\n\nfunction resolveGradleCommand(job: Android.Job): string {\n if (job.gradleCommand) {\n return job.gradleCommand;\n } else if (job.developmentClient) {\n return ':app:assembleDebug';\n } else if (!job.buildType) {\n return ':app:bundleRelease';\n } else if (job.buildType === Android.BuildType.APK) {\n return ':app:assembleRelease';\n } else {\n return ':app:bundleRelease';\n }\n}\n"]}
@@ -8,6 +8,7 @@ const plist_1 = __importDefault(require("@expo/plist"));
8
8
  const config_plugins_1 = require("@expo/config-plugins");
9
9
  const eas_build_job_1 = require("@expo/eas-build-job");
10
10
  const fs_extra_1 = __importDefault(require("fs-extra"));
11
+ const handleNpmError_1 = require("../utils/handleNpmError");
11
12
  const expoUpdates_1 = require("../utils/expoUpdates");
12
13
  const project_1 = require("../utils/project");
13
14
  const buildArtifacts_1 = require("../utils/buildArtifacts");
@@ -31,7 +32,7 @@ async function iosBuilder(ctx) {
31
32
  ? { APPLE_TEAM_ID: credentials.teamId }
32
33
  : {};
33
34
  await (0, prebuild_1.prebuildAsync)(ctx, { extraEnvs });
34
- });
35
+ }, { onError: (0, handleNpmError_1.createNpmErrorHandler)(ctx) });
35
36
  }
36
37
  await ctx.runBuildPhase(eas_build_job_1.BuildPhase.RESTORE_CACHE, async () => {
37
38
  var _a;
@@ -1 +1 @@
1
- {"version":3,"file":"ios.js","sourceRoot":"","sources":["../../src/builders/ios.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'assert';\n\nimport plist from '@expo/plist';\nimport { IOSConfig } from '@expo/config-plugins';\nimport { BuildPhase, Ios, Workflow } from '@expo/eas-build-job';\nimport fs from 'fs-extra';\n\nimport { BuildContext } from '../context';\nimport { configureExpoUpdatesIfInstalledAsync } from '../utils/expoUpdates';\nimport { setup } from '../utils/project';\nimport { findBuildArtifacts } from '../utils/buildArtifacts';\nimport { Hook, runHookIfPresent } from '../utils/hooks';\nimport { configureXcodeProject } from '../ios/configure';\nimport CredentialsManager from '../ios/credentials/manager';\nimport { runFastlaneGym } from '../ios/fastlane';\nimport { installPods } from '../ios/pod';\nimport { prebuildAsync } from '../utils/prebuild';\n\nexport default async function iosBuilder(ctx: BuildContext<Ios.Job>): Promise<string[]> {\n await setup(ctx);\n const hasNativeCode = ctx.job.type === Workflow.GENERIC;\n\n const credentialsManager = new CredentialsManager(ctx);\n try {\n const credentials = await ctx.runBuildPhase(BuildPhase.PREPARE_CREDENTIALS, async () => {\n return await credentialsManager.prepare();\n });\n\n if (!hasNativeCode) {\n await ctx.runBuildPhase(BuildPhase.PREBUILD, async () => {\n const extraEnvs: Record<string, string> = credentials?.teamId\n ? { APPLE_TEAM_ID: credentials.teamId }\n : {};\n await prebuildAsync(ctx, { extraEnvs });\n });\n }\n\n await ctx.runBuildPhase(BuildPhase.RESTORE_CACHE, async () => {\n await ctx.cacheManager?.restoreCache(ctx);\n });\n\n await ctx.runBuildPhase(BuildPhase.INSTALL_PODS, async () => {\n await installPods(ctx);\n });\n\n await ctx.runBuildPhase(BuildPhase.POST_INSTALL_HOOK, async () => {\n await runHookIfPresent(ctx, Hook.POST_INSTALL);\n });\n\n const buildConfiguration = resolveBuildConfiguration(ctx);\n if (credentials) {\n await ctx.runBuildPhase(BuildPhase.CONFIGURE_XCODE_PROJECT, async () => {\n await configureXcodeProject(ctx, { credentials, buildConfiguration });\n });\n }\n\n await ctx.runBuildPhase(BuildPhase.CONFIGURE_EXPO_UPDATES, async () => {\n await configureExpoUpdatesIfInstalledAsync(ctx);\n });\n\n await ctx.runBuildPhase(BuildPhase.RUN_FASTLANE, async () => {\n const scheme = resolveScheme(ctx);\n const entitlements = await readEntitlementsAsync(ctx, { scheme, buildConfiguration });\n await runFastlaneGym(ctx, {\n credentials,\n scheme,\n buildConfiguration,\n entitlements,\n });\n });\n } finally {\n await ctx.runBuildPhase(BuildPhase.CLEAN_UP_CREDENTIALS, async () => {\n await credentialsManager.cleanUp();\n });\n }\n\n await ctx.runBuildPhase(BuildPhase.PRE_UPLOAD_ARTIFACTS_HOOK, async () => {\n await runHookIfPresent(ctx, Hook.PRE_UPLOAD_ARTIFACTS);\n });\n\n await ctx.runBuildPhase(BuildPhase.SAVE_CACHE, async () => {\n await ctx.cacheManager?.saveCache(ctx);\n });\n\n return await ctx.runBuildPhase(\n BuildPhase.UPLOAD_ARTIFACTS,\n async () => {\n const buildArtifacts = await findBuildArtifacts(\n ctx.reactNativeProjectDirectory,\n resolveArtifactPath(ctx),\n ctx.logger\n );\n ctx.logger.info(`Build artifacts: ${buildArtifacts.join(', ')}`);\n return buildArtifacts;\n },\n { doNotMarkEnd: true }\n );\n}\n\nfunction resolveScheme(ctx: BuildContext<Ios.Job>): string {\n if (ctx.job.scheme) {\n return ctx.job.scheme;\n }\n const schemes = IOSConfig.BuildScheme.getSchemesFromXcodeproj(ctx.reactNativeProjectDirectory);\n assert(schemes.length === 1, 'Ejected project should have exactly one scheme');\n return schemes[0];\n}\n\nasync function readEntitlementsAsync(\n ctx: BuildContext<Ios.Job>,\n { scheme, buildConfiguration }: { scheme: string; buildConfiguration: string }\n): Promise<object | null> {\n try {\n const applicationTargetName = await IOSConfig.BuildScheme.getApplicationTargetNameForSchemeAsync(\n ctx.reactNativeProjectDirectory,\n scheme\n );\n const entitlementsPath = IOSConfig.Entitlements.getEntitlementsPath(\n ctx.reactNativeProjectDirectory,\n {\n buildConfiguration,\n targetName: applicationTargetName,\n }\n );\n if (!entitlementsPath) {\n return null;\n }\n const entitlementsRaw = await fs.readFile(entitlementsPath, 'utf8');\n return plist.parse(entitlementsRaw);\n } catch (err) {\n ctx.logger.warn({ err }, 'Failed to read entitlements');\n ctx.markBuildPhaseHasWarnings();\n return null;\n }\n}\n\nfunction resolveArtifactPath(ctx: BuildContext<Ios.Job>): string {\n if (ctx.job.artifactPath) {\n return ctx.job.artifactPath;\n } else if (ctx.job.simulator) {\n return 'ios/build/Build/Products/*-iphonesimulator/*.app';\n } else {\n return 'ios/build/*.ipa';\n }\n}\n\nfunction resolveBuildConfiguration(ctx: BuildContext<Ios.Job>): string {\n if (ctx.job.buildConfiguration) {\n return ctx.job.buildConfiguration;\n } else if (ctx.job.developmentClient) {\n return 'Debug';\n } else {\n return 'Release';\n }\n}\n"]}
1
+ {"version":3,"file":"ios.js","sourceRoot":"","sources":["../../src/builders/ios.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'assert';\n\nimport plist from '@expo/plist';\nimport { IOSConfig } from '@expo/config-plugins';\nimport { BuildPhase, Ios, Workflow } from '@expo/eas-build-job';\nimport fs from 'fs-extra';\n\nimport { BuildContext } from '../context';\nimport { createNpmErrorHandler } from '../utils/handleNpmError';\nimport { configureExpoUpdatesIfInstalledAsync } from '../utils/expoUpdates';\nimport { setup } from '../utils/project';\nimport { findBuildArtifacts } from '../utils/buildArtifacts';\nimport { Hook, runHookIfPresent } from '../utils/hooks';\nimport { configureXcodeProject } from '../ios/configure';\nimport CredentialsManager from '../ios/credentials/manager';\nimport { runFastlaneGym } from '../ios/fastlane';\nimport { installPods } from '../ios/pod';\nimport { prebuildAsync } from '../utils/prebuild';\n\nexport default async function iosBuilder(ctx: BuildContext<Ios.Job>): Promise<string[]> {\n await setup(ctx);\n const hasNativeCode = ctx.job.type === Workflow.GENERIC;\n\n const credentialsManager = new CredentialsManager(ctx);\n try {\n const credentials = await ctx.runBuildPhase(BuildPhase.PREPARE_CREDENTIALS, async () => {\n return await credentialsManager.prepare();\n });\n\n if (!hasNativeCode) {\n await ctx.runBuildPhase(\n BuildPhase.PREBUILD,\n async () => {\n const extraEnvs: Record<string, string> = credentials?.teamId\n ? { APPLE_TEAM_ID: credentials.teamId }\n : {};\n await prebuildAsync(ctx, { extraEnvs });\n },\n { onError: createNpmErrorHandler(ctx) }\n );\n }\n\n await ctx.runBuildPhase(BuildPhase.RESTORE_CACHE, async () => {\n await ctx.cacheManager?.restoreCache(ctx);\n });\n\n await ctx.runBuildPhase(BuildPhase.INSTALL_PODS, async () => {\n await installPods(ctx);\n });\n\n await ctx.runBuildPhase(BuildPhase.POST_INSTALL_HOOK, async () => {\n await runHookIfPresent(ctx, Hook.POST_INSTALL);\n });\n\n const buildConfiguration = resolveBuildConfiguration(ctx);\n if (credentials) {\n await ctx.runBuildPhase(BuildPhase.CONFIGURE_XCODE_PROJECT, async () => {\n await configureXcodeProject(ctx, { credentials, buildConfiguration });\n });\n }\n\n await ctx.runBuildPhase(BuildPhase.CONFIGURE_EXPO_UPDATES, async () => {\n await configureExpoUpdatesIfInstalledAsync(ctx);\n });\n\n await ctx.runBuildPhase(BuildPhase.RUN_FASTLANE, async () => {\n const scheme = resolveScheme(ctx);\n const entitlements = await readEntitlementsAsync(ctx, { scheme, buildConfiguration });\n await runFastlaneGym(ctx, {\n credentials,\n scheme,\n buildConfiguration,\n entitlements,\n });\n });\n } finally {\n await ctx.runBuildPhase(BuildPhase.CLEAN_UP_CREDENTIALS, async () => {\n await credentialsManager.cleanUp();\n });\n }\n\n await ctx.runBuildPhase(BuildPhase.PRE_UPLOAD_ARTIFACTS_HOOK, async () => {\n await runHookIfPresent(ctx, Hook.PRE_UPLOAD_ARTIFACTS);\n });\n\n await ctx.runBuildPhase(BuildPhase.SAVE_CACHE, async () => {\n await ctx.cacheManager?.saveCache(ctx);\n });\n\n return await ctx.runBuildPhase(\n BuildPhase.UPLOAD_ARTIFACTS,\n async () => {\n const buildArtifacts = await findBuildArtifacts(\n ctx.reactNativeProjectDirectory,\n resolveArtifactPath(ctx),\n ctx.logger\n );\n ctx.logger.info(`Build artifacts: ${buildArtifacts.join(', ')}`);\n return buildArtifacts;\n },\n { doNotMarkEnd: true }\n );\n}\n\nfunction resolveScheme(ctx: BuildContext<Ios.Job>): string {\n if (ctx.job.scheme) {\n return ctx.job.scheme;\n }\n const schemes = IOSConfig.BuildScheme.getSchemesFromXcodeproj(ctx.reactNativeProjectDirectory);\n assert(schemes.length === 1, 'Ejected project should have exactly one scheme');\n return schemes[0];\n}\n\nasync function readEntitlementsAsync(\n ctx: BuildContext<Ios.Job>,\n { scheme, buildConfiguration }: { scheme: string; buildConfiguration: string }\n): Promise<object | null> {\n try {\n const applicationTargetName = await IOSConfig.BuildScheme.getApplicationTargetNameForSchemeAsync(\n ctx.reactNativeProjectDirectory,\n scheme\n );\n const entitlementsPath = IOSConfig.Entitlements.getEntitlementsPath(\n ctx.reactNativeProjectDirectory,\n {\n buildConfiguration,\n targetName: applicationTargetName,\n }\n );\n if (!entitlementsPath) {\n return null;\n }\n const entitlementsRaw = await fs.readFile(entitlementsPath, 'utf8');\n return plist.parse(entitlementsRaw);\n } catch (err) {\n ctx.logger.warn({ err }, 'Failed to read entitlements');\n ctx.markBuildPhaseHasWarnings();\n return null;\n }\n}\n\nfunction resolveArtifactPath(ctx: BuildContext<Ios.Job>): string {\n if (ctx.job.artifactPath) {\n return ctx.job.artifactPath;\n } else if (ctx.job.simulator) {\n return 'ios/build/Build/Products/*-iphonesimulator/*.app';\n } else {\n return 'ios/build/*.ipa';\n }\n}\n\nfunction resolveBuildConfiguration(ctx: BuildContext<Ios.Job>): string {\n if (ctx.job.buildConfiguration) {\n return ctx.job.buildConfiguration;\n } else if (ctx.job.developmentClient) {\n return 'Debug';\n } else {\n return 'Release';\n }\n}\n"]}
package/dist/context.d.ts CHANGED
@@ -17,8 +17,14 @@ export interface BuildContextOptions {
17
17
  logBuffer: LogBuffer;
18
18
  env: Env;
19
19
  cacheManager?: CacheManager;
20
- runExpoCliCommand: (args: string, options: SpawnOptions) => SpawnPromise<SpawnResult>;
21
- reportError?: (msg: string, err?: Error) => void;
20
+ /**
21
+ * @deprecated
22
+ */
23
+ runGlobalExpoCliCommand: (args: string, options: SpawnOptions) => SpawnPromise<SpawnResult>;
24
+ reportError?: (msg: string, err?: Error, options?: {
25
+ tags?: Record<string, string>;
26
+ extras?: Record<string, string>;
27
+ }) => void;
22
28
  skipNativeBuild?: boolean;
23
29
  metadata?: Metadata;
24
30
  }
@@ -31,8 +37,14 @@ export declare class BuildContext<TJob extends Job> {
31
37
  readonly logBuffer: LogBuffer;
32
38
  readonly env: Env;
33
39
  readonly cacheManager?: CacheManager;
34
- readonly runExpoCliCommand: (args: string, options: SpawnOptions) => SpawnPromise<SpawnResult>;
35
- readonly reportError?: (msg: string, err?: Error) => void;
40
+ /**
41
+ * @deprecated
42
+ */
43
+ readonly runGlobalExpoCliCommand: (args: string, options: SpawnOptions) => SpawnPromise<SpawnResult>;
44
+ readonly reportError?: (msg: string, err?: Error, options?: {
45
+ tags?: Record<string, string>;
46
+ extras?: Record<string, string>;
47
+ }) => void;
36
48
  readonly metadata?: Metadata;
37
49
  readonly skipNativeBuild?: boolean;
38
50
  private readonly defaultLogger;
@@ -47,7 +59,7 @@ export declare class BuildContext<TJob extends Job> {
47
59
  runBuildPhase<T>(buildPhase: BuildPhase, phase: () => Promise<T>, { doNotMarkStart, doNotMarkEnd, onError, }?: {
48
60
  doNotMarkStart?: boolean;
49
61
  doNotMarkEnd?: boolean;
50
- onError?: (err: Error) => void;
62
+ onError?: (err: Error, logLines: string[]) => void;
51
63
  }): Promise<T>;
52
64
  markBuildPhaseHasWarnings(): void;
53
65
  private setBuildPhase;
package/dist/context.js CHANGED
@@ -22,7 +22,7 @@ class BuildContext {
22
22
  this.logger = this.defaultLogger;
23
23
  this.logBuffer = options.logBuffer;
24
24
  this.cacheManager = options.cacheManager;
25
- this.runExpoCliCommand = options.runExpoCliCommand;
25
+ this.runGlobalExpoCliCommand = options.runGlobalExpoCliCommand;
26
26
  this.reportError = options.reportError;
27
27
  this.metadata = options.metadata;
28
28
  this.skipNativeBuild = options.skipNativeBuild;
@@ -76,7 +76,7 @@ class BuildContext {
76
76
  this.logger.error({ err }, '');
77
77
  }
78
78
  if (onError) {
79
- onError(userError !== null && userError !== void 0 ? userError : err);
79
+ onError(userError !== null && userError !== void 0 ? userError : err, this.logBuffer.getPhaseLogs(buildPhase));
80
80
  }
81
81
  this.endCurrentBuildPhase({ result: eas_build_job_1.BuildPhaseResult.FAIL });
82
82
  throw userError !== null && userError !== void 0 ? userError : err;
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\n\nimport {\n BuildPhase,\n BuildPhaseResult,\n Job,\n LogMarker,\n Env,\n errors,\n Metadata,\n} from '@expo/eas-build-job';\nimport { ExpoConfig } from '@expo/config';\nimport { bunyan } from '@expo/logger';\nimport { SpawnPromise, SpawnOptions, SpawnResult } from '@expo/turtle-spawn';\n\nimport { PackageManager, resolvePackageManager } from './utils/packageManager';\nimport { detectUserError } from './utils/detectUserError';\nimport { readAppConfig } from './utils/appConfig';\n\nexport interface CacheManager {\n saveCache(ctx: BuildContext<Job>): Promise<void>;\n restoreCache(ctx: BuildContext<Job>): Promise<void>;\n}\n\nexport interface LogBuffer {\n getLogs(): string[];\n getPhaseLogs(buildPhase: string): string[];\n}\n\nexport interface BuildContextOptions {\n workingdir: string;\n logger: bunyan;\n logBuffer: LogBuffer;\n env: Env;\n cacheManager?: CacheManager;\n runExpoCliCommand: (args: string, options: SpawnOptions) => SpawnPromise<SpawnResult>;\n reportError?: (msg: string, err?: Error) => void;\n skipNativeBuild?: boolean;\n metadata?: Metadata;\n}\n\nexport class SkipNativeBuildError extends Error {}\n\nexport class BuildContext<TJob extends Job> {\n public readonly workingdir: string;\n public logger: bunyan;\n public readonly logBuffer: LogBuffer;\n public readonly env: Env;\n public readonly cacheManager?: CacheManager;\n public readonly runExpoCliCommand: (\n args: string,\n options: SpawnOptions\n ) => SpawnPromise<SpawnResult>;\n public readonly reportError?: (msg: string, err?: Error) => void;\n public readonly metadata?: Metadata;\n public readonly skipNativeBuild?: boolean;\n\n private readonly defaultLogger: bunyan;\n private buildPhase?: BuildPhase;\n private buildPhaseHasWarnings = false;\n private _appConfig?: ExpoConfig;\n\n constructor(public readonly job: TJob, options: BuildContextOptions) {\n this.workingdir = options.workingdir;\n this.defaultLogger = options.logger;\n this.logger = this.defaultLogger;\n this.logBuffer = options.logBuffer;\n this.cacheManager = options.cacheManager;\n this.runExpoCliCommand = options.runExpoCliCommand;\n this.reportError = options.reportError;\n this.metadata = options.metadata;\n this.skipNativeBuild = options.skipNativeBuild;\n this.env = {\n ...options.env,\n ...job?.builderEnvironment?.env,\n ...job?.secrets?.environmentSecrets,\n };\n }\n\n public get buildDirectory(): string {\n return path.join(this.workingdir, 'build');\n }\n public get reactNativeProjectDirectory(): string {\n return path.join(this.buildDirectory, this.job.projectRootDirectory);\n }\n public get packageManager(): PackageManager {\n return resolvePackageManager(this.reactNativeProjectDirectory);\n }\n public get appConfig(): ExpoConfig {\n if (!this._appConfig) {\n this._appConfig = readAppConfig(this.reactNativeProjectDirectory, this.env, this.logger).exp;\n }\n return this._appConfig;\n }\n\n public async runBuildPhase<T>(\n buildPhase: BuildPhase,\n phase: () => Promise<T>,\n {\n doNotMarkStart = false,\n doNotMarkEnd = false,\n onError,\n }: {\n doNotMarkStart?: boolean;\n doNotMarkEnd?: boolean;\n onError?: (err: Error) => void;\n } = {}\n ): Promise<T> {\n try {\n this.setBuildPhase(buildPhase, { doNotMarkStart });\n const result = await phase();\n const buildPhaseResult: BuildPhaseResult = this.buildPhaseHasWarnings\n ? BuildPhaseResult.WARNING\n : BuildPhaseResult.SUCCESS;\n this.endCurrentBuildPhase({ result: buildPhaseResult, doNotMarkEnd });\n return result;\n } catch (err: any) {\n let userError: errors.UserError | undefined;\n if (err instanceof errors.UserError) {\n userError = err;\n } else {\n const detectedError = detectUserError(this.logBuffer.getPhaseLogs(buildPhase), {\n job: this.job,\n phase: buildPhase,\n });\n if (detectedError) {\n detectedError.innerError = err;\n userError = detectedError;\n }\n }\n if (userError) {\n this.logger.error(`Error: ${userError.message}`);\n } else {\n // leaving message empty, website will display err.stack which already includes err.message\n this.logger.error({ err }, '');\n }\n if (onError) {\n onError(userError ?? err);\n }\n this.endCurrentBuildPhase({ result: BuildPhaseResult.FAIL });\n throw userError ?? err;\n }\n }\n\n public markBuildPhaseHasWarnings(): void {\n this.buildPhaseHasWarnings = true;\n }\n\n private setBuildPhase(buildPhase: BuildPhase, { doNotMarkStart = false } = {}): void {\n if (this.buildPhase) {\n if (this.buildPhase === buildPhase) {\n return;\n } else {\n this.logger.info(\n { marker: LogMarker.END_PHASE, result: BuildPhaseResult.UNKNOWN },\n `End phase: ${this.buildPhase}`\n );\n this.logger = this.defaultLogger;\n }\n }\n this.buildPhase = buildPhase;\n this.logger = this.defaultLogger.child({ phase: buildPhase });\n if (!doNotMarkStart) {\n this.logger.info({ marker: LogMarker.START_PHASE }, `Start phase: ${this.buildPhase}`);\n }\n }\n\n private endCurrentBuildPhase({\n result,\n doNotMarkEnd = false,\n }: {\n result: BuildPhaseResult;\n doNotMarkEnd?: boolean;\n }): void {\n if (!this.buildPhase) {\n return;\n }\n if (!doNotMarkEnd) {\n this.logger.info({ marker: LogMarker.END_PHASE, result }, `End phase: ${this.buildPhase}`);\n }\n this.logger = this.defaultLogger;\n this.buildPhase = undefined;\n this.buildPhaseHasWarnings = false;\n }\n}\n"]}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\n\nimport {\n BuildPhase,\n BuildPhaseResult,\n Job,\n LogMarker,\n Env,\n errors,\n Metadata,\n} from '@expo/eas-build-job';\nimport { ExpoConfig } from '@expo/config';\nimport { bunyan } from '@expo/logger';\nimport { SpawnPromise, SpawnOptions, SpawnResult } from '@expo/turtle-spawn';\n\nimport { PackageManager, resolvePackageManager } from './utils/packageManager';\nimport { detectUserError } from './utils/detectUserError';\nimport { readAppConfig } from './utils/appConfig';\n\nexport interface CacheManager {\n saveCache(ctx: BuildContext<Job>): Promise<void>;\n restoreCache(ctx: BuildContext<Job>): Promise<void>;\n}\n\nexport interface LogBuffer {\n getLogs(): string[];\n getPhaseLogs(buildPhase: string): string[];\n}\n\nexport interface BuildContextOptions {\n workingdir: string;\n logger: bunyan;\n logBuffer: LogBuffer;\n env: Env;\n cacheManager?: CacheManager;\n /**\n * @deprecated\n */\n runGlobalExpoCliCommand: (args: string, options: SpawnOptions) => SpawnPromise<SpawnResult>;\n reportError?: (\n msg: string,\n err?: Error,\n options?: { tags?: Record<string, string>; extras?: Record<string, string> }\n ) => void;\n skipNativeBuild?: boolean;\n metadata?: Metadata;\n}\n\nexport class SkipNativeBuildError extends Error {}\n\nexport class BuildContext<TJob extends Job> {\n public readonly workingdir: string;\n public logger: bunyan;\n public readonly logBuffer: LogBuffer;\n public readonly env: Env;\n public readonly cacheManager?: CacheManager;\n /**\n * @deprecated\n */\n public readonly runGlobalExpoCliCommand: (\n args: string,\n options: SpawnOptions\n ) => SpawnPromise<SpawnResult>;\n public readonly reportError?: (\n msg: string,\n err?: Error,\n options?: { tags?: Record<string, string>; extras?: Record<string, string> }\n ) => void;\n public readonly metadata?: Metadata;\n public readonly skipNativeBuild?: boolean;\n\n private readonly defaultLogger: bunyan;\n private buildPhase?: BuildPhase;\n private buildPhaseHasWarnings = false;\n private _appConfig?: ExpoConfig;\n\n constructor(public readonly job: TJob, options: BuildContextOptions) {\n this.workingdir = options.workingdir;\n this.defaultLogger = options.logger;\n this.logger = this.defaultLogger;\n this.logBuffer = options.logBuffer;\n this.cacheManager = options.cacheManager;\n this.runGlobalExpoCliCommand = options.runGlobalExpoCliCommand;\n this.reportError = options.reportError;\n this.metadata = options.metadata;\n this.skipNativeBuild = options.skipNativeBuild;\n this.env = {\n ...options.env,\n ...job?.builderEnvironment?.env,\n ...job?.secrets?.environmentSecrets,\n };\n }\n\n public get buildDirectory(): string {\n return path.join(this.workingdir, 'build');\n }\n public get reactNativeProjectDirectory(): string {\n return path.join(this.buildDirectory, this.job.projectRootDirectory);\n }\n public get packageManager(): PackageManager {\n return resolvePackageManager(this.reactNativeProjectDirectory);\n }\n public get appConfig(): ExpoConfig {\n if (!this._appConfig) {\n this._appConfig = readAppConfig(this.reactNativeProjectDirectory, this.env, this.logger).exp;\n }\n return this._appConfig;\n }\n\n public async runBuildPhase<T>(\n buildPhase: BuildPhase,\n phase: () => Promise<T>,\n {\n doNotMarkStart = false,\n doNotMarkEnd = false,\n onError,\n }: {\n doNotMarkStart?: boolean;\n doNotMarkEnd?: boolean;\n onError?: (err: Error, logLines: string[]) => void;\n } = {}\n ): Promise<T> {\n try {\n this.setBuildPhase(buildPhase, { doNotMarkStart });\n const result = await phase();\n const buildPhaseResult: BuildPhaseResult = this.buildPhaseHasWarnings\n ? BuildPhaseResult.WARNING\n : BuildPhaseResult.SUCCESS;\n this.endCurrentBuildPhase({ result: buildPhaseResult, doNotMarkEnd });\n return result;\n } catch (err: any) {\n let userError: errors.UserError | undefined;\n if (err instanceof errors.UserError) {\n userError = err;\n } else {\n const detectedError = detectUserError(this.logBuffer.getPhaseLogs(buildPhase), {\n job: this.job,\n phase: buildPhase,\n });\n if (detectedError) {\n detectedError.innerError = err;\n userError = detectedError;\n }\n }\n if (userError) {\n this.logger.error(`Error: ${userError.message}`);\n } else {\n // leaving message empty, website will display err.stack which already includes err.message\n this.logger.error({ err }, '');\n }\n if (onError) {\n onError(userError ?? err, this.logBuffer.getPhaseLogs(buildPhase));\n }\n this.endCurrentBuildPhase({ result: BuildPhaseResult.FAIL });\n throw userError ?? err;\n }\n }\n\n public markBuildPhaseHasWarnings(): void {\n this.buildPhaseHasWarnings = true;\n }\n\n private setBuildPhase(buildPhase: BuildPhase, { doNotMarkStart = false } = {}): void {\n if (this.buildPhase) {\n if (this.buildPhase === buildPhase) {\n return;\n } else {\n this.logger.info(\n { marker: LogMarker.END_PHASE, result: BuildPhaseResult.UNKNOWN },\n `End phase: ${this.buildPhase}`\n );\n this.logger = this.defaultLogger;\n }\n }\n this.buildPhase = buildPhase;\n this.logger = this.defaultLogger.child({ phase: buildPhase });\n if (!doNotMarkStart) {\n this.logger.info({ marker: LogMarker.START_PHASE }, `Start phase: ${this.buildPhase}`);\n }\n }\n\n private endCurrentBuildPhase({\n result,\n doNotMarkEnd = false,\n }: {\n result: BuildPhaseResult;\n doNotMarkEnd?: boolean;\n }): void {\n if (!this.buildPhase) {\n return;\n }\n if (!doNotMarkEnd) {\n this.logger.info({ marker: LogMarker.END_PHASE, result }, `End phase: ${this.buildPhase}`);\n }\n this.logger = this.defaultLogger;\n this.buildPhase = undefined;\n this.buildPhaseHasWarnings = false;\n }\n}\n"]}
@@ -1,8 +1,9 @@
1
1
  import { Ios } from '@expo/eas-build-job';
2
2
  import { BuildContext } from '../context';
3
3
  import { Credentials } from './credentials/manager';
4
- declare function configureXcodeProject<TJob extends Ios.Job>(ctx: BuildContext<TJob>, { credentials, buildConfiguration, }: {
4
+ declare function configureXcodeProject(ctx: BuildContext<Ios.Job>, { credentials, buildConfiguration, }: {
5
5
  credentials: Credentials;
6
- buildConfiguration?: string;
6
+ buildConfiguration: string;
7
7
  }): Promise<void>;
8
+ export declare function evaluateTemplateString(s: string, buildSettings: Record<string, string>): string;
8
9
  export { configureXcodeProject };
@@ -1,9 +1,30 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.configureXcodeProject = void 0;
6
+ exports.configureXcodeProject = exports.evaluateTemplateString = void 0;
7
+ const path_1 = __importDefault(require("path"));
4
8
  const config_plugins_1 = require("@expo/config-plugins");
9
+ const uniq_1 = __importDefault(require("lodash/uniq"));
10
+ const fs_extra_1 = __importDefault(require("fs-extra"));
11
+ const plist_1 = __importDefault(require("@expo/plist"));
5
12
  async function configureXcodeProject(ctx, { credentials, buildConfiguration, }) {
6
13
  ctx.logger.info('Configuring Xcode project');
14
+ await configureCredentialsAsync(ctx, {
15
+ credentials,
16
+ buildConfiguration,
17
+ });
18
+ const { version } = ctx.job;
19
+ if ((version === null || version === void 0 ? void 0 : version.appVersion) || (version === null || version === void 0 ? void 0 : version.buildNumber)) {
20
+ await updateVersionsAsync(ctx, {
21
+ targetNames: Object.keys(credentials.targetProvisioningProfiles),
22
+ buildConfiguration,
23
+ });
24
+ }
25
+ }
26
+ exports.configureXcodeProject = configureXcodeProject;
27
+ async function configureCredentialsAsync(ctx, { credentials, buildConfiguration, }) {
7
28
  const targetNames = Object.keys(credentials.targetProvisioningProfiles);
8
29
  for (const targetName of targetNames) {
9
30
  const profile = credentials.targetProvisioningProfiles[targetName];
@@ -16,5 +37,56 @@ async function configureXcodeProject(ctx, { credentials, buildConfiguration, })
16
37
  });
17
38
  }
18
39
  }
19
- exports.configureXcodeProject = configureXcodeProject;
40
+ async function updateVersionsAsync(ctx, { targetNames, buildConfiguration, }) {
41
+ var _a, _b, _c, _d;
42
+ const project = config_plugins_1.IOSConfig.XcodeUtils.getPbxproj(ctx.reactNativeProjectDirectory);
43
+ const iosDir = path_1.default.join(ctx.reactNativeProjectDirectory, 'ios');
44
+ const infoPlistPaths = [];
45
+ for (const targetName of targetNames) {
46
+ const xcBuildConfiguration = config_plugins_1.IOSConfig.Target.getXCBuildConfigurationFromPbxproj(project, {
47
+ targetName,
48
+ buildConfiguration,
49
+ });
50
+ const infoPlist = xcBuildConfiguration.buildSettings.INFOPLIST_FILE;
51
+ if (infoPlist) {
52
+ const evaluatedInfoPlistPath = trimQuotes(evaluateTemplateString(infoPlist, {
53
+ SRCROOT: iosDir,
54
+ }));
55
+ const absolutePath = path_1.default.isAbsolute(evaluatedInfoPlistPath)
56
+ ? evaluatedInfoPlistPath
57
+ : path_1.default.join(iosDir, evaluatedInfoPlistPath);
58
+ infoPlistPaths.push(path_1.default.normalize(absolutePath));
59
+ }
60
+ }
61
+ const uniqueInfoPlistPaths = (0, uniq_1.default)(infoPlistPaths);
62
+ for (const infoPlistPath of uniqueInfoPlistPaths) {
63
+ ctx.logger.info(`Updating versions in ${infoPlistPath}`);
64
+ const infoPlistRaw = await fs_extra_1.default.readFile(infoPlistPath, 'utf-8');
65
+ const infoPlist = plist_1.default.parse(infoPlistRaw);
66
+ if ((_a = ctx.job.version) === null || _a === void 0 ? void 0 : _a.buildNumber) {
67
+ infoPlist.CFBundleVersion = (_b = ctx.job.version) === null || _b === void 0 ? void 0 : _b.buildNumber;
68
+ }
69
+ if ((_c = ctx.job.version) === null || _c === void 0 ? void 0 : _c.appVersion) {
70
+ infoPlist.CFBundleShortVersionString = (_d = ctx.job.version) === null || _d === void 0 ? void 0 : _d.appVersion;
71
+ }
72
+ await fs_extra_1.default.writeFile(infoPlistPath, plist_1.default.build(infoPlist));
73
+ }
74
+ }
75
+ function trimQuotes(s) {
76
+ return (s === null || s === void 0 ? void 0 : s.startsWith('"')) && s.endsWith('"') ? s.slice(1, -1) : s;
77
+ }
78
+ function evaluateTemplateString(s, buildSettings) {
79
+ // necessary because buildSettings might be XCBuildConfiguration['buildSettings'] which is not a plain object
80
+ const vars = Object.assign({}, buildSettings);
81
+ return s.replace(/\$\((\w+)\)/g, (match, key) => {
82
+ if (vars.hasOwnProperty(key)) {
83
+ const value = String(vars[key]);
84
+ return trimQuotes(value);
85
+ }
86
+ else {
87
+ return match;
88
+ }
89
+ });
90
+ }
91
+ exports.evaluateTemplateString = evaluateTemplateString;
20
92
  //# sourceMappingURL=configure.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"configure.js","sourceRoot":"","sources":["../../src/ios/configure.ts"],"names":[],"mappings":";;;AAAA,yDAAiD;AAOjD,KAAK,UAAU,qBAAqB,CAClC,GAAuB,EACvB,EACE,WAAW,EACX,kBAAkB,GAInB;IAED,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC;IACxE,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;QACpC,MAAM,OAAO,GAAG,WAAW,CAAC,0BAA0B,CAAC,UAAU,CAAC,CAAC;QACnE,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,mCAAmC,OAAO,CAAC,IAAI,qBAAqB,OAAO,CAAC,MAAM,gBAAgB,UAAU,GAAG,CAChH,CAAC;QACF,0BAAS,CAAC,mBAAmB,CAAC,gCAAgC,CAC5D,GAAG,CAAC,2BAA2B,EAC/B;YACE,UAAU;YACV,WAAW,EAAE,OAAO,CAAC,IAAI;YACzB,WAAW,EAAE,OAAO,CAAC,MAAM;YAC3B,kBAAkB;SACnB,CACF,CAAC;KACH;AACH,CAAC;AAEQ,sDAAqB","sourcesContent":["import { IOSConfig } from '@expo/config-plugins';\nimport { Ios } from '@expo/eas-build-job';\n\nimport { BuildContext } from '../context';\n\nimport { Credentials } from './credentials/manager';\n\nasync function configureXcodeProject<TJob extends Ios.Job>(\n ctx: BuildContext<TJob>,\n {\n credentials,\n buildConfiguration,\n }: {\n credentials: Credentials;\n buildConfiguration?: string;\n }\n): Promise<void> {\n ctx.logger.info('Configuring Xcode project');\n const targetNames = Object.keys(credentials.targetProvisioningProfiles);\n for (const targetName of targetNames) {\n const profile = credentials.targetProvisioningProfiles[targetName];\n ctx.logger.info(\n `Assigning provisioning profile '${profile.name}' (Apple Team ID: ${profile.teamId}) to target '${targetName}'`\n );\n IOSConfig.ProvisioningProfile.setProvisioningProfileForPbxproj(\n ctx.reactNativeProjectDirectory,\n {\n targetName,\n profileName: profile.name,\n appleTeamId: profile.teamId,\n buildConfiguration,\n }\n );\n }\n}\n\nexport { configureXcodeProject };\n"]}
1
+ {"version":3,"file":"configure.js","sourceRoot":"","sources":["../../src/ios/configure.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\n\nimport { IOSConfig } from '@expo/config-plugins';\nimport { Ios } from '@expo/eas-build-job';\nimport uniq from 'lodash/uniq';\nimport fs from 'fs-extra';\nimport plist from '@expo/plist';\n\nimport { BuildContext } from '../context';\n\nimport { Credentials } from './credentials/manager';\n\nasync function configureXcodeProject(\n ctx: BuildContext<Ios.Job>,\n {\n credentials,\n buildConfiguration,\n }: {\n credentials: Credentials;\n buildConfiguration: string;\n }\n): Promise<void> {\n ctx.logger.info('Configuring Xcode project');\n await configureCredentialsAsync(ctx, {\n credentials,\n buildConfiguration,\n });\n const { version } = ctx.job;\n if (version?.appVersion || version?.buildNumber) {\n await updateVersionsAsync(ctx, {\n targetNames: Object.keys(credentials.targetProvisioningProfiles),\n buildConfiguration,\n });\n }\n}\n\nasync function configureCredentialsAsync(\n ctx: BuildContext<Ios.Job>,\n {\n credentials,\n buildConfiguration,\n }: {\n credentials: Credentials;\n buildConfiguration: string;\n }\n): Promise<void> {\n const targetNames = Object.keys(credentials.targetProvisioningProfiles);\n for (const targetName of targetNames) {\n const profile = credentials.targetProvisioningProfiles[targetName];\n ctx.logger.info(\n `Assigning provisioning profile '${profile.name}' (Apple Team ID: ${profile.teamId}) to target '${targetName}'`\n );\n IOSConfig.ProvisioningProfile.setProvisioningProfileForPbxproj(\n ctx.reactNativeProjectDirectory,\n {\n targetName,\n profileName: profile.name,\n appleTeamId: profile.teamId,\n buildConfiguration,\n }\n );\n }\n}\n\nasync function updateVersionsAsync(\n ctx: BuildContext<Ios.Job>,\n {\n targetNames,\n buildConfiguration,\n }: {\n targetNames: string[];\n buildConfiguration: string;\n }\n): Promise<void> {\n const project = IOSConfig.XcodeUtils.getPbxproj(ctx.reactNativeProjectDirectory);\n const iosDir = path.join(ctx.reactNativeProjectDirectory, 'ios');\n\n const infoPlistPaths: string[] = [];\n for (const targetName of targetNames) {\n const xcBuildConfiguration = IOSConfig.Target.getXCBuildConfigurationFromPbxproj(project, {\n targetName,\n buildConfiguration,\n });\n const infoPlist = xcBuildConfiguration.buildSettings.INFOPLIST_FILE;\n if (infoPlist) {\n const evaluatedInfoPlistPath = trimQuotes(\n evaluateTemplateString(infoPlist, {\n SRCROOT: iosDir,\n })\n );\n const absolutePath = path.isAbsolute(evaluatedInfoPlistPath)\n ? evaluatedInfoPlistPath\n : path.join(iosDir, evaluatedInfoPlistPath);\n infoPlistPaths.push(path.normalize(absolutePath));\n }\n }\n const uniqueInfoPlistPaths = uniq(infoPlistPaths);\n for (const infoPlistPath of uniqueInfoPlistPaths) {\n ctx.logger.info(`Updating versions in ${infoPlistPath}`);\n const infoPlistRaw = await fs.readFile(infoPlistPath, 'utf-8');\n const infoPlist = plist.parse(infoPlistRaw) as IOSConfig.InfoPlist;\n if (ctx.job.version?.buildNumber) {\n infoPlist.CFBundleVersion = ctx.job.version?.buildNumber;\n }\n if (ctx.job.version?.appVersion) {\n infoPlist.CFBundleShortVersionString = ctx.job.version?.appVersion;\n }\n await fs.writeFile(infoPlistPath, plist.build(infoPlist));\n }\n}\n\nfunction trimQuotes(s: string): string {\n return s?.startsWith('\"') && s.endsWith('\"') ? s.slice(1, -1) : s;\n}\n\nexport function evaluateTemplateString(s: string, buildSettings: Record<string, string>): string {\n // necessary because buildSettings might be XCBuildConfiguration['buildSettings'] which is not a plain object\n const vars = { ...buildSettings };\n return s.replace(/\\$\\((\\w+)\\)/g, (match, key) => {\n if (vars.hasOwnProperty(key)) {\n const value = String(vars[key]);\n return trimQuotes(value);\n } else {\n return match;\n }\n });\n}\n\nexport { configureXcodeProject };\n"]}
@@ -5,6 +5,7 @@ export declare enum IosMetadataName {
5
5
  RELEASE_CHANNEL = "EXUpdatesReleaseChannel",
6
6
  RUNTIME_VERSION = "EXUpdatesRuntimeVersion"
7
7
  }
8
+ export declare function iosSetRuntimeVersionNativelyAsync(ctx: BuildContext<Job>, runtimeVersion: string): Promise<void>;
8
9
  export declare function iosSetChannelNativelyAsync(ctx: BuildContext<Job>): Promise<void>;
9
10
  export declare function iosSetClassicReleaseChannelNativelyAsync(ctx: BuildContext<Job>): Promise<void>;
10
11
  export declare function iosGetNativelyDefinedClassicReleaseChannelAsync(ctx: BuildContext<Job>): Promise<string | null>;