@expo/build-tools 1.0.224 → 1.0.227

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.
@@ -27,7 +27,11 @@ async function installDependenciesAsync({ packageManager, env, logger, infoCallb
27
27
  args = ['workspaces', 'focus', env['EAS_YARN_FOCUS_WORKSPACE']];
28
28
  }
29
29
  else {
30
- args = ['install', '--inline-builds', useFrozenLockfile ? '--immutable' : '--no-immutable'];
30
+ args = [
31
+ 'install',
32
+ '--inline-builds',
33
+ useFrozenLockfile ? '--immutable' : '--no-immutable',
34
+ ];
31
35
  }
32
36
  }
33
37
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"installDependencies.js","sourceRoot":"","sources":["../../src/common/installDependencies.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\n\nimport { Job } from '@expo/eas-build-job';\nimport spawn, { SpawnPromise, SpawnResult, SpawnOptions } from '@expo/turtle-spawn';\n\nimport { BuildContext } from '../context';\nimport { PackageManager, findPackagerRootDir } from '../utils/packageManager';\nimport { isUsingModernYarnVersion } from '../utils/project';\n\nexport async function installDependenciesAsync({\n packageManager,\n env,\n logger,\n infoCallbackFn,\n cwd,\n useFrozenLockfile,\n}: {\n packageManager: PackageManager;\n env: Record<string, string | undefined>;\n cwd: string;\n logger: Exclude<SpawnOptions['logger'], undefined>;\n infoCallbackFn?: SpawnOptions['infoCallbackFn'];\n useFrozenLockfile: boolean;\n}): Promise<{ spawnPromise: SpawnPromise<SpawnResult> }> {\n let args: string[];\n switch (packageManager) {\n case PackageManager.NPM: {\n args = useFrozenLockfile ? ['ci', '--include=dev'] : ['install'];\n break;\n }\n case PackageManager.PNPM: {\n args = ['install', useFrozenLockfile ? '--frozen-lockfile' : '--no-frozen-lockfile'];\n break;\n }\n case PackageManager.YARN: {\n const isModernYarnVersion = await isUsingModernYarnVersion(cwd);\n if (isModernYarnVersion) {\n if (env['EAS_YARN_FOCUS_WORKSPACE']) {\n args = ['workspaces', 'focus', env['EAS_YARN_FOCUS_WORKSPACE']];\n } else {\n args = ['install', '--inline-builds', useFrozenLockfile ? '--immutable' : '--no-immutable'];\n }\n } else {\n args = ['install', ...(useFrozenLockfile ? ['--frozen-lockfile'] : [])];\n }\n break;\n }\n case PackageManager.BUN:\n args = ['install', ...(useFrozenLockfile ? ['--frozen-lockfile'] : [])];\n break;\n default:\n throw new Error(`Unsupported package manager: ${packageManager}`);\n }\n if (env['EAS_VERBOSE'] === '1') {\n args = [...args, '--verbose'];\n }\n logger.info(`Running \"${packageManager} ${args.join(' ')}\" in ${cwd} directory`);\n return {\n spawnPromise: spawn(packageManager, args, {\n cwd,\n logger,\n infoCallbackFn,\n env,\n }),\n };\n}\n\nexport function resolvePackagerDir(ctx: BuildContext<Job>): string {\n const packagerRunDir = findPackagerRootDir(ctx.getReactNativeProjectDirectory());\n if (packagerRunDir !== ctx.getReactNativeProjectDirectory()) {\n const relativeReactNativeProjectDirectory = path.relative(\n ctx.buildDirectory,\n ctx.getReactNativeProjectDirectory()\n );\n ctx.logger.info(\n `We detected that '${relativeReactNativeProjectDirectory}' is a ${ctx.packageManager} workspace`\n );\n }\n return packagerRunDir;\n}\n"]}
1
+ {"version":3,"file":"installDependencies.js","sourceRoot":"","sources":["../../src/common/installDependencies.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\n\nimport { Job } from '@expo/eas-build-job';\nimport spawn, { SpawnPromise, SpawnResult, SpawnOptions } from '@expo/turtle-spawn';\n\nimport { BuildContext } from '../context';\nimport { PackageManager, findPackagerRootDir } from '../utils/packageManager';\nimport { isUsingModernYarnVersion } from '../utils/project';\n\nexport async function installDependenciesAsync({\n packageManager,\n env,\n logger,\n infoCallbackFn,\n cwd,\n useFrozenLockfile,\n}: {\n packageManager: PackageManager;\n env: Record<string, string | undefined>;\n cwd: string;\n logger: Exclude<SpawnOptions['logger'], undefined>;\n infoCallbackFn?: SpawnOptions['infoCallbackFn'];\n useFrozenLockfile: boolean;\n}): Promise<{ spawnPromise: SpawnPromise<SpawnResult> }> {\n let args: string[];\n switch (packageManager) {\n case PackageManager.NPM: {\n args = useFrozenLockfile ? ['ci', '--include=dev'] : ['install'];\n break;\n }\n case PackageManager.PNPM: {\n args = ['install', useFrozenLockfile ? '--frozen-lockfile' : '--no-frozen-lockfile'];\n break;\n }\n case PackageManager.YARN: {\n const isModernYarnVersion = await isUsingModernYarnVersion(cwd);\n if (isModernYarnVersion) {\n if (env['EAS_YARN_FOCUS_WORKSPACE']) {\n args = ['workspaces', 'focus', env['EAS_YARN_FOCUS_WORKSPACE']];\n } else {\n args = [\n 'install',\n '--inline-builds',\n useFrozenLockfile ? '--immutable' : '--no-immutable',\n ];\n }\n } else {\n args = ['install', ...(useFrozenLockfile ? ['--frozen-lockfile'] : [])];\n }\n break;\n }\n case PackageManager.BUN:\n args = ['install', ...(useFrozenLockfile ? ['--frozen-lockfile'] : [])];\n break;\n default:\n throw new Error(`Unsupported package manager: ${packageManager}`);\n }\n if (env['EAS_VERBOSE'] === '1') {\n args = [...args, '--verbose'];\n }\n logger.info(`Running \"${packageManager} ${args.join(' ')}\" in ${cwd} directory`);\n return {\n spawnPromise: spawn(packageManager, args, {\n cwd,\n logger,\n infoCallbackFn,\n env,\n }),\n };\n}\n\nexport function resolvePackagerDir(ctx: BuildContext<Job>): string {\n const packagerRunDir = findPackagerRootDir(ctx.getReactNativeProjectDirectory());\n if (packagerRunDir !== ctx.getReactNativeProjectDirectory()) {\n const relativeReactNativeProjectDirectory = path.relative(\n ctx.buildDirectory,\n ctx.getReactNativeProjectDirectory()\n );\n ctx.logger.info(\n `We detected that '${relativeReactNativeProjectDirectory}' is a ${ctx.packageManager} workspace`\n );\n }\n return packagerRunDir;\n}\n"]}
@@ -17,27 +17,35 @@ const gql_tada_1 = require("gql.tada");
17
17
  const turtleFetch_1 = require("../utils/turtleFetch");
18
18
  const git_1 = require("./git");
19
19
  async function prepareProjectSourcesAsync(ctx, destinationDirectory = ctx.buildDirectory) {
20
- if (ctx.job.projectArchive.type === eas_build_job_1.ArchiveSourceType.GCS) {
20
+ var _a;
21
+ const projectArchiveResult = await (0, results_1.asyncResult)(fetchProjectArchiveSourceAsync(ctx));
22
+ if (!projectArchiveResult.ok) {
23
+ ctx.logger.error({ err: projectArchiveResult.reason }, 'Failed to refresh project archive, falling back to the original one');
24
+ }
25
+ const projectArchive = (_a = projectArchiveResult.value) !== null && _a !== void 0 ? _a : ctx.job.projectArchive;
26
+ if (projectArchive.type === eas_build_job_1.ArchiveSourceType.GCS) {
21
27
  throw new Error('GCS project sources should be resolved earlier to url');
22
28
  }
23
- else if (ctx.job.projectArchive.type === eas_build_job_1.ArchiveSourceType.PATH) {
24
- await prepareProjectSourcesLocallyAsync(ctx, ctx.job.projectArchive.path, destinationDirectory); // used in eas build --local
29
+ else if (projectArchive.type === eas_build_job_1.ArchiveSourceType.PATH) {
30
+ await prepareProjectSourcesLocallyAsync(ctx, projectArchive.path, destinationDirectory); // used in eas build --local
25
31
  }
26
- else if (ctx.job.projectArchive.type === eas_build_job_1.ArchiveSourceType.URL) {
27
- await downloadAndUnpackProjectFromTarGzAsync(ctx, ctx.job.projectArchive.url, destinationDirectory);
32
+ else if (projectArchive.type === eas_build_job_1.ArchiveSourceType.URL) {
33
+ await downloadAndUnpackProjectFromTarGzAsync(ctx, projectArchive.url, destinationDirectory);
28
34
  }
29
- else if (ctx.job.projectArchive.type === eas_build_job_1.ArchiveSourceType.GIT) {
30
- let repositoryUrl = ctx.job.projectArchive.repositoryUrl;
31
- try {
32
- repositoryUrl = await fetchRepositoryUrlAsync(ctx);
33
- }
34
- catch (err) {
35
- ctx.logger.error('Failed to refresh clone URL, falling back to the original one', err);
35
+ else if (projectArchive.type === eas_build_job_1.ArchiveSourceType.GIT) {
36
+ let repositoryUrl = projectArchive.repositoryUrl;
37
+ if (!projectArchiveResult.ok) {
38
+ try {
39
+ repositoryUrl = await fetchRepositoryUrlAsync(ctx);
40
+ }
41
+ catch (err) {
42
+ ctx.logger.error('Failed to refresh clone URL, falling back to the original one', err);
43
+ }
36
44
  }
37
45
  await (0, git_1.shallowCloneRepositoryAsync)({
38
46
  logger: ctx.logger,
39
47
  archiveSource: {
40
- ...ctx.job.projectArchive,
48
+ ...projectArchive,
41
49
  repositoryUrl,
42
50
  },
43
51
  destinationDirectory,
@@ -197,4 +205,35 @@ async function uploadProjectMetadataAsync(ctx, { projectDirectory }) {
197
205
  throw updateMetadataResult.error;
198
206
  }
199
207
  }
208
+ async function fetchProjectArchiveSourceAsync(ctx) {
209
+ var _a;
210
+ // We only support fetching project archive source for builds (non-empty platform).
211
+ if (!ctx.job.platform) {
212
+ return ctx.job.projectArchive;
213
+ }
214
+ const taskId = (0, nullthrows_1.default)(ctx.env.EAS_BUILD_ID, 'EAS_BUILD_ID is not set');
215
+ const expoApiServerURL = (0, nullthrows_1.default)(ctx.env.__API_SERVER_URL, '__API_SERVER_URL is not set');
216
+ const robotAccessToken = (0, nullthrows_1.default)((_a = ctx.job.secrets) === null || _a === void 0 ? void 0 : _a.robotAccessToken, 'robot access token is not set');
217
+ const response = await (0, turtleFetch_1.turtleFetch)(new URL(`/v2/turtle-builds/${taskId}/download-project-archive`, expoApiServerURL).toString(), 'POST', {
218
+ headers: {
219
+ Authorization: `Bearer ${robotAccessToken}`,
220
+ },
221
+ timeout: 20000,
222
+ retries: 3,
223
+ logger: ctx.logger,
224
+ });
225
+ if (!response.ok) {
226
+ const textResult = await (0, results_1.asyncResult)(response.text());
227
+ throw new Error(`Unexpected response from server (${response.status}): ${textResult.value}`);
228
+ }
229
+ const jsonResult = await (0, results_1.asyncResult)(response.json());
230
+ if (!jsonResult.ok) {
231
+ throw new Error(`Expected JSON response from server (${response.status}): ${jsonResult.reason}`);
232
+ }
233
+ const dataResult = zod_1.z.object({ data: eas_build_job_1.ArchiveSourceSchemaZ }).safeParse(jsonResult.value);
234
+ if (!dataResult.success) {
235
+ throw new Error(`Unexpected data from server (${response.status}): ${zod_1.z.prettifyError(dataResult.error)}`);
236
+ }
237
+ return dataResult.data.data;
238
+ }
200
239
  //# 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';\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"]}
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, ArchiveSource, ArchiveSourceSchemaZ } 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 const projectArchiveResult = await asyncResult(fetchProjectArchiveSourceAsync(ctx));\n\n if (!projectArchiveResult.ok) {\n ctx.logger.error(\n { err: projectArchiveResult.reason },\n 'Failed to refresh project archive, falling back to the original one'\n );\n }\n\n const projectArchive = projectArchiveResult.value ?? ctx.job.projectArchive;\n\n if (projectArchive.type === ArchiveSourceType.GCS) {\n throw new Error('GCS project sources should be resolved earlier to url');\n } else if (projectArchive.type === ArchiveSourceType.PATH) {\n await prepareProjectSourcesLocallyAsync(ctx, projectArchive.path, destinationDirectory); // used in eas build --local\n } else if (projectArchive.type === ArchiveSourceType.URL) {\n await downloadAndUnpackProjectFromTarGzAsync(ctx, projectArchive.url, destinationDirectory);\n } else if (projectArchive.type === ArchiveSourceType.GIT) {\n let repositoryUrl = projectArchive.repositoryUrl;\n if (!projectArchiveResult.ok) {\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\n await shallowCloneRepositoryAsync({\n logger: ctx.logger,\n archiveSource: {\n ...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\nasync function fetchProjectArchiveSourceAsync(ctx: BuildContext<Job>): Promise<ArchiveSource> {\n // We only support fetching project archive source for builds (non-empty platform).\n if (!ctx.job.platform) {\n return ctx.job.projectArchive;\n }\n\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/turtle-builds/${taskId}/download-project-archive`, expoApiServerURL).toString(),\n 'POST',\n {\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.object({ data: ArchiveSourceSchemaZ }).safeParse(jsonResult.value);\n if (!dataResult.success) {\n throw new Error(\n `Unexpected data from server (${response.status}): ${z.prettifyError(dataResult.error)}`\n );\n }\n\n return dataResult.data.data;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expo/build-tools",
3
- "version": "1.0.224",
3
+ "version": "1.0.227",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "files": [
@@ -31,13 +31,13 @@
31
31
  "@expo/config": "10.0.6",
32
32
  "@expo/config-plugins": "9.0.12",
33
33
  "@expo/downloader": "1.0.221",
34
- "@expo/eas-build-job": "1.0.221",
34
+ "@expo/eas-build-job": "1.0.227",
35
35
  "@expo/env": "^0.4.0",
36
36
  "@expo/logger": "1.0.221",
37
37
  "@expo/package-manager": "1.7.0",
38
38
  "@expo/plist": "^0.2.0",
39
39
  "@expo/results": "^1.0.0",
40
- "@expo/steps": "1.0.221",
40
+ "@expo/steps": "1.0.227",
41
41
  "@expo/template-file": "1.0.221",
42
42
  "@expo/turtle-spawn": "1.0.221",
43
43
  "@expo/xcpretty": "^4.3.1",
@@ -85,5 +85,5 @@
85
85
  "node": "20.14.0",
86
86
  "yarn": "1.22.21"
87
87
  },
88
- "gitHead": "93dd46b92362df4cfb24ca2ae76365098c30074d"
88
+ "gitHead": "0b2af11f7865f9315da1b46e56ebe07a7d1974cd"
89
89
  }