mirror of
https://github.com/expo/eas-cli.git
synced 2026-11-13 20:28:08 -10:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
24272d8a5f | ||
|
|
7d611b1f27 | ||
|
|
18cbbba4a5 | ||
|
|
77a3222cd3 | ||
|
|
b40f6a0f80 | ||
|
|
3028ddc0fe | ||
|
|
eb25ef74e6 | ||
|
|
845dd2f3b1 |
No files matched your search
+12
-1
@@ -8,12 +8,23 @@ This is the log of notable changes to EAS CLI and related packages.
|
||||
|
||||
### 🎉 New features
|
||||
|
||||
- [eas-cli] Support drill-down from event lists in observe:session. ([#3987](https://github.com/expo/eas-cli/pull/3987) by [@douglowder](https://github.com/douglowder))
|
||||
- [eas-cli] Prompt to select a platform in `eas simulator:start` when `--platform` is omitted, instead of erroring out. ([#4043](https://github.com/expo/eas-cli/pull/4043) by [@szdziedzic](https://github.com/szdziedzic))
|
||||
- [eas-build-job] Extend `app_store_connect.build_upload` workflow interpolation context with optional `cf_bundle_short_version_string`, `platform`, `uploaded_date`, and `created_date`. ([#4037](https://github.com/expo/eas-cli/pull/4037) by [@sswrk](https://github.com/sswrk))
|
||||
- [eas-cli] Allow `eas simulator` as a shorthand for `eas simulator:start`. ([#4053](https://github.com/expo/eas-cli/pull/4053) by [@szdziedzic](https://github.com/szdziedzic))
|
||||
|
||||
### 🐛 Bug fixes
|
||||
|
||||
- [eas-cli] Fix `eas update` failing with a server error when run inside an EAS Build. ([#4048](https://github.com/expo/eas-cli/pull/4048) by [@gwdp](https://github.com/gwdp))
|
||||
- [eas-cli] Avoid splitting an emoji when truncating a long git commit message, which produced an invalid commit message the build server rejected. ([#4055](https://github.com/expo/eas-cli/pull/4055) by [@gwdp](https://github.com/gwdp))
|
||||
|
||||
### 🧹 Chores
|
||||
|
||||
## [21.0.3](https://github.com/expo/eas-cli/releases/tag/v21.0.3) - 2026-07-22
|
||||
|
||||
### 🎉 New features
|
||||
|
||||
- [eas-cli] Support drill-down from event lists in observe:session. ([#3987](https://github.com/expo/eas-cli/pull/3987) by [@douglowder](https://github.com/douglowder))
|
||||
|
||||
## [21.0.2](https://github.com/expo/eas-cli/releases/tag/v21.0.2) - 2026-07-17
|
||||
|
||||
### 🐛 Bug fixes
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"npmClient": "yarn",
|
||||
"version": "21.0.3",
|
||||
"version": "21.1.0",
|
||||
"$schema": "node_modules/lerna/schemas/lerna-schema.json"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@expo/build-tools",
|
||||
"version": "21.0.3",
|
||||
"version": "21.1.0",
|
||||
"bugs": "https://github.com/expo/eas-cli/issues",
|
||||
"license": "BUSL-1.1",
|
||||
"author": "Expo <[email protected]>",
|
||||
@@ -39,14 +39,14 @@
|
||||
"@expo/config": "55.0.10",
|
||||
"@expo/config-plugins": "55.0.7",
|
||||
"@expo/downloader": "21.0.0",
|
||||
"@expo/eas-build-job": "21.0.3",
|
||||
"@expo/eas-build-job": "21.1.0",
|
||||
"@expo/env": "^0.4.0",
|
||||
"@expo/logger": "21.0.0",
|
||||
"@expo/package-manager": "1.9.10",
|
||||
"@expo/plist": "^0.3.5",
|
||||
"@expo/results": "^1.0.0",
|
||||
"@expo/spawn-async": "1.7.2",
|
||||
"@expo/steps": "21.0.3",
|
||||
"@expo/steps": "21.1.0",
|
||||
"@expo/template-file": "21.0.2",
|
||||
"@expo/turtle-spawn": "21.0.0",
|
||||
"@expo/xcpretty": "^4.3.1",
|
||||
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
import { type bunyan } from '@expo/logger';
|
||||
|
||||
import { Sentry } from '../../../sentry';
|
||||
import { stopAgentDeviceEventCollectionSafelyAsync } from '../startAgentDeviceRemoteSession';
|
||||
|
||||
jest.mock('../../../sentry');
|
||||
|
||||
describe(stopAgentDeviceEventCollectionSafelyAsync, () => {
|
||||
beforeEach(() => {
|
||||
jest.clearAllMocks();
|
||||
});
|
||||
|
||||
it('reports an unexpected stop failure without rejecting', async () => {
|
||||
const error = new Error('stop failed');
|
||||
const logger = { warn: jest.fn() } as unknown as bunyan;
|
||||
|
||||
await expect(
|
||||
stopAgentDeviceEventCollectionSafelyAsync({
|
||||
eventCollection: { stopAsync: jest.fn().mockRejectedValue(error) },
|
||||
deviceRunSessionId: 'session-id',
|
||||
logger,
|
||||
})
|
||||
).resolves.toBeUndefined();
|
||||
|
||||
expect(Sentry.capture).toHaveBeenCalledWith(
|
||||
'Could not finish agent-device session event collection',
|
||||
error,
|
||||
{
|
||||
level: 'warning',
|
||||
tags: { phase: 'agent-device-event-collection', operation: 'stop' },
|
||||
extras: { deviceRunSessionId: 'session-id' },
|
||||
}
|
||||
);
|
||||
expect(logger.warn).toHaveBeenCalledWith(
|
||||
{ err: error },
|
||||
'Could not finish agent-device session event collection.'
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -15,6 +15,7 @@ import path from 'node:path';
|
||||
import { type CustomBuildContext } from '../../customBuildContext';
|
||||
import { Sentry } from '../../sentry';
|
||||
import { pollAgentDeviceArtifactsForUploadAsync } from '../utils/agentDeviceArtifacts';
|
||||
import { startAgentDeviceEventCollectionAsync } from '../utils/deviceRunSessionEvents';
|
||||
import {
|
||||
type DetachedProcessHandle,
|
||||
getDeviceRunSessionIdOrThrow,
|
||||
@@ -32,7 +33,8 @@ import {
|
||||
const AGENT_DEVICE_PACKAGE_NAME = 'agent-device';
|
||||
const AGENT_DEVICE_REPO_URL = 'https://github.com/callstack/agent-device.git';
|
||||
const SRC_DIR = '/tmp/agent-device-src';
|
||||
const DAEMON_JSON_PATH = path.join(os.homedir(), '.agent-device', 'daemon.json');
|
||||
const AGENT_DEVICE_STATE_DIR = path.join(os.homedir(), '.agent-device');
|
||||
const DAEMON_JSON_PATH = path.join(AGENT_DEVICE_STATE_DIR, 'daemon.json');
|
||||
const STARTUP_TIMEOUT_MS = 60_000;
|
||||
const AGENT_DEVICE_DAEMON_ENV = {
|
||||
AGENT_DEVICE_DAEMON_SERVER_MODE: 'http',
|
||||
@@ -122,16 +124,53 @@ export function createStartAgentDeviceRemoteSessionBuildFunction(
|
||||
logger,
|
||||
});
|
||||
|
||||
await waitForDeviceRunSessionStoppedAsync({
|
||||
const eventCollection = await startAgentDeviceEventCollectionAsync({
|
||||
ctx,
|
||||
deviceRunSessionId,
|
||||
stateDir: AGENT_DEVICE_STATE_DIR,
|
||||
logger,
|
||||
signal,
|
||||
});
|
||||
|
||||
try {
|
||||
await waitForDeviceRunSessionStoppedAsync({
|
||||
ctx,
|
||||
deviceRunSessionId,
|
||||
logger,
|
||||
signal,
|
||||
});
|
||||
} finally {
|
||||
await stopAgentDeviceEventCollectionSafelyAsync({
|
||||
eventCollection,
|
||||
deviceRunSessionId,
|
||||
logger,
|
||||
});
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
export async function stopAgentDeviceEventCollectionSafelyAsync({
|
||||
eventCollection,
|
||||
deviceRunSessionId,
|
||||
logger,
|
||||
}: {
|
||||
eventCollection: { stopAsync: () => Promise<void> };
|
||||
deviceRunSessionId: string;
|
||||
logger: bunyan;
|
||||
}): Promise<void> {
|
||||
try {
|
||||
await eventCollection.stopAsync();
|
||||
} catch (err) {
|
||||
const error = err instanceof Error ? err : new Error(String(err));
|
||||
Sentry.capture('Could not finish agent-device session event collection', error, {
|
||||
level: 'warning',
|
||||
tags: { phase: 'agent-device-event-collection', operation: 'stop' },
|
||||
extras: { deviceRunSessionId },
|
||||
});
|
||||
logger.warn({ err: error }, 'Could not finish agent-device session event collection.');
|
||||
}
|
||||
}
|
||||
|
||||
async function startAgentDeviceDaemonAsync({
|
||||
packageVersion,
|
||||
env,
|
||||
|
||||
@@ -0,0 +1,562 @@
|
||||
import { type bunyan } from '@expo/logger';
|
||||
import fs from 'node:fs';
|
||||
import os from 'node:os';
|
||||
import path from 'node:path';
|
||||
|
||||
import { type CustomBuildContext } from '../../../customBuildContext';
|
||||
import RemoteLoggerStream from '../../../logging/RemoteLoggerStream';
|
||||
import { Sentry } from '../../../sentry';
|
||||
import { startAgentDeviceEventCollectionAsync } from '../deviceRunSessionEvents';
|
||||
|
||||
const mockEventLogStream = {
|
||||
init: jest.fn(async () => undefined),
|
||||
write: jest.fn(),
|
||||
cleanUp: jest.fn(async () => undefined),
|
||||
};
|
||||
|
||||
jest.mock('../../../logging/RemoteLoggerStream', () => ({
|
||||
__esModule: true,
|
||||
default: jest.fn(() => mockEventLogStream),
|
||||
}));
|
||||
jest.mock('../../../sentry');
|
||||
|
||||
describe(startAgentDeviceEventCollectionAsync, () => {
|
||||
beforeEach(() => {
|
||||
jest.clearAllMocks();
|
||||
});
|
||||
|
||||
it('uploads normalized events to the session event artifact once', async () => {
|
||||
const stateDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'agent-device-events-'));
|
||||
const eventsDir = path.join(stateDir, 'sessions', 'default');
|
||||
const eventsFile = path.join(eventsDir, 'events.ndjson');
|
||||
await fs.promises.mkdir(eventsDir, { recursive: true });
|
||||
await fs.promises.writeFile(
|
||||
eventsFile,
|
||||
`${JSON.stringify({
|
||||
version: 1,
|
||||
ts: '2026-07-10T12:00:00.000Z',
|
||||
session: 'default',
|
||||
kind: 'request.started',
|
||||
requestId: 'request-1',
|
||||
command: 'tap',
|
||||
summary: 'Started tap',
|
||||
})}\n`
|
||||
);
|
||||
const ctx = createContext();
|
||||
const logger = createLogger();
|
||||
const collection = await startAgentDeviceEventCollectionAsync({
|
||||
ctx,
|
||||
deviceRunSessionId: 'session-id',
|
||||
stateDir,
|
||||
logger,
|
||||
pollIntervalMs: 10,
|
||||
});
|
||||
|
||||
try {
|
||||
await waitForAsync(() => expect(mockEventLogStream.write).toHaveBeenCalledTimes(1));
|
||||
await fs.promises.appendFile(
|
||||
eventsFile,
|
||||
`${JSON.stringify({
|
||||
version: 1,
|
||||
ts: '2026-07-10T12:00:01.000Z',
|
||||
session: 'default',
|
||||
kind: 'request.finished',
|
||||
requestId: 'request-1',
|
||||
command: 'tap',
|
||||
status: 'ok',
|
||||
summary: 'Finished tap',
|
||||
details: { durationMs: 25 },
|
||||
})}\n${JSON.stringify({
|
||||
version: 1,
|
||||
ts: 123,
|
||||
session: 'default',
|
||||
kind: 'request.started',
|
||||
})}\n`
|
||||
);
|
||||
await waitForAsync(() => expect(mockEventLogStream.write).toHaveBeenCalledTimes(2));
|
||||
} finally {
|
||||
await collection.stopAsync();
|
||||
await fs.promises.rm(stateDir, { recursive: true, force: true });
|
||||
}
|
||||
|
||||
expect(ctx.graphqlClient.mutation).toHaveBeenCalledWith(expect.anything(), {
|
||||
deviceRunSessionId: 'session-id',
|
||||
});
|
||||
expect(RemoteLoggerStream).toHaveBeenCalledWith({
|
||||
logger,
|
||||
uploadMethod: {
|
||||
signedUrl: {
|
||||
url: 'https://uploads.expo.test/events',
|
||||
headers: {
|
||||
'content-disposition': 'attachment; filename="events.ndjson"',
|
||||
'x-goog-content-length-range': '0,104857600',
|
||||
},
|
||||
},
|
||||
},
|
||||
options: { uploadIntervalMs: 5_000 },
|
||||
});
|
||||
expect(mockEventLogStream.init).toHaveBeenCalledTimes(1);
|
||||
expect(mockEventLogStream.cleanUp).toHaveBeenCalledTimes(1);
|
||||
expect(mockEventLogStream.write).toHaveBeenNthCalledWith(2, {
|
||||
v: 1,
|
||||
eventId: 'agent-device:session-id:default:2',
|
||||
ts: '2026-07-10T12:00:01.000Z',
|
||||
producer: 'agent-device',
|
||||
type: 'operation.completed',
|
||||
operationId: 'request-1',
|
||||
outcome: 'success',
|
||||
durationMs: 25,
|
||||
summary: 'Finished tap',
|
||||
data: {
|
||||
session: 'default',
|
||||
sourceVersion: 1,
|
||||
sourceStatus: 'ok',
|
||||
durationMs: 25,
|
||||
},
|
||||
});
|
||||
expect(Sentry.capture).toHaveBeenCalledTimes(1);
|
||||
expect(Sentry.capture).toHaveBeenCalledWith(
|
||||
'Could not parse an agent-device event log record',
|
||||
{
|
||||
level: 'warning',
|
||||
tags: { phase: 'agent-device-event-collection', reason: 'invalid-event' },
|
||||
extras: { deviceRunSessionId: 'session-id', lineNumber: 3 },
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
it('preserves unknown kinds and tolerates optional upstream field changes', async () => {
|
||||
const stateDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'agent-device-events-'));
|
||||
const eventsDir = path.join(stateDir, 'sessions', 'default');
|
||||
await fs.promises.mkdir(eventsDir, { recursive: true });
|
||||
await fs.promises.writeFile(
|
||||
path.join(eventsDir, 'events.ndjson'),
|
||||
`${JSON.stringify({
|
||||
version: 2,
|
||||
ts: '2026-07-10T12:00:00.000Z',
|
||||
session: 'default',
|
||||
kind: 'snapshot.recorded',
|
||||
requestId: 123,
|
||||
status: 'queued',
|
||||
newUpstreamField: true,
|
||||
})}\n`
|
||||
);
|
||||
const collection = await startAgentDeviceEventCollectionAsync({
|
||||
ctx: createContext(),
|
||||
deviceRunSessionId: 'session-id',
|
||||
stateDir,
|
||||
logger: createLogger(),
|
||||
pollIntervalMs: 10,
|
||||
});
|
||||
|
||||
try {
|
||||
await waitForAsync(() => expect(mockEventLogStream.write).toHaveBeenCalledTimes(1));
|
||||
} finally {
|
||||
await collection.stopAsync();
|
||||
await fs.promises.rm(stateDir, { recursive: true, force: true });
|
||||
}
|
||||
|
||||
expect(mockEventLogStream.write).toHaveBeenCalledWith({
|
||||
v: 1,
|
||||
eventId: 'agent-device:session-id:default:1',
|
||||
ts: '2026-07-10T12:00:00.000Z',
|
||||
producer: 'agent-device',
|
||||
type: 'snapshot.recorded',
|
||||
summary: 'snapshot.recorded',
|
||||
data: { session: 'default', sourceVersion: 2, sourceStatus: 'queued' },
|
||||
});
|
||||
expect(Sentry.capture).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('preserves a multi-byte character split across polls', async () => {
|
||||
const stateDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'agent-device-events-'));
|
||||
const eventsDir = path.join(stateDir, 'sessions', 'unicode-session');
|
||||
const eventsFile = path.join(eventsDir, 'events.ndjson');
|
||||
await fs.promises.mkdir(eventsDir, { recursive: true });
|
||||
const completeEvent = `${JSON.stringify(
|
||||
createAgentDeviceEvent({ summary: 'Complete event before split character' })
|
||||
)}\n`;
|
||||
const splitEvent = `${JSON.stringify(
|
||||
createAgentDeviceEvent({ session: 'upstream-session', summary: 'Tapped 🙂 successfully' })
|
||||
)}\n`;
|
||||
const serializedText = `${completeEvent}${splitEvent}`;
|
||||
const emojiCharacterOffset = serializedText.indexOf('🙂');
|
||||
expect(emojiCharacterOffset).toBeGreaterThanOrEqual(0);
|
||||
const encoder = new TextEncoder();
|
||||
const serializedEvent = encoder.encode(serializedText);
|
||||
const splitOffset =
|
||||
encoder.encode(serializedText.slice(0, emojiCharacterOffset)).byteLength + 2;
|
||||
await fs.promises.writeFile(eventsFile, serializedEvent.subarray(0, splitOffset));
|
||||
|
||||
const collection = await startAgentDeviceEventCollectionAsync({
|
||||
ctx: createContext(),
|
||||
deviceRunSessionId: 'session-id',
|
||||
stateDir,
|
||||
logger: createLogger(),
|
||||
pollIntervalMs: 60_000,
|
||||
});
|
||||
|
||||
try {
|
||||
await waitForAsync(() => expect(mockEventLogStream.write).toHaveBeenCalledTimes(1));
|
||||
await fs.promises.appendFile(eventsFile, serializedEvent.subarray(splitOffset));
|
||||
} finally {
|
||||
await collection.stopAsync();
|
||||
await fs.promises.rm(stateDir, { recursive: true, force: true });
|
||||
}
|
||||
|
||||
expect(mockEventLogStream.write).toHaveBeenCalledWith(
|
||||
expect.objectContaining({
|
||||
eventId: 'agent-device:session-id:unicode-session:2',
|
||||
summary: 'Tapped 🙂 successfully',
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
it('reassembles a partial line across polls', async () => {
|
||||
const stateDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'agent-device-events-'));
|
||||
const eventsDir = path.join(stateDir, 'sessions', 'partial-line-session');
|
||||
const eventsFile = path.join(eventsDir, 'events.ndjson');
|
||||
await fs.promises.mkdir(eventsDir, { recursive: true });
|
||||
const completeEvent = `${JSON.stringify(
|
||||
createAgentDeviceEvent({ summary: 'Complete event before partial line' })
|
||||
)}\n`;
|
||||
const partialEvent = `${JSON.stringify(
|
||||
createAgentDeviceEvent({ summary: 'Completed after two writes' })
|
||||
)}\n`;
|
||||
const serializedEvent = `${completeEvent}${partialEvent}`;
|
||||
const splitOffset = completeEvent.length + Math.floor(partialEvent.length / 2);
|
||||
await fs.promises.writeFile(eventsFile, serializedEvent.slice(0, splitOffset));
|
||||
|
||||
const collection = await startAgentDeviceEventCollectionAsync({
|
||||
ctx: createContext(),
|
||||
deviceRunSessionId: 'session-id',
|
||||
stateDir,
|
||||
logger: createLogger(),
|
||||
pollIntervalMs: 60_000,
|
||||
});
|
||||
|
||||
try {
|
||||
await waitForAsync(() => expect(mockEventLogStream.write).toHaveBeenCalledTimes(1));
|
||||
await fs.promises.appendFile(eventsFile, serializedEvent.slice(splitOffset));
|
||||
} finally {
|
||||
await collection.stopAsync();
|
||||
await fs.promises.rm(stateDir, { recursive: true, force: true });
|
||||
}
|
||||
|
||||
expect(mockEventLogStream.write).toHaveBeenCalledWith(
|
||||
expect.objectContaining({
|
||||
eventId: 'agent-device:session-id:partial-line-session:2',
|
||||
summary: 'Completed after two writes',
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
it('does not reuse event IDs after the source file is truncated', async () => {
|
||||
const stateDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'agent-device-events-'));
|
||||
const eventsDir = path.join(stateDir, 'sessions', 'rotated-session');
|
||||
const eventsFile = path.join(eventsDir, 'events.ndjson');
|
||||
await fs.promises.mkdir(eventsDir, { recursive: true });
|
||||
await fs.promises.writeFile(
|
||||
eventsFile,
|
||||
`${JSON.stringify(createAgentDeviceEvent({ summary: 'First event before truncation' }))}\n${JSON.stringify(
|
||||
createAgentDeviceEvent({ summary: 'Second event before truncation' })
|
||||
)}\n`
|
||||
);
|
||||
|
||||
const collection = await startAgentDeviceEventCollectionAsync({
|
||||
ctx: createContext(),
|
||||
deviceRunSessionId: 'session-id',
|
||||
stateDir,
|
||||
logger: createLogger(),
|
||||
pollIntervalMs: 60_000,
|
||||
});
|
||||
|
||||
try {
|
||||
await waitForAsync(() => expect(mockEventLogStream.write).toHaveBeenCalledTimes(2));
|
||||
await fs.promises.writeFile(
|
||||
eventsFile,
|
||||
`${JSON.stringify(createAgentDeviceEvent({ summary: 'After truncation' }))}\n`
|
||||
);
|
||||
} finally {
|
||||
await collection.stopAsync();
|
||||
await fs.promises.rm(stateDir, { recursive: true, force: true });
|
||||
}
|
||||
|
||||
expect(mockEventLogStream.write).toHaveBeenCalledTimes(3);
|
||||
expect(mockEventLogStream.write).toHaveBeenNthCalledWith(
|
||||
3,
|
||||
expect.objectContaining({
|
||||
eventId: 'agent-device:session-id:rotated-session:3',
|
||||
summary: 'After truncation',
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
it('namespaces events by their source session directory', async () => {
|
||||
const stateDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'agent-device-events-'));
|
||||
const firstEventsDir = path.join(stateDir, 'sessions', 'first-directory');
|
||||
const secondEventsDir = path.join(stateDir, 'sessions', 'second-directory');
|
||||
await Promise.all([
|
||||
fs.promises.mkdir(firstEventsDir, { recursive: true }),
|
||||
fs.promises.mkdir(secondEventsDir, { recursive: true }),
|
||||
]);
|
||||
await Promise.all([
|
||||
fs.promises.writeFile(
|
||||
path.join(firstEventsDir, 'events.ndjson'),
|
||||
`${JSON.stringify(
|
||||
createAgentDeviceEvent({ session: 'shared-upstream-session', summary: 'First directory' })
|
||||
)}\n`
|
||||
),
|
||||
fs.promises.writeFile(
|
||||
path.join(secondEventsDir, 'events.ndjson'),
|
||||
`${JSON.stringify(
|
||||
createAgentDeviceEvent({
|
||||
session: 'shared-upstream-session',
|
||||
summary: 'Second directory',
|
||||
})
|
||||
)}\n`
|
||||
),
|
||||
]);
|
||||
|
||||
const collection = await startAgentDeviceEventCollectionAsync({
|
||||
ctx: createContext(),
|
||||
deviceRunSessionId: 'session-id',
|
||||
stateDir,
|
||||
logger: createLogger(),
|
||||
pollIntervalMs: 60_000,
|
||||
});
|
||||
|
||||
try {
|
||||
await waitForAsync(() => expect(mockEventLogStream.write).toHaveBeenCalledTimes(2));
|
||||
} finally {
|
||||
await collection.stopAsync();
|
||||
await fs.promises.rm(stateDir, { recursive: true, force: true });
|
||||
}
|
||||
|
||||
expect(mockEventLogStream.write.mock.calls.map(([event]) => event.eventId).sort()).toEqual([
|
||||
'agent-device:session-id:first-directory:1',
|
||||
'agent-device:session-id:second-directory:1',
|
||||
]);
|
||||
});
|
||||
|
||||
it('reports an aggregate summary when multiple records cannot be parsed', async () => {
|
||||
const stateDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'agent-device-events-'));
|
||||
const eventsDir = path.join(stateDir, 'sessions', 'default');
|
||||
await fs.promises.mkdir(eventsDir, { recursive: true });
|
||||
await fs.promises.writeFile(
|
||||
path.join(eventsDir, 'events.ndjson'),
|
||||
`not-json\n${JSON.stringify({
|
||||
version: 1,
|
||||
ts: 123,
|
||||
session: 'default',
|
||||
kind: 'request.started',
|
||||
})}\n`
|
||||
);
|
||||
const logger = createLogger();
|
||||
const collection = await startAgentDeviceEventCollectionAsync({
|
||||
ctx: createContext(),
|
||||
deviceRunSessionId: 'session-id',
|
||||
stateDir,
|
||||
logger,
|
||||
pollIntervalMs: 60_000,
|
||||
});
|
||||
|
||||
try {
|
||||
await waitForAsync(() => expect(Sentry.capture).toHaveBeenCalledTimes(1));
|
||||
} finally {
|
||||
await collection.stopAsync();
|
||||
await fs.promises.rm(stateDir, { recursive: true, force: true });
|
||||
}
|
||||
|
||||
expect(logger.warn).toHaveBeenCalledWith(
|
||||
{
|
||||
agentDeviceEventParseFailures: { 'invalid-json': 1, 'invalid-event': 1 },
|
||||
parseFailureCount: 2,
|
||||
},
|
||||
'Could not parse 2 agent-device event log records.'
|
||||
);
|
||||
expect(Sentry.capture).toHaveBeenCalledTimes(2);
|
||||
expect(Sentry.capture).toHaveBeenNthCalledWith(
|
||||
2,
|
||||
'Could not parse multiple agent-device event log records',
|
||||
{
|
||||
level: 'warning',
|
||||
tags: { phase: 'agent-device-event-collection' },
|
||||
extras: {
|
||||
deviceRunSessionId: 'session-id',
|
||||
parseFailureCount: 2,
|
||||
parseFailureCounts: { 'invalid-json': 1, 'invalid-event': 1 },
|
||||
},
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
it('reports a continuous collection failure only once', async () => {
|
||||
const stateDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'agent-device-events-'));
|
||||
await fs.promises.writeFile(path.join(stateDir, 'sessions'), 'not a directory');
|
||||
const collection = await startAgentDeviceEventCollectionAsync({
|
||||
ctx: createContext(),
|
||||
deviceRunSessionId: 'session-id',
|
||||
stateDir,
|
||||
logger: createLogger(),
|
||||
pollIntervalMs: 10,
|
||||
});
|
||||
|
||||
try {
|
||||
await waitForAsync(() => expect(Sentry.capture).toHaveBeenCalledTimes(1));
|
||||
} finally {
|
||||
await collection.stopAsync();
|
||||
await fs.promises.rm(stateDir, { recursive: true, force: true });
|
||||
}
|
||||
|
||||
expect(Sentry.capture).toHaveBeenCalledTimes(1);
|
||||
expect(Sentry.capture).toHaveBeenCalledWith(
|
||||
'Could not collect agent-device events',
|
||||
expect.any(Error),
|
||||
{
|
||||
level: 'warning',
|
||||
tags: { phase: 'agent-device-event-collection' },
|
||||
extras: { deviceRunSessionId: 'session-id' },
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
it('handles a polling rejection even when reporting it fails', async () => {
|
||||
const stateDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'agent-device-events-'));
|
||||
await fs.promises.writeFile(path.join(stateDir, 'sessions'), 'not a directory');
|
||||
const reportingError = new Error('Sentry unavailable');
|
||||
jest
|
||||
.mocked(Sentry.capture)
|
||||
.mockImplementationOnce(() => {
|
||||
throw reportingError;
|
||||
})
|
||||
.mockImplementationOnce(() => {
|
||||
throw reportingError;
|
||||
});
|
||||
const logger = createLogger();
|
||||
const collection = await startAgentDeviceEventCollectionAsync({
|
||||
ctx: createContext(),
|
||||
deviceRunSessionId: 'session-id',
|
||||
stateDir,
|
||||
logger,
|
||||
pollIntervalMs: 10,
|
||||
});
|
||||
|
||||
try {
|
||||
await waitForAsync(() =>
|
||||
expect(logger.warn).toHaveBeenCalledWith(
|
||||
{ err: reportingError },
|
||||
'Agent-device event collection poller failed.'
|
||||
)
|
||||
);
|
||||
await expect(collection.stopAsync()).resolves.toBeUndefined();
|
||||
} finally {
|
||||
await fs.promises.rm(stateDir, { recursive: true, force: true });
|
||||
}
|
||||
|
||||
expect(Sentry.capture).toHaveBeenCalledTimes(2);
|
||||
expect(Sentry.capture).toHaveBeenNthCalledWith(
|
||||
2,
|
||||
'Agent-device event collection poller failed',
|
||||
reportingError,
|
||||
{
|
||||
level: 'warning',
|
||||
tags: { phase: 'agent-device-event-collection', operation: 'poll' },
|
||||
extras: { deviceRunSessionId: 'session-id' },
|
||||
}
|
||||
);
|
||||
expect(mockEventLogStream.cleanUp).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
it('does not fail the session when event log setup fails', async () => {
|
||||
const error = new Error('WWW unavailable');
|
||||
const ctx = createContext();
|
||||
jest.mocked(ctx.graphqlClient.mutation).mockReturnValueOnce({
|
||||
toPromise: async () => ({ error }),
|
||||
} as unknown as ReturnType<CustomBuildContext['graphqlClient']['mutation']>);
|
||||
const logger = createLogger();
|
||||
|
||||
const collection = await startAgentDeviceEventCollectionAsync({
|
||||
ctx,
|
||||
deviceRunSessionId: 'session-id',
|
||||
stateDir: '/does/not/matter',
|
||||
logger,
|
||||
pollIntervalMs: 10,
|
||||
});
|
||||
await collection.stopAsync();
|
||||
|
||||
expect(logger.warn).toHaveBeenCalledWith(
|
||||
{
|
||||
err: expect.objectContaining({
|
||||
message: 'Failed to create device run session event log upload session: WWW unavailable',
|
||||
cause: error,
|
||||
}),
|
||||
},
|
||||
'Could not start device run session event collection.'
|
||||
);
|
||||
expect(Sentry.capture).toHaveBeenCalledWith(
|
||||
'Could not persist device run session events',
|
||||
expect.objectContaining({
|
||||
message: 'Failed to create device run session event log upload session: WWW unavailable',
|
||||
cause: error,
|
||||
}),
|
||||
{
|
||||
level: 'warning',
|
||||
tags: { phase: 'device-run-session-event-collection', operation: 'setup' },
|
||||
extras: { deviceRunSessionId: 'session-id' },
|
||||
}
|
||||
);
|
||||
expect(mockEventLogStream.init).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
function createContext(): CustomBuildContext {
|
||||
const mutation = jest.fn().mockReturnValue({
|
||||
toPromise: async () => ({
|
||||
data: {
|
||||
deviceRunSession: {
|
||||
createEventLogUploadSession: {
|
||||
uploadSession: {
|
||||
url: 'https://uploads.expo.test/events',
|
||||
headers: {
|
||||
'content-disposition': 'attachment; filename="events.ndjson"',
|
||||
'x-goog-content-length-range': '0,104857600',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}),
|
||||
});
|
||||
return { graphqlClient: { mutation } } as unknown as CustomBuildContext;
|
||||
}
|
||||
|
||||
function createLogger(): bunyan {
|
||||
return { info: jest.fn(), warn: jest.fn() } as unknown as bunyan;
|
||||
}
|
||||
|
||||
function createAgentDeviceEvent(overrides: Record<string, unknown> = {}): Record<string, unknown> {
|
||||
return {
|
||||
version: 1,
|
||||
ts: '2026-07-10T12:00:00.000Z',
|
||||
session: 'default',
|
||||
kind: 'request.started',
|
||||
summary: 'Started activity',
|
||||
...overrides,
|
||||
};
|
||||
}
|
||||
|
||||
async function waitForAsync(assertion: () => void): Promise<void> {
|
||||
const deadline = Date.now() + 2_000;
|
||||
for (;;) {
|
||||
try {
|
||||
assertion();
|
||||
return;
|
||||
} catch (err) {
|
||||
if (Date.now() >= deadline) {
|
||||
throw err;
|
||||
}
|
||||
await new Promise(resolve => setTimeout(resolve, 10));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,400 @@
|
||||
import { SystemError } from '@expo/eas-build-job';
|
||||
import { type bunyan } from '@expo/logger';
|
||||
import { graphql } from 'gql.tada';
|
||||
import fs from 'node:fs';
|
||||
import path from 'node:path';
|
||||
import { StringDecoder } from 'node:string_decoder';
|
||||
import { setTimeout as setTimeoutAsync } from 'node:timers/promises';
|
||||
import { z } from 'zod';
|
||||
|
||||
import { type CustomBuildContext } from '../../customBuildContext';
|
||||
import RemoteLoggerStream from '../../logging/RemoteLoggerStream';
|
||||
import { Sentry } from '../../sentry';
|
||||
import { type SignedUrl } from '../../storage/uploadWithSignedUrl';
|
||||
|
||||
const POLL_INTERVAL_MS = 1_000;
|
||||
const UPLOAD_INTERVAL_MS = 5_000;
|
||||
|
||||
const AGENT_DEVICE_EVENT_KIND_TO_TYPE: Record<string, string> = {
|
||||
'request.started': 'operation.started',
|
||||
'request.finished': 'operation.completed',
|
||||
'action.recorded': 'interaction.recorded',
|
||||
};
|
||||
|
||||
const AgentDeviceEventSchema = z
|
||||
.object({
|
||||
version: z.number(),
|
||||
ts: z.string(),
|
||||
session: z.string(),
|
||||
kind: z.string(),
|
||||
requestId: z.string().optional().catch(undefined),
|
||||
command: z.string().optional().catch(undefined),
|
||||
status: z.string().optional().catch(undefined),
|
||||
summary: z.string().optional().catch(undefined),
|
||||
details: z.record(z.string(), z.unknown()).optional().catch(undefined),
|
||||
})
|
||||
.passthrough();
|
||||
|
||||
const CREATE_DEVICE_RUN_SESSION_EVENT_LOG_UPLOAD_SESSION_MUTATION = graphql(`
|
||||
mutation CreateDeviceRunSessionEventLogUploadSession($deviceRunSessionId: ID!) {
|
||||
deviceRunSession {
|
||||
createEventLogUploadSession(deviceRunSessionId: $deviceRunSessionId) {
|
||||
uploadSession {
|
||||
url
|
||||
headers
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
`);
|
||||
|
||||
type AgentDeviceEvent = z.infer<typeof AgentDeviceEventSchema>;
|
||||
|
||||
export type DeviceRunSessionEvent = {
|
||||
v: 1;
|
||||
eventId: string;
|
||||
ts: string;
|
||||
producer: string;
|
||||
type: string;
|
||||
operationId?: string;
|
||||
outcome?: 'success' | 'failure';
|
||||
durationMs?: number;
|
||||
summary: string;
|
||||
data?: Record<string, unknown>;
|
||||
};
|
||||
|
||||
type EventFileState = {
|
||||
offset: number;
|
||||
nextSequenceNumber: number;
|
||||
nextLineNumber: number;
|
||||
pending: string;
|
||||
decoder: StringDecoder;
|
||||
};
|
||||
|
||||
type AgentDeviceEventParseFailure = 'invalid-json' | 'invalid-event';
|
||||
type AgentDeviceEventParseResult = {
|
||||
event?: AgentDeviceEvent;
|
||||
failure?: AgentDeviceEventParseFailure;
|
||||
};
|
||||
|
||||
export async function startAgentDeviceEventCollectionAsync({
|
||||
ctx,
|
||||
deviceRunSessionId,
|
||||
stateDir,
|
||||
logger,
|
||||
pollIntervalMs = POLL_INTERVAL_MS,
|
||||
}: {
|
||||
ctx: CustomBuildContext;
|
||||
deviceRunSessionId: string;
|
||||
stateDir: string;
|
||||
logger: bunyan;
|
||||
pollIntervalMs?: number;
|
||||
}): Promise<{ stopAsync: () => Promise<void> }> {
|
||||
let didReportEventLogFailure = false;
|
||||
const reportEventLogFailure = (error: Error, operation: 'setup' | 'cleanup'): void => {
|
||||
if (didReportEventLogFailure) {
|
||||
return;
|
||||
}
|
||||
didReportEventLogFailure = true;
|
||||
Sentry.capture('Could not persist device run session events', error, {
|
||||
level: 'warning',
|
||||
tags: { phase: 'device-run-session-event-collection', operation },
|
||||
extras: { deviceRunSessionId },
|
||||
});
|
||||
};
|
||||
|
||||
let eventLogStream: RemoteLoggerStream;
|
||||
try {
|
||||
const uploadSession = await createEventLogUploadSessionAsync(ctx, deviceRunSessionId);
|
||||
eventLogStream = new RemoteLoggerStream({
|
||||
logger,
|
||||
uploadMethod: { signedUrl: uploadSession },
|
||||
options: {
|
||||
uploadIntervalMs: UPLOAD_INTERVAL_MS,
|
||||
},
|
||||
});
|
||||
await eventLogStream.init();
|
||||
} catch (err) {
|
||||
const error = err instanceof Error ? err : new Error(String(err));
|
||||
logger.warn({ err: error }, 'Could not start device run session event collection.');
|
||||
reportEventLogFailure(error, 'setup');
|
||||
return { stopAsync: async () => {} };
|
||||
}
|
||||
|
||||
const states = new Map<string, EventFileState>();
|
||||
const controller = new AbortController();
|
||||
let parseFailureCount = 0;
|
||||
const parseFailureCounts: Record<AgentDeviceEventParseFailure, number> = {
|
||||
'invalid-json': 0,
|
||||
'invalid-event': 0,
|
||||
};
|
||||
let didReportCollectionFailure = false;
|
||||
const collectAsync = async (): Promise<void> => {
|
||||
const eventFiles = await findAgentDeviceEventFilesAsync(stateDir);
|
||||
await Promise.all(
|
||||
eventFiles.map(async eventFile => {
|
||||
const state = states.get(eventFile) ?? {
|
||||
offset: 0,
|
||||
nextSequenceNumber: 1,
|
||||
nextLineNumber: 1,
|
||||
pending: '',
|
||||
decoder: new StringDecoder('utf8'),
|
||||
};
|
||||
states.set(eventFile, state);
|
||||
await collectEventFileAsync({
|
||||
eventFile,
|
||||
state,
|
||||
deviceRunSessionId,
|
||||
writeEvent: event => eventLogStream.write(event),
|
||||
onParseFailure: ({ failure, lineNumber }) => {
|
||||
parseFailureCount += 1;
|
||||
parseFailureCounts[failure] += 1;
|
||||
if (parseFailureCount !== 1) {
|
||||
return;
|
||||
}
|
||||
logger.warn(
|
||||
{ agentDeviceEventParseFailure: failure, lineNumber },
|
||||
'Could not parse an agent-device event log record.'
|
||||
);
|
||||
Sentry.capture('Could not parse an agent-device event log record', {
|
||||
level: 'warning',
|
||||
tags: { phase: 'agent-device-event-collection', reason: failure },
|
||||
extras: { deviceRunSessionId, lineNumber },
|
||||
});
|
||||
},
|
||||
});
|
||||
})
|
||||
);
|
||||
};
|
||||
const collectSafelyAsync = async (): Promise<void> => {
|
||||
try {
|
||||
await collectAsync();
|
||||
didReportCollectionFailure = false;
|
||||
} catch (err) {
|
||||
if (didReportCollectionFailure) {
|
||||
return;
|
||||
}
|
||||
didReportCollectionFailure = true;
|
||||
const error = err instanceof Error ? err : new Error(String(err));
|
||||
logger.warn({ err: error }, 'Could not collect agent-device events.');
|
||||
Sentry.capture('Could not collect agent-device events', error, {
|
||||
level: 'warning',
|
||||
tags: { phase: 'agent-device-event-collection' },
|
||||
extras: { deviceRunSessionId },
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const pollingPromise = (async () => {
|
||||
while (!controller.signal.aborted) {
|
||||
await collectSafelyAsync();
|
||||
|
||||
try {
|
||||
await setTimeoutAsync(pollIntervalMs, undefined, { signal: controller.signal });
|
||||
} catch (err) {
|
||||
if (!controller.signal.aborted) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
}
|
||||
})()
|
||||
.catch(err => {
|
||||
const error = err instanceof Error ? err : new Error(String(err));
|
||||
logger.warn({ err: error }, 'Agent-device event collection poller failed.');
|
||||
Sentry.capture('Agent-device event collection poller failed', error, {
|
||||
level: 'warning',
|
||||
tags: { phase: 'agent-device-event-collection', operation: 'poll' },
|
||||
extras: { deviceRunSessionId },
|
||||
});
|
||||
})
|
||||
.catch(() => {
|
||||
// A diagnostics failure must not recreate an unhandled rejection in this best-effort poller.
|
||||
});
|
||||
|
||||
return {
|
||||
stopAsync: async () => {
|
||||
controller.abort();
|
||||
await pollingPromise;
|
||||
await collectSafelyAsync();
|
||||
if (parseFailureCount > 1) {
|
||||
logger.warn(
|
||||
{ agentDeviceEventParseFailures: parseFailureCounts, parseFailureCount },
|
||||
`Could not parse ${parseFailureCount} agent-device event log records.`
|
||||
);
|
||||
Sentry.capture('Could not parse multiple agent-device event log records', {
|
||||
level: 'warning',
|
||||
tags: { phase: 'agent-device-event-collection' },
|
||||
extras: { deviceRunSessionId, parseFailureCount, parseFailureCounts },
|
||||
});
|
||||
}
|
||||
try {
|
||||
await eventLogStream.cleanUp();
|
||||
} catch (err) {
|
||||
const error = err instanceof Error ? err : new Error(String(err));
|
||||
logger.warn({ err: error }, 'Could not finish device run session event collection.');
|
||||
reportEventLogFailure(error, 'cleanup');
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
async function createEventLogUploadSessionAsync(
|
||||
ctx: CustomBuildContext,
|
||||
deviceRunSessionId: string
|
||||
): Promise<SignedUrl> {
|
||||
const result = await ctx.graphqlClient
|
||||
.mutation(CREATE_DEVICE_RUN_SESSION_EVENT_LOG_UPLOAD_SESSION_MUTATION, {
|
||||
deviceRunSessionId,
|
||||
})
|
||||
.toPromise();
|
||||
if (result.error) {
|
||||
throw new SystemError(
|
||||
`Failed to create device run session event log upload session: ${result.error.message}`,
|
||||
{ cause: result.error }
|
||||
);
|
||||
}
|
||||
const uploadSession = result.data!.deviceRunSession.createEventLogUploadSession.uploadSession;
|
||||
return {
|
||||
url: uploadSession.url,
|
||||
headers: uploadSession.headers as Record<string, string>,
|
||||
};
|
||||
}
|
||||
|
||||
async function findAgentDeviceEventFilesAsync(stateDir: string): Promise<string[]> {
|
||||
const sessionsDir = path.join(stateDir, 'sessions');
|
||||
let entries: fs.Dirent[];
|
||||
try {
|
||||
entries = await fs.promises.readdir(sessionsDir, { withFileTypes: true });
|
||||
} catch (err) {
|
||||
if ((err as NodeJS.ErrnoException).code === 'ENOENT') {
|
||||
return [];
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
|
||||
return entries
|
||||
.filter(entry => entry.isDirectory())
|
||||
.map(entry => path.join(sessionsDir, entry.name, 'events.ndjson'));
|
||||
}
|
||||
|
||||
async function collectEventFileAsync({
|
||||
eventFile,
|
||||
state,
|
||||
deviceRunSessionId,
|
||||
writeEvent,
|
||||
onParseFailure,
|
||||
}: {
|
||||
eventFile: string;
|
||||
state: EventFileState;
|
||||
deviceRunSessionId: string;
|
||||
writeEvent: (event: DeviceRunSessionEvent) => void;
|
||||
onParseFailure: (failure: { failure: AgentDeviceEventParseFailure; lineNumber: number }) => void;
|
||||
}): Promise<void> {
|
||||
let fileSize: number;
|
||||
try {
|
||||
fileSize = (await fs.promises.stat(eventFile)).size;
|
||||
} catch (err) {
|
||||
if ((err as NodeJS.ErrnoException).code === 'ENOENT') {
|
||||
return;
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
|
||||
if (fileSize < state.offset) {
|
||||
state.offset = 0;
|
||||
state.pending = '';
|
||||
state.decoder = new StringDecoder('utf8');
|
||||
}
|
||||
if (fileSize === state.offset) {
|
||||
return;
|
||||
}
|
||||
|
||||
const handle = await fs.promises.open(eventFile, 'r');
|
||||
try {
|
||||
const buffer = new Uint8Array(new ArrayBuffer(fileSize - state.offset));
|
||||
const { bytesRead } = await handle.read(buffer, 0, buffer.length, state.offset);
|
||||
state.offset += bytesRead;
|
||||
const text = state.decoder.write(buffer.subarray(0, bytesRead));
|
||||
const lines = `${state.pending}${text}`.split('\n');
|
||||
state.pending = lines.pop() ?? '';
|
||||
|
||||
for (const line of lines) {
|
||||
const lineNumber = state.nextLineNumber++;
|
||||
const sequenceNumber = state.nextSequenceNumber++;
|
||||
const { event, failure } = parseAgentDeviceEvent(line);
|
||||
if (failure) {
|
||||
onParseFailure({ failure, lineNumber });
|
||||
}
|
||||
if (!event) {
|
||||
continue;
|
||||
}
|
||||
const deviceRunSessionEvent = normalizeAgentDeviceEvent({
|
||||
event,
|
||||
sequenceNumber,
|
||||
sourceSessionDirectory: path.basename(path.dirname(eventFile)),
|
||||
deviceRunSessionId,
|
||||
});
|
||||
writeEvent(deviceRunSessionEvent);
|
||||
}
|
||||
} finally {
|
||||
await handle.close();
|
||||
}
|
||||
}
|
||||
|
||||
function parseAgentDeviceEvent(line: string): AgentDeviceEventParseResult {
|
||||
if (!line.trim()) {
|
||||
return {};
|
||||
}
|
||||
try {
|
||||
const result = AgentDeviceEventSchema.safeParse(JSON.parse(line));
|
||||
return result.success ? { event: result.data } : { failure: 'invalid-event' };
|
||||
} catch {
|
||||
return { failure: 'invalid-json' };
|
||||
}
|
||||
}
|
||||
|
||||
function normalizeAgentDeviceEvent({
|
||||
event,
|
||||
sequenceNumber,
|
||||
sourceSessionDirectory,
|
||||
deviceRunSessionId,
|
||||
}: {
|
||||
event: AgentDeviceEvent;
|
||||
sequenceNumber: number;
|
||||
sourceSessionDirectory: string;
|
||||
deviceRunSessionId: string;
|
||||
}): DeviceRunSessionEvent {
|
||||
const type = AGENT_DEVICE_EVENT_KIND_TO_TYPE[event.kind] ?? event.kind;
|
||||
const durationMs = event.details?.durationMs;
|
||||
const outcome =
|
||||
event.status === 'ok' ? 'success' : event.status === 'error' ? 'failure' : undefined;
|
||||
const summary =
|
||||
event.summary ??
|
||||
(event.kind === 'request.started'
|
||||
? `Started ${event.command ?? 'activity'}`
|
||||
: event.kind === 'request.finished'
|
||||
? `Finished ${event.command ?? 'activity'}`
|
||||
: event.kind === 'action.recorded'
|
||||
? `Recorded ${event.command ?? 'activity'}`
|
||||
: `${event.kind}${event.command ? `: ${event.command}` : ''}`);
|
||||
|
||||
return {
|
||||
v: 1,
|
||||
// Consumers use eventId to deduplicate events across polls. Keep the per-file sequence
|
||||
// monotonic across source-file truncations so an ID is never reused during collection.
|
||||
eventId: `agent-device:${deviceRunSessionId}:${sourceSessionDirectory}:${sequenceNumber}`,
|
||||
ts: event.ts,
|
||||
producer: 'agent-device',
|
||||
type,
|
||||
...(event.requestId ? { operationId: event.requestId } : {}),
|
||||
...(outcome ? { outcome } : {}),
|
||||
...(typeof durationMs === 'number' ? { durationMs } : {}),
|
||||
summary,
|
||||
data: {
|
||||
...event.details,
|
||||
session: event.session,
|
||||
sourceVersion: event.version,
|
||||
...(event.status ? { sourceStatus: event.status } : {}),
|
||||
},
|
||||
};
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "create-eas-build-function",
|
||||
"version": "21.0.3",
|
||||
"version": "21.1.0",
|
||||
"description": "Create functions for use in EAS Build custom builds.",
|
||||
"keywords": [
|
||||
"expo",
|
||||
@@ -35,7 +35,7 @@
|
||||
"clean": "rimraf ./build/ \"*.tsbuildinfo\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@expo/steps": "21.0.3"
|
||||
"@expo/steps": "21.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@expo/package-manager": "1.9.10",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@expo/eas-build-job",
|
||||
"version": "21.0.3",
|
||||
"version": "21.1.0",
|
||||
"bugs": "https://github.com/expo/eas-cli/issues",
|
||||
"license": "MIT",
|
||||
"author": "Expo <[email protected]>",
|
||||
|
||||
@@ -174,6 +174,46 @@ describe('StaticWorkflowInterpolationContextZ', () => {
|
||||
expect(StaticWorkflowInterpolationContextZ.parse(context)).toEqual(context);
|
||||
});
|
||||
|
||||
it('accepts app_store_connect build_upload with version, platform, and date fields', () => {
|
||||
const context = {
|
||||
after: {},
|
||||
needs: {},
|
||||
workflow: {
|
||||
id: 'workflow-id',
|
||||
name: 'workflow-name',
|
||||
filename: 'workflow.yml',
|
||||
url: 'https://expo.dev/accounts/example/workflows/workflow-id',
|
||||
},
|
||||
app: {
|
||||
id: 'app-id',
|
||||
slug: 'app-slug',
|
||||
},
|
||||
account: {
|
||||
id: 'account-id',
|
||||
name: 'account-name',
|
||||
},
|
||||
app_store_connect: {
|
||||
app: {
|
||||
id: '1234567890',
|
||||
},
|
||||
build_upload: {
|
||||
id: '123e4567-e89b-42d3-a456-426614174000',
|
||||
state: 'complete',
|
||||
cf_bundle_version: '42',
|
||||
cf_bundle_short_version_string: '1.2.3',
|
||||
platform: 'ios',
|
||||
uploaded_date: '2026-01-01T00:00:00.000Z',
|
||||
created_date: '2026-01-01T00:00:00.000Z',
|
||||
build: {
|
||||
id: 'build-abc123',
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
expect(StaticWorkflowInterpolationContextZ.parse(context)).toEqual(context);
|
||||
});
|
||||
|
||||
it('accepts app_store_connect context without build_upload', () => {
|
||||
const context = {
|
||||
after: {},
|
||||
|
||||
@@ -251,6 +251,10 @@ const AppStoreConnectContextZ = z.looseObject({
|
||||
id: z.string(),
|
||||
state: z.enum(['awaiting_upload', 'processing', 'failed', 'complete']),
|
||||
cf_bundle_version: z.string().optional(),
|
||||
cf_bundle_short_version_string: z.string().optional(),
|
||||
platform: z.string().optional(),
|
||||
uploaded_date: z.string().optional(),
|
||||
created_date: z.string().optional(),
|
||||
build: z
|
||||
.looseObject({
|
||||
id: z.string(),
|
||||
|
||||
+149
-113
@@ -146,6 +146,7 @@ eas --help COMMAND
|
||||
* [`eas project:info`](#eas-projectinfo)
|
||||
* [`eas project:init`](#eas-projectinit)
|
||||
* [`eas project:new [PATH]`](#eas-projectnew-path)
|
||||
* [`eas simulator`](#eas-simulator)
|
||||
* [`eas submit`](#eas-submit)
|
||||
* [`eas update`](#eas-update)
|
||||
* [`eas update:configure`](#eas-updateconfigure)
|
||||
@@ -204,7 +205,7 @@ DESCRIPTION
|
||||
view the audit logs for an account
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/account/audit.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/account/audit.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/account/audit.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/account/audit.ts)_
|
||||
|
||||
## `eas account:login`
|
||||
|
||||
@@ -225,7 +226,7 @@ ALIASES
|
||||
$ eas login
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/account/login.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/account/login.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/account/login.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/account/login.ts)_
|
||||
|
||||
## `eas account:logout`
|
||||
|
||||
@@ -242,7 +243,7 @@ ALIASES
|
||||
$ eas logout
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/account/logout.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/account/logout.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/account/logout.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/account/logout.ts)_
|
||||
|
||||
## `eas account:usage [ACCOUNT_NAME]`
|
||||
|
||||
@@ -264,7 +265,7 @@ DESCRIPTION
|
||||
view account usage and billing for the current cycle
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/account/usage.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/account/usage.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/account/usage.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/account/usage.ts)_
|
||||
|
||||
## `eas account:view`
|
||||
|
||||
@@ -281,7 +282,7 @@ ALIASES
|
||||
$ eas whoami
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/account/view.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/account/view.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/account/view.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/account/view.ts)_
|
||||
|
||||
## `eas analytics [STATUS]`
|
||||
|
||||
@@ -295,7 +296,7 @@ DESCRIPTION
|
||||
display or change analytics settings
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/analytics.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/analytics.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/analytics.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/analytics.ts)_
|
||||
|
||||
## `eas autocomplete [SHELL]`
|
||||
|
||||
@@ -347,7 +348,7 @@ DESCRIPTION
|
||||
create a branch
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/branch/create.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/branch/create.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/branch/create.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/branch/create.ts)_
|
||||
|
||||
## `eas branch:delete [NAME]`
|
||||
|
||||
@@ -368,7 +369,7 @@ DESCRIPTION
|
||||
delete a branch
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/branch/delete.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/branch/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/branch/delete.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/branch/delete.ts)_
|
||||
|
||||
## `eas branch:list`
|
||||
|
||||
@@ -388,7 +389,7 @@ DESCRIPTION
|
||||
list all branches
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/branch/list.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/branch/list.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/branch/list.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/branch/list.ts)_
|
||||
|
||||
## `eas branch:rename`
|
||||
|
||||
@@ -408,7 +409,7 @@ DESCRIPTION
|
||||
rename a branch
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/branch/rename.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/branch/rename.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/branch/rename.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/branch/rename.ts)_
|
||||
|
||||
## `eas branch:view [NAME]`
|
||||
|
||||
@@ -431,7 +432,7 @@ DESCRIPTION
|
||||
view a branch
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/branch/view.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/branch/view.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/branch/view.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/branch/view.ts)_
|
||||
|
||||
## `eas browse [PAGE]`
|
||||
|
||||
@@ -454,7 +455,7 @@ DESCRIPTION
|
||||
Transition from the terminal to the web browser to view and interact with your project on https://expo.dev
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/browse.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/browse.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/browse.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/browse.ts)_
|
||||
|
||||
## `eas build`
|
||||
|
||||
@@ -495,7 +496,7 @@ DESCRIPTION
|
||||
start a build
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/index.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/build/index.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/index.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/build/index.ts)_
|
||||
|
||||
## `eas build:cancel [BUILD_ID]`
|
||||
|
||||
@@ -515,7 +516,7 @@ DESCRIPTION
|
||||
cancel a build
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/cancel.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/build/cancel.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/cancel.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/build/cancel.ts)_
|
||||
|
||||
## `eas build:configure`
|
||||
|
||||
@@ -533,7 +534,7 @@ DESCRIPTION
|
||||
configure the project to support EAS Build
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/configure.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/build/configure.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/configure.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/build/configure.ts)_
|
||||
|
||||
## `eas build:delete [BUILD_ID]`
|
||||
|
||||
@@ -553,7 +554,7 @@ DESCRIPTION
|
||||
delete a build
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/delete.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/build/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/delete.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/build/delete.ts)_
|
||||
|
||||
## `eas build:dev`
|
||||
|
||||
@@ -578,7 +579,7 @@ DESCRIPTION
|
||||
run dev client simulator/emulator build with matching fingerprint or create a new one
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/dev.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/build/dev.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/dev.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/build/dev.ts)_
|
||||
|
||||
## `eas build:download`
|
||||
|
||||
@@ -605,7 +606,7 @@ DESCRIPTION
|
||||
download a simulator/emulator build by build ID or fingerprint hash
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/download.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/build/download.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/download.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/build/download.ts)_
|
||||
|
||||
## `eas build:inspect`
|
||||
|
||||
@@ -643,7 +644,7 @@ DESCRIPTION
|
||||
inspect the state of the project at specific build stages, useful for troubleshooting
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/inspect.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/build/inspect.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/inspect.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/build/inspect.ts)_
|
||||
|
||||
## `eas build:list`
|
||||
|
||||
@@ -683,7 +684,7 @@ DESCRIPTION
|
||||
list all builds for your project
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/list.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/build/list.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/list.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/build/list.ts)_
|
||||
|
||||
## `eas build:resign`
|
||||
|
||||
@@ -713,7 +714,7 @@ DESCRIPTION
|
||||
re-sign a build archive
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/resign.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/build/resign.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/resign.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/build/resign.ts)_
|
||||
|
||||
## `eas build:run`
|
||||
|
||||
@@ -741,7 +742,7 @@ DESCRIPTION
|
||||
run simulator/emulator builds from eas-cli
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/run.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/build/run.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/run.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/build/run.ts)_
|
||||
|
||||
## `eas build:submit`
|
||||
|
||||
@@ -793,7 +794,7 @@ DESCRIPTION
|
||||
get the latest version from EAS servers
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/version/get.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/build/version/get.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/version/get.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/build/version/get.ts)_
|
||||
|
||||
## `eas build:version:set`
|
||||
|
||||
@@ -811,7 +812,7 @@ DESCRIPTION
|
||||
update version of an app
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/version/set.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/build/version/set.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/version/set.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/build/version/set.ts)_
|
||||
|
||||
## `eas build:version:sync`
|
||||
|
||||
@@ -829,7 +830,7 @@ DESCRIPTION
|
||||
update a version in native code with a value stored on EAS servers
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/version/sync.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/build/version/sync.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/version/sync.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/build/version/sync.ts)_
|
||||
|
||||
## `eas build:view [BUILD_ID]`
|
||||
|
||||
@@ -846,7 +847,7 @@ DESCRIPTION
|
||||
view a build for your project
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/build/view.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/build/view.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/build/view.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/build/view.ts)_
|
||||
|
||||
## `eas channel:create [NAME]`
|
||||
|
||||
@@ -867,7 +868,7 @@ DESCRIPTION
|
||||
create a channel
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/channel/create.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/channel/create.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/channel/create.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/channel/create.ts)_
|
||||
|
||||
## `eas channel:delete [NAME]`
|
||||
|
||||
@@ -888,7 +889,7 @@ DESCRIPTION
|
||||
Delete a channel
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/channel/delete.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/channel/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/channel/delete.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/channel/delete.ts)_
|
||||
|
||||
## `eas channel:edit [NAME]`
|
||||
|
||||
@@ -910,7 +911,7 @@ DESCRIPTION
|
||||
point a channel at a new branch
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/channel/edit.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/channel/edit.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/channel/edit.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/channel/edit.ts)_
|
||||
|
||||
## `eas channel:insights`
|
||||
|
||||
@@ -934,7 +935,7 @@ DESCRIPTION
|
||||
display adoption, crash, and unique-user insights for a channel + runtime version
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/channel/insights.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/channel/insights.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/channel/insights.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/channel/insights.ts)_
|
||||
|
||||
## `eas channel:list`
|
||||
|
||||
@@ -954,7 +955,7 @@ DESCRIPTION
|
||||
list all channels
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/channel/list.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/channel/list.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/channel/list.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/channel/list.ts)_
|
||||
|
||||
## `eas channel:pause [NAME]`
|
||||
|
||||
@@ -976,7 +977,7 @@ DESCRIPTION
|
||||
pause a channel to stop it from sending updates
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/channel/pause.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/channel/pause.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/channel/pause.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/channel/pause.ts)_
|
||||
|
||||
## `eas channel:resume [NAME]`
|
||||
|
||||
@@ -998,7 +999,7 @@ DESCRIPTION
|
||||
resume a channel to start sending updates
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/channel/resume.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/channel/resume.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/channel/resume.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/channel/resume.ts)_
|
||||
|
||||
## `eas channel:rollout [CHANNEL]`
|
||||
|
||||
@@ -1033,7 +1034,7 @@ DESCRIPTION
|
||||
Roll a new branch out on a channel incrementally.
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/channel/rollout.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/channel/rollout.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/channel/rollout.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/channel/rollout.ts)_
|
||||
|
||||
## `eas channel:view [NAME]`
|
||||
|
||||
@@ -1056,7 +1057,7 @@ DESCRIPTION
|
||||
view a channel
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/channel/view.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/channel/view.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/channel/view.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/channel/view.ts)_
|
||||
|
||||
## `eas config`
|
||||
|
||||
@@ -1077,7 +1078,7 @@ DESCRIPTION
|
||||
display project configuration (app.json + eas.json)
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/config.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/config.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/config.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/config.ts)_
|
||||
|
||||
## `eas credentials`
|
||||
|
||||
@@ -1094,7 +1095,7 @@ DESCRIPTION
|
||||
manage credentials
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/credentials/index.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/credentials/index.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/credentials/index.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/credentials/index.ts)_
|
||||
|
||||
## `eas credentials:configure-build`
|
||||
|
||||
@@ -1112,7 +1113,7 @@ DESCRIPTION
|
||||
Set up credentials for building your project.
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/credentials/configure-build.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/credentials/configure-build.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/credentials/configure-build.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/credentials/configure-build.ts)_
|
||||
|
||||
## `eas deploy [options]`
|
||||
|
||||
@@ -1144,7 +1145,7 @@ ALIASES
|
||||
$ eas worker:deploy
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/deploy/index.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/deploy/index.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/deploy/index.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/deploy/index.ts)_
|
||||
|
||||
## `eas deploy:alias`
|
||||
|
||||
@@ -1169,7 +1170,7 @@ ALIASES
|
||||
$ eas deploy:promote
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/deploy/alias/index.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/deploy/alias/index.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/deploy/alias/index.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/deploy/alias/index.ts)_
|
||||
|
||||
## `eas deploy:alias:delete [ALIAS_NAME]`
|
||||
|
||||
@@ -1190,7 +1191,7 @@ ALIASES
|
||||
$ eas worker:alias:delete
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/deploy/alias/delete.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/deploy/alias/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/deploy/alias/delete.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/deploy/alias/delete.ts)_
|
||||
|
||||
## `eas deploy:delete [DEPLOYMENT_ID]`
|
||||
|
||||
@@ -1211,7 +1212,7 @@ ALIASES
|
||||
$ eas worker:delete
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/deploy/delete.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/deploy/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/deploy/delete.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/deploy/delete.ts)_
|
||||
|
||||
## `eas deploy:promote`
|
||||
|
||||
@@ -1248,7 +1249,7 @@ DESCRIPTION
|
||||
register new Apple Devices to use for internal distribution
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/device/create.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/device/create.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/device/create.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/device/create.ts)_
|
||||
|
||||
## `eas device:delete`
|
||||
|
||||
@@ -1268,7 +1269,7 @@ DESCRIPTION
|
||||
remove a registered device from your account
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/device/delete.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/device/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/device/delete.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/device/delete.ts)_
|
||||
|
||||
## `eas device:list`
|
||||
|
||||
@@ -1289,7 +1290,7 @@ DESCRIPTION
|
||||
list all registered devices for your account
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/device/list.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/device/list.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/device/list.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/device/list.ts)_
|
||||
|
||||
## `eas device:rename`
|
||||
|
||||
@@ -1310,7 +1311,7 @@ DESCRIPTION
|
||||
rename a registered device
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/device/rename.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/device/rename.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/device/rename.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/device/rename.ts)_
|
||||
|
||||
## `eas device:view [UDID]`
|
||||
|
||||
@@ -1324,7 +1325,7 @@ DESCRIPTION
|
||||
view a device for your project
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/device/view.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/device/view.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/device/view.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/device/view.ts)_
|
||||
|
||||
## `eas diagnostics`
|
||||
|
||||
@@ -1338,7 +1339,7 @@ DESCRIPTION
|
||||
display environment info
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/diagnostics.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/diagnostics.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/diagnostics.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/diagnostics.ts)_
|
||||
|
||||
## `eas env:delete [ENVIRONMENT]`
|
||||
|
||||
@@ -1364,7 +1365,7 @@ DESCRIPTION
|
||||
delete an environment variable for the current project or account
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/env/delete.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/env/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/env/delete.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/env/delete.ts)_
|
||||
|
||||
## `eas env:exec ENVIRONMENT BASH_COMMAND`
|
||||
|
||||
@@ -1386,7 +1387,7 @@ DESCRIPTION
|
||||
execute a command with environment variables from the selected environment
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/env/exec.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/env/exec.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/env/exec.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/env/exec.ts)_
|
||||
|
||||
## `eas env:get [ENVIRONMENT]`
|
||||
|
||||
@@ -1414,7 +1415,7 @@ DESCRIPTION
|
||||
view an environment variable for the current project or account
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/env/get.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/env/get.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/env/get.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/env/get.ts)_
|
||||
|
||||
## `eas env:list [ENVIRONMENT]`
|
||||
|
||||
@@ -1442,7 +1443,7 @@ DESCRIPTION
|
||||
list environment variables for the current project or account
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/env/list.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/env/list.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/env/list.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/env/list.ts)_
|
||||
|
||||
## `eas env:pull [ENVIRONMENT]`
|
||||
|
||||
@@ -1465,7 +1466,7 @@ DESCRIPTION
|
||||
pull environment variables for the selected environment to .env file
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/env/pull.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/env/pull.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/env/pull.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/env/pull.ts)_
|
||||
|
||||
## `eas env:push [ENVIRONMENT]`
|
||||
|
||||
@@ -1487,7 +1488,7 @@ DESCRIPTION
|
||||
push environment variables from .env file to the selected environment
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/env/push.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/env/push.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/env/push.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/env/push.ts)_
|
||||
|
||||
## `eas env:set [ENVIRONMENT]`
|
||||
|
||||
@@ -1519,7 +1520,7 @@ DESCRIPTION
|
||||
set (create or update) an environment variable on the current project or account
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/env/set.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/env/set.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/env/set.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/env/set.ts)_
|
||||
|
||||
## `eas fingerprint:compare [HASH1] [HASH2]`
|
||||
|
||||
@@ -1563,7 +1564,7 @@ EXAMPLES
|
||||
$ eas fingerprint:compare <FINGERPRINT-HASH> --update-id <UPDATE-ID> # Compare fingerprint from update against provided fingerprint
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/fingerprint/compare.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/fingerprint/compare.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/fingerprint/compare.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/fingerprint/compare.ts)_
|
||||
|
||||
## `eas fingerprint:generate`
|
||||
|
||||
@@ -1594,7 +1595,7 @@ EXAMPLES
|
||||
$ eas fingerprint:generate --json --non-interactive --platform android # Output fingerprint json to stdout
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/fingerprint/generate.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/fingerprint/generate.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/fingerprint/generate.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/fingerprint/generate.ts)_
|
||||
|
||||
## `eas help [COMMAND]`
|
||||
|
||||
@@ -1657,7 +1658,7 @@ DESCRIPTION
|
||||
connect a project to an App Store Connect app
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/integrations/asc/connect.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/integrations/asc/connect.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/integrations/asc/connect.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/integrations/asc/connect.ts)_
|
||||
|
||||
## `eas integrations:asc:disconnect`
|
||||
|
||||
@@ -1676,7 +1677,7 @@ DESCRIPTION
|
||||
disconnect the current project from its App Store Connect app
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/integrations/asc/disconnect.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/integrations/asc/disconnect.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/integrations/asc/disconnect.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/integrations/asc/disconnect.ts)_
|
||||
|
||||
## `eas integrations:asc:status`
|
||||
|
||||
@@ -1694,7 +1695,7 @@ DESCRIPTION
|
||||
show the App Store Connect app link status for the current project
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/integrations/asc/status.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/integrations/asc/status.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/integrations/asc/status.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/integrations/asc/status.ts)_
|
||||
|
||||
## `eas integrations:convex:connect`
|
||||
|
||||
@@ -1716,7 +1717,7 @@ DESCRIPTION
|
||||
connect Convex to your Expo project
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/integrations/convex/connect.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/integrations/convex/connect.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/integrations/convex/connect.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/integrations/convex/connect.ts)_
|
||||
|
||||
## `eas integrations:convex:dashboard`
|
||||
|
||||
@@ -1730,7 +1731,7 @@ DESCRIPTION
|
||||
open the Convex dashboard for the linked Convex project
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/integrations/convex/dashboard.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/integrations/convex/dashboard.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/integrations/convex/dashboard.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/integrations/convex/dashboard.ts)_
|
||||
|
||||
## `eas integrations:convex:project`
|
||||
|
||||
@@ -1744,7 +1745,7 @@ DESCRIPTION
|
||||
display the Convex project linked to the current Expo app
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/integrations/convex/project.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/integrations/convex/project.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/integrations/convex/project.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/integrations/convex/project.ts)_
|
||||
|
||||
## `eas integrations:convex:project:delete`
|
||||
|
||||
@@ -1762,7 +1763,7 @@ DESCRIPTION
|
||||
remove the Convex project link for the current Expo app from EAS servers
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/integrations/convex/project/delete.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/integrations/convex/project/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/integrations/convex/project/delete.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/integrations/convex/project/delete.ts)_
|
||||
|
||||
## `eas integrations:convex:team`
|
||||
|
||||
@@ -1776,7 +1777,7 @@ DESCRIPTION
|
||||
display Convex teams linked to the current Expo app's owner account
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/integrations/convex/team.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/integrations/convex/team.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/integrations/convex/team.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/integrations/convex/team.ts)_
|
||||
|
||||
## `eas integrations:convex:team:delete [CONVEX_TEAM]`
|
||||
|
||||
@@ -1797,7 +1798,7 @@ DESCRIPTION
|
||||
remove a Convex team link from the current Expo app owner account's EAS servers
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/integrations/convex/team/delete.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/integrations/convex/team/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/integrations/convex/team/delete.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/integrations/convex/team/delete.ts)_
|
||||
|
||||
## `eas integrations:convex:team:invite [CONVEX_TEAM]`
|
||||
|
||||
@@ -1817,7 +1818,7 @@ DESCRIPTION
|
||||
send a Convex team invitation to your verified email address
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/integrations/convex/team/invite.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/integrations/convex/team/invite.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/integrations/convex/team/invite.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/integrations/convex/team/invite.ts)_
|
||||
|
||||
## `eas integrations:posthog:connect`
|
||||
|
||||
@@ -1844,7 +1845,7 @@ DESCRIPTION
|
||||
connect PostHog to your Expo project
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/integrations/posthog/connect.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/integrations/posthog/connect.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/integrations/posthog/connect.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/integrations/posthog/connect.ts)_
|
||||
|
||||
## `eas integrations:posthog:dashboard`
|
||||
|
||||
@@ -1864,7 +1865,7 @@ DESCRIPTION
|
||||
open the PostHog dashboard for the linked PostHog project
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/integrations/posthog/dashboard.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/integrations/posthog/dashboard.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/integrations/posthog/dashboard.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/integrations/posthog/dashboard.ts)_
|
||||
|
||||
## `eas integrations:posthog:disconnect`
|
||||
|
||||
@@ -1883,7 +1884,7 @@ DESCRIPTION
|
||||
remove the PostHog project link for the current Expo app from EAS servers
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/integrations/posthog/disconnect.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/integrations/posthog/disconnect.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/integrations/posthog/disconnect.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/integrations/posthog/disconnect.ts)_
|
||||
|
||||
## `eas login`
|
||||
|
||||
@@ -1935,7 +1936,7 @@ DESCRIPTION
|
||||
validate the local store configuration
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/metadata/lint.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/metadata/lint.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/metadata/lint.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/metadata/lint.ts)_
|
||||
|
||||
## `eas metadata:pull`
|
||||
|
||||
@@ -1953,7 +1954,7 @@ DESCRIPTION
|
||||
generate the local store configuration from the app stores
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/metadata/pull.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/metadata/pull.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/metadata/pull.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/metadata/pull.ts)_
|
||||
|
||||
## `eas metadata:push`
|
||||
|
||||
@@ -1971,7 +1972,7 @@ DESCRIPTION
|
||||
sync the local store configuration to the app stores
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/metadata/push.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/metadata/push.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/metadata/push.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/metadata/push.ts)_
|
||||
|
||||
## `eas new [PATH]`
|
||||
|
||||
@@ -2030,7 +2031,7 @@ DESCRIPTION
|
||||
arguments, a list of the available event names and associated event counts is returned.
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/observe/events.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/observe/events.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/observe/events.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/observe/events.ts)_
|
||||
|
||||
## `eas observe:metrics [METRIC]`
|
||||
|
||||
@@ -2066,7 +2067,7 @@ DESCRIPTION
|
||||
display individual performance metric samples ordered by value
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/observe/metrics.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/observe/metrics.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/observe/metrics.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/observe/metrics.ts)_
|
||||
|
||||
## `eas observe:metrics-summary`
|
||||
|
||||
@@ -2098,7 +2099,7 @@ DESCRIPTION
|
||||
display aggregated performance metric statistics grouped by app version
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/observe/metrics-summary.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/observe/metrics-summary.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/observe/metrics-summary.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/observe/metrics-summary.ts)_
|
||||
|
||||
## `eas observe:routes`
|
||||
|
||||
@@ -2135,7 +2136,7 @@ DESCRIPTION
|
||||
display app navigation route metrics (Cold TTR, Warm TTR, TTI) grouped by route name
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/observe/routes.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/observe/routes.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/observe/routes.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/observe/routes.ts)_
|
||||
|
||||
## `eas observe:session [SESSIONID]`
|
||||
|
||||
@@ -2166,7 +2167,7 @@ DESCRIPTION
|
||||
display the timeline of metric and log events for a specific session
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/observe/session.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/observe/session.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/observe/session.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/observe/session.ts)_
|
||||
|
||||
## `eas observe:versions`
|
||||
|
||||
@@ -2191,7 +2192,7 @@ DESCRIPTION
|
||||
display app versions with build and update details
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/observe/versions.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/observe/versions.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/observe/versions.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/observe/versions.ts)_
|
||||
|
||||
## `eas project:delete [NAME]`
|
||||
|
||||
@@ -2215,7 +2216,7 @@ DESCRIPTION
|
||||
delete a project
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/project/delete.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/project/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/project/delete.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/project/delete.ts)_
|
||||
|
||||
## `eas project:info`
|
||||
|
||||
@@ -2229,7 +2230,7 @@ DESCRIPTION
|
||||
information about the current project
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/project/info.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/project/info.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/project/info.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/project/info.ts)_
|
||||
|
||||
## `eas project:init`
|
||||
|
||||
@@ -2252,7 +2253,7 @@ ALIASES
|
||||
$ eas init
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/project/init.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/project/init.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/project/init.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/project/init.ts)_
|
||||
|
||||
## `eas project:new [PATH]`
|
||||
|
||||
@@ -2276,7 +2277,42 @@ ALIASES
|
||||
$ eas new
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/project/new.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/project/new.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/project/new.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/project/new.ts)_
|
||||
|
||||
## `eas simulator`
|
||||
|
||||
[EXPERIMENTAL] start a remote simulator session on EAS and get instructions to connect to it
|
||||
|
||||
```
|
||||
USAGE
|
||||
$ eas simulator [-p android|ios] [--type agent-device|argent|serve-sim] [--package-version <value>]
|
||||
[--max-duration-minutes <value>] [--force] [--out-config-type env|dotenv] [--json] [--non-interactive]
|
||||
|
||||
FLAGS
|
||||
-p, --platform=<option> Device platform
|
||||
<options: android|ios>
|
||||
--[no-]force [default: true] Create a new simulator session even when an existing simulator
|
||||
session is present in the environment.
|
||||
--json Enable JSON output, non-JSON messages will be printed to stderr. Implies
|
||||
--non-interactive.
|
||||
--max-duration-minutes=<value> Maximum duration of the simulator session in minutes before it is automatically
|
||||
stopped. Only customizable on paid plans. Defaults to a value derived from the job
|
||||
run priority when omitted.
|
||||
--non-interactive Run the command in non-interactive mode.
|
||||
--out-config-type=<option> [default: dotenv] How to output simulator connection configuration. Use "env" to
|
||||
print shell exports, or "dotenv" to write .env.eas-simulator.
|
||||
<options: env|dotenv>
|
||||
--package-version=<value> Version of the package backing the simulator session (e.g. "0.1.3-alpha.3").
|
||||
Defaults to "latest" when omitted.
|
||||
--type=<option> [default: agent-device] Type of simulator session to create
|
||||
<options: agent-device|argent|serve-sim>
|
||||
|
||||
DESCRIPTION
|
||||
[EXPERIMENTAL] start a remote simulator session on EAS and get instructions to connect to it
|
||||
|
||||
ALIASES
|
||||
$ eas simulator
|
||||
```
|
||||
|
||||
## `eas submit`
|
||||
|
||||
@@ -2309,7 +2345,7 @@ ALIASES
|
||||
$ eas build:submit
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/submit.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/submit.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/submit.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/submit.ts)_
|
||||
|
||||
## `eas update`
|
||||
|
||||
@@ -2352,7 +2388,7 @@ DESCRIPTION
|
||||
publish an update group
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/index.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/update/index.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/index.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/update/index.ts)_
|
||||
|
||||
## `eas update:configure`
|
||||
|
||||
@@ -2373,7 +2409,7 @@ DESCRIPTION
|
||||
configure the project to support EAS Update
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/configure.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/update/configure.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/configure.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/update/configure.ts)_
|
||||
|
||||
## `eas update:delete GROUPID`
|
||||
|
||||
@@ -2394,7 +2430,7 @@ DESCRIPTION
|
||||
delete all the updates in an update group
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/delete.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/update/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/delete.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/update/delete.ts)_
|
||||
|
||||
## `eas update:edit [GROUPID]`
|
||||
|
||||
@@ -2419,7 +2455,7 @@ DESCRIPTION
|
||||
edit all the updates in an update group
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/edit.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/update/edit.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/edit.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/update/edit.ts)_
|
||||
|
||||
## `eas update:embedded:delete ID`
|
||||
|
||||
@@ -2440,7 +2476,7 @@ DESCRIPTION
|
||||
delete an embedded update registered with EAS Update
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/embedded/delete.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/update/embedded/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/embedded/delete.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/update/embedded/delete.ts)_
|
||||
|
||||
## `eas update:embedded:list`
|
||||
|
||||
@@ -2466,7 +2502,7 @@ DESCRIPTION
|
||||
list embedded updates registered with EAS Update for this project
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/embedded/list.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/update/embedded/list.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/embedded/list.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/update/embedded/list.ts)_
|
||||
|
||||
## `eas update:embedded:upload`
|
||||
|
||||
@@ -2496,7 +2532,7 @@ EXAMPLES
|
||||
$ eas update:embedded:upload --platform android --bundle android/app/src/main/assets/index.android.bundle --manifest android/app/src/main/assets/app.manifest --channel production --build-id <BUILD-ID>
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/embedded/upload.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/update/embedded/upload.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/embedded/upload.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/update/embedded/upload.ts)_
|
||||
|
||||
## `eas update:embedded:view ID`
|
||||
|
||||
@@ -2516,7 +2552,7 @@ DESCRIPTION
|
||||
view details of an embedded update registered with EAS Update
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/embedded/view.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/update/embedded/view.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/embedded/view.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/update/embedded/view.ts)_
|
||||
|
||||
## `eas update:insights GROUPID`
|
||||
|
||||
@@ -2543,7 +2579,7 @@ DESCRIPTION
|
||||
display launch, crash, unique-user, and size insights for an update group
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/insights.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/update/insights.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/insights.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/update/insights.ts)_
|
||||
|
||||
## `eas update:list`
|
||||
|
||||
@@ -2570,7 +2606,7 @@ DESCRIPTION
|
||||
view the recent updates
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/list.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/update/list.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/list.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/update/list.ts)_
|
||||
|
||||
## `eas update:republish`
|
||||
|
||||
@@ -2608,7 +2644,7 @@ DESCRIPTION
|
||||
roll back to an existing update
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/republish.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/update/republish.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/republish.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/update/republish.ts)_
|
||||
|
||||
## `eas update:revert-update-rollout`
|
||||
|
||||
@@ -2636,7 +2672,7 @@ DESCRIPTION
|
||||
revert a rollout update for a project
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/revert-update-rollout.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/update/revert-update-rollout.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/revert-update-rollout.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/update/revert-update-rollout.ts)_
|
||||
|
||||
## `eas update:roll-back-to-embedded`
|
||||
|
||||
@@ -2666,7 +2702,7 @@ DESCRIPTION
|
||||
roll back to the embedded update
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/roll-back-to-embedded.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/update/roll-back-to-embedded.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/roll-back-to-embedded.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/update/roll-back-to-embedded.ts)_
|
||||
|
||||
## `eas update:rollback [GROUPID]`
|
||||
|
||||
@@ -2698,7 +2734,7 @@ DESCRIPTION
|
||||
roll back to an embedded update or an existing update
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/rollback.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/update/rollback.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/rollback.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/update/rollback.ts)_
|
||||
|
||||
## `eas update:view GROUPID`
|
||||
|
||||
@@ -2722,7 +2758,7 @@ DESCRIPTION
|
||||
update group details
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/update/view.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/update/view.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/update/view.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/update/view.ts)_
|
||||
|
||||
## `eas upload`
|
||||
|
||||
@@ -2743,7 +2779,7 @@ DESCRIPTION
|
||||
upload a local build and generate a sharable link
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/upload.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/upload.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/upload.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/upload.ts)_
|
||||
|
||||
## `eas webhook:create`
|
||||
|
||||
@@ -2765,7 +2801,7 @@ DESCRIPTION
|
||||
create a webhook
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/webhook/create.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/webhook/create.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/webhook/create.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/webhook/create.ts)_
|
||||
|
||||
## `eas webhook:delete [ID]`
|
||||
|
||||
@@ -2785,7 +2821,7 @@ DESCRIPTION
|
||||
delete a webhook
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/webhook/delete.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/webhook/delete.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/webhook/delete.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/webhook/delete.ts)_
|
||||
|
||||
## `eas webhook:list`
|
||||
|
||||
@@ -2804,7 +2840,7 @@ DESCRIPTION
|
||||
list webhooks
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/webhook/list.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/webhook/list.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/webhook/list.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/webhook/list.ts)_
|
||||
|
||||
## `eas webhook:update`
|
||||
|
||||
@@ -2827,7 +2863,7 @@ DESCRIPTION
|
||||
update a webhook
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/webhook/update.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/webhook/update.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/webhook/update.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/webhook/update.ts)_
|
||||
|
||||
## `eas webhook:view ID`
|
||||
|
||||
@@ -2844,7 +2880,7 @@ DESCRIPTION
|
||||
view a webhook
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/webhook/view.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/webhook/view.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/webhook/view.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/webhook/view.ts)_
|
||||
|
||||
## `eas whoami`
|
||||
|
||||
@@ -2968,7 +3004,7 @@ DESCRIPTION
|
||||
to cancel.
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/workflow/cancel.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/workflow/cancel.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/workflow/cancel.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/workflow/cancel.ts)_
|
||||
|
||||
## `eas workflow:create [NAME]`
|
||||
|
||||
@@ -2990,7 +3026,7 @@ DESCRIPTION
|
||||
create a new workflow configuration YAML file
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/workflow/create.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/workflow/create.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/workflow/create.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/workflow/create.ts)_
|
||||
|
||||
## `eas workflow:logs [ID]`
|
||||
|
||||
@@ -3014,7 +3050,7 @@ DESCRIPTION
|
||||
If no ID is passed in, you will be prompted to select from recent workflow runs for the current project.
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/workflow/logs.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/workflow/logs.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/workflow/logs.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/workflow/logs.ts)_
|
||||
|
||||
## `eas workflow:run FILE`
|
||||
|
||||
@@ -3054,7 +3090,7 @@ FLAG DESCRIPTIONS
|
||||
Exit codes: 0 = success, 11 = failure, 12 = canceled, 13 = wait aborted.
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/workflow/run.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/workflow/run.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/workflow/run.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/workflow/run.ts)_
|
||||
|
||||
## `eas workflow:runs`
|
||||
|
||||
@@ -3076,7 +3112,7 @@ DESCRIPTION
|
||||
list recent workflow runs for this project, with their IDs, statuses, and timestamps
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/workflow/runs.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/workflow/runs.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/workflow/runs.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/workflow/runs.ts)_
|
||||
|
||||
## `eas workflow:status [WORKFLOW_RUN_ID]`
|
||||
|
||||
@@ -3104,7 +3140,7 @@ FLAG DESCRIPTIONS
|
||||
Exit codes: 0 = success, 11 = failure, 12 = canceled, 13 = wait aborted.
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/workflow/status.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/workflow/status.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/workflow/status.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/workflow/status.ts)_
|
||||
|
||||
## `eas workflow:validate PATH`
|
||||
|
||||
@@ -3124,7 +3160,7 @@ DESCRIPTION
|
||||
validate a workflow configuration yaml file
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/workflow/validate.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/workflow/validate.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/workflow/validate.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/workflow/validate.ts)_
|
||||
|
||||
## `eas workflow:view [ID]`
|
||||
|
||||
@@ -3146,5 +3182,5 @@ DESCRIPTION
|
||||
workflow runs for the current project.
|
||||
```
|
||||
|
||||
_See code: [packages/eas-cli/src/commands/workflow/view.ts](https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/workflow/view.ts)_
|
||||
_See code: [packages/eas-cli/src/commands/workflow/view.ts](https://github.com/expo/eas-cli/blob/v21.1.0/packages/eas-cli/src/commands/workflow/view.ts)_
|
||||
<!-- commandsstop -->
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "eas-cli",
|
||||
"version": "21.0.3",
|
||||
"version": "21.1.0",
|
||||
"description": "EAS command line tool",
|
||||
"keywords": [
|
||||
"cli",
|
||||
@@ -48,8 +48,8 @@
|
||||
"@expo/code-signing-certificates": "0.0.5",
|
||||
"@expo/config": "55.0.10",
|
||||
"@expo/config-plugins": "55.0.7",
|
||||
"@expo/eas-build-job": "21.0.3",
|
||||
"@expo/eas-json": "21.0.3",
|
||||
"@expo/eas-build-job": "21.1.0",
|
||||
"@expo/eas-json": "21.1.0",
|
||||
"@expo/env": "^1.0.0",
|
||||
"@expo/json-file": "8.3.3",
|
||||
"@expo/logger": "21.0.0",
|
||||
@@ -64,7 +64,7 @@
|
||||
"@expo/results": "1.0.0",
|
||||
"@expo/rudder-sdk-node": "1.1.1",
|
||||
"@expo/spawn-async": "1.7.2",
|
||||
"@expo/steps": "21.0.3",
|
||||
"@expo/steps": "21.1.0",
|
||||
"@expo/timeago.js": "1.0.0",
|
||||
"@oclif/core": "^4.8.3",
|
||||
"@oclif/plugin-autocomplete": "^3.2.40",
|
||||
|
||||
@@ -11,4 +11,19 @@ describe(truncateGitCommitMessage, () => {
|
||||
it('truncates long commit messages', () => {
|
||||
expect(truncateGitCommitMessage('a'.repeat(5000))).toBe(`${'a'.repeat(4093)}...`);
|
||||
});
|
||||
|
||||
it('does not leave a split emoji (lone surrogate) at the truncation boundary', () => {
|
||||
const message = 'a'.repeat(4092) + '🎉' + 'b'.repeat(10);
|
||||
expect(truncateGitCommitMessage(message)).toBe(`${'a'.repeat(4092)}...`);
|
||||
});
|
||||
|
||||
it('keeps a complete emoji that ends exactly at the truncation boundary', () => {
|
||||
const message = 'a'.repeat(4091) + '🎉' + 'b'.repeat(10);
|
||||
expect(truncateGitCommitMessage(message)).toBe(`${'a'.repeat(4091)}🎉...`);
|
||||
});
|
||||
|
||||
it('preserves emoji before the truncation boundary', () => {
|
||||
const message = '🎉' + 'a'.repeat(5000);
|
||||
expect(truncateGitCommitMessage(message)).toBe(`🎉${'a'.repeat(4091)}...`);
|
||||
});
|
||||
});
|
||||
@@ -185,5 +185,9 @@ export function truncateGitCommitMessage(
|
||||
if (msg === undefined) {
|
||||
return undefined;
|
||||
}
|
||||
return msg.length > maxLength ? `${msg.substring(0, maxLength - 3)}...` : msg;
|
||||
if (msg.length <= maxLength) {
|
||||
return msg;
|
||||
}
|
||||
const truncated = msg.substring(0, maxLength - 3).replace(/[\uD800-\uDBFF]$/, '');
|
||||
return `${truncated}...`;
|
||||
}
|
||||
@@ -14,6 +14,7 @@ import { DeviceRunSessionMutation } from '../../../graphql/mutations/DeviceRunSe
|
||||
import { DeviceRunSessionQuery } from '../../../graphql/queries/DeviceRunSessionQuery';
|
||||
import Log from '../../../log';
|
||||
import { ora } from '../../../ora';
|
||||
import { promptAsync } from '../../../prompts';
|
||||
import {
|
||||
EAS_SIMULATOR_SESSION_ID,
|
||||
SIMULATOR_DOTENV_FILE_HEADER,
|
||||
@@ -42,6 +43,7 @@ jest.mock('../../../simulator/env', () => ({
|
||||
loadSimulatorEnvAsync: jest.fn(),
|
||||
resetSimulatorEnvAsync: jest.fn(),
|
||||
}));
|
||||
jest.mock('../../../prompts');
|
||||
jest.mock('../../../ora', () => ({
|
||||
ora: jest.fn(() => {
|
||||
const spinner = {
|
||||
@@ -71,6 +73,7 @@ const mockByIdAsync = jest.mocked(DeviceRunSessionQuery.byIdAsync);
|
||||
const mockLoadSimulatorEnvAsync = jest.mocked(loadSimulatorEnvAsync);
|
||||
const mockResetSimulatorEnvAsync = jest.mocked(resetSimulatorEnvAsync);
|
||||
const mockOra = jest.mocked(ora);
|
||||
const mockPromptAsync = jest.mocked(promptAsync);
|
||||
|
||||
function makeCreatedDeviceRunSession(
|
||||
overrides: Partial<CreatedDeviceRunSession> = {}
|
||||
@@ -321,4 +324,49 @@ describe(SimulatorStart, () => {
|
||||
|
||||
expect(mockResetSimulatorEnvAsync).toHaveBeenCalledWith(projectDir);
|
||||
});
|
||||
|
||||
it('prompts to select the platform when --platform is omitted', async () => {
|
||||
mockPromptAsync.mockResolvedValueOnce({ selectedPlatform: AppPlatform.Android });
|
||||
mockByIdAsync
|
||||
.mockResolvedValueOnce(makeDeviceRunSession())
|
||||
.mockResolvedValueOnce(makeDeviceRunSession({ status: DeviceRunSessionStatus.Stopped }));
|
||||
|
||||
const { command } = createCommand([]);
|
||||
await command.runAsync();
|
||||
|
||||
expect(mockPromptAsync).toHaveBeenCalledWith(
|
||||
expect.objectContaining({ type: 'select', message: 'Select platform' })
|
||||
);
|
||||
expect(mockCreateDeviceRunSessionAsync).toHaveBeenCalledWith(
|
||||
graphqlClient,
|
||||
expect.objectContaining({ platform: AppPlatform.Android })
|
||||
);
|
||||
});
|
||||
|
||||
it('prompts for the platform before warning about overwriting an existing session', async () => {
|
||||
process.env[EAS_SIMULATOR_SESSION_ID] = 'existing-session';
|
||||
mockPromptAsync.mockResolvedValueOnce({ selectedPlatform: AppPlatform.Ios });
|
||||
mockByIdAsync
|
||||
.mockResolvedValueOnce(makeDeviceRunSession())
|
||||
.mockResolvedValueOnce(makeDeviceRunSession({ status: DeviceRunSessionStatus.Stopped }));
|
||||
|
||||
const { command } = createCommand([]);
|
||||
await command.runAsync();
|
||||
|
||||
expect(mockPromptAsync).toHaveBeenCalled();
|
||||
expect(Log.warn).toHaveBeenCalledWith(expect.stringContaining('Overwriting previous'));
|
||||
expect(mockPromptAsync.mock.invocationCallOrder[0]).toBeLessThan(
|
||||
jest.mocked(Log.warn).mock.invocationCallOrder[0]
|
||||
);
|
||||
});
|
||||
|
||||
it('throws instead of prompting when --platform is omitted in non-interactive mode', async () => {
|
||||
const { command } = createCommand(['--non-interactive']);
|
||||
await expect(command.runAsync()).rejects.toThrow(
|
||||
'The --platform flag must be set when running in non-interactive mode.'
|
||||
);
|
||||
|
||||
expect(mockPromptAsync).not.toHaveBeenCalled();
|
||||
expect(mockCreateDeviceRunSessionAsync).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
@@ -18,6 +18,7 @@ import { DeviceRunSessionMutation } from '../../graphql/mutations/DeviceRunSessi
|
||||
import { DeviceRunSessionQuery } from '../../graphql/queries/DeviceRunSessionQuery';
|
||||
import Log, { link } from '../../log';
|
||||
import { ora } from '../../ora';
|
||||
import { promptAsync } from '../../prompts';
|
||||
import {
|
||||
EAS_SIMULATOR_SESSION_ID,
|
||||
SIMULATOR_DOTENV_FILE_NAME,
|
||||
@@ -41,9 +42,16 @@ const OUT_CONFIG_TYPE_VALUES = {
|
||||
Env: 'env',
|
||||
Dotenv: 'dotenv',
|
||||
} as const;
|
||||
const PLATFORM_FLAG_VALUES = ['android', 'ios'] as const;
|
||||
type PlatformFlagValue = (typeof PLATFORM_FLAG_VALUES)[number];
|
||||
const APP_PLATFORM_BY_FLAG_VALUE: Record<PlatformFlagValue, AppPlatform> = {
|
||||
android: AppPlatform.Android,
|
||||
ios: AppPlatform.Ios,
|
||||
};
|
||||
|
||||
export default class SimulatorStart extends EasCommand {
|
||||
static override hidden = true;
|
||||
static override aliases = ['simulator'];
|
||||
static override description =
|
||||
'[EXPERIMENTAL] start a remote simulator session on EAS and get instructions to connect to it';
|
||||
|
||||
@@ -51,8 +59,7 @@ export default class SimulatorStart extends EasCommand {
|
||||
platform: Flags.option({
|
||||
char: 'p',
|
||||
description: 'Device platform',
|
||||
options: ['android', 'ios'] as const,
|
||||
required: true,
|
||||
options: PLATFORM_FLAG_VALUES,
|
||||
})(),
|
||||
type: Flags.option({
|
||||
description: 'Type of simulator session to create',
|
||||
@@ -111,6 +118,9 @@ export default class SimulatorStart extends EasCommand {
|
||||
`Existing simulator session in environment. Use --force to create a new simulator session.`
|
||||
);
|
||||
}
|
||||
|
||||
const platform = await resolvePlatformAsync(flags.platform, nonInteractive);
|
||||
|
||||
if (existingDeviceRunSessionId) {
|
||||
Log.warn(
|
||||
` Overwriting previous simulator session (id: ${existingDeviceRunSessionId}). ` +
|
||||
@@ -120,8 +130,6 @@ export default class SimulatorStart extends EasCommand {
|
||||
Log.newLine();
|
||||
}
|
||||
|
||||
const platform = flags.platform === 'android' ? AppPlatform.Android : AppPlatform.Ios;
|
||||
|
||||
const createSpinner = ora('🚀 Creating simulator session').start();
|
||||
let deviceRunSessionId: string;
|
||||
let deviceRunSessionUrl: string;
|
||||
@@ -243,6 +251,30 @@ export default class SimulatorStart extends EasCommand {
|
||||
}
|
||||
}
|
||||
|
||||
async function resolvePlatformAsync(
|
||||
platform: PlatformFlagValue | undefined,
|
||||
nonInteractive: boolean
|
||||
): Promise<AppPlatform> {
|
||||
if (platform) {
|
||||
return APP_PLATFORM_BY_FLAG_VALUE[platform];
|
||||
}
|
||||
|
||||
if (nonInteractive) {
|
||||
throw new Error('The --platform flag must be set when running in non-interactive mode.');
|
||||
}
|
||||
|
||||
const { selectedPlatform } = await promptAsync({
|
||||
type: 'select',
|
||||
message: 'Select platform',
|
||||
name: 'selectedPlatform',
|
||||
choices: [
|
||||
{ title: 'Android', value: AppPlatform.Android },
|
||||
{ title: 'iOS', value: AppPlatform.Ios },
|
||||
],
|
||||
});
|
||||
return selectedPlatform;
|
||||
}
|
||||
|
||||
async function writeSimulatorEnvSafelyAsync(
|
||||
projectDir: string,
|
||||
environmentVariables: Record<string, string>
|
||||
|
||||
@@ -17,7 +17,9 @@ import {
|
||||
} from '../generated';
|
||||
import { UpdateFragmentNode } from '../types/Update';
|
||||
|
||||
const turtleJobRunId = process.env.EAS_BUILD_ID;
|
||||
function getTurtleJobRunId(): string | undefined {
|
||||
return process.env.EAS_BUILD_PLATFORM ? undefined : process.env.EAS_BUILD_ID;
|
||||
}
|
||||
|
||||
export const PublishMutation = {
|
||||
async getUploadURLsAsync(
|
||||
@@ -48,6 +50,7 @@ export const PublishMutation = {
|
||||
graphqlClient: ExpoGraphqlClient,
|
||||
publishUpdateGroupsInput: PublishUpdateGroupInput[]
|
||||
): Promise<UpdateFragment[]> {
|
||||
const turtleJobRunId = getTurtleJobRunId();
|
||||
const data = await withErrorHandlingAsync(
|
||||
graphqlClient
|
||||
.mutation<UpdatePublishMutation>(
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
import { ExpoGraphqlClient } from '../../../commandUtils/context/contextUtils/createGraphqlClient';
|
||||
import { PublishUpdateGroupInput } from '../../generated';
|
||||
import { PublishMutation } from '../PublishMutation';
|
||||
|
||||
function makeGraphqlClient(): ExpoGraphqlClient {
|
||||
return {
|
||||
mutation: jest.fn().mockReturnValue({
|
||||
toPromise: jest.fn().mockResolvedValue({
|
||||
data: { updateBranch: { publishUpdateGroups: [] } },
|
||||
}),
|
||||
}),
|
||||
} as unknown as ExpoGraphqlClient;
|
||||
}
|
||||
|
||||
const input: PublishUpdateGroupInput = { branchId: 'branch-id', runtimeVersion: '1.0.0' };
|
||||
|
||||
describe('PublishMutation.publishUpdateGroupAsync', () => {
|
||||
const originalEnv = process.env;
|
||||
|
||||
beforeEach(() => {
|
||||
process.env = { ...originalEnv };
|
||||
delete process.env.EAS_BUILD_PLATFORM;
|
||||
delete process.env.EAS_BUILD_ID;
|
||||
});
|
||||
|
||||
afterAll(() => {
|
||||
process.env = originalEnv;
|
||||
});
|
||||
|
||||
it('sends the id as turtleJobRunId when running inside a job run', async () => {
|
||||
process.env.EAS_BUILD_ID = 'job-run-id';
|
||||
const client = makeGraphqlClient();
|
||||
|
||||
await PublishMutation.publishUpdateGroupAsync(client, [input]);
|
||||
|
||||
expect(client.mutation).toHaveBeenCalledWith(expect.anything(), {
|
||||
publishUpdateGroupsInput: [{ ...input, turtleJobRunId: 'job-run-id' }],
|
||||
});
|
||||
});
|
||||
|
||||
it('omits turtleJobRunId when running inside a build', async () => {
|
||||
process.env.EAS_BUILD_PLATFORM = 'android';
|
||||
process.env.EAS_BUILD_ID = 'build-id';
|
||||
const client = makeGraphqlClient();
|
||||
|
||||
await PublishMutation.publishUpdateGroupAsync(client, [input]);
|
||||
|
||||
expect(client.mutation).toHaveBeenCalledWith(expect.anything(), {
|
||||
publishUpdateGroupsInput: [{ ...input, turtleJobRunId: undefined }],
|
||||
});
|
||||
});
|
||||
|
||||
it('omits turtleJobRunId when not running in EAS', async () => {
|
||||
const client = makeGraphqlClient();
|
||||
|
||||
await PublishMutation.publishUpdateGroupAsync(client, [input]);
|
||||
|
||||
expect(client.mutation).toHaveBeenCalledWith(expect.anything(), {
|
||||
publishUpdateGroupsInput: [{ ...input, turtleJobRunId: undefined }],
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@expo/eas-json",
|
||||
"version": "21.0.3",
|
||||
"version": "21.1.0",
|
||||
"description": "A library for interacting with eas.json",
|
||||
"homepage": "https://github.com/expo/eas-cli",
|
||||
"bugs": "https://github.com/expo/eas-cli/issues",
|
||||
@@ -32,7 +32,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/code-frame": "7.23.5",
|
||||
"@expo/eas-build-job": "21.0.3",
|
||||
"@expo/eas-build-job": "21.1.0",
|
||||
"chalk": "4.1.2",
|
||||
"env-string": "1.0.1",
|
||||
"fs-extra": "11.2.0",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "eas-cli-local-build-plugin",
|
||||
"version": "21.0.3",
|
||||
"version": "21.1.0",
|
||||
"description": "Tool for running EAS compatible builds on a local machine.",
|
||||
"bugs": "https://github.com/expo/eas-cli/issues",
|
||||
"license": "BUSL-1.1",
|
||||
@@ -26,8 +26,8 @@
|
||||
"clean": "rimraf node_modules dist coverage \"*.tsbuildinfo\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@expo/build-tools": "21.0.3",
|
||||
"@expo/eas-build-job": "21.0.3",
|
||||
"@expo/build-tools": "21.1.0",
|
||||
"@expo/eas-build-job": "21.1.0",
|
||||
"@expo/logger": "21.0.0",
|
||||
"@expo/spawn-async": "^1.7.2",
|
||||
"@expo/turtle-spawn": "21.0.0",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@expo/steps",
|
||||
"version": "21.0.3",
|
||||
"version": "21.1.0",
|
||||
"bugs": "https://github.com/expo/eas-cli/issues",
|
||||
"license": "BUSL-1.1",
|
||||
"author": "Expo <[email protected]>",
|
||||
@@ -27,7 +27,7 @@
|
||||
"clean": "rimraf node_modules dist coverage \"*.tsbuildinfo\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@expo/eas-build-job": "21.0.3",
|
||||
"@expo/eas-build-job": "21.1.0",
|
||||
"@expo/logger": "21.0.0",
|
||||
"@expo/spawn-async": "^1.7.2",
|
||||
"arg": "^5.0.2",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@expo/worker",
|
||||
"version": "21.0.3",
|
||||
"version": "21.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"start": "yarn watch",
|
||||
@@ -19,16 +19,16 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/core": "7.24.7",
|
||||
"@expo/build-tools": "21.0.3",
|
||||
"@expo/build-tools": "21.1.0",
|
||||
"@expo/config-plugins": "55.0.7",
|
||||
"@expo/config-types": "55.0.5",
|
||||
"@expo/downloader": "21.0.0",
|
||||
"@expo/eas-build-job": "21.0.3",
|
||||
"@expo/eas-build-job": "21.1.0",
|
||||
"@expo/logger": "21.0.0",
|
||||
"@expo/results": "1.0.0",
|
||||
"@expo/rudder-sdk-node": "1.1.1",
|
||||
"@expo/spawn-async": "1.7.2",
|
||||
"@expo/steps": "21.0.3",
|
||||
"@expo/steps": "21.1.0",
|
||||
"@expo/template-file": "21.0.2",
|
||||
"@expo/turtle-spawn": "21.0.0",
|
||||
"@hapi/boom": "10.0.1",
|
||||
|
||||
@@ -2291,14 +2291,14 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@expo/build-tools@npm:21.0.3, @expo/build-tools@workspace:packages/build-tools":
|
||||
"@expo/build-tools@npm:21.1.0, @expo/build-tools@workspace:packages/build-tools":
|
||||
version: 0.0.0-use.local
|
||||
resolution: "@expo/build-tools@workspace:packages/build-tools"
|
||||
dependencies:
|
||||
"@expo/config": "npm:55.0.10"
|
||||
"@expo/config-plugins": "npm:55.0.7"
|
||||
"@expo/downloader": "npm:21.0.0"
|
||||
"@expo/eas-build-job": "npm:21.0.3"
|
||||
"@expo/eas-build-job": "npm:21.1.0"
|
||||
"@expo/env": "npm:^0.4.0"
|
||||
"@expo/logger": "npm:21.0.0"
|
||||
"@expo/package-manager": "npm:1.9.10"
|
||||
@@ -2306,7 +2306,7 @@ __metadata:
|
||||
"@expo/repack-app": "npm:~0.6.1"
|
||||
"@expo/results": "npm:^1.0.0"
|
||||
"@expo/spawn-async": "npm:1.7.2"
|
||||
"@expo/steps": "npm:21.0.3"
|
||||
"@expo/steps": "npm:21.1.0"
|
||||
"@expo/template-file": "npm:21.0.2"
|
||||
"@expo/turtle-spawn": "npm:21.0.0"
|
||||
"@expo/xcpretty": "npm:^4.3.1"
|
||||
@@ -2547,7 +2547,7 @@ __metadata:
|
||||
languageName: unknown
|
||||
linkType: soft
|
||||
|
||||
"@expo/eas-build-job@npm:21.0.3, @expo/eas-build-job@workspace:packages/eas-build-job":
|
||||
"@expo/eas-build-job@npm:21.1.0, @expo/eas-build-job@workspace:packages/eas-build-job":
|
||||
version: 0.0.0-use.local
|
||||
resolution: "@expo/eas-build-job@workspace:packages/eas-build-job"
|
||||
dependencies:
|
||||
@@ -2566,12 +2566,12 @@ __metadata:
|
||||
languageName: unknown
|
||||
linkType: soft
|
||||
|
||||
"@expo/eas-json@npm:21.0.3, @expo/eas-json@workspace:packages/eas-json":
|
||||
"@expo/eas-json@npm:21.1.0, @expo/eas-json@workspace:packages/eas-json":
|
||||
version: 0.0.0-use.local
|
||||
resolution: "@expo/eas-json@workspace:packages/eas-json"
|
||||
dependencies:
|
||||
"@babel/code-frame": "npm:7.23.5"
|
||||
"@expo/eas-build-job": "npm:21.0.3"
|
||||
"@expo/eas-build-job": "npm:21.1.0"
|
||||
"@tsconfig/node20": "npm:20.1.8"
|
||||
"@types/babel__code-frame": "npm:7.0.3"
|
||||
"@types/fs-extra": "npm:11.0.4"
|
||||
@@ -2884,11 +2884,11 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@expo/steps@npm:21.0.3, @expo/steps@workspace:packages/steps":
|
||||
"@expo/steps@npm:21.1.0, @expo/steps@workspace:packages/steps":
|
||||
version: 0.0.0-use.local
|
||||
resolution: "@expo/steps@workspace:packages/steps"
|
||||
dependencies:
|
||||
"@expo/eas-build-job": "npm:21.0.3"
|
||||
"@expo/eas-build-job": "npm:21.1.0"
|
||||
"@expo/logger": "npm:21.0.0"
|
||||
"@expo/spawn-async": "npm:^1.7.2"
|
||||
"@jest/globals": "npm:^29.7.0"
|
||||
@@ -2957,16 +2957,16 @@ __metadata:
|
||||
resolution: "@expo/worker@workspace:packages/worker"
|
||||
dependencies:
|
||||
"@babel/core": "npm:7.24.7"
|
||||
"@expo/build-tools": "npm:21.0.3"
|
||||
"@expo/build-tools": "npm:21.1.0"
|
||||
"@expo/config-plugins": "npm:55.0.7"
|
||||
"@expo/config-types": "npm:55.0.5"
|
||||
"@expo/downloader": "npm:21.0.0"
|
||||
"@expo/eas-build-job": "npm:21.0.3"
|
||||
"@expo/eas-build-job": "npm:21.1.0"
|
||||
"@expo/logger": "npm:21.0.0"
|
||||
"@expo/results": "npm:1.0.0"
|
||||
"@expo/rudder-sdk-node": "npm:1.1.1"
|
||||
"@expo/spawn-async": "npm:1.7.2"
|
||||
"@expo/steps": "npm:21.0.3"
|
||||
"@expo/steps": "npm:21.1.0"
|
||||
"@expo/template-file": "npm:21.0.2"
|
||||
"@expo/turtle-spawn": "npm:21.0.0"
|
||||
"@hapi/boom": "npm:10.0.1"
|
||||
@@ -9722,7 +9722,7 @@ __metadata:
|
||||
resolution: "create-eas-build-function@workspace:packages/create-eas-build-function"
|
||||
dependencies:
|
||||
"@expo/package-manager": "npm:1.9.10"
|
||||
"@expo/steps": "npm:21.0.3"
|
||||
"@expo/steps": "npm:21.1.0"
|
||||
"@jest/globals": "npm:^29.7.0"
|
||||
"@types/jest": "npm:^29.5.12"
|
||||
"@types/node": "npm:20.14.2"
|
||||
@@ -10294,8 +10294,8 @@ __metadata:
|
||||
version: 0.0.0-use.local
|
||||
resolution: "eas-cli-local-build-plugin@workspace:packages/local-build-plugin"
|
||||
dependencies:
|
||||
"@expo/build-tools": "npm:21.0.3"
|
||||
"@expo/eas-build-job": "npm:21.0.3"
|
||||
"@expo/build-tools": "npm:21.1.0"
|
||||
"@expo/eas-build-job": "npm:21.1.0"
|
||||
"@expo/logger": "npm:21.0.0"
|
||||
"@expo/spawn-async": "npm:^1.7.2"
|
||||
"@expo/turtle-spawn": "npm:21.0.0"
|
||||
@@ -10352,8 +10352,8 @@ __metadata:
|
||||
"@expo/code-signing-certificates": "npm:0.0.5"
|
||||
"@expo/config": "npm:55.0.10"
|
||||
"@expo/config-plugins": "npm:55.0.7"
|
||||
"@expo/eas-build-job": "npm:21.0.3"
|
||||
"@expo/eas-json": "npm:21.0.3"
|
||||
"@expo/eas-build-job": "npm:21.1.0"
|
||||
"@expo/eas-json": "npm:21.1.0"
|
||||
"@expo/env": "npm:^1.0.0"
|
||||
"@expo/json-file": "npm:8.3.3"
|
||||
"@expo/logger": "npm:21.0.0"
|
||||
@@ -10368,7 +10368,7 @@ __metadata:
|
||||
"@expo/results": "npm:1.0.0"
|
||||
"@expo/rudder-sdk-node": "npm:1.1.1"
|
||||
"@expo/spawn-async": "npm:1.7.2"
|
||||
"@expo/steps": "npm:21.0.3"
|
||||
"@expo/steps": "npm:21.1.0"
|
||||
"@expo/timeago.js": "npm:1.0.0"
|
||||
"@graphql-codegen/cli": "npm:6.3.1"
|
||||
"@graphql-codegen/introspection": "npm:5.0.2"
|
||||
|
||||
Reference in new issue
Block a user