appium-ios-simulator 4.2.0 → 5.0.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 (85) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +38 -79
  3. package/build/index.js +21 -31
  4. package/build/lib/extensions/applications.js +112 -0
  5. package/build/lib/extensions/applications.js.map +1 -0
  6. package/build/lib/extensions/biometric.js +49 -0
  7. package/build/lib/extensions/biometric.js.map +1 -0
  8. package/build/lib/extensions/geolocation.js +91 -0
  9. package/build/lib/extensions/geolocation.js.map +1 -0
  10. package/build/lib/extensions/index.js +13 -7
  11. package/build/lib/extensions/index.js.map +1 -1
  12. package/build/lib/extensions/keychain.js +85 -0
  13. package/build/lib/extensions/keychain.js.map +1 -0
  14. package/build/lib/extensions/misc.js +23 -0
  15. package/build/lib/extensions/misc.js.map +1 -0
  16. package/build/lib/extensions/permissions.js +99 -0
  17. package/build/lib/extensions/permissions.js.map +1 -0
  18. package/build/lib/extensions/safari.js +56 -0
  19. package/build/lib/extensions/safari.js.map +1 -0
  20. package/build/lib/extensions/settings.js +42 -0
  21. package/build/lib/extensions/settings.js.map +1 -0
  22. package/build/lib/simulator-xcode-10.js +2 -2
  23. package/build/lib/simulator-xcode-10.js.map +1 -1
  24. package/build/lib/simulator-xcode-11.4.js +36 -6
  25. package/build/lib/simulator-xcode-11.4.js.map +1 -1
  26. package/build/lib/simulator-xcode-8.js +236 -103
  27. package/build/lib/simulator-xcode-8.js.map +1 -1
  28. package/build/lib/simulator-xcode-9.js +2 -6
  29. package/build/lib/simulator-xcode-9.js.map +1 -1
  30. package/build/lib/simulator.js +20 -47
  31. package/build/lib/simulator.js.map +1 -1
  32. package/build/lib/utils.js +11 -156
  33. package/build/lib/utils.js.map +1 -1
  34. package/index.js +2 -14
  35. package/lib/extensions/applications.js +172 -0
  36. package/lib/extensions/biometric.js +62 -0
  37. package/lib/{geolocation.js → extensions/geolocation.js} +34 -5
  38. package/lib/extensions/index.js +22 -7
  39. package/lib/extensions/keychain.js +124 -0
  40. package/lib/extensions/misc.js +39 -0
  41. package/lib/extensions/permissions.js +167 -0
  42. package/lib/extensions/safari.js +93 -0
  43. package/lib/extensions/settings.js +75 -0
  44. package/lib/simulator-xcode-10.js +2 -2
  45. package/lib/simulator-xcode-11.4.js +49 -11
  46. package/lib/simulator-xcode-8.js +434 -182
  47. package/lib/simulator-xcode-9.js +4 -12
  48. package/lib/simulator.js +12 -55
  49. package/lib/utils.js +9 -200
  50. package/package.json +1 -2
  51. package/build/lib/calendar.js +0 -58
  52. package/build/lib/calendar.js.map +0 -1
  53. package/build/lib/certificate.js +0 -154
  54. package/build/lib/certificate.js.map +0 -1
  55. package/build/lib/extensions/isolate-sim.js +0 -28
  56. package/build/lib/extensions/isolate-sim.js.map +0 -1
  57. package/build/lib/extensions/prepare-apps.js +0 -55
  58. package/build/lib/extensions/prepare-apps.js.map +0 -1
  59. package/build/lib/geolocation.js +0 -76
  60. package/build/lib/geolocation.js.map +0 -1
  61. package/build/lib/permissions.js +0 -80
  62. package/build/lib/permissions.js.map +0 -1
  63. package/build/lib/settings.js +0 -243
  64. package/build/lib/settings.js.map +0 -1
  65. package/build/lib/simulator-xcode-6.js +0 -863
  66. package/build/lib/simulator-xcode-6.js.map +0 -1
  67. package/build/lib/simulator-xcode-7.3.js +0 -18
  68. package/build/lib/simulator-xcode-7.3.js.map +0 -1
  69. package/build/lib/simulator-xcode-7.js +0 -60
  70. package/build/lib/simulator-xcode-7.js.map +0 -1
  71. package/build/lib/tail-until.js +0 -31
  72. package/build/lib/tail-until.js.map +0 -1
  73. package/build/lib/tcc-db.js +0 -44
  74. package/build/lib/tcc-db.js.map +0 -1
  75. package/lib/calendar.js +0 -80
  76. package/lib/certificate.js +0 -231
  77. package/lib/extensions/isolate-sim.js +0 -30
  78. package/lib/extensions/prepare-apps.js +0 -57
  79. package/lib/permissions.js +0 -105
  80. package/lib/settings.js +0 -286
  81. package/lib/simulator-xcode-6.js +0 -1545
  82. package/lib/simulator-xcode-7.3.js +0 -18
  83. package/lib/simulator-xcode-7.js +0 -59
  84. package/lib/tail-until.js +0 -40
  85. package/lib/tcc-db.js +0 -41
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [4.2.1](https://github.com/appium/appium-ios-simulator/compare/v4.2.0...v4.2.1) (2022-12-12)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * Update Simulator preferences configuration ([#347](https://github.com/appium/appium-ios-simulator/issues/347)) ([355c5da](https://github.com/appium/appium-ios-simulator/commit/355c5dabea80330952705570cd0e48ef1633a3fc))
7
+
8
+
9
+ ### Code Refactoring
10
+
11
+ * do not launch in setReduceMotion ([#343](https://github.com/appium/appium-ios-simulator/issues/343)) ([cc35e3e](https://github.com/appium/appium-ios-simulator/commit/cc35e3e7b10585fd127630c1ca01b6de14a2cf63))
12
+ * Drop usage of fs-extra module ([#344](https://github.com/appium/appium-ios-simulator/issues/344)) ([4c1a63e](https://github.com/appium/appium-ios-simulator/commit/4c1a63e0672534b2f401e416b3face095fec639f))
13
+ * Streamline settings helpers for the simulator ([#346](https://github.com/appium/appium-ios-simulator/issues/346)) ([bcf4753](https://github.com/appium/appium-ios-simulator/commit/bcf475318d707b3ac8531b72dbc0d1db9bff4578))
14
+
1
15
  ## [4.2.0](https://github.com/appium/appium-ios-simulator/compare/v4.1.8...v4.2.0) (2022-12-09)
2
16
 
3
17
 
package/README.md CHANGED
@@ -3,11 +3,13 @@
3
3
  [![NPM version](http://img.shields.io/npm/v/appium-ios-simulator.svg)](https://npmjs.org/package/appium-ios-simulator)
4
4
  [![Downloads](http://img.shields.io/npm/dm/appium-ios-simulator.svg)](https://npmjs.org/package/appium-ios-simulator)
5
5
 
6
- [![Build Status](https://api.travis-ci.org/appium/appium-ios-simulator.png?branch=master)](https://travis-ci.org/appium/appium-ios-simulator)
7
6
 
8
- Appium API for dealing with iOS simulators. Allows the user to find locations of directories and applications, gives access to settings in order to read from and write to simulator plists, and allows control over starting and stopping simulators.
7
+ Appium API for dealing with iOS simulators. The API enables you to use the following features:
9
8
 
10
- *Note*: Issue tracking for this repo has been disabled. Please use the [main Appium issue tracker](https://github.com/appium/appium/issues) instead.
9
+ - query locations of Simulator-specific directories and applications
10
+ - read/write access to Simulator settings
11
+ - full control over starting and stopping simulators
12
+ - deal with biometric auth, geolocation settings, application permissions, and others
11
13
 
12
14
  ### Usage
13
15
 
@@ -20,84 +22,41 @@ If you want to create a new simulator, you can use the `createDevice()` method o
20
22
 
21
23
  ```js
22
24
  import { getSimulator } from 'appium-ios-simulator';
25
+ import assert from 'node:assert/strict';
23
26
 
24
- let sim = await getSimulator('DAE95172-0788-4A85-8D0D-5C85509109E1');
27
+ const sim = await getSimulator('DAE95172-0788-4A85-8D0D-5C85509109E1');
28
+ await sim.run();
29
+ assert.equal('Booted', (await sim.stat()).state);
30
+ await sim.shutdown();
31
+ assert.equal('Shutdown', (await sim.stat()).state);
25
32
  ```
26
33
 
34
+ ### Third-party tools
35
+
36
+ The following tools and utilities are not mandatory, but could be used by the appium-ios-simulator, if installed locally, to extend its functionality:
37
+
38
+ - [Lyft](https://github.com/lyft)
39
+ - [IDB](https://github.com/facebook/idb)
40
+ - [AppleSimulatorUtils](https://github.com/wix/AppleSimulatorUtils)
41
+
27
42
  ### Xcode and iOS versions
28
43
 
29
- See [wikipedia](https://en.wikipedia.org/wiki/Xcode#Xcode_5.0_-_7.x_.28with_arm64_support.29) for details of builds for Xcode versions.
30
-
31
- | iOS | Xcode 7.1 beta 3 | Xcode 7.0.1 | Xcode 6.4 | Xcode 6.3.2 | Xcode 6.2 | Xcode 6.1.1 | Xcode 6.0.1 |
32
- |-----|------------------|----------------|-----------|-------------|-----------|-------------|-------------|
33
- | 7.1 | 11D167 | n/a | 11D167 | 11D167 | 11D167 | 11D167 | 11D167 |
34
- | 8.0 | n/a | n/a | n/a | n/a | n/a | n/a | 12A365 |
35
- | 8.1 | 12B411 | 12B411 | 12B411 | 12B411 | 12B411 | 12B411 | 12B411 |
36
- | 8.2 | 12D508 | 12D508 | 12D508 | 12D508 | 12D508 | n/a | n/a |
37
- | 8.3 | 12F70 | 12F70 | 12F70 | 12F69 | 12F70 | n/a | n/a |
38
- | 8.4 | 12H141 | 12H141 | 12H141 | 12H141 | 12H141 | n/a | n/a |
39
- | 9.0 | 13A344 | 13A340 | n/a | n/a | n/a | n/a | n/a |
40
- | 9.1 | 13B134 | n/a | n/a | n/a | n/a | n/a | n/a |
41
-
42
-
43
- #### file locations
44
-
45
- iOS 9.3
46
- - base
47
- - ~/Library/Developer/CoreSimulator/Devices/[identifier]/data/
48
- - safari plists
49
- - [base]/Containers/Containers/Data/Application/[identifier]/<.com.apple.mobile_container_manager.metadata.plist, com.apple.mobilesafari>
50
- - locationd cache plists
51
- - [base]/Library/Caches/locationd/cache.plist
52
- - [base]/Library/Preferences/com.apple.locationd.plist
53
- - locationd clients plists
54
- - [base]/Library/Caches/locationd/clients.plist
55
- - user settings plists
56
- - [base]/Library/UserConfigurationProfiles/UserSettings.plist
57
- - [base]/Library/UserConfigurationProfiles/EffectiveUserSettings.plist
58
- - [base]/Library/UserConfigurationProfiles/PublicInfo/PublicEffectiveUserSettings.plist
59
- - other plists
60
- - [base]/Library/Preferences
61
- - logs
62
- - ~/Library/Logs/CoreSimulator/[identifier]/
63
- - sym linked to [base]/Library/Logs
64
-
65
- iOS 9.2, 9.1, 9.0, 8.4, 8.3
66
- - base
67
- - ~/Library/Developer/CoreSimulator/Devices/[identifier]/data/
68
- - safari plists
69
- - [base]/Containers/Data/Application/[identifier]/<.com.apple.mobile_container_manager.metadata.plist, com.apple.mobilesafari>
70
- - locationd cache plists
71
- - [base]/Library/Caches/locationd/cache.plist
72
- - [base]/Library/Preferences/com.apple.locationd.plist
73
- - locationd clients plists
74
- - [base]/Library/Caches/locationd/clients.plist
75
- - user settings plists
76
- - [base]/Library/ConfigurationProfiles/UserSettings.plist
77
- - [base]/Library/ConfigurationProfiles/EffectiveUserSettings.plist
78
- - [base]/Library/ConfigurationProfiles/PublicInfo/PublicEffectiveUserSettings.plist
79
- - other plists
80
- - [base]/Library/Preferences
81
- - logs
82
- - ~/Library/Logs/CoreSimulator/[identifier]/
83
- - sym linked to [base]/Library/Logs
84
-
85
- iOS 7.1
86
- - base
87
- - ~/Library/Developer/CoreSimulator/Devices/[identifier]/data/
88
- - safari
89
- - [base]/Applications/[identifier]/Library/Preferences/com.apple.mobilesafari.plist
90
- - locationCache
91
- - [base]/Library/Caches/locationd/cache.plist
92
- - [base]/Library/Preferences/com.apple.locationd.plist
93
- - locationClients
94
- - [base]/Library/Caches/locationd/clients.plist
95
- - userSettings
96
- - [base]/Library/ConfigurationProfiles/UserSettings.plist
97
- - [base]/Library/ConfigurationProfiles/EffectiveUserSettings.plist
98
- - [base]/Library/ConfigurationProfiles/PublicInfo/PublicEffectiveUserSettings.plist
99
- - other plists
100
- - [base]/Library/Preferences
101
- - logs
102
- - ~/Library/Logs/CoreSimulator/[identifier]/
103
- - sym linked to [base]/Library/Logs
44
+ Check [Xcode wikipedia](https://en.wikipedia.org/wiki/Xcode) for more details about Xcode version to iOS version mapping.
45
+
46
+ ### Development
47
+
48
+ Checkout the repository and run
49
+
50
+ ```bash
51
+ npm install
52
+ npm run dev
53
+ ```
54
+
55
+ Use the following commands to run tests:
56
+
57
+ ```bash
58
+ # unit tests
59
+ npm run test
60
+ # integration tests
61
+ npm run e2e-test
62
+ ```
package/build/index.js CHANGED
@@ -3,35 +3,25 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.uninstallSSLCert = exports.simExists = exports.killAllSimulators = exports.installSSLCert = exports.hasSSLCert = exports.getSimulator = exports.getDeviceString = exports.endAllSimulatorDaemons = exports.BOOT_COMPLETED_EVENT = void 0;
6
+ Object.defineProperty(exports, "getSimulator", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _simulator.getSimulator;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "killAllSimulators", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _utils.killAllSimulators;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "simExists", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _utils.simExists;
22
+ }
23
+ });
7
24
  require("source-map-support/register");
8
- var sim = _interopRequireWildcard(require("./lib/simulator"));
9
- var utils = _interopRequireWildcard(require("./lib/utils"));
10
- var sim6 = _interopRequireWildcard(require("./lib/simulator-xcode-6"));
11
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
12
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
13
- const {
14
- getSimulator,
15
- getDeviceString
16
- } = sim;
17
- exports.getDeviceString = getDeviceString;
18
- exports.getSimulator = getSimulator;
19
- const {
20
- killAllSimulators,
21
- endAllSimulatorDaemons,
22
- simExists,
23
- installSSLCert,
24
- uninstallSSLCert,
25
- hasSSLCert
26
- } = utils;
27
- exports.hasSSLCert = hasSSLCert;
28
- exports.uninstallSSLCert = uninstallSSLCert;
29
- exports.installSSLCert = installSSLCert;
30
- exports.simExists = simExists;
31
- exports.endAllSimulatorDaemons = endAllSimulatorDaemons;
32
- exports.killAllSimulators = killAllSimulators;
33
- const {
34
- BOOT_COMPLETED_EVENT
35
- } = sim6;
36
- exports.BOOT_COMPLETED_EVENT = BOOT_COMPLETED_EVENT;
37
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRTaW11bGF0b3IiLCJnZXREZXZpY2VTdHJpbmciLCJzaW0iLCJraWxsQWxsU2ltdWxhdG9ycyIsImVuZEFsbFNpbXVsYXRvckRhZW1vbnMiLCJzaW1FeGlzdHMiLCJpbnN0YWxsU1NMQ2VydCIsInVuaW5zdGFsbFNTTENlcnQiLCJoYXNTU0xDZXJ0IiwidXRpbHMiLCJCT09UX0NPTVBMRVRFRF9FVkVOVCIsInNpbTYiXSwic291cmNlcyI6WyIuLi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0cmFuc3BpbGU6bWFpblxuXG5pbXBvcnQgKiBhcyBzaW0gZnJvbSAnLi9saWIvc2ltdWxhdG9yJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4vbGliL3V0aWxzJztcbmltcG9ydCAqIGFzIHNpbTYgZnJvbSAnLi9saWIvc2ltdWxhdG9yLXhjb2RlLTYnO1xuXG5cbmNvbnN0IHsgZ2V0U2ltdWxhdG9yLCBnZXREZXZpY2VTdHJpbmcgfSA9IHNpbTtcbmNvbnN0IHsga2lsbEFsbFNpbXVsYXRvcnMsIGVuZEFsbFNpbXVsYXRvckRhZW1vbnMsIHNpbUV4aXN0cywgaW5zdGFsbFNTTENlcnQsIHVuaW5zdGFsbFNTTENlcnQsIGhhc1NTTENlcnQgfSA9IHV0aWxzO1xuY29uc3QgeyBCT09UX0NPTVBMRVRFRF9FVkVOVCB9ID0gc2ltNjtcblxuZXhwb3J0IHtcbiAgZ2V0U2ltdWxhdG9yLFxuICBnZXREZXZpY2VTdHJpbmcsXG4gIGtpbGxBbGxTaW11bGF0b3JzLFxuICBlbmRBbGxTaW11bGF0b3JEYWVtb25zLFxuICBzaW1FeGlzdHMsXG4gIGluc3RhbGxTU0xDZXJ0LFxuICB1bmluc3RhbGxTU0xDZXJ0LFxuICBoYXNTU0xDZXJ0LFxuICBCT09UX0NPTVBMRVRFRF9FVkVOVFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUVBO0FBQ0E7QUFDQTtBQUFnRDtBQUFBO0FBR2hELE1BQU07RUFBRUEsWUFBWTtFQUFFQztBQUFnQixDQUFDLEdBQUdDLEdBQUc7QUFBQztBQUFBO0FBQzlDLE1BQU07RUFBRUMsaUJBQWlCO0VBQUVDLHNCQUFzQjtFQUFFQyxTQUFTO0VBQUVDLGNBQWM7RUFBRUMsZ0JBQWdCO0VBQUVDO0FBQVcsQ0FBQyxHQUFHQyxLQUFLO0FBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ3JILE1BQU07RUFBRUM7QUFBcUIsQ0FBQyxHQUFHQyxJQUFJO0FBQUMifQ==
25
+ var _simulator = require("./lib/simulator");
26
+ var _utils = require("./lib/utils");
27
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gdHJhbnNwaWxlOm1haW5cblxuaW1wb3J0IHsgZ2V0U2ltdWxhdG9yIH0gZnJvbSAnLi9saWIvc2ltdWxhdG9yJztcbmltcG9ydCB7IGtpbGxBbGxTaW11bGF0b3JzLCBzaW1FeGlzdHMgfSBmcm9tICcuL2xpYi91dGlscyc7XG5cbmV4cG9ydCB7XG4gIGdldFNpbXVsYXRvcixcbiAga2lsbEFsbFNpbXVsYXRvcnMsXG4gIHNpbUV4aXN0cyxcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBO0FBQ0EifQ==
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ require("source-map-support/register");
9
+ var _lodash = _interopRequireDefault(require("lodash"));
10
+ var _path = _interopRequireDefault(require("path"));
11
+ var _support = require("@appium/support");
12
+ var _logger = _interopRequireDefault(require("../logger"));
13
+ var _bluebird = _interopRequireDefault(require("bluebird"));
14
+ var _asyncbox = require("asyncbox");
15
+ const extensions = {};
16
+ extensions.installApp = async function installApp(app) {
17
+ return await this.simctl.installApp(app);
18
+ };
19
+ extensions.getUserInstalledBundleIdsByBundleName = async function getUserInstalledBundleIdsByBundleName(bundleName) {
20
+ const appsRoot = _path.default.resolve(this.getDir(), 'Containers', 'Bundle', 'Application');
21
+ const infoPlists = await _support.fs.glob('*/*.app/Info.plist', {
22
+ cwd: appsRoot,
23
+ nosort: true,
24
+ strict: false,
25
+ absolute: true
26
+ });
27
+ if (_lodash.default.isEmpty(infoPlists)) {
28
+ return [];
29
+ }
30
+ const bundleInfoPromises = [];
31
+ for (const infoPlist of infoPlists) {
32
+ bundleInfoPromises.push((async () => {
33
+ try {
34
+ return await _support.plist.parsePlistFile(infoPlist);
35
+ } catch (ign) {}
36
+ })());
37
+ }
38
+ const bundleInfos = (await _bluebird.default.all(bundleInfoPromises)).filter(_lodash.default.isPlainObject);
39
+ const bundleIds = bundleInfos.filter(({
40
+ CFBundleName
41
+ }) => CFBundleName === bundleName).map(({
42
+ CFBundleIdentifier
43
+ }) => CFBundleIdentifier);
44
+ if (_lodash.default.isEmpty(bundleIds)) {
45
+ return [];
46
+ }
47
+ _logger.default.debug(`The simulator has ${_support.util.pluralize('bundle', bundleIds.length, true)} which ` + `have '${bundleName}' as their 'CFBundleName': ${JSON.stringify(bundleIds)}`);
48
+ return bundleIds;
49
+ };
50
+ extensions.isAppInstalled = async function isAppInstalled(bundleId) {
51
+ try {
52
+ const appContainer = await this.simctl.getAppContainer(bundleId);
53
+ return appContainer.endsWith('.app');
54
+ } catch (err) {
55
+ try {
56
+ const info = await this.simctl.appInfo(bundleId);
57
+ return info.includes('ApplicationType');
58
+ } catch (e) {
59
+ return false;
60
+ }
61
+ }
62
+ };
63
+ extensions.removeApp = async function removeApp(bundleId) {
64
+ await this.simctl.removeApp(bundleId);
65
+ };
66
+ extensions.launchApp = async function launchApp(bundleId, opts = {}) {
67
+ await this.simctl.launchApp(bundleId);
68
+ const {
69
+ wait = false,
70
+ timeoutMs = 10000
71
+ } = opts;
72
+ if (!wait) {
73
+ return;
74
+ }
75
+ try {
76
+ await (0, _asyncbox.waitForCondition)(async () => await this.isAppRunning(bundleId), {
77
+ waitMs: timeoutMs,
78
+ intervalMs: 300
79
+ });
80
+ } catch (e) {
81
+ throw new Error(`App '${bundleId}' is not runnning after ${timeoutMs}ms timeout.`);
82
+ }
83
+ };
84
+ extensions.terminateApp = async function terminateApp(bundleId) {
85
+ await this.simctl.terminateApp(bundleId);
86
+ };
87
+ extensions.isAppRunning = async function isAppRunning(bundleId) {
88
+ return (await this.ps()).some(({
89
+ name
90
+ }) => name === bundleId);
91
+ };
92
+ extensions.scrubApp = async function scrubApp(bundleId) {
93
+ const appDataRoot = await this.simctl.getAppContainer(bundleId, 'data');
94
+ const appFiles = await _support.fs.glob('**/*', {
95
+ cwd: appDataRoot,
96
+ nosort: true,
97
+ strict: false,
98
+ nodir: true,
99
+ absolute: true
100
+ });
101
+ _logger.default.info(`Found ${appFiles.length} ${bundleId} app ${_support.util.pluralize('file', appFiles.length, false)} to scrub`);
102
+ if (_lodash.default.isEmpty(appFiles)) {
103
+ return;
104
+ }
105
+ try {
106
+ await this.terminateApp(bundleId);
107
+ } catch (ign) {}
108
+ await _bluebird.default.all(appFiles.map(p => _support.fs.rimraf(p)));
109
+ };
110
+ var _default = extensions;
111
+ exports.default = _default;
112
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleHRlbnNpb25zIiwiaW5zdGFsbEFwcCIsImFwcCIsInNpbWN0bCIsImdldFVzZXJJbnN0YWxsZWRCdW5kbGVJZHNCeUJ1bmRsZU5hbWUiLCJidW5kbGVOYW1lIiwiYXBwc1Jvb3QiLCJwYXRoIiwicmVzb2x2ZSIsImdldERpciIsImluZm9QbGlzdHMiLCJmcyIsImdsb2IiLCJjd2QiLCJub3NvcnQiLCJzdHJpY3QiLCJhYnNvbHV0ZSIsIl8iLCJpc0VtcHR5IiwiYnVuZGxlSW5mb1Byb21pc2VzIiwiaW5mb1BsaXN0IiwicHVzaCIsInBsaXN0IiwicGFyc2VQbGlzdEZpbGUiLCJpZ24iLCJidW5kbGVJbmZvcyIsIkIiLCJhbGwiLCJmaWx0ZXIiLCJpc1BsYWluT2JqZWN0IiwiYnVuZGxlSWRzIiwiQ0ZCdW5kbGVOYW1lIiwibWFwIiwiQ0ZCdW5kbGVJZGVudGlmaWVyIiwibG9nIiwiZGVidWciLCJ1dGlsIiwicGx1cmFsaXplIiwibGVuZ3RoIiwiSlNPTiIsInN0cmluZ2lmeSIsImlzQXBwSW5zdGFsbGVkIiwiYnVuZGxlSWQiLCJhcHBDb250YWluZXIiLCJnZXRBcHBDb250YWluZXIiLCJlbmRzV2l0aCIsImVyciIsImluZm8iLCJhcHBJbmZvIiwiaW5jbHVkZXMiLCJlIiwicmVtb3ZlQXBwIiwibGF1bmNoQXBwIiwib3B0cyIsIndhaXQiLCJ0aW1lb3V0TXMiLCJ3YWl0Rm9yQ29uZGl0aW9uIiwiaXNBcHBSdW5uaW5nIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsIkVycm9yIiwidGVybWluYXRlQXBwIiwicHMiLCJzb21lIiwibmFtZSIsInNjcnViQXBwIiwiYXBwRGF0YVJvb3QiLCJhcHBGaWxlcyIsIm5vZGlyIiwicCIsInJpbXJhZiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9leHRlbnNpb25zL2FwcGxpY2F0aW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBmcywgcGxpc3QsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcblxuY29uc3QgZXh0ZW5zaW9ucyA9IHt9O1xuXG4vKipcbiAqIEluc3RhbGwgdmFsaWQgLmFwcCBwYWNrYWdlIG9uIFNpbXVsYXRvci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwIC0gVGhlIHBhdGggdG8gdGhlIC5hcHAgcGFja2FnZS5cbiAqL1xuZXh0ZW5zaW9ucy5pbnN0YWxsQXBwID0gYXN5bmMgZnVuY3Rpb24gaW5zdGFsbEFwcCAoYXBwKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNpbWN0bC5pbnN0YWxsQXBwKGFwcCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdXNlciBpbnN0YWxsZWQgYnVuZGxlIGlkcyB3aGljaCBoYXMgJ2J1bmRsZU5hbWUnIGluIHRoZWlyIEluZm8uUGxpc3QgYXMgJ0NGQnVuZGxlTmFtZSdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYnVuZGxlTmFtZSAtIFRoZSBidW5kbGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm4ge2FycmF5PHN0cmluZz59IC0gVGhlIGxpc3Qgb2YgYnVuZGxlIGlkcyB3aGljaCBoYXZlICdidW5kbGVOYW1lJ1xuICovXG5leHRlbnNpb25zLmdldFVzZXJJbnN0YWxsZWRCdW5kbGVJZHNCeUJ1bmRsZU5hbWUgPSBhc3luYyBmdW5jdGlvbiBnZXRVc2VySW5zdGFsbGVkQnVuZGxlSWRzQnlCdW5kbGVOYW1lIChidW5kbGVOYW1lKSB7XG4gIGNvbnN0IGFwcHNSb290ID0gcGF0aC5yZXNvbHZlKHRoaXMuZ2V0RGlyKCksICdDb250YWluZXJzJywgJ0J1bmRsZScsICdBcHBsaWNhdGlvbicpO1xuICAvLyBnbG9iIGFsbCBJbmZvLnBsaXN0IGZyb20gc2ltZGlyL2RhdGEvQ29udGFpbmVycy9CdW5kbGUvQXBwbGljYXRpb25cbiAgY29uc3QgaW5mb1BsaXN0cyA9IGF3YWl0IGZzLmdsb2IoJyovKi5hcHAvSW5mby5wbGlzdCcsIHtcbiAgICBjd2Q6IGFwcHNSb290LFxuICAgIG5vc29ydDogdHJ1ZSxcbiAgICBzdHJpY3Q6IGZhbHNlLFxuICAgIGFic29sdXRlOiB0cnVlLFxuICB9KTtcbiAgaWYgKF8uaXNFbXB0eShpbmZvUGxpc3RzKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGJ1bmRsZUluZm9Qcm9taXNlcyA9IFtdO1xuICBmb3IgKGNvbnN0IGluZm9QbGlzdCBvZiBpbmZvUGxpc3RzKSB7XG4gICAgYnVuZGxlSW5mb1Byb21pc2VzLnB1c2goKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBwbGlzdC5wYXJzZVBsaXN0RmlsZShpbmZvUGxpc3QpO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIH0pKCkpO1xuICB9XG4gIGNvbnN0IGJ1bmRsZUluZm9zID0gKGF3YWl0IEIuYWxsKGJ1bmRsZUluZm9Qcm9taXNlcykpLmZpbHRlcihfLmlzUGxhaW5PYmplY3QpO1xuICBjb25zdCBidW5kbGVJZHMgPSBidW5kbGVJbmZvc1xuICAgIC5maWx0ZXIoKHsgQ0ZCdW5kbGVOYW1lIH0pID0+IENGQnVuZGxlTmFtZSA9PT0gYnVuZGxlTmFtZSlcbiAgICAubWFwKCh7IENGQnVuZGxlSWRlbnRpZmllciB9KSA9PiBDRkJ1bmRsZUlkZW50aWZpZXIpO1xuICBpZiAoXy5pc0VtcHR5KGJ1bmRsZUlkcykpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBsb2cuZGVidWcoXG4gICAgYFRoZSBzaW11bGF0b3IgaGFzICR7dXRpbC5wbHVyYWxpemUoJ2J1bmRsZScsIGJ1bmRsZUlkcy5sZW5ndGgsIHRydWUpfSB3aGljaCBgICtcbiAgICBgaGF2ZSAnJHtidW5kbGVOYW1lfScgYXMgdGhlaXIgJ0NGQnVuZGxlTmFtZSc6ICR7SlNPTi5zdHJpbmdpZnkoYnVuZGxlSWRzKX1gXG4gICk7XG4gIHJldHVybiBidW5kbGVJZHM7XG59O1xuXG4vKipcbiAqIFZlcmlmeSB3aGV0aGVyIHRoZSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uIGlzIGluc3RhbGxlZCBvbiBTaW11bGF0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJ1bmRsZUlkIC0gVGhlIGJ1bmRsZSBpZCBvZiB0aGUgYXBwbGljYXRpb24gdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIGlzIGluc3RhbGxlZC5cbiAqL1xuZXh0ZW5zaW9ucy5pc0FwcEluc3RhbGxlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzQXBwSW5zdGFsbGVkIChidW5kbGVJZCkge1xuICB0cnkge1xuICAgIGNvbnN0IGFwcENvbnRhaW5lciA9IGF3YWl0IHRoaXMuc2ltY3RsLmdldEFwcENvbnRhaW5lcihidW5kbGVJZCk7XG4gICAgcmV0dXJuIGFwcENvbnRhaW5lci5lbmRzV2l0aCgnLmFwcCcpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBnZXRfYXBwX2NvbnRhaW5lciBzdWJjb21tYW5kIGZhaWxzIGZvciBzeXN0ZW0gYXBwbGljYXRpb25zLFxuICAgIC8vIHNvIHdlIHRyeSB0aGUgaGlkZGVuIGFwcGluZm8gc3ViY29tbWFuZCwgd2hpY2ggcHJpbnRzIGNvcnJlY3QgaW5mbyBmb3JcbiAgICAvLyBzeXN0ZW0vaGlkZGVuIGFwcHNcbiAgICB0cnkge1xuICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IHRoaXMuc2ltY3RsLmFwcEluZm8oYnVuZGxlSWQpO1xuICAgICAgcmV0dXJuIGluZm8uaW5jbHVkZXMoJ0FwcGxpY2F0aW9uVHlwZScpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogVW5pbnN0YWxsIHRoZSBnaXZlbiBhcHBsaWNhdGlvbiBmcm9tIHRoZSBjdXJyZW50IFNpbXVsYXRvci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYnVuZGxlSWQgLSBUaGUgYnVpbmRsZSBJRCBvZiB0aGUgYXBwbGljYXRpb24gdG8gYmUgcmVtb3ZlZC5cbiAqL1xuZXh0ZW5zaW9ucy5yZW1vdmVBcHAgPSBhc3luYyBmdW5jdGlvbiByZW1vdmVBcHAgKGJ1bmRsZUlkKSB7XG4gIGF3YWl0IHRoaXMuc2ltY3RsLnJlbW92ZUFwcChidW5kbGVJZCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IExhdW5jaEFwcE9wdHNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gd2FpdCBbZmFsc2VdIFdoZXRoZXIgdG8gd2FpdCB1bnRpbCB0aGUgYXBwIGhhcyBmdWxseSBzdGFydGVkIGFuZFxuICogaXMgcHJlc2VudCBpbiBwcm9jZXNzZXMgbGlzdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXRNcyBbMTAwMDBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWxcbiAqIHRoZSBhcHAgaXMgZnVsbHkgc3RhcnRlZC4gT25seSBhcHBsaWNhdGJsZSBpZiBgd2FpdGAgaXMgdHJ1ZS5cbiAqL1xuXG4vKipcbiAqIFN0YXJ0cyB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gb24gU2ltdWxhdG9yXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJ1bmRsZUlkIC0gVGhlIGJ1aW5kbGUgSUQgb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIGxhdW5jaGVkXG4gKiBAcGFyYW0ge0xhdW5jaEFwcE9wdHN9IG9wdHNcbiAqL1xuZXh0ZW5zaW9ucy5sYXVuY2hBcHAgPSBhc3luYyBmdW5jdGlvbiBsYXVuY2hBcHAgKGJ1bmRsZUlkLCBvcHRzID0ge30pIHtcbiAgYXdhaXQgdGhpcy5zaW1jdGwubGF1bmNoQXBwKGJ1bmRsZUlkKTtcbiAgY29uc3Qge1xuICAgIHdhaXQgPSBmYWxzZSxcbiAgICB0aW1lb3V0TXMgPSAxMDAwMCxcbiAgfSA9IG9wdHM7XG4gIGlmICghd2FpdCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmlzQXBwUnVubmluZyhidW5kbGVJZCksIHtcbiAgICAgIHdhaXRNczogdGltZW91dE1zLFxuICAgICAgaW50ZXJ2YWxNczogMzAwXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEFwcCAnJHtidW5kbGVJZH0nIGlzIG5vdCBydW5ubmluZyBhZnRlciAke3RpbWVvdXRNc31tcyB0aW1lb3V0LmApO1xuICB9XG59O1xuXG4vKipcbiAqIFN0b3BzIHRoZSBnaXZlbiBhcHBsaWNhdGlvbiBvbiAgU2ltdWxhdG9yLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBidW5kbGVJZCAtIFRoZSBidWluZGxlIElEIG9mIHRoZSBhcHBsaWNhdGlvbiB0byBiZSBzdG9wcGVkXG4gKi9cbmV4dGVuc2lvbnMudGVybWluYXRlQXBwID0gYXN5bmMgZnVuY3Rpb24gdGVybWluYXRlQXBwIChidW5kbGVJZCkge1xuICBhd2FpdCB0aGlzLnNpbWN0bC50ZXJtaW5hdGVBcHAoYnVuZGxlSWQpO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBhcHAgd2l0aCB0aGUgZ2l2ZW4gaWRlbnRpZmllciBpcyBydW5uaW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBidW5kbGVJZCAtIFRoZSBidWluZGxlIElEIG9mIHRoZSBhcHBsaWNhdGlvbiB0byBiZSBjaGVja2VkLlxuICovXG5leHRlbnNpb25zLmlzQXBwUnVubmluZyA9IGFzeW5jIGZ1bmN0aW9uIGlzQXBwUnVubmluZyAoYnVuZGxlSWQpIHtcbiAgcmV0dXJuIChhd2FpdCB0aGlzLnBzKCkpLnNvbWUoKHtuYW1lfSkgPT4gbmFtZSA9PT0gYnVuZGxlSWQpO1xufTtcblxuLyoqXG4gKiBTY3J1YiAoZGVsZXRlIHRoZSBwcmVmZXJlbmNlcyBhbmQgY2hhbmdlZCBmaWxlcykgdGhlIHBhcnRpY3VsYXIgYXBwbGljYXRpb24gb24gU2ltdWxhdG9yLlxuICogVGhlIGFwcCB3aWxsIGJlIHRlcm1pbmF0ZWQgYXV0b21hdGljYWxseSBpZiBpdCBpcyBydW5uaW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBidW5kbGVJZCAtIEJ1bmRsZSBpZGVudGlmaWVyIG9mIHRoZSBhcHBsaWNhdGlvbi5cbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgZ2l2ZW4gYXBwIGlzIG5vdCBpbnN0YWxsZWQuXG4gKi9cbmV4dGVuc2lvbnMuc2NydWJBcHAgPSBhc3luYyBmdW5jdGlvbiBzY3J1YkFwcCAoYnVuZGxlSWQpIHtcbiAgY29uc3QgYXBwRGF0YVJvb3QgPSBhd2FpdCB0aGlzLnNpbWN0bC5nZXRBcHBDb250YWluZXIoYnVuZGxlSWQsICdkYXRhJyk7XG4gIGNvbnN0IGFwcEZpbGVzID0gYXdhaXQgZnMuZ2xvYignKiovKicsIHtcbiAgICBjd2Q6IGFwcERhdGFSb290LFxuICAgIG5vc29ydDogdHJ1ZSxcbiAgICBzdHJpY3Q6IGZhbHNlLFxuICAgIG5vZGlyOiB0cnVlLFxuICAgIGFic29sdXRlOiB0cnVlLFxuICB9KTtcbiAgbG9nLmluZm8oYEZvdW5kICR7YXBwRmlsZXMubGVuZ3RofSAke2J1bmRsZUlkfSBhcHAgJHt1dGlsLnBsdXJhbGl6ZSgnZmlsZScsIGFwcEZpbGVzLmxlbmd0aCwgZmFsc2UpfSB0byBzY3J1YmApO1xuICBpZiAoXy5pc0VtcHR5KGFwcEZpbGVzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy50ZXJtaW5hdGVBcHAoYnVuZGxlSWQpO1xuICB9IGNhdGNoIChpZ24pIHt9XG4gIGF3YWl0IEIuYWxsKGFwcEZpbGVzLm1hcCgocCkgPT4gZnMucmltcmFmKHApKSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applications.js","names":["extensions","installApp","app","simctl","getUserInstalledBundleIdsByBundleName","bundleName","appsRoot","path","resolve","getDir","infoPlists","fs","glob","cwd","nosort","strict","absolute","_","isEmpty","bundleInfoPromises","infoPlist","push","plist","parsePlistFile","ign","bundleInfos","B","all","filter","isPlainObject","bundleIds","CFBundleName","map","CFBundleIdentifier","log","debug","util","pluralize","length","JSON","stringify","isAppInstalled","bundleId","appContainer","getAppContainer","endsWith","err","info","appInfo","includes","e","removeApp","launchApp","opts","wait","timeoutMs","waitForCondition","isAppRunning","waitMs","intervalMs","Error","terminateApp","ps","some","name","scrubApp","appDataRoot","appFiles","nodir","p","rimraf"],"sources":["../../../lib/extensions/applications.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport { fs, plist, util } from '@appium/support';\nimport log from '../logger';\nimport B from 'bluebird';\nimport { waitForCondition } from 'asyncbox';\n\nconst extensions = {};\n\n/**\n * Install valid .app package on Simulator.\n *\n * @param {string} app - The path to the .app package.\n */\nextensions.installApp = async function installApp (app) {\n return await this.simctl.installApp(app);\n};\n\n/**\n * Returns user installed bundle ids which has 'bundleName' in their Info.Plist as 'CFBundleName'\n *\n * @param {string} bundleName - The bundle name of the application to be checked.\n * @return {array<string>} - The list of bundle ids which have 'bundleName'\n */\nextensions.getUserInstalledBundleIdsByBundleName = async function getUserInstalledBundleIdsByBundleName (bundleName) {\n const appsRoot = path.resolve(this.getDir(), 'Containers', 'Bundle', 'Application');\n // glob all Info.plist from simdir/data/Containers/Bundle/Application\n const infoPlists = await fs.glob('*/*.app/Info.plist', {\n cwd: appsRoot,\n nosort: true,\n strict: false,\n absolute: true,\n });\n if (_.isEmpty(infoPlists)) {\n return [];\n }\n\n const bundleInfoPromises = [];\n for (const infoPlist of infoPlists) {\n bundleInfoPromises.push((async () => {\n try {\n return await plist.parsePlistFile(infoPlist);\n } catch (ign) {}\n })());\n }\n const bundleInfos = (await B.all(bundleInfoPromises)).filter(_.isPlainObject);\n const bundleIds = bundleInfos\n .filter(({ CFBundleName }) => CFBundleName === bundleName)\n .map(({ CFBundleIdentifier }) => CFBundleIdentifier);\n if (_.isEmpty(bundleIds)) {\n return [];\n }\n\n log.debug(\n `The simulator has ${util.pluralize('bundle', bundleIds.length, true)} which ` +\n `have '${bundleName}' as their 'CFBundleName': ${JSON.stringify(bundleIds)}`\n );\n return bundleIds;\n};\n\n/**\n * Verify whether the particular application is installed on Simulator.\n *\n * @param {string} bundleId - The bundle id of the application to be checked.\n * @return {boolean} True if the given application is installed.\n */\nextensions.isAppInstalled = async function isAppInstalled (bundleId) {\n try {\n const appContainer = await this.simctl.getAppContainer(bundleId);\n return appContainer.endsWith('.app');\n } catch (err) {\n // get_app_container subcommand fails for system applications,\n // so we try the hidden appinfo subcommand, which prints correct info for\n // system/hidden apps\n try {\n const info = await this.simctl.appInfo(bundleId);\n return info.includes('ApplicationType');\n } catch (e) {\n return false;\n }\n }\n};\n\n/**\n * Uninstall the given application from the current Simulator.\n *\n * @param {string} bundleId - The buindle ID of the application to be removed.\n */\nextensions.removeApp = async function removeApp (bundleId) {\n await this.simctl.removeApp(bundleId);\n};\n\n/**\n * @typedef {Object} LaunchAppOpts\n * @property {boolean} wait [false] Whether to wait until the app has fully started and\n * is present in processes list\n * @property {number} timeoutMs [10000] The number of milliseconds to wait until\n * the app is fully started. Only applicatble if `wait` is true.\n */\n\n/**\n * Starts the given application on Simulator\n *\n * @param {string} bundleId - The buindle ID of the application to be launched\n * @param {LaunchAppOpts} opts\n */\nextensions.launchApp = async function launchApp (bundleId, opts = {}) {\n await this.simctl.launchApp(bundleId);\n const {\n wait = false,\n timeoutMs = 10000,\n } = opts;\n if (!wait) {\n return;\n }\n\n try {\n await waitForCondition(async () => await this.isAppRunning(bundleId), {\n waitMs: timeoutMs,\n intervalMs: 300\n });\n } catch (e) {\n throw new Error(`App '${bundleId}' is not runnning after ${timeoutMs}ms timeout.`);\n }\n};\n\n/**\n * Stops the given application on Simulator.\n *\n * @param {string} bundleId - The buindle ID of the application to be stopped\n */\nextensions.terminateApp = async function terminateApp (bundleId) {\n await this.simctl.terminateApp(bundleId);\n};\n\n/**\n * Check if app with the given identifier is running.\n *\n * @param {string} bundleId - The buindle ID of the application to be checked.\n */\nextensions.isAppRunning = async function isAppRunning (bundleId) {\n return (await this.ps()).some(({name}) => name === bundleId);\n};\n\n/**\n * Scrub (delete the preferences and changed files) the particular application on Simulator.\n * The app will be terminated automatically if it is running.\n *\n * @param {string} bundleId - Bundle identifier of the application.\n * @throws {Error} if the given app is not installed.\n */\nextensions.scrubApp = async function scrubApp (bundleId) {\n const appDataRoot = await this.simctl.getAppContainer(bundleId, 'data');\n const appFiles = await fs.glob('**/*', {\n cwd: appDataRoot,\n nosort: true,\n strict: false,\n nodir: true,\n absolute: true,\n });\n log.info(`Found ${appFiles.length} ${bundleId} app ${util.pluralize('file', appFiles.length, false)} to scrub`);\n if (_.isEmpty(appFiles)) {\n return;\n }\n\n try {\n await this.terminateApp(bundleId);\n } catch (ign) {}\n await B.all(appFiles.map((p) => fs.rimraf(p)));\n};\n\nexport default extensions;\n"],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ require("source-map-support/register");
9
+ var _lodash = _interopRequireDefault(require("lodash"));
10
+ var _logger = _interopRequireDefault(require("../logger"));
11
+ const extensions = {};
12
+ extensions.isBiometricEnrolled = async function isBiometricEnrolled() {
13
+ const output = await this.executeUIClientScript(`
14
+ tell application "System Events"
15
+ tell process "Simulator"
16
+ set dstMenuItem to menu item "Toggle Enrolled State" of menu 1 of menu item "Touch ID" of menu 1 of menu bar item "Hardware" of menu bar 1
17
+ set isChecked to (value of attribute "AXMenuItemMarkChar" of dstMenuItem) is "✓"
18
+ end tell
19
+ end tell
20
+ `);
21
+ _logger.default.debug(`Touch ID enrolled state: ${output}`);
22
+ return _lodash.default.isString(output) && output.trim() === 'true';
23
+ };
24
+ extensions.enrollBiometric = async function enrollBiometric(isEnabled = true) {
25
+ await this.executeUIClientScript(`
26
+ tell application "System Events"
27
+ tell process "Simulator"
28
+ set dstMenuItem to menu item "Toggle Enrolled State" of menu 1 of menu item "Touch ID" of menu 1 of menu bar item "Hardware" of menu bar 1
29
+ set isChecked to (value of attribute "AXMenuItemMarkChar" of dstMenuItem) is "✓"
30
+ if ${isEnabled ? 'not ' : ''}isChecked then
31
+ click dstMenuItem
32
+ end if
33
+ end tell
34
+ end tell
35
+ `);
36
+ };
37
+ extensions.sendBiometricMatch = async function sendBiometricMatch(shouldMatch = true) {
38
+ await this.executeUIClientScript(`
39
+ tell application "System Events"
40
+ tell process "Simulator"
41
+ set dstMenuItem to menu item "${shouldMatch ? 'Matching Touch' : 'Non-matching Touch'}" of menu 1 of menu item "Touch ID" of menu 1 of menu bar item "Hardware" of menu bar 1
42
+ click dstMenuItem
43
+ end tell
44
+ end tell
45
+ `);
46
+ };
47
+ var _default = extensions;
48
+ exports.default = _default;
49
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleHRlbnNpb25zIiwiaXNCaW9tZXRyaWNFbnJvbGxlZCIsIm91dHB1dCIsImV4ZWN1dGVVSUNsaWVudFNjcmlwdCIsImxvZyIsImRlYnVnIiwiXyIsImlzU3RyaW5nIiwidHJpbSIsImVucm9sbEJpb21ldHJpYyIsImlzRW5hYmxlZCIsInNlbmRCaW9tZXRyaWNNYXRjaCIsInNob3VsZE1hdGNoIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2V4dGVuc2lvbnMvYmlvbWV0cmljLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5cbmNvbnN0IGV4dGVuc2lvbnMgPSB7fTtcblxuLyoqXG4gKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgQmlvbWV0cmljIEVucm9sbG1lbnQgZmVhdHVyZS5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gRWl0aGVyIHRydWUgb3IgZmFsc2VcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBFbnJvbGxtZW50IHN0YXRlIGNhbm5vdCBiZSBkZXRlcm1pbmVkXG4gKi9cbmV4dGVuc2lvbnMuaXNCaW9tZXRyaWNFbnJvbGxlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzQmlvbWV0cmljRW5yb2xsZWQgKCkge1xuICBjb25zdCBvdXRwdXQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVVSUNsaWVudFNjcmlwdChgXG4gICAgdGVsbCBhcHBsaWNhdGlvbiBcIlN5c3RlbSBFdmVudHNcIlxuICAgICAgdGVsbCBwcm9jZXNzIFwiU2ltdWxhdG9yXCJcbiAgICAgICAgc2V0IGRzdE1lbnVJdGVtIHRvIG1lbnUgaXRlbSBcIlRvZ2dsZSBFbnJvbGxlZCBTdGF0ZVwiIG9mIG1lbnUgMSBvZiBtZW51IGl0ZW0gXCJUb3VjaCBJRFwiIG9mIG1lbnUgMSBvZiBtZW51IGJhciBpdGVtIFwiSGFyZHdhcmVcIiBvZiBtZW51IGJhciAxXG4gICAgICAgIHNldCBpc0NoZWNrZWQgdG8gKHZhbHVlIG9mIGF0dHJpYnV0ZSBcIkFYTWVudUl0ZW1NYXJrQ2hhclwiIG9mIGRzdE1lbnVJdGVtKSBpcyBcIuKck1wiXG4gICAgICBlbmQgdGVsbFxuICAgIGVuZCB0ZWxsXG4gIGApO1xuICBsb2cuZGVidWcoYFRvdWNoIElEIGVucm9sbGVkIHN0YXRlOiAke291dHB1dH1gKTtcbiAgcmV0dXJuIF8uaXNTdHJpbmcob3V0cHV0KSAmJiBvdXRwdXQudHJpbSgpID09PSAndHJ1ZSc7XG59O1xuXG4vKipcbiAqIEVucm9sbHMgYmlvbWV0cmljIChUb3VjaElkLCBGYWNlSWQpIGZlYXR1cmUgdGVzdGluZyBpbiBTaW11bGF0b3IgVUkgY2xpZW50LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNFbmFibGVkIC0gRGVmaW5lcyB3aGV0aGVyIGJpb21ldHJpYyBzdGF0ZSBpcyBlbmFibGVkL2Rpc2FibGVkXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGVucm9sbGVkIHN0YXRlIGNhbm5vdCBiZSBjaGFuZ2VkXG4gKi9cbmV4dGVuc2lvbnMuZW5yb2xsQmlvbWV0cmljID0gYXN5bmMgZnVuY3Rpb24gZW5yb2xsQmlvbWV0cmljIChpc0VuYWJsZWQgPSB0cnVlKSB7XG4gIGF3YWl0IHRoaXMuZXhlY3V0ZVVJQ2xpZW50U2NyaXB0KGBcbiAgICB0ZWxsIGFwcGxpY2F0aW9uIFwiU3lzdGVtIEV2ZW50c1wiXG4gICAgICB0ZWxsIHByb2Nlc3MgXCJTaW11bGF0b3JcIlxuICAgICAgICBzZXQgZHN0TWVudUl0ZW0gdG8gbWVudSBpdGVtIFwiVG9nZ2xlIEVucm9sbGVkIFN0YXRlXCIgb2YgbWVudSAxIG9mIG1lbnUgaXRlbSBcIlRvdWNoIElEXCIgb2YgbWVudSAxIG9mIG1lbnUgYmFyIGl0ZW0gXCJIYXJkd2FyZVwiIG9mIG1lbnUgYmFyIDFcbiAgICAgICAgc2V0IGlzQ2hlY2tlZCB0byAodmFsdWUgb2YgYXR0cmlidXRlIFwiQVhNZW51SXRlbU1hcmtDaGFyXCIgb2YgZHN0TWVudUl0ZW0pIGlzIFwi4pyTXCJcbiAgICAgICAgaWYgJHtpc0VuYWJsZWQgPyAnbm90ICcgOiAnJ31pc0NoZWNrZWQgdGhlblxuICAgICAgICAgIGNsaWNrIGRzdE1lbnVJdGVtXG4gICAgICAgIGVuZCBpZlxuICAgICAgZW5kIHRlbGxcbiAgICBlbmQgdGVsbFxuICBgKTtcbn07XG5cbi8qKlxuICogU2VuZHMgYSBub3RpZmljYXRpb24gdG8gbWF0Y2gvbm90IG1hdGNoIHRoZSB0b3VjaCBpZC5cbiAqXG4gKiBAcGFyYW0gez9ib29sZWFufSBzaG91bGRNYXRjaCBbdHJ1ZV0gLSBTZXQgaXQgdG8gdHJ1ZSBvciBmYWxzZSBpbiBvcmRlciB0byBlbXVsYXRlXG4gKiBtYXRjaGluZy9ub3QgbWF0Y2hpbmcgdGhlIGNvcnJlc3BvbmRpbmcgYmlvbWV0cmljXG4gKi9cbmV4dGVuc2lvbnMuc2VuZEJpb21ldHJpY01hdGNoID0gYXN5bmMgZnVuY3Rpb24gc2VuZEJpb21ldHJpY01hdGNoIChzaG91bGRNYXRjaCA9IHRydWUpIHtcbiAgYXdhaXQgdGhpcy5leGVjdXRlVUlDbGllbnRTY3JpcHQoYFxuICAgIHRlbGwgYXBwbGljYXRpb24gXCJTeXN0ZW0gRXZlbnRzXCJcbiAgICAgIHRlbGwgcHJvY2VzcyBcIlNpbXVsYXRvclwiXG4gICAgICAgIHNldCBkc3RNZW51SXRlbSB0byBtZW51IGl0ZW0gXCIke3Nob3VsZE1hdGNoID8gJ01hdGNoaW5nIFRvdWNoJyA6ICdOb24tbWF0Y2hpbmcgVG91Y2gnfVwiIG9mIG1lbnUgMSBvZiBtZW51IGl0ZW0gXCJUb3VjaCBJRFwiIG9mIG1lbnUgMSBvZiBtZW51IGJhciBpdGVtIFwiSGFyZHdhcmVcIiBvZiBtZW51IGJhciAxXG4gICAgICAgIGNsaWNrIGRzdE1lbnVJdGVtXG4gICAgICBlbmQgdGVsbFxuICAgIGVuZCB0ZWxsXG4gIGApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBRUEsTUFBTUEsVUFBVSxHQUFHLENBQUMsQ0FBQztBQVFyQkEsVUFBVSxDQUFDQyxtQkFBbUIsR0FBRyxlQUFlQSxtQkFBbUIsR0FBSTtFQUNyRSxNQUFNQyxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUNDLHFCQUFxQixDQUFFO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsQ0FBQztFQUNGQyxlQUFHLENBQUNDLEtBQUssQ0FBRSw0QkFBMkJILE1BQU8sRUFBQyxDQUFDO0VBQy9DLE9BQU9JLGVBQUMsQ0FBQ0MsUUFBUSxDQUFDTCxNQUFNLENBQUMsSUFBSUEsTUFBTSxDQUFDTSxJQUFJLEVBQUUsS0FBSyxNQUFNO0FBQ3ZELENBQUM7QUFRRFIsVUFBVSxDQUFDUyxlQUFlLEdBQUcsZUFBZUEsZUFBZSxDQUFFQyxTQUFTLEdBQUcsSUFBSSxFQUFFO0VBQzdFLE1BQU0sSUFBSSxDQUFDUCxxQkFBcUIsQ0FBRTtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWFPLFNBQVMsR0FBRyxNQUFNLEdBQUcsRUFBRztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsQ0FBQztBQUNKLENBQUM7QUFRRFYsVUFBVSxDQUFDVyxrQkFBa0IsR0FBRyxlQUFlQSxrQkFBa0IsQ0FBRUMsV0FBVyxHQUFHLElBQUksRUFBRTtFQUNyRixNQUFNLElBQUksQ0FBQ1QscUJBQXFCLENBQUU7QUFDcEM7QUFDQTtBQUNBLHdDQUF3Q1MsV0FBVyxHQUFHLGdCQUFnQixHQUFHLG9CQUFxQjtBQUM5RjtBQUNBO0FBQ0E7QUFDQSxHQUFHLENBQUM7QUFDSixDQUFDO0FBQUMsZUFFYVosVUFBVTtBQUFBIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"biometric.js","names":["extensions","isBiometricEnrolled","output","executeUIClientScript","log","debug","_","isString","trim","enrollBiometric","isEnabled","sendBiometricMatch","shouldMatch"],"sources":["../../../lib/extensions/biometric.js"],"sourcesContent":["import _ from 'lodash';\nimport log from '../logger';\n\nconst extensions = {};\n\n/**\n * Get the current state of Biometric Enrollment feature.\n *\n * @returns {boolean} Either true or false\n * @throws {Error} If Enrollment state cannot be determined\n */\nextensions.isBiometricEnrolled = async function isBiometricEnrolled () {\n const output = await this.executeUIClientScript(`\n tell application \"System Events\"\n tell process \"Simulator\"\n set dstMenuItem to menu item \"Toggle Enrolled State\" of menu 1 of menu item \"Touch ID\" of menu 1 of menu bar item \"Hardware\" of menu bar 1\n set isChecked to (value of attribute \"AXMenuItemMarkChar\" of dstMenuItem) is \"✓\"\n end tell\n end tell\n `);\n log.debug(`Touch ID enrolled state: ${output}`);\n return _.isString(output) && output.trim() === 'true';\n};\n\n/**\n * Enrolls biometric (TouchId, FaceId) feature testing in Simulator UI client.\n *\n * @param {boolean} isEnabled - Defines whether biometric state is enabled/disabled\n * @throws {Error} If the enrolled state cannot be changed\n */\nextensions.enrollBiometric = async function enrollBiometric (isEnabled = true) {\n await this.executeUIClientScript(`\n tell application \"System Events\"\n tell process \"Simulator\"\n set dstMenuItem to menu item \"Toggle Enrolled State\" of menu 1 of menu item \"Touch ID\" of menu 1 of menu bar item \"Hardware\" of menu bar 1\n set isChecked to (value of attribute \"AXMenuItemMarkChar\" of dstMenuItem) is \"✓\"\n if ${isEnabled ? 'not ' : ''}isChecked then\n click dstMenuItem\n end if\n end tell\n end tell\n `);\n};\n\n/**\n * Sends a notification to match/not match the touch id.\n *\n * @param {?boolean} shouldMatch [true] - Set it to true or false in order to emulate\n * matching/not matching the corresponding biometric\n */\nextensions.sendBiometricMatch = async function sendBiometricMatch (shouldMatch = true) {\n await this.executeUIClientScript(`\n tell application \"System Events\"\n tell process \"Simulator\"\n set dstMenuItem to menu item \"${shouldMatch ? 'Matching Touch' : 'Non-matching Touch'}\" of menu 1 of menu item \"Touch ID\" of menu 1 of menu bar item \"Hardware\" of menu bar 1\n click dstMenuItem\n end tell\n end tell\n `);\n};\n\nexport default extensions;\n"],"mappings":";;;;;;;;AAAA;AACA;AAEA,MAAMA,UAAU,GAAG,CAAC,CAAC;AAQrBA,UAAU,CAACC,mBAAmB,GAAG,eAAeA,mBAAmB,GAAI;EACrE,MAAMC,MAAM,GAAG,MAAM,IAAI,CAACC,qBAAqB,CAAE;AACnD;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,CAAC;EACFC,eAAG,CAACC,KAAK,CAAE,4BAA2BH,MAAO,EAAC,CAAC;EAC/C,OAAOI,eAAC,CAACC,QAAQ,CAACL,MAAM,CAAC,IAAIA,MAAM,CAACM,IAAI,EAAE,KAAK,MAAM;AACvD,CAAC;AAQDR,UAAU,CAACS,eAAe,GAAG,eAAeA,eAAe,CAAEC,SAAS,GAAG,IAAI,EAAE;EAC7E,MAAM,IAAI,CAACP,qBAAqB,CAAE;AACpC;AACA;AACA;AACA;AACA,aAAaO,SAAS,GAAG,MAAM,GAAG,EAAG;AACrC;AACA;AACA;AACA;AACA,GAAG,CAAC;AACJ,CAAC;AAQDV,UAAU,CAACW,kBAAkB,GAAG,eAAeA,kBAAkB,CAAEC,WAAW,GAAG,IAAI,EAAE;EACrF,MAAM,IAAI,CAACT,qBAAqB,CAAE;AACpC;AACA;AACA,wCAAwCS,WAAW,GAAG,gBAAgB,GAAG,oBAAqB;AAC9F;AACA;AACA;AACA,GAAG,CAAC;AACJ,CAAC;AAAC,eAEaZ,UAAU;AAAA"}
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ require("source-map-support/register");
9
+ var _lodash = _interopRequireDefault(require("lodash"));
10
+ var _support = require("@appium/support");
11
+ var _logger = _interopRequireDefault(require("../logger"));
12
+ var _teen_process = require("teen_process");
13
+ const LYFT_SET_LOCATION = 'set-simulator-location';
14
+ const DECIMAL_SEPARATOR_SCRIPT = `
15
+ use framework "Foundation"
16
+ use framework "AppKit"
17
+ use scripting additions
18
+
19
+ set theFormatter to current application's NSNumberFormatter's new()
20
+ set result to theFormatter's decimalSeparator()
21
+ log result as string
22
+ `;
23
+ async function setLocationWithLyft(udid, latitude, longitude) {
24
+ try {
25
+ await _support.fs.which(LYFT_SET_LOCATION);
26
+ } catch (e) {
27
+ throw new Error(`'${LYFT_SET_LOCATION}' binary has not been found in your PATH. ` + 'Please install it as "brew install lyft/formulae/set-simulator-location" by brew or ' + 'read https://github.com/lyft/set-simulator-location to set the binary by manual to ' + 'be able to set geolocation by the library.');
28
+ }
29
+ try {
30
+ await (0, _teen_process.exec)(LYFT_SET_LOCATION, ['-c', latitude, longitude, '-u', udid]);
31
+ } catch (e) {
32
+ throw new Error(`Failed to set geolocation with '${LYFT_SET_LOCATION}'. ` + `Original error: ${e.stderr || e.message}`);
33
+ }
34
+ }
35
+ async function setLocationWithIdb(idb, latitude, longitude) {
36
+ if (!idb) {
37
+ throw new Error('Failed to set geolocation with idb because it is not installed or the "launchWithIDB" capability was not set');
38
+ }
39
+ try {
40
+ await idb.setLocation(latitude, longitude);
41
+ } catch (e) {
42
+ throw new Error(`Failed to set geolocation with idb. Original error: ${e.stderr || e.message}`);
43
+ }
44
+ }
45
+ async function setLocationWithAppleScript(sim, latitude, longitude, menu = 'Debug') {
46
+ const {
47
+ stdout,
48
+ stderr
49
+ } = await (0, _teen_process.exec)('osascript', ['-e', DECIMAL_SEPARATOR_SCRIPT]);
50
+ const decimalSeparator = _lodash.default.trim(stdout || stderr);
51
+ const [latitudeStr, longitudeStr] = [latitude, longitude].map(coord => `${coord}`.replace(/[.,]/, decimalSeparator));
52
+ const output = await sim.executeUIClientScript(`
53
+ tell application "System Events"
54
+ tell process "Simulator"
55
+ set featureName to "Custom Location"
56
+ set dstMenuItem to menu item (featureName & "…") of menu 1 of menu item "Location" of menu 1 of menu bar item "${menu}" of menu bar 1
57
+ click dstMenuItem
58
+ delay 1
59
+ set value of text field 1 of window featureName to "${latitudeStr}"
60
+ delay 0.5
61
+ set value of text field 2 of window featureName to "${longitudeStr}"
62
+ delay 0.5
63
+ click button "OK" of window featureName
64
+ delay 0.5
65
+ set isInvisible to (not (exists (window featureName)))
66
+ end tell
67
+ end tell
68
+ `);
69
+ _logger.default.debug(`Geolocation parameters dialog accepted: ${output}`);
70
+ if (_lodash.default.trim(output) !== 'true') {
71
+ throw new Error(`Failed to set geolocation with AppleScript. Original error: ${output}`);
72
+ }
73
+ }
74
+ const extensions = {};
75
+ extensions.setGeolocation = async function setGeolocation(latitude, longitude) {
76
+ const locationSetters = [async () => await setLocationWithLyft(this.udid, latitude, longitude), async () => await setLocationWithIdb(this.idb, latitude, longitude), async () => await setLocationWithAppleScript(this, latitude, longitude, this._locationMenu)];
77
+ let lastError;
78
+ for (const setter of locationSetters) {
79
+ try {
80
+ await setter();
81
+ return true;
82
+ } catch (e) {
83
+ _logger.default.info(e.message);
84
+ lastError = e;
85
+ }
86
+ }
87
+ throw lastError;
88
+ };
89
+ var _default = extensions;
90
+ exports.default = _default;
91
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMWUZUX1NFVF9MT0NBVElPTiIsIkRFQ0lNQUxfU0VQQVJBVE9SX1NDUklQVCIsInNldExvY2F0aW9uV2l0aEx5ZnQiLCJ1ZGlkIiwibGF0aXR1ZGUiLCJsb25naXR1ZGUiLCJmcyIsIndoaWNoIiwiZSIsIkVycm9yIiwiZXhlYyIsInN0ZGVyciIsIm1lc3NhZ2UiLCJzZXRMb2NhdGlvbldpdGhJZGIiLCJpZGIiLCJzZXRMb2NhdGlvbiIsInNldExvY2F0aW9uV2l0aEFwcGxlU2NyaXB0Iiwic2ltIiwibWVudSIsInN0ZG91dCIsImRlY2ltYWxTZXBhcmF0b3IiLCJfIiwidHJpbSIsImxhdGl0dWRlU3RyIiwibG9uZ2l0dWRlU3RyIiwibWFwIiwiY29vcmQiLCJyZXBsYWNlIiwib3V0cHV0IiwiZXhlY3V0ZVVJQ2xpZW50U2NyaXB0IiwibG9nIiwiZGVidWciLCJleHRlbnNpb25zIiwic2V0R2VvbG9jYXRpb24iLCJsb2NhdGlvblNldHRlcnMiLCJfbG9jYXRpb25NZW51IiwibGFzdEVycm9yIiwic2V0dGVyIiwiaW5mbyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9leHRlbnNpb25zL2dlb2xvY2F0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBmc30gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuXG5jb25zdCBMWUZUX1NFVF9MT0NBVElPTiA9ICdzZXQtc2ltdWxhdG9yLWxvY2F0aW9uJztcbmNvbnN0IERFQ0lNQUxfU0VQQVJBVE9SX1NDUklQVCA9IGBcbnVzZSBmcmFtZXdvcmsgXCJGb3VuZGF0aW9uXCJcbnVzZSBmcmFtZXdvcmsgXCJBcHBLaXRcIlxudXNlIHNjcmlwdGluZyBhZGRpdGlvbnNcblxuc2V0IHRoZUZvcm1hdHRlciB0byBjdXJyZW50IGFwcGxpY2F0aW9uJ3MgTlNOdW1iZXJGb3JtYXR0ZXIncyBuZXcoKVxuc2V0IHJlc3VsdCB0byB0aGVGb3JtYXR0ZXIncyBkZWNpbWFsU2VwYXJhdG9yKClcbmxvZyByZXN1bHQgYXMgc3RyaW5nXG5gO1xuXG4vKipcbiAqIFNldCBjdXN0b20gZ2VvbG9jYXRpb24gcGFyYW1ldGVycyBmb3IgdGhlIGdpdmVuIFNpbXVsYXRvciB1c2luZyBMWUZUX1NFVF9MT0NBVElPTi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdWRpZCAtIFRoZSB1ZGlkIHRvIHNldCB0aGUgZ2l2ZW4gZ2VvbG9jYXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbGF0aXR1ZGUgLSBUaGUgbGF0aXR1ZGUgdmFsdWUsIHdoaWNoIGlzIGdvaW5nIHRvIGJlIGVudGVyZWRcbiAqICAgaW50byB0aGUgY29ycmVzcG9uZGluZyBlZGl0IGZpZWxkLCBmb3IgZXhhbXBsZSAnMzksMDAwNicuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGxvbmdpdHVkZSAtIFRoZSBsb25naXR1ZGUgdmFsdWUsIHdoaWNoIGlzIGdvaW5nIHRvIGJlIGVudGVyZWRcbiAqICAgaW50byB0aGUgY29ycmVzcG9uZGluZyBlZGl0IGZpZWxkLCBmb3IgZXhhbXBsZSAnMTksMDA2OCcuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgaXQgZmFpbGVkIHRvIHNldCB0aGUgbG9jYXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2V0TG9jYXRpb25XaXRoTHlmdCAodWRpZCwgbGF0aXR1ZGUsIGxvbmdpdHVkZSkge1xuICB0cnkge1xuICAgIGF3YWl0IGZzLndoaWNoKExZRlRfU0VUX0xPQ0FUSU9OKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7TFlGVF9TRVRfTE9DQVRJT059JyBiaW5hcnkgaGFzIG5vdCBiZWVuIGZvdW5kIGluIHlvdXIgUEFUSC4gYCArXG4gICAgICAnUGxlYXNlIGluc3RhbGwgaXQgYXMgXCJicmV3IGluc3RhbGwgbHlmdC9mb3JtdWxhZS9zZXQtc2ltdWxhdG9yLWxvY2F0aW9uXCIgYnkgYnJldyBvciAnICtcbiAgICAgICdyZWFkIGh0dHBzOi8vZ2l0aHViLmNvbS9seWZ0L3NldC1zaW11bGF0b3ItbG9jYXRpb24gdG8gc2V0IHRoZSBiaW5hcnkgYnkgbWFudWFsIHRvICcgK1xuICAgICAgJ2JlIGFibGUgdG8gc2V0IGdlb2xvY2F0aW9uIGJ5IHRoZSBsaWJyYXJ5LicpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjKExZRlRfU0VUX0xPQ0FUSU9OLCBbXG4gICAgICAnLWMnLCBsYXRpdHVkZSwgbG9uZ2l0dWRlLFxuICAgICAgJy11JywgdWRpZFxuICAgIF0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc2V0IGdlb2xvY2F0aW9uIHdpdGggJyR7TFlGVF9TRVRfTE9DQVRJT059Jy4gYCArXG4gICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5zdGRlcnIgfHwgZS5tZXNzYWdlfWApO1xuICB9XG59XG5cbi8qKlxuICogU2V0IGN1c3RvbSBnZW9sb2NhdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGUgZ2l2ZW4gU2ltdWxhdG9yIHVzaW5nIGlkYi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaWRiIC0gVGhlIElEQiBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBsYXRpdHVkZSAtIFRoZSBsYXRpdHVkZSB2YWx1ZSwgd2hpY2ggaXMgZ29pbmcgdG8gYmUgZW50ZXJlZFxuICogICBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIGVkaXQgZmllbGQsIGZvciBleGFtcGxlICczOSwwMDA2Jy5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbG9uZ2l0dWRlIC0gVGhlIGxvbmdpdHVkZSB2YWx1ZSwgd2hpY2ggaXMgZ29pbmcgdG8gYmUgZW50ZXJlZFxuICogICBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIGVkaXQgZmllbGQsIGZvciBleGFtcGxlICcxOSwwMDY4Jy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBmYWlsZWQgdG8gc2V0IHRoZSBsb2NhdGlvblxuICovXG5hc3luYyBmdW5jdGlvbiBzZXRMb2NhdGlvbldpdGhJZGIgKGlkYiwgbGF0aXR1ZGUsIGxvbmdpdHVkZSkge1xuICBpZiAoIWlkYikge1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHNldCBnZW9sb2NhdGlvbiB3aXRoIGlkYiBiZWNhdXNlIGl0IGlzIG5vdCBpbnN0YWxsZWQgb3IgdGhlIFwibGF1bmNoV2l0aElEQlwiIGNhcGFiaWxpdHkgd2FzIG5vdCBzZXQnKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgaWRiLnNldExvY2F0aW9uKGxhdGl0dWRlLCBsb25naXR1ZGUpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc2V0IGdlb2xvY2F0aW9uIHdpdGggaWRiLiBPcmlnaW5hbCBlcnJvcjogJHtlLnN0ZGVyciB8fCBlLm1lc3NhZ2V9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZXQgY3VzdG9tIGdlb2xvY2F0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBnaXZlbiBTaW11bGF0b3IgdXNpbmcgQXBwbGVTY3JpcHRcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2ltIC0gVGhlIFNpbXVsYXRvclhjb2RlIG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBsYXRpdHVkZSAtIFRoZSBsYXRpdHVkZSB2YWx1ZSwgd2hpY2ggaXMgZ29pbmcgdG8gYmUgZW50ZXJlZFxuICogICBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIGVkaXQgZmllbGQsIGZvciBleGFtcGxlICczOSwwMDA2Jy5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbG9uZ2l0dWRlIC0gVGhlIGxvbmdpdHVkZSB2YWx1ZSwgd2hpY2ggaXMgZ29pbmcgdG8gYmUgZW50ZXJlZFxuICogICBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIGVkaXQgZmllbGQsIGZvciBleGFtcGxlICcxOSwwMDY4Jy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVudT1EZWJ1Z10gLSBUaGUgbWVudSBmaWVsZCBpbiB3aGljaCB0aGUgJ0xvY2F0aW9uJyBmZWF0dXJlIGlzIGZvdW5kXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgaXQgZmFpbGVkIHRvIHNldCB0aGUgbG9jYXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2V0TG9jYXRpb25XaXRoQXBwbGVTY3JpcHQgKHNpbSwgbGF0aXR1ZGUsIGxvbmdpdHVkZSwgbWVudSA9ICdEZWJ1ZycpIHtcbiAgLy8gTWFrZSBzdXJlIHN5c3RlbS13aWRlIGRlY2ltYWwgc2VwYXJhdG9yIGlzIHVzZWRcbiAgY29uc3Qge3N0ZG91dCwgc3RkZXJyfSA9IGF3YWl0IGV4ZWMoJ29zYXNjcmlwdCcsIFsnLWUnLCBERUNJTUFMX1NFUEFSQVRPUl9TQ1JJUFRdKTtcbiAgY29uc3QgZGVjaW1hbFNlcGFyYXRvciA9IF8udHJpbShzdGRvdXQgfHwgc3RkZXJyKTtcbiAgY29uc3QgW2xhdGl0dWRlU3RyLCBsb25naXR1ZGVTdHJdID0gW2xhdGl0dWRlLCBsb25naXR1ZGVdXG4gICAgLm1hcCgoY29vcmQpID0+IGAke2Nvb3JkfWAucmVwbGFjZSgvWy4sXS8sIGRlY2ltYWxTZXBhcmF0b3IpKTtcblxuICBjb25zdCBvdXRwdXQgPSBhd2FpdCBzaW0uZXhlY3V0ZVVJQ2xpZW50U2NyaXB0KGBcbiAgICB0ZWxsIGFwcGxpY2F0aW9uIFwiU3lzdGVtIEV2ZW50c1wiXG4gICAgICB0ZWxsIHByb2Nlc3MgXCJTaW11bGF0b3JcIlxuICAgICAgICBzZXQgZmVhdHVyZU5hbWUgdG8gXCJDdXN0b20gTG9jYXRpb25cIlxuICAgICAgICBzZXQgZHN0TWVudUl0ZW0gdG8gbWVudSBpdGVtIChmZWF0dXJlTmFtZSAmIFwi4oCmXCIpIG9mIG1lbnUgMSBvZiBtZW51IGl0ZW0gXCJMb2NhdGlvblwiIG9mIG1lbnUgMSBvZiBtZW51IGJhciBpdGVtIFwiJHttZW51fVwiIG9mIG1lbnUgYmFyIDFcbiAgICAgICAgY2xpY2sgZHN0TWVudUl0ZW1cbiAgICAgICAgZGVsYXkgMVxuICAgICAgICBzZXQgdmFsdWUgb2YgdGV4dCBmaWVsZCAxIG9mIHdpbmRvdyBmZWF0dXJlTmFtZSB0byBcIiR7bGF0aXR1ZGVTdHJ9XCJcbiAgICAgICAgZGVsYXkgMC41XG4gICAgICAgIHNldCB2YWx1ZSBvZiB0ZXh0IGZpZWxkIDIgb2Ygd2luZG93IGZlYXR1cmVOYW1lIHRvIFwiJHtsb25naXR1ZGVTdHJ9XCJcbiAgICAgICAgZGVsYXkgMC41XG4gICAgICAgIGNsaWNrIGJ1dHRvbiBcIk9LXCIgb2Ygd2luZG93IGZlYXR1cmVOYW1lXG4gICAgICAgIGRlbGF5IDAuNVxuICAgICAgICBzZXQgaXNJbnZpc2libGUgdG8gKG5vdCAoZXhpc3RzICh3aW5kb3cgZmVhdHVyZU5hbWUpKSlcbiAgICAgIGVuZCB0ZWxsXG4gICAgZW5kIHRlbGxcbiAgYCk7XG4gIGxvZy5kZWJ1ZyhgR2VvbG9jYXRpb24gcGFyYW1ldGVycyBkaWFsb2cgYWNjZXB0ZWQ6ICR7b3V0cHV0fWApO1xuICBpZiAoXy50cmltKG91dHB1dCkgIT09ICd0cnVlJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHNldCBnZW9sb2NhdGlvbiB3aXRoIEFwcGxlU2NyaXB0LiBPcmlnaW5hbCBlcnJvcjogJHtvdXRwdXR9YCk7XG4gIH1cbn1cblxuY29uc3QgZXh0ZW5zaW9ucyA9IHt9O1xuXG4vKipcbiAqIFNldCBjdXN0b20gZ2VvbG9jYXRpb24gcGFyYW1ldGVycyBmb3IgdGhlIGdpdmVuIFNpbXVsYXRvciB1c2luZyBBcHBsZVNjcmlwdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGxhdGl0dWRlIC0gVGhlIGxhdGl0dWRlIHZhbHVlLCB3aGljaCBpcyBnb2luZyB0byBiZSBlbnRlcmVkXG4gKiAgIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgZWRpdCBmaWVsZCwgZm9yIGV4YW1wbGUgJzM5LDAwMDYnLlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBsb25naXR1ZGUgLSBUaGUgbG9uZ2l0dWRlIHZhbHVlLCB3aGljaCBpcyBnb2luZyB0byBiZSBlbnRlcmVkXG4gKiAgIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgZWRpdCBmaWVsZCwgZm9yIGV4YW1wbGUgJzE5LDAwNjgnLlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGdpdmVuIHBhcmFtZXRlcnMgaGF2ZSBjb3JyZWN0IGZvcm1hdCBhbmQgd2VyZSBzdWNjZXNzZnVsbHkgYWNjZXB0ZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHNldHRpbmcgdGhlIGxvY2F0aW9uXG4gKi9cbmV4dGVuc2lvbnMuc2V0R2VvbG9jYXRpb24gPSBhc3luYyBmdW5jdGlvbiBzZXRHZW9sb2NhdGlvbiAobGF0aXR1ZGUsIGxvbmdpdHVkZSkge1xuICBjb25zdCBsb2NhdGlvblNldHRlcnMgPSBbXG4gICAgYXN5bmMgKCkgPT4gYXdhaXQgc2V0TG9jYXRpb25XaXRoTHlmdCh0aGlzLnVkaWQsIGxhdGl0dWRlLCBsb25naXR1ZGUpLFxuICAgIGFzeW5jICgpID0+IGF3YWl0IHNldExvY2F0aW9uV2l0aElkYih0aGlzLmlkYiwgbGF0aXR1ZGUsIGxvbmdpdHVkZSksXG4gICAgYXN5bmMgKCkgPT4gYXdhaXQgc2V0TG9jYXRpb25XaXRoQXBwbGVTY3JpcHQodGhpcywgbGF0aXR1ZGUsIGxvbmdpdHVkZSwgdGhpcy5fbG9jYXRpb25NZW51KSxcbiAgXTtcblxuICBsZXQgbGFzdEVycm9yO1xuICBmb3IgKGNvbnN0IHNldHRlciBvZiBsb2NhdGlvblNldHRlcnMpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2V0dGVyKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuaW5mbyhlLm1lc3NhZ2UpO1xuICAgICAgbGFzdEVycm9yID0gZTtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbGFzdEVy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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geolocation.js","names":["LYFT_SET_LOCATION","DECIMAL_SEPARATOR_SCRIPT","setLocationWithLyft","udid","latitude","longitude","fs","which","e","Error","exec","stderr","message","setLocationWithIdb","idb","setLocation","setLocationWithAppleScript","sim","menu","stdout","decimalSeparator","_","trim","latitudeStr","longitudeStr","map","coord","replace","output","executeUIClientScript","log","debug","extensions","setGeolocation","locationSetters","_locationMenu","lastError","setter","info"],"sources":["../../../lib/extensions/geolocation.js"],"sourcesContent":["import _ from 'lodash';\nimport { fs} from '@appium/support';\nimport log from '../logger';\nimport { exec } from 'teen_process';\n\nconst LYFT_SET_LOCATION = 'set-simulator-location';\nconst DECIMAL_SEPARATOR_SCRIPT = `\nuse framework \"Foundation\"\nuse framework \"AppKit\"\nuse scripting additions\n\nset theFormatter to current application's NSNumberFormatter's new()\nset result to theFormatter's decimalSeparator()\nlog result as string\n`;\n\n/**\n * Set custom geolocation parameters for the given Simulator using LYFT_SET_LOCATION.\n *\n * @param {string} udid - The udid to set the given geolocation\n * @param {string|number} latitude - The latitude value, which is going to be entered\n * into the corresponding edit field, for example '39,0006'.\n * @param {string|number} longitude - The longitude value, which is going to be entered\n * into the corresponding edit field, for example '19,0068'.\n * @throws {Error} If it failed to set the location\n */\nasync function setLocationWithLyft (udid, latitude, longitude) {\n try {\n await fs.which(LYFT_SET_LOCATION);\n } catch (e) {\n throw new Error(`'${LYFT_SET_LOCATION}' binary has not been found in your PATH. ` +\n 'Please install it as \"brew install lyft/formulae/set-simulator-location\" by brew or ' +\n 'read https://github.com/lyft/set-simulator-location to set the binary by manual to ' +\n 'be able to set geolocation by the library.');\n }\n\n try {\n await exec(LYFT_SET_LOCATION, [\n '-c', latitude, longitude,\n '-u', udid\n ]);\n } catch (e) {\n throw new Error(`Failed to set geolocation with '${LYFT_SET_LOCATION}'. ` +\n `Original error: ${e.stderr || e.message}`);\n }\n}\n\n/**\n * Set custom geolocation parameters for the given Simulator using idb.\n *\n * @param {Object} idb - The IDB instance\n * @param {string|number} latitude - The latitude value, which is going to be entered\n * into the corresponding edit field, for example '39,0006'.\n * @param {string|number} longitude - The longitude value, which is going to be entered\n * into the corresponding edit field, for example '19,0068'.\n * @throws {Error} If it failed to set the location\n */\nasync function setLocationWithIdb (idb, latitude, longitude) {\n if (!idb) {\n throw new Error('Failed to set geolocation with idb because it is not installed or the \"launchWithIDB\" capability was not set');\n }\n\n try {\n await idb.setLocation(latitude, longitude);\n } catch (e) {\n throw new Error(`Failed to set geolocation with idb. Original error: ${e.stderr || e.message}`);\n }\n}\n\n/**\n * Set custom geolocation parameters for the given Simulator using AppleScript\n *\n * @param {Object} sim - The SimulatorXcode object\n * @param {string|number} latitude - The latitude value, which is going to be entered\n * into the corresponding edit field, for example '39,0006'.\n * @param {string|number} longitude - The longitude value, which is going to be entered\n * into the corresponding edit field, for example '19,0068'.\n * @param {string} [menu=Debug] - The menu field in which the 'Location' feature is found\n * @throws {Error} If it failed to set the location\n */\nasync function setLocationWithAppleScript (sim, latitude, longitude, menu = 'Debug') {\n // Make sure system-wide decimal separator is used\n const {stdout, stderr} = await exec('osascript', ['-e', DECIMAL_SEPARATOR_SCRIPT]);\n const decimalSeparator = _.trim(stdout || stderr);\n const [latitudeStr, longitudeStr] = [latitude, longitude]\n .map((coord) => `${coord}`.replace(/[.,]/, decimalSeparator));\n\n const output = await sim.executeUIClientScript(`\n tell application \"System Events\"\n tell process \"Simulator\"\n set featureName to \"Custom Location\"\n set dstMenuItem to menu item (featureName & \"…\") of menu 1 of menu item \"Location\" of menu 1 of menu bar item \"${menu}\" of menu bar 1\n click dstMenuItem\n delay 1\n set value of text field 1 of window featureName to \"${latitudeStr}\"\n delay 0.5\n set value of text field 2 of window featureName to \"${longitudeStr}\"\n delay 0.5\n click button \"OK\" of window featureName\n delay 0.5\n set isInvisible to (not (exists (window featureName)))\n end tell\n end tell\n `);\n log.debug(`Geolocation parameters dialog accepted: ${output}`);\n if (_.trim(output) !== 'true') {\n throw new Error(`Failed to set geolocation with AppleScript. Original error: ${output}`);\n }\n}\n\nconst extensions = {};\n\n/**\n * Set custom geolocation parameters for the given Simulator using AppleScript.\n *\n * @param {string|number} latitude - The latitude value, which is going to be entered\n * into the corresponding edit field, for example '39,0006'.\n * @param {string|number} longitude - The longitude value, which is going to be entered\n * into the corresponding edit field, for example '19,0068'.\n * @returns {boolean} True if the given parameters have correct format and were successfully accepted.\n * @throws {Error} If there was an error while setting the location\n */\nextensions.setGeolocation = async function setGeolocation (latitude, longitude) {\n const locationSetters = [\n async () => await setLocationWithLyft(this.udid, latitude, longitude),\n async () => await setLocationWithIdb(this.idb, latitude, longitude),\n async () => await setLocationWithAppleScript(this, latitude, longitude, this._locationMenu),\n ];\n\n let lastError;\n for (const setter of locationSetters) {\n try {\n await setter();\n return true;\n } catch (e) {\n log.info(e.message);\n lastError = e;\n }\n }\n throw lastError;\n};\n\nexport default extensions;\n"],"mappings":"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"}
@@ -6,13 +6,19 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.default = void 0;
8
8
  require("source-map-support/register");
9
- var _prepareApps = _interopRequireDefault(require("./prepare-apps"));
10
- var _isolateSim = require("./isolate-sim");
11
- let extensions = {};
12
- let allExtensions = [_prepareApps.default, _isolateSim.extensions];
13
- for (let obj of allExtensions) {
14
- Object.assign(extensions, obj);
9
+ var _applications = _interopRequireDefault(require("./applications"));
10
+ var _safari = _interopRequireDefault(require("./safari"));
11
+ var _keychain = _interopRequireDefault(require("./keychain"));
12
+ var _geolocation = _interopRequireDefault(require("./geolocation"));
13
+ var _settings = _interopRequireDefault(require("./settings"));
14
+ var _biometric = _interopRequireDefault(require("./biometric"));
15
+ var _permissions = _interopRequireDefault(require("./permissions"));
16
+ var _misc = _interopRequireDefault(require("./misc"));
17
+ const extensions = {};
18
+ const allExtensions = [_applications.default, _safari.default, _keychain.default, _geolocation.default, _settings.default, _biometric.default, _permissions.default, _misc.default];
19
+ for (const ext of allExtensions) {
20
+ Object.assign(extensions, ext);
15
21
  }
16
22
  var _default = extensions;
17
23
  exports.default = _default;
18
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleHRlbnNpb25zIiwiYWxsRXh0ZW5zaW9ucyIsInByZXBhcmVBcHBzRXh0ZW5zaW9ucyIsImlzb2xhdGVFeHRlbnNpb25zIiwib2JqIiwiT2JqZWN0IiwiYXNzaWduIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2V4dGVuc2lvbnMvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHByZXBhcmVBcHBzRXh0ZW5zaW9ucyBmcm9tICcuL3ByZXBhcmUtYXBwcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIGFzIGlzb2xhdGVFeHRlbnNpb25zIH0gZnJvbSAnLi9pc29sYXRlLXNpbSc7XG5cblxubGV0IGV4dGVuc2lvbnMgPSB7fTtcblxubGV0IGFsbEV4dGVuc2lvbnMgPSBbcHJlcGFyZUFwcHNFeHRlbnNpb25zLCBpc29sYXRlRXh0ZW5zaW9uc107XG5mb3IgKGxldCBvYmogb2YgYWxsRXh0ZW5zaW9ucykge1xuICBPYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIG9iaik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUdBLElBQUlBLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFFbkIsSUFBSUMsYUFBYSxHQUFHLENBQUNDLG9CQUFxQixFQUFFQyxzQkFBaUIsQ0FBQztBQUM5RCxLQUFLLElBQUlDLEdBQUcsSUFBSUgsYUFBYSxFQUFFO0VBQzdCSSxNQUFNLENBQUNDLE1BQU0sQ0FBQ04sVUFBVSxFQUFFSSxHQUFHLENBQUM7QUFDaEM7QUFBQyxlQUVjSixVQUFVO0FBQUEifQ==
24
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleHRlbnNpb25zIiwiYWxsRXh0ZW5zaW9ucyIsImFwcEV4dGVuc2lvbnMiLCJzYWZhcmlFeHRlbnNpb25zIiwia2V5Y2hhaW5FeHRlbnNpb25zIiwiZ2Vsb2xvY2F0aW9uRXh0ZW5zaW9ucyIsInNldHRpbmdzRXh0ZW5zaW9ucyIsImJpb21ldHJpY0V4dGVuc2lvbnMiLCJwZXJtaXNzaW9uc0V4dGVuc2lvbnMiLCJtaXNjRXh0ZW5zaW9ucyIsImV4dCIsIk9iamVjdCIsImFzc2lnbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9leHRlbnNpb25zL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhcHBFeHRlbnNpb25zIGZyb20gJy4vYXBwbGljYXRpb25zJztcbmltcG9ydCBzYWZhcmlFeHRlbnNpb25zIGZyb20gJy4vc2FmYXJpJztcbmltcG9ydCBrZXljaGFpbkV4dGVuc2lvbnMgZnJvbSAnLi9rZXljaGFpbic7XG5pbXBvcnQgZ2Vsb2xvY2F0aW9uRXh0ZW5zaW9ucyBmcm9tICcuL2dlb2xvY2F0aW9uJztcbmltcG9ydCBzZXR0aW5nc0V4dGVuc2lvbnMgZnJvbSAnLi9zZXR0aW5ncyc7XG5pbXBvcnQgYmlvbWV0cmljRXh0ZW5zaW9ucyBmcm9tICcuL2Jpb21ldHJpYyc7XG5pbXBvcnQgcGVybWlzc2lvbnNFeHRlbnNpb25zIGZyb20gJy4vcGVybWlzc2lvbnMnO1xuaW1wb3J0IG1pc2NFeHRlbnNpb25zIGZyb20gJy4vbWlzYyc7XG5cbmNvbnN0IGV4dGVuc2lvbnMgPSB7fTtcblxuY29uc3QgYWxsRXh0ZW5zaW9ucyA9IFtcbiAgYXBwRXh0ZW5zaW9ucyxcbiAgc2FmYXJpRXh0ZW5zaW9ucyxcbiAga2V5Y2hhaW5FeHRlbnNpb25zLFxuICBnZWxvbG9jYXRpb25FeHRlbnNpb25zLFxuICBzZXR0aW5nc0V4dGVuc2lvbnMsXG4gIGJpb21ldHJpY0V4dGVuc2lvbnMsXG4gIHBlcm1pc3Npb25zRXh0ZW5zaW9ucyxcbiAgbWlzY0V4dGVuc2lvbnMsXG4gIC8vIGFkZCBuZXcgZXh0ZW5zaW9ucyBoZXJlXG5dO1xuZm9yIChjb25zdCBleHQgb2YgYWxsRXh0ZW5zaW9ucykge1xuICBPYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGV4dCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLE1BQU1BLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFFckIsTUFBTUMsYUFBYSxHQUFHLENBQ3BCQyxxQkFBYSxFQUNiQyxlQUFnQixFQUNoQkMsaUJBQWtCLEVBQ2xCQyxvQkFBc0IsRUFDdEJDLGlCQUFrQixFQUNsQkMsa0JBQW1CLEVBQ25CQyxvQkFBcUIsRUFDckJDLGFBQWMsQ0FFZjtBQUNELEtBQUssTUFBTUMsR0FBRyxJQUFJVCxhQUFhLEVBQUU7RUFDL0JVLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDWixVQUFVLEVBQUVVLEdBQUcsQ0FBQztBQUNoQztBQUFDLGVBRWNWLFVBQVU7QUFBQSJ9