eas-cli 16.14.1 → 16.16.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 +137 -84
- package/build/commandUtils/workflow/fetchLogs.d.ts +2 -0
- package/build/commandUtils/workflow/fetchLogs.js +16 -0
- package/build/commandUtils/workflow/stateMachine.d.ts +44 -0
- package/build/commandUtils/workflow/stateMachine.js +212 -0
- package/build/commandUtils/workflow/types.d.ts +39 -0
- package/build/commandUtils/workflow/types.js +13 -0
- package/build/commandUtils/workflow/utils.d.ts +12 -0
- package/build/commandUtils/workflow/utils.js +116 -0
- package/build/commands/deploy/index.js +47 -49
- package/build/commands/workflow/cancel.js +3 -6
- package/build/commands/workflow/logs.d.ts +18 -0
- package/build/commands/workflow/logs.js +94 -0
- package/build/commands/workflow/run.d.ts +105 -0
- package/build/commands/workflow/run.js +280 -0
- package/build/commands/workflow/runs.js +4 -3
- package/build/commands/workflow/view.d.ts +17 -0
- package/build/commands/workflow/view.js +95 -0
- package/build/credentials/ios/appstore/bundleIdCapabilities.d.ts +4 -17
- package/build/credentials/ios/appstore/bundleIdCapabilities.js +45 -625
- package/build/credentials/ios/appstore/capabilityIdentifiers.js +33 -34
- package/build/credentials/ios/appstore/capabilityList.d.ts +33 -0
- package/build/credentials/ios/appstore/capabilityList.js +646 -0
- package/build/graphql/generated.d.ts +236 -19
- package/build/graphql/queries/WorkflowJobQuery.d.ts +7 -0
- package/build/graphql/queries/WorkflowJobQuery.js +29 -0
- package/build/graphql/queries/WorkflowRunQuery.js +13 -13
- package/build/graphql/types/WorkflowJob.d.ts +1 -0
- package/build/graphql/types/WorkflowJob.js +32 -0
- package/build/graphql/types/WorkflowRun.js +18 -0
- package/build/worker/assets.d.ts +19 -16
- package/build/worker/assets.js +51 -22
- package/build/worker/upload.d.ts +21 -9
- package/build/worker/upload.js +98 -80
- package/build/worker/utils/multipart.d.ts +11 -0
- package/build/worker/utils/multipart.js +98 -0
- package/oclif.manifest.json +85 -1
- package/package.json +2 -2
- package/build/commandUtils/workflows.d.ts +0 -20
- package/build/commandUtils/workflows.js +0 -21
|
@@ -1,35 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.assertValidOptions = exports.syncCapabilitiesForEntitlementsAsync = exports.EXPO_NO_CAPABILITY_SYNC = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const apple_utils_1 = require("@expo/apple-utils");
|
|
6
6
|
const getenv_1 = tslib_1.__importDefault(require("getenv"));
|
|
7
7
|
const util_1 = require("util");
|
|
8
|
+
const capabilityList_1 = require("./capabilityList");
|
|
8
9
|
const log_1 = tslib_1.__importDefault(require("../../../log"));
|
|
9
10
|
exports.EXPO_NO_CAPABILITY_SYNC = getenv_1.default.boolish('EXPO_NO_CAPABILITY_SYNC', false);
|
|
10
|
-
const validateBooleanOptions = (options) => {
|
|
11
|
-
return typeof options === 'boolean';
|
|
12
|
-
};
|
|
13
|
-
const validatePrefixedStringArrayOptions = (prefix) => (options) => {
|
|
14
|
-
return (Array.isArray(options) &&
|
|
15
|
-
options.every(option => typeof option === 'string' && option.startsWith(prefix)));
|
|
16
|
-
};
|
|
17
|
-
const validateStringArrayOptions = (options) => {
|
|
18
|
-
return Array.isArray(options) && options.every(option => typeof option === 'string');
|
|
19
|
-
};
|
|
20
|
-
const createValidateStringOptions = (allowed) => (options) => {
|
|
21
|
-
return allowed.includes(options);
|
|
22
|
-
};
|
|
23
|
-
const createValidateStringArrayOptions = (allowed) => (options) => {
|
|
24
|
-
return Array.isArray(options) && options.every(option => allowed.includes(option));
|
|
25
|
-
};
|
|
26
|
-
const validateDevProdString = createValidateStringOptions(['development', 'production']);
|
|
27
|
-
const getBooleanOptions = entitlement => {
|
|
28
|
-
return entitlement === true ? apple_utils_1.CapabilityTypeOption.ON : apple_utils_1.CapabilityTypeOption.OFF;
|
|
29
|
-
};
|
|
30
|
-
const getDefinedOptions = entitlement => {
|
|
31
|
-
return entitlement ? apple_utils_1.CapabilityTypeOption.ON : apple_utils_1.CapabilityTypeOption.OFF;
|
|
32
|
-
};
|
|
33
11
|
/**
|
|
34
12
|
* Given an entitlements JSON object, synchronizes the remote capabilities for a bundle identifier.
|
|
35
13
|
*
|
|
@@ -43,6 +21,7 @@ const getDefinedOptions = entitlement => {
|
|
|
43
21
|
*
|
|
44
22
|
* @param bundleId bundle identifier object
|
|
45
23
|
* @param entitlements JSON representation of the entitlements plist
|
|
24
|
+
* @param additionalOptions Additional options to consider when syncing capabilities.
|
|
46
25
|
* @returns
|
|
47
26
|
*/
|
|
48
27
|
async function syncCapabilitiesForEntitlementsAsync(bundleId, entitlements = {}, additionalOptions) {
|
|
@@ -55,7 +34,7 @@ async function syncCapabilitiesForEntitlementsAsync(bundleId, entitlements = {},
|
|
|
55
34
|
log_1.default.log(`\nCurrent local entitlements:\n${JSON.stringify(entitlements, null, 2)}`);
|
|
56
35
|
}
|
|
57
36
|
const { enabledCapabilityNames, request, remainingCapabilities } = getCapabilitiesToEnable(currentCapabilities, entitlements, additionalOptions);
|
|
58
|
-
const { disabledCapabilityNames, request: modifiedRequest } = getCapabilitiesToDisable(bundleId, remainingCapabilities, request);
|
|
37
|
+
const { disabledCapabilityNames, request: modifiedRequest } = getCapabilitiesToDisable(bundleId, remainingCapabilities, request, entitlements);
|
|
59
38
|
if (modifiedRequest.length) {
|
|
60
39
|
log_1.default.debug(`Patch Request:`, (0, util_1.inspect)(modifiedRequest, { depth: null, colors: true }));
|
|
61
40
|
try {
|
|
@@ -71,53 +50,42 @@ async function syncCapabilitiesForEntitlementsAsync(bundleId, entitlements = {},
|
|
|
71
50
|
return { enabled: enabledCapabilityNames, disabled: disabledCapabilityNames };
|
|
72
51
|
}
|
|
73
52
|
exports.syncCapabilitiesForEntitlementsAsync = syncCapabilitiesForEntitlementsAsync;
|
|
74
|
-
function
|
|
75
|
-
// For push notifications, we should always update the capabaility if
|
|
76
|
-
// - settings are not defined in the existing capability, but usesBroadcastPushNotifications is enabled (we want to add settings for this capability)
|
|
77
|
-
// - settings are defined in the existing capability, but usesBroadcastPushNotifications is disabled (we want to remove settings for this capability)
|
|
78
|
-
const noSettingsAttributes = existing.attributes.settings == null;
|
|
79
|
-
return !noSettingsAttributes === additionalOptions.usesBroadcastPushNotifications;
|
|
80
|
-
}
|
|
81
|
-
function getCapabilitiesToEnable(currentCapabilities, entitlements, additionalOptions) {
|
|
53
|
+
function getCapabilitiesToEnable(currentRemoteCapabilities, entitlements, additionalOptions) {
|
|
82
54
|
const enabledCapabilityNames = [];
|
|
83
55
|
const request = [];
|
|
84
|
-
const remainingCapabilities = [...
|
|
56
|
+
const remainingCapabilities = [...currentRemoteCapabilities];
|
|
85
57
|
for (const [key, value] of Object.entries(entitlements)) {
|
|
86
|
-
const staticCapabilityInfo =
|
|
58
|
+
const staticCapabilityInfo = capabilityList_1.CapabilityMapping.find(capability => capability.entitlement === key);
|
|
87
59
|
if (!staticCapabilityInfo) {
|
|
88
60
|
if (log_1.default.isDebug) {
|
|
89
61
|
log_1.default.log(`Skipping entitlement that is not supported by EAS: ${key}`);
|
|
90
62
|
}
|
|
91
63
|
continue;
|
|
92
64
|
}
|
|
65
|
+
assertValidOptions(staticCapabilityInfo, value);
|
|
93
66
|
const existingIndex = remainingCapabilities.findIndex(existing => existing.isType(staticCapabilityInfo.capability));
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
const
|
|
102
|
-
if (
|
|
103
|
-
(
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
67
|
+
const existingRemote = existingIndex > -1 ? remainingCapabilities[existingIndex] : null;
|
|
68
|
+
const operation = staticCapabilityInfo.getSyncOperation({
|
|
69
|
+
existingRemote,
|
|
70
|
+
entitlements,
|
|
71
|
+
entitlementValue: value,
|
|
72
|
+
additionalOptions,
|
|
73
|
+
});
|
|
74
|
+
const { op } = operation;
|
|
75
|
+
if (log_1.default.isDebug) {
|
|
76
|
+
log_1.default.log(`Will ${op} remote capability: ${key} (${staticCapabilityInfo.name}.`);
|
|
77
|
+
}
|
|
78
|
+
if (op === 'enable') {
|
|
79
|
+
enabledCapabilityNames.push(staticCapabilityInfo.name);
|
|
80
|
+
request.push({
|
|
81
|
+
capabilityType: staticCapabilityInfo.capability,
|
|
82
|
+
option: operation.option,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
else if (op === 'skip' && existingIndex >= 0) {
|
|
86
|
+
// Remove the item from the list of capabilities so we don't disable it in the next step.
|
|
107
87
|
remainingCapabilities.splice(existingIndex, 1);
|
|
108
|
-
if (log_1.default.isDebug) {
|
|
109
|
-
log_1.default.log(`Skipping existing capability: ${key} (${staticCapabilityInfo.name})`);
|
|
110
|
-
log_1.default.log(`Remaining to remove: `, remainingCapabilities.map(({ id }) => id));
|
|
111
|
-
}
|
|
112
|
-
continue;
|
|
113
88
|
}
|
|
114
|
-
assertValidOptions(staticCapabilityInfo, value);
|
|
115
|
-
enabledCapabilityNames.push(staticCapabilityInfo.name);
|
|
116
|
-
const option = staticCapabilityInfo.getOptions(value, entitlements, additionalOptions);
|
|
117
|
-
request.push({
|
|
118
|
-
capabilityType: staticCapabilityInfo.capability,
|
|
119
|
-
option,
|
|
120
|
-
});
|
|
121
89
|
}
|
|
122
90
|
return { enabledCapabilityNames, request, remainingCapabilities };
|
|
123
91
|
}
|
|
@@ -132,7 +100,7 @@ function assertValidOptions(classifier, value) {
|
|
|
132
100
|
}
|
|
133
101
|
}
|
|
134
102
|
exports.assertValidOptions = assertValidOptions;
|
|
135
|
-
function getCapabilitiesToDisable(bundleId, currentCapabilities, request) {
|
|
103
|
+
function getCapabilitiesToDisable(bundleId, currentCapabilities, request, entitlements) {
|
|
136
104
|
if (log_1.default.isDebug) {
|
|
137
105
|
log_1.default.log(`Existing to disable: `, currentCapabilities.map(({ id }) => id));
|
|
138
106
|
}
|
|
@@ -146,13 +114,15 @@ function getCapabilitiesToDisable(bundleId, currentCapabilities, request) {
|
|
|
146
114
|
continue;
|
|
147
115
|
}
|
|
148
116
|
if (existingCapability.attributes) {
|
|
149
|
-
|
|
150
|
-
if (
|
|
151
|
-
|
|
117
|
+
const adjustedType = getAdjustedCapabilityType(existingCapability, bundleId);
|
|
118
|
+
if (adjustedType === apple_utils_1.CapabilityType.MDM_MANAGED_ASSOCIATED_DOMAINS &&
|
|
119
|
+
entitlements[capabilityList_1.associatedDomainsCapabilityType.entitlement]) {
|
|
120
|
+
// MDM Managed Associated Domains is a special case, it should not be disabled if Associated Domains is enabled.
|
|
121
|
+
continue;
|
|
152
122
|
}
|
|
153
123
|
// Only disable capabilities that we handle,
|
|
154
124
|
// this enables devs to turn on capabilities outside of EAS without worrying about us disabling them.
|
|
155
|
-
const staticCapabilityInfo =
|
|
125
|
+
const staticCapabilityInfo = capabilityList_1.CapabilityMapping.find(capability => capability.capability === adjustedType);
|
|
156
126
|
if (staticCapabilityInfo &&
|
|
157
127
|
!request.find(request => request.capabilityType && existingCapability.isType(request.capabilityType))) {
|
|
158
128
|
request.push({
|
|
@@ -166,563 +136,13 @@ function getCapabilitiesToDisable(bundleId, currentCapabilities, request) {
|
|
|
166
136
|
}
|
|
167
137
|
return { disabledCapabilityNames, request };
|
|
168
138
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
},
|
|
180
|
-
{
|
|
181
|
-
name: 'Hotspot',
|
|
182
|
-
entitlement: 'com.apple.developer.networking.HotspotConfiguration',
|
|
183
|
-
capability: apple_utils_1.CapabilityType.HOT_SPOT,
|
|
184
|
-
validateOptions: validateBooleanOptions,
|
|
185
|
-
getOptions: getBooleanOptions,
|
|
186
|
-
},
|
|
187
|
-
{
|
|
188
|
-
name: 'Multipath',
|
|
189
|
-
entitlement: 'com.apple.developer.networking.multipath',
|
|
190
|
-
capability: apple_utils_1.CapabilityType.MULTIPATH,
|
|
191
|
-
validateOptions: validateBooleanOptions,
|
|
192
|
-
getOptions: getBooleanOptions,
|
|
193
|
-
},
|
|
194
|
-
{
|
|
195
|
-
name: 'SiriKit',
|
|
196
|
-
entitlement: 'com.apple.developer.siri',
|
|
197
|
-
capability: apple_utils_1.CapabilityType.SIRI_KIT,
|
|
198
|
-
validateOptions: validateBooleanOptions,
|
|
199
|
-
getOptions: getBooleanOptions,
|
|
200
|
-
},
|
|
201
|
-
{
|
|
202
|
-
name: 'Wireless Accessory Configuration',
|
|
203
|
-
entitlement: 'com.apple.external-accessory.wireless-configuration',
|
|
204
|
-
capability: apple_utils_1.CapabilityType.WIRELESS_ACCESSORY,
|
|
205
|
-
validateOptions: validateBooleanOptions,
|
|
206
|
-
getOptions: getBooleanOptions,
|
|
207
|
-
},
|
|
208
|
-
{
|
|
209
|
-
name: 'Extended Virtual Address Space',
|
|
210
|
-
entitlement: 'com.apple.developer.kernel.extended-virtual-addressing',
|
|
211
|
-
capability: apple_utils_1.CapabilityType.EXTENDED_VIRTUAL_ADDRESSING,
|
|
212
|
-
validateOptions: validateBooleanOptions,
|
|
213
|
-
getOptions: getBooleanOptions,
|
|
214
|
-
},
|
|
215
|
-
{
|
|
216
|
-
name: 'Access WiFi Information',
|
|
217
|
-
entitlement: 'com.apple.developer.networking.wifi-info',
|
|
218
|
-
capability: apple_utils_1.CapabilityType.ACCESS_WIFI,
|
|
219
|
-
validateOptions: validateBooleanOptions,
|
|
220
|
-
getOptions: getBooleanOptions,
|
|
221
|
-
},
|
|
222
|
-
{
|
|
223
|
-
name: 'Associated Domains',
|
|
224
|
-
entitlement: 'com.apple.developer.associated-domains',
|
|
225
|
-
capability: apple_utils_1.CapabilityType.ASSOCIATED_DOMAINS,
|
|
226
|
-
validateOptions: validateStringArrayOptions,
|
|
227
|
-
getOptions: getDefinedOptions,
|
|
228
|
-
},
|
|
229
|
-
{
|
|
230
|
-
name: 'AutoFill Credential Provider',
|
|
231
|
-
entitlement: 'com.apple.developer.authentication-services.autofill-credential-provider',
|
|
232
|
-
capability: apple_utils_1.CapabilityType.AUTO_FILL_CREDENTIAL,
|
|
233
|
-
validateOptions: validateBooleanOptions,
|
|
234
|
-
getOptions: getBooleanOptions,
|
|
235
|
-
},
|
|
236
|
-
{
|
|
237
|
-
name: 'HealthKit',
|
|
238
|
-
entitlement: 'com.apple.developer.healthkit',
|
|
239
|
-
capability: apple_utils_1.CapabilityType.HEALTH_KIT,
|
|
240
|
-
validateOptions: validateBooleanOptions,
|
|
241
|
-
getOptions: getBooleanOptions,
|
|
242
|
-
},
|
|
243
|
-
// {
|
|
244
|
-
// // ?? -- adds UIRequiredDeviceCapabilities gamekit
|
|
245
|
-
// // Always locked on in dev portal
|
|
246
|
-
// name: 'Game Center',
|
|
247
|
-
// entitlement: 'com.apple.developer.game-center',
|
|
248
|
-
// capability: CapabilityType.GAME_CENTER,
|
|
249
|
-
// validateOptions: validateBooleanOptions,
|
|
250
|
-
// getOptions: getBooleanOptions,
|
|
251
|
-
// },
|
|
252
|
-
{
|
|
253
|
-
name: 'App Groups',
|
|
254
|
-
entitlement: 'com.apple.security.application-groups',
|
|
255
|
-
capability: apple_utils_1.CapabilityType.APP_GROUP,
|
|
256
|
-
// Ex: ['group.CY-A5149AC2-49FC-11E7-B3F3-0335A16FFB8D.com.cydia.Extender']
|
|
257
|
-
validateOptions: validatePrefixedStringArrayOptions('group.'),
|
|
258
|
-
getOptions: getDefinedOptions,
|
|
259
|
-
capabilityIdModel: apple_utils_1.AppGroup,
|
|
260
|
-
capabilityIdPrefix: 'group.',
|
|
261
|
-
},
|
|
262
|
-
{
|
|
263
|
-
name: 'Apple Pay Payment Processing',
|
|
264
|
-
entitlement: 'com.apple.developer.in-app-payments',
|
|
265
|
-
capability: apple_utils_1.CapabilityType.APPLE_PAY,
|
|
266
|
-
// Ex: ['merchant.com.example.development']
|
|
267
|
-
validateOptions: validatePrefixedStringArrayOptions('merchant.'),
|
|
268
|
-
getOptions: getDefinedOptions,
|
|
269
|
-
capabilityIdModel: apple_utils_1.MerchantId,
|
|
270
|
-
capabilityIdPrefix: 'merchant.',
|
|
271
|
-
},
|
|
272
|
-
{
|
|
273
|
-
name: 'iCloud',
|
|
274
|
-
entitlement: 'com.apple.developer.icloud-container-identifiers',
|
|
275
|
-
capability: apple_utils_1.CapabilityType.ICLOUD,
|
|
276
|
-
validateOptions: validatePrefixedStringArrayOptions('iCloud.'),
|
|
277
|
-
// Only supports Xcode +6, 5 could be added if needed.
|
|
278
|
-
getOptions: getDefinedOptions,
|
|
279
|
-
capabilityIdModel: apple_utils_1.CloudContainer,
|
|
280
|
-
capabilityIdPrefix: 'iCloud.',
|
|
281
|
-
},
|
|
282
|
-
{
|
|
283
|
-
name: 'ClassKit',
|
|
284
|
-
entitlement: 'com.apple.developer.ClassKit-environment',
|
|
285
|
-
capability: apple_utils_1.CapabilityType.CLASS_KIT,
|
|
286
|
-
validateOptions: validateDevProdString,
|
|
287
|
-
getOptions: getDefinedOptions,
|
|
288
|
-
},
|
|
289
|
-
{
|
|
290
|
-
name: 'Communication Notifications',
|
|
291
|
-
entitlement: 'com.apple.developer.usernotifications.communication',
|
|
292
|
-
capability: apple_utils_1.CapabilityType.USER_NOTIFICATIONS_COMMUNICATION,
|
|
293
|
-
validateOptions: validateBooleanOptions,
|
|
294
|
-
getOptions: getBooleanOptions,
|
|
295
|
-
},
|
|
296
|
-
{
|
|
297
|
-
name: 'Time Sensitive Notifications',
|
|
298
|
-
entitlement: 'com.apple.developer.usernotifications.time-sensitive',
|
|
299
|
-
capability: apple_utils_1.CapabilityType.USER_NOTIFICATIONS_TIME_SENSITIVE,
|
|
300
|
-
validateOptions: validateBooleanOptions,
|
|
301
|
-
getOptions: getBooleanOptions,
|
|
302
|
-
},
|
|
303
|
-
{
|
|
304
|
-
name: 'Group Activities',
|
|
305
|
-
entitlement: 'com.apple.developer.group-session',
|
|
306
|
-
capability: apple_utils_1.CapabilityType.GROUP_ACTIVITIES,
|
|
307
|
-
validateOptions: validateBooleanOptions,
|
|
308
|
-
getOptions: getBooleanOptions,
|
|
309
|
-
},
|
|
310
|
-
{
|
|
311
|
-
name: 'Family Controls',
|
|
312
|
-
entitlement: 'com.apple.developer.family-controls',
|
|
313
|
-
capability: apple_utils_1.CapabilityType.FAMILY_CONTROLS,
|
|
314
|
-
validateOptions: validateBooleanOptions,
|
|
315
|
-
getOptions: getBooleanOptions,
|
|
316
|
-
},
|
|
317
|
-
{
|
|
318
|
-
// https://developer-mdn.apple.com/documentation/bundleresources/entitlements/com_apple_developer_default-data-protection
|
|
319
|
-
name: 'Data Protection',
|
|
320
|
-
entitlement: 'com.apple.developer.default-data-protection',
|
|
321
|
-
capability: apple_utils_1.CapabilityType.DATA_PROTECTION,
|
|
322
|
-
validateOptions: createValidateStringOptions([
|
|
323
|
-
'NSFileProtectionCompleteUnlessOpen',
|
|
324
|
-
'NSFileProtectionCompleteUntilFirstUserAuthentication',
|
|
325
|
-
'NSFileProtectionNone',
|
|
326
|
-
'NSFileProtectionComplete',
|
|
327
|
-
]),
|
|
328
|
-
getOptions(entitlement) {
|
|
329
|
-
if (entitlement === 'NSFileProtectionComplete') {
|
|
330
|
-
return apple_utils_1.CapabilityTypeDataProtectionOption.COMPLETE_PROTECTION;
|
|
331
|
-
}
|
|
332
|
-
else if (entitlement === 'NSFileProtectionCompleteUnlessOpen') {
|
|
333
|
-
return apple_utils_1.CapabilityTypeDataProtectionOption.PROTECTED_UNLESS_OPEN;
|
|
334
|
-
}
|
|
335
|
-
else if (entitlement === 'NSFileProtectionCompleteUntilFirstUserAuthentication') {
|
|
336
|
-
return apple_utils_1.CapabilityTypeDataProtectionOption.PROTECTED_UNTIL_FIRST_USER_AUTH;
|
|
337
|
-
}
|
|
338
|
-
// NSFileProtectionNone isn't documented, not sure how to handle
|
|
339
|
-
throw new Error(`iOS entitlement "com.apple.developer.default-data-protection" is using unsupported value "${entitlement}"`);
|
|
340
|
-
},
|
|
341
|
-
},
|
|
342
|
-
{
|
|
343
|
-
// Deprecated
|
|
344
|
-
name: 'Inter-App Audio',
|
|
345
|
-
entitlement: 'inter-app-audio',
|
|
346
|
-
capability: apple_utils_1.CapabilityType.INTER_APP_AUDIO,
|
|
347
|
-
validateOptions: validateBooleanOptions,
|
|
348
|
-
getOptions: getBooleanOptions,
|
|
349
|
-
},
|
|
350
|
-
{
|
|
351
|
-
// https://developer-mdn.apple.com/documentation/bundleresources/entitlements/com_apple_developer_networking_networkextension
|
|
352
|
-
name: 'Network Extensions',
|
|
353
|
-
entitlement: 'com.apple.developer.networking.networkextension',
|
|
354
|
-
capability: apple_utils_1.CapabilityType.NETWORK_EXTENSIONS,
|
|
355
|
-
validateOptions: createValidateStringArrayOptions([
|
|
356
|
-
'dns-proxy',
|
|
357
|
-
'app-proxy-provider',
|
|
358
|
-
'content-filter-provider',
|
|
359
|
-
'packet-tunnel-provider',
|
|
360
|
-
'dns-proxy-systemextension',
|
|
361
|
-
'app-proxy-provider-systemextension',
|
|
362
|
-
'content-filter-provider-systemextension',
|
|
363
|
-
'packet-tunnel-provider-systemextension',
|
|
364
|
-
'dns-settings',
|
|
365
|
-
'app-push-provider',
|
|
366
|
-
]),
|
|
367
|
-
getOptions: getDefinedOptions,
|
|
368
|
-
},
|
|
369
|
-
{
|
|
370
|
-
// https://developer-mdn.apple.com/documentation/bundleresources/entitlements/com_apple_developer_nfc_readersession_formats
|
|
371
|
-
name: 'NFC Tag Reading',
|
|
372
|
-
entitlement: 'com.apple.developer.nfc.readersession.formats',
|
|
373
|
-
capability: apple_utils_1.CapabilityType.NFC_TAG_READING,
|
|
374
|
-
// Technically it seems only `TAG` is allowed, but many apps and packages tell users to add `NDEF` as well.
|
|
375
|
-
validateOptions: createValidateStringArrayOptions(['NDEF', 'TAG']),
|
|
376
|
-
getOptions: getDefinedOptions,
|
|
377
|
-
},
|
|
378
|
-
{
|
|
379
|
-
name: 'Personal VPN',
|
|
380
|
-
entitlement: 'com.apple.developer.networking.vpn.api',
|
|
381
|
-
capability: apple_utils_1.CapabilityType.PERSONAL_VPN,
|
|
382
|
-
// Ex: ['allow-vpn']
|
|
383
|
-
validateOptions: createValidateStringArrayOptions(['allow-vpn']),
|
|
384
|
-
getOptions: getDefinedOptions,
|
|
385
|
-
},
|
|
386
|
-
{
|
|
387
|
-
// https://developer-mdn.apple.com/documentation/bundleresources/entitlements/com_apple_developer_networking_vpn_api
|
|
388
|
-
name: 'Push Notifications',
|
|
389
|
-
// com.apple.developer.aps-environment
|
|
390
|
-
entitlement: 'aps-environment',
|
|
391
|
-
capability: apple_utils_1.CapabilityType.PUSH_NOTIFICATIONS,
|
|
392
|
-
validateOptions: validateDevProdString,
|
|
393
|
-
getOptions(entitlement, _entitlementsJson, { usesBroadcastPushNotifications }) {
|
|
394
|
-
const option = entitlement ? apple_utils_1.CapabilityTypeOption.ON : apple_utils_1.CapabilityTypeOption.OFF;
|
|
395
|
-
if (option === apple_utils_1.CapabilityTypeOption.ON && usesBroadcastPushNotifications) {
|
|
396
|
-
return apple_utils_1.CapabilityTypePushNotificationsOption.PUSH_NOTIFICATION_FEATURE_BROADCAST;
|
|
397
|
-
}
|
|
398
|
-
return option;
|
|
399
|
-
},
|
|
400
|
-
},
|
|
401
|
-
{
|
|
402
|
-
name: 'Wallet',
|
|
403
|
-
entitlement: 'com.apple.developer.pass-type-identifiers',
|
|
404
|
-
capability: apple_utils_1.CapabilityType.WALLET,
|
|
405
|
-
// Ex: ['$(TeamIdentifierPrefix)*']
|
|
406
|
-
validateOptions: validateStringArrayOptions,
|
|
407
|
-
getOptions: getDefinedOptions,
|
|
408
|
-
},
|
|
409
|
-
{
|
|
410
|
-
name: 'Sign In with Apple',
|
|
411
|
-
entitlement: 'com.apple.developer.applesignin',
|
|
412
|
-
capability: apple_utils_1.CapabilityType.APPLE_ID_AUTH,
|
|
413
|
-
// Ex: ['Default']
|
|
414
|
-
validateOptions: createValidateStringArrayOptions(['Default']),
|
|
415
|
-
getOptions: getDefinedOptions,
|
|
416
|
-
},
|
|
417
|
-
{
|
|
418
|
-
name: 'Fonts',
|
|
419
|
-
entitlement: 'com.apple.developer.user-fonts',
|
|
420
|
-
capability: apple_utils_1.CapabilityType.FONT_INSTALLATION,
|
|
421
|
-
validateOptions: createValidateStringArrayOptions(['app-usage', 'system-installation']),
|
|
422
|
-
getOptions: getDefinedOptions,
|
|
423
|
-
},
|
|
424
|
-
{
|
|
425
|
-
name: 'Apple Pay Later Merchandising',
|
|
426
|
-
entitlement: 'com.apple.developer.pay-later-merchandising',
|
|
427
|
-
capability: apple_utils_1.CapabilityType.APPLE_PAY_LATER_MERCHANDISING,
|
|
428
|
-
validateOptions: createValidateStringArrayOptions(['payinfour-merchandising']),
|
|
429
|
-
getOptions: getDefinedOptions,
|
|
430
|
-
},
|
|
431
|
-
{
|
|
432
|
-
name: 'Sensitive Content Analysis',
|
|
433
|
-
entitlement: 'com.apple.developer.sensitivecontentanalysis.client',
|
|
434
|
-
capability: apple_utils_1.CapabilityType.SENSITIVE_CONTENT_ANALYSIS,
|
|
435
|
-
validateOptions: createValidateStringArrayOptions(['analysis']),
|
|
436
|
-
getOptions: getDefinedOptions,
|
|
437
|
-
},
|
|
438
|
-
{
|
|
439
|
-
// Not in Xcode
|
|
440
|
-
// https://developer-mdn.apple.com/documentation/devicecheck/preparing_to_use_the_app_attest_service
|
|
441
|
-
// https://developer-mdn.apple.com/documentation/bundleresources/entitlements/com_apple_developer_devicecheck_appattest-environment
|
|
442
|
-
name: 'App Attest',
|
|
443
|
-
entitlement: 'com.apple.developer.devicecheck.appattest-environment',
|
|
444
|
-
capability: apple_utils_1.CapabilityType.APP_ATTEST,
|
|
445
|
-
validateOptions: validateDevProdString,
|
|
446
|
-
getOptions: getDefinedOptions,
|
|
447
|
-
},
|
|
448
|
-
{
|
|
449
|
-
entitlement: 'com.apple.developer.coremedia.hls.low-latency',
|
|
450
|
-
name: 'Low Latency HLS',
|
|
451
|
-
capability: apple_utils_1.CapabilityType.HLS_LOW_LATENCY,
|
|
452
|
-
validateOptions: validateBooleanOptions,
|
|
453
|
-
getOptions: getBooleanOptions,
|
|
454
|
-
},
|
|
455
|
-
{
|
|
456
|
-
entitlement: 'com.apple.developer.associated-domains.mdm-managed',
|
|
457
|
-
name: 'MDM Managed Associated Domains',
|
|
458
|
-
capability: apple_utils_1.CapabilityType.MDM_MANAGED_ASSOCIATED_DOMAINS,
|
|
459
|
-
validateOptions: validateBooleanOptions,
|
|
460
|
-
getOptions: getBooleanOptions,
|
|
461
|
-
},
|
|
462
|
-
{
|
|
463
|
-
entitlement: 'com.apple.developer.fileprovider.testing-mode',
|
|
464
|
-
name: 'FileProvider TestingMode',
|
|
465
|
-
capability: apple_utils_1.CapabilityType.FILE_PROVIDER_TESTING_MODE,
|
|
466
|
-
validateOptions: validateBooleanOptions,
|
|
467
|
-
getOptions: getBooleanOptions,
|
|
468
|
-
},
|
|
469
|
-
{
|
|
470
|
-
entitlement: 'com.apple.developer.healthkit.recalibrate-estimates',
|
|
471
|
-
name: 'Recalibrate Estimates',
|
|
472
|
-
capability: apple_utils_1.CapabilityType.HEALTH_KIT_RECALIBRATE_ESTIMATES,
|
|
473
|
-
validateOptions: validateBooleanOptions,
|
|
474
|
-
getOptions: getBooleanOptions,
|
|
475
|
-
},
|
|
476
|
-
{
|
|
477
|
-
entitlement: 'com.apple.developer.maps',
|
|
478
|
-
name: 'Maps',
|
|
479
|
-
capability: apple_utils_1.CapabilityType.MAPS,
|
|
480
|
-
validateOptions: validateBooleanOptions,
|
|
481
|
-
getOptions: getBooleanOptions,
|
|
482
|
-
},
|
|
483
|
-
{
|
|
484
|
-
entitlement: 'com.apple.developer.user-management',
|
|
485
|
-
name: 'TV Services',
|
|
486
|
-
capability: apple_utils_1.CapabilityType.USER_MANAGEMENT,
|
|
487
|
-
validateOptions: validateBooleanOptions,
|
|
488
|
-
getOptions: getBooleanOptions,
|
|
489
|
-
},
|
|
490
|
-
{
|
|
491
|
-
entitlement: 'com.apple.developer.networking.custom-protocol',
|
|
492
|
-
name: 'Custom Network Protocol',
|
|
493
|
-
capability: apple_utils_1.CapabilityType.NETWORK_CUSTOM_PROTOCOL,
|
|
494
|
-
validateOptions: validateBooleanOptions,
|
|
495
|
-
getOptions: getBooleanOptions,
|
|
496
|
-
},
|
|
497
|
-
{
|
|
498
|
-
entitlement: 'com.apple.developer.system-extension.install',
|
|
499
|
-
name: 'System Extension',
|
|
500
|
-
capability: apple_utils_1.CapabilityType.SYSTEM_EXTENSION_INSTALL,
|
|
501
|
-
validateOptions: validateBooleanOptions,
|
|
502
|
-
getOptions: getBooleanOptions,
|
|
503
|
-
},
|
|
504
|
-
{
|
|
505
|
-
entitlement: 'com.apple.developer.push-to-talk',
|
|
506
|
-
name: 'Push to Talk',
|
|
507
|
-
capability: apple_utils_1.CapabilityType.PUSH_TO_TALK,
|
|
508
|
-
validateOptions: validateBooleanOptions,
|
|
509
|
-
getOptions: getBooleanOptions,
|
|
510
|
-
},
|
|
511
|
-
{
|
|
512
|
-
entitlement: 'com.apple.developer.driverkit.transport.usb',
|
|
513
|
-
name: 'DriverKit USB Transport (development)',
|
|
514
|
-
capability: apple_utils_1.CapabilityType.DRIVER_KIT_USB_TRANSPORT_PUB,
|
|
515
|
-
validateOptions: validateBooleanOptions,
|
|
516
|
-
getOptions: getBooleanOptions,
|
|
517
|
-
},
|
|
518
|
-
{
|
|
519
|
-
entitlement: 'com.apple.developer.kernel.increased-memory-limit',
|
|
520
|
-
name: 'Increased Memory Limit',
|
|
521
|
-
capability: apple_utils_1.CapabilityType.INCREASED_MEMORY_LIMIT,
|
|
522
|
-
validateOptions: validateBooleanOptions,
|
|
523
|
-
getOptions: getBooleanOptions,
|
|
524
|
-
},
|
|
525
|
-
{
|
|
526
|
-
entitlement: 'com.apple.developer.driverkit.communicates-with-drivers',
|
|
527
|
-
name: 'Communicates with Drivers',
|
|
528
|
-
capability: apple_utils_1.CapabilityType.DRIVER_KIT_COMMUNICATES_WITH_DRIVERS,
|
|
529
|
-
validateOptions: validateBooleanOptions,
|
|
530
|
-
getOptions: getBooleanOptions,
|
|
531
|
-
},
|
|
532
|
-
{
|
|
533
|
-
entitlement: 'com.apple.developer.media-device-discovery-extension',
|
|
534
|
-
name: 'Media Device Discovery',
|
|
535
|
-
capability: apple_utils_1.CapabilityType.MEDIA_DEVICE_DISCOVERY,
|
|
536
|
-
validateOptions: validateBooleanOptions,
|
|
537
|
-
getOptions: getBooleanOptions,
|
|
538
|
-
},
|
|
539
|
-
{
|
|
540
|
-
entitlement: 'com.apple.developer.driverkit.allow-third-party-userclients',
|
|
541
|
-
name: 'DriverKit Allow Third Party UserClients',
|
|
542
|
-
capability: apple_utils_1.CapabilityType.DRIVER_KIT_ALLOW_THIRD_PARTY_USER_CLIENTS,
|
|
543
|
-
validateOptions: validateBooleanOptions,
|
|
544
|
-
getOptions: getBooleanOptions,
|
|
545
|
-
},
|
|
546
|
-
{
|
|
547
|
-
entitlement: 'com.apple.developer.weatherkit',
|
|
548
|
-
name: 'WeatherKit',
|
|
549
|
-
capability: apple_utils_1.CapabilityType.WEATHER_KIT,
|
|
550
|
-
validateOptions: validateBooleanOptions,
|
|
551
|
-
getOptions: getBooleanOptions,
|
|
552
|
-
},
|
|
553
|
-
{
|
|
554
|
-
entitlement: 'com.apple.developer.on-demand-install-capable',
|
|
555
|
-
name: 'On Demand Install Capable for App Clip Extensions',
|
|
556
|
-
capability: apple_utils_1.CapabilityType.ON_DEMAND_INSTALL_EXTENSIONS,
|
|
557
|
-
validateOptions: validateBooleanOptions,
|
|
558
|
-
getOptions: getBooleanOptions,
|
|
559
|
-
},
|
|
560
|
-
{
|
|
561
|
-
entitlement: 'com.apple.developer.driverkit.family.scsicontroller',
|
|
562
|
-
name: 'DriverKit Family SCSIController (development)',
|
|
563
|
-
capability: apple_utils_1.CapabilityType.DRIVER_KIT_FAMILY_SCSI_CONTROLLER_PUB,
|
|
564
|
-
validateOptions: validateBooleanOptions,
|
|
565
|
-
getOptions: getBooleanOptions,
|
|
566
|
-
},
|
|
567
|
-
{
|
|
568
|
-
entitlement: 'com.apple.developer.driverkit.family.serial',
|
|
569
|
-
name: 'DriverKit Family Serial (development)',
|
|
570
|
-
capability: apple_utils_1.CapabilityType.DRIVER_KIT_FAMILY_SERIAL_PUB,
|
|
571
|
-
validateOptions: validateBooleanOptions,
|
|
572
|
-
getOptions: getBooleanOptions,
|
|
573
|
-
},
|
|
574
|
-
{
|
|
575
|
-
entitlement: 'com.apple.developer.driverkit.family.networking',
|
|
576
|
-
name: 'DriverKit Family Networking (development)',
|
|
577
|
-
capability: apple_utils_1.CapabilityType.DRIVER_KIT_FAMILY_NETWORKING_PUB,
|
|
578
|
-
validateOptions: validateBooleanOptions,
|
|
579
|
-
getOptions: getBooleanOptions,
|
|
580
|
-
},
|
|
581
|
-
{
|
|
582
|
-
entitlement: 'com.apple.developer.driverkit.family.hid.eventservice',
|
|
583
|
-
name: 'DriverKit Family HID EventService (development)',
|
|
584
|
-
capability: apple_utils_1.CapabilityType.DRIVER_KIT_FAMILY_HID_EVENT_SERVICE_PUB,
|
|
585
|
-
validateOptions: validateBooleanOptions,
|
|
586
|
-
getOptions: getBooleanOptions,
|
|
587
|
-
},
|
|
588
|
-
{
|
|
589
|
-
entitlement: 'com.apple.developer.driverkit.family.hid.device',
|
|
590
|
-
name: 'DriverKit Family HID Device (development)',
|
|
591
|
-
capability: apple_utils_1.CapabilityType.DRIVER_KIT_FAMILY_HID_DEVICE_PUB,
|
|
592
|
-
validateOptions: validateBooleanOptions,
|
|
593
|
-
getOptions: getBooleanOptions,
|
|
594
|
-
},
|
|
595
|
-
{
|
|
596
|
-
entitlement: 'com.apple.developer.driverkit',
|
|
597
|
-
name: 'DriverKit for Development',
|
|
598
|
-
capability: apple_utils_1.CapabilityType.DRIVER_KIT_PUBLIC,
|
|
599
|
-
validateOptions: validateBooleanOptions,
|
|
600
|
-
getOptions: getBooleanOptions,
|
|
601
|
-
},
|
|
602
|
-
{
|
|
603
|
-
entitlement: 'com.apple.developer.driverkit.transport.hid',
|
|
604
|
-
name: 'DriverKit Transport HID (development)',
|
|
605
|
-
capability: apple_utils_1.CapabilityType.DRIVER_KIT_TRANSPORT_HID_PUB,
|
|
606
|
-
validateOptions: validateBooleanOptions,
|
|
607
|
-
getOptions: getBooleanOptions,
|
|
608
|
-
},
|
|
609
|
-
{
|
|
610
|
-
entitlement: 'com.apple.developer.driverkit.family.audio',
|
|
611
|
-
name: 'DriverKit Family Audio (development)',
|
|
612
|
-
capability: apple_utils_1.CapabilityType.DRIVER_KIT_FAMILY_AUDIO_PUB,
|
|
613
|
-
validateOptions: validateBooleanOptions,
|
|
614
|
-
getOptions: getBooleanOptions,
|
|
615
|
-
},
|
|
616
|
-
{
|
|
617
|
-
entitlement: 'com.apple.developer.shared-with-you',
|
|
618
|
-
name: 'Shared with You',
|
|
619
|
-
capability: apple_utils_1.CapabilityType.SHARED_WITH_YOU,
|
|
620
|
-
validateOptions: validateBooleanOptions,
|
|
621
|
-
getOptions: getBooleanOptions,
|
|
622
|
-
},
|
|
623
|
-
{
|
|
624
|
-
entitlement: 'com.apple.developer.shared-with-you.collaboration',
|
|
625
|
-
name: 'Messages Collaboration',
|
|
626
|
-
capability: apple_utils_1.CapabilityType.MESSAGES_COLLABORATION,
|
|
627
|
-
validateOptions: validateBooleanOptions,
|
|
628
|
-
getOptions: getBooleanOptions,
|
|
629
|
-
},
|
|
630
|
-
{
|
|
631
|
-
entitlement: 'com.apple.developer.submerged-shallow-depth-and-pressure',
|
|
632
|
-
name: 'Shallow Depth and Pressure',
|
|
633
|
-
capability: apple_utils_1.CapabilityType.SHALLOW_DEPTH_PRESSURE,
|
|
634
|
-
validateOptions: validateBooleanOptions,
|
|
635
|
-
getOptions: getBooleanOptions,
|
|
636
|
-
},
|
|
637
|
-
{
|
|
638
|
-
entitlement: 'com.apple.developer.proximity-reader.identity.display',
|
|
639
|
-
name: 'Tap to Present ID on iPhone (Display Only)',
|
|
640
|
-
capability: apple_utils_1.CapabilityType.TAP_TO_DISPLAY_ID,
|
|
641
|
-
validateOptions: validateBooleanOptions,
|
|
642
|
-
getOptions: getBooleanOptions,
|
|
643
|
-
},
|
|
644
|
-
{
|
|
645
|
-
entitlement: 'com.apple.developer.proximity-reader.payment.acceptance',
|
|
646
|
-
name: 'Tap to Pay on iPhone',
|
|
647
|
-
capability: apple_utils_1.CapabilityType.TAP_TO_PAY_ON_IPHONE,
|
|
648
|
-
validateOptions: validateBooleanOptions,
|
|
649
|
-
getOptions: getBooleanOptions,
|
|
650
|
-
},
|
|
651
|
-
{
|
|
652
|
-
entitlement: 'com.apple.developer.matter.allow-setup-payload',
|
|
653
|
-
name: 'Matter Allow Setup Payload',
|
|
654
|
-
capability: apple_utils_1.CapabilityType.MATTER_ALLOW_SETUP_PAYLOAD,
|
|
655
|
-
validateOptions: validateBooleanOptions,
|
|
656
|
-
getOptions: getBooleanOptions,
|
|
657
|
-
},
|
|
658
|
-
{
|
|
659
|
-
entitlement: 'com.apple.developer.journal.allow',
|
|
660
|
-
name: 'Journaling Suggestions',
|
|
661
|
-
capability: apple_utils_1.CapabilityType.JOURNALING_SUGGESTIONS,
|
|
662
|
-
validateOptions: createValidateStringArrayOptions(['suggestions']),
|
|
663
|
-
getOptions: getDefinedOptions,
|
|
664
|
-
},
|
|
665
|
-
{
|
|
666
|
-
entitlement: 'com.apple.developer.managed-app-distribution.install-ui',
|
|
667
|
-
name: 'Managed App Installation UI',
|
|
668
|
-
capability: apple_utils_1.CapabilityType.MANAGED_APP_INSTALLATION_UI,
|
|
669
|
-
validateOptions: createValidateStringArrayOptions(['managed-app']),
|
|
670
|
-
getOptions: getDefinedOptions,
|
|
671
|
-
},
|
|
672
|
-
{
|
|
673
|
-
entitlement: 'com.apple.developer.networking.slicing.appcategory',
|
|
674
|
-
name: '5G Network Slicing',
|
|
675
|
-
capability: apple_utils_1.CapabilityType.NETWORK_SLICING,
|
|
676
|
-
validateOptions: createValidateStringArrayOptions([
|
|
677
|
-
'gaming-6014',
|
|
678
|
-
'communication-9000',
|
|
679
|
-
'streaming-9001',
|
|
680
|
-
]),
|
|
681
|
-
getOptions: getDefinedOptions,
|
|
682
|
-
},
|
|
683
|
-
{
|
|
684
|
-
entitlement: 'com.apple.developer.networking.slicing.trafficcategory',
|
|
685
|
-
name: '5G Network Slicing',
|
|
686
|
-
capability: apple_utils_1.CapabilityType.NETWORK_SLICING,
|
|
687
|
-
validateOptions: createValidateStringArrayOptions([
|
|
688
|
-
'defaultslice-1',
|
|
689
|
-
'video-2',
|
|
690
|
-
'background-3',
|
|
691
|
-
'voice-4',
|
|
692
|
-
'callsignaling-5',
|
|
693
|
-
'responsivedata-6',
|
|
694
|
-
'avstreaming-7',
|
|
695
|
-
'responsiveav-8',
|
|
696
|
-
]),
|
|
697
|
-
getOptions: getDefinedOptions,
|
|
698
|
-
},
|
|
699
|
-
// VMNET
|
|
700
|
-
// These don't appear to have entitlements, so it's unclear how we can automatically enable / disable them at this time.
|
|
701
|
-
// TODO: Maybe add a warning about manually enabling features?
|
|
702
|
-
// ?? -- links `StoreKit.framework`
|
|
703
|
-
// Always locked on in dev portal
|
|
704
|
-
// {
|
|
705
|
-
// entitlement: '',
|
|
706
|
-
// name: 'In-App Purchase',
|
|
707
|
-
// capability: CapabilityType.IN_APP_PURCHASE,
|
|
708
|
-
// },
|
|
709
|
-
// {
|
|
710
|
-
// entitlement: '',
|
|
711
|
-
// name: 'HLS Interstitial Previews',
|
|
712
|
-
// capability: 'HLS_INTERSTITIAL_PREVIEW',
|
|
713
|
-
// },
|
|
714
|
-
// "Game Controllers" doesn't appear in Dev Portal but it does show up in Xcode,
|
|
715
|
-
// toggling in Xcode causes no network request to be sent.
|
|
716
|
-
// Therefore it seems that it's a mistake in Xcode,
|
|
717
|
-
// the key `GCSupportsControllerUserInteraction` just needs to be present in Info.plist
|
|
718
|
-
// "Keychain Sharing" doesn't appear in Dev Portal but it does show up in Xcode,
|
|
719
|
-
// toggling in Xcode causes no network request to be sent.
|
|
720
|
-
// Adding to Xcode puts 'keychain-access-groups' into the entitlements so
|
|
721
|
-
// it's not clear if it needs to be updated.
|
|
722
|
-
// "Contact Notes" requires the user to ask Apple in a form:
|
|
723
|
-
// https://developer-mdn.apple.com/contact/request/contact-note-field
|
|
724
|
-
// com.apple.developer.contacts.notes: https://developer-mdn.apple.com/documentation/bundleresources/entitlements/com_apple_developer_contacts_notes/
|
|
725
|
-
// "Exposure Notification" requires the user to ask Apple in a form:
|
|
726
|
-
// https://developer-mdn.apple.com/contact/request/exposure-notification-entitlement
|
|
727
|
-
// com.apple.developer.exposure-notification: https://developer-mdn.apple.com/documentation/bundleresources/entitlements/com_apple_developer_exposure-notification/
|
|
728
|
-
];
|
|
139
|
+
function getAdjustedCapabilityType(existingCapability, bundleId) {
|
|
140
|
+
let adjustedType = existingCapability.attributes.capabilityType;
|
|
141
|
+
if (!adjustedType) {
|
|
142
|
+
if (process.env.NODE_ENV === 'test' && !existingCapability.id.startsWith(`${bundleId.id}_`)) {
|
|
143
|
+
throw new Error(`Capability ID "${existingCapability.id}" does not start with the bundle ID "${bundleId.id}_". This is likely a test setup issue.`);
|
|
144
|
+
}
|
|
145
|
+
adjustedType = existingCapability.id.replace(`${bundleId.id}_`, '');
|
|
146
|
+
}
|
|
147
|
+
return adjustedType;
|
|
148
|
+
}
|