@expo/build-tools 1.0.207 → 1.0.208
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.
|
@@ -13,6 +13,7 @@ const downloader_1 = __importDefault(require("@expo/downloader"));
|
|
|
13
13
|
const zod_1 = require("zod");
|
|
14
14
|
const results_1 = require("@expo/results");
|
|
15
15
|
const nullthrows_1 = __importDefault(require("nullthrows"));
|
|
16
|
+
const gql_tada_1 = require("gql.tada");
|
|
16
17
|
const turtleFetch_1 = require("../utils/turtleFetch");
|
|
17
18
|
const git_1 = require("./git");
|
|
18
19
|
async function prepareProjectSourcesAsync(ctx, destinationDirectory = ctx.buildDirectory) {
|
|
@@ -42,6 +43,10 @@ async function prepareProjectSourcesAsync(ctx, destinationDirectory = ctx.buildD
|
|
|
42
43
|
destinationDirectory,
|
|
43
44
|
});
|
|
44
45
|
}
|
|
46
|
+
const uploadResult = await (0, results_1.asyncResult)(uploadProjectMetadataAsync(ctx, { projectDirectory: destinationDirectory }));
|
|
47
|
+
if (!uploadResult.ok) {
|
|
48
|
+
ctx.logger.warn(`Failed to upload project metadata: ${uploadResult.reason}`);
|
|
49
|
+
}
|
|
45
50
|
}
|
|
46
51
|
async function fetchRepositoryUrlAsync(ctx) {
|
|
47
52
|
var _a;
|
|
@@ -109,4 +114,87 @@ async function unpackTarGzAsync({ logger, source, destination, }) {
|
|
|
109
114
|
logger,
|
|
110
115
|
});
|
|
111
116
|
}
|
|
117
|
+
async function uploadProjectMetadataAsync(ctx, { projectDirectory }) {
|
|
118
|
+
if (!ctx.job.platform) {
|
|
119
|
+
// Not a build job, skip.
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
else if (ctx.job.projectArchive.type === eas_build_job_1.ArchiveSourceType.GCS &&
|
|
123
|
+
ctx.job.projectArchive.metadataLocation) {
|
|
124
|
+
// Build already has project metadata, skip.
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const files = [];
|
|
128
|
+
const directoriesToScan = [
|
|
129
|
+
{ dir: projectDirectory, relativePath: '' },
|
|
130
|
+
];
|
|
131
|
+
while (directoriesToScan.length > 0) {
|
|
132
|
+
const { dir, relativePath } = directoriesToScan.shift();
|
|
133
|
+
if (relativePath === '.git') {
|
|
134
|
+
// Do not include whole `.git` directory in the archive, just that it exists.
|
|
135
|
+
files.push('.git/...');
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
const entries = await fs_extra_1.default.readdir(dir, { withFileTypes: true });
|
|
139
|
+
for (const entry of entries) {
|
|
140
|
+
const fullPath = path_1.default.join(dir, entry.name);
|
|
141
|
+
const relativeFilePath = path_1.default.join(relativePath, entry.name);
|
|
142
|
+
if (entry.isDirectory()) {
|
|
143
|
+
directoriesToScan.push({ dir: fullPath, relativePath: relativeFilePath });
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
files.push(relativeFilePath);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const sortedFiles = files
|
|
151
|
+
.map(
|
|
152
|
+
// Prepend entries with "project/"
|
|
153
|
+
(f) => path_1.default.join('project', f))
|
|
154
|
+
.sort(); // Sort for consistent ordering
|
|
155
|
+
const result = await ctx.graphqlClient
|
|
156
|
+
.mutation((0, gql_tada_1.graphql)(`
|
|
157
|
+
mutation {
|
|
158
|
+
uploadSession {
|
|
159
|
+
createUploadSession(type: EAS_BUILD_GCS_PROJECT_METADATA)
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
`), {})
|
|
163
|
+
.toPromise();
|
|
164
|
+
if (result.error) {
|
|
165
|
+
throw result.error;
|
|
166
|
+
}
|
|
167
|
+
const uploadSession = result.data.uploadSession.createUploadSession;
|
|
168
|
+
await fetch(uploadSession.url, {
|
|
169
|
+
method: 'PUT',
|
|
170
|
+
body: JSON.stringify({ archiveContent: sortedFiles }),
|
|
171
|
+
headers: uploadSession.headers,
|
|
172
|
+
});
|
|
173
|
+
const updateMetadataResult = await ctx.graphqlClient
|
|
174
|
+
.mutation((0, gql_tada_1.graphql)(`
|
|
175
|
+
mutation UpdateTurtleBuildMetadataMutation(
|
|
176
|
+
$buildId: ID!
|
|
177
|
+
$projectMetadataFile: ProjectMetadataFileInput!
|
|
178
|
+
) {
|
|
179
|
+
build {
|
|
180
|
+
updateBuildMetadata(
|
|
181
|
+
buildId: $buildId
|
|
182
|
+
metadata: { projectMetadataFile: $projectMetadataFile }
|
|
183
|
+
) {
|
|
184
|
+
id
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
`), {
|
|
189
|
+
buildId: ctx.env.EAS_BUILD_ID,
|
|
190
|
+
projectMetadataFile: {
|
|
191
|
+
type: 'GCS',
|
|
192
|
+
bucketKey: uploadSession.bucketKey,
|
|
193
|
+
},
|
|
194
|
+
})
|
|
195
|
+
.toPromise();
|
|
196
|
+
if (updateMetadataResult.error) {
|
|
197
|
+
throw updateMetadataResult.error;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
112
200
|
//# sourceMappingURL=projectSources.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectSources.js","sourceRoot":"","sources":["../../src/common/projectSources.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\n\nimport spawn from '@expo/turtle-spawn';\nimport fs from 'fs-extra';\nimport { ArchiveSourceType, Job } from '@expo/eas-build-job';\nimport { bunyan } from '@expo/logger';\nimport downloadFile from '@expo/downloader';\nimport { z } from 'zod';\nimport { asyncResult } from '@expo/results';\nimport nullthrows from 'nullthrows';\n\nimport { BuildContext } from '../context';\nimport { turtleFetch } from '../utils/turtleFetch';\n\nimport { shallowCloneRepositoryAsync } from './git';\n\nexport async function prepareProjectSourcesAsync<TJob extends Job>(\n ctx: BuildContext<TJob>,\n destinationDirectory = ctx.buildDirectory\n): Promise<void> {\n if (ctx.job.projectArchive.type === ArchiveSourceType.GCS) {\n throw new Error('GCS project sources should be resolved earlier to url');\n } else if (ctx.job.projectArchive.type === ArchiveSourceType.PATH) {\n await prepareProjectSourcesLocallyAsync(ctx, ctx.job.projectArchive.path, destinationDirectory); // used in eas build --local\n } else if (ctx.job.projectArchive.type === ArchiveSourceType.URL) {\n await downloadAndUnpackProjectFromTarGzAsync(\n ctx,\n ctx.job.projectArchive.url,\n destinationDirectory\n );\n } else if (ctx.job.projectArchive.type === ArchiveSourceType.GIT) {\n let repositoryUrl = ctx.job.projectArchive.repositoryUrl;\n try {\n repositoryUrl = await fetchRepositoryUrlAsync(ctx);\n } catch (err) {\n ctx.logger.error('Failed to refresh clone URL, falling back to the original one', err);\n }\n\n await shallowCloneRepositoryAsync({\n logger: ctx.logger,\n archiveSource: {\n ...ctx.job.projectArchive,\n repositoryUrl,\n },\n destinationDirectory,\n });\n }\n}\n\nasync function fetchRepositoryUrlAsync(ctx: BuildContext<Job>): Promise<string> {\n const taskId = nullthrows(ctx.env.EAS_BUILD_ID, 'EAS_BUILD_ID is not set');\n const expoApiServerURL = nullthrows(ctx.env.__API_SERVER_URL, '__API_SERVER_URL is not set');\n const robotAccessToken = nullthrows(\n ctx.job.secrets?.robotAccessToken,\n 'robot access token is not set'\n );\n\n const response = await turtleFetch(\n new URL(`/v2/github/fetch-github-repository-url`, expoApiServerURL).toString(),\n 'POST',\n {\n json: { taskId },\n headers: {\n Authorization: `Bearer ${robotAccessToken}`,\n },\n timeout: 20000,\n retries: 3,\n logger: ctx.logger,\n }\n );\n\n if (!response.ok) {\n const textResult = await asyncResult(response.text());\n throw new Error(`Unexpected response from server (${response.status}): ${textResult.value}`);\n }\n\n const jsonResult = await asyncResult(response.json());\n if (!jsonResult.ok) {\n throw new Error(\n `Expected JSON response from server (${response.status}): ${jsonResult.reason}`\n );\n }\n\n const dataResult = z\n .object({\n data: z.object({\n repositoryUrl: z.string().url(),\n }),\n })\n .safeParse(jsonResult.value);\n if (!dataResult.success) {\n throw new Error(`Unexpected response from server (${response.status}): ${dataResult.error}`);\n }\n\n return dataResult.data.data.repositoryUrl;\n}\n\nexport async function downloadAndUnpackProjectFromTarGzAsync<TJob extends Job>(\n ctx: BuildContext<TJob>,\n projectArchiveUrl: string,\n destinationDirectory: string\n): Promise<void> {\n const projectTarball = path.join(ctx.workingdir, 'project.tar.gz');\n try {\n await downloadFile(projectArchiveUrl, projectTarball, { retry: 3 });\n } catch (err: any) {\n ctx.reportError?.('Failed to download project archive', err, {\n extras: { buildId: ctx.env.EAS_BUILD_ID },\n });\n throw err;\n }\n\n await unpackTarGzAsync({\n destination: destinationDirectory,\n source: projectTarball,\n logger: ctx.logger,\n });\n}\n\nasync function prepareProjectSourcesLocallyAsync<TJob extends Job>(\n ctx: BuildContext<TJob>,\n projectArchivePath: string,\n destinationDirectory: string\n): Promise<void> {\n const projectTarball = path.join(ctx.workingdir, 'project.tar.gz');\n await fs.copy(projectArchivePath, projectTarball);\n\n await unpackTarGzAsync({\n destination: destinationDirectory,\n source: projectTarball,\n logger: ctx.logger,\n });\n}\n\nasync function unpackTarGzAsync({\n logger,\n source,\n destination,\n}: {\n logger: bunyan;\n source: string;\n destination: string;\n}): Promise<void> {\n await spawn('tar', ['-C', destination, '--strip-components', '1', '-zxf', source], {\n logger,\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"projectSources.js","sourceRoot":"","sources":["../../src/common/projectSources.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\n\nimport spawn from '@expo/turtle-spawn';\nimport fs from 'fs-extra';\nimport { ArchiveSourceType, Job } from '@expo/eas-build-job';\nimport { bunyan } from '@expo/logger';\nimport downloadFile from '@expo/downloader';\nimport { z } from 'zod';\nimport { asyncResult } from '@expo/results';\nimport nullthrows from 'nullthrows';\nimport { graphql } from 'gql.tada';\n\nimport { BuildContext } from '../context';\nimport { turtleFetch } from '../utils/turtleFetch';\n\nimport { shallowCloneRepositoryAsync } from './git';\n\nexport async function prepareProjectSourcesAsync<TJob extends Job>(\n ctx: BuildContext<TJob>,\n destinationDirectory = ctx.buildDirectory\n): Promise<void> {\n if (ctx.job.projectArchive.type === ArchiveSourceType.GCS) {\n throw new Error('GCS project sources should be resolved earlier to url');\n } else if (ctx.job.projectArchive.type === ArchiveSourceType.PATH) {\n await prepareProjectSourcesLocallyAsync(ctx, ctx.job.projectArchive.path, destinationDirectory); // used in eas build --local\n } else if (ctx.job.projectArchive.type === ArchiveSourceType.URL) {\n await downloadAndUnpackProjectFromTarGzAsync(\n ctx,\n ctx.job.projectArchive.url,\n destinationDirectory\n );\n } else if (ctx.job.projectArchive.type === ArchiveSourceType.GIT) {\n let repositoryUrl = ctx.job.projectArchive.repositoryUrl;\n try {\n repositoryUrl = await fetchRepositoryUrlAsync(ctx);\n } catch (err) {\n ctx.logger.error('Failed to refresh clone URL, falling back to the original one', err);\n }\n\n await shallowCloneRepositoryAsync({\n logger: ctx.logger,\n archiveSource: {\n ...ctx.job.projectArchive,\n repositoryUrl,\n },\n destinationDirectory,\n });\n }\n\n const uploadResult = await asyncResult(\n uploadProjectMetadataAsync(ctx, { projectDirectory: destinationDirectory })\n );\n if (!uploadResult.ok) {\n ctx.logger.warn(`Failed to upload project metadata: ${uploadResult.reason}`);\n }\n}\n\nasync function fetchRepositoryUrlAsync(ctx: BuildContext<Job>): Promise<string> {\n const taskId = nullthrows(ctx.env.EAS_BUILD_ID, 'EAS_BUILD_ID is not set');\n const expoApiServerURL = nullthrows(ctx.env.__API_SERVER_URL, '__API_SERVER_URL is not set');\n const robotAccessToken = nullthrows(\n ctx.job.secrets?.robotAccessToken,\n 'robot access token is not set'\n );\n\n const response = await turtleFetch(\n new URL(`/v2/github/fetch-github-repository-url`, expoApiServerURL).toString(),\n 'POST',\n {\n json: { taskId },\n headers: {\n Authorization: `Bearer ${robotAccessToken}`,\n },\n timeout: 20000,\n retries: 3,\n logger: ctx.logger,\n }\n );\n\n if (!response.ok) {\n const textResult = await asyncResult(response.text());\n throw new Error(`Unexpected response from server (${response.status}): ${textResult.value}`);\n }\n\n const jsonResult = await asyncResult(response.json());\n if (!jsonResult.ok) {\n throw new Error(\n `Expected JSON response from server (${response.status}): ${jsonResult.reason}`\n );\n }\n\n const dataResult = z\n .object({\n data: z.object({\n repositoryUrl: z.string().url(),\n }),\n })\n .safeParse(jsonResult.value);\n if (!dataResult.success) {\n throw new Error(`Unexpected response from server (${response.status}): ${dataResult.error}`);\n }\n\n return dataResult.data.data.repositoryUrl;\n}\n\nexport async function downloadAndUnpackProjectFromTarGzAsync<TJob extends Job>(\n ctx: BuildContext<TJob>,\n projectArchiveUrl: string,\n destinationDirectory: string\n): Promise<void> {\n const projectTarball = path.join(ctx.workingdir, 'project.tar.gz');\n try {\n await downloadFile(projectArchiveUrl, projectTarball, { retry: 3 });\n } catch (err: any) {\n ctx.reportError?.('Failed to download project archive', err, {\n extras: { buildId: ctx.env.EAS_BUILD_ID },\n });\n throw err;\n }\n\n await unpackTarGzAsync({\n destination: destinationDirectory,\n source: projectTarball,\n logger: ctx.logger,\n });\n}\n\nasync function prepareProjectSourcesLocallyAsync<TJob extends Job>(\n ctx: BuildContext<TJob>,\n projectArchivePath: string,\n destinationDirectory: string\n): Promise<void> {\n const projectTarball = path.join(ctx.workingdir, 'project.tar.gz');\n await fs.copy(projectArchivePath, projectTarball);\n\n await unpackTarGzAsync({\n destination: destinationDirectory,\n source: projectTarball,\n logger: ctx.logger,\n });\n}\n\nasync function unpackTarGzAsync({\n logger,\n source,\n destination,\n}: {\n logger: bunyan;\n source: string;\n destination: string;\n}): Promise<void> {\n await spawn('tar', ['-C', destination, '--strip-components', '1', '-zxf', source], {\n logger,\n });\n}\n\nasync function uploadProjectMetadataAsync(\n ctx: BuildContext<Job>,\n { projectDirectory }: { projectDirectory: string }\n): Promise<void> {\n if (!ctx.job.platform) {\n // Not a build job, skip.\n return;\n } else if (\n ctx.job.projectArchive.type === ArchiveSourceType.GCS &&\n ctx.job.projectArchive.metadataLocation\n ) {\n // Build already has project metadata, skip.\n return;\n }\n\n const files: string[] = [];\n\n const directoriesToScan: { dir: string; relativePath: string }[] = [\n { dir: projectDirectory, relativePath: '' },\n ];\n\n while (directoriesToScan.length > 0) {\n const { dir, relativePath } = directoriesToScan.shift()!;\n\n if (relativePath === '.git') {\n // Do not include whole `.git` directory in the archive, just that it exists.\n files.push('.git/...');\n continue;\n }\n\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relativeFilePath = path.join(relativePath, entry.name);\n\n if (entry.isDirectory()) {\n directoriesToScan.push({ dir: fullPath, relativePath: relativeFilePath });\n } else {\n files.push(relativeFilePath);\n }\n }\n }\n const sortedFiles = files\n .map(\n // Prepend entries with \"project/\"\n (f) => path.join('project', f)\n )\n .sort(); // Sort for consistent ordering\n\n const result = await ctx.graphqlClient\n .mutation(\n graphql(`\n mutation {\n uploadSession {\n createUploadSession(type: EAS_BUILD_GCS_PROJECT_METADATA)\n }\n }\n `),\n {}\n )\n .toPromise();\n\n if (result.error) {\n throw result.error;\n }\n\n const uploadSession = result.data!.uploadSession.createUploadSession as {\n url: string;\n bucketKey: string;\n headers: Record<string, string>;\n };\n\n await fetch(uploadSession.url, {\n method: 'PUT',\n body: JSON.stringify({ archiveContent: sortedFiles }),\n headers: uploadSession.headers,\n });\n\n const updateMetadataResult = await ctx.graphqlClient\n .mutation(\n graphql(`\n mutation UpdateTurtleBuildMetadataMutation(\n $buildId: ID!\n $projectMetadataFile: ProjectMetadataFileInput!\n ) {\n build {\n updateBuildMetadata(\n buildId: $buildId\n metadata: { projectMetadataFile: $projectMetadataFile }\n ) {\n id\n }\n }\n }\n `),\n {\n buildId: ctx.env.EAS_BUILD_ID,\n projectMetadataFile: {\n type: 'GCS',\n bucketKey: uploadSession.bucketKey,\n },\n }\n )\n .toPromise();\n\n if (updateMetadataResult.error) {\n throw updateMetadataResult.error;\n }\n}\n"]}
|
package/dist/context.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ManagedArtifactType, BuildPhase, BuildPhaseStats, Job, Env, Metadata, GenericArtifactType } from '@expo/eas-build-job';
|
|
2
2
|
import { ExpoConfig } from '@expo/config';
|
|
3
3
|
import { bunyan } from '@expo/logger';
|
|
4
|
+
import { Client } from '@urql/core';
|
|
4
5
|
import { PackageManager } from './utils/packageManager';
|
|
5
6
|
export type Artifacts = Partial<Record<ManagedArtifactType, string>>;
|
|
6
7
|
export interface CacheManager {
|
|
@@ -60,6 +61,7 @@ export declare class BuildContext<TJob extends Job = Job> {
|
|
|
60
61
|
private buildPhaseHasWarnings;
|
|
61
62
|
private _appConfig?;
|
|
62
63
|
private readonly reportBuildPhaseStats?;
|
|
64
|
+
readonly graphqlClient: Client;
|
|
63
65
|
constructor(job: TJob, options: BuildContextOptions);
|
|
64
66
|
get job(): TJob;
|
|
65
67
|
get metadata(): Metadata | undefined;
|
package/dist/context.js
CHANGED
|
@@ -8,6 +8,7 @@ const path_1 = __importDefault(require("path"));
|
|
|
8
8
|
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
9
9
|
const eas_build_job_1 = require("@expo/eas-build-job");
|
|
10
10
|
const common_1 = require("@expo/eas-build-job/dist/common");
|
|
11
|
+
const core_1 = require("@urql/core");
|
|
11
12
|
const packageManager_1 = require("./utils/packageManager");
|
|
12
13
|
const detectError_1 = require("./buildErrors/detectError");
|
|
13
14
|
const appConfig_1 = require("./utils/appConfig");
|
|
@@ -17,7 +18,7 @@ class SkipNativeBuildError extends Error {
|
|
|
17
18
|
exports.SkipNativeBuildError = SkipNativeBuildError;
|
|
18
19
|
class BuildContext {
|
|
19
20
|
constructor(job, options) {
|
|
20
|
-
var _a;
|
|
21
|
+
var _a, _b;
|
|
21
22
|
this.artifacts = {};
|
|
22
23
|
this.buildPhaseSkipped = false;
|
|
23
24
|
this.buildPhaseHasWarnings = false;
|
|
@@ -42,6 +43,15 @@ class BuildContext {
|
|
|
42
43
|
this._env.PATH = this._env.PATH
|
|
43
44
|
? [this.buildExecutablesDirectory, this._env.PATH].join(':')
|
|
44
45
|
: this.buildExecutablesDirectory;
|
|
46
|
+
this.graphqlClient = new core_1.Client({
|
|
47
|
+
url: new URL('graphql', this.env.__API_SERVER_URL).toString(),
|
|
48
|
+
exchanges: [core_1.fetchExchange],
|
|
49
|
+
fetchOptions: {
|
|
50
|
+
headers: {
|
|
51
|
+
Authorization: `Bearer ${(_b = job.secrets) === null || _b === void 0 ? void 0 : _b.robotAccessToken}`,
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
});
|
|
45
55
|
}
|
|
46
56
|
get job() {
|
|
47
57
|
return this._job;
|
package/dist/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,wDAA0B;AAC1B,uDAa6B;AAG7B,4DAA+D;AAE/D,2DAA+E;AAC/E,2DAAwE;AACxE,iDAAkD;AAClD,mEAAkF;AA0ClF,MAAa,oBAAqB,SAAQ,KAAK;CAAG;AAAlD,oDAAkD;AAElD,MAAa,YAAY;IAwBvB,YAAY,GAAS,EAAE,OAA4B;;QAb5C,cAAS,GAAc,EAAE,CAAC;QAQzB,sBAAiB,GAAG,KAAK,CAAC;QAC1B,0BAAqB,GAAG,KAAK,CAAC;QAKpC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;QAC9C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QAEvC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;QAC/C,IAAI,CAAC,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC;QAE3D,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,GAAG;YACV,GAAG,OAAO,CAAC,GAAG;YACd,GAAG,MAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,kBAAkB,0CAAE,GAAG;YAC/B,GAAG,kBAAkB;YACrB,oBAAoB,EAAE,IAAI,CAAC,kBAAkB;SAC9C,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI;YAC7B,CAAC,CAAC,CAAC,IAAI,CAAC,yBAAyB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAC5D,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC;IACrC,CAAC;IAED,IAAW,GAAG;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IACD,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IACD,IAAW,GAAG;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IACD,IAAW,cAAc;QACvB,OAAO,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IACD,IAAW,kBAAkB;QAC3B,OAAO,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IACD;;OAEG;IACH,IAAW,yBAAyB;QAClC,OAAO,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IACD;;;OAGG;IACH,IAAW,kBAAkB;QAC3B,OAAO,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IACD,IAAW,2BAA2B;QACpC,OAAO,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;IAC3D,CAAC;IACD,IAAW,cAAc;QACvB,OAAO,IAAA,sCAAqB,EAAC,IAAI,CAAC,8BAA8B,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,IAAW,SAAS;;QAClB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,IAAA,yBAAa,EAAC;gBAC9B,UAAU,EAAE,IAAI,CAAC,8BAA8B,EAAE;gBACjD,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,UAAU,EAAE,MAAA,IAAI,CAAC,QAAQ,0CAAE,UAAU;aACtC,CAAC,CAAC,GAAG,CAAC;QACT,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAEM,KAAK,CAAC,aAAa,CACxB,UAAsB,EACtB,KAAuB,EACvB,EACE,cAAc,GAAG,KAAK,EACtB,YAAY,GAAG,KAAK,MAIlB,EAAE;QAEN,IAAI,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;YACnD,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,MAAM,KAAK,EAAE,CAAC;YAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;YAC/C,MAAM,gBAAgB,GAAqB,IAAI,CAAC,iBAAiB;gBAC/D,CAAC,CAAC,gCAAgB,CAAC,OAAO;gBAC1B,CAAC,CAAC,IAAI,CAAC,qBAAqB;oBAC1B,CAAC,CAAC,gCAAgB,CAAC,OAAO;oBAC1B,CAAC,CAAC,gCAAgB,CAAC,OAAO,CAAC;YAC/B,MAAM,IAAI,CAAC,yBAAyB,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,CAAC;YAC7F,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;YAC/C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,0BAA0B,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YAC7E,MAAM,IAAI,CAAC,yBAAyB,CAAC,EAAE,MAAM,EAAE,gCAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YACpF,MAAM,aAAa,CAAC;QACtB,CAAC;IACH,CAAC;IAEM,qBAAqB;QAC1B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAChC,CAAC;IAEM,yBAAyB;QAC9B,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;IACpC,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,EAC1B,QAAQ,EACR,MAAM,GAIP;QACC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QACnE,IAAI,SAAS,IAAI,CAAC,IAAA,iCAAiB,EAAC,QAAQ,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;QAC5C,CAAC;IACH,CAAC;IAEM,SAAS,CAAC,GAAQ;QACvB,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,KAAK,qBAAY,CAAC,qBAAqB,EAAE,CAAC;YACjE,MAAM,IAAI,KAAK,CACb,qGAAqG,CACtG,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,GAAG;YACV,GAAG,GAAG;YACN,GAAG,IAAI,CAAC,IAAI;YACZ,oBAAoB,EAAE,IAAI,CAAC,kBAAkB;SAC9C,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI;YAC7B,CAAC,CAAC,CAAC,IAAI,CAAC,yBAAyB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAC5D,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC;IACrC,CAAC;IAEM,oBAAoB,CAAC,GAAS,EAAE,QAAkB;;QACvD,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,KAAK,qBAAY,CAAC,qBAAqB,EAAE,CAAC;YACjE,MAAM,IAAI,KAAK,CACb,+FAA+F,CAChG,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,GAAG;YACV,GAAG,IAAI,CAAC,IAAI;YACZ,GAAG,GAAG;YACN,4BAA4B,EAC1B,MAAA,GAAG,CAAC,4BAA4B,mCAAI,IAAI,CAAC,GAAG,CAAC,4BAA4B;YAC3E,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW;YAClC,OAAO,EAAE;gBACP,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO;gBACnB,GAAG,GAAG,CAAC,OAAO;gBACd,gBAAgB,EAAE,MAAA,MAAA,GAAG,CAAC,OAAO,0CAAE,gBAAgB,mCAAI,MAAA,IAAI,CAAC,GAAG,CAAC,OAAO,0CAAE,gBAAgB;gBACrF,kBAAkB,EAAE;oBAClB,uCAAuC;oBACvC,GAAG,CAAC,MAAA,MAAA,IAAI,CAAC,GAAG,CAAC,OAAO,0CAAE,kBAAkB,mCAAI,EAAE,CAAC;oBAC/C,GAAG,CAAC,MAAA,MAAA,GAAG,CAAC,OAAO,0CAAE,kBAAkB,mCAAI,EAAE,CAAC;iBAC3C;aACF;YACD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAC1E,CAAC;QACF,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAEO,KAAK,CAAC,0BAA0B,CACtC,GAAQ,EACR,UAAsB;QAEtB,MAAM,UAAU,GAAG,MAAM,IAAA,yCAA2B,EAClD,GAAG,EACH,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,UAAU,CAAC,EACvC;YACE,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,KAAK,EAAE,UAAU;YACjB,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,EACD,IAAI,CAAC,kBAAkB,CACxB,CAAC;QACF,IAAI,UAAU,CAAC,SAAS,KAAK,sBAAM,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC;YAC5D,2FAA2F;YAC3F,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAEM,8BAA8B,CAAC,aAAa,GAAG,IAAI,CAAC,cAAc;;QACvE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACvB,OAAO,cAAI,CAAC,IAAI,CACd,aAAa;YACb,+EAA+E;YAC/E,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,8BAA8B,IAAI,GAAG,CACtE,CAAC;QACJ,CAAC;QAED,OAAO,cAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAA,IAAI,CAAC,GAAG,CAAC,oBAAoB,mCAAI,GAAG,CAAC,CAAC;IACxE,CAAC;IAEO,aAAa,CAAC,UAAsB,EAAE,EAAE,cAAc,GAAG,KAAK,EAAE,GAAG,EAAE;QAC3E,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;gBACnC,OAAO;YACT,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,EAAE,MAAM,EAAE,yBAAS,CAAC,SAAS,EAAE,MAAM,EAAE,gCAAgB,CAAC,OAAO,EAAE,EACjE,cAAc,IAAI,CAAC,UAAU,EAAE,CAChC,CAAC;gBACF,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;YACnC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,yBAAS,CAAC,WAAW,EAAE,EAAE,gBAAgB,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,yBAAyB,CAAC,EACtC,MAAM,EACN,YAAY,GAAG,KAAK,EACpB,UAAU,GAKX;;QACC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,iCAAiC,EAAE,CAAC;QAE/C,MAAA,IAAI,CAAC,qBAAqB,qDAAG,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QAElF,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,EAAE,MAAM,EAAE,yBAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,EACnD,cAAc,IAAI,CAAC,UAAU,EAAE,CAChC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;QACjC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;IACrC,CAAC;IAEO,KAAK,CAAC,iCAAiC;QAC7C,MAAM,SAAS,GAAG,MAAM,kBAAE,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAE5D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YAC/B,MAAM,WAAW,GAAG,MAAM,kBAAE,CAAC,QAAQ,CACnC,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC,EAC5C,OAAO,CACR,CAAC;YACF,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACjC,CAAC,CAAC,CACH,CAAC;QACF,MAAM,OAAO,CAAC,GAAG,CACf,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YAC/B,MAAM,kBAAE,CAAC,MAAM,CAAC,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC,CAAC;QAChE,CAAC,CAAC,CACH,CAAC;QACF,IAAI,CAAC,IAAI,GAAG;YACV,GAAG,IAAI,CAAC,IAAI;YACZ,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;SAC/B,CAAC;IACJ,CAAC;IAEO,qBAAqB,CAAC,GAAS;;QACrC,IAAI,CAAC,CAAA,MAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,OAAO,0CAAE,kBAAkB,CAAA,EAAE,CAAC;YACtC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,kBAAkB,GAA2B,EAAE,CAAC;QACtD,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;YACnE,IAAI,IAAI,KAAK,qCAAqB,CAAC,MAAM,EAAE,CAAC;gBAC1C,kBAAkB,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,kBAAkB,CAAC,IAAI,CAAC,GAAG,IAAA,yDAAoC,EAC7D,IAAI,CAAC,2BAA2B,EAChC,KAAK,CACN,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,kBAAkB,CAAC;IAC5B,CAAC;CACF;AA3TD,oCA2TC","sourcesContent":["import path from 'path';\n\nimport fs from 'fs-extra';\nimport {\n ManagedArtifactType,\n BuildPhase,\n BuildPhaseResult,\n BuildPhaseStats,\n Job,\n LogMarker,\n Env,\n errors,\n Metadata,\n EnvironmentSecretType,\n GenericArtifactType,\n isGenericArtifact,\n} from '@expo/eas-build-job';\nimport { ExpoConfig } from '@expo/config';\nimport { bunyan } from '@expo/logger';\nimport { BuildTrigger } from '@expo/eas-build-job/dist/common';\n\nimport { PackageManager, resolvePackageManager } from './utils/packageManager';\nimport { resolveBuildPhaseErrorAsync } from './buildErrors/detectError';\nimport { readAppConfig } from './utils/appConfig';\nimport { createTemporaryEnvironmentSecretFile } from './utils/environmentSecrets';\n\nexport type Artifacts = Partial<Record<ManagedArtifactType, string>>;\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 type ArtifactToUpload =\n | {\n type: ManagedArtifactType;\n paths: string[];\n }\n | {\n type: GenericArtifactType;\n name: string;\n paths: string[];\n };\n\nexport interface BuildContextOptions {\n workingdir: string;\n logger: bunyan;\n logBuffer: LogBuffer;\n env: Env;\n cacheManager?: CacheManager;\n uploadArtifact: (spec: { artifact: ArtifactToUpload; logger: bunyan }) => Promise<string | null>;\n reportError?: (\n msg: string,\n err?: Error,\n options?: { tags?: Record<string, string>; extras?: Record<string, string> }\n ) => void;\n reportBuildPhaseStats?: (stats: BuildPhaseStats) => void;\n skipNativeBuild?: boolean;\n metadata?: Metadata;\n}\n\nexport class SkipNativeBuildError extends Error {}\n\nexport class BuildContext<TJob extends Job = Job> {\n public readonly workingdir: string;\n public logger: bunyan;\n public readonly logBuffer: LogBuffer;\n public readonly cacheManager?: CacheManager;\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 skipNativeBuild?: boolean;\n public artifacts: Artifacts = {};\n\n private _env: Env;\n private _job: TJob;\n private _metadata?: Metadata;\n private readonly defaultLogger: bunyan;\n private readonly _uploadArtifact: BuildContextOptions['uploadArtifact'];\n private buildPhase?: BuildPhase;\n private buildPhaseSkipped = false;\n private buildPhaseHasWarnings = false;\n private _appConfig?: ExpoConfig;\n private readonly reportBuildPhaseStats?: (stats: BuildPhaseStats) => void;\n\n constructor(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._uploadArtifact = options.uploadArtifact;\n this.reportError = options.reportError;\n\n this._job = job;\n this._metadata = options.metadata;\n this.skipNativeBuild = options.skipNativeBuild;\n this.reportBuildPhaseStats = options.reportBuildPhaseStats;\n\n const environmentSecrets = this.getEnvironmentSecrets(job);\n this._env = {\n ...options.env,\n ...job?.builderEnvironment?.env,\n ...environmentSecrets,\n __EAS_BUILD_ENVS_DIR: this.buildEnvsDirectory,\n };\n this._env.PATH = this._env.PATH\n ? [this.buildExecutablesDirectory, this._env.PATH].join(':')\n : this.buildExecutablesDirectory;\n }\n\n public get job(): TJob {\n return this._job;\n }\n public get metadata(): Metadata | undefined {\n return this._metadata;\n }\n public get env(): Env {\n return this._env;\n }\n public get buildDirectory(): string {\n return path.join(this.workingdir, 'build');\n }\n public get buildLogsDirectory(): string {\n return path.join(this.workingdir, 'logs');\n }\n /**\n * Directory used to store executables used during regular (non-custom) builds.\n */\n public get buildExecutablesDirectory(): string {\n return path.join(this.workingdir, 'bin');\n }\n /**\n * Directory used to store env variables registered in the current build step.\n * All values stored here will be available in the next build phase as env variables.\n */\n public get buildEnvsDirectory(): string {\n return path.join(this.workingdir, 'env');\n }\n public get environmentSecretsDirectory(): string {\n return path.join(this.workingdir, 'environment-secrets');\n }\n public get packageManager(): PackageManager {\n return resolvePackageManager(this.getReactNativeProjectDirectory());\n }\n public get appConfig(): ExpoConfig {\n if (!this._appConfig) {\n this._appConfig = readAppConfig({\n projectDir: this.getReactNativeProjectDirectory(),\n env: this.env,\n logger: this.logger,\n sdkVersion: this.metadata?.sdkVersion,\n }).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 }: {\n doNotMarkStart?: boolean;\n doNotMarkEnd?: boolean;\n } = {}\n ): Promise<T> {\n let startTimestamp = Date.now();\n try {\n this.setBuildPhase(buildPhase, { doNotMarkStart });\n startTimestamp = Date.now();\n const result = await phase();\n const durationMs = Date.now() - startTimestamp;\n const buildPhaseResult: BuildPhaseResult = this.buildPhaseSkipped\n ? BuildPhaseResult.SKIPPED\n : this.buildPhaseHasWarnings\n ? BuildPhaseResult.WARNING\n : BuildPhaseResult.SUCCESS;\n await this.endCurrentBuildPhaseAsync({ result: buildPhaseResult, doNotMarkEnd, durationMs });\n return result;\n } catch (err: any) {\n const durationMs = Date.now() - startTimestamp;\n const resolvedError = await this.handleBuildPhaseErrorAsync(err, buildPhase);\n await this.endCurrentBuildPhaseAsync({ result: BuildPhaseResult.FAIL, durationMs });\n throw resolvedError;\n }\n }\n\n public markBuildPhaseSkipped(): void {\n this.buildPhaseSkipped = true;\n }\n\n public markBuildPhaseHasWarnings(): void {\n this.buildPhaseHasWarnings = true;\n }\n\n public async uploadArtifact({\n artifact,\n logger,\n }: {\n artifact: ArtifactToUpload;\n logger: bunyan;\n }): Promise<void> {\n const bucketKey = await this._uploadArtifact({ artifact, logger });\n if (bucketKey && !isGenericArtifact(artifact)) {\n this.artifacts[artifact.type] = bucketKey;\n }\n }\n\n public updateEnv(env: Env): void {\n if (this._job.triggeredBy !== BuildTrigger.GIT_BASED_INTEGRATION) {\n throw new Error(\n 'Updating environment variables is only allowed when build was triggered by a git-based integration.'\n );\n }\n this._env = {\n ...env,\n ...this._env,\n __EAS_BUILD_ENVS_DIR: this.buildEnvsDirectory,\n };\n this._env.PATH = this._env.PATH\n ? [this.buildExecutablesDirectory, this._env.PATH].join(':')\n : this.buildExecutablesDirectory;\n }\n\n public updateJobInformation(job: TJob, metadata: Metadata): void {\n if (this._job.triggeredBy !== BuildTrigger.GIT_BASED_INTEGRATION) {\n throw new Error(\n 'Updating job information is only allowed when build was triggered by a git-based integration.'\n );\n }\n this._job = {\n ...this._job,\n ...job,\n workflowInterpolationContext:\n job.workflowInterpolationContext ?? this.job.workflowInterpolationContext,\n triggeredBy: this._job.triggeredBy,\n secrets: {\n ...this.job.secrets,\n ...job.secrets,\n robotAccessToken: job.secrets?.robotAccessToken ?? this.job.secrets?.robotAccessToken,\n environmentSecrets: [\n // Latter secrets override former ones.\n ...(this.job.secrets?.environmentSecrets ?? []),\n ...(job.secrets?.environmentSecrets ?? []),\n ],\n },\n ...(this._job.platform ? { expoBuildUrl: this._job.expoBuildUrl } : null),\n };\n this._metadata = metadata;\n }\n\n private async handleBuildPhaseErrorAsync(\n err: any,\n buildPhase: BuildPhase\n ): Promise<errors.BuildError> {\n const buildError = await resolveBuildPhaseErrorAsync(\n err,\n this.logBuffer.getPhaseLogs(buildPhase),\n {\n job: this.job,\n phase: buildPhase,\n env: this.env,\n },\n this.buildLogsDirectory\n );\n if (buildError.errorCode === errors.ErrorCode.UNKNOWN_ERROR) {\n // leaving message empty, website will display err.stack which already includes err.message\n this.logger.error({ err }, '');\n } else {\n this.logger.error(`Error: ${buildError.userFacingMessage}`);\n }\n return buildError;\n }\n\n public getReactNativeProjectDirectory(baseDirectory = this.buildDirectory): string {\n if (!this.job.platform) {\n return path.join(\n baseDirectory,\n // NOTE: We may want to add projectRootDirectory to generic jobs in the future.\n this.job.builderEnvironment.env.__EXPO_RELATIVE_BASE_DIRECTORY || '.'\n );\n }\n\n return path.join(baseDirectory, this.job.projectRootDirectory ?? '.');\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 async endCurrentBuildPhaseAsync({\n result,\n doNotMarkEnd = false,\n durationMs,\n }: {\n result: BuildPhaseResult;\n doNotMarkEnd?: boolean;\n durationMs: number;\n }): Promise<void> {\n if (!this.buildPhase) {\n return;\n }\n await this.collectAndUpdateEnvVariablesAsync();\n\n this.reportBuildPhaseStats?.({ buildPhase: this.buildPhase, result, durationMs });\n\n if (!doNotMarkEnd) {\n this.logger.info(\n { marker: LogMarker.END_PHASE, result, durationMs },\n `End phase: ${this.buildPhase}`\n );\n }\n this.logger = this.defaultLogger;\n this.buildPhase = undefined;\n this.buildPhaseSkipped = false;\n this.buildPhaseHasWarnings = false;\n }\n\n private async collectAndUpdateEnvVariablesAsync(): Promise<void> {\n const filenames = await fs.readdir(this.buildEnvsDirectory);\n\n const entries = await Promise.all(\n filenames.map(async (basename) => {\n const rawContents = await fs.readFile(\n path.join(this.buildEnvsDirectory, basename),\n 'utf-8'\n );\n return [basename, rawContents];\n })\n );\n await Promise.all(\n filenames.map(async (basename) => {\n await fs.remove(path.join(this.buildEnvsDirectory, basename));\n })\n );\n this._env = {\n ...this._env,\n ...Object.fromEntries(entries),\n };\n }\n\n private getEnvironmentSecrets(job: TJob): Record<string, string> {\n if (!job?.secrets?.environmentSecrets) {\n return {};\n }\n\n const environmentSecrets: Record<string, string> = {};\n for (const { name, type, value } of job.secrets.environmentSecrets) {\n if (type === EnvironmentSecretType.STRING) {\n environmentSecrets[name] = value;\n } else {\n environmentSecrets[name] = createTemporaryEnvironmentSecretFile(\n this.environmentSecretsDirectory,\n value\n );\n }\n }\n return environmentSecrets;\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 fs from 'fs-extra';\nimport {\n ManagedArtifactType,\n BuildPhase,\n BuildPhaseResult,\n BuildPhaseStats,\n Job,\n LogMarker,\n Env,\n errors,\n Metadata,\n EnvironmentSecretType,\n GenericArtifactType,\n isGenericArtifact,\n} from '@expo/eas-build-job';\nimport { ExpoConfig } from '@expo/config';\nimport { bunyan } from '@expo/logger';\nimport { BuildTrigger } from '@expo/eas-build-job/dist/common';\nimport { Client, fetchExchange } from '@urql/core';\n\nimport { PackageManager, resolvePackageManager } from './utils/packageManager';\nimport { resolveBuildPhaseErrorAsync } from './buildErrors/detectError';\nimport { readAppConfig } from './utils/appConfig';\nimport { createTemporaryEnvironmentSecretFile } from './utils/environmentSecrets';\n\nexport type Artifacts = Partial<Record<ManagedArtifactType, string>>;\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 type ArtifactToUpload =\n | {\n type: ManagedArtifactType;\n paths: string[];\n }\n | {\n type: GenericArtifactType;\n name: string;\n paths: string[];\n };\n\nexport interface BuildContextOptions {\n workingdir: string;\n logger: bunyan;\n logBuffer: LogBuffer;\n env: Env;\n cacheManager?: CacheManager;\n uploadArtifact: (spec: { artifact: ArtifactToUpload; logger: bunyan }) => Promise<string | null>;\n reportError?: (\n msg: string,\n err?: Error,\n options?: { tags?: Record<string, string>; extras?: Record<string, string> }\n ) => void;\n reportBuildPhaseStats?: (stats: BuildPhaseStats) => void;\n skipNativeBuild?: boolean;\n metadata?: Metadata;\n}\n\nexport class SkipNativeBuildError extends Error {}\n\nexport class BuildContext<TJob extends Job = Job> {\n public readonly workingdir: string;\n public logger: bunyan;\n public readonly logBuffer: LogBuffer;\n public readonly cacheManager?: CacheManager;\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 skipNativeBuild?: boolean;\n public artifacts: Artifacts = {};\n\n private _env: Env;\n private _job: TJob;\n private _metadata?: Metadata;\n private readonly defaultLogger: bunyan;\n private readonly _uploadArtifact: BuildContextOptions['uploadArtifact'];\n private buildPhase?: BuildPhase;\n private buildPhaseSkipped = false;\n private buildPhaseHasWarnings = false;\n private _appConfig?: ExpoConfig;\n private readonly reportBuildPhaseStats?: (stats: BuildPhaseStats) => void;\n public readonly graphqlClient: Client;\n\n constructor(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._uploadArtifact = options.uploadArtifact;\n this.reportError = options.reportError;\n\n this._job = job;\n this._metadata = options.metadata;\n this.skipNativeBuild = options.skipNativeBuild;\n this.reportBuildPhaseStats = options.reportBuildPhaseStats;\n\n const environmentSecrets = this.getEnvironmentSecrets(job);\n this._env = {\n ...options.env,\n ...job?.builderEnvironment?.env,\n ...environmentSecrets,\n __EAS_BUILD_ENVS_DIR: this.buildEnvsDirectory,\n };\n\n this._env.PATH = this._env.PATH\n ? [this.buildExecutablesDirectory, this._env.PATH].join(':')\n : this.buildExecutablesDirectory;\n\n this.graphqlClient = new Client({\n url: new URL('graphql', this.env.__API_SERVER_URL).toString(),\n exchanges: [fetchExchange],\n fetchOptions: {\n headers: {\n Authorization: `Bearer ${job.secrets?.robotAccessToken}`,\n },\n },\n });\n }\n\n public get job(): TJob {\n return this._job;\n }\n public get metadata(): Metadata | undefined {\n return this._metadata;\n }\n public get env(): Env {\n return this._env;\n }\n public get buildDirectory(): string {\n return path.join(this.workingdir, 'build');\n }\n public get buildLogsDirectory(): string {\n return path.join(this.workingdir, 'logs');\n }\n /**\n * Directory used to store executables used during regular (non-custom) builds.\n */\n public get buildExecutablesDirectory(): string {\n return path.join(this.workingdir, 'bin');\n }\n /**\n * Directory used to store env variables registered in the current build step.\n * All values stored here will be available in the next build phase as env variables.\n */\n public get buildEnvsDirectory(): string {\n return path.join(this.workingdir, 'env');\n }\n public get environmentSecretsDirectory(): string {\n return path.join(this.workingdir, 'environment-secrets');\n }\n public get packageManager(): PackageManager {\n return resolvePackageManager(this.getReactNativeProjectDirectory());\n }\n public get appConfig(): ExpoConfig {\n if (!this._appConfig) {\n this._appConfig = readAppConfig({\n projectDir: this.getReactNativeProjectDirectory(),\n env: this.env,\n logger: this.logger,\n sdkVersion: this.metadata?.sdkVersion,\n }).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 }: {\n doNotMarkStart?: boolean;\n doNotMarkEnd?: boolean;\n } = {}\n ): Promise<T> {\n let startTimestamp = Date.now();\n try {\n this.setBuildPhase(buildPhase, { doNotMarkStart });\n startTimestamp = Date.now();\n const result = await phase();\n const durationMs = Date.now() - startTimestamp;\n const buildPhaseResult: BuildPhaseResult = this.buildPhaseSkipped\n ? BuildPhaseResult.SKIPPED\n : this.buildPhaseHasWarnings\n ? BuildPhaseResult.WARNING\n : BuildPhaseResult.SUCCESS;\n await this.endCurrentBuildPhaseAsync({ result: buildPhaseResult, doNotMarkEnd, durationMs });\n return result;\n } catch (err: any) {\n const durationMs = Date.now() - startTimestamp;\n const resolvedError = await this.handleBuildPhaseErrorAsync(err, buildPhase);\n await this.endCurrentBuildPhaseAsync({ result: BuildPhaseResult.FAIL, durationMs });\n throw resolvedError;\n }\n }\n\n public markBuildPhaseSkipped(): void {\n this.buildPhaseSkipped = true;\n }\n\n public markBuildPhaseHasWarnings(): void {\n this.buildPhaseHasWarnings = true;\n }\n\n public async uploadArtifact({\n artifact,\n logger,\n }: {\n artifact: ArtifactToUpload;\n logger: bunyan;\n }): Promise<void> {\n const bucketKey = await this._uploadArtifact({ artifact, logger });\n if (bucketKey && !isGenericArtifact(artifact)) {\n this.artifacts[artifact.type] = bucketKey;\n }\n }\n\n public updateEnv(env: Env): void {\n if (this._job.triggeredBy !== BuildTrigger.GIT_BASED_INTEGRATION) {\n throw new Error(\n 'Updating environment variables is only allowed when build was triggered by a git-based integration.'\n );\n }\n this._env = {\n ...env,\n ...this._env,\n __EAS_BUILD_ENVS_DIR: this.buildEnvsDirectory,\n };\n this._env.PATH = this._env.PATH\n ? [this.buildExecutablesDirectory, this._env.PATH].join(':')\n : this.buildExecutablesDirectory;\n }\n\n public updateJobInformation(job: TJob, metadata: Metadata): void {\n if (this._job.triggeredBy !== BuildTrigger.GIT_BASED_INTEGRATION) {\n throw new Error(\n 'Updating job information is only allowed when build was triggered by a git-based integration.'\n );\n }\n this._job = {\n ...this._job,\n ...job,\n workflowInterpolationContext:\n job.workflowInterpolationContext ?? this.job.workflowInterpolationContext,\n triggeredBy: this._job.triggeredBy,\n secrets: {\n ...this.job.secrets,\n ...job.secrets,\n robotAccessToken: job.secrets?.robotAccessToken ?? this.job.secrets?.robotAccessToken,\n environmentSecrets: [\n // Latter secrets override former ones.\n ...(this.job.secrets?.environmentSecrets ?? []),\n ...(job.secrets?.environmentSecrets ?? []),\n ],\n },\n ...(this._job.platform ? { expoBuildUrl: this._job.expoBuildUrl } : null),\n };\n this._metadata = metadata;\n }\n\n private async handleBuildPhaseErrorAsync(\n err: any,\n buildPhase: BuildPhase\n ): Promise<errors.BuildError> {\n const buildError = await resolveBuildPhaseErrorAsync(\n err,\n this.logBuffer.getPhaseLogs(buildPhase),\n {\n job: this.job,\n phase: buildPhase,\n env: this.env,\n },\n this.buildLogsDirectory\n );\n if (buildError.errorCode === errors.ErrorCode.UNKNOWN_ERROR) {\n // leaving message empty, website will display err.stack which already includes err.message\n this.logger.error({ err }, '');\n } else {\n this.logger.error(`Error: ${buildError.userFacingMessage}`);\n }\n return buildError;\n }\n\n public getReactNativeProjectDirectory(baseDirectory = this.buildDirectory): string {\n if (!this.job.platform) {\n return path.join(\n baseDirectory,\n // NOTE: We may want to add projectRootDirectory to generic jobs in the future.\n this.job.builderEnvironment.env.__EXPO_RELATIVE_BASE_DIRECTORY || '.'\n );\n }\n\n return path.join(baseDirectory, this.job.projectRootDirectory ?? '.');\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 async endCurrentBuildPhaseAsync({\n result,\n doNotMarkEnd = false,\n durationMs,\n }: {\n result: BuildPhaseResult;\n doNotMarkEnd?: boolean;\n durationMs: number;\n }): Promise<void> {\n if (!this.buildPhase) {\n return;\n }\n await this.collectAndUpdateEnvVariablesAsync();\n\n this.reportBuildPhaseStats?.({ buildPhase: this.buildPhase, result, durationMs });\n\n if (!doNotMarkEnd) {\n this.logger.info(\n { marker: LogMarker.END_PHASE, result, durationMs },\n `End phase: ${this.buildPhase}`\n );\n }\n this.logger = this.defaultLogger;\n this.buildPhase = undefined;\n this.buildPhaseSkipped = false;\n this.buildPhaseHasWarnings = false;\n }\n\n private async collectAndUpdateEnvVariablesAsync(): Promise<void> {\n const filenames = await fs.readdir(this.buildEnvsDirectory);\n\n const entries = await Promise.all(\n filenames.map(async (basename) => {\n const rawContents = await fs.readFile(\n path.join(this.buildEnvsDirectory, basename),\n 'utf-8'\n );\n return [basename, rawContents];\n })\n );\n await Promise.all(\n filenames.map(async (basename) => {\n await fs.remove(path.join(this.buildEnvsDirectory, basename));\n })\n );\n this._env = {\n ...this._env,\n ...Object.fromEntries(entries),\n };\n }\n\n private getEnvironmentSecrets(job: TJob): Record<string, string> {\n if (!job?.secrets?.environmentSecrets) {\n return {};\n }\n\n const environmentSecrets: Record<string, string> = {};\n for (const { name, type, value } of job.secrets.environmentSecrets) {\n if (type === EnvironmentSecretType.STRING) {\n environmentSecrets[name] = value;\n } else {\n environmentSecrets[name] = createTemporaryEnvironmentSecretFile(\n this.environmentSecretsDirectory,\n value\n );\n }\n }\n return environmentSecrets;\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@expo/build-tools",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.208",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"files": [
|
|
@@ -11,14 +11,18 @@
|
|
|
11
11
|
],
|
|
12
12
|
"scripts": {
|
|
13
13
|
"start": "yarn watch",
|
|
14
|
+
"prewatch": "yarn gql",
|
|
14
15
|
"watch": "tsc --watch --preserveWatchOutput",
|
|
16
|
+
"prebuild": "yarn gql",
|
|
15
17
|
"build": "tsc",
|
|
16
18
|
"prepack": "rm -rf dist && tsc -p tsconfig.build.json",
|
|
17
19
|
"jest-unit": "jest --config jest/unit-config.ts",
|
|
18
20
|
"jest-integration": "jest --config jest/integration-config.ts",
|
|
19
21
|
"jest-unit-watch": "jest --config jest/unit-config.ts --watch",
|
|
20
22
|
"jest-integration-watch": "jest --config jest/integration-config.ts --watch",
|
|
21
|
-
"clean": "rm -rf node_modules dist coverage"
|
|
23
|
+
"clean": "rm -rf node_modules dist coverage",
|
|
24
|
+
"gql": "gql.tada generate-schema ${API_SERVER_URL:-https://api.expo.dev}/graphql --output ./schema.graphql && gql.tada generate-output",
|
|
25
|
+
"gql:local": "API_SERVER_URL=http://api.expo.test yarn gql"
|
|
22
26
|
},
|
|
23
27
|
"author": "Expo <support@expo.io>",
|
|
24
28
|
"bugs": "https://github.com/expo/eas-build/issues",
|
|
@@ -38,8 +42,10 @@
|
|
|
38
42
|
"@expo/turtle-spawn": "1.0.206",
|
|
39
43
|
"@expo/xcpretty": "^4.3.1",
|
|
40
44
|
"@google-cloud/storage": "^7.11.2",
|
|
45
|
+
"@urql/core": "^6.0.1",
|
|
41
46
|
"fast-glob": "^3.3.2",
|
|
42
47
|
"fs-extra": "^11.2.0",
|
|
48
|
+
"gql.tada": "^1.8.13",
|
|
43
49
|
"joi": "^17.13.1",
|
|
44
50
|
"lodash": "^4.17.21",
|
|
45
51
|
"node-fetch": "^2.7.0",
|
|
@@ -79,5 +85,5 @@
|
|
|
79
85
|
"node": "20.14.0",
|
|
80
86
|
"yarn": "1.22.21"
|
|
81
87
|
},
|
|
82
|
-
"gitHead": "
|
|
88
|
+
"gitHead": "32ddd1628479c30374acb26cc19be0f65e3e7cb7"
|
|
83
89
|
}
|