eas-cli 16.15.0 → 16.17.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.
Files changed (51) hide show
  1. package/README.md +221 -84
  2. package/build/commandUtils/workflow/fetchLogs.d.ts +2 -0
  3. package/build/commandUtils/workflow/fetchLogs.js +16 -0
  4. package/build/commandUtils/workflow/stateMachine.d.ts +44 -0
  5. package/build/commandUtils/workflow/stateMachine.js +212 -0
  6. package/build/commandUtils/workflow/types.d.ts +39 -0
  7. package/build/commandUtils/workflow/types.js +13 -0
  8. package/build/commandUtils/workflow/utils.d.ts +12 -0
  9. package/build/commandUtils/workflow/utils.js +116 -0
  10. package/build/commands/deploy/alias/delete.d.ts +21 -0
  11. package/build/commands/deploy/alias/delete.js +98 -0
  12. package/build/commands/deploy/alias/index.d.ts +21 -0
  13. package/build/commands/deploy/{alias.js → alias/index.js} +8 -8
  14. package/build/commands/deploy/{alias.d.ts → delete.d.ts} +4 -4
  15. package/build/commands/deploy/delete.js +84 -0
  16. package/build/commands/workflow/cancel.js +3 -6
  17. package/build/commands/workflow/logs.d.ts +18 -0
  18. package/build/commands/workflow/logs.js +94 -0
  19. package/build/commands/workflow/run.d.ts +105 -0
  20. package/build/commands/workflow/run.js +280 -0
  21. package/build/commands/workflow/runs.js +4 -3
  22. package/build/commands/workflow/view.d.ts +17 -0
  23. package/build/commands/workflow/view.js +95 -0
  24. package/build/credentials/ios/IosCredentialsProvider.js +1 -1
  25. package/build/credentials/ios/appstore/bundleIdCapabilities.d.ts +4 -17
  26. package/build/credentials/ios/appstore/bundleIdCapabilities.js +45 -625
  27. package/build/credentials/ios/appstore/capabilityIdentifiers.js +33 -34
  28. package/build/credentials/ios/appstore/capabilityList.d.ts +33 -0
  29. package/build/credentials/ios/appstore/capabilityList.js +646 -0
  30. package/build/graphql/generated.d.ts +308 -19
  31. package/build/graphql/queries/WorkflowJobQuery.d.ts +7 -0
  32. package/build/graphql/queries/WorkflowJobQuery.js +29 -0
  33. package/build/graphql/queries/WorkflowRunQuery.js +13 -13
  34. package/build/graphql/types/WorkflowJob.d.ts +1 -0
  35. package/build/graphql/types/WorkflowJob.js +32 -0
  36. package/build/graphql/types/WorkflowRun.js +18 -0
  37. package/build/worker/assets.d.ts +0 -3
  38. package/build/worker/assets.js +3 -3
  39. package/build/worker/deployment.d.ts +23 -1
  40. package/build/worker/deployment.js +27 -1
  41. package/build/worker/mutations.d.ts +12 -1
  42. package/build/worker/mutations.js +33 -0
  43. package/build/worker/queries.d.ts +8 -1
  44. package/build/worker/queries.js +42 -0
  45. package/build/worker/upload.js +4 -8
  46. package/build/worker/utils/multipart.d.ts +5 -4
  47. package/build/worker/utils/multipart.js +44 -9
  48. package/oclif.manifest.json +196 -32
  49. package/package.json +2 -2
  50. package/build/commandUtils/workflows.d.ts +0 -20
  51. 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.CapabilityMapping = exports.assertValidOptions = exports.syncCapabilitiesForEntitlementsAsync = exports.EXPO_NO_CAPABILITY_SYNC = void 0;
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 shouldSkipPushNotificationsCapabilityUpdate(existing, additionalOptions) {
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 = [...currentCapabilities];
56
+ const remainingCapabilities = [...currentRemoteCapabilities];
85
57
  for (const [key, value] of Object.entries(entitlements)) {
86
- const staticCapabilityInfo = exports.CapabilityMapping.find(capability => capability.entitlement === key);
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 existing = existingIndex > -1 ? remainingCapabilities[existingIndex] : null;
95
- // Only skip if the existing capability is a simple boolean value,
96
- // if it has more complex settings then we should always update it.
97
- // If the `existing.attributes.settings` object is defined, then we can determine that it has extra configuration.
98
- // For push notifications, we should always update the capabaility if
99
- // - settings are not defined in the existing capability, but usesBroadcastPushNotifications is enabled (we want to add settings for this capability)
100
- // - settings are defined in the existing capability, but usesBroadcastPushNotifications is disabled (we want to remove settings for this capability)
101
- const isPushNotificationsCapability = staticCapabilityInfo.capability === apple_utils_1.CapabilityType.PUSH_NOTIFICATIONS;
102
- if (existing &&
103
- ((!isPushNotificationsCapability && existing.attributes.settings == null) ||
104
- (isPushNotificationsCapability &&
105
- shouldSkipPushNotificationsCapabilityUpdate(existing, additionalOptions)))) {
106
- // Remove the item from the list of capabilities so we don't disable it.
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
- let adjustedType = existingCapability.attributes.capabilityType;
150
- if (!adjustedType) {
151
- adjustedType = existingCapability.id.replace(`${bundleId.id}_`, '');
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 = exports.CapabilityMapping.find(capability => capability.capability === adjustedType);
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
- // NOTE(Bacon): From manually toggling values in Xcode and checking the git diff and network requests.
170
- // Last Updated: July 22nd, 2021
171
- // https://developer-mdn.apple.com/documentation/bundleresources/entitlements
172
- exports.CapabilityMapping = [
173
- {
174
- name: 'HomeKit',
175
- entitlement: 'com.apple.developer.homekit',
176
- capability: apple_utils_1.CapabilityType.HOME_KIT,
177
- validateOptions: validateBooleanOptions,
178
- getOptions: getBooleanOptions,
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
+ }