lim 0.31.4 → 0.32.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 +16 -3
- package/dist/base-command.d.ts +16 -1
- package/dist/base-command.d.ts.map +1 -1
- package/dist/base-command.js +82 -0
- package/dist/base-command.js.map +1 -1
- 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 +6 -0
- package/dist/commands/gradle/build.js.map +1 -1
- package/dist/commands/ios/tunnel/index.d.ts.map +1 -1
- package/dist/commands/ios/tunnel/index.js +10 -3
- package/dist/commands/ios/tunnel/index.js.map +1 -1
- package/dist/commands/xcode/build.d.ts +2 -0
- package/dist/commands/xcode/build.d.ts.map +1 -1
- package/dist/commands/xcode/build.js +13 -2
- package/dist/commands/xcode/build.js.map +1 -1
- package/dist/commands/xcode/create.d.ts +1 -0
- package/dist/commands/xcode/create.d.ts.map +1 -1
- package/dist/commands/xcode/create.js +24 -3
- package/dist/commands/xcode/create.js.map +1 -1
- package/dist/commands/xcode/rbe/index.d.ts +1 -0
- package/dist/commands/xcode/rbe/index.d.ts.map +1 -1
- package/dist/commands/xcode/rbe/index.js +5 -0
- package/dist/commands/xcode/rbe/index.js.map +1 -1
- package/dist/commands/xcode/run.d.ts.map +1 -1
- package/dist/commands/xcode/run.js +2 -1
- package/dist/commands/xcode/run.js.map +1 -1
- package/dist/commands/xcode/sync.d.ts.map +1 -1
- package/dist/commands/xcode/sync.js +2 -1
- package/dist/commands/xcode/sync.js.map +1 -1
- package/dist/commands/xcode/test.d.ts +1 -0
- package/dist/commands/xcode/test.d.ts.map +1 -1
- package/dist/commands/xcode/test.js +4 -1
- package/dist/commands/xcode/test.js.map +1 -1
- package/dist/commands/xcode/version/index.d.ts +17 -0
- package/dist/commands/xcode/version/index.d.ts.map +1 -0
- package/dist/commands/xcode/version/index.js +51 -0
- package/dist/commands/xcode/version/index.js.map +1 -0
- package/dist/commands/xcode/version/list.d.ts +17 -0
- package/dist/commands/xcode/version/list.d.ts.map +1 -0
- package/dist/commands/xcode/version/list.js +54 -0
- package/dist/commands/xcode/version/list.js.map +1 -0
- package/dist/commands/xcode/version/set.d.ts +20 -0
- package/dist/commands/xcode/version/set.d.ts.map +1 -0
- package/dist/commands/xcode/version/set.js +53 -0
- package/dist/commands/xcode/version/set.js.map +1 -0
- package/dist/commands/xcode/version/unset.d.ts +16 -0
- package/dist/commands/xcode/version/unset.d.ts.map +1 -0
- package/dist/commands/xcode/version/unset.js +29 -0
- package/dist/commands/xcode/version/unset.js.map +1 -0
- package/dist/lib/build-env-flags.test.js +16 -1
- package/dist/lib/build-env-flags.test.js.map +1 -1
- package/dist/lib/config.d.ts +4 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +32 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/webhook-options.d.ts +13 -5
- package/dist/lib/webhook-options.d.ts.map +1 -1
- package/dist/lib/webhook-options.js +35 -5
- package/dist/lib/webhook-options.js.map +1 -1
- package/dist/lib/webhook-options.test.js +58 -0
- package/dist/lib/webhook-options.test.js.map +1 -1
- package/dist/lib/xcode-version.d.ts +25 -0
- package/dist/lib/xcode-version.d.ts.map +1 -0
- package/dist/lib/xcode-version.js +51 -0
- package/dist/lib/xcode-version.js.map +1 -0
- package/dist/lib/xcode-version.test.d.ts +2 -0
- package/dist/lib/xcode-version.test.d.ts.map +1 -0
- package/dist/lib/xcode-version.test.js +74 -0
- package/dist/lib/xcode-version.test.js.map +1 -0
- package/package.json +3 -3
|
@@ -2,17 +2,25 @@ import type { WebhookConfig } from '@limrun/api';
|
|
|
2
2
|
export interface WebhookFlagValues {
|
|
3
3
|
'webhook-url'?: string;
|
|
4
4
|
'webhook-header'?: string[];
|
|
5
|
+
'webhook-label'?: string[];
|
|
5
6
|
}
|
|
6
7
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
|
|
8
|
+
* Server-side cap on webhook labels, enforced here too so a doomed build never
|
|
9
|
+
* reaches a billed instance. Per-label shape (64 printable ASCII characters
|
|
10
|
+
* per key and value) is left to the daemon.
|
|
11
|
+
*/
|
|
12
|
+
export declare const MAX_WEBHOOK_LABELS = 32;
|
|
13
|
+
/**
|
|
14
|
+
* Maps the shared --webhook-url / --webhook-header / --webhook-label flags
|
|
15
|
+
* onto the exec request's webhook config, throwing on invalid combinations.
|
|
16
|
+
* Pure and oclif-free so both `xcode build` and `gradle build` share it and
|
|
17
|
+
* it is unit-testable.
|
|
11
18
|
*
|
|
12
19
|
* Duplicate header names are rejected (case-insensitively: header names are
|
|
13
20
|
* case-insensitive on the wire, and the daemon canonicalizes them) instead
|
|
14
21
|
* of last-one-wins, so a misconfigured CI auth header fails at the command
|
|
15
|
-
* line rather than silently at callback time.
|
|
22
|
+
* line rather than silently at callback time. Label keys are echoed verbatim
|
|
23
|
+
* as JSON object keys, so their duplicate check is exact.
|
|
16
24
|
*/
|
|
17
25
|
export declare function webhookConfigFromFlags(flags: WebhookFlagValues): WebhookConfig | undefined;
|
|
18
26
|
//# sourceMappingURL=webhook-options.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-options.d.ts","sourceRoot":"","sources":["../../src/lib/webhook-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,iBAAiB;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"webhook-options.d.ts","sourceRoot":"","sources":["../../src/lib/webhook-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,iBAAiB;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,iBAAiB,GAAG,aAAa,GAAG,SAAS,CAoD1F"}
|
|
@@ -1,23 +1,35 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MAX_WEBHOOK_LABELS = void 0;
|
|
3
4
|
exports.webhookConfigFromFlags = webhookConfigFromFlags;
|
|
4
5
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
|
|
6
|
+
* Server-side cap on webhook labels, enforced here too so a doomed build never
|
|
7
|
+
* reaches a billed instance. Per-label shape (64 printable ASCII characters
|
|
8
|
+
* per key and value) is left to the daemon.
|
|
9
|
+
*/
|
|
10
|
+
exports.MAX_WEBHOOK_LABELS = 32;
|
|
11
|
+
/**
|
|
12
|
+
* Maps the shared --webhook-url / --webhook-header / --webhook-label flags
|
|
13
|
+
* onto the exec request's webhook config, throwing on invalid combinations.
|
|
14
|
+
* Pure and oclif-free so both `xcode build` and `gradle build` share it and
|
|
15
|
+
* it is unit-testable.
|
|
9
16
|
*
|
|
10
17
|
* Duplicate header names are rejected (case-insensitively: header names are
|
|
11
18
|
* case-insensitive on the wire, and the daemon canonicalizes them) instead
|
|
12
19
|
* of last-one-wins, so a misconfigured CI auth header fails at the command
|
|
13
|
-
* line rather than silently at callback time.
|
|
20
|
+
* line rather than silently at callback time. Label keys are echoed verbatim
|
|
21
|
+
* as JSON object keys, so their duplicate check is exact.
|
|
14
22
|
*/
|
|
15
23
|
function webhookConfigFromFlags(flags) {
|
|
16
24
|
const headerEntries = flags['webhook-header'] ?? [];
|
|
25
|
+
const labelEntries = flags['webhook-label'] ?? [];
|
|
17
26
|
if (!flags['webhook-url']) {
|
|
18
27
|
if (headerEntries.length > 0) {
|
|
19
28
|
throw new Error('--webhook-header requires --webhook-url.');
|
|
20
29
|
}
|
|
30
|
+
if (labelEntries.length > 0) {
|
|
31
|
+
throw new Error('--webhook-label requires --webhook-url.');
|
|
32
|
+
}
|
|
21
33
|
return undefined;
|
|
22
34
|
}
|
|
23
35
|
const headers = {};
|
|
@@ -38,9 +50,27 @@ function webhookConfigFromFlags(flags) {
|
|
|
38
50
|
seen.add(key);
|
|
39
51
|
headers[name] = entry.slice(separator + 1);
|
|
40
52
|
}
|
|
53
|
+
const labelPairs = [];
|
|
54
|
+
const seenLabels = new Set();
|
|
55
|
+
for (const [index, entry] of labelEntries.entries()) {
|
|
56
|
+
const separator = entry.indexOf('=');
|
|
57
|
+
if (separator <= 0) {
|
|
58
|
+
throw new Error(`Invalid --webhook-label entry ${index + 1}: expected KEY=VALUE.`);
|
|
59
|
+
}
|
|
60
|
+
const key = entry.slice(0, separator);
|
|
61
|
+
if (seenLabels.has(key)) {
|
|
62
|
+
throw new Error(`Duplicate --webhook-label key ${JSON.stringify(key)}.`);
|
|
63
|
+
}
|
|
64
|
+
seenLabels.add(key);
|
|
65
|
+
labelPairs.push([key, entry.slice(separator + 1)]);
|
|
66
|
+
}
|
|
67
|
+
if (labelPairs.length > exports.MAX_WEBHOOK_LABELS) {
|
|
68
|
+
throw new Error(`--webhook-label accepts at most ${exports.MAX_WEBHOOK_LABELS} labels.`);
|
|
69
|
+
}
|
|
41
70
|
return {
|
|
42
71
|
url: flags['webhook-url'],
|
|
43
72
|
...(Object.keys(headers).length > 0 && { headers }),
|
|
73
|
+
...(labelPairs.length > 0 && { labels: Object.fromEntries(labelPairs) }),
|
|
44
74
|
};
|
|
45
75
|
}
|
|
46
76
|
//# sourceMappingURL=webhook-options.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-options.js","sourceRoot":"","sources":["../../src/lib/webhook-options.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"webhook-options.js","sourceRoot":"","sources":["../../src/lib/webhook-options.ts"],"names":[],"mappings":";;;AA2BA,wDAoDC;AAvED;;;;GAIG;AACU,QAAA,kBAAkB,GAAG,EAAE,CAAC;AAErC;;;;;;;;;;;GAWG;AACH,SAAgB,sBAAsB,CAAC,KAAwB;IAC7D,MAAM,aAAa,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;IACpD,MAAM,YAAY,GAAG,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;IAClD,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;QAC1B,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC;QACrD,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACnB,8DAA8D;YAC9D,iEAAiE;YACjE,sCAAsC;YACtC,MAAM,IAAI,KAAK,CAAC,kCAAkC,KAAK,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACvF,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,mCAAmC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,UAAU,GAA4B,EAAE,CAAC;IAC/C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;QACpD,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrF,CAAC;QACD,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACtC,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3E,CAAC;QACD,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpB,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,GAAG,0BAAkB,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,mCAAmC,0BAAkB,UAAU,CAAC,CAAC;IACnF,CAAC;IACD,OAAO;QACL,GAAG,EAAE,KAAK,CAAC,aAAa,CAAC;QACzB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;QACnD,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;KACzE,CAAC;AACJ,CAAC"}
|
|
@@ -55,5 +55,63 @@ describe('webhookConfigFromFlags', () => {
|
|
|
55
55
|
'webhook-header': ['Authorization=Bearer one', 'authorization=Bearer two'],
|
|
56
56
|
})).toThrow('Duplicate --webhook-header name "authorization".');
|
|
57
57
|
});
|
|
58
|
+
describe('labels', () => {
|
|
59
|
+
test('maps labels, preserving = in values and allowing empty values', () => {
|
|
60
|
+
expect((0, webhook_options_1.webhookConfigFromFlags)({
|
|
61
|
+
'webhook-url': 'https://ci.example.com/h',
|
|
62
|
+
'webhook-label': ['pipeline=release', 'query=a=b', 'flag='],
|
|
63
|
+
})).toEqual({
|
|
64
|
+
url: 'https://ci.example.com/h',
|
|
65
|
+
labels: { pipeline: 'release', query: 'a=b', flag: '' },
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
test('omits labels key when none are given', () => {
|
|
69
|
+
expect((0, webhook_options_1.webhookConfigFromFlags)({ 'webhook-url': 'https://ci.example.com/h', 'webhook-label': [] })).toEqual({ url: 'https://ci.example.com/h' });
|
|
70
|
+
});
|
|
71
|
+
test('rejects labels without a url', () => {
|
|
72
|
+
expect(() => (0, webhook_options_1.webhookConfigFromFlags)({ 'webhook-label': ['a=b'] })).toThrow('--webhook-label requires --webhook-url.');
|
|
73
|
+
});
|
|
74
|
+
test('rejects entries without KEY=VALUE shape', () => {
|
|
75
|
+
for (const entry of ['NoSeparator', '=value-only']) {
|
|
76
|
+
expect(() => (0, webhook_options_1.webhookConfigFromFlags)({ 'webhook-url': 'https://ci.example.com/h', 'webhook-label': [entry] })).toThrow('Invalid --webhook-label entry 1: expected KEY=VALUE.');
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
test('rejects duplicate keys exactly, keeping distinct casings', () => {
|
|
80
|
+
expect(() => (0, webhook_options_1.webhookConfigFromFlags)({
|
|
81
|
+
'webhook-url': 'https://ci.example.com/h',
|
|
82
|
+
'webhook-label': ['env=staging', 'env=production'],
|
|
83
|
+
})).toThrow('Duplicate --webhook-label key "env".');
|
|
84
|
+
// Labels are JSON object keys, not header names, so casing is significant.
|
|
85
|
+
expect((0, webhook_options_1.webhookConfigFromFlags)({
|
|
86
|
+
'webhook-url': 'https://ci.example.com/h',
|
|
87
|
+
'webhook-label': ['Env=a', 'env=b'],
|
|
88
|
+
})).toEqual({ url: 'https://ci.example.com/h', labels: { Env: 'a', env: 'b' } });
|
|
89
|
+
});
|
|
90
|
+
test('keeps object-prototype names as ordinary labels', () => {
|
|
91
|
+
expect((0, webhook_options_1.webhookConfigFromFlags)({
|
|
92
|
+
'webhook-url': 'https://ci.example.com/h',
|
|
93
|
+
'webhook-label': ['constructor=x', '__proto__=y'],
|
|
94
|
+
})?.labels).toEqual(Object.fromEntries([
|
|
95
|
+
['constructor', 'x'],
|
|
96
|
+
['__proto__', 'y'],
|
|
97
|
+
]));
|
|
98
|
+
});
|
|
99
|
+
test('leaves per-label length and character rules to the daemon', () => {
|
|
100
|
+
const long = 'k'.repeat(65);
|
|
101
|
+
expect((0, webhook_options_1.webhookConfigFromFlags)({
|
|
102
|
+
'webhook-url': 'https://ci.example.com/h',
|
|
103
|
+
'webhook-label': [`${long}=${long}`, 'pipelíne=relëase'],
|
|
104
|
+
})?.labels).toEqual({ [long]: long, pipelíne: 'relëase' });
|
|
105
|
+
});
|
|
106
|
+
test(`accepts ${webhook_options_1.MAX_WEBHOOK_LABELS} labels and rejects one more`, () => {
|
|
107
|
+
const atLimit = Array.from({ length: webhook_options_1.MAX_WEBHOOK_LABELS }, (_, i) => `k${i}=v`);
|
|
108
|
+
expect(Object.keys((0, webhook_options_1.webhookConfigFromFlags)({ 'webhook-url': 'https://ci.example.com/h', 'webhook-label': atLimit })
|
|
109
|
+
?.labels ?? {})).toHaveLength(webhook_options_1.MAX_WEBHOOK_LABELS);
|
|
110
|
+
expect(() => (0, webhook_options_1.webhookConfigFromFlags)({
|
|
111
|
+
'webhook-url': 'https://ci.example.com/h',
|
|
112
|
+
'webhook-label': [...atLimit, 'extra=v'],
|
|
113
|
+
})).toThrow(`--webhook-label accepts at most ${webhook_options_1.MAX_WEBHOOK_LABELS} labels.`);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
58
116
|
});
|
|
59
117
|
//# sourceMappingURL=webhook-options.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-options.test.js","sourceRoot":"","sources":["../../src/lib/webhook-options.test.ts"],"names":[],"mappings":";;AAAA,
|
|
1
|
+
{"version":3,"file":"webhook-options.test.js","sourceRoot":"","sources":["../../src/lib/webhook-options.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { XcodeInfo } from '@limrun/api';
|
|
2
|
+
/** The one-shot Xcode major override shared by create, build, test and rbe. */
|
|
3
|
+
export declare const xcodeVersionFlags: {
|
|
4
|
+
'xcode-version': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
5
|
+
};
|
|
6
|
+
/** Target selection for the `version` commands: an explicit sandbox, never an auto-created one. */
|
|
7
|
+
export declare const xcodeTargetFlags: {
|
|
8
|
+
create: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
9
|
+
id: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
10
|
+
};
|
|
11
|
+
/** Rejects anything but a bare major such as "27", before any network call. */
|
|
12
|
+
export declare function parseXcodeMajor(value: string, source?: string): string;
|
|
13
|
+
/** How a requested Xcode major was chosen, for the notice printed before a switch. */
|
|
14
|
+
export type RequestedXcodeVersion = {
|
|
15
|
+
major: string;
|
|
16
|
+
source: 'flag' | 'workspace';
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* The Xcode major a command should make its sandbox use: the flag when given, else the
|
|
20
|
+
* workspace preference, else nothing (the sandbox keeps whatever it is bound to).
|
|
21
|
+
*/
|
|
22
|
+
export declare function resolveRequestedXcodeVersion(flag: string | undefined): RequestedXcodeVersion | undefined;
|
|
23
|
+
/** "27.0 (27A5252f)", falling back to the version key on nodes that report only that. */
|
|
24
|
+
export declare function formatXcode(info: XcodeInfo | undefined): string;
|
|
25
|
+
//# sourceMappingURL=xcode-version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xcode-version.d.ts","sourceRoot":"","sources":["../../src/lib/xcode-version.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB;;CAO7B,CAAC;AAEF,mGAAmG;AACnG,eAAO,MAAM,gBAAgB;;;CAK5B,CAAC;AAIF,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,SAAoB,GAAG,MAAM,CAKjF;AAED,sFAAsF;AACtF,MAAM,MAAM,qBAAqB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAAA;CAAE,CAAC;AAEpF;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,qBAAqB,GAAG,SAAS,CAIxG;AAED,yFAAyF;AACzF,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAM/D"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.xcodeTargetFlags = exports.xcodeVersionFlags = void 0;
|
|
4
|
+
exports.parseXcodeMajor = parseXcodeMajor;
|
|
5
|
+
exports.resolveRequestedXcodeVersion = resolveRequestedXcodeVersion;
|
|
6
|
+
exports.formatXcode = formatXcode;
|
|
7
|
+
const core_1 = require("@oclif/core");
|
|
8
|
+
const config_1 = require("./config");
|
|
9
|
+
/** The one-shot Xcode major override shared by create, build, test and rbe. */
|
|
10
|
+
exports.xcodeVersionFlags = {
|
|
11
|
+
'xcode-version': core_1.Flags.string({
|
|
12
|
+
description: 'Xcode major to build with for this invocation, e.g. 27 (see `lim xcode version list`). Overrides the ' +
|
|
13
|
+
"workspace preference set with `lim xcode version set` without changing it. Switching resets the sandbox's DerivedData.",
|
|
14
|
+
helpValue: '<major>',
|
|
15
|
+
}),
|
|
16
|
+
};
|
|
17
|
+
/** Target selection for the `version` commands: an explicit sandbox, never an auto-created one. */
|
|
18
|
+
exports.xcodeTargetFlags = {
|
|
19
|
+
create: core_1.Flags.boolean({ hidden: true, default: false, allowNo: true }),
|
|
20
|
+
id: core_1.Flags.string({
|
|
21
|
+
description: 'Xcode instance ID to target. Defaults to the most recently created Xcode-capable target.',
|
|
22
|
+
}),
|
|
23
|
+
};
|
|
24
|
+
const majorPattern = /^\d+$/;
|
|
25
|
+
/** Rejects anything but a bare major such as "27", before any network call. */
|
|
26
|
+
function parseXcodeMajor(value, source = '--xcode-version') {
|
|
27
|
+
if (!majorPattern.test(value)) {
|
|
28
|
+
throw new Error(`${source} takes an Xcode major such as 27 (got ${JSON.stringify(value)})`);
|
|
29
|
+
}
|
|
30
|
+
return value;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The Xcode major a command should make its sandbox use: the flag when given, else the
|
|
34
|
+
* workspace preference, else nothing (the sandbox keeps whatever it is bound to).
|
|
35
|
+
*/
|
|
36
|
+
function resolveRequestedXcodeVersion(flag) {
|
|
37
|
+
if (flag)
|
|
38
|
+
return { major: parseXcodeMajor(flag), source: 'flag' };
|
|
39
|
+
const preferred = (0, config_1.loadXcodeVersionPreference)();
|
|
40
|
+
return preferred ? { major: preferred, source: 'workspace' } : undefined;
|
|
41
|
+
}
|
|
42
|
+
/** "27.0 (27A5252f)", falling back to the version key on nodes that report only that. */
|
|
43
|
+
function formatXcode(info) {
|
|
44
|
+
if (!info)
|
|
45
|
+
return 'unknown (daemon predates Xcode selection)';
|
|
46
|
+
if (info.version && info.build) {
|
|
47
|
+
return `${info.version} (${info.build})${info.nodeDefault ? ' (node default)' : ''}`;
|
|
48
|
+
}
|
|
49
|
+
return info.versionKey || 'unknown';
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=xcode-version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xcode-version.js","sourceRoot":"","sources":["../../src/lib/xcode-version.ts"],"names":[],"mappings":";;;AAyBA,0CAKC;AASD,oEAIC;AAGD,kCAMC;AApDD,sCAAoC;AAEpC,qCAAsD;AAEtD,+EAA+E;AAClE,QAAA,iBAAiB,GAAG;IAC/B,eAAe,EAAE,YAAK,CAAC,MAAM,CAAC;QAC5B,WAAW,EACT,uGAAuG;YACvG,wHAAwH;QAC1H,SAAS,EAAE,SAAS;KACrB,CAAC;CACH,CAAC;AAEF,mGAAmG;AACtF,QAAA,gBAAgB,GAAG;IAC9B,MAAM,EAAE,YAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACtE,EAAE,EAAE,YAAK,CAAC,MAAM,CAAC;QACf,WAAW,EAAE,0FAA0F;KACxG,CAAC;CACH,CAAC;AAEF,MAAM,YAAY,GAAG,OAAO,CAAC;AAE7B,+EAA+E;AAC/E,SAAgB,eAAe,CAAC,KAAa,EAAE,MAAM,GAAG,iBAAiB;IACvE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,yCAAyC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAKD;;;GAGG;AACH,SAAgB,4BAA4B,CAAC,IAAwB;IACnE,IAAI,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAClE,MAAM,SAAS,GAAG,IAAA,mCAA0B,GAAE,CAAC;IAC/C,OAAO,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3E,CAAC;AAED,yFAAyF;AACzF,SAAgB,WAAW,CAAC,IAA2B;IACrD,IAAI,CAAC,IAAI;QAAE,OAAO,2CAA2C,CAAC;IAC9D,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC/B,OAAO,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACvF,CAAC;IACD,OAAO,IAAI,CAAC,UAAU,IAAI,SAAS,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xcode-version.test.d.ts","sourceRoot":"","sources":["../../src/lib/xcode-version.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const xcode_version_1 = require("./xcode-version");
|
|
4
|
+
const config_1 = require("./config");
|
|
5
|
+
jest.mock('./config', () => ({ loadXcodeVersionPreference: jest.fn() }));
|
|
6
|
+
const config = { loadXcodeVersionPreference: config_1.loadXcodeVersionPreference };
|
|
7
|
+
describe('parseXcodeMajor', () => {
|
|
8
|
+
test('accepts a bare major', () => {
|
|
9
|
+
expect((0, xcode_version_1.parseXcodeMajor)('27')).toBe('27');
|
|
10
|
+
});
|
|
11
|
+
test.each(['27.0', 'Xcode 27', '', '27a'])('rejects %j', (value) => {
|
|
12
|
+
expect(() => (0, xcode_version_1.parseXcodeMajor)(value)).toThrow('--xcode-version takes an Xcode major such as 27');
|
|
13
|
+
});
|
|
14
|
+
test('names the caller in the error', () => {
|
|
15
|
+
expect(() => (0, xcode_version_1.parseXcodeMajor)('27.0', 'version set')).toThrow('version set takes an Xcode major such as 27');
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
describe('resolveRequestedXcodeVersion', () => {
|
|
19
|
+
afterEach(() => config.loadXcodeVersionPreference.mockReset());
|
|
20
|
+
test('the flag wins over the workspace preference and is not remembered', () => {
|
|
21
|
+
config.loadXcodeVersionPreference.mockReturnValue('27');
|
|
22
|
+
expect((0, xcode_version_1.resolveRequestedXcodeVersion)('26')).toEqual({ major: '26', source: 'flag' });
|
|
23
|
+
});
|
|
24
|
+
test('falls back to the workspace preference', () => {
|
|
25
|
+
config.loadXcodeVersionPreference.mockReturnValue('27');
|
|
26
|
+
expect((0, xcode_version_1.resolveRequestedXcodeVersion)(undefined)).toEqual({ major: '27', source: 'workspace' });
|
|
27
|
+
});
|
|
28
|
+
test('asks for nothing when neither is set, so the sandbox keeps its binding', () => {
|
|
29
|
+
config.loadXcodeVersionPreference.mockReturnValue(null);
|
|
30
|
+
expect((0, xcode_version_1.resolveRequestedXcodeVersion)(undefined)).toBeUndefined();
|
|
31
|
+
});
|
|
32
|
+
test('rejects a malformed flag before any network call', () => {
|
|
33
|
+
expect(() => (0, xcode_version_1.resolveRequestedXcodeVersion)('27.0')).toThrow('--xcode-version takes an Xcode major');
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe('formatXcode', () => {
|
|
37
|
+
test('prints version, build and the default marker', () => {
|
|
38
|
+
expect((0, xcode_version_1.formatXcode)({
|
|
39
|
+
major: '26',
|
|
40
|
+
version: '26.4',
|
|
41
|
+
build: '17E192',
|
|
42
|
+
versionKey: '26.4.0.17E192',
|
|
43
|
+
developerDir: '/x',
|
|
44
|
+
nodeDefault: true,
|
|
45
|
+
})).toBe('26.4 (17E192) (node default)');
|
|
46
|
+
expect((0, xcode_version_1.formatXcode)({
|
|
47
|
+
major: '27',
|
|
48
|
+
version: '27.0',
|
|
49
|
+
build: '27A5252f',
|
|
50
|
+
versionKey: '27.0.0.27A5252f',
|
|
51
|
+
developerDir: '/y',
|
|
52
|
+
nodeDefault: false,
|
|
53
|
+
})).toBe('27.0 (27A5252f)');
|
|
54
|
+
});
|
|
55
|
+
test('falls back to the version key, then to unknown', () => {
|
|
56
|
+
expect((0, xcode_version_1.formatXcode)({
|
|
57
|
+
major: '',
|
|
58
|
+
version: '',
|
|
59
|
+
build: '',
|
|
60
|
+
versionKey: '26.4.0.17E192',
|
|
61
|
+
developerDir: '/x',
|
|
62
|
+
nodeDefault: true,
|
|
63
|
+
})).toBe('26.4.0.17E192');
|
|
64
|
+
expect((0, xcode_version_1.formatXcode)(undefined)).toBe('unknown (daemon predates Xcode selection)');
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe('a malformed request fails before any sandbox work', () => {
|
|
68
|
+
// build/test/rbe/create call resolveRequestedXcodeVersion right after parsing flags, so a
|
|
69
|
+
// typo like 27.0 is rejected before a sandbox could be created and billed.
|
|
70
|
+
test('resolveRequestedXcodeVersion throws synchronously for a bad flag', () => {
|
|
71
|
+
expect(() => (0, xcode_version_1.resolveRequestedXcodeVersion)('twenty-seven')).toThrow();
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=xcode-version.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xcode-version.test.js","sourceRoot":"","sources":["../../src/lib/xcode-version.test.ts"],"names":[],"mappings":";;AAAA,mDAA6F;AAC7F,qCAAsD;AAEtD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,0BAA0B,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AACzE,MAAM,MAAM,GAAG,EAAE,0BAA0B,EAAE,mCAAuC,EAAE,CAAC;AAEvF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,IAAA,+BAAe,EAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE;QACjE,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,+BAAe,EAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,iDAAiD,CAAC,CAAC;IAClG,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,+BAAe,EAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAC1D,6CAA6C,CAC9C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,0BAA0B,CAAC,SAAS,EAAE,CAAC,CAAC;IAE/D,IAAI,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC7E,MAAM,CAAC,0BAA0B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,CAAC,IAAA,4CAA4B,EAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,0BAA0B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,CAAC,IAAA,4CAA4B,EAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAClF,MAAM,CAAC,0BAA0B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,CAAC,IAAA,4CAA4B,EAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAClE,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,4CAA4B,EAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;IACrG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACxD,MAAM,CACJ,IAAA,2BAAW,EAAC;YACV,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,MAAM;YACf,KAAK,EAAE,QAAQ;YACf,UAAU,EAAE,eAAe;YAC3B,YAAY,EAAE,IAAI;YAClB,WAAW,EAAE,IAAI;SAClB,CAAC,CACH,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QACvC,MAAM,CACJ,IAAA,2BAAW,EAAC;YACV,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,MAAM;YACf,KAAK,EAAE,UAAU;YACjB,UAAU,EAAE,iBAAiB;YAC7B,YAAY,EAAE,IAAI;YAClB,WAAW,EAAE,KAAK;SACnB,CAAC,CACH,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;QAC1D,MAAM,CACJ,IAAA,2BAAW,EAAC;YACV,KAAK,EAAE,EAAE;YACT,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,EAAE;YACT,UAAU,EAAE,eAAe;YAC3B,YAAY,EAAE,IAAI;YAClB,WAAW,EAAE,IAAI;SAClB,CAAC,CACH,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACxB,MAAM,CAAC,IAAA,2BAAW,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mDAAmD,EAAE,GAAG,EAAE;IACjE,0FAA0F;IAC1F,2EAA2E;IAC3E,IAAI,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC5E,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,4CAA4B,EAAC,cAAc,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lim",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.32.0",
|
|
4
4
|
"description": "Use remote XCode, Gradle, iOS Simulator, Android Emulator and more to build and test apps from Linux, Windows or macOS.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"lim": "./bin/run.js"
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"test": "jest"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@limrun/api": "^0.49.
|
|
28
|
+
"@limrun/api": "^0.49.1",
|
|
29
29
|
"@oclif/core": "^4",
|
|
30
30
|
"cli-progress": "^3.12.0",
|
|
31
31
|
"cli-table3": "^0.6.5",
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
"description": "Install Limrun skills for AI coding agents (Claude Code, Cursor, Codex). Run `lim skills install` to set up."
|
|
76
76
|
},
|
|
77
77
|
"xcode": {
|
|
78
|
-
"description": "Execute any task on remote XCode sandboxes: create, list, get, delete, sync, build, run, attach-simulator"
|
|
78
|
+
"description": "Execute any task on remote XCode sandboxes: create, list, get, delete, sync, build, test, run, rbe, attach-simulator, version"
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
},
|