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.
- package/CHANGELOG.md +14 -0
- package/README.md +38 -79
- package/build/index.js +21 -31
- package/build/lib/extensions/applications.js +112 -0
- package/build/lib/extensions/applications.js.map +1 -0
- package/build/lib/extensions/biometric.js +49 -0
- package/build/lib/extensions/biometric.js.map +1 -0
- package/build/lib/extensions/geolocation.js +91 -0
- package/build/lib/extensions/geolocation.js.map +1 -0
- package/build/lib/extensions/index.js +13 -7
- package/build/lib/extensions/index.js.map +1 -1
- package/build/lib/extensions/keychain.js +85 -0
- package/build/lib/extensions/keychain.js.map +1 -0
- package/build/lib/extensions/misc.js +23 -0
- package/build/lib/extensions/misc.js.map +1 -0
- package/build/lib/extensions/permissions.js +99 -0
- package/build/lib/extensions/permissions.js.map +1 -0
- package/build/lib/extensions/safari.js +56 -0
- package/build/lib/extensions/safari.js.map +1 -0
- package/build/lib/extensions/settings.js +42 -0
- package/build/lib/extensions/settings.js.map +1 -0
- package/build/lib/simulator-xcode-10.js +2 -2
- package/build/lib/simulator-xcode-10.js.map +1 -1
- package/build/lib/simulator-xcode-11.4.js +36 -6
- package/build/lib/simulator-xcode-11.4.js.map +1 -1
- package/build/lib/simulator-xcode-8.js +236 -103
- package/build/lib/simulator-xcode-8.js.map +1 -1
- package/build/lib/simulator-xcode-9.js +2 -6
- package/build/lib/simulator-xcode-9.js.map +1 -1
- package/build/lib/simulator.js +20 -47
- package/build/lib/simulator.js.map +1 -1
- package/build/lib/utils.js +11 -156
- package/build/lib/utils.js.map +1 -1
- package/index.js +2 -14
- package/lib/extensions/applications.js +172 -0
- package/lib/extensions/biometric.js +62 -0
- package/lib/{geolocation.js → extensions/geolocation.js} +34 -5
- package/lib/extensions/index.js +22 -7
- package/lib/extensions/keychain.js +124 -0
- package/lib/extensions/misc.js +39 -0
- package/lib/extensions/permissions.js +167 -0
- package/lib/extensions/safari.js +93 -0
- package/lib/extensions/settings.js +75 -0
- package/lib/simulator-xcode-10.js +2 -2
- package/lib/simulator-xcode-11.4.js +49 -11
- package/lib/simulator-xcode-8.js +434 -182
- package/lib/simulator-xcode-9.js +4 -12
- package/lib/simulator.js +12 -55
- package/lib/utils.js +9 -200
- package/package.json +1 -2
- package/build/lib/calendar.js +0 -58
- package/build/lib/calendar.js.map +0 -1
- package/build/lib/certificate.js +0 -154
- package/build/lib/certificate.js.map +0 -1
- package/build/lib/extensions/isolate-sim.js +0 -28
- package/build/lib/extensions/isolate-sim.js.map +0 -1
- package/build/lib/extensions/prepare-apps.js +0 -55
- package/build/lib/extensions/prepare-apps.js.map +0 -1
- package/build/lib/geolocation.js +0 -76
- package/build/lib/geolocation.js.map +0 -1
- package/build/lib/permissions.js +0 -80
- package/build/lib/permissions.js.map +0 -1
- package/build/lib/settings.js +0 -243
- package/build/lib/settings.js.map +0 -1
- package/build/lib/simulator-xcode-6.js +0 -863
- package/build/lib/simulator-xcode-6.js.map +0 -1
- package/build/lib/simulator-xcode-7.3.js +0 -18
- package/build/lib/simulator-xcode-7.3.js.map +0 -1
- package/build/lib/simulator-xcode-7.js +0 -60
- package/build/lib/simulator-xcode-7.js.map +0 -1
- package/build/lib/tail-until.js +0 -31
- package/build/lib/tail-until.js.map +0 -1
- package/build/lib/tcc-db.js +0 -44
- package/build/lib/tcc-db.js.map +0 -1
- package/lib/calendar.js +0 -80
- package/lib/certificate.js +0 -231
- package/lib/extensions/isolate-sim.js +0 -30
- package/lib/extensions/prepare-apps.js +0 -57
- package/lib/permissions.js +0 -105
- package/lib/settings.js +0 -286
- package/lib/simulator-xcode-6.js +0 -1545
- package/lib/simulator-xcode-7.3.js +0 -18
- package/lib/simulator-xcode-7.js +0 -59
- package/lib/tail-until.js +0 -40
- 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
|
[](https://npmjs.org/package/appium-ios-simulator)
|
|
4
4
|
[](https://npmjs.org/package/appium-ios-simulator)
|
|
5
5
|
|
|
6
|
-
[](https://travis-ci.org/appium/appium-ios-simulator)
|
|
7
6
|
|
|
8
|
-
Appium API for dealing with iOS simulators.
|
|
7
|
+
Appium API for dealing with iOS simulators. The API enables you to use the following features:
|
|
9
8
|
|
|
10
|
-
|
|
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
|
-
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
|
|
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
|
|
9
|
-
var
|
|
10
|
-
|
|
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
|
|
10
|
-
var
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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,
|
|
24
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleHRlbnNpb25zIiwiYWxsRXh0ZW5zaW9ucyIsImFwcEV4dGVuc2lvbnMiLCJzYWZhcmlFeHRlbnNpb25zIiwia2V5Y2hhaW5FeHRlbnNpb25zIiwiZ2Vsb2xvY2F0aW9uRXh0ZW5zaW9ucyIsInNldHRpbmdzRXh0ZW5zaW9ucyIsImJpb21ldHJpY0V4dGVuc2lvbnMiLCJwZXJtaXNzaW9uc0V4dGVuc2lvbnMiLCJtaXNjRXh0ZW5zaW9ucyIsImV4dCIsIk9iamVjdCIsImFzc2lnbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9leHRlbnNpb25zL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhcHBFeHRlbnNpb25zIGZyb20gJy4vYXBwbGljYXRpb25zJztcbmltcG9ydCBzYWZhcmlFeHRlbnNpb25zIGZyb20gJy4vc2FmYXJpJztcbmltcG9ydCBrZXljaGFpbkV4dGVuc2lvbnMgZnJvbSAnLi9rZXljaGFpbic7XG5pbXBvcnQgZ2Vsb2xvY2F0aW9uRXh0ZW5zaW9ucyBmcm9tICcuL2dlb2xvY2F0aW9uJztcbmltcG9ydCBzZXR0aW5nc0V4dGVuc2lvbnMgZnJvbSAnLi9zZXR0aW5ncyc7XG5pbXBvcnQgYmlvbWV0cmljRXh0ZW5zaW9ucyBmcm9tICcuL2Jpb21ldHJpYyc7XG5pbXBvcnQgcGVybWlzc2lvbnNFeHRlbnNpb25zIGZyb20gJy4vcGVybWlzc2lvbnMnO1xuaW1wb3J0IG1pc2NFeHRlbnNpb25zIGZyb20gJy4vbWlzYyc7XG5cbmNvbnN0IGV4dGVuc2lvbnMgPSB7fTtcblxuY29uc3QgYWxsRXh0ZW5zaW9ucyA9IFtcbiAgYXBwRXh0ZW5zaW9ucyxcbiAgc2FmYXJpRXh0ZW5zaW9ucyxcbiAga2V5Y2hhaW5FeHRlbnNpb25zLFxuICBnZWxvbG9jYXRpb25FeHRlbnNpb25zLFxuICBzZXR0aW5nc0V4dGVuc2lvbnMsXG4gIGJpb21ldHJpY0V4dGVuc2lvbnMsXG4gIHBlcm1pc3Npb25zRXh0ZW5zaW9ucyxcbiAgbWlzY0V4dGVuc2lvbnMsXG4gIC8vIGFkZCBuZXcgZXh0ZW5zaW9ucyBoZXJlXG5dO1xuZm9yIChjb25zdCBleHQgb2YgYWxsRXh0ZW5zaW9ucykge1xuICBPYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGV4dCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLE1BQU1BLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFFckIsTUFBTUMsYUFBYSxHQUFHLENBQ3BCQyxxQkFBYSxFQUNiQyxlQUFnQixFQUNoQkMsaUJBQWtCLEVBQ2xCQyxvQkFBc0IsRUFDdEJDLGlCQUFrQixFQUNsQkMsa0JBQW1CLEVBQ25CQyxvQkFBcUIsRUFDckJDLGFBQWMsQ0FFZjtBQUNELEtBQUssTUFBTUMsR0FBRyxJQUFJVCxhQUFhLEVBQUU7RUFDL0JVLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDWixVQUFVLEVBQUVVLEdBQUcsQ0FBQztBQUNoQztBQUFDLGVBRWNWLFVBQVU7QUFBQSJ9
|