@expo/build-tools 0.1.118 → 0.1.121
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/android/expoUpdates.d.ts +0 -1
- package/dist/android/expoUpdates.js +1 -16
- package/dist/android/expoUpdates.js.map +1 -1
- package/dist/ios/credentials/keychain.d.ts +1 -2
- package/dist/ios/credentials/keychain.js +4 -4
- package/dist/ios/credentials/keychain.js.map +1 -1
- package/dist/ios/fastlane.d.ts +7 -0
- package/dist/ios/fastlane.js +13 -4
- package/dist/ios/fastlane.js.map +1 -1
- package/package.json +2 -3
|
@@ -9,4 +9,3 @@ export declare function androidSetChannelNativelyAsync(ctx: BuildContext<Job>):
|
|
|
9
9
|
export declare function androidSetClassicReleaseChannelNativelyAsync(ctx: BuildContext<Job>): Promise<void>;
|
|
10
10
|
export declare function androidGetNativelyDefinedClassicReleaseChannelAsync(ctx: BuildContext<Job>): Promise<string | null>;
|
|
11
11
|
export declare function androidGetNativelyDefinedRuntimeVersionAsync(ctx: BuildContext<Job>): Promise<string | null>;
|
|
12
|
-
export declare function unescapeAndroidString(value: 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.
|
|
6
|
+
exports.androidGetNativelyDefinedRuntimeVersionAsync = exports.androidGetNativelyDefinedClassicReleaseChannelAsync = exports.androidSetClassicReleaseChannelNativelyAsync = exports.androidSetChannelNativelyAsync = 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");
|
|
@@ -28,7 +28,6 @@ async function androidSetChannelNativelyAsync(ctx) {
|
|
|
28
28
|
}
|
|
29
29
|
exports.androidSetChannelNativelyAsync = androidSetChannelNativelyAsync;
|
|
30
30
|
async function androidSetClassicReleaseChannelNativelyAsync(ctx) {
|
|
31
|
-
var _a, _b;
|
|
32
31
|
const { releaseChannel } = ctx.job;
|
|
33
32
|
(0, assert_1.default)(releaseChannel, 'releaseChannel must be defined');
|
|
34
33
|
const escapedReleaseChannel = config_plugins_1.XML.escapeAndroidString(releaseChannel);
|
|
@@ -41,15 +40,6 @@ async function androidSetClassicReleaseChannelNativelyAsync(ctx) {
|
|
|
41
40
|
const stringResourceObject = await config_plugins_1.AndroidConfig.Resources.readResourcesXMLAsync({
|
|
42
41
|
path: stringResourcePath,
|
|
43
42
|
});
|
|
44
|
-
// TODO move this to expo-cli
|
|
45
|
-
if (Array.isArray((_a = stringResourceObject === null || stringResourceObject === void 0 ? void 0 : stringResourceObject.resources) === null || _a === void 0 ? void 0 : _a.string)) {
|
|
46
|
-
for (const string of (_b = stringResourceObject === null || stringResourceObject === void 0 ? void 0 : stringResourceObject.resources) === null || _b === void 0 ? void 0 : _b.string) {
|
|
47
|
-
if (string.$.translatable === 'false') {
|
|
48
|
-
continue;
|
|
49
|
-
}
|
|
50
|
-
string._ = unescapeAndroidString(string._);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
43
|
const resourceName = 'release_channel';
|
|
54
44
|
const releaseChannelResourceItem = config_plugins_1.AndroidConfig.Resources.buildResourceItem({
|
|
55
45
|
name: resourceName,
|
|
@@ -81,9 +71,4 @@ async function androidGetNativelyDefinedRuntimeVersionAsync(ctx) {
|
|
|
81
71
|
return config_plugins_1.AndroidConfig.Manifest.getMainApplicationMetaDataValue(androidManifest, AndroidMetadataName.RUNTIME_VERSION);
|
|
82
72
|
}
|
|
83
73
|
exports.androidGetNativelyDefinedRuntimeVersionAsync = androidGetNativelyDefinedRuntimeVersionAsync;
|
|
84
|
-
// TODO move this to expo-cli
|
|
85
|
-
function unescapeAndroidString(value) {
|
|
86
|
-
return value.replace(/\\(.)/g, '$1');
|
|
87
|
-
}
|
|
88
|
-
exports.unescapeAndroidString = unescapeAndroidString;
|
|
89
74
|
//# sourceMappingURL=expoUpdates.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expoUpdates.js","sourceRoot":"","sources":["../../src/android/expoUpdates.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAE5B,wDAA0B;AAC1B,yDAA0D;AAK1D,IAAY,mBAIX;AAJD,WAAY,mBAAmB;IAC7B,mIAA4G,CAAA;IAC5G,oFAA6D,CAAA;IAC7D,oFAA6D,CAAA;AAC/D,CAAC,EAJW,mBAAmB,GAAnB,2BAAmB,KAAnB,2BAAmB,QAI9B;AAEM,KAAK,UAAU,8BAA8B,CAAC,GAAsB;;IACzE,IAAA,gBAAM,EAAC,MAAA,GAAG,CAAC,GAAG,CAAC,OAAO,0CAAE,OAAO,EAAE,iCAAiC,CAAC,CAAC;IAEpE,MAAM,YAAY,GAAG,MAAM,8BAAa,CAAC,KAAK,CAAC,uBAAuB,CACpE,GAAG,CAAC,2BAA2B,CAChC,CAAC;IAEF,IAAI,CAAC,CAAC,MAAM,kBAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE;QACxC,MAAM,IAAI,KAAK,CAAC,qCAAqC,YAAY,EAAE,CAAC,CAAC;KACtE;IAED,MAAM,eAAe,GAAG,MAAM,8BAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,YAAY,CAAC,CAAC;IAC5F,MAAM,OAAO,GAAG,8BAAa,CAAC,QAAQ,CAAC,yBAAyB,CAAC,eAAe,CAAC,CAAC;IAClF,MAAM,gCAAgC,GAAG,8BAAa,CAAC,QAAQ,CAAC,+BAA+B,CAC7F,eAAe,EACf,mBAAmB,CAAC,yCAAyC,CAC9D,CAAC;IACF,8BAAa,CAAC,QAAQ,CAAC,gCAAgC,CACrD,OAAO,EACP,mBAAmB,CAAC,yCAAyC,EAC7D,IAAI,CAAC,SAAS,iCACT,IAAI,CAAC,KAAK,CAAC,gCAAgC,aAAhC,gCAAgC,cAAhC,gCAAgC,GAAI,IAAI,CAAC,KACvD,mBAAmB,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,IAC5C,EACF,OAAO,CACR,CAAC;IACF,MAAM,8BAAa,CAAC,QAAQ,CAAC,yBAAyB,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;AACxF,CAAC;AA3BD,wEA2BC;AAEM,KAAK,UAAU,4CAA4C,CAChE,GAAsB
|
|
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,6 +1,6 @@
|
|
|
1
1
|
import { Ios } from '@expo/eas-build-job';
|
|
2
2
|
import { BuildContext } from '../../context';
|
|
3
|
-
|
|
3
|
+
export default class Keychain<TJob extends Ios.Job> {
|
|
4
4
|
private readonly ctx;
|
|
5
5
|
private readonly keychainPath;
|
|
6
6
|
private readonly keychainPassword;
|
|
@@ -18,4 +18,3 @@ declare class Keychain<TJob extends Ios.Job> {
|
|
|
18
18
|
cleanUpKeychains(): Promise<void>;
|
|
19
19
|
private findIdentitiesByTeamId;
|
|
20
20
|
}
|
|
21
|
-
export default Keychain;
|
|
@@ -5,9 +5,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const os_1 = __importDefault(require("os"));
|
|
7
7
|
const path_1 = __importDefault(require("path"));
|
|
8
|
-
const fastlane_1 = __importDefault(require("@expo/fastlane"));
|
|
9
8
|
const turtle_spawn_1 = __importDefault(require("@expo/turtle-spawn"));
|
|
10
9
|
const uuid_1 = require("uuid");
|
|
10
|
+
const fastlane_1 = require("../fastlane");
|
|
11
11
|
class Keychain {
|
|
12
12
|
constructor(ctx) {
|
|
13
13
|
this.ctx = ctx;
|
|
@@ -24,7 +24,7 @@ class Keychain {
|
|
|
24
24
|
}
|
|
25
25
|
async create() {
|
|
26
26
|
this.ctx.logger.debug(`Creating keychain - ${this.keychainPath}`);
|
|
27
|
-
await (0, fastlane_1.
|
|
27
|
+
await (0, fastlane_1.runFastlane)([
|
|
28
28
|
'run',
|
|
29
29
|
'create_keychain',
|
|
30
30
|
`path:${this.keychainPath}`,
|
|
@@ -39,7 +39,7 @@ class Keychain {
|
|
|
39
39
|
throw new Error('You must create a keychain first.');
|
|
40
40
|
}
|
|
41
41
|
this.ctx.logger.debug(`Importing certificate ${certPath} into keychain ${this.keychainPath}`);
|
|
42
|
-
await (0, fastlane_1.
|
|
42
|
+
await (0, fastlane_1.runFastlane)([
|
|
43
43
|
'run',
|
|
44
44
|
'import_certificate',
|
|
45
45
|
`certificate_path:${certPath}`,
|
|
@@ -66,7 +66,7 @@ class Keychain {
|
|
|
66
66
|
const keychainToDeletePath = keychainPath !== null && keychainPath !== void 0 ? keychainPath : this.keychainPath;
|
|
67
67
|
this.ctx.logger.info(`Destroying keychain - ${keychainToDeletePath}`);
|
|
68
68
|
try {
|
|
69
|
-
await (0, fastlane_1.
|
|
69
|
+
await (0, fastlane_1.runFastlane)(['run', 'delete_keychain', `keychain_path:${keychainToDeletePath}`]);
|
|
70
70
|
this.destroyed = true;
|
|
71
71
|
}
|
|
72
72
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../../src/ios/credentials/keychain.ts"],"names":[],"mappings":";;;;;AAAA,4CAAoB;AACpB,gDAAwB;
|
|
1
|
+
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../../src/ios/credentials/keychain.ts"],"names":[],"mappings":"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","sourcesContent":["import os from 'os';\nimport path from 'path';\n\nimport { Ios } from '@expo/eas-build-job';\nimport spawn from '@expo/turtle-spawn';\nimport { v4 as uuid } from 'uuid';\n\nimport { BuildContext } from '../../context';\nimport { runFastlane } from '../fastlane';\n\nexport default class Keychain<TJob extends Ios.Job> {\n private readonly keychainPath: string;\n private readonly keychainPassword: string;\n private created = false;\n private destroyed = false;\n\n constructor(private readonly ctx: BuildContext<TJob>) {\n this.keychainPath = path.join(os.tmpdir(), `turtle-v2-${uuid()}.keychain`);\n this.keychainPassword = uuid();\n }\n\n get data(): { path: string; password: string } {\n return {\n path: this.keychainPath,\n password: this.keychainPassword,\n };\n }\n\n public async create(): Promise<void> {\n this.ctx.logger.debug(`Creating keychain - ${this.keychainPath}`);\n await runFastlane([\n 'run',\n 'create_keychain',\n `path:${this.keychainPath}`,\n `password:${this.keychainPassword}`,\n 'unlock:true',\n 'timeout:360000',\n ]);\n this.created = true;\n }\n\n public async importCertificate(certPath: string, certPassword: string): Promise<void> {\n if (!this.created) {\n throw new Error('You must create a keychain first.');\n }\n\n this.ctx.logger.debug(`Importing certificate ${certPath} into keychain ${this.keychainPath}`);\n await runFastlane([\n 'run',\n 'import_certificate',\n `certificate_path:${certPath}`,\n `certificate_password:${certPassword}`,\n `keychain_path:${this.keychainPath}`,\n `keychain_password:${this.keychainPassword}`,\n ]);\n }\n\n public async ensureCertificateImported(teamId: string, fingerprint: string): Promise<void> {\n const identities = await this.findIdentitiesByTeamId(teamId);\n if (!identities.includes(fingerprint)) {\n throw new Error(\n `Distribution certificate with fingerprint ${fingerprint} hasn't been imported successfully`\n );\n }\n }\n\n public async destroy(keychainPath?: string): Promise<void> {\n if (!keychainPath && !this.created) {\n this.ctx.logger.warn(\"There is nothing to destroy, a keychain hasn't been created yet.\");\n return;\n }\n if (this.destroyed) {\n this.ctx.logger.warn('The keychain has been already destroyed');\n return;\n }\n const keychainToDeletePath = keychainPath ?? this.keychainPath;\n this.ctx.logger.info(`Destroying keychain - ${keychainToDeletePath}`);\n try {\n await runFastlane(['run', 'delete_keychain', `keychain_path:${keychainToDeletePath}`]);\n this.destroyed = true;\n } catch (err) {\n this.ctx.logger.error({ err }, 'Failed to delete the keychain\\n');\n throw err;\n }\n }\n\n public async cleanUpKeychains(): Promise<void> {\n const { stdout } = await spawn('security', ['list-keychains'], { stdio: 'pipe' });\n const keychainList = (/\"(.*)\"/g.exec(stdout) ?? ([] as string[])).map((i) =>\n i.slice(1, i.length - 1)\n );\n const turtleKeychainList = keychainList.filter((keychain) =>\n /turtle-v2-[\\w-]+\\.keychain$/.exec(keychain)\n );\n for (const turtleKeychainPath of turtleKeychainList) {\n await this.destroy(turtleKeychainPath);\n }\n }\n\n private async findIdentitiesByTeamId(teamId: string): Promise<string> {\n const { output } = await spawn(\n 'security',\n ['find-identity', '-v', '-s', `(${teamId})`, this.keychainPath],\n {\n stdio: 'pipe',\n }\n );\n return output.join('');\n }\n}\n"]}
|
package/dist/ios/fastlane.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { Ios } from '@expo/eas-build-job';
|
|
2
|
+
import { bunyan } from '@expo/logger';
|
|
3
|
+
import { SpawnResult } from '@expo/turtle-spawn';
|
|
2
4
|
import { BuildContext } from '../context';
|
|
3
5
|
import { Credentials } from './credentials/manager';
|
|
4
6
|
export declare function runFastlaneGym<TJob extends Ios.Job>(ctx: BuildContext<TJob>, { scheme, buildConfiguration, credentials, entitlements, }: {
|
|
@@ -7,3 +9,8 @@ export declare function runFastlaneGym<TJob extends Ios.Job>(ctx: BuildContext<T
|
|
|
7
9
|
credentials: Credentials | null;
|
|
8
10
|
entitlements: object | null;
|
|
9
11
|
}): Promise<void>;
|
|
12
|
+
export declare function runFastlane(fastlaneArgs: string[], { logger, env, cwd, }?: {
|
|
13
|
+
logger?: bunyan;
|
|
14
|
+
env?: Record<string, string>;
|
|
15
|
+
cwd?: string;
|
|
16
|
+
}): Promise<SpawnResult>;
|
package/dist/ios/fastlane.js
CHANGED
|
@@ -3,9 +3,9 @@ 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.runFastlaneGym = void 0;
|
|
6
|
+
exports.runFastlane = exports.runFastlaneGym = void 0;
|
|
7
7
|
const path_1 = __importDefault(require("path"));
|
|
8
|
-
const
|
|
8
|
+
const turtle_spawn_1 = __importDefault(require("@expo/turtle-spawn"));
|
|
9
9
|
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
10
10
|
const nullthrows_1 = __importDefault(require("nullthrows"));
|
|
11
11
|
const context_1 = require("../context");
|
|
@@ -26,10 +26,10 @@ async function runFastlaneGym(ctx, { scheme, buildConfiguration, credentials, en
|
|
|
26
26
|
const buildLogger = new xcpretty_1.XcodeBuildLogger(ctx.logger, ctx.reactNativeProjectDirectory);
|
|
27
27
|
void buildLogger.watchLogFiles(logsDirectory);
|
|
28
28
|
try {
|
|
29
|
-
await (
|
|
29
|
+
await runFastlane(['gym'], {
|
|
30
30
|
cwd: path_1.default.join(ctx.reactNativeProjectDirectory, 'ios'),
|
|
31
31
|
logger: ctx.logger,
|
|
32
|
-
|
|
32
|
+
env: ctx.env,
|
|
33
33
|
});
|
|
34
34
|
}
|
|
35
35
|
finally {
|
|
@@ -37,6 +37,15 @@ async function runFastlaneGym(ctx, { scheme, buildConfiguration, credentials, en
|
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
exports.runFastlaneGym = runFastlaneGym;
|
|
40
|
+
async function runFastlane(fastlaneArgs, { logger, env, cwd, } = {}) {
|
|
41
|
+
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
|
+
return await (0, turtle_spawn_1.default)('fastlane', fastlaneArgs, {
|
|
43
|
+
env: fastlaneEnvVars,
|
|
44
|
+
logger,
|
|
45
|
+
cwd,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
exports.runFastlane = runFastlane;
|
|
40
49
|
async function ensureGymfileExists(ctx, { scheme, buildConfiguration, credentials, logsDirectory, entitlements, }) {
|
|
41
50
|
const gymfilePath = path_1.default.join(ctx.reactNativeProjectDirectory, 'ios/Gymfile');
|
|
42
51
|
if (await fs_extra_1.default.pathExists(gymfilePath)) {
|
package/dist/ios/fastlane.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fastlane.js","sourceRoot":"","sources":["../../src/ios/fastlane.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;
|
|
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';\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 const logsDirectory = path.join(ctx.workingdir, 'logs');\n await ensureGymfileExists(ctx, {\n scheme,\n buildConfiguration,\n credentials,\n logsDirectory,\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(logsDirectory);\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 await createGymfileForSimulatorBuild({\n outputFile: gymfilePath,\n scheme,\n buildConfiguration: buildConfiguration ?? 'release',\n derivedDataPath: './build',\n clean: false,\n logsDirectory,\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 ctx.logger.info('Gymfile created');\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@expo/build-tools",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.121",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"files": [
|
|
@@ -22,8 +22,7 @@
|
|
|
22
22
|
"@expo/config": "6.0.19",
|
|
23
23
|
"@expo/config-plugins": "4.1.0",
|
|
24
24
|
"@expo/downloader": "0.0.19",
|
|
25
|
-
"@expo/eas-build-job": "0.2.
|
|
26
|
-
"@expo/fastlane": "0.0.28",
|
|
25
|
+
"@expo/eas-build-job": "0.2.71",
|
|
27
26
|
"@expo/logger": "0.0.22",
|
|
28
27
|
"@expo/package-manager": "^0.0.47",
|
|
29
28
|
"@expo/plist": "^0.0.11",
|