xcodebuild-axi 0.1.9 → 0.1.10
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 +78 -1
- package/README.md +39 -60
- package/dist/src/archive.d.ts +35 -6
- package/dist/src/archive.js +63 -21
- package/dist/src/archive.js.map +1 -1
- package/dist/src/commands/export.d.ts +4 -4
- package/dist/src/commands/export.js +194 -11
- package/dist/src/commands/export.js.map +1 -1
- package/dist/src/commands/info.d.ts +2 -2
- package/dist/src/commands/info.js +56 -3
- package/dist/src/commands/info.js.map +1 -1
- package/dist/src/commands/result.d.ts +15 -3
- package/dist/src/commands/result.js +291 -5
- package/dist/src/commands/result.js.map +1 -1
- package/dist/src/surface.d.ts +7 -1
- package/dist/src/surface.js +30 -109
- package/dist/src/surface.js.map +1 -1
- package/dist/src/xcresult.d.ts +114 -0
- package/dist/src/xcresult.js +66 -4
- package/dist/src/xcresult.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,82 @@ Notable changes to `xcodebuild-axi`. Versions follow
|
|
|
4
4
|
[semver](https://semver.org/); the format follows
|
|
5
5
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
6
6
|
|
|
7
|
+
## [0.1.10] - 2026-09-21
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **`result` reads the rest of what is in an `.xcresult`.** Seven modes, each
|
|
12
|
+
its own question, none of which had an answer short of shelling out to
|
|
13
|
+
`xcresulttool` and parsing JSON:
|
|
14
|
+
|
|
15
|
+
- `--tests` lists every test the run recorded, failures first, with the
|
|
16
|
+
identifier `--only` and `--activities --test` take.
|
|
17
|
+
- `--activities --test <id>` prints the step-by-step trail of one test,
|
|
18
|
+
indented by depth — what a UI test actually did before it failed.
|
|
19
|
+
- `--insights` reports Xcode's own diagnosis of the run.
|
|
20
|
+
- `--metrics` reports the performance measurements an `XCTMetric` test took,
|
|
21
|
+
which `test --perf-diagnostics` collects and nothing could read back.
|
|
22
|
+
- `--log [build|action|console]` reports the stored log as the timed tree it
|
|
23
|
+
is: the slowest sections of a build, ranked, without rebuilding it.
|
|
24
|
+
- `--available` says what the bundle holds — test results, coverage,
|
|
25
|
+
diagnostics, which logs — so a read that would fail can be skipped rather
|
|
26
|
+
than attempted.
|
|
27
|
+
- `--metadata` reports the bundle's own format version, storage backend and
|
|
28
|
+
compression.
|
|
29
|
+
|
|
30
|
+
That takes `xcresulttool` coverage from 19% to 52.4% of its leaves, and the
|
|
31
|
+
companion tools as a whole from 18.3% to 28.2%.
|
|
32
|
+
|
|
33
|
+
- **The export options plist is fully covered.** `export` gained a flag for
|
|
34
|
+
each of the twelve keys that had none, so nothing about a distribution
|
|
35
|
+
requires authoring XML any more:
|
|
36
|
+
|
|
37
|
+
`--profile <id>=<name>`, `--certificate`, `--installer-certificate`,
|
|
38
|
+
`--distribution-bundle-id`, `--keep-swift-symbols`, `--internal-only`,
|
|
39
|
+
`--app-store-info`, `--icloud-env`, `--thinning`, `--manifest <key>=<url>`,
|
|
40
|
+
`--odr-base-url`, `--no-embed-odr`.
|
|
41
|
+
|
|
42
|
+
The ones that change whether a release works at all: `--profile` and
|
|
43
|
+
`--certificate` are manual signing, which until now could be _asked for_
|
|
44
|
+
with `--signing-style manual` and not completed — so the flag existed and
|
|
45
|
+
the export it produced could not be signed as intended. `--internal-only`
|
|
46
|
+
marks a TestFlight build as not for external distribution, which is what a
|
|
47
|
+
PR build wants. `--manifest` is over-the-web distribution, and it is refused
|
|
48
|
+
unless all three of its URLs are present, because a partial manifest exports
|
|
49
|
+
without an error and produces a link that cannot install.
|
|
50
|
+
|
|
51
|
+
Two spellings are handled rather than passed on: Xcode writes its named
|
|
52
|
+
thinning options with angle brackets (`<none>`), and the Xcode 26 method
|
|
53
|
+
names (`app-store`, `ad-hoc`, `development`) still work and are reported as
|
|
54
|
+
the current name they mean.
|
|
55
|
+
|
|
56
|
+
- `info --sdk <name>` reports one SDK in full — path, platform path, platform,
|
|
57
|
+
and both versions. That was `xcodebuild -version -sdk <name> <infoitem>`,
|
|
58
|
+
which answers one field per invocation and only if you already know the
|
|
59
|
+
field names. A build script that needs the SDK path, or an agent asked which
|
|
60
|
+
build of the SDK it compiled against, had to shell out for it.
|
|
61
|
+
|
|
62
|
+
With it, **every leaf of xcodebuild's own surface that this tool wraps is
|
|
63
|
+
covered**: 160 of 161, and the one left is `installsrc`, which is declined
|
|
64
|
+
on purpose and says so.
|
|
65
|
+
|
|
66
|
+
### Changed
|
|
67
|
+
|
|
68
|
+
- The flags that shape the generated options plist are now **refused**
|
|
69
|
+
alongside `--options` rather than silently ignored. `--upload` already was;
|
|
70
|
+
`--team`, `--signing-style` and the ten new ones were not, so a release could
|
|
71
|
+
pass `--team` beside a hand-written plist and get a build signed by whatever
|
|
72
|
+
the plist said.
|
|
73
|
+
|
|
74
|
+
### Fixed
|
|
75
|
+
|
|
76
|
+
- `xcresulttool`'s own explanation of a failed read is now the error message.
|
|
77
|
+
It writes `Error: …` on stderr and exits non-zero; the reason was thrown away
|
|
78
|
+
and replaced with a guess ("the bundle may be from an incompatible Xcode
|
|
79
|
+
version"), so `--log console` on a bundle with no console log was reported as
|
|
80
|
+
a version problem rather than as the absent log it is. The guess is only
|
|
81
|
+
offered now when `xcresulttool` gave no reason of its own.
|
|
82
|
+
|
|
7
83
|
## [0.1.9] - 2026-09-21
|
|
8
84
|
|
|
9
85
|
### Added
|
|
@@ -294,7 +370,8 @@ First release.
|
|
|
294
370
|
- 100% of the 117 options `xcodebuild -help` lists are covered, declared in
|
|
295
371
|
`src/surface.ts` and checked against the installed Xcode in CI.
|
|
296
372
|
|
|
297
|
-
[unreleased]: https://github.com/alexrrouse/xcodebuild-axi/compare/v0.1.
|
|
373
|
+
[unreleased]: https://github.com/alexrrouse/xcodebuild-axi/compare/v0.1.10...HEAD
|
|
374
|
+
[0.1.10]: https://github.com/alexrrouse/xcodebuild-axi/compare/v0.1.9...v0.1.10
|
|
298
375
|
[0.1.9]: https://github.com/alexrrouse/xcodebuild-axi/compare/v0.1.8...v0.1.9
|
|
299
376
|
[0.1.8]: https://github.com/alexrrouse/xcodebuild-axi/compare/v0.1.7...v0.1.8
|
|
300
377
|
[0.1.7]: https://github.com/alexrrouse/xcodebuild-axi/compare/v0.1.6...v0.1.7
|
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<a href="https://www.npmjs.com/package/xcodebuild-axi"><img alt="npm" src="https://img.shields.io/npm/v/xcodebuild-axi?style=flat-square" /></a>
|
|
5
5
|
<a href="https://axi.md/"><img alt="AXI" src="https://img.shields.io/badge/AXI-compliant-blue?style=flat-square" /></a>
|
|
6
6
|
<img alt="Platform" src="https://img.shields.io/badge/platform-macOS-lightgrey?style=flat-square" />
|
|
7
|
-
<!-- coverage-badge:start --><img alt="xcodebuild coverage" src="https://img.shields.io/badge/xcodebuild_coverage-
|
|
7
|
+
<!-- coverage-badge:start --><img alt="xcodebuild coverage" src="https://img.shields.io/badge/xcodebuild_coverage-99.4%25-brightgreen?style=flat-square" /><!-- coverage-badge:end -->
|
|
8
8
|
<img alt="License" src="https://img.shields.io/badge/license-MIT-green?style=flat-square" />
|
|
9
9
|
</p>
|
|
10
10
|
|
|
@@ -171,7 +171,7 @@ Every command takes `--help`.
|
|
|
171
171
|
|
|
172
172
|
<!-- coverage:start -->
|
|
173
173
|
|
|
174
|
-
**Coverage:
|
|
174
|
+
**Coverage: 99.4% of the 161 leaves `xcodebuild` documents** — every option, build action, export options key, `-create-xcframework` argument, and the second forms that only a usage line mentions.
|
|
175
175
|
|
|
176
176
|
A leaf is one switch you could type. Counting options alone says 100% (117/117), which was true and hid every gap below: an option is one thing, and `-exportOptionsPlist` alone opens eighteen more.
|
|
177
177
|
|
|
@@ -179,10 +179,10 @@ A leaf is one switch you could type. Counting options alone says 100% (117/117),
|
|
|
179
179
|
| ------------------------------------------------------ | ------- | --------------- |
|
|
180
180
|
| `xcodebuild -help` options | 117 | 117 (100%) |
|
|
181
181
|
| build actions | 10 | 9 (90%) |
|
|
182
|
-
| second forms (`-version <infoitem>`, `-license check`) | 8 |
|
|
183
|
-
| `-exportOptionsPlist` keys | 18 |
|
|
182
|
+
| second forms (`-version <infoitem>`, `-license check`) | 8 | 8 (100%) |
|
|
183
|
+
| `-exportOptionsPlist` keys | 18 | 18 (100%) |
|
|
184
184
|
| `-create-xcframework` options | 8 | 8 (100%) |
|
|
185
|
-
| **total** | **161** | **
|
|
185
|
+
| **total** | **161** | **160 (99.4%)** |
|
|
186
186
|
|
|
187
187
|
**Reach: 100%** of the 328 command-and-option pairs. The same options, counted once per command xcodebuild accepts them on — because `-target` exposed on `build` and missing from `settings` is not covered for anyone asking `settings`. 0 pairs are open.
|
|
188
188
|
|
|
@@ -204,65 +204,44 @@ The one action left out is `installsrc` — it copies sources into `SRCROOT` as
|
|
|
204
204
|
|
|
205
205
|
### Companion tools
|
|
206
206
|
|
|
207
|
-
`xcresulttool`, `xccov` and `simctl` are not xcodebuild, so they are not in the number above — but this tool wraps all three, and an agent that has to shell out to one directly has dropped back down. **
|
|
207
|
+
`xcresulttool`, `xccov` and `simctl` are not xcodebuild, so they are not in the number above — but this tool wraps all three, and an agent that has to shell out to one directly has dropped back down. **28.2% of 71 leaves**, counted the same way:
|
|
208
208
|
|
|
209
|
-
| Tool | Leaves | Covered
|
|
210
|
-
| -------------- | ------ |
|
|
211
|
-
| `xcresulttool` | 21 |
|
|
212
|
-
| `xccov` | 9 | 4 (44.4%)
|
|
213
|
-
| `simctl` | 41 | 5 (12.2%)
|
|
209
|
+
| Tool | Leaves | Covered |
|
|
210
|
+
| -------------- | ------ | ---------- |
|
|
211
|
+
| `xcresulttool` | 21 | 11 (52.4%) |
|
|
212
|
+
| `xccov` | 9 | 4 (44.4%) |
|
|
213
|
+
| `simctl` | 41 | 5 (12.2%) |
|
|
214
214
|
|
|
215
215
|
### Still open
|
|
216
216
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
| Leaf
|
|
220
|
-
|
|
|
221
|
-
|
|
|
222
|
-
|
|
|
223
|
-
| `
|
|
224
|
-
| `
|
|
225
|
-
| `
|
|
226
|
-
| `
|
|
227
|
-
| `
|
|
228
|
-
| `
|
|
229
|
-
| `
|
|
230
|
-
| `
|
|
231
|
-
| `
|
|
232
|
-
| `
|
|
233
|
-
| `
|
|
234
|
-
| `
|
|
235
|
-
| `
|
|
236
|
-
| `
|
|
237
|
-
| `
|
|
238
|
-
| `
|
|
239
|
-
| `
|
|
240
|
-
| `
|
|
241
|
-
| `
|
|
242
|
-
| `
|
|
243
|
-
| `
|
|
244
|
-
| `
|
|
245
|
-
| `xcresulttool compare` | `result` | two runs cannot be diffed, which is the question CI asks most |
|
|
246
|
-
| `xcresulttool merge` | `result` | the bundles of a sharded test run cannot be combined |
|
|
247
|
-
| `xcresulttool metadata` | `result` | a bundle's own metadata cannot be read |
|
|
248
|
-
| `xccov view --report --functions-for-file` | `coverage` | coverage stops at the file, so the uncovered function has no name |
|
|
249
|
-
| `xccov view --archive` | `coverage` | a standalone .xccovarchive cannot be read, only a result bundle |
|
|
250
|
-
| `xccov view --file` | `coverage` | the per-line coverage of one file cannot be printed |
|
|
251
|
-
| `xccov diff` | `coverage` | 'did coverage drop' cannot be answered from two bundles this tool wrote |
|
|
252
|
-
| `xccov merge` | `coverage` | the coverage of a sharded run cannot be combined |
|
|
253
|
-
| `simctl install` | `sim` | a built .app cannot be put on the simulator it was built for |
|
|
254
|
-
| `simctl launch` | `sim` | the app a build just produced cannot be run |
|
|
255
|
-
| `simctl terminate` | `?` | a running app cannot be stopped |
|
|
256
|
-
| `simctl uninstall` | `?` | an installed app cannot be removed |
|
|
257
|
-
| `simctl listapps` | `sim` | what is installed on a simulator cannot be listed |
|
|
258
|
-
| `simctl create` | `?` | a missing device cannot be created |
|
|
259
|
-
| `simctl delete` | `sim` | stale devices cannot be reclaimed, and they cost gigabytes |
|
|
260
|
-
| `simctl io` | `sim` | a screenshot of a failing UI cannot be taken |
|
|
261
|
-
| `simctl openurl` | `sim` | a deep link cannot be opened, which is how deep links are tested |
|
|
262
|
-
| `simctl privacy` | `sim` | a permission prompt cannot be granted ahead of a UI test |
|
|
263
|
-
| `simctl push` | `sim` | a push notification cannot be simulated |
|
|
264
|
-
| `simctl status_bar` | `sim` | the status bar cannot be pinned, which screenshot tests need |
|
|
265
|
-
| `simctl ui` | `sim` | dark mode and content size cannot be set for a test run |
|
|
217
|
+
24 leaves are known gaps rather than decisions — each one a reason someone would still reach for the raw tool:
|
|
218
|
+
|
|
219
|
+
| Leaf | Unreachable from | What that costs |
|
|
220
|
+
| ------------------------------------------ | ---------------- | --------------------------------------------------------------------------- |
|
|
221
|
+
| `xcresulttool export diagnostics` | `result` | `test --diagnostics` collects a diagnostics report that cannot be extracted |
|
|
222
|
+
| `xcresulttool export attachments` | `result` | UI test screenshots and attachments cannot be got out of the bundle |
|
|
223
|
+
| `xcresulttool export metrics` | `result` | performance measurements cannot be exported as CSV |
|
|
224
|
+
| `xcresulttool export evaluations` | `result` | evaluation attachments cannot be exported |
|
|
225
|
+
| `xcresulttool compare` | `result` | two runs cannot be diffed, which is the question CI asks most |
|
|
226
|
+
| `xcresulttool merge` | `result` | the bundles of a sharded test run cannot be combined |
|
|
227
|
+
| `xccov view --report --functions-for-file` | `coverage` | coverage stops at the file, so the uncovered function has no name |
|
|
228
|
+
| `xccov view --archive` | `coverage` | a standalone .xccovarchive cannot be read, only a result bundle |
|
|
229
|
+
| `xccov view --file` | `coverage` | the per-line coverage of one file cannot be printed |
|
|
230
|
+
| `xccov diff` | `coverage` | 'did coverage drop' cannot be answered from two bundles this tool wrote |
|
|
231
|
+
| `xccov merge` | `coverage` | the coverage of a sharded run cannot be combined |
|
|
232
|
+
| `simctl install` | `sim` | a built .app cannot be put on the simulator it was built for |
|
|
233
|
+
| `simctl launch` | `sim` | the app a build just produced cannot be run |
|
|
234
|
+
| `simctl terminate` | `?` | a running app cannot be stopped |
|
|
235
|
+
| `simctl uninstall` | `?` | an installed app cannot be removed |
|
|
236
|
+
| `simctl listapps` | `sim` | what is installed on a simulator cannot be listed |
|
|
237
|
+
| `simctl create` | `?` | a missing device cannot be created |
|
|
238
|
+
| `simctl delete` | `sim` | stale devices cannot be reclaimed, and they cost gigabytes |
|
|
239
|
+
| `simctl io` | `sim` | a screenshot of a failing UI cannot be taken |
|
|
240
|
+
| `simctl openurl` | `sim` | a deep link cannot be opened, which is how deep links are tested |
|
|
241
|
+
| `simctl privacy` | `sim` | a permission prompt cannot be granted ahead of a UI test |
|
|
242
|
+
| `simctl push` | `sim` | a push notification cannot be simulated |
|
|
243
|
+
| `simctl status_bar` | `sim` | the status bar cannot be pinned, which screenshot tests need |
|
|
244
|
+
| `simctl ui` | `sim` | dark mode and content size cannot be set for a test run |
|
|
266
245
|
|
|
267
246
|
The denominator is read from `xcodebuild -help` rather than hand-maintained, and this table is written against **Xcode 27.0** — the option list moves between releases. `npm run coverage:check` fails on that Xcode if an option here is unclassified or has been dropped, and reports the difference without failing on any other.
|
|
268
247
|
|
package/dist/src/archive.d.ts
CHANGED
|
@@ -19,17 +19,46 @@ export declare function readArchiveInfo(archivePath: string): Promise<ArchiveInf
|
|
|
19
19
|
/** The `method` values Xcode 27 accepts in an export options plist. */
|
|
20
20
|
export declare const EXPORT_METHODS: readonly ["app-store-connect", "release-testing", "enterprise", "debugging", "developer-id", "mac-application", "validation"];
|
|
21
21
|
/**
|
|
22
|
-
*
|
|
22
|
+
* The names Xcode 26 and earlier used, which every existing pipeline and every
|
|
23
|
+
* answer written before Xcode 27 still says. xcodebuild itself still accepts
|
|
24
|
+
* them, so refusing them here would be this tool being stricter than the thing
|
|
25
|
+
* it wraps.
|
|
26
|
+
*/
|
|
27
|
+
export declare const EXPORT_METHOD_ALIASES: Record<string, string>;
|
|
28
|
+
/**
|
|
29
|
+
* Every key `-exportOptionsPlist` accepts, and what it is for.
|
|
23
30
|
*
|
|
24
|
-
*
|
|
25
|
-
* of
|
|
26
|
-
*
|
|
31
|
+
* The plist is the whole configuration surface of `-exportArchive`. A key with
|
|
32
|
+
* no flag in front of it is a key that sends the agent back to authoring XML,
|
|
33
|
+
* which is the side quest this file exists to remove.
|
|
27
34
|
*/
|
|
28
|
-
export
|
|
35
|
+
export interface ExportOptions {
|
|
29
36
|
method: string;
|
|
30
37
|
destination?: string;
|
|
31
38
|
teamID?: string;
|
|
32
39
|
signingStyle?: string;
|
|
40
|
+
signingCertificate?: string;
|
|
41
|
+
installerSigningCertificate?: string;
|
|
42
|
+
/** Bundle identifier -> profile name or UUID, for manual signing. */
|
|
43
|
+
provisioningProfiles?: Record<string, string>;
|
|
44
|
+
distributionBundleIdentifier?: string;
|
|
33
45
|
uploadSymbols?: boolean;
|
|
46
|
+
stripSwiftSymbols?: boolean;
|
|
34
47
|
manageAppVersionAndBuildNumber?: boolean;
|
|
35
|
-
|
|
48
|
+
testFlightInternalTestingOnly?: boolean;
|
|
49
|
+
generateAppStoreInformation?: boolean;
|
|
50
|
+
iCloudContainerEnvironment?: string;
|
|
51
|
+
thinning?: string;
|
|
52
|
+
/** appURL, displayImageURL and fullSizeImageURL, for web distribution. */
|
|
53
|
+
manifest?: Record<string, string>;
|
|
54
|
+
embedOnDemandResourcesAssetPacksInBundle?: boolean;
|
|
55
|
+
onDemandResourcesAssetPacksBaseURL?: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Build an export options plist.
|
|
59
|
+
*
|
|
60
|
+
* `-exportArchive` requires one, and authoring XML by hand is exactly the kind
|
|
61
|
+
* of unguessable side quest an agent fails at. Given a method (and whatever
|
|
62
|
+
* else was asked for), the plist is derivable, so derive it.
|
|
63
|
+
*/
|
|
64
|
+
export declare function exportOptionsPlist(options: ExportOptions): string;
|
package/dist/src/archive.js
CHANGED
|
@@ -46,31 +46,52 @@ export const EXPORT_METHODS = [
|
|
|
46
46
|
"validation",
|
|
47
47
|
];
|
|
48
48
|
/**
|
|
49
|
-
*
|
|
49
|
+
* The names Xcode 26 and earlier used, which every existing pipeline and every
|
|
50
|
+
* answer written before Xcode 27 still says. xcodebuild itself still accepts
|
|
51
|
+
* them, so refusing them here would be this tool being stricter than the thing
|
|
52
|
+
* it wraps.
|
|
53
|
+
*/
|
|
54
|
+
export const EXPORT_METHOD_ALIASES = {
|
|
55
|
+
"app-store": "app-store-connect",
|
|
56
|
+
"ad-hoc": "release-testing",
|
|
57
|
+
development: "debugging",
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* The order keys are written in. Xcode does not care, but a generated file a
|
|
61
|
+
* human may end up reading should group signing with signing.
|
|
62
|
+
*/
|
|
63
|
+
const EXPORT_OPTION_ORDER = [
|
|
64
|
+
"method",
|
|
65
|
+
"destination",
|
|
66
|
+
"teamID",
|
|
67
|
+
"signingStyle",
|
|
68
|
+
"signingCertificate",
|
|
69
|
+
"installerSigningCertificate",
|
|
70
|
+
"provisioningProfiles",
|
|
71
|
+
"distributionBundleIdentifier",
|
|
72
|
+
"uploadSymbols",
|
|
73
|
+
"stripSwiftSymbols",
|
|
74
|
+
"manageAppVersionAndBuildNumber",
|
|
75
|
+
"testFlightInternalTestingOnly",
|
|
76
|
+
"generateAppStoreInformation",
|
|
77
|
+
"iCloudContainerEnvironment",
|
|
78
|
+
"thinning",
|
|
79
|
+
"manifest",
|
|
80
|
+
"embedOnDemandResourcesAssetPacksInBundle",
|
|
81
|
+
"onDemandResourcesAssetPacksBaseURL",
|
|
82
|
+
];
|
|
83
|
+
/**
|
|
84
|
+
* Build an export options plist.
|
|
50
85
|
*
|
|
51
86
|
* `-exportArchive` requires one, and authoring XML by hand is exactly the kind
|
|
52
|
-
* of unguessable side quest an agent fails at. Given a method (and
|
|
53
|
-
*
|
|
87
|
+
* of unguessable side quest an agent fails at. Given a method (and whatever
|
|
88
|
+
* else was asked for), the plist is derivable, so derive it.
|
|
54
89
|
*/
|
|
55
90
|
export function exportOptionsPlist(options) {
|
|
56
|
-
const entries =
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
entries.push(` <key>destination</key>\n <string>${options.destination}</string>`);
|
|
61
|
-
}
|
|
62
|
-
if (options.teamID) {
|
|
63
|
-
entries.push(` <key>teamID</key>\n <string>${options.teamID}</string>`);
|
|
64
|
-
}
|
|
65
|
-
if (options.signingStyle) {
|
|
66
|
-
entries.push(` <key>signingStyle</key>\n <string>${options.signingStyle}</string>`);
|
|
67
|
-
}
|
|
68
|
-
if (options.uploadSymbols !== undefined) {
|
|
69
|
-
entries.push(` <key>uploadSymbols</key>\n <${options.uploadSymbols}/>`);
|
|
70
|
-
}
|
|
71
|
-
if (options.manageAppVersionAndBuildNumber !== undefined) {
|
|
72
|
-
entries.push(` <key>manageAppVersionAndBuildNumber</key>\n <${options.manageAppVersionAndBuildNumber}/>`);
|
|
73
|
-
}
|
|
91
|
+
const entries = EXPORT_OPTION_ORDER.flatMap((key) => {
|
|
92
|
+
const value = options[key];
|
|
93
|
+
return value === undefined ? [] : [` <key>${key}</key>\n${render(value)}`];
|
|
94
|
+
});
|
|
74
95
|
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
75
96
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
76
97
|
<plist version="1.0">
|
|
@@ -80,4 +101,25 @@ ${entries.join("\n")}
|
|
|
80
101
|
</plist>
|
|
81
102
|
`;
|
|
82
103
|
}
|
|
104
|
+
function render(value) {
|
|
105
|
+
if (typeof value === "boolean")
|
|
106
|
+
return ` <${value}/>`;
|
|
107
|
+
if (typeof value === "string")
|
|
108
|
+
return ` <string>${escapeXml(value)}</string>`;
|
|
109
|
+
const inner = Object.entries(value)
|
|
110
|
+
.map(([key, entry]) => ` <key>${escapeXml(key)}</key>\n <string>${escapeXml(entry)}</string>`)
|
|
111
|
+
.join("\n");
|
|
112
|
+
return ` <dict>\n${inner}\n </dict>`;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* A manifest URL with a query string carries `&`, and an unescaped one makes
|
|
116
|
+
* the plist unparseable -- which xcodebuild reports as a failed export rather
|
|
117
|
+
* than as a bad file.
|
|
118
|
+
*/
|
|
119
|
+
function escapeXml(value) {
|
|
120
|
+
return value
|
|
121
|
+
.replace(/&/g, "&")
|
|
122
|
+
.replace(/</g, "<")
|
|
123
|
+
.replace(/>/g, ">");
|
|
124
|
+
}
|
|
83
125
|
//# sourceMappingURL=archive.js.map
|
package/dist/src/archive.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/archive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA+BjC,MAAM,UAAU,eAAe,CAC7B,WAAmB;IAEnB,OAAO,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE;QACpC,QAAQ,CACN,QAAQ,EACR,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,EAChE,EAAE,QAAQ,EAAE,OAAO,EAAE,EACrB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAChB,IAAI,KAAK,EAAE,CAAC;gBACV,cAAc,CAAC,SAAS,CAAC,CAAC;gBAC1B,OAAO;YACT,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAoB,CAAC;gBACrD,MAAM,GAAG,GAAG,MAAM,CAAC,qBAAqB,IAAI,EAAE,CAAC;gBAC/C,cAAc,CAAC;oBACb,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3D,GAAG,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS;wBACnC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,YAAY,EAAE;wBACpC,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,CAAC,GAAG,CAAC,kBAAkB,KAAK,SAAS;wBACtC,CAAC,CAAC,EAAE,gBAAgB,EAAE,GAAG,CAAC,kBAAkB,EAAE;wBAC9C,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,CAAC,GAAG,CAAC,0BAA0B,KAAK,SAAS;wBAC9C,CAAC,CAAC,EAAE,gBAAgB,EAAE,GAAG,CAAC,0BAA0B,EAAE;wBACtD,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,CAAC,GAAG,CAAC,eAAe,KAAK,SAAS;wBACnC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,eAAe,EAAE;wBACtC,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,CAAC,GAAG,CAAC,eAAe,KAAK,SAAS;wBACnC,CAAC,CAAC,EAAE,eAAe,EAAE,GAAG,CAAC,eAAe,EAAE;wBAC1C,CAAC,CAAC,EAAE,CAAC;iBACR,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc,CAAC,SAAS,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,mBAAmB;IACnB,iBAAiB;IACjB,YAAY;IACZ,WAAW;IACX,cAAc;IACd,iBAAiB;IACjB,YAAY;CACJ,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,
|
|
1
|
+
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/archive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA+BjC,MAAM,UAAU,eAAe,CAC7B,WAAmB;IAEnB,OAAO,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE;QACpC,QAAQ,CACN,QAAQ,EACR,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,EAChE,EAAE,QAAQ,EAAE,OAAO,EAAE,EACrB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAChB,IAAI,KAAK,EAAE,CAAC;gBACV,cAAc,CAAC,SAAS,CAAC,CAAC;gBAC1B,OAAO;YACT,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAoB,CAAC;gBACrD,MAAM,GAAG,GAAG,MAAM,CAAC,qBAAqB,IAAI,EAAE,CAAC;gBAC/C,cAAc,CAAC;oBACb,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3D,GAAG,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS;wBACnC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,YAAY,EAAE;wBACpC,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,CAAC,GAAG,CAAC,kBAAkB,KAAK,SAAS;wBACtC,CAAC,CAAC,EAAE,gBAAgB,EAAE,GAAG,CAAC,kBAAkB,EAAE;wBAC9C,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,CAAC,GAAG,CAAC,0BAA0B,KAAK,SAAS;wBAC9C,CAAC,CAAC,EAAE,gBAAgB,EAAE,GAAG,CAAC,0BAA0B,EAAE;wBACtD,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,CAAC,GAAG,CAAC,eAAe,KAAK,SAAS;wBACnC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,eAAe,EAAE;wBACtC,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,CAAC,GAAG,CAAC,eAAe,KAAK,SAAS;wBACnC,CAAC,CAAC,EAAE,eAAe,EAAE,GAAG,CAAC,eAAe,EAAE;wBAC1C,CAAC,CAAC,EAAE,CAAC;iBACR,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc,CAAC,SAAS,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,mBAAmB;IACnB,iBAAiB;IACjB,YAAY;IACZ,WAAW;IACX,cAAc;IACd,iBAAiB;IACjB,YAAY;CACJ,CAAC;AAEX;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAA2B;IAC3D,WAAW,EAAE,mBAAmB;IAChC,QAAQ,EAAE,iBAAiB;IAC3B,WAAW,EAAE,WAAW;CACzB,CAAC;AAgCF;;;GAGG;AACH,MAAM,mBAAmB,GAA+B;IACtD,QAAQ;IACR,aAAa;IACb,QAAQ;IACR,cAAc;IACd,oBAAoB;IACpB,6BAA6B;IAC7B,sBAAsB;IACtB,8BAA8B;IAC9B,eAAe;IACf,mBAAmB;IACnB,gCAAgC;IAChC,+BAA+B;IAC/B,6BAA6B;IAC7B,4BAA4B;IAC5B,UAAU;IACV,UAAU;IACV,0CAA0C;IAC1C,oCAAoC;CACrC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAsB;IACvD,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAClD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3B,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,WAAW,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,OAAO;;;;EAIP,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;;;CAGnB,CAAC;AACF,CAAC;AAED,SAAS,MAAM,CAAC,KAAgD;IAC9D,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,KAAK,IAAI,CAAC;IACvD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAC3B,OAAO,aAAa,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC;IAClD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SAChC,GAAG,CACF,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CACf,YAAY,SAAS,CAAC,GAAG,CAAC,uBAAuB,SAAS,CAAC,KAAK,CAAC,WAAW,CAC/E;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,aAAa,KAAK,aAAa,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK;SACT,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type ExportOptions } from "../archive.js";
|
|
2
2
|
export declare const EXPORT_HELP: string;
|
|
3
|
-
export declare const EXPORT_FLAGS: readonly ["--method", "--team", "--options", "--output", "--artifacts-dir", "--upload", "--no-manage-version", "--no-upload-symbols", "--notarized", "--allow-provisioning", "--signing-style", "--auth-key-path", "--auth-key-id", "--auth-key-issuer", "--allow-device-registration"];
|
|
4
|
-
export declare const EXPORT_VALUE_FLAGS: readonly ["--method", "--team", "--options", "--output", "--artifacts-dir", "--signing-style", "--auth-key-path", "--auth-key-id", "--auth-key-issuer"];
|
|
3
|
+
export declare const EXPORT_FLAGS: readonly ["--method", "--team", "--options", "--output", "--artifacts-dir", "--upload", "--no-manage-version", "--no-upload-symbols", "--notarized", "--allow-provisioning", "--signing-style", "--profile", "--certificate", "--installer-certificate", "--distribution-bundle-id", "--keep-swift-symbols", "--internal-only", "--app-store-info", "--icloud-env", "--thinning", "--manifest", "--odr-base-url", "--no-embed-odr", "--auth-key-path", "--auth-key-id", "--auth-key-issuer", "--allow-device-registration"];
|
|
4
|
+
export declare const EXPORT_VALUE_FLAGS: readonly ["--method", "--team", "--options", "--output", "--artifacts-dir", "--signing-style", "--profile", "--certificate", "--installer-certificate", "--distribution-bundle-id", "--icloud-env", "--thinning", "--manifest", "--odr-base-url", "--auth-key-path", "--auth-key-id", "--auth-key-issuer"];
|
|
5
5
|
export declare function exportCommand(args: string[]): Promise<string>;
|
|
6
|
-
export declare function generatedPlistOptions(args: string[], method: string):
|
|
6
|
+
export declare function generatedPlistOptions(args: string[], method: string): ExportOptions;
|
|
7
7
|
/**
|
|
8
8
|
* Does this plist upload rather than write a product?
|
|
9
9
|
*
|