lim 0.32.5 → 0.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +130 -10
- package/dist/base-command.d.ts +18 -1
- package/dist/base-command.d.ts.map +1 -1
- package/dist/base-command.js +73 -5
- package/dist/base-command.js.map +1 -1
- package/dist/commands/android/create.d.ts +5 -0
- package/dist/commands/android/create.d.ts.map +1 -1
- package/dist/commands/android/create.js +18 -4
- package/dist/commands/android/create.js.map +1 -1
- package/dist/commands/android/create.test.d.ts +2 -0
- package/dist/commands/android/create.test.d.ts.map +1 -0
- package/dist/commands/android/create.test.js +47 -0
- package/dist/commands/android/create.test.js.map +1 -0
- package/dist/commands/android/logcat.d.ts +18 -0
- package/dist/commands/android/logcat.d.ts.map +1 -0
- package/dist/commands/android/logcat.js +79 -0
- package/dist/commands/android/logcat.js.map +1 -0
- package/dist/commands/gradle/build.d.ts +1 -0
- package/dist/commands/gradle/build.d.ts.map +1 -1
- package/dist/commands/gradle/build.js +20 -9
- package/dist/commands/gradle/build.js.map +1 -1
- package/dist/commands/gradle/logs.d.ts +16 -0
- package/dist/commands/gradle/logs.d.ts.map +1 -0
- package/dist/commands/gradle/logs.js +63 -0
- package/dist/commands/gradle/logs.js.map +1 -0
- package/dist/commands/gradle/run.d.ts +3 -0
- package/dist/commands/gradle/run.d.ts.map +1 -0
- package/dist/commands/gradle/run.js +5 -0
- package/dist/commands/gradle/run.js.map +1 -0
- package/dist/commands/gradle/tools/index.d.ts +3 -0
- package/dist/commands/gradle/tools/index.d.ts.map +1 -0
- package/dist/commands/gradle/tools/index.js +5 -0
- package/dist/commands/gradle/tools/index.js.map +1 -0
- package/dist/commands/gradle/tools/install.d.ts +3 -0
- package/dist/commands/gradle/tools/install.d.ts.map +1 -0
- package/dist/commands/gradle/tools/install.js +5 -0
- package/dist/commands/gradle/tools/install.js.map +1 -0
- package/dist/commands/gradle/use.d.ts +3 -0
- package/dist/commands/gradle/use.d.ts.map +1 -0
- package/dist/commands/gradle/use.js +5 -0
- package/dist/commands/gradle/use.js.map +1 -0
- package/dist/commands/xcode/build.d.ts.map +1 -1
- package/dist/commands/xcode/build.js +15 -9
- package/dist/commands/xcode/build.js.map +1 -1
- package/dist/commands/xcode/logs.d.ts +16 -0
- package/dist/commands/xcode/logs.d.ts.map +1 -0
- package/dist/commands/xcode/logs.js +77 -0
- package/dist/commands/xcode/logs.js.map +1 -0
- package/dist/commands/xcode/logs.test.d.ts +2 -0
- package/dist/commands/xcode/logs.test.d.ts.map +1 -0
- package/dist/commands/xcode/logs.test.js +78 -0
- package/dist/commands/xcode/logs.test.js.map +1 -0
- package/dist/commands/xcode/run.d.ts +2 -26
- package/dist/commands/xcode/run.d.ts.map +1 -1
- package/dist/commands/xcode/run.js +2 -103
- package/dist/commands/xcode/run.js.map +1 -1
- package/dist/commands/xcode/tools/index.d.ts +3 -0
- package/dist/commands/xcode/tools/index.d.ts.map +1 -0
- package/dist/commands/xcode/tools/index.js +5 -0
- package/dist/commands/xcode/tools/index.js.map +1 -0
- package/dist/commands/xcode/tools/install.d.ts +3 -0
- package/dist/commands/xcode/tools/install.d.ts.map +1 -0
- package/dist/commands/xcode/tools/install.js +5 -0
- package/dist/commands/xcode/tools/install.js.map +1 -0
- package/dist/commands/xcode/use.d.ts +3 -0
- package/dist/commands/xcode/use.d.ts.map +1 -0
- package/dist/commands/xcode/use.js +5 -0
- package/dist/commands/xcode/use.js.map +1 -0
- package/dist/commands/xcode/version/set.d.ts.map +1 -1
- package/dist/commands/xcode/version/set.js +1 -48
- package/dist/commands/xcode/version/set.js.map +1 -1
- package/dist/lib/additional-files.js +1 -1
- package/dist/lib/additional-files.js.map +1 -1
- package/dist/lib/build-command-helpers.d.ts +10 -0
- package/dist/lib/build-command-helpers.d.ts.map +1 -0
- package/dist/lib/build-command-helpers.js +28 -0
- package/dist/lib/build-command-helpers.js.map +1 -0
- package/dist/lib/build-logs.d.ts +27 -0
- package/dist/lib/build-logs.d.ts.map +1 -0
- package/dist/lib/build-logs.js +141 -0
- package/dist/lib/build-logs.js.map +1 -0
- package/dist/lib/build-logs.test.d.ts +2 -0
- package/dist/lib/build-logs.test.d.ts.map +1 -0
- package/dist/lib/build-logs.test.js +187 -0
- package/dist/lib/build-logs.test.js.map +1 -0
- package/dist/lib/build-run-command.d.ts +3 -0
- package/dist/lib/build-run-command.d.ts.map +1 -0
- package/dist/lib/build-run-command.js +89 -0
- package/dist/lib/build-run-command.js.map +1 -0
- package/dist/lib/build-tools-command.d.ts +3 -0
- package/dist/lib/build-tools-command.d.ts.map +1 -0
- package/dist/lib/build-tools-command.js +51 -0
- package/dist/lib/build-tools-command.js.map +1 -0
- package/dist/lib/build-use-command.d.ts +3 -0
- package/dist/lib/build-use-command.d.ts.map +1 -0
- package/dist/lib/build-use-command.js +93 -0
- package/dist/lib/build-use-command.js.map +1 -0
- package/dist/lib/build-use-command.test.d.ts +2 -0
- package/dist/lib/build-use-command.test.d.ts.map +1 -0
- package/dist/lib/build-use-command.test.js +151 -0
- package/dist/lib/build-use-command.test.js.map +1 -0
- package/dist/lib/gradle-build-options.d.ts +1 -0
- package/dist/lib/gradle-build-options.d.ts.map +1 -1
- package/dist/lib/gradle-build-options.js +6 -0
- package/dist/lib/gradle-build-options.js.map +1 -1
- package/dist/lib/gradle-build-options.test.js +6 -0
- package/dist/lib/gradle-build-options.test.js.map +1 -1
- package/dist/lib/sync-flags.js +3 -3
- package/dist/lib/sync-flags.js.map +1 -1
- package/dist/lib/xcode-tools.test.d.ts +2 -0
- package/dist/lib/xcode-tools.test.d.ts.map +1 -0
- package/dist/lib/xcode-tools.test.js +163 -0
- package/dist/lib/xcode-tools.test.js.map +1 -0
- package/package.json +4 -4
|
@@ -2,60 +2,13 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const core_1 = require("@oclif/core");
|
|
4
4
|
const base_command_1 = require("../../../base-command");
|
|
5
|
-
const config_1 = require("../../../lib/config");
|
|
6
5
|
const xcode_version_1 = require("../../../lib/xcode-version");
|
|
7
6
|
class XcodeVersionSet extends base_command_1.BaseCommand {
|
|
8
7
|
async run() {
|
|
9
8
|
const { args, flags } = await this.parse(XcodeVersionSet);
|
|
10
9
|
this.setParsedFlags(flags);
|
|
11
10
|
const major = (0, xcode_version_1.parseXcodeMajor)(args.major, 'version set');
|
|
12
|
-
|
|
13
|
-
// The preference is the workspace's wish and is recorded whatever the sandbox answers, except
|
|
14
|
-
// a 400: a major the node does not offer would make every later command fail the same way.
|
|
15
|
-
const record = () => {
|
|
16
|
-
(0, config_1.setXcodeVersionPreference)(major);
|
|
17
|
-
this.info(`Xcode ${major} is now the preferred version${this.scopeSuffix()}.`);
|
|
18
|
-
};
|
|
19
|
-
await this.withAuth(async () => {
|
|
20
|
-
const target = await this.tryResolveXcodeTarget(flags.id);
|
|
21
|
-
let result;
|
|
22
|
-
try {
|
|
23
|
-
result =
|
|
24
|
-
target ?
|
|
25
|
-
await this.readXcodeSelectionOrForget(target, async () => (await this.resolveXcodeClient(target)).setXcode(major))
|
|
26
|
-
: undefined;
|
|
27
|
-
}
|
|
28
|
-
catch (err) {
|
|
29
|
-
const refusal = this.xcodeRefusal(err);
|
|
30
|
-
if (refusal?.status === 400) {
|
|
31
|
-
if (previous === major) {
|
|
32
|
-
this.error(`${refusal.message}. This workspace already prefers Xcode ${major}; drop it with: lim xcode version unset`);
|
|
33
|
-
}
|
|
34
|
-
this.error(`${refusal.message}. The workspace preference stays ${previous ? `Xcode ${previous}` : 'unset'}.`);
|
|
35
|
-
}
|
|
36
|
-
record();
|
|
37
|
-
if (refusal)
|
|
38
|
-
this.error(`${refusal.message}. The next command switches the sandbox.`);
|
|
39
|
-
throw err;
|
|
40
|
-
}
|
|
41
|
-
record();
|
|
42
|
-
if (!target || !result) {
|
|
43
|
-
if (flags.json)
|
|
44
|
-
this.outputJson({ preferred: major });
|
|
45
|
-
else
|
|
46
|
-
this.output(`No sandbox instance found${this.scopeSuffix()}; the next one uses it.`);
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
if (flags.json) {
|
|
50
|
-
this.outputJson({ instanceId: target.id, preferred: major, ...result });
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
const verb = result.alreadyBound ? 'already uses' : 'now uses';
|
|
54
|
-
this.output(`Sandbox ${target.id} ${verb} Xcode ${(0, xcode_version_1.formatXcode)(result.bound)}`);
|
|
55
|
-
if (result.derivedDataReset) {
|
|
56
|
-
this.output('The build cache from the previous Xcode is invalidated; the next build starts cold.');
|
|
57
|
-
}
|
|
58
|
-
});
|
|
11
|
+
await this.setPreferredXcodeVersion(major, flags.id);
|
|
59
12
|
}
|
|
60
13
|
}
|
|
61
14
|
XcodeVersionSet.summary = 'Pick the Xcode version this workspace builds with';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set.js","sourceRoot":"","sources":["../../../../src/commands/xcode/version/set.ts"],"names":[],"mappings":";;AAAA,sCAAmC;
|
|
1
|
+
{"version":3,"file":"set.js","sourceRoot":"","sources":["../../../../src/commands/xcode/version/set.ts"],"names":[],"mappings":";;AAAA,sCAAmC;AACnC,wDAAoD;AACpD,8DAA+E;AAE/E,MAAqB,eAAgB,SAAQ,0BAAW;IAmBtD,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC1D,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAA,+BAAe,EAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QACzD,MAAM,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;;AAvBM,uBAAO,GAAG,mDAAmD,CAAC;AAC9D,2BAAW,GAChB,gHAAgH;IAChH,gHAAgH;IAChH,yKAAyK;IACzK,2CAA2C,CAAC;AAEvC,wBAAQ,GAAG;IAChB,wCAAwC;IACxC,iEAAiE;CAClE,CAAC;AAEK,oBAAI,GAAG;IACZ,KAAK,EAAE,WAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,iCAAiC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;CACvF,CAAC;AAEK,qBAAK,GAAG,EAAE,GAAG,0BAAW,CAAC,SAAS,EAAE,GAAG,gCAAgB,EAAE,CAAC;kBAjB9C,eAAe"}
|
|
@@ -8,7 +8,7 @@ function parseAdditionalFileFlags(values) {
|
|
|
8
8
|
return values.map((value) => {
|
|
9
9
|
const separator = value.indexOf('=');
|
|
10
10
|
if (separator <= 0 || separator === value.length - 1) {
|
|
11
|
-
throw new Error(`Invalid --additional-file value "${value}". Expected localPath=remotePath, for example ~/.netrc
|
|
11
|
+
throw new Error(`Invalid --additional-file value "${value}". Expected localPath=remotePath, for example ~/.netrc=.netrc`);
|
|
12
12
|
}
|
|
13
13
|
return {
|
|
14
14
|
localPath: value.slice(0, separator),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"additional-files.js","sourceRoot":"","sources":["../../src/lib/additional-files.ts"],"names":[],"mappings":";;AAKA,4DAgBC;AAhBD,SAAgB,wBAAwB,CAAC,MAA4B;IACnE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,SAAS,IAAI,CAAC,IAAI,SAAS,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CACb,oCAAoC,KAAK,
|
|
1
|
+
{"version":3,"file":"additional-files.js","sourceRoot":"","sources":["../../src/lib/additional-files.ts"],"names":[],"mappings":";;AAKA,4DAgBC;AAhBD,SAAgB,wBAAwB,CAAC,MAA4B;IACnE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,SAAS,IAAI,CAAC,IAAI,SAAS,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CACb,oCAAoC,KAAK,+DAA+D,CACzG,CAAC;QACJ,CAAC;QACD,OAAO;YACL,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC;YACpC,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;SACvC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { GradleClient } from '@limrun/api/resources/gradle-instances-helpers';
|
|
2
|
+
import type { ExecChildProcess } from '@limrun/api/exec-client';
|
|
3
|
+
type BuildClient = Pick<GradleClient, 'sync' | 'run'>;
|
|
4
|
+
type ReportError = (message: string, options: {
|
|
5
|
+
exit: number;
|
|
6
|
+
}) => never;
|
|
7
|
+
export declare function syncBuildProject(client: BuildClient, options: Parameters<BuildClient['sync']>[1], info: (message: string) => void): Promise<void>;
|
|
8
|
+
export declare function streamBuildCommand(proc: ExecChildProcess, error: ReportError, failure?: string): Promise<void>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=build-command-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-command-helpers.d.ts","sourceRoot":"","sources":["../../src/lib/build-command-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gDAAgD,CAAC;AACnF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,KAAK,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;AACtD,KAAK,WAAW,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,KAAK,KAAK,CAAC;AAEzE,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAC3C,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAC9B,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,WAAW,EAClB,OAAO,SAAmB,GACzB,OAAO,CAAC,IAAI,CAAC,CAcf"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.syncBuildProject = syncBuildProject;
|
|
4
|
+
exports.streamBuildCommand = streamBuildCommand;
|
|
5
|
+
const duration_1 = require("./duration");
|
|
6
|
+
const bytes_1 = require("./bytes");
|
|
7
|
+
async function syncBuildProject(client, options, info) {
|
|
8
|
+
const directory = process.cwd();
|
|
9
|
+
info(`Syncing ${directory}...`);
|
|
10
|
+
const started = Date.now();
|
|
11
|
+
const result = await client.sync(directory, options);
|
|
12
|
+
const size = result.bytesSent === undefined ? '' : ` (${(0, bytes_1.formatBytes)(result.bytesSent)} sent)`;
|
|
13
|
+
info(`Sync completed in ${(0, duration_1.formatDurationMs)(Date.now() - started)}${size}.`);
|
|
14
|
+
}
|
|
15
|
+
async function streamBuildCommand(proc, error, failure = 'Command failed') {
|
|
16
|
+
proc.stdout.on('data', (line) => process.stdout.write(line + '\n'));
|
|
17
|
+
proc.stderr.on('data', (line) => process.stderr.write(line + '\n'));
|
|
18
|
+
const result = await proc;
|
|
19
|
+
if (result.exitCode === 0)
|
|
20
|
+
return;
|
|
21
|
+
if (result.timedOut) {
|
|
22
|
+
error(result.incomplete && result.incomplete.reason !== 'timeout' ?
|
|
23
|
+
`${result.incomplete.message}.`
|
|
24
|
+
: 'Timed out waiting for the command to finish; the remote command may still be running.', { exit: result.exitCode });
|
|
25
|
+
}
|
|
26
|
+
error(`${failure} with exit code ${result.exitCode}.`, { exit: result.exitCode });
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=build-command-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-command-helpers.js","sourceRoot":"","sources":["../../src/lib/build-command-helpers.ts"],"names":[],"mappings":";;AAQA,4CAWC;AAED,gDAkBC;AArCD,yCAA8C;AAC9C,mCAAsC;AAK/B,KAAK,UAAU,gBAAgB,CACpC,MAAmB,EACnB,OAA2C,EAC3C,IAA+B;IAE/B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAChC,IAAI,CAAC,WAAW,SAAS,KAAK,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAA,mBAAW,EAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;IAC9F,IAAI,CAAC,qBAAqB,IAAA,2BAAgB,EAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;AAC9E,CAAC;AAEM,KAAK,UAAU,kBAAkB,CACtC,IAAsB,EACtB,KAAkB,EAClB,OAAO,GAAG,gBAAgB;IAE1B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;IAC5E,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC;IAC1B,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;QAAE,OAAO;IAClC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,KAAK,CACH,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;YAC3D,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,GAAG;YACjC,CAAC,CAAC,uFAAuF,EACzF,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,CAC1B,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,GAAG,OAAO,mBAAmB,MAAM,CAAC,QAAQ,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;AACpF,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ExecLogOptions, ExecLogResult } from '@limrun/api/exec-client';
|
|
2
|
+
import type { BuildLog } from '@limrun/api/resources/daemon-client-shared';
|
|
3
|
+
export type BuildLogsResult = {
|
|
4
|
+
instanceId: string;
|
|
5
|
+
execId: string;
|
|
6
|
+
status: string;
|
|
7
|
+
exitCode?: number;
|
|
8
|
+
logs: string;
|
|
9
|
+
source: 'retained' | 'persisted';
|
|
10
|
+
};
|
|
11
|
+
type BuildLogsOptions = {
|
|
12
|
+
instanceId: string;
|
|
13
|
+
execId?: string;
|
|
14
|
+
follow: boolean;
|
|
15
|
+
listPersisted: () => Promise<BuildLog[]>;
|
|
16
|
+
observe: (execId: string, options: Required<Pick<ExecLogOptions, 'follow' | 'onEvent'>>) => Promise<ExecLogResult>;
|
|
17
|
+
fetchText?: (url: string) => Promise<string>;
|
|
18
|
+
onText?: (text: string, stream: 'stdout' | 'stderr') => void;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Returns logs for a specific build or the latest build, including one still running.
|
|
22
|
+
* Retained SSE is preferred for the latest build; durable object storage is
|
|
23
|
+
* preferred for a specific build once its metadata sidecar exists.
|
|
24
|
+
*/
|
|
25
|
+
export declare function getBuildLogs(options: BuildLogsOptions): Promise<BuildLogsResult>;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=build-logs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-logs.d.ts","sourceRoot":"","sources":["../../src/lib/build-logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4CAA4C,CAAC;AAE3E,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,WAAW,CAAC;CAClC,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACzC,OAAO,EAAE,CACP,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,SAAS,CAAC,CAAC,KAC1D,OAAO,CAAC,aAAa,CAAC,CAAC;IAC5B,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,KAAK,IAAI,CAAC;CAC9D,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAiDtF"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getBuildLogs = getBuildLogs;
|
|
4
|
+
/**
|
|
5
|
+
* Returns logs for a specific build or the latest build, including one still running.
|
|
6
|
+
* Retained SSE is preferred for the latest build; durable object storage is
|
|
7
|
+
* preferred for a specific build once its metadata sidecar exists.
|
|
8
|
+
*/
|
|
9
|
+
async function getBuildLogs(options) {
|
|
10
|
+
if (options.execId) {
|
|
11
|
+
if (!isBuildExecId(options.execId)) {
|
|
12
|
+
throw new Error(`Invalid build exec ID ${options.execId}; expected build-<number>.`);
|
|
13
|
+
}
|
|
14
|
+
const persisted = await tryListPersisted(options.listPersisted);
|
|
15
|
+
const record = persisted.records.find((entry) => entry.id === options.execId);
|
|
16
|
+
if (record) {
|
|
17
|
+
return readPersisted(options, record);
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
return await readRetained(options, options.execId);
|
|
21
|
+
}
|
|
22
|
+
catch (retainedError) {
|
|
23
|
+
if (!isRetainedBuildNotFound(retainedError)) {
|
|
24
|
+
throw retainedError;
|
|
25
|
+
}
|
|
26
|
+
// Persistence commits just after the terminal event. Refresh once to
|
|
27
|
+
// close that race before reporting a missing/pruned exec.
|
|
28
|
+
const refreshed = await tryListPersisted(options.listPersisted);
|
|
29
|
+
const refreshedRecord = refreshed.records.find((entry) => entry.id === options.execId);
|
|
30
|
+
if (refreshedRecord) {
|
|
31
|
+
return readPersisted(options, refreshedRecord);
|
|
32
|
+
}
|
|
33
|
+
if (refreshed.error) {
|
|
34
|
+
throw refreshed.error;
|
|
35
|
+
}
|
|
36
|
+
if (!isMissingBuild(retainedError))
|
|
37
|
+
throw retainedError;
|
|
38
|
+
throw new Error(`Build ${options.execId} was not found on instance ${options.instanceId}.`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
return await readRetained(options, 'latest');
|
|
43
|
+
}
|
|
44
|
+
catch (latestError) {
|
|
45
|
+
if (!isRetainedBuildNotFound(latestError)) {
|
|
46
|
+
throw latestError;
|
|
47
|
+
}
|
|
48
|
+
const persisted = await tryListPersisted(options.listPersisted);
|
|
49
|
+
const latest = persisted.records[persisted.records.length - 1];
|
|
50
|
+
if (latest) {
|
|
51
|
+
return readPersisted(options, latest);
|
|
52
|
+
}
|
|
53
|
+
if (persisted.error) {
|
|
54
|
+
throw persisted.error;
|
|
55
|
+
}
|
|
56
|
+
if (!isMissingBuild(latestError))
|
|
57
|
+
throw latestError;
|
|
58
|
+
throw new Error(`No active or persisted builds found for instance ${options.instanceId}.`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async function readRetained(options, execId) {
|
|
62
|
+
const parts = [];
|
|
63
|
+
const observed = await options.observe(execId, {
|
|
64
|
+
follow: options.follow,
|
|
65
|
+
onEvent: (event) => {
|
|
66
|
+
let text;
|
|
67
|
+
let stream = 'stdout';
|
|
68
|
+
if (event.type === 'command') {
|
|
69
|
+
text = `$ ${event.data}`;
|
|
70
|
+
}
|
|
71
|
+
else if (event.type === 'stdout') {
|
|
72
|
+
text = event.data;
|
|
73
|
+
}
|
|
74
|
+
else if (event.type === 'stderr') {
|
|
75
|
+
text = event.data;
|
|
76
|
+
stream = 'stderr';
|
|
77
|
+
}
|
|
78
|
+
if (text === undefined)
|
|
79
|
+
return;
|
|
80
|
+
const chunk = text.endsWith('\n') ? text : `${text}\n`;
|
|
81
|
+
parts.push(chunk);
|
|
82
|
+
options.onText?.(chunk, stream);
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
return {
|
|
86
|
+
instanceId: options.instanceId,
|
|
87
|
+
execId: observed.execId,
|
|
88
|
+
status: observed.status,
|
|
89
|
+
...(observed.exitCode !== undefined && { exitCode: observed.exitCode }),
|
|
90
|
+
logs: parts.join(''),
|
|
91
|
+
source: 'retained',
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
async function readPersisted(options, record) {
|
|
95
|
+
const logs = await (options.fetchText ?? fetchBuildLog)(record.downloadUrl);
|
|
96
|
+
options.onText?.(logs, 'stdout');
|
|
97
|
+
return {
|
|
98
|
+
instanceId: options.instanceId,
|
|
99
|
+
execId: record.id,
|
|
100
|
+
status: record.status,
|
|
101
|
+
...(record.exitCode !== undefined && { exitCode: record.exitCode }),
|
|
102
|
+
logs,
|
|
103
|
+
source: 'persisted',
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
async function tryListPersisted(listPersisted) {
|
|
107
|
+
try {
|
|
108
|
+
const records = (await listPersisted()).filter((record) => isBuildExecId(record.id));
|
|
109
|
+
records.sort((a, b) => {
|
|
110
|
+
const aId = BigInt(a.id.slice(6));
|
|
111
|
+
const bId = BigInt(b.id.slice(6));
|
|
112
|
+
return (aId < bId ? -1
|
|
113
|
+
: aId > bId ? 1
|
|
114
|
+
: 0);
|
|
115
|
+
});
|
|
116
|
+
return { records };
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
return { records: [], error };
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async function fetchBuildLog(url) {
|
|
123
|
+
const response = await fetch(url);
|
|
124
|
+
if (!response.ok) {
|
|
125
|
+
throw new Error(`Failed to download build log: ${response.status} ${response.statusText}`);
|
|
126
|
+
}
|
|
127
|
+
return response.text();
|
|
128
|
+
}
|
|
129
|
+
function isRetainedBuildNotFound(err) {
|
|
130
|
+
// A deleted instance can still have persisted build logs.
|
|
131
|
+
return err instanceof Error && err.status === 404;
|
|
132
|
+
}
|
|
133
|
+
function isMissingBuild(err) {
|
|
134
|
+
return (err.message.includes('GET exec logs failed: 404') &&
|
|
135
|
+
(err.message.includes('"message":"build not found"') ||
|
|
136
|
+
err.message.includes('"message":"no builds exist"')));
|
|
137
|
+
}
|
|
138
|
+
function isBuildExecId(execId) {
|
|
139
|
+
return /^build-[0-9]+$/.test(execId);
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=build-logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-logs.js","sourceRoot":"","sources":["../../src/lib/build-logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-logs.test.d.ts","sourceRoot":"","sources":["../../src/lib/build-logs.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const build_logs_1 = require("./build-logs");
|
|
4
|
+
describe('getBuildLogs', () => {
|
|
5
|
+
test('returns an active build snapshot', async () => {
|
|
6
|
+
const onText = jest.fn();
|
|
7
|
+
const listPersisted = jest.fn(async () => []);
|
|
8
|
+
await expect((0, build_logs_1.getBuildLogs)({
|
|
9
|
+
instanceId: 'xcode_test',
|
|
10
|
+
follow: false,
|
|
11
|
+
listPersisted,
|
|
12
|
+
observe: async (execId, options) => {
|
|
13
|
+
expect(execId).toBe('latest');
|
|
14
|
+
options.onEvent({ type: 'command', data: 'xcodebuild -scheme App' });
|
|
15
|
+
options.onEvent({ type: 'stdout', data: 'Compiling' });
|
|
16
|
+
return { execId: 'build-3', status: 'RUNNING' };
|
|
17
|
+
},
|
|
18
|
+
onText,
|
|
19
|
+
})).resolves.toEqual({
|
|
20
|
+
instanceId: 'xcode_test',
|
|
21
|
+
execId: 'build-3',
|
|
22
|
+
status: 'RUNNING',
|
|
23
|
+
logs: '$ xcodebuild -scheme App\nCompiling\n',
|
|
24
|
+
source: 'retained',
|
|
25
|
+
});
|
|
26
|
+
expect(listPersisted).not.toHaveBeenCalled();
|
|
27
|
+
expect(onText).toHaveBeenCalledTimes(2);
|
|
28
|
+
});
|
|
29
|
+
test('falls back from missing retained logs to the latest persisted build', async () => {
|
|
30
|
+
const records = [
|
|
31
|
+
{ id: 'build-1', status: 'FAILED', exitCode: 1, downloadUrl: 'https://logs/1' },
|
|
32
|
+
{ id: 'build-2', status: 'SUCCEEDED', exitCode: 0, downloadUrl: 'https://logs/2' },
|
|
33
|
+
{ id: 'run-3', status: 'SUCCEEDED', exitCode: 0, downloadUrl: 'https://logs/run' },
|
|
34
|
+
];
|
|
35
|
+
await expect((0, build_logs_1.getBuildLogs)({
|
|
36
|
+
instanceId: 'gradle_test',
|
|
37
|
+
follow: false,
|
|
38
|
+
listPersisted: async () => records,
|
|
39
|
+
observe: async () => {
|
|
40
|
+
throw notFound();
|
|
41
|
+
},
|
|
42
|
+
fetchText: async (url) => `downloaded ${url}\n`,
|
|
43
|
+
})).resolves.toEqual({
|
|
44
|
+
instanceId: 'gradle_test',
|
|
45
|
+
execId: 'build-2',
|
|
46
|
+
status: 'SUCCEEDED',
|
|
47
|
+
exitCode: 0,
|
|
48
|
+
logs: 'downloaded https://logs/2\n',
|
|
49
|
+
source: 'persisted',
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
test('prefers durable logs for a specific completed build', async () => {
|
|
53
|
+
const observe = jest.fn();
|
|
54
|
+
const record = {
|
|
55
|
+
id: 'build-1',
|
|
56
|
+
status: 'CANCELLED',
|
|
57
|
+
exitCode: -1,
|
|
58
|
+
downloadUrl: 'https://logs/1',
|
|
59
|
+
};
|
|
60
|
+
const result = await (0, build_logs_1.getBuildLogs)({
|
|
61
|
+
instanceId: 'xcode_test',
|
|
62
|
+
execId: 'build-1',
|
|
63
|
+
follow: true,
|
|
64
|
+
listPersisted: async () => [record],
|
|
65
|
+
observe,
|
|
66
|
+
fetchText: async () => 'cancelled\n',
|
|
67
|
+
});
|
|
68
|
+
expect(result.source).toBe('persisted');
|
|
69
|
+
expect(result.status).toBe('CANCELLED');
|
|
70
|
+
expect(observe).not.toHaveBeenCalled();
|
|
71
|
+
});
|
|
72
|
+
test('refreshes persisted logs after a terminal retention race', async () => {
|
|
73
|
+
const record = {
|
|
74
|
+
id: 'build-1',
|
|
75
|
+
status: 'SUCCEEDED',
|
|
76
|
+
exitCode: 0,
|
|
77
|
+
downloadUrl: 'https://logs/1',
|
|
78
|
+
};
|
|
79
|
+
const listPersisted = jest
|
|
80
|
+
.fn()
|
|
81
|
+
.mockResolvedValueOnce([])
|
|
82
|
+
.mockResolvedValueOnce([record]);
|
|
83
|
+
const result = await (0, build_logs_1.getBuildLogs)({
|
|
84
|
+
instanceId: 'xcode_test',
|
|
85
|
+
execId: 'build-1',
|
|
86
|
+
follow: false,
|
|
87
|
+
listPersisted,
|
|
88
|
+
observe: async () => {
|
|
89
|
+
throw notFound();
|
|
90
|
+
},
|
|
91
|
+
fetchText: async () => 'finished\n',
|
|
92
|
+
});
|
|
93
|
+
expect(result.source).toBe('persisted');
|
|
94
|
+
expect(listPersisted).toHaveBeenCalledTimes(2);
|
|
95
|
+
});
|
|
96
|
+
test('uses the latest retained build during the durable upload gap', async () => {
|
|
97
|
+
const listPersisted = jest.fn(async () => []);
|
|
98
|
+
const result = await (0, build_logs_1.getBuildLogs)({
|
|
99
|
+
instanceId: 'xcode_test',
|
|
100
|
+
follow: false,
|
|
101
|
+
listPersisted,
|
|
102
|
+
observe: async (execId) => {
|
|
103
|
+
expect(execId).toBe('latest');
|
|
104
|
+
return { execId: 'build-9', status: 'SUCCEEDED', exitCode: 0 };
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
expect(result).toMatchObject({ execId: 'build-9', status: 'SUCCEEDED', source: 'retained' });
|
|
108
|
+
expect(listPersisted).not.toHaveBeenCalled();
|
|
109
|
+
});
|
|
110
|
+
test('does not mask active stream failures with stale logs', async () => {
|
|
111
|
+
const stale = { id: 'build-1', status: 'SUCCEEDED', downloadUrl: 'https://logs/1' };
|
|
112
|
+
const unavailable = Object.assign(new Error('daemon unavailable'), { status: 503 });
|
|
113
|
+
const listPersisted = jest.fn(async () => [stale]);
|
|
114
|
+
await expect((0, build_logs_1.getBuildLogs)({
|
|
115
|
+
instanceId: 'xcode_test',
|
|
116
|
+
follow: false,
|
|
117
|
+
listPersisted,
|
|
118
|
+
observe: async () => {
|
|
119
|
+
throw unavailable;
|
|
120
|
+
},
|
|
121
|
+
})).rejects.toBe(unavailable);
|
|
122
|
+
expect(listPersisted).not.toHaveBeenCalled();
|
|
123
|
+
});
|
|
124
|
+
test('reports a missing exec without an instance-level 404', async () => {
|
|
125
|
+
const error = await (0, build_logs_1.getBuildLogs)({
|
|
126
|
+
instanceId: 'xcode_test',
|
|
127
|
+
execId: 'build-404',
|
|
128
|
+
follow: false,
|
|
129
|
+
listPersisted: async () => [],
|
|
130
|
+
observe: async () => {
|
|
131
|
+
throw notFound();
|
|
132
|
+
},
|
|
133
|
+
}).catch((err) => err);
|
|
134
|
+
expect(error).toEqual(new Error('Build build-404 was not found on instance xcode_test.'));
|
|
135
|
+
expect(error.status).toBeUndefined();
|
|
136
|
+
});
|
|
137
|
+
test('preserves an instance-level 404 for BaseCommand handling', async () => {
|
|
138
|
+
const instanceMissing = Object.assign(new Error('404 GET exec logs failed: 404 {"message":"instance not found"}'), { status: 404 });
|
|
139
|
+
await expect((0, build_logs_1.getBuildLogs)({
|
|
140
|
+
instanceId: 'xcode_missing',
|
|
141
|
+
execId: 'build-1',
|
|
142
|
+
follow: false,
|
|
143
|
+
listPersisted: async () => [],
|
|
144
|
+
observe: async () => {
|
|
145
|
+
throw instanceMissing;
|
|
146
|
+
},
|
|
147
|
+
})).rejects.toBe(instanceMissing);
|
|
148
|
+
});
|
|
149
|
+
test('reports when an instance has no builds', async () => {
|
|
150
|
+
await expect((0, build_logs_1.getBuildLogs)({
|
|
151
|
+
instanceId: 'xcode_empty',
|
|
152
|
+
follow: false,
|
|
153
|
+
listPersisted: async () => [],
|
|
154
|
+
observe: async () => {
|
|
155
|
+
throw notFound();
|
|
156
|
+
},
|
|
157
|
+
})).rejects.toThrow('No active or persisted builds found for instance xcode_empty.');
|
|
158
|
+
});
|
|
159
|
+
test('reads the newest persisted build after the instance is deleted', async () => {
|
|
160
|
+
const instanceMissing = Object.assign(new Error('instance not found'), { status: 404 });
|
|
161
|
+
const records = [
|
|
162
|
+
{ id: 'build-10', status: 'SUCCEEDED', exitCode: 0, downloadUrl: 'https://logs/10' },
|
|
163
|
+
{ id: 'build-9', status: 'FAILED', exitCode: 1, downloadUrl: 'https://logs/9' },
|
|
164
|
+
];
|
|
165
|
+
const result = await (0, build_logs_1.getBuildLogs)({
|
|
166
|
+
instanceId: 'xcode_deleted',
|
|
167
|
+
follow: false,
|
|
168
|
+
listPersisted: async () => records,
|
|
169
|
+
observe: async () => {
|
|
170
|
+
throw instanceMissing;
|
|
171
|
+
},
|
|
172
|
+
fetchText: async (url) => `downloaded ${url}\n`,
|
|
173
|
+
});
|
|
174
|
+
expect(result).toMatchObject({
|
|
175
|
+
execId: 'build-10',
|
|
176
|
+
logs: 'downloaded https://logs/10\n',
|
|
177
|
+
source: 'persisted',
|
|
178
|
+
});
|
|
179
|
+
expect(records[0]?.id).toBe('build-10');
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
function notFound() {
|
|
183
|
+
return Object.assign(new Error('404 GET exec logs failed: 404 {"message":"build not found"}'), {
|
|
184
|
+
status: 404,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=build-logs.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-logs.test.js","sourceRoot":"","sources":["../../src/lib/build-logs.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-run-command.d.ts","sourceRoot":"","sources":["../../src/lib/build-run-command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAK9C,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,WAAW,CAuFhF"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildRunCommand = buildRunCommand;
|
|
4
|
+
const core_1 = require("@oclif/core");
|
|
5
|
+
const base_command_1 = require("../base-command");
|
|
6
|
+
const sync_flags_1 = require("./sync-flags");
|
|
7
|
+
const build_command_helpers_1 = require("./build-command-helpers");
|
|
8
|
+
const env_entries_1 = require("./env-entries");
|
|
9
|
+
function buildRunCommand(platform) {
|
|
10
|
+
var _a;
|
|
11
|
+
return _a = class BuildRun extends base_command_1.BaseCommand {
|
|
12
|
+
async run() {
|
|
13
|
+
const delimiter = this.argv.indexOf('--');
|
|
14
|
+
if (delimiter < 0) {
|
|
15
|
+
this.error(`Separate the remote command with --, for example: lim ${platform} run -- make api`);
|
|
16
|
+
}
|
|
17
|
+
const commandArgs = this.argv.slice(delimiter + 1);
|
|
18
|
+
if (commandArgs.length === 0) {
|
|
19
|
+
this.error('A command is required after `--`.');
|
|
20
|
+
}
|
|
21
|
+
const { args, flags } = await this.parse(_a, this.argv.slice(0, delimiter));
|
|
22
|
+
this.setParsedFlags(flags);
|
|
23
|
+
const env = (0, env_entries_1.parseEnvEntries)(flags.env ?? [], (message) => this.error(message));
|
|
24
|
+
const commandLine = commandArgs.length === 1 ? commandArgs[0] : commandArgs.map(quoteShellArgument).join(' ');
|
|
25
|
+
await this.withAuth(async () => {
|
|
26
|
+
const { target, client } = await this.resolveBuildToolClient(platform, flags.id);
|
|
27
|
+
// The build sandbox hosts no simulators, so simctl install/boot/launch
|
|
28
|
+
// is denied there. Steer to the attach flow before the command runs.
|
|
29
|
+
if (platform === 'xcode' && /\bsimctl\b/.test(commandLine)) {
|
|
30
|
+
this.info(`Note: the ${platform} sandbox does not host simulators, so simctl cannot install or launch apps here. ` +
|
|
31
|
+
'Create a cloud iOS simulator attached to this instance instead; it gets the latest build installed ' +
|
|
32
|
+
'right away and every next build installed and reloaded automatically:\n' +
|
|
33
|
+
` lim ios create --attach ${target.id}`);
|
|
34
|
+
}
|
|
35
|
+
if (!flags['no-sync']) {
|
|
36
|
+
await (0, build_command_helpers_1.syncBuildProject)(client, (0, sync_flags_1.syncOptionsFromFlags)(flags), (message) => this.info(message));
|
|
37
|
+
}
|
|
38
|
+
this.info(`Running in ${args.cwd ?? '.'}: ${commandLine}`);
|
|
39
|
+
const proc = client.run(commandLine, {
|
|
40
|
+
cwd: args.cwd ?? '.',
|
|
41
|
+
...(env && { env }),
|
|
42
|
+
...(flags.timeout !== undefined && { timeoutSeconds: flags.timeout }),
|
|
43
|
+
});
|
|
44
|
+
await (0, build_command_helpers_1.streamBuildCommand)(proc, (message, options) => this.error(message, options));
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
_a.summary = `Run a command on a ${platform} sandbox`,
|
|
49
|
+
_a.description = 'Sync the current directory, then run a one-shot shell command in the remote workspace with streamed output.',
|
|
50
|
+
_a.examples = [
|
|
51
|
+
`<%= config.bin %> ${platform} run -- make api`,
|
|
52
|
+
`<%= config.bin %> ${platform} run apps/api -- make generate`,
|
|
53
|
+
`<%= config.bin %> ${platform} run --env API_ENV=development -- npm run generate`,
|
|
54
|
+
`<%= config.bin %> ${platform} run --no-sync -- mise run build`,
|
|
55
|
+
],
|
|
56
|
+
_a.args = {
|
|
57
|
+
cwd: core_1.Args.string({
|
|
58
|
+
description: 'Remote working directory relative to the synced workspace root. Defaults to ".".',
|
|
59
|
+
required: false,
|
|
60
|
+
default: '.',
|
|
61
|
+
}),
|
|
62
|
+
},
|
|
63
|
+
_a.flags = {
|
|
64
|
+
...base_command_1.BaseCommand.baseFlags,
|
|
65
|
+
...sync_flags_1.syncFlags,
|
|
66
|
+
id: core_1.Flags.string({
|
|
67
|
+
description: `${platform} instance ID to run on. Defaults to the most recent standalone ${platform} target.`,
|
|
68
|
+
}),
|
|
69
|
+
env: core_1.Flags.string({
|
|
70
|
+
description: 'Environment variable in KEY=VALUE form. Repeat for multiple variables.',
|
|
71
|
+
multiple: true,
|
|
72
|
+
multipleNonGreedy: true,
|
|
73
|
+
}),
|
|
74
|
+
timeout: core_1.Flags.integer({
|
|
75
|
+
description: 'Server-side command timeout in seconds. Defaults to 3600, max 21600.',
|
|
76
|
+
min: 1,
|
|
77
|
+
max: 21600,
|
|
78
|
+
}),
|
|
79
|
+
'no-sync': core_1.Flags.boolean({
|
|
80
|
+
description: 'Skip syncing the current directory before running the command.',
|
|
81
|
+
default: false,
|
|
82
|
+
}),
|
|
83
|
+
},
|
|
84
|
+
_a;
|
|
85
|
+
}
|
|
86
|
+
function quoteShellArgument(value) {
|
|
87
|
+
return `'${value.split("'").join("'\"'\"'")}'`;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=build-run-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-run-command.js","sourceRoot":"","sources":["../../src/lib/build-run-command.ts"],"names":[],"mappings":"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"}
|