@sitepong/fastnode 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/README.md +81 -0
- package/bin/fastnode.js +13 -0
- package/bin/fastnode.ts +5 -0
- package/dist/actions/index.cjs +7405 -0
- package/dist/actions/index.cjs.map +1 -0
- package/dist/actions/index.d.cts +15 -0
- package/dist/actions/index.d.ts +15 -0
- package/dist/actions/index.mjs +7377 -0
- package/dist/actions/index.mjs.map +1 -0
- package/dist/cert/index.cjs +219 -0
- package/dist/cert/index.cjs.map +1 -0
- package/dist/cert/index.d.cts +4 -0
- package/dist/cert/index.d.ts +4 -0
- package/dist/cert/index.mjs +191 -0
- package/dist/cert/index.mjs.map +1 -0
- package/dist/cert-BmJGtYtb.d.cts +27 -0
- package/dist/cert-owkOFNW8.d.ts +27 -0
- package/dist/cli/index.cjs +7998 -0
- package/dist/cli/index.cjs.map +1 -0
- package/dist/cli/index.d.cts +9 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.mjs +7972 -0
- package/dist/cli/index.mjs.map +1 -0
- package/dist/client/index.cjs +2592 -0
- package/dist/client/index.cjs.map +1 -0
- package/dist/client/index.d.cts +2 -0
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.mjs +2582 -0
- package/dist/client/index.mjs.map +1 -0
- package/dist/context-CymLkfrS.d.cts +13 -0
- package/dist/context-CymLkfrS.d.ts +13 -0
- package/dist/core/index.cjs +281 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +1 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.mjs +254 -0
- package/dist/core/index.mjs.map +1 -0
- package/dist/deliver/index.cjs +328 -0
- package/dist/deliver/index.cjs.map +1 -0
- package/dist/deliver/index.d.cts +3 -0
- package/dist/deliver/index.d.ts +3 -0
- package/dist/deliver/index.mjs +322 -0
- package/dist/deliver/index.mjs.map +1 -0
- package/dist/enums-B609j2rb.d.cts +20 -0
- package/dist/enums-B609j2rb.d.ts +20 -0
- package/dist/frameit/index.cjs +247 -0
- package/dist/frameit/index.cjs.map +1 -0
- package/dist/frameit/index.d.cts +1 -0
- package/dist/frameit/index.d.ts +1 -0
- package/dist/frameit/index.mjs +242 -0
- package/dist/frameit/index.mjs.map +1 -0
- package/dist/gym/index.cjs +356 -0
- package/dist/gym/index.cjs.map +1 -0
- package/dist/gym/index.d.cts +2 -0
- package/dist/gym/index.d.ts +2 -0
- package/dist/gym/index.mjs +346 -0
- package/dist/gym/index.mjs.map +1 -0
- package/dist/index-1Vu2cRQ2.d.ts +99 -0
- package/dist/index-A5MimeQk.d.ts +72 -0
- package/dist/index-B0yhu_LZ.d.ts +76 -0
- package/dist/index-B9yXicrQ.d.ts +62 -0
- package/dist/index-BFdNOmPJ.d.cts +53 -0
- package/dist/index-BLubSlgK.d.cts +1513 -0
- package/dist/index-BN0ubxjZ.d.ts +70 -0
- package/dist/index-BQJIJlK7.d.cts +70 -0
- package/dist/index-BYonklf3.d.cts +84 -0
- package/dist/index-BYonklf3.d.ts +84 -0
- package/dist/index-BimqCmY8.d.cts +78 -0
- package/dist/index-BimqCmY8.d.ts +78 -0
- package/dist/index-BoU8qt8r.d.cts +59 -0
- package/dist/index-BoU8qt8r.d.ts +59 -0
- package/dist/index-C2yG3wXA.d.cts +95 -0
- package/dist/index-C2yG3wXA.d.ts +95 -0
- package/dist/index-CR3BFPIz.d.cts +77 -0
- package/dist/index-CR3BFPIz.d.ts +77 -0
- package/dist/index-CWNLnSOL.d.cts +99 -0
- package/dist/index-Cp6cjtd-.d.cts +65 -0
- package/dist/index-Cp6cjtd-.d.ts +65 -0
- package/dist/index-D1Izm7qt.d.ts +1513 -0
- package/dist/index-D5eihzwM.d.cts +76 -0
- package/dist/index-DImN9PWc.d.ts +155 -0
- package/dist/index-DfCUVJX1.d.cts +62 -0
- package/dist/index-DfirmFbC.d.ts +32 -0
- package/dist/index-DkvinY7_.d.ts +54 -0
- package/dist/index-DrUpRXRG.d.cts +155 -0
- package/dist/index-EcVvViW8.d.cts +72 -0
- package/dist/index-HRiaaX-Q.d.cts +54 -0
- package/dist/index-TfXqwuac.d.ts +53 -0
- package/dist/index-lt819Jgj.d.cts +32 -0
- package/dist/index.cjs +8464 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +23 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.mjs +8410 -0
- package/dist/index.mjs.map +1 -0
- package/dist/lane/index.cjs +7641 -0
- package/dist/lane/index.cjs.map +1 -0
- package/dist/lane/index.d.cts +51 -0
- package/dist/lane/index.d.ts +51 -0
- package/dist/lane/index.mjs +7603 -0
- package/dist/lane/index.mjs.map +1 -0
- package/dist/match/index.cjs +942 -0
- package/dist/match/index.cjs.map +1 -0
- package/dist/match/index.d.cts +5 -0
- package/dist/match/index.d.ts +5 -0
- package/dist/match/index.mjs +913 -0
- package/dist/match/index.mjs.map +1 -0
- package/dist/pem/index.cjs +195 -0
- package/dist/pem/index.cjs.map +1 -0
- package/dist/pem/index.d.cts +3 -0
- package/dist/pem/index.d.ts +3 -0
- package/dist/pem/index.mjs +170 -0
- package/dist/pem/index.mjs.map +1 -0
- package/dist/pilot/index.cjs +206 -0
- package/dist/pilot/index.cjs.map +1 -0
- package/dist/pilot/index.d.cts +3 -0
- package/dist/pilot/index.d.ts +3 -0
- package/dist/pilot/index.mjs +196 -0
- package/dist/pilot/index.mjs.map +1 -0
- package/dist/precheck/index.cjs +277 -0
- package/dist/precheck/index.cjs.map +1 -0
- package/dist/precheck/index.d.cts +3 -0
- package/dist/precheck/index.d.ts +3 -0
- package/dist/precheck/index.mjs +274 -0
- package/dist/precheck/index.mjs.map +1 -0
- package/dist/produce/index.cjs +200 -0
- package/dist/produce/index.cjs.map +1 -0
- package/dist/produce/index.d.cts +3 -0
- package/dist/produce/index.d.ts +3 -0
- package/dist/produce/index.mjs +191 -0
- package/dist/produce/index.mjs.map +1 -0
- package/dist/scan/index.cjs +187 -0
- package/dist/scan/index.cjs.map +1 -0
- package/dist/scan/index.d.cts +1 -0
- package/dist/scan/index.d.ts +1 -0
- package/dist/scan/index.mjs +183 -0
- package/dist/scan/index.mjs.map +1 -0
- package/dist/sigh/index.cjs +203 -0
- package/dist/sigh/index.cjs.map +1 -0
- package/dist/sigh/index.d.cts +3 -0
- package/dist/sigh/index.d.ts +3 -0
- package/dist/sigh/index.mjs +198 -0
- package/dist/sigh/index.mjs.map +1 -0
- package/dist/snapshot/index.cjs +448 -0
- package/dist/snapshot/index.cjs.map +1 -0
- package/dist/snapshot/index.d.cts +1 -0
- package/dist/snapshot/index.d.ts +1 -0
- package/dist/snapshot/index.mjs +438 -0
- package/dist/snapshot/index.mjs.map +1 -0
- package/dist/trainer/index.cjs +395 -0
- package/dist/trainer/index.cjs.map +1 -0
- package/dist/trainer/index.d.cts +1 -0
- package/dist/trainer/index.d.ts +1 -0
- package/dist/trainer/index.mjs +372 -0
- package/dist/trainer/index.mjs.map +1 -0
- package/dist/xcode/index.cjs +188 -0
- package/dist/xcode/index.cjs.map +1 -0
- package/dist/xcode/index.d.cts +1 -0
- package/dist/xcode/index.d.ts +1 -0
- package/dist/xcode/index.mjs +176 -0
- package/dist/xcode/index.mjs.map +1 -0
- package/package.json +223 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/produce/index.ts
|
|
4
|
+
var SERVICE_NAME_TO_CAPABILITY = {
|
|
5
|
+
access_wifi: "ACCESS_WIFI_INFORMATION",
|
|
6
|
+
app_attest: "APP_ATTEST",
|
|
7
|
+
// Fastlane uses singular `app_group` — see service.rb line 59 & 105.
|
|
8
|
+
app_group: "APP_GROUPS",
|
|
9
|
+
apple_pay: "APPLE_PAY",
|
|
10
|
+
associated_domains: "ASSOCIATED_DOMAINS",
|
|
11
|
+
auto_fill_credential: "AUTOFILL_CREDENTIAL_PROVIDER",
|
|
12
|
+
car_play_audio_app: "CARPLAY_PLAYABLE_CONTENT",
|
|
13
|
+
car_play_messaging_app: "CARPLAY_MESSAGING",
|
|
14
|
+
car_play_navigation_app: "CARPLAY_NAVIGATION",
|
|
15
|
+
car_play_voip_calling_app: "CARPLAY_VOIP",
|
|
16
|
+
class_kit: "CLASSKIT",
|
|
17
|
+
declared_age_range: "DECLARED_AGE_RANGE",
|
|
18
|
+
icloud: "ICLOUD",
|
|
19
|
+
critical_alerts: "CRITICAL_ALERTS",
|
|
20
|
+
custom_network_protocol: "NETWORK_CUSTOM_PROTOCOL",
|
|
21
|
+
data_protection: "DATA_PROTECTION",
|
|
22
|
+
extended_virtual_address_space: "EXTENDED_VIRTUAL_ADDRESSING",
|
|
23
|
+
file_provider_testing_mode: "FILEPROVIDER_TESTINGMODE",
|
|
24
|
+
family_controls: "FAMILY_CONTROLS",
|
|
25
|
+
fonts: "FONT_INSTALLATION",
|
|
26
|
+
game_center: "GAME_CENTER",
|
|
27
|
+
health_kit: "HEALTHKIT",
|
|
28
|
+
hls_interstitial_preview: "HLS_INTERSTITIAL_PREVIEW",
|
|
29
|
+
home_kit: "HOMEKIT",
|
|
30
|
+
hotspot: "HOT_SPOT",
|
|
31
|
+
hotspot_helper: "HOTSPOT_HELPER_MANAGED",
|
|
32
|
+
in_app_purchase: "IN_APP_PURCHASE",
|
|
33
|
+
inter_app_audio: "INTER_APP_AUDIO",
|
|
34
|
+
low_latency_hls: "COREMEDIA_HLS_LOW_LATENCY",
|
|
35
|
+
managed_associated_domains: "MDM_MANAGED_ASSOCIATED_DOMAINS",
|
|
36
|
+
maps: "MAPS",
|
|
37
|
+
multipath: "MULTIPATH",
|
|
38
|
+
network_extension: "NETWORK_EXTENSIONS",
|
|
39
|
+
nfc_tag_reading: "NFC_TAG_READING",
|
|
40
|
+
personal_vpn: "PERSONAL_VPN",
|
|
41
|
+
push_notification: "PUSH_NOTIFICATIONS",
|
|
42
|
+
sign_in_with_apple: "APPLE_ID_AUTH",
|
|
43
|
+
siri_kit: "SIRIKIT",
|
|
44
|
+
system_extension: "SYSTEM_EXTENSION_INSTALL",
|
|
45
|
+
user_management: "USER_MANAGEMENT",
|
|
46
|
+
wallet: "WALLET",
|
|
47
|
+
wireless_accessory: "WIRELESS_ACCESSORY_CONFIGURATION",
|
|
48
|
+
driver_kit: "DRIVERKIT",
|
|
49
|
+
driver_kit_endpoint_security: "DRIVERKIT_ENDPOINT_SECURITY",
|
|
50
|
+
driver_kit_family_hid_device: "DRIVERKIT_HID_DEVICE",
|
|
51
|
+
driver_kit_family_networking: "DRIVERKIT_NETWORKING",
|
|
52
|
+
driver_kit_family_serial: "DRIVERKIT_SERIAL",
|
|
53
|
+
driver_kit_hid_event_service: "DRIVERKIT_HID_EVENT_SERVICE",
|
|
54
|
+
driver_kit_transport_hid: "DRIVERKIT_HID",
|
|
55
|
+
multitasking_camera_access: "IPAD_CAMERA_MULTITASKING",
|
|
56
|
+
sf_universal_link_api: "SFUNIVERSALLINK_API",
|
|
57
|
+
vp9_decoder: "VP9_DECODER",
|
|
58
|
+
music_kit: "MUSIC_KIT",
|
|
59
|
+
shazam_kit: "SHAZAM_KIT",
|
|
60
|
+
communication_notifications: "USERNOTIFICATIONS_COMMUNICATION",
|
|
61
|
+
group_activities: "GROUP_ACTIVITIES",
|
|
62
|
+
health_kit_estimate_recalibration: "HEALTHKIT_RECALIBRATE_ESTIMATES",
|
|
63
|
+
time_sensitive_notifications: "USERNOTIFICATIONS_TIMESENSITIVE"
|
|
64
|
+
};
|
|
65
|
+
function buildCapabilitySettings(serviceName, value) {
|
|
66
|
+
if (value === true || value === false) return void 0;
|
|
67
|
+
const wrap = (key, optionKey) => [{ key, options: [{ key: optionKey }] }];
|
|
68
|
+
switch (serviceName) {
|
|
69
|
+
case "data_protection":
|
|
70
|
+
switch (value) {
|
|
71
|
+
case "complete":
|
|
72
|
+
return wrap("DATA_PROTECTION_PERMISSION_LEVEL", "COMPLETE_PROTECTION");
|
|
73
|
+
case "unlessopen":
|
|
74
|
+
return wrap("DATA_PROTECTION_PERMISSION_LEVEL", "PROTECTED_UNLESS_OPEN");
|
|
75
|
+
case "untilfirstauth":
|
|
76
|
+
return wrap(
|
|
77
|
+
"DATA_PROTECTION_PERMISSION_LEVEL",
|
|
78
|
+
"PROTECTED_UNTIL_FIRST_USER_AUTH"
|
|
79
|
+
);
|
|
80
|
+
default:
|
|
81
|
+
throw new Error(
|
|
82
|
+
`Unknown value for data_protection: '${value}'. Valid values: 'complete', 'unlessopen', 'untilfirstauth'`
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
case "icloud":
|
|
86
|
+
switch (value) {
|
|
87
|
+
case "xcode6_compatible":
|
|
88
|
+
return wrap("ICLOUD_VERSION", "XCODE_6");
|
|
89
|
+
case "xcode5_compatible":
|
|
90
|
+
return wrap("ICLOUD_VERSION", "XCODE_5");
|
|
91
|
+
default:
|
|
92
|
+
throw new Error(
|
|
93
|
+
`Unknown value for icloud: '${value}'. Valid values: 'xcode6_compatible', 'xcode5_compatible'`
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
case "game_center":
|
|
97
|
+
switch (value) {
|
|
98
|
+
case "mac":
|
|
99
|
+
return wrap("GAME_CENTER_SETTING", "GAME_CENTER_MAC");
|
|
100
|
+
case "ios":
|
|
101
|
+
return wrap("GAME_CENTER_SETTING", "GAME_CENTER_IOS");
|
|
102
|
+
default:
|
|
103
|
+
throw new Error(
|
|
104
|
+
`Unknown value for game_center: '${value}'. Valid values: 'ios', 'mac'`
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
case "sign_in_with_apple":
|
|
108
|
+
return wrap("APPLE_ID_AUTH_APP_CONSENT", "PRIMARY_APP_CONSENT");
|
|
109
|
+
default:
|
|
110
|
+
return void 0;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async function registerBundleId(options) {
|
|
114
|
+
const existing = await options.client.bundleIds.find(options.identifier);
|
|
115
|
+
if (existing) return existing;
|
|
116
|
+
return options.client.bundleIds.create({
|
|
117
|
+
identifier: options.identifier,
|
|
118
|
+
name: options.name,
|
|
119
|
+
platform: options.platform ?? "IOS"
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
async function addCapability(options) {
|
|
123
|
+
await options.client.capabilities.enable({
|
|
124
|
+
bundleIdId: options.bundleIdId,
|
|
125
|
+
capabilityType: options.capabilityType,
|
|
126
|
+
settings: options.settings
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
async function removeCapability(options) {
|
|
130
|
+
await options.client.capabilities.disable(options.capabilityId);
|
|
131
|
+
}
|
|
132
|
+
async function listCapabilities(options) {
|
|
133
|
+
return options.client.capabilities.listForBundleId(options.bundleIdId);
|
|
134
|
+
}
|
|
135
|
+
async function enableServices(options) {
|
|
136
|
+
const entries = Array.isArray(
|
|
137
|
+
options.services
|
|
138
|
+
) ? options.services.map((s) => [s, true]) : Object.entries(options.services);
|
|
139
|
+
for (const [service, value] of entries) {
|
|
140
|
+
if (value === false) continue;
|
|
141
|
+
const capType = SERVICE_NAME_TO_CAPABILITY[service];
|
|
142
|
+
if (!capType) continue;
|
|
143
|
+
const settings = buildCapabilitySettings(service, value);
|
|
144
|
+
await addCapability({
|
|
145
|
+
client: options.client,
|
|
146
|
+
bundleIdId: options.bundleIdId,
|
|
147
|
+
capabilityType: capType,
|
|
148
|
+
settings
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
async function createApp(options) {
|
|
153
|
+
const existing = await options.client.apps.findByBundleId(options.bundleIdentifier);
|
|
154
|
+
if (existing) return existing;
|
|
155
|
+
const bundleId = await registerBundleId({
|
|
156
|
+
client: options.client,
|
|
157
|
+
identifier: options.bundleIdentifier,
|
|
158
|
+
name: options.appName,
|
|
159
|
+
platform: options.platform
|
|
160
|
+
});
|
|
161
|
+
if (options.enableServices) {
|
|
162
|
+
for (const service of options.enableServices) {
|
|
163
|
+
await addCapability({
|
|
164
|
+
client: options.client,
|
|
165
|
+
bundleIdId: bundleId.id,
|
|
166
|
+
capabilityType: service
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
const sku = options.sku ?? `${options.bundleIdentifier}.${Date.now()}`;
|
|
171
|
+
const primaryLocale = options.primaryLocale ?? "en-US";
|
|
172
|
+
const response = await options.client.http.post("/v1/apps", {
|
|
173
|
+
data: {
|
|
174
|
+
type: "apps",
|
|
175
|
+
attributes: {
|
|
176
|
+
bundleId: options.bundleIdentifier,
|
|
177
|
+
name: options.appName,
|
|
178
|
+
sku,
|
|
179
|
+
primaryLocale
|
|
180
|
+
},
|
|
181
|
+
relationships: {
|
|
182
|
+
bundleId: {
|
|
183
|
+
data: { type: "bundleIds", id: bundleId.id }
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
return response.data;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
exports.SERVICE_NAME_TO_CAPABILITY = SERVICE_NAME_TO_CAPABILITY;
|
|
192
|
+
exports.addCapability = addCapability;
|
|
193
|
+
exports.buildCapabilitySettings = buildCapabilitySettings;
|
|
194
|
+
exports.createApp = createApp;
|
|
195
|
+
exports.enableServices = enableServices;
|
|
196
|
+
exports.listCapabilities = listCapabilities;
|
|
197
|
+
exports.registerBundleId = registerBundleId;
|
|
198
|
+
exports.removeCapability = removeCapability;
|
|
199
|
+
//# sourceMappingURL=index.cjs.map
|
|
200
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/produce/index.ts"],"names":[],"mappings":";;;AAqBO,IAAM,0BAAA,GAA6D;AAAA,EACxE,WAAA,EAAa,yBAAA;AAAA,EACb,UAAA,EAAY,YAAA;AAAA;AAAA,EAEZ,SAAA,EAAW,YAAA;AAAA,EACX,SAAA,EAAW,WAAA;AAAA,EACX,kBAAA,EAAoB,oBAAA;AAAA,EACpB,oBAAA,EAAsB,8BAAA;AAAA,EACtB,kBAAA,EAAoB,0BAAA;AAAA,EACpB,sBAAA,EAAwB,mBAAA;AAAA,EACxB,uBAAA,EAAyB,oBAAA;AAAA,EACzB,yBAAA,EAA2B,cAAA;AAAA,EAC3B,SAAA,EAAW,UAAA;AAAA,EACX,kBAAA,EAAoB,oBAAA;AAAA,EACpB,MAAA,EAAQ,QAAA;AAAA,EACR,eAAA,EAAiB,iBAAA;AAAA,EACjB,uBAAA,EAAyB,yBAAA;AAAA,EACzB,eAAA,EAAiB,iBAAA;AAAA,EACjB,8BAAA,EAAgC,6BAAA;AAAA,EAChC,0BAAA,EAA4B,0BAAA;AAAA,EAC5B,eAAA,EAAiB,iBAAA;AAAA,EACjB,KAAA,EAAO,mBAAA;AAAA,EACP,WAAA,EAAa,aAAA;AAAA,EACb,UAAA,EAAY,WAAA;AAAA,EACZ,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,QAAA,EAAU,SAAA;AAAA,EACV,OAAA,EAAS,UAAA;AAAA,EACT,cAAA,EAAgB,wBAAA;AAAA,EAChB,eAAA,EAAiB,iBAAA;AAAA,EACjB,eAAA,EAAiB,iBAAA;AAAA,EACjB,eAAA,EAAiB,2BAAA;AAAA,EACjB,0BAAA,EAA4B,gCAAA;AAAA,EAC5B,IAAA,EAAM,MAAA;AAAA,EACN,SAAA,EAAW,WAAA;AAAA,EACX,iBAAA,EAAmB,oBAAA;AAAA,EACnB,eAAA,EAAiB,iBAAA;AAAA,EACjB,YAAA,EAAc,cAAA;AAAA,EACd,iBAAA,EAAmB,oBAAA;AAAA,EACnB,kBAAA,EAAoB,eAAA;AAAA,EACpB,QAAA,EAAU,SAAA;AAAA,EACV,gBAAA,EAAkB,0BAAA;AAAA,EAClB,eAAA,EAAiB,iBAAA;AAAA,EACjB,MAAA,EAAQ,QAAA;AAAA,EACR,kBAAA,EAAoB,kCAAA;AAAA,EACpB,UAAA,EAAY,WAAA;AAAA,EACZ,4BAAA,EAA8B,6BAAA;AAAA,EAC9B,4BAAA,EAA8B,sBAAA;AAAA,EAC9B,4BAAA,EAA8B,sBAAA;AAAA,EAC9B,wBAAA,EAA0B,kBAAA;AAAA,EAC1B,4BAAA,EAA8B,6BAAA;AAAA,EAC9B,wBAAA,EAA0B,eAAA;AAAA,EAC1B,0BAAA,EAA4B,0BAAA;AAAA,EAC5B,qBAAA,EAAuB,qBAAA;AAAA,EACvB,WAAA,EAAa,aAAA;AAAA,EACb,SAAA,EAAW,WAAA;AAAA,EACX,UAAA,EAAY,YAAA;AAAA,EACZ,2BAAA,EAA6B,iCAAA;AAAA,EAC7B,gBAAA,EAAkB,kBAAA;AAAA,EAClB,iCAAA,EAAmC,iCAAA;AAAA,EACnC,4BAAA,EAA8B;AAChC;AAUO,SAAS,uBAAA,CACd,aACA,KAAA,EACsC;AACtC,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,KAAA,EAAO,OAAO,MAAA;AAE9C,EAAA,MAAM,IAAA,GAAO,CACX,GAAA,EACA,SAAA,KAC6B,CAAC,EAAE,GAAA,EAAK,OAAA,EAAS,CAAC,EAAE,GAAA,EAAK,SAAA,EAAW,GAAG,CAAA;AAEtE,EAAA,QAAQ,WAAA;AAAa,IACnB,KAAK,iBAAA;AACH,MAAA,QAAQ,KAAA;AAAO,QACb,KAAK,UAAA;AACH,UAAA,OAAO,IAAA,CAAK,oCAAoC,qBAAqB,CAAA;AAAA,QACvE,KAAK,YAAA;AACH,UAAA,OAAO,IAAA,CAAK,oCAAoC,uBAAuB,CAAA;AAAA,QACzE,KAAK,gBAAA;AACH,UAAA,OAAO,IAAA;AAAA,YACL,kCAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AACE,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,uCAAuC,KAAK,CAAA,2DAAA;AAAA,WAC9C;AAAA;AACJ,IACF,KAAK,QAAA;AACH,MAAA,QAAQ,KAAA;AAAO,QACb,KAAK,mBAAA;AACH,UAAA,OAAO,IAAA,CAAK,kBAAkB,SAAS,CAAA;AAAA,QACzC,KAAK,mBAAA;AACH,UAAA,OAAO,IAAA,CAAK,kBAAkB,SAAS,CAAA;AAAA,QACzC;AACE,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,8BAA8B,KAAK,CAAA,yDAAA;AAAA,WACrC;AAAA;AACJ,IACF,KAAK,aAAA;AACH,MAAA,QAAQ,KAAA;AAAO,QACb,KAAK,KAAA;AACH,UAAA,OAAO,IAAA,CAAK,uBAAuB,iBAAiB,CAAA;AAAA,QACtD,KAAK,KAAA;AACH,UAAA,OAAO,IAAA,CAAK,uBAAuB,iBAAiB,CAAA;AAAA,QACtD;AACE,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,mCAAmC,KAAK,CAAA,6BAAA;AAAA,WAC1C;AAAA;AACJ,IACF,KAAK,oBAAA;AACH,MAAA,OAAO,IAAA,CAAK,6BAA6B,qBAAqB,CAAA;AAAA,IAChE;AACE,MAAA,OAAO,MAAA;AAAA;AAEb;AAEA,eAAsB,iBAAiB,OAAA,EAKjB;AAEpB,EAAA,MAAM,WAAW,MAAM,OAAA,CAAQ,OAAO,SAAA,CAAU,IAAA,CAAK,QAAQ,UAAU,CAAA;AACvE,EAAA,IAAI,UAAU,OAAO,QAAA;AAErB,EAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU,MAAA,CAAO;AAAA,IACrC,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,QAAA,EAAU,QAAQ,QAAA,IAAY;AAAA,GAC/B,CAAA;AACH;AAEA,eAAsB,cAAc,OAAA,EAKlB;AAChB,EAAA,MAAM,OAAA,CAAQ,MAAA,CAAO,YAAA,CAAa,MAAA,CAAO;AAAA,IACvC,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,gBAAgB,OAAA,CAAQ,cAAA;AAAA,IACxB,UAAU,OAAA,CAAQ;AAAA,GACnB,CAAA;AACH;AAEA,eAAsB,iBAAiB,OAAA,EAGrB;AAChB,EAAA,MAAM,OAAA,CAAQ,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,QAAQ,YAAY,CAAA;AAChE;AAEA,eAAsB,iBAAiB,OAAA,EAGpC;AACD,EAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,YAAA,CAAa,eAAA,CAAgB,QAAQ,UAAU,CAAA;AACvE;AAEA,eAAsB,eAAe,OAAA,EAUnB;AAChB,EAAA,MAAM,UAA6C,KAAA,CAAM,OAAA;AAAA,IACvD,OAAA,CAAQ;AAAA,GACV,GACI,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,EAAG,IAAI,CAAC,CAAA,GACrC,MAAA,CAAO,OAAA,CAAQ,QAAQ,QAAQ,CAAA;AAEnC,EAAA,KAAA,MAAW,CAAC,OAAA,EAAS,KAAK,CAAA,IAAK,OAAA,EAAS;AACtC,IAAA,IAAI,UAAU,KAAA,EAAO;AACrB,IAAA,MAAM,OAAA,GAAU,2BAA2B,OAAO,CAAA;AAClD,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,QAAA,GAAW,uBAAA,CAAwB,OAAA,EAAS,KAAK,CAAA;AACvD,IAAA,MAAM,aAAA,CAAc;AAAA,MAClB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,cAAA,EAAgB,OAAA;AAAA,MAChB;AAAA,KACD,CAAA;AAAA,EACH;AACF;AAEA,eAAsB,UAAU,OAAA,EAAuC;AAErE,EAAA,MAAM,WAAW,MAAM,OAAA,CAAQ,OAAO,IAAA,CAAK,cAAA,CAAe,QAAQ,gBAAgB,CAAA;AAClF,EAAA,IAAI,UAAU,OAAO,QAAA;AAGrB,EAAA,MAAM,QAAA,GAAW,MAAM,gBAAA,CAAiB;AAAA,IACtC,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,YAAY,OAAA,CAAQ,gBAAA;AAAA,IACpB,MAAM,OAAA,CAAQ,OAAA;AAAA,IACd,UAAU,OAAA,CAAQ;AAAA,GACnB,CAAA;AAGD,EAAA,IAAI,QAAQ,cAAA,EAAgB;AAC1B,IAAA,KAAA,MAAW,OAAA,IAAW,QAAQ,cAAA,EAAgB;AAC5C,MAAA,MAAM,aAAA,CAAc;AAAA,QAClB,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,YAAY,QAAA,CAAS,EAAA;AAAA,QACrB,cAAA,EAAgB;AAAA,OACjB,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,IAAO,CAAA,EAAG,QAAQ,gBAAgB,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AACpE,EAAA,MAAM,aAAA,GAAgB,QAAQ,aAAA,IAAiB,OAAA;AAE/C,EAAA,MAAM,WAAW,MAAM,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,KAAU,UAAA,EAAY;AAAA,IAC/D,IAAA,EAAM;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,UAAU,OAAA,CAAQ,gBAAA;AAAA,QAClB,MAAM,OAAA,CAAQ,OAAA;AAAA,QACd,GAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,aAAA,EAAe;AAAA,QACb,QAAA,EAAU;AAAA,UACR,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,EAAA,EAAI,SAAS,EAAA;AAAG;AAC7C;AACF;AACF,GACD,CAAA;AAED,EAAA,OAAO,QAAA,CAAS,IAAA;AAClB","file":"index.cjs","sourcesContent":["import type { AppStoreConnectClient } from \"../client/index.js\";\nimport type { BundleId, App, BundleIdPlatform, CapabilityType } from \"../types/index.js\";\nimport type { CapabilitySettingInput } from \"../types/capability.js\";\n\nexport interface ProduceOptions {\n client: AppStoreConnectClient;\n bundleIdentifier: string;\n appName: string;\n platform?: BundleIdPlatform;\n sku?: string;\n primaryLocale?: string;\n companyName?: string;\n enableServices?: CapabilityType[];\n}\n\n/**\n * Map from Fastlane's `produce` service name → App Store Connect\n * `capabilityType`. Ported 1:1 from `produce/lib/produce/service.rb`'s\n * `valid_services_for` list and `update` method, covering every service\n * that Fastlane supports.\n */\nexport const SERVICE_NAME_TO_CAPABILITY: Record<string, CapabilityType> = {\n access_wifi: \"ACCESS_WIFI_INFORMATION\",\n app_attest: \"APP_ATTEST\",\n // Fastlane uses singular `app_group` — see service.rb line 59 & 105.\n app_group: \"APP_GROUPS\",\n apple_pay: \"APPLE_PAY\",\n associated_domains: \"ASSOCIATED_DOMAINS\",\n auto_fill_credential: \"AUTOFILL_CREDENTIAL_PROVIDER\",\n car_play_audio_app: \"CARPLAY_PLAYABLE_CONTENT\",\n car_play_messaging_app: \"CARPLAY_MESSAGING\",\n car_play_navigation_app: \"CARPLAY_NAVIGATION\",\n car_play_voip_calling_app: \"CARPLAY_VOIP\",\n class_kit: \"CLASSKIT\",\n declared_age_range: \"DECLARED_AGE_RANGE\",\n icloud: \"ICLOUD\",\n critical_alerts: \"CRITICAL_ALERTS\",\n custom_network_protocol: \"NETWORK_CUSTOM_PROTOCOL\",\n data_protection: \"DATA_PROTECTION\",\n extended_virtual_address_space: \"EXTENDED_VIRTUAL_ADDRESSING\",\n file_provider_testing_mode: \"FILEPROVIDER_TESTINGMODE\",\n family_controls: \"FAMILY_CONTROLS\",\n fonts: \"FONT_INSTALLATION\",\n game_center: \"GAME_CENTER\",\n health_kit: \"HEALTHKIT\",\n hls_interstitial_preview: \"HLS_INTERSTITIAL_PREVIEW\",\n home_kit: \"HOMEKIT\",\n hotspot: \"HOT_SPOT\",\n hotspot_helper: \"HOTSPOT_HELPER_MANAGED\",\n in_app_purchase: \"IN_APP_PURCHASE\",\n inter_app_audio: \"INTER_APP_AUDIO\",\n low_latency_hls: \"COREMEDIA_HLS_LOW_LATENCY\",\n managed_associated_domains: \"MDM_MANAGED_ASSOCIATED_DOMAINS\",\n maps: \"MAPS\",\n multipath: \"MULTIPATH\",\n network_extension: \"NETWORK_EXTENSIONS\",\n nfc_tag_reading: \"NFC_TAG_READING\",\n personal_vpn: \"PERSONAL_VPN\",\n push_notification: \"PUSH_NOTIFICATIONS\",\n sign_in_with_apple: \"APPLE_ID_AUTH\",\n siri_kit: \"SIRIKIT\",\n system_extension: \"SYSTEM_EXTENSION_INSTALL\",\n user_management: \"USER_MANAGEMENT\",\n wallet: \"WALLET\",\n wireless_accessory: \"WIRELESS_ACCESSORY_CONFIGURATION\",\n driver_kit: \"DRIVERKIT\",\n driver_kit_endpoint_security: \"DRIVERKIT_ENDPOINT_SECURITY\",\n driver_kit_family_hid_device: \"DRIVERKIT_HID_DEVICE\",\n driver_kit_family_networking: \"DRIVERKIT_NETWORKING\",\n driver_kit_family_serial: \"DRIVERKIT_SERIAL\",\n driver_kit_hid_event_service: \"DRIVERKIT_HID_EVENT_SERVICE\",\n driver_kit_transport_hid: \"DRIVERKIT_HID\",\n multitasking_camera_access: \"IPAD_CAMERA_MULTITASKING\",\n sf_universal_link_api: \"SFUNIVERSALLINK_API\",\n vp9_decoder: \"VP9_DECODER\",\n music_kit: \"MUSIC_KIT\",\n shazam_kit: \"SHAZAM_KIT\",\n communication_notifications: \"USERNOTIFICATIONS_COMMUNICATION\",\n group_activities: \"GROUP_ACTIVITIES\",\n health_kit_estimate_recalibration: \"HEALTHKIT_RECALIBRATE_ESTIMATES\",\n time_sensitive_notifications: \"USERNOTIFICATIONS_TIMESENSITIVE\",\n};\n\n/**\n * Build the `settings` payload for a capability whose service value is\n * more than a plain boolean. Mirrors Fastlane's\n * `Produce::Service#build_settings_for` applied per-service.\n *\n * Returns `undefined` when the service doesn't carry settings or the\n * value is just `true`/`false`.\n */\nexport function buildCapabilitySettings(\n serviceName: string,\n value: string | boolean\n): CapabilitySettingInput[] | undefined {\n if (value === true || value === false) return undefined;\n\n const wrap = (\n key: string,\n optionKey: string\n ): CapabilitySettingInput[] => [{ key, options: [{ key: optionKey }] }];\n\n switch (serviceName) {\n case \"data_protection\":\n switch (value) {\n case \"complete\":\n return wrap(\"DATA_PROTECTION_PERMISSION_LEVEL\", \"COMPLETE_PROTECTION\");\n case \"unlessopen\":\n return wrap(\"DATA_PROTECTION_PERMISSION_LEVEL\", \"PROTECTED_UNLESS_OPEN\");\n case \"untilfirstauth\":\n return wrap(\n \"DATA_PROTECTION_PERMISSION_LEVEL\",\n \"PROTECTED_UNTIL_FIRST_USER_AUTH\"\n );\n default:\n throw new Error(\n `Unknown value for data_protection: '${value}'. Valid values: 'complete', 'unlessopen', 'untilfirstauth'`\n );\n }\n case \"icloud\":\n switch (value) {\n case \"xcode6_compatible\":\n return wrap(\"ICLOUD_VERSION\", \"XCODE_6\");\n case \"xcode5_compatible\":\n return wrap(\"ICLOUD_VERSION\", \"XCODE_5\");\n default:\n throw new Error(\n `Unknown value for icloud: '${value}'. Valid values: 'xcode6_compatible', 'xcode5_compatible'`\n );\n }\n case \"game_center\":\n switch (value) {\n case \"mac\":\n return wrap(\"GAME_CENTER_SETTING\", \"GAME_CENTER_MAC\");\n case \"ios\":\n return wrap(\"GAME_CENTER_SETTING\", \"GAME_CENTER_IOS\");\n default:\n throw new Error(\n `Unknown value for game_center: '${value}'. Valid values: 'ios', 'mac'`\n );\n }\n case \"sign_in_with_apple\":\n return wrap(\"APPLE_ID_AUTH_APP_CONSENT\", \"PRIMARY_APP_CONSENT\");\n default:\n return undefined;\n }\n}\n\nexport async function registerBundleId(options: {\n client: AppStoreConnectClient;\n identifier: string;\n name: string;\n platform?: BundleIdPlatform;\n}): Promise<BundleId> {\n // Check if already exists (idempotent)\n const existing = await options.client.bundleIds.find(options.identifier);\n if (existing) return existing;\n\n return options.client.bundleIds.create({\n identifier: options.identifier,\n name: options.name,\n platform: options.platform ?? \"IOS\",\n });\n}\n\nexport async function addCapability(options: {\n client: AppStoreConnectClient;\n bundleIdId: string;\n capabilityType: CapabilityType;\n settings?: CapabilitySettingInput[];\n}): Promise<void> {\n await options.client.capabilities.enable({\n bundleIdId: options.bundleIdId,\n capabilityType: options.capabilityType,\n settings: options.settings,\n });\n}\n\nexport async function removeCapability(options: {\n client: AppStoreConnectClient;\n capabilityId: string;\n}): Promise<void> {\n await options.client.capabilities.disable(options.capabilityId);\n}\n\nexport async function listCapabilities(options: {\n client: AppStoreConnectClient;\n bundleIdId: string;\n}) {\n return options.client.capabilities.listForBundleId(options.bundleIdId);\n}\n\nexport async function enableServices(options: {\n client: AppStoreConnectClient;\n bundleIdId: string;\n /**\n * Service names (Fastlane style, e.g. `data_protection`, `icloud`).\n * Pass either a plain list of names or a record of name → value, where\n * the value either is `true` or one of the per-service variants handled\n * by `buildCapabilitySettings`.\n */\n services: string[] | Record<string, string | boolean>;\n}): Promise<void> {\n const entries: Array<[string, string | boolean]> = Array.isArray(\n options.services\n )\n ? options.services.map((s) => [s, true])\n : Object.entries(options.services);\n\n for (const [service, value] of entries) {\n if (value === false) continue;\n const capType = SERVICE_NAME_TO_CAPABILITY[service];\n if (!capType) continue;\n const settings = buildCapabilitySettings(service, value);\n await addCapability({\n client: options.client,\n bundleIdId: options.bundleIdId,\n capabilityType: capType,\n settings,\n });\n }\n}\n\nexport async function createApp(options: ProduceOptions): Promise<App> {\n // Check if app already exists\n const existing = await options.client.apps.findByBundleId(options.bundleIdentifier);\n if (existing) return existing;\n\n // Register bundle ID\n const bundleId = await registerBundleId({\n client: options.client,\n identifier: options.bundleIdentifier,\n name: options.appName,\n platform: options.platform,\n });\n\n // Enable services\n if (options.enableServices) {\n for (const service of options.enableServices) {\n await addCapability({\n client: options.client,\n bundleIdId: bundleId.id,\n capabilityType: service,\n });\n }\n }\n\n // Create app on App Store Connect\n const sku = options.sku ?? `${options.bundleIdentifier}.${Date.now()}`;\n const primaryLocale = options.primaryLocale ?? \"en-US\";\n\n const response = await options.client.http.post<any>(\"/v1/apps\", {\n data: {\n type: \"apps\",\n attributes: {\n bundleId: options.bundleIdentifier,\n name: options.appName,\n sku,\n primaryLocale,\n },\n relationships: {\n bundleId: {\n data: { type: \"bundleIds\", id: bundleId.id },\n },\n },\n },\n });\n\n return response.data;\n}\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import '../index-BLubSlgK.cjs';
|
|
2
|
+
import '../enums-B609j2rb.cjs';
|
|
3
|
+
export { P as ProduceOptions, S as SERVICE_NAME_TO_CAPABILITY, a as addCapability, b as buildCapabilitySettings, d as createApp, e as enableServices, l as listCapabilities, r as registerBundleId, c as removeCapability } from '../index-D5eihzwM.cjs';
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import '../index-D1Izm7qt.js';
|
|
2
|
+
import '../enums-B609j2rb.js';
|
|
3
|
+
export { P as ProduceOptions, S as SERVICE_NAME_TO_CAPABILITY, a as addCapability, b as buildCapabilitySettings, d as createApp, e as enableServices, l as listCapabilities, r as registerBundleId, c as removeCapability } from '../index-B0yhu_LZ.js';
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
// src/produce/index.ts
|
|
2
|
+
var SERVICE_NAME_TO_CAPABILITY = {
|
|
3
|
+
access_wifi: "ACCESS_WIFI_INFORMATION",
|
|
4
|
+
app_attest: "APP_ATTEST",
|
|
5
|
+
// Fastlane uses singular `app_group` — see service.rb line 59 & 105.
|
|
6
|
+
app_group: "APP_GROUPS",
|
|
7
|
+
apple_pay: "APPLE_PAY",
|
|
8
|
+
associated_domains: "ASSOCIATED_DOMAINS",
|
|
9
|
+
auto_fill_credential: "AUTOFILL_CREDENTIAL_PROVIDER",
|
|
10
|
+
car_play_audio_app: "CARPLAY_PLAYABLE_CONTENT",
|
|
11
|
+
car_play_messaging_app: "CARPLAY_MESSAGING",
|
|
12
|
+
car_play_navigation_app: "CARPLAY_NAVIGATION",
|
|
13
|
+
car_play_voip_calling_app: "CARPLAY_VOIP",
|
|
14
|
+
class_kit: "CLASSKIT",
|
|
15
|
+
declared_age_range: "DECLARED_AGE_RANGE",
|
|
16
|
+
icloud: "ICLOUD",
|
|
17
|
+
critical_alerts: "CRITICAL_ALERTS",
|
|
18
|
+
custom_network_protocol: "NETWORK_CUSTOM_PROTOCOL",
|
|
19
|
+
data_protection: "DATA_PROTECTION",
|
|
20
|
+
extended_virtual_address_space: "EXTENDED_VIRTUAL_ADDRESSING",
|
|
21
|
+
file_provider_testing_mode: "FILEPROVIDER_TESTINGMODE",
|
|
22
|
+
family_controls: "FAMILY_CONTROLS",
|
|
23
|
+
fonts: "FONT_INSTALLATION",
|
|
24
|
+
game_center: "GAME_CENTER",
|
|
25
|
+
health_kit: "HEALTHKIT",
|
|
26
|
+
hls_interstitial_preview: "HLS_INTERSTITIAL_PREVIEW",
|
|
27
|
+
home_kit: "HOMEKIT",
|
|
28
|
+
hotspot: "HOT_SPOT",
|
|
29
|
+
hotspot_helper: "HOTSPOT_HELPER_MANAGED",
|
|
30
|
+
in_app_purchase: "IN_APP_PURCHASE",
|
|
31
|
+
inter_app_audio: "INTER_APP_AUDIO",
|
|
32
|
+
low_latency_hls: "COREMEDIA_HLS_LOW_LATENCY",
|
|
33
|
+
managed_associated_domains: "MDM_MANAGED_ASSOCIATED_DOMAINS",
|
|
34
|
+
maps: "MAPS",
|
|
35
|
+
multipath: "MULTIPATH",
|
|
36
|
+
network_extension: "NETWORK_EXTENSIONS",
|
|
37
|
+
nfc_tag_reading: "NFC_TAG_READING",
|
|
38
|
+
personal_vpn: "PERSONAL_VPN",
|
|
39
|
+
push_notification: "PUSH_NOTIFICATIONS",
|
|
40
|
+
sign_in_with_apple: "APPLE_ID_AUTH",
|
|
41
|
+
siri_kit: "SIRIKIT",
|
|
42
|
+
system_extension: "SYSTEM_EXTENSION_INSTALL",
|
|
43
|
+
user_management: "USER_MANAGEMENT",
|
|
44
|
+
wallet: "WALLET",
|
|
45
|
+
wireless_accessory: "WIRELESS_ACCESSORY_CONFIGURATION",
|
|
46
|
+
driver_kit: "DRIVERKIT",
|
|
47
|
+
driver_kit_endpoint_security: "DRIVERKIT_ENDPOINT_SECURITY",
|
|
48
|
+
driver_kit_family_hid_device: "DRIVERKIT_HID_DEVICE",
|
|
49
|
+
driver_kit_family_networking: "DRIVERKIT_NETWORKING",
|
|
50
|
+
driver_kit_family_serial: "DRIVERKIT_SERIAL",
|
|
51
|
+
driver_kit_hid_event_service: "DRIVERKIT_HID_EVENT_SERVICE",
|
|
52
|
+
driver_kit_transport_hid: "DRIVERKIT_HID",
|
|
53
|
+
multitasking_camera_access: "IPAD_CAMERA_MULTITASKING",
|
|
54
|
+
sf_universal_link_api: "SFUNIVERSALLINK_API",
|
|
55
|
+
vp9_decoder: "VP9_DECODER",
|
|
56
|
+
music_kit: "MUSIC_KIT",
|
|
57
|
+
shazam_kit: "SHAZAM_KIT",
|
|
58
|
+
communication_notifications: "USERNOTIFICATIONS_COMMUNICATION",
|
|
59
|
+
group_activities: "GROUP_ACTIVITIES",
|
|
60
|
+
health_kit_estimate_recalibration: "HEALTHKIT_RECALIBRATE_ESTIMATES",
|
|
61
|
+
time_sensitive_notifications: "USERNOTIFICATIONS_TIMESENSITIVE"
|
|
62
|
+
};
|
|
63
|
+
function buildCapabilitySettings(serviceName, value) {
|
|
64
|
+
if (value === true || value === false) return void 0;
|
|
65
|
+
const wrap = (key, optionKey) => [{ key, options: [{ key: optionKey }] }];
|
|
66
|
+
switch (serviceName) {
|
|
67
|
+
case "data_protection":
|
|
68
|
+
switch (value) {
|
|
69
|
+
case "complete":
|
|
70
|
+
return wrap("DATA_PROTECTION_PERMISSION_LEVEL", "COMPLETE_PROTECTION");
|
|
71
|
+
case "unlessopen":
|
|
72
|
+
return wrap("DATA_PROTECTION_PERMISSION_LEVEL", "PROTECTED_UNLESS_OPEN");
|
|
73
|
+
case "untilfirstauth":
|
|
74
|
+
return wrap(
|
|
75
|
+
"DATA_PROTECTION_PERMISSION_LEVEL",
|
|
76
|
+
"PROTECTED_UNTIL_FIRST_USER_AUTH"
|
|
77
|
+
);
|
|
78
|
+
default:
|
|
79
|
+
throw new Error(
|
|
80
|
+
`Unknown value for data_protection: '${value}'. Valid values: 'complete', 'unlessopen', 'untilfirstauth'`
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
case "icloud":
|
|
84
|
+
switch (value) {
|
|
85
|
+
case "xcode6_compatible":
|
|
86
|
+
return wrap("ICLOUD_VERSION", "XCODE_6");
|
|
87
|
+
case "xcode5_compatible":
|
|
88
|
+
return wrap("ICLOUD_VERSION", "XCODE_5");
|
|
89
|
+
default:
|
|
90
|
+
throw new Error(
|
|
91
|
+
`Unknown value for icloud: '${value}'. Valid values: 'xcode6_compatible', 'xcode5_compatible'`
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
case "game_center":
|
|
95
|
+
switch (value) {
|
|
96
|
+
case "mac":
|
|
97
|
+
return wrap("GAME_CENTER_SETTING", "GAME_CENTER_MAC");
|
|
98
|
+
case "ios":
|
|
99
|
+
return wrap("GAME_CENTER_SETTING", "GAME_CENTER_IOS");
|
|
100
|
+
default:
|
|
101
|
+
throw new Error(
|
|
102
|
+
`Unknown value for game_center: '${value}'. Valid values: 'ios', 'mac'`
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
case "sign_in_with_apple":
|
|
106
|
+
return wrap("APPLE_ID_AUTH_APP_CONSENT", "PRIMARY_APP_CONSENT");
|
|
107
|
+
default:
|
|
108
|
+
return void 0;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async function registerBundleId(options) {
|
|
112
|
+
const existing = await options.client.bundleIds.find(options.identifier);
|
|
113
|
+
if (existing) return existing;
|
|
114
|
+
return options.client.bundleIds.create({
|
|
115
|
+
identifier: options.identifier,
|
|
116
|
+
name: options.name,
|
|
117
|
+
platform: options.platform ?? "IOS"
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
async function addCapability(options) {
|
|
121
|
+
await options.client.capabilities.enable({
|
|
122
|
+
bundleIdId: options.bundleIdId,
|
|
123
|
+
capabilityType: options.capabilityType,
|
|
124
|
+
settings: options.settings
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
async function removeCapability(options) {
|
|
128
|
+
await options.client.capabilities.disable(options.capabilityId);
|
|
129
|
+
}
|
|
130
|
+
async function listCapabilities(options) {
|
|
131
|
+
return options.client.capabilities.listForBundleId(options.bundleIdId);
|
|
132
|
+
}
|
|
133
|
+
async function enableServices(options) {
|
|
134
|
+
const entries = Array.isArray(
|
|
135
|
+
options.services
|
|
136
|
+
) ? options.services.map((s) => [s, true]) : Object.entries(options.services);
|
|
137
|
+
for (const [service, value] of entries) {
|
|
138
|
+
if (value === false) continue;
|
|
139
|
+
const capType = SERVICE_NAME_TO_CAPABILITY[service];
|
|
140
|
+
if (!capType) continue;
|
|
141
|
+
const settings = buildCapabilitySettings(service, value);
|
|
142
|
+
await addCapability({
|
|
143
|
+
client: options.client,
|
|
144
|
+
bundleIdId: options.bundleIdId,
|
|
145
|
+
capabilityType: capType,
|
|
146
|
+
settings
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async function createApp(options) {
|
|
151
|
+
const existing = await options.client.apps.findByBundleId(options.bundleIdentifier);
|
|
152
|
+
if (existing) return existing;
|
|
153
|
+
const bundleId = await registerBundleId({
|
|
154
|
+
client: options.client,
|
|
155
|
+
identifier: options.bundleIdentifier,
|
|
156
|
+
name: options.appName,
|
|
157
|
+
platform: options.platform
|
|
158
|
+
});
|
|
159
|
+
if (options.enableServices) {
|
|
160
|
+
for (const service of options.enableServices) {
|
|
161
|
+
await addCapability({
|
|
162
|
+
client: options.client,
|
|
163
|
+
bundleIdId: bundleId.id,
|
|
164
|
+
capabilityType: service
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const sku = options.sku ?? `${options.bundleIdentifier}.${Date.now()}`;
|
|
169
|
+
const primaryLocale = options.primaryLocale ?? "en-US";
|
|
170
|
+
const response = await options.client.http.post("/v1/apps", {
|
|
171
|
+
data: {
|
|
172
|
+
type: "apps",
|
|
173
|
+
attributes: {
|
|
174
|
+
bundleId: options.bundleIdentifier,
|
|
175
|
+
name: options.appName,
|
|
176
|
+
sku,
|
|
177
|
+
primaryLocale
|
|
178
|
+
},
|
|
179
|
+
relationships: {
|
|
180
|
+
bundleId: {
|
|
181
|
+
data: { type: "bundleIds", id: bundleId.id }
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
return response.data;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export { SERVICE_NAME_TO_CAPABILITY, addCapability, buildCapabilitySettings, createApp, enableServices, listCapabilities, registerBundleId, removeCapability };
|
|
190
|
+
//# sourceMappingURL=index.mjs.map
|
|
191
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/produce/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type { AppStoreConnectClient } from \"../client/index.js\";\nimport type { BundleId, App, BundleIdPlatform, CapabilityType } from \"../types/index.js\";\nimport type { CapabilitySettingInput } from \"../types/capability.js\";\n\nexport interface ProduceOptions {\n client: AppStoreConnectClient;\n bundleIdentifier: string;\n appName: string;\n platform?: BundleIdPlatform;\n sku?: string;\n primaryLocale?: string;\n companyName?: string;\n enableServices?: CapabilityType[];\n}\n\n/**\n * Map from Fastlane's `produce` service name → App Store Connect\n * `capabilityType`. Ported 1:1 from `produce/lib/produce/service.rb`'s\n * `valid_services_for` list and `update` method, covering every service\n * that Fastlane supports.\n */\nexport const SERVICE_NAME_TO_CAPABILITY: Record<string, CapabilityType> = {\n access_wifi: \"ACCESS_WIFI_INFORMATION\",\n app_attest: \"APP_ATTEST\",\n // Fastlane uses singular `app_group` — see service.rb line 59 & 105.\n app_group: \"APP_GROUPS\",\n apple_pay: \"APPLE_PAY\",\n associated_domains: \"ASSOCIATED_DOMAINS\",\n auto_fill_credential: \"AUTOFILL_CREDENTIAL_PROVIDER\",\n car_play_audio_app: \"CARPLAY_PLAYABLE_CONTENT\",\n car_play_messaging_app: \"CARPLAY_MESSAGING\",\n car_play_navigation_app: \"CARPLAY_NAVIGATION\",\n car_play_voip_calling_app: \"CARPLAY_VOIP\",\n class_kit: \"CLASSKIT\",\n declared_age_range: \"DECLARED_AGE_RANGE\",\n icloud: \"ICLOUD\",\n critical_alerts: \"CRITICAL_ALERTS\",\n custom_network_protocol: \"NETWORK_CUSTOM_PROTOCOL\",\n data_protection: \"DATA_PROTECTION\",\n extended_virtual_address_space: \"EXTENDED_VIRTUAL_ADDRESSING\",\n file_provider_testing_mode: \"FILEPROVIDER_TESTINGMODE\",\n family_controls: \"FAMILY_CONTROLS\",\n fonts: \"FONT_INSTALLATION\",\n game_center: \"GAME_CENTER\",\n health_kit: \"HEALTHKIT\",\n hls_interstitial_preview: \"HLS_INTERSTITIAL_PREVIEW\",\n home_kit: \"HOMEKIT\",\n hotspot: \"HOT_SPOT\",\n hotspot_helper: \"HOTSPOT_HELPER_MANAGED\",\n in_app_purchase: \"IN_APP_PURCHASE\",\n inter_app_audio: \"INTER_APP_AUDIO\",\n low_latency_hls: \"COREMEDIA_HLS_LOW_LATENCY\",\n managed_associated_domains: \"MDM_MANAGED_ASSOCIATED_DOMAINS\",\n maps: \"MAPS\",\n multipath: \"MULTIPATH\",\n network_extension: \"NETWORK_EXTENSIONS\",\n nfc_tag_reading: \"NFC_TAG_READING\",\n personal_vpn: \"PERSONAL_VPN\",\n push_notification: \"PUSH_NOTIFICATIONS\",\n sign_in_with_apple: \"APPLE_ID_AUTH\",\n siri_kit: \"SIRIKIT\",\n system_extension: \"SYSTEM_EXTENSION_INSTALL\",\n user_management: \"USER_MANAGEMENT\",\n wallet: \"WALLET\",\n wireless_accessory: \"WIRELESS_ACCESSORY_CONFIGURATION\",\n driver_kit: \"DRIVERKIT\",\n driver_kit_endpoint_security: \"DRIVERKIT_ENDPOINT_SECURITY\",\n driver_kit_family_hid_device: \"DRIVERKIT_HID_DEVICE\",\n driver_kit_family_networking: \"DRIVERKIT_NETWORKING\",\n driver_kit_family_serial: \"DRIVERKIT_SERIAL\",\n driver_kit_hid_event_service: \"DRIVERKIT_HID_EVENT_SERVICE\",\n driver_kit_transport_hid: \"DRIVERKIT_HID\",\n multitasking_camera_access: \"IPAD_CAMERA_MULTITASKING\",\n sf_universal_link_api: \"SFUNIVERSALLINK_API\",\n vp9_decoder: \"VP9_DECODER\",\n music_kit: \"MUSIC_KIT\",\n shazam_kit: \"SHAZAM_KIT\",\n communication_notifications: \"USERNOTIFICATIONS_COMMUNICATION\",\n group_activities: \"GROUP_ACTIVITIES\",\n health_kit_estimate_recalibration: \"HEALTHKIT_RECALIBRATE_ESTIMATES\",\n time_sensitive_notifications: \"USERNOTIFICATIONS_TIMESENSITIVE\",\n};\n\n/**\n * Build the `settings` payload for a capability whose service value is\n * more than a plain boolean. Mirrors Fastlane's\n * `Produce::Service#build_settings_for` applied per-service.\n *\n * Returns `undefined` when the service doesn't carry settings or the\n * value is just `true`/`false`.\n */\nexport function buildCapabilitySettings(\n serviceName: string,\n value: string | boolean\n): CapabilitySettingInput[] | undefined {\n if (value === true || value === false) return undefined;\n\n const wrap = (\n key: string,\n optionKey: string\n ): CapabilitySettingInput[] => [{ key, options: [{ key: optionKey }] }];\n\n switch (serviceName) {\n case \"data_protection\":\n switch (value) {\n case \"complete\":\n return wrap(\"DATA_PROTECTION_PERMISSION_LEVEL\", \"COMPLETE_PROTECTION\");\n case \"unlessopen\":\n return wrap(\"DATA_PROTECTION_PERMISSION_LEVEL\", \"PROTECTED_UNLESS_OPEN\");\n case \"untilfirstauth\":\n return wrap(\n \"DATA_PROTECTION_PERMISSION_LEVEL\",\n \"PROTECTED_UNTIL_FIRST_USER_AUTH\"\n );\n default:\n throw new Error(\n `Unknown value for data_protection: '${value}'. Valid values: 'complete', 'unlessopen', 'untilfirstauth'`\n );\n }\n case \"icloud\":\n switch (value) {\n case \"xcode6_compatible\":\n return wrap(\"ICLOUD_VERSION\", \"XCODE_6\");\n case \"xcode5_compatible\":\n return wrap(\"ICLOUD_VERSION\", \"XCODE_5\");\n default:\n throw new Error(\n `Unknown value for icloud: '${value}'. Valid values: 'xcode6_compatible', 'xcode5_compatible'`\n );\n }\n case \"game_center\":\n switch (value) {\n case \"mac\":\n return wrap(\"GAME_CENTER_SETTING\", \"GAME_CENTER_MAC\");\n case \"ios\":\n return wrap(\"GAME_CENTER_SETTING\", \"GAME_CENTER_IOS\");\n default:\n throw new Error(\n `Unknown value for game_center: '${value}'. Valid values: 'ios', 'mac'`\n );\n }\n case \"sign_in_with_apple\":\n return wrap(\"APPLE_ID_AUTH_APP_CONSENT\", \"PRIMARY_APP_CONSENT\");\n default:\n return undefined;\n }\n}\n\nexport async function registerBundleId(options: {\n client: AppStoreConnectClient;\n identifier: string;\n name: string;\n platform?: BundleIdPlatform;\n}): Promise<BundleId> {\n // Check if already exists (idempotent)\n const existing = await options.client.bundleIds.find(options.identifier);\n if (existing) return existing;\n\n return options.client.bundleIds.create({\n identifier: options.identifier,\n name: options.name,\n platform: options.platform ?? \"IOS\",\n });\n}\n\nexport async function addCapability(options: {\n client: AppStoreConnectClient;\n bundleIdId: string;\n capabilityType: CapabilityType;\n settings?: CapabilitySettingInput[];\n}): Promise<void> {\n await options.client.capabilities.enable({\n bundleIdId: options.bundleIdId,\n capabilityType: options.capabilityType,\n settings: options.settings,\n });\n}\n\nexport async function removeCapability(options: {\n client: AppStoreConnectClient;\n capabilityId: string;\n}): Promise<void> {\n await options.client.capabilities.disable(options.capabilityId);\n}\n\nexport async function listCapabilities(options: {\n client: AppStoreConnectClient;\n bundleIdId: string;\n}) {\n return options.client.capabilities.listForBundleId(options.bundleIdId);\n}\n\nexport async function enableServices(options: {\n client: AppStoreConnectClient;\n bundleIdId: string;\n /**\n * Service names (Fastlane style, e.g. `data_protection`, `icloud`).\n * Pass either a plain list of names or a record of name → value, where\n * the value either is `true` or one of the per-service variants handled\n * by `buildCapabilitySettings`.\n */\n services: string[] | Record<string, string | boolean>;\n}): Promise<void> {\n const entries: Array<[string, string | boolean]> = Array.isArray(\n options.services\n )\n ? options.services.map((s) => [s, true])\n : Object.entries(options.services);\n\n for (const [service, value] of entries) {\n if (value === false) continue;\n const capType = SERVICE_NAME_TO_CAPABILITY[service];\n if (!capType) continue;\n const settings = buildCapabilitySettings(service, value);\n await addCapability({\n client: options.client,\n bundleIdId: options.bundleIdId,\n capabilityType: capType,\n settings,\n });\n }\n}\n\nexport async function createApp(options: ProduceOptions): Promise<App> {\n // Check if app already exists\n const existing = await options.client.apps.findByBundleId(options.bundleIdentifier);\n if (existing) return existing;\n\n // Register bundle ID\n const bundleId = await registerBundleId({\n client: options.client,\n identifier: options.bundleIdentifier,\n name: options.appName,\n platform: options.platform,\n });\n\n // Enable services\n if (options.enableServices) {\n for (const service of options.enableServices) {\n await addCapability({\n client: options.client,\n bundleIdId: bundleId.id,\n capabilityType: service,\n });\n }\n }\n\n // Create app on App Store Connect\n const sku = options.sku ?? `${options.bundleIdentifier}.${Date.now()}`;\n const primaryLocale = options.primaryLocale ?? \"en-US\";\n\n const response = await options.client.http.post<any>(\"/v1/apps\", {\n data: {\n type: \"apps\",\n attributes: {\n bundleId: options.bundleIdentifier,\n name: options.appName,\n sku,\n primaryLocale,\n },\n relationships: {\n bundleId: {\n data: { type: \"bundleIds\", id: bundleId.id },\n },\n },\n },\n });\n\n return response.data;\n}\n"]}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var child_process = require('child_process');
|
|
4
|
+
var path = require('path');
|
|
5
|
+
var fs = require('fs');
|
|
6
|
+
|
|
7
|
+
// src/scan/index.ts
|
|
8
|
+
|
|
9
|
+
// src/xcode/platform.ts
|
|
10
|
+
function requireMacOS(feature) {
|
|
11
|
+
if (process.platform !== "darwin") {
|
|
12
|
+
throw new Error(
|
|
13
|
+
`${feature} requires macOS. This operation uses Xcode command-line tools which are not available on ${process.platform}.`
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// src/scan/command.ts
|
|
19
|
+
function buildTestCommand(options) {
|
|
20
|
+
const args = [];
|
|
21
|
+
if (options.clean) args.push("clean");
|
|
22
|
+
args.push("test");
|
|
23
|
+
if (options.workspace) args.push("-workspace", options.workspace);
|
|
24
|
+
else if (options.project) args.push("-project", options.project);
|
|
25
|
+
if (options.scheme) args.push("-scheme", options.scheme);
|
|
26
|
+
if (options.destination) {
|
|
27
|
+
args.push("-destination", options.destination);
|
|
28
|
+
} else if (options.devices && options.devices.length > 0) {
|
|
29
|
+
for (const device of options.devices) {
|
|
30
|
+
args.push("-destination", `platform=iOS Simulator,name=${device}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (options.testPlan) args.push("-testPlan", options.testPlan);
|
|
34
|
+
if (options.configuration) args.push("-configuration", options.configuration);
|
|
35
|
+
if (options.derivedDataPath) args.push("-derivedDataPath", options.derivedDataPath);
|
|
36
|
+
if (options.resultBundlePath) args.push("-resultBundlePath", options.resultBundlePath);
|
|
37
|
+
if (options.codeCoverage) args.push("-enableCodeCoverage", "YES");
|
|
38
|
+
if (options.onlyTesting) {
|
|
39
|
+
for (const test of options.onlyTesting) {
|
|
40
|
+
args.push("-only-testing:" + test);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (options.skipTesting) {
|
|
44
|
+
for (const test of options.skipTesting) {
|
|
45
|
+
args.push("-skip-testing:" + test);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (options.parallelTesting !== void 0) {
|
|
49
|
+
args.push("-parallel-testing-enabled", options.parallelTesting ? "YES" : "NO");
|
|
50
|
+
}
|
|
51
|
+
if (options.concurrentWorkers !== void 0) {
|
|
52
|
+
args.push("-parallel-testing-worker-count", String(options.concurrentWorkers));
|
|
53
|
+
}
|
|
54
|
+
if (options.maxConcurrentSimulators !== void 0) {
|
|
55
|
+
args.push(
|
|
56
|
+
"-maximum-concurrent-test-simulator-destinations",
|
|
57
|
+
String(options.maxConcurrentSimulators)
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
if (options.disableConcurrentTesting) {
|
|
61
|
+
args.push("-disable-concurrent-destination-testing");
|
|
62
|
+
}
|
|
63
|
+
if (options.addressSanitizer !== void 0) {
|
|
64
|
+
args.push("-enableAddressSanitizer", options.addressSanitizer ? "YES" : "NO");
|
|
65
|
+
}
|
|
66
|
+
if (options.threadSanitizer !== void 0) {
|
|
67
|
+
args.push("-enableThreadSanitizer", options.threadSanitizer ? "YES" : "NO");
|
|
68
|
+
}
|
|
69
|
+
if (options.undefinedBehaviorSanitizer !== void 0) {
|
|
70
|
+
args.push(
|
|
71
|
+
"-enableUndefinedBehaviorSanitizer",
|
|
72
|
+
options.undefinedBehaviorSanitizer ? "YES" : "NO"
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
if (options.xcargs) args.push(...options.xcargs.split(/\s+/));
|
|
76
|
+
return args;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// src/scan/retry.ts
|
|
80
|
+
function parseFailedTests(output) {
|
|
81
|
+
const results = [];
|
|
82
|
+
const clean = output.replace(/\x1b\[[0-9;]*m/g, "");
|
|
83
|
+
const failingMatch = clean.match(/Failing tests:\s*\n([\s\S]*?)(?:\n\n|\n\*\*|$)/);
|
|
84
|
+
if (!failingMatch) return results;
|
|
85
|
+
const lines = failingMatch[1].split("\n");
|
|
86
|
+
for (const line of lines) {
|
|
87
|
+
const trimmed = line.trim();
|
|
88
|
+
if (!trimmed || trimmed.startsWith("*")) continue;
|
|
89
|
+
const bracketMatch = trimmed.match(/-\[(\w+)\s+(\w+)\]/);
|
|
90
|
+
if (bracketMatch) {
|
|
91
|
+
results.push({
|
|
92
|
+
target: "",
|
|
93
|
+
suite: bracketMatch[1],
|
|
94
|
+
testCase: bracketMatch[2],
|
|
95
|
+
onlyTestingArg: `${bracketMatch[1]}/${bracketMatch[2]}`
|
|
96
|
+
});
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const slashMatch = trimmed.match(/^(\w+)\.(\w+)\/(\w+)$/);
|
|
100
|
+
if (slashMatch) {
|
|
101
|
+
results.push({
|
|
102
|
+
target: slashMatch[1],
|
|
103
|
+
suite: slashMatch[2],
|
|
104
|
+
testCase: slashMatch[3],
|
|
105
|
+
onlyTestingArg: `${slashMatch[1]}/${slashMatch[2]}/${slashMatch[3]}`
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return results;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// src/scan/index.ts
|
|
113
|
+
async function runTests(options) {
|
|
114
|
+
requireMacOS("scan");
|
|
115
|
+
const outputDir = options.outputDirectory ?? path.join(process.cwd(), "test_output");
|
|
116
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
117
|
+
const resultBundlePath = options.resultBundlePath ?? path.join(outputDir, "result.xcresult");
|
|
118
|
+
const maxRetries = options.maxRetries ?? 0;
|
|
119
|
+
let retryCount = 0;
|
|
120
|
+
let lastOutput = "";
|
|
121
|
+
let currentOnlyTesting = options.onlyTesting;
|
|
122
|
+
const startTime = Date.now();
|
|
123
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
124
|
+
const args = buildTestCommand({
|
|
125
|
+
...options,
|
|
126
|
+
resultBundlePath: attempt === 0 ? resultBundlePath : `${resultBundlePath}-retry-${attempt}`,
|
|
127
|
+
onlyTesting: currentOnlyTesting
|
|
128
|
+
});
|
|
129
|
+
const result = await runXcodebuild(args, options.onOutput);
|
|
130
|
+
lastOutput = result.output;
|
|
131
|
+
if (result.exitCode === 0) {
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
if (attempt < maxRetries) {
|
|
135
|
+
const failed = parseFailedTests(result.output);
|
|
136
|
+
if (failed.length === 0) break;
|
|
137
|
+
currentOnlyTesting = failed.map((f) => f.onlyTestingArg);
|
|
138
|
+
retryCount++;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
const counts = parseTestCounts(lastOutput);
|
|
142
|
+
const duration = (Date.now() - startTime) / 1e3;
|
|
143
|
+
return {
|
|
144
|
+
success: counts.failures === 0,
|
|
145
|
+
totalTests: counts.total,
|
|
146
|
+
failures: counts.failures,
|
|
147
|
+
skipped: counts.skipped,
|
|
148
|
+
retries: retryCount,
|
|
149
|
+
duration,
|
|
150
|
+
reportPaths: fs.existsSync(resultBundlePath) ? [resultBundlePath] : [],
|
|
151
|
+
output: lastOutput
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
function runXcodebuild(args, onOutput) {
|
|
155
|
+
return new Promise((resolve) => {
|
|
156
|
+
const child = child_process.spawn("xcodebuild", args, { stdio: ["ignore", "pipe", "pipe"] });
|
|
157
|
+
let output = "";
|
|
158
|
+
child.stdout.on("data", (data) => {
|
|
159
|
+
const chunk = data.toString();
|
|
160
|
+
output += chunk;
|
|
161
|
+
onOutput?.(chunk);
|
|
162
|
+
});
|
|
163
|
+
child.stderr.on("data", (data) => {
|
|
164
|
+
const chunk = data.toString();
|
|
165
|
+
output += chunk;
|
|
166
|
+
onOutput?.(chunk);
|
|
167
|
+
});
|
|
168
|
+
child.on("close", (code) => resolve({ exitCode: code ?? 1, output }));
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
function parseTestCounts(output) {
|
|
172
|
+
const match = output.match(/Executed (\d+) tests?, with (\d+) failures?/);
|
|
173
|
+
if (match) {
|
|
174
|
+
return {
|
|
175
|
+
total: parseInt(match[1], 10),
|
|
176
|
+
failures: parseInt(match[2], 10),
|
|
177
|
+
skipped: 0
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
return { total: 0, failures: 0, skipped: 0 };
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
exports.buildTestCommand = buildTestCommand;
|
|
184
|
+
exports.parseFailedTests = parseFailedTests;
|
|
185
|
+
exports.runTests = runTests;
|
|
186
|
+
//# sourceMappingURL=index.cjs.map
|
|
187
|
+
//# sourceMappingURL=index.cjs.map
|