xcodebuild-axi 0.1.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/CHANGELOG.md +35 -0
- package/LICENSE +21 -0
- package/README.md +304 -0
- package/dist/bin/xcodebuild-axi.d.ts +2 -0
- package/dist/bin/xcodebuild-axi.js +8 -0
- package/dist/bin/xcodebuild-axi.js.map +1 -0
- package/dist/src/action.d.ts +68 -0
- package/dist/src/action.js +373 -0
- package/dist/src/action.js.map +1 -0
- package/dist/src/archive.d.ts +33 -0
- package/dist/src/archive.js +77 -0
- package/dist/src/archive.js.map +1 -0
- package/dist/src/args.d.ts +23 -0
- package/dist/src/args.js +123 -0
- package/dist/src/args.js.map +1 -0
- package/dist/src/auth.d.ts +11 -0
- package/dist/src/auth.js +51 -0
- package/dist/src/auth.js.map +1 -0
- package/dist/src/cli.d.ts +20 -0
- package/dist/src/cli.js +132 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/commands/analyze.d.ts +2 -0
- package/dist/src/commands/analyze.js +32 -0
- package/dist/src/commands/analyze.js.map +1 -0
- package/dist/src/commands/archive.d.ts +2 -0
- package/dist/src/commands/archive.js +63 -0
- package/dist/src/commands/archive.js.map +1 -0
- package/dist/src/commands/build.d.ts +2 -0
- package/dist/src/commands/build.js +60 -0
- package/dist/src/commands/build.js.map +1 -0
- package/dist/src/commands/clean.d.ts +2 -0
- package/dist/src/commands/clean.js +39 -0
- package/dist/src/commands/clean.js.map +1 -0
- package/dist/src/commands/coverage.d.ts +2 -0
- package/dist/src/commands/coverage.js +111 -0
- package/dist/src/commands/coverage.js.map +1 -0
- package/dist/src/commands/destinations.d.ts +2 -0
- package/dist/src/commands/destinations.js +56 -0
- package/dist/src/commands/destinations.js.map +1 -0
- package/dist/src/commands/export.d.ts +2 -0
- package/dist/src/commands/export.js +170 -0
- package/dist/src/commands/export.js.map +1 -0
- package/dist/src/commands/find.d.ts +2 -0
- package/dist/src/commands/find.js +70 -0
- package/dist/src/commands/find.js.map +1 -0
- package/dist/src/commands/home.d.ts +9 -0
- package/dist/src/commands/home.js +97 -0
- package/dist/src/commands/home.js.map +1 -0
- package/dist/src/commands/info.d.ts +2 -0
- package/dist/src/commands/info.js +95 -0
- package/dist/src/commands/info.js.map +1 -0
- package/dist/src/commands/localize.d.ts +2 -0
- package/dist/src/commands/localize.js +121 -0
- package/dist/src/commands/localize.js.map +1 -0
- package/dist/src/commands/migrate.d.ts +8 -0
- package/dist/src/commands/migrate.js +177 -0
- package/dist/src/commands/migrate.js.map +1 -0
- package/dist/src/commands/packages.d.ts +2 -0
- package/dist/src/commands/packages.js +108 -0
- package/dist/src/commands/packages.js.map +1 -0
- package/dist/src/commands/platforms.d.ts +2 -0
- package/dist/src/commands/platforms.js +379 -0
- package/dist/src/commands/platforms.js.map +1 -0
- package/dist/src/commands/result.d.ts +2 -0
- package/dist/src/commands/result.js +100 -0
- package/dist/src/commands/result.js.map +1 -0
- package/dist/src/commands/schemes.d.ts +2 -0
- package/dist/src/commands/schemes.js +39 -0
- package/dist/src/commands/schemes.js.map +1 -0
- package/dist/src/commands/settings.d.ts +2 -0
- package/dist/src/commands/settings.js +191 -0
- package/dist/src/commands/settings.js.map +1 -0
- package/dist/src/commands/setup.d.ts +2 -0
- package/dist/src/commands/setup.js +84 -0
- package/dist/src/commands/setup.js.map +1 -0
- package/dist/src/commands/sim.d.ts +2 -0
- package/dist/src/commands/sim.js +187 -0
- package/dist/src/commands/sim.js.map +1 -0
- package/dist/src/commands/test.d.ts +2 -0
- package/dist/src/commands/test.js +317 -0
- package/dist/src/commands/test.js.map +1 -0
- package/dist/src/commands/testplans.d.ts +8 -0
- package/dist/src/commands/testplans.js +75 -0
- package/dist/src/commands/testplans.js.map +1 -0
- package/dist/src/commands/tests.d.ts +13 -0
- package/dist/src/commands/tests.js +154 -0
- package/dist/src/commands/tests.js.map +1 -0
- package/dist/src/commands/xcframework.d.ts +2 -0
- package/dist/src/commands/xcframework.js +77 -0
- package/dist/src/commands/xcframework.js.map +1 -0
- package/dist/src/context.d.ts +23 -0
- package/dist/src/context.js +72 -0
- package/dist/src/context.js.map +1 -0
- package/dist/src/destination.d.ts +50 -0
- package/dist/src/destination.js +174 -0
- package/dist/src/destination.js.map +1 -0
- package/dist/src/errors.d.ts +6 -0
- package/dist/src/errors.js +55 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/packages.d.ts +31 -0
- package/dist/src/packages.js +117 -0
- package/dist/src/packages.js.map +1 -0
- package/dist/src/report.d.ts +20 -0
- package/dist/src/report.js +39 -0
- package/dist/src/report.js.map +1 -0
- package/dist/src/scheme.d.ts +22 -0
- package/dist/src/scheme.js +66 -0
- package/dist/src/scheme.js.map +1 -0
- package/dist/src/simctl.d.ts +33 -0
- package/dist/src/simctl.js +85 -0
- package/dist/src/simctl.js.map +1 -0
- package/dist/src/surface.d.ts +55 -0
- package/dist/src/surface.js +350 -0
- package/dist/src/surface.js.map +1 -0
- package/dist/src/toon.d.ts +34 -0
- package/dist/src/toon.js +79 -0
- package/dist/src/toon.js.map +1 -0
- package/dist/src/version.d.ts +1 -0
- package/dist/src/version.js +24 -0
- package/dist/src/version.js.map +1 -0
- package/dist/src/xccov.d.ts +25 -0
- package/dist/src/xccov.js +78 -0
- package/dist/src/xccov.js.map +1 -0
- package/dist/src/xcodebuild.d.ts +65 -0
- package/dist/src/xcodebuild.js +163 -0
- package/dist/src/xcodebuild.js.map +1 -0
- package/dist/src/xcresult.d.ts +96 -0
- package/dist/src/xcresult.js +156 -0
- package/dist/src/xcresult.js.map +1 -0
- package/package.json +75 -0
- package/skills/xcodebuild-axi/SKILL.md +64 -0
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
import { AxiError, mapXcodebuildError } from "../errors.js";
|
|
2
|
+
import { BUILD_FLAG_HELP, resolveBuildContext, runAction, SHARED_BUILD_FLAGS, SHARED_BUILD_VALUE_FLAGS, } from "../action.js";
|
|
3
|
+
import { readBuildResults, readTestSummary, toDiagnostics, describeDevice, } from "../xcresult.js";
|
|
4
|
+
import { readCoverage, percent } from "../xccov.js";
|
|
5
|
+
import { diagnosticsBlock, transcriptTail } from "../report.js";
|
|
6
|
+
import { duration, renderFields, renderHelp, renderList, renderOutput, tildePath, truncate, } from "../toon.js";
|
|
7
|
+
import { getFlag, getIntFlag, getListFlag, hasFlag, rejectUnknownFlags, } from "../args.js";
|
|
8
|
+
export const TEST_HELP = `usage: xcodebuild-axi test [flags]
|
|
9
|
+
Runs a scheme's tests and reports the counts plus only the failures.
|
|
10
|
+
flags[66]:
|
|
11
|
+
${BUILD_FLAG_HELP}
|
|
12
|
+
--test-plan <name> test plan to run
|
|
13
|
+
--only <id> run only this test/class/target; repeatable or comma-separated
|
|
14
|
+
--skip <id> skip this test/class/target; repeatable or comma-separated
|
|
15
|
+
--coverage collect code coverage and report the overall percentage
|
|
16
|
+
--without-building test already-built products (test-without-building)
|
|
17
|
+
--xctestrun <path> test from an .xctestrun file instead of a scheme
|
|
18
|
+
--parallel <n> exact number of parallel test runners
|
|
19
|
+
--no-parallel disable parallel testing
|
|
20
|
+
--iterations <n> run the tests this many times
|
|
21
|
+
--retry retry failures, up to --iterations (default 3)
|
|
22
|
+
--until-failure repeat until something fails, up to --iterations (default 100)
|
|
23
|
+
--language <iso639> run in this language
|
|
24
|
+
--region <iso3166> run in this region
|
|
25
|
+
--diagnostics collect verbose diagnostics on failure
|
|
26
|
+
--perf-diagnostics collect performance traces and memgraphs for performance tests
|
|
27
|
+
--relaunch relaunch the process between repetitions
|
|
28
|
+
--only-configuration <name> run only this test configuration; repeatable
|
|
29
|
+
--skip-configuration <name> skip this test configuration; repeatable
|
|
30
|
+
--max-workers <n> cap on parallel test runners
|
|
31
|
+
--max-sim-destinations <n> cap on simulator destinations tested concurrently
|
|
32
|
+
--max-device-destinations <n> cap on device destinations tested concurrently
|
|
33
|
+
--default-test-timeout <secs> default per-test allowance when timeouts are on
|
|
34
|
+
--test-products <path> where to find the built test products
|
|
35
|
+
--test-timeout <secs> per-test execution allowance (default: 300, 0 disables)
|
|
36
|
+
--max-failures <n> failures to list before summarizing the rest (default: 20)
|
|
37
|
+
exit:
|
|
38
|
+
0 all tests passed, 1 a test or the build failed, 2 usage error
|
|
39
|
+
examples:
|
|
40
|
+
xcodebuild-axi test
|
|
41
|
+
xcodebuild-axi test --scheme MyApp --device "iPhone 17 Pro"
|
|
42
|
+
xcodebuild-axi test --scheme MyApp --only MyAppTests/CheckoutTests
|
|
43
|
+
xcodebuild-axi test --scheme MyApp --coverage
|
|
44
|
+
`;
|
|
45
|
+
const FLAGS = [
|
|
46
|
+
...SHARED_BUILD_FLAGS,
|
|
47
|
+
"--test-plan",
|
|
48
|
+
"--only",
|
|
49
|
+
"--skip",
|
|
50
|
+
"--coverage",
|
|
51
|
+
"--without-building",
|
|
52
|
+
"--xctestrun",
|
|
53
|
+
"--parallel",
|
|
54
|
+
"--no-parallel",
|
|
55
|
+
"--iterations",
|
|
56
|
+
"--retry",
|
|
57
|
+
"--until-failure",
|
|
58
|
+
"--language",
|
|
59
|
+
"--region",
|
|
60
|
+
"--diagnostics",
|
|
61
|
+
"--perf-diagnostics",
|
|
62
|
+
"--relaunch",
|
|
63
|
+
"--only-configuration",
|
|
64
|
+
"--skip-configuration",
|
|
65
|
+
"--max-workers",
|
|
66
|
+
"--max-sim-destinations",
|
|
67
|
+
"--max-device-destinations",
|
|
68
|
+
"--default-test-timeout",
|
|
69
|
+
"--test-products",
|
|
70
|
+
"--test-timeout",
|
|
71
|
+
"--max-failures",
|
|
72
|
+
];
|
|
73
|
+
const VALUE_FLAGS = [
|
|
74
|
+
...SHARED_BUILD_VALUE_FLAGS,
|
|
75
|
+
"--test-plan",
|
|
76
|
+
"--only",
|
|
77
|
+
"--skip",
|
|
78
|
+
"--xctestrun",
|
|
79
|
+
"--parallel",
|
|
80
|
+
"--iterations",
|
|
81
|
+
"--language",
|
|
82
|
+
"--region",
|
|
83
|
+
"--only-configuration",
|
|
84
|
+
"--skip-configuration",
|
|
85
|
+
"--max-workers",
|
|
86
|
+
"--max-sim-destinations",
|
|
87
|
+
"--max-device-destinations",
|
|
88
|
+
"--default-test-timeout",
|
|
89
|
+
"--test-products",
|
|
90
|
+
"--test-timeout",
|
|
91
|
+
"--max-failures",
|
|
92
|
+
];
|
|
93
|
+
export async function testCommand(args) {
|
|
94
|
+
rejectUnknownFlags(args, "test", FLAGS, VALUE_FLAGS);
|
|
95
|
+
if (hasFlag(args, "--retry") && hasFlag(args, "--until-failure")) {
|
|
96
|
+
// xcodebuild rejects this combination itself, but only after building.
|
|
97
|
+
throw new AxiError("--retry and --until-failure cannot be used together", "VALIDATION_ERROR", [
|
|
98
|
+
"--retry stops at the first success, --until-failure stops at the first failure",
|
|
99
|
+
]);
|
|
100
|
+
}
|
|
101
|
+
const withoutBuilding = hasFlag(args, "--without-building") ||
|
|
102
|
+
getFlag(args, "--xctestrun") !== undefined;
|
|
103
|
+
const context = await resolveBuildContext({ args, command: "test" });
|
|
104
|
+
const coverage = hasFlag(args, "--coverage");
|
|
105
|
+
const run = await runAction({
|
|
106
|
+
context,
|
|
107
|
+
command: "test",
|
|
108
|
+
actions: [withoutBuilding ? "test-without-building" : "test"],
|
|
109
|
+
extraArgs: testArgs(args, coverage),
|
|
110
|
+
});
|
|
111
|
+
const summary = await readTestSummary(run.resultPath).catch(() => undefined);
|
|
112
|
+
// No test summary on a nonzero exit means the tests never ran — the build
|
|
113
|
+
// under them failed, or xcodebuild refused the invocation. Report that as a
|
|
114
|
+
// build failure rather than "0 tests", which reads like a passing run.
|
|
115
|
+
if (!summary || summary.totalTestCount === undefined) {
|
|
116
|
+
return renderTestsNeverRan(context, run);
|
|
117
|
+
}
|
|
118
|
+
return renderTestSummary({
|
|
119
|
+
context,
|
|
120
|
+
summary,
|
|
121
|
+
run,
|
|
122
|
+
maxFailures: getIntFlag(args, "--max-failures") ?? 20,
|
|
123
|
+
full: context.full,
|
|
124
|
+
coverage,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
function testArgs(args, coverage) {
|
|
128
|
+
const testPlan = getFlag(args, "--test-plan");
|
|
129
|
+
const xctestrun = getFlag(args, "--xctestrun");
|
|
130
|
+
const timeout = getIntFlag(args, "--test-timeout") ?? 300;
|
|
131
|
+
const iterations = getIntFlag(args, "--iterations");
|
|
132
|
+
const parallel = getIntFlag(args, "--parallel");
|
|
133
|
+
const language = getFlag(args, "--language");
|
|
134
|
+
const region = getFlag(args, "--region");
|
|
135
|
+
const maxWorkers = getIntFlag(args, "--max-workers");
|
|
136
|
+
const maxSimDestinations = getIntFlag(args, "--max-sim-destinations");
|
|
137
|
+
const maxDeviceDestinations = getIntFlag(args, "--max-device-destinations");
|
|
138
|
+
const defaultTimeout = getIntFlag(args, "--default-test-timeout");
|
|
139
|
+
const testProducts = getFlag(args, "--test-products");
|
|
140
|
+
return [
|
|
141
|
+
...(xctestrun ? ["-xctestrun", xctestrun] : []),
|
|
142
|
+
...(testPlan ? ["-testPlan", testPlan] : []),
|
|
143
|
+
...getListFlag(args, "--only").flatMap((id) => ["-only-testing", id]),
|
|
144
|
+
...getListFlag(args, "--skip").flatMap((id) => ["-skip-testing", id]),
|
|
145
|
+
...(coverage ? ["-enableCodeCoverage", "YES"] : []),
|
|
146
|
+
...(parallel !== undefined
|
|
147
|
+
? [
|
|
148
|
+
"-parallel-testing-enabled",
|
|
149
|
+
"YES",
|
|
150
|
+
"-parallel-testing-worker-count",
|
|
151
|
+
String(parallel),
|
|
152
|
+
]
|
|
153
|
+
: []),
|
|
154
|
+
...(hasFlag(args, "--no-parallel")
|
|
155
|
+
? ["-parallel-testing-enabled", "NO"]
|
|
156
|
+
: []),
|
|
157
|
+
...(iterations !== undefined
|
|
158
|
+
? ["-test-iterations", String(iterations)]
|
|
159
|
+
: []),
|
|
160
|
+
...(hasFlag(args, "--retry") ? ["-retry-tests-on-failure"] : []),
|
|
161
|
+
...(hasFlag(args, "--until-failure") ? ["-run-tests-until-failure"] : []),
|
|
162
|
+
...(language ? ["-testLanguage", language] : []),
|
|
163
|
+
...(region ? ["-testRegion", region] : []),
|
|
164
|
+
...(hasFlag(args, "--diagnostics")
|
|
165
|
+
? ["-collect-test-diagnostics", "on-failure"]
|
|
166
|
+
: []),
|
|
167
|
+
...(hasFlag(args, "--perf-diagnostics")
|
|
168
|
+
? ["-enablePerformanceTestsDiagnostics", "YES"]
|
|
169
|
+
: []),
|
|
170
|
+
...(hasFlag(args, "--relaunch")
|
|
171
|
+
? ["-test-repetition-relaunch-enabled", "YES"]
|
|
172
|
+
: []),
|
|
173
|
+
...getListFlag(args, "--only-configuration").flatMap((name) => [
|
|
174
|
+
"-only-test-configuration",
|
|
175
|
+
name,
|
|
176
|
+
]),
|
|
177
|
+
...getListFlag(args, "--skip-configuration").flatMap((name) => [
|
|
178
|
+
"-skip-test-configuration",
|
|
179
|
+
name,
|
|
180
|
+
]),
|
|
181
|
+
...(maxWorkers !== undefined
|
|
182
|
+
? ["-maximum-parallel-testing-workers", String(maxWorkers)]
|
|
183
|
+
: []),
|
|
184
|
+
...(maxSimDestinations !== undefined
|
|
185
|
+
? [
|
|
186
|
+
"-maximum-concurrent-test-simulator-destinations",
|
|
187
|
+
String(maxSimDestinations),
|
|
188
|
+
]
|
|
189
|
+
: []),
|
|
190
|
+
...(maxDeviceDestinations !== undefined
|
|
191
|
+
? [
|
|
192
|
+
"-maximum-concurrent-test-device-destinations",
|
|
193
|
+
String(maxDeviceDestinations),
|
|
194
|
+
]
|
|
195
|
+
: []),
|
|
196
|
+
...(defaultTimeout !== undefined
|
|
197
|
+
? ["-default-test-execution-time-allowance", String(defaultTimeout)]
|
|
198
|
+
: []),
|
|
199
|
+
...(testProducts ? ["-testProductsPath", testProducts] : []),
|
|
200
|
+
// A wedged test otherwise runs until the caller's own timeout kills it,
|
|
201
|
+
// with nothing in the output saying which one hung.
|
|
202
|
+
...(timeout > 0
|
|
203
|
+
? [
|
|
204
|
+
"-test-timeouts-enabled",
|
|
205
|
+
"YES",
|
|
206
|
+
"-maximum-test-execution-time-allowance",
|
|
207
|
+
String(timeout),
|
|
208
|
+
]
|
|
209
|
+
: []),
|
|
210
|
+
];
|
|
211
|
+
}
|
|
212
|
+
async function renderTestsNeverRan(context, run) {
|
|
213
|
+
const results = await readBuildResults(run.resultPath).catch(() => undefined);
|
|
214
|
+
const errors = toDiagnostics(results?.errors);
|
|
215
|
+
if (errors.length === 0) {
|
|
216
|
+
const mapped = mapXcodebuildError(run.tail);
|
|
217
|
+
if (mapped) {
|
|
218
|
+
throw new AxiError(mapped.message, mapped.code, [
|
|
219
|
+
...mapped.suggestions,
|
|
220
|
+
`full transcript: ${tildePath(run.logPath)}`,
|
|
221
|
+
]);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
const blocks = [
|
|
225
|
+
renderFields({
|
|
226
|
+
test: "failed",
|
|
227
|
+
reason: "the build failed, so no test ran",
|
|
228
|
+
scheme: context.scheme,
|
|
229
|
+
...(context.destination ? { destination: context.destination } : {}),
|
|
230
|
+
duration: duration(run.seconds),
|
|
231
|
+
}),
|
|
232
|
+
];
|
|
233
|
+
const errorBlock = diagnosticsBlock("errors", errors, context.maxErrors);
|
|
234
|
+
if (errorBlock.block) {
|
|
235
|
+
blocks.push(errorBlock.block);
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
const tail = transcriptTail(run.tail);
|
|
239
|
+
if (tail)
|
|
240
|
+
blocks.push(tail);
|
|
241
|
+
}
|
|
242
|
+
blocks.push(renderFields({
|
|
243
|
+
log: tildePath(run.logPath),
|
|
244
|
+
result: tildePath(run.resultPath),
|
|
245
|
+
}));
|
|
246
|
+
process.exitCode = 1;
|
|
247
|
+
return renderOutput(blocks);
|
|
248
|
+
}
|
|
249
|
+
async function renderTestSummary(options) {
|
|
250
|
+
const { summary, run, context } = options;
|
|
251
|
+
const failed = summary.failedTests ?? 0;
|
|
252
|
+
const passed = summary.passedTests ?? 0;
|
|
253
|
+
const skipped = summary.skippedTests ?? 0;
|
|
254
|
+
const succeeded = run.exitCode === 0 && failed === 0;
|
|
255
|
+
// Report the destination the run actually landed on, not the one requested:
|
|
256
|
+
// a name-based specifier can resolve to a different runtime than expected,
|
|
257
|
+
// and a pass on the wrong OS is a pass the agent should not trust.
|
|
258
|
+
const device = summary.devicesAndConfigurations?.[0]?.device;
|
|
259
|
+
const landed = device
|
|
260
|
+
? describeDevice(device)
|
|
261
|
+
: (context.destination ?? "unknown");
|
|
262
|
+
const coverageReport = options.coverage
|
|
263
|
+
? await readCoverage(run.resultPath).catch(() => undefined)
|
|
264
|
+
: undefined;
|
|
265
|
+
const blocks = [
|
|
266
|
+
renderFields({
|
|
267
|
+
test: succeeded ? "passed" : "failed",
|
|
268
|
+
scheme: context.scheme,
|
|
269
|
+
destination: landed,
|
|
270
|
+
// Slash-separated, not comma-separated: TOON quotes any scalar
|
|
271
|
+
// containing a comma, and the quotes cost more than the commas saved.
|
|
272
|
+
tests: `${passed} passed / ${failed} failed / ${skipped} skipped`,
|
|
273
|
+
duration: duration(run.seconds),
|
|
274
|
+
...(coverageReport
|
|
275
|
+
? { coverage: percent(coverageReport.lineCoverage) }
|
|
276
|
+
: {}),
|
|
277
|
+
}),
|
|
278
|
+
];
|
|
279
|
+
const failures = summary.testFailures ?? [];
|
|
280
|
+
if (failures.length > 0) {
|
|
281
|
+
const shown = failures.slice(0, options.maxFailures).map((failure) => ({
|
|
282
|
+
test: failure.testIdentifierString ?? failure.testName ?? "unknown",
|
|
283
|
+
target: failure.targetName ?? "",
|
|
284
|
+
message: options.full
|
|
285
|
+
? (failure.failureText ?? "").replace(/\s+/g, " ").trim()
|
|
286
|
+
: truncate((failure.failureText ?? "").replace(/\s+/g, " ").trim(), 300)
|
|
287
|
+
.text,
|
|
288
|
+
}));
|
|
289
|
+
blocks.push(renderList(failures.length > shown.length
|
|
290
|
+
? `failures (${shown.length} of ${failures.length})`
|
|
291
|
+
: "failures", shown));
|
|
292
|
+
}
|
|
293
|
+
const runtimeWarnings = summary.runtimeWarnings ?? [];
|
|
294
|
+
if (runtimeWarnings.length > 0) {
|
|
295
|
+
blocks.push(renderFields({ runtime_warnings: runtimeWarnings.length }));
|
|
296
|
+
}
|
|
297
|
+
blocks.push(renderFields({
|
|
298
|
+
log: tildePath(run.logPath),
|
|
299
|
+
result: tildePath(run.resultPath),
|
|
300
|
+
}));
|
|
301
|
+
const hints = [];
|
|
302
|
+
if (failures.length > 0) {
|
|
303
|
+
const first = failures[0]?.testIdentifierString;
|
|
304
|
+
if (first) {
|
|
305
|
+
hints.push(`Run \`xcodebuild-axi test --only ${first}\` to re-run just this failure`);
|
|
306
|
+
}
|
|
307
|
+
hints.push(`Run \`xcodebuild-axi result ${tildePath(run.resultPath)} --failures --full\` for untruncated failure text`);
|
|
308
|
+
}
|
|
309
|
+
if (coverageReport) {
|
|
310
|
+
hints.push(`Run \`xcodebuild-axi coverage ${tildePath(run.resultPath)} --below 50\` for the files that need tests`);
|
|
311
|
+
}
|
|
312
|
+
blocks.push(renderHelp(hints));
|
|
313
|
+
if (!succeeded)
|
|
314
|
+
process.exitCode = 1;
|
|
315
|
+
return renderOutput(blocks);
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../../src/commands/test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const TESTPLANS_HELP = "usage: xcodebuild-axi testplans [flags]\nLists the test plans a scheme is configured with.\nflags[1]:\n --scheme <name> scheme to inspect (required only when the project has more than one)\nexamples:\n xcodebuild-axi testplans\n xcodebuild-axi testplans --scheme MyApp\n";
|
|
2
|
+
export declare function testplansCommand(args: string[]): Promise<string>;
|
|
3
|
+
/**
|
|
4
|
+
* `-showTestPlans` prints a prose heading and then one indented plan per line.
|
|
5
|
+
* The first plan is the scheme's default, which xcodebuild does not mark, so
|
|
6
|
+
* neither do we rather than guess.
|
|
7
|
+
*/
|
|
8
|
+
export declare function parseTestPlans(output: string): string[];
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { requireProject } from "../context.js";
|
|
2
|
+
import { requireScheme } from "../scheme.js";
|
|
3
|
+
import { runMetadata, stripPreamble } from "../xcodebuild.js";
|
|
4
|
+
import { renderFields, renderHelp, renderOutput } from "../toon.js";
|
|
5
|
+
import { getFlag, rejectUnknownFlags } from "../args.js";
|
|
6
|
+
export const TESTPLANS_HELP = `usage: xcodebuild-axi testplans [flags]
|
|
7
|
+
Lists the test plans a scheme is configured with.
|
|
8
|
+
flags[1]:
|
|
9
|
+
--scheme <name> scheme to inspect (required only when the project has more than one)
|
|
10
|
+
examples:
|
|
11
|
+
xcodebuild-axi testplans
|
|
12
|
+
xcodebuild-axi testplans --scheme MyApp
|
|
13
|
+
`;
|
|
14
|
+
export async function testplansCommand(args) {
|
|
15
|
+
rejectUnknownFlags(args, "testplans", ["--scheme"], ["--scheme"]);
|
|
16
|
+
const project = requireProject();
|
|
17
|
+
const scheme = await requireScheme(project, getFlag(args, "--scheme"), "testplans");
|
|
18
|
+
const { stdout, stderr } = await runMetadata([
|
|
19
|
+
...project.flags,
|
|
20
|
+
"-scheme",
|
|
21
|
+
scheme,
|
|
22
|
+
"-showTestPlans",
|
|
23
|
+
]);
|
|
24
|
+
const output = stripPreamble(`${stdout}\n${stderr}`);
|
|
25
|
+
// A scheme without test plans is a normal, common configuration — not a
|
|
26
|
+
// failure. Say so in the scheme's own words so the agent stops looking.
|
|
27
|
+
if (/not configured to use test plans/i.test(output)) {
|
|
28
|
+
return renderOutput([
|
|
29
|
+
renderFields({
|
|
30
|
+
scheme,
|
|
31
|
+
testplans: "none — this scheme does not use test plans",
|
|
32
|
+
}),
|
|
33
|
+
renderHelp([
|
|
34
|
+
`Run \`xcodebuild-axi test --scheme ${scheme}\` to run its tests directly`,
|
|
35
|
+
]),
|
|
36
|
+
]);
|
|
37
|
+
}
|
|
38
|
+
const plans = parseTestPlans(output);
|
|
39
|
+
if (plans.length === 0) {
|
|
40
|
+
return renderOutput([
|
|
41
|
+
renderFields({ scheme, testplans: "0 test plans found" }),
|
|
42
|
+
]);
|
|
43
|
+
}
|
|
44
|
+
return renderOutput([
|
|
45
|
+
renderFields({ scheme, testplans: plans }),
|
|
46
|
+
renderHelp([
|
|
47
|
+
`Run \`xcodebuild-axi test --scheme ${scheme} --test-plan <name>\` to run one`,
|
|
48
|
+
]),
|
|
49
|
+
]);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* `-showTestPlans` prints a prose heading and then one indented plan per line.
|
|
53
|
+
* The first plan is the scheme's default, which xcodebuild does not mark, so
|
|
54
|
+
* neither do we rather than guess.
|
|
55
|
+
*/
|
|
56
|
+
export function parseTestPlans(output) {
|
|
57
|
+
const plans = [];
|
|
58
|
+
let inList = false;
|
|
59
|
+
for (const line of output.split("\n")) {
|
|
60
|
+
if (/Test plans? associated with the ".*" scheme:/i.test(line)) {
|
|
61
|
+
inList = true;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (!inList)
|
|
65
|
+
continue;
|
|
66
|
+
const trimmed = line.trim();
|
|
67
|
+
if (trimmed.length === 0)
|
|
68
|
+
continue;
|
|
69
|
+
if (!/^\s/.test(line))
|
|
70
|
+
break;
|
|
71
|
+
plans.push(trimmed);
|
|
72
|
+
}
|
|
73
|
+
return plans;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=testplans.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testplans.js","sourceRoot":"","sources":["../../../src/commands/testplans.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEzD,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;CAO7B,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAc;IACnD,kBAAkB,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAElE,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,aAAa,CAChC,OAAO,EACP,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,EACzB,WAAW,CACZ,CAAC;IAEF,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC;QAC3C,GAAG,OAAO,CAAC,KAAK;QAChB,SAAS;QACT,MAAM;QACN,gBAAgB;KACjB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,MAAM,KAAK,MAAM,EAAE,CAAC,CAAC;IAErD,wEAAwE;IACxE,wEAAwE;IACxE,IAAI,mCAAmC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,OAAO,YAAY,CAAC;YAClB,YAAY,CAAC;gBACX,MAAM;gBACN,SAAS,EAAE,4CAA4C;aACxD,CAAC;YACF,UAAU,CAAC;gBACT,sCAAsC,MAAM,8BAA8B;aAC3E,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAErC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,YAAY,CAAC;YAClB,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC;SAC1D,CAAC,CAAC;IACL,CAAC;IAED,OAAO,YAAY,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC1C,UAAU,CAAC;YACT,sCAAsC,MAAM,kCAAkC;SAC/E,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,IAAI,+CAA+C,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/D,MAAM,GAAG,IAAI,CAAC;YACd,SAAS;QACX,CAAC;QACD,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACnC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM;QAC7B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const TESTS_HELP = "usage: xcodebuild-axi tests [flags]\nLists the tests a scheme would run, without running them. Grouped by suite,\nbecause a thousand identifiers is not an answer.\nflags[45]:\n --scheme <name> scheme to act on (required only when the project has more than one)\n --target <name> build a target instead of a scheme; repeatable (project only)\n --all-targets build every target in the project (project only)\n --device <name> simulator or device name, e.g. \"iPhone 17 Pro\" (default: newest simulator)\n --destination <spec> raw xcodebuild destination specifier, passed through untouched\n --configuration <name> build configuration (default: the scheme's own)\n --sdk <name> base SDK, e.g. iphonesimulator\n --arch <arch> architecture to build; repeatable or comma-separated\n --toolchain <name> toolchain identifier or name\n --xcconfig <path> apply build settings from this file as overrides\n --derived-data <path> derived data directory\n --jobs <n> maximum concurrent build operations\n --setting KEY=VALUE build setting override; repeatable or comma-separated\n --sign allow code signing (off by default, so simulator builds need no team)\n --allow-provisioning let xcodebuild talk to the developer portal for profiles\n --sanitizer <name> address, thread, or undefined; repeatable or comma-separated\n --timing report per-command build timings\n --destination-timeout <secs> how long to wait for the destination device\n --parallelize-targets build independent targets in parallel\n --hide-script-env omit shell script environment variables from the log\n --skip-unavailable-actions skip scheme actions that cannot run instead of failing\n --max-errors <n> errors to list before summarizing the rest (default: 20)\n --full list every warning instead of the first 10\n --codesize <dir> write a code size profile to this directory\n --log-level <level> quiet, normal, or verbose \u2014 how much lands in the log file\n --bundle-version <n> result bundle format version (default: xcodebuild's own)\n --stream <path> also write xcodebuild's live result stream here\n --offline resolve using only the versions already in Package.resolved\n --cache <path> clone remote packages into this directory\n --package-cache <path> shared package cache directory (across projects)\n --no-auto-resolve never resolve automatically; fail if Package.resolved is stale\n --skip-package-updates use the packages already cloned, without checking for updates\n --no-package-cache ignore the shared package repository cache\n --skip-plugin-validation trust build plugins without prompting\n --skip-signature-validation do not verify package signatures\n --package-auth <kind> keychain or netrc\n --registry-url <url> default package registry\n --scm-to-registry <kind> none, identity, or swift-package-registry\n --fingerprint-policy <kind> strict or warn\n --signing-entity-policy <kind> strict or warn\n --scm-provider <kind> system or xcode\n --test-plan <name> test plan to enumerate\n --filter <text> only suites or tests whose identifier contains this\n --list print every test identifier instead of per-suite counts\n --max <n> rows to list before summarizing the rest (default: 40)\nnote:\n Enumerating compiles the test bundle, so the first run is as slow as a build.\n It is still far cheaper than running the tests to find out what they are.\nexamples:\n xcodebuild-axi tests --scheme MyApp\n xcodebuild-axi tests --scheme MyApp --filter AppFeature --list\n";
|
|
2
|
+
export declare function testsCommand(args: string[]): Promise<string>;
|
|
3
|
+
/**
|
|
4
|
+
* Collapse `Target/Suite/testName()` identifiers into one row per suite.
|
|
5
|
+
*
|
|
6
|
+
* A scheme with a thousand tests produces a thousand unreadable rows; the
|
|
7
|
+
* shape an agent needs to pick what to run is the suite and how big it is
|
|
8
|
+
* (AXI principle 2).
|
|
9
|
+
*/
|
|
10
|
+
export declare function groupBySuite(identifiers: string[]): {
|
|
11
|
+
suite: string;
|
|
12
|
+
tests: number;
|
|
13
|
+
}[];
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { readFileSync, rmSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { AxiError, mapXcodebuildError } from "../errors.js";
|
|
4
|
+
import { BUILD_FLAG_HELP, resolveBuildContext, runAction, runLabel, SHARED_BUILD_FLAGS, SHARED_BUILD_VALUE_FLAGS, } from "../action.js";
|
|
5
|
+
import { artifactDir } from "../xcodebuild.js";
|
|
6
|
+
import { duration, renderFields, renderHelp, renderList, renderOutput, tildePath, } from "../toon.js";
|
|
7
|
+
import { getFlag, getIntFlag, hasFlag, rejectUnknownFlags } from "../args.js";
|
|
8
|
+
export const TESTS_HELP = `usage: xcodebuild-axi tests [flags]
|
|
9
|
+
Lists the tests a scheme would run, without running them. Grouped by suite,
|
|
10
|
+
because a thousand identifiers is not an answer.
|
|
11
|
+
flags[45]:
|
|
12
|
+
${BUILD_FLAG_HELP}
|
|
13
|
+
--test-plan <name> test plan to enumerate
|
|
14
|
+
--filter <text> only suites or tests whose identifier contains this
|
|
15
|
+
--list print every test identifier instead of per-suite counts
|
|
16
|
+
--max <n> rows to list before summarizing the rest (default: 40)
|
|
17
|
+
note:
|
|
18
|
+
Enumerating compiles the test bundle, so the first run is as slow as a build.
|
|
19
|
+
It is still far cheaper than running the tests to find out what they are.
|
|
20
|
+
examples:
|
|
21
|
+
xcodebuild-axi tests --scheme MyApp
|
|
22
|
+
xcodebuild-axi tests --scheme MyApp --filter AppFeature --list
|
|
23
|
+
`;
|
|
24
|
+
const FLAGS = [
|
|
25
|
+
...SHARED_BUILD_FLAGS,
|
|
26
|
+
"--test-plan",
|
|
27
|
+
"--filter",
|
|
28
|
+
"--list",
|
|
29
|
+
"--max",
|
|
30
|
+
];
|
|
31
|
+
const VALUE_FLAGS = [
|
|
32
|
+
...SHARED_BUILD_VALUE_FLAGS,
|
|
33
|
+
"--test-plan",
|
|
34
|
+
"--filter",
|
|
35
|
+
"--max",
|
|
36
|
+
];
|
|
37
|
+
export async function testsCommand(args) {
|
|
38
|
+
rejectUnknownFlags(args, "tests", FLAGS, VALUE_FLAGS);
|
|
39
|
+
const context = await resolveBuildContext({ args, command: "tests" });
|
|
40
|
+
const outputPath = join(artifactDir(context.project), `${runLabel(context, "tests")}.json`);
|
|
41
|
+
const testPlan = getFlag(args, "--test-plan");
|
|
42
|
+
// xcodebuild appends to an existing enumeration file rather than replacing
|
|
43
|
+
// it, so a stale one from a previous scheme would silently pad the list.
|
|
44
|
+
rmSync(outputPath, { force: true });
|
|
45
|
+
const run = await runAction({
|
|
46
|
+
context,
|
|
47
|
+
command: "tests",
|
|
48
|
+
// -enumerate-tests only takes effect alongside the `test` action; without
|
|
49
|
+
// it xcodebuild builds for testing and writes no enumeration at all.
|
|
50
|
+
actions: ["test"],
|
|
51
|
+
extraArgs: [
|
|
52
|
+
...(testPlan ? ["-testPlan", testPlan] : []),
|
|
53
|
+
"-enumerate-tests",
|
|
54
|
+
"-test-enumeration-format",
|
|
55
|
+
"json",
|
|
56
|
+
"-test-enumeration-style",
|
|
57
|
+
"flat",
|
|
58
|
+
"-test-enumeration-output-path",
|
|
59
|
+
outputPath,
|
|
60
|
+
],
|
|
61
|
+
});
|
|
62
|
+
const parsed = readEnumeration(outputPath);
|
|
63
|
+
if (!parsed) {
|
|
64
|
+
const mapped = mapXcodebuildError(run.tail);
|
|
65
|
+
throw new AxiError(mapped?.message ?? "xcodebuild enumerated no tests", mapped?.code ?? "UNKNOWN", [
|
|
66
|
+
...(mapped?.suggestions ?? []),
|
|
67
|
+
`full transcript: ${tildePath(run.logPath)}`,
|
|
68
|
+
]);
|
|
69
|
+
}
|
|
70
|
+
const filter = getFlag(args, "--filter")?.toLowerCase();
|
|
71
|
+
const max = getIntFlag(args, "--max") ?? 40;
|
|
72
|
+
const all = (parsed.values ?? []).flatMap((value) => value.enabledTests ?? []);
|
|
73
|
+
const disabled = (parsed.values ?? []).flatMap((value) => value.disabledTests ?? []);
|
|
74
|
+
let identifiers = all
|
|
75
|
+
.map((test) => test.identifier)
|
|
76
|
+
.filter((identifier) => identifier !== undefined);
|
|
77
|
+
if (filter) {
|
|
78
|
+
identifiers = identifiers.filter((identifier) => identifier.toLowerCase().includes(filter));
|
|
79
|
+
}
|
|
80
|
+
if (identifiers.length === 0) {
|
|
81
|
+
return renderOutput([
|
|
82
|
+
renderFields({
|
|
83
|
+
tests: filter
|
|
84
|
+
? `0 tests match '${getFlag(args, "--filter")}' in scheme ${context.scheme}`
|
|
85
|
+
: `0 tests in scheme ${context.scheme}`,
|
|
86
|
+
}),
|
|
87
|
+
renderHelp([
|
|
88
|
+
"Run `xcodebuild-axi tests` without --filter to see every suite",
|
|
89
|
+
]),
|
|
90
|
+
]);
|
|
91
|
+
}
|
|
92
|
+
const blocks = [
|
|
93
|
+
renderFields({
|
|
94
|
+
scheme: context.scheme,
|
|
95
|
+
tests: identifiers.length,
|
|
96
|
+
...(disabled.length > 0 ? { disabled: disabled.length } : {}),
|
|
97
|
+
duration: duration(run.seconds),
|
|
98
|
+
}),
|
|
99
|
+
];
|
|
100
|
+
if (hasFlag(args, "--list")) {
|
|
101
|
+
const shown = identifiers
|
|
102
|
+
.slice(0, max)
|
|
103
|
+
.map((identifier) => ({ test: identifier }));
|
|
104
|
+
blocks.push(renderList(identifiers.length > shown.length
|
|
105
|
+
? `test_list (${shown.length} of ${identifiers.length})`
|
|
106
|
+
: "test_list", shown));
|
|
107
|
+
if (identifiers.length > shown.length) {
|
|
108
|
+
blocks.push(renderHelp([
|
|
109
|
+
`Run \`xcodebuild-axi tests --list --max ${identifiers.length}\` for all of them`,
|
|
110
|
+
]));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
const suites = groupBySuite(identifiers);
|
|
115
|
+
const shown = suites.slice(0, max);
|
|
116
|
+
blocks.push(renderList(suites.length > shown.length
|
|
117
|
+
? `suites (${shown.length} of ${suites.length})`
|
|
118
|
+
: "suites", shown));
|
|
119
|
+
blocks.push(renderHelp([
|
|
120
|
+
"Run `xcodebuild-axi tests --list` to see individual test identifiers",
|
|
121
|
+
`Run \`xcodebuild-axi test --scheme ${context.scheme} --only <suite>\` to run one suite`,
|
|
122
|
+
]));
|
|
123
|
+
}
|
|
124
|
+
return renderOutput(blocks);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Collapse `Target/Suite/testName()` identifiers into one row per suite.
|
|
128
|
+
*
|
|
129
|
+
* A scheme with a thousand tests produces a thousand unreadable rows; the
|
|
130
|
+
* shape an agent needs to pick what to run is the suite and how big it is
|
|
131
|
+
* (AXI principle 2).
|
|
132
|
+
*/
|
|
133
|
+
export function groupBySuite(identifiers) {
|
|
134
|
+
const counts = new Map();
|
|
135
|
+
for (const identifier of identifiers) {
|
|
136
|
+
const parts = identifier.split("/");
|
|
137
|
+
// Drop the test method, keeping target and suite. A two-part identifier
|
|
138
|
+
// is already suite-level, so it stands for itself.
|
|
139
|
+
const suite = parts.length > 2 ? parts.slice(0, -1).join("/") : identifier;
|
|
140
|
+
counts.set(suite, (counts.get(suite) ?? 0) + 1);
|
|
141
|
+
}
|
|
142
|
+
return [...counts.entries()]
|
|
143
|
+
.map(([suite, tests]) => ({ suite, tests }))
|
|
144
|
+
.sort((a, b) => b.tests - a.tests || a.suite.localeCompare(b.suite));
|
|
145
|
+
}
|
|
146
|
+
function readEnumeration(path) {
|
|
147
|
+
try {
|
|
148
|
+
return JSON.parse(readFileSync(path, "utf-8"));
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return undefined;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=tests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tests.js","sourceRoot":"","sources":["../../../src/commands/tests.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const XCFRAMEWORK_HELP = "usage: xcodebuild-axi xcframework --output <path.xcframework> [flags]\nBundles prebuilt frameworks or libraries into one .xcframework.\nflags[4]:\n --output <path> the .xcframework to write (required)\n --framework <path> a built .framework to include; repeatable\n --library <path> a built static or dynamic library to include; repeatable\n --headers <path> headers for the library that precedes it; repeatable\nnote:\n --headers applies to the --library it follows, which is how xcodebuild pairs\n them. Give them in matching order.\nexamples:\n xcodebuild-axi xcframework --output Out.xcframework --framework A.framework --framework B.framework\n xcodebuild-axi xcframework --output Out.xcframework --library libA.a --headers include\n";
|
|
2
|
+
export declare function xcframeworkCommand(args: string[]): Promise<string>;
|