appium-ios-simulator 4.2.1 → 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/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 -39
- 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 -92
- package/lib/simulator.js +12 -55
- package/lib/utils.js +9 -200
- package/package.json +1 -1
- 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 -245
- package/build/lib/settings.js.map +0 -1
- package/build/lib/simulator-xcode-6.js +0 -860
- 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 -323
- package/lib/simulator-xcode-6.js +0 -1544
- 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/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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["extensions","allExtensions","
|
|
1
|
+
{"version":3,"file":"index.js","names":["extensions","allExtensions","appExtensions","safariExtensions","keychainExtensions","gelolocationExtensions","settingsExtensions","biometricExtensions","permissionsExtensions","miscExtensions","ext","Object","assign"],"sources":["../../../lib/extensions/index.js"],"sourcesContent":["import appExtensions from './applications';\nimport safariExtensions from './safari';\nimport keychainExtensions from './keychain';\nimport gelolocationExtensions from './geolocation';\nimport settingsExtensions from './settings';\nimport biometricExtensions from './biometric';\nimport permissionsExtensions from './permissions';\nimport miscExtensions from './misc';\n\nconst extensions = {};\n\nconst allExtensions = [\n appExtensions,\n safariExtensions,\n keychainExtensions,\n gelolocationExtensions,\n settingsExtensions,\n biometricExtensions,\n permissionsExtensions,\n miscExtensions,\n // add new extensions here\n];\nfor (const ext of allExtensions) {\n Object.assign(extensions, ext);\n}\n\nexport default extensions;\n"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA,MAAMA,UAAU,GAAG,CAAC,CAAC;AAErB,MAAMC,aAAa,GAAG,CACpBC,qBAAa,EACbC,eAAgB,EAChBC,iBAAkB,EAClBC,oBAAsB,EACtBC,iBAAkB,EAClBC,kBAAmB,EACnBC,oBAAqB,EACrBC,aAAc,CAEf;AACD,KAAK,MAAMC,GAAG,IAAIT,aAAa,EAAE;EAC/BU,MAAM,CAACC,MAAM,CAACZ,UAAU,EAAEU,GAAG,CAAC;AAChC;AAAC,eAEcV,UAAU;AAAA"}
|
|
@@ -0,0 +1,85 @@
|
|
|
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 _teen_process = require("teen_process");
|
|
14
|
+
var _utils = require("../utils");
|
|
15
|
+
const extensions = {};
|
|
16
|
+
extensions.getLaunchDaemonsRoot = async function getLaunchDaemonsRoot() {
|
|
17
|
+
const devRoot = await (0, _utils.getDeveloperRoot)();
|
|
18
|
+
return _path.default.resolve(devRoot, 'Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/LaunchDaemons');
|
|
19
|
+
};
|
|
20
|
+
extensions.backupKeychains = async function backupKeychains() {
|
|
21
|
+
if (!(await _support.fs.exists(this.keychainPath))) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
const backupPath = await _support.tempDir.path({
|
|
25
|
+
prefix: `keychains_backup_${Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1)}`,
|
|
26
|
+
suffix: '.zip'
|
|
27
|
+
});
|
|
28
|
+
const zipArgs = ['-r', backupPath, `${this.keychainPath}${_path.default.sep}`];
|
|
29
|
+
_logger.default.debug(`Creating keychains backup with 'zip ${zipArgs.join(' ')}' command`);
|
|
30
|
+
await (0, _teen_process.exec)('zip', zipArgs);
|
|
31
|
+
if (_lodash.default.isString(this._keychainsBackupPath) && (await _support.fs.exists(this._keychainsBackupPath))) {
|
|
32
|
+
await _support.fs.unlink(this._keychainsBackupPath);
|
|
33
|
+
}
|
|
34
|
+
this._keychainsBackupPath = backupPath;
|
|
35
|
+
return true;
|
|
36
|
+
};
|
|
37
|
+
extensions.restoreKeychains = async function restoreKeychains(excludePatterns = []) {
|
|
38
|
+
if (!_lodash.default.isString(this._keychainsBackupPath) || !(await _support.fs.exists(this._keychainsBackupPath))) {
|
|
39
|
+
throw new Error(`The keychains backup archive does not exist. ` + `Are you sure it was created before?`);
|
|
40
|
+
}
|
|
41
|
+
if (_lodash.default.isString(excludePatterns)) {
|
|
42
|
+
excludePatterns = excludePatterns.split(',').map(x => x.trim());
|
|
43
|
+
}
|
|
44
|
+
const isServerRunning = await this.isRunning();
|
|
45
|
+
let plistPath;
|
|
46
|
+
if (isServerRunning) {
|
|
47
|
+
plistPath = _path.default.resolve(await this.getLaunchDaemonsRoot(), 'com.apple.securityd.plist');
|
|
48
|
+
if (!(await _support.fs.exists(plistPath))) {
|
|
49
|
+
throw new Error(`Cannot clear keychains because '${plistPath}' does not exist`);
|
|
50
|
+
}
|
|
51
|
+
await this.simctl.spawnProcess(['launchctl', 'unload', plistPath]);
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
await _support.fs.rimraf(this.keychainPath);
|
|
55
|
+
await (0, _support.mkdirp)(this.keychainPath);
|
|
56
|
+
const unzipArgs = ['-o', this._keychainsBackupPath, ..._lodash.default.flatMap(excludePatterns.map(x => ['-x', x])), '-d', '/'];
|
|
57
|
+
_logger.default.debug(`Restoring keychains with 'unzip ${unzipArgs.join(' ')}' command`);
|
|
58
|
+
await (0, _teen_process.exec)('unzip', unzipArgs);
|
|
59
|
+
await _support.fs.unlink(this._keychainsBackupPath);
|
|
60
|
+
this._keychainsBackupPath = null;
|
|
61
|
+
} finally {
|
|
62
|
+
if (isServerRunning && plistPath) {
|
|
63
|
+
await this.simctl.spawnProcess(['launchctl', 'load', plistPath]);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return true;
|
|
67
|
+
};
|
|
68
|
+
extensions.clearKeychains = async function clearKeychains() {
|
|
69
|
+
const plistPath = _path.default.resolve(await this.getLaunchDaemonsRoot(), 'com.apple.securityd.plist');
|
|
70
|
+
if (!(await _support.fs.exists(plistPath))) {
|
|
71
|
+
throw new Error(`Cannot clear keychains because '${plistPath}' does not exist`);
|
|
72
|
+
}
|
|
73
|
+
await this.simctl.spawnProcess(['launchctl', 'unload', plistPath]);
|
|
74
|
+
try {
|
|
75
|
+
if (await _support.fs.exists(this.keychainPath)) {
|
|
76
|
+
await _support.fs.rimraf(this.keychainPath);
|
|
77
|
+
await (0, _support.mkdirp)(this.keychainPath);
|
|
78
|
+
}
|
|
79
|
+
} finally {
|
|
80
|
+
await this.simctl.spawnProcess(['launchctl', 'load', plistPath]);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
var _default = extensions;
|
|
84
|
+
exports.default = _default;
|
|
85
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleHRlbnNpb25zIiwiZ2V0TGF1bmNoRGFlbW9uc1Jvb3QiLCJkZXZSb290IiwiZ2V0RGV2ZWxvcGVyUm9vdCIsInBhdGgiLCJyZXNvbHZlIiwiYmFja3VwS2V5Y2hhaW5zIiwiZnMiLCJleGlzdHMiLCJrZXljaGFpblBhdGgiLCJiYWNrdXBQYXRoIiwidGVtcERpciIsInByZWZpeCIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsInRvU3RyaW5nIiwic3Vic3RyaW5nIiwic3VmZml4IiwiemlwQXJncyIsInNlcCIsImxvZyIsImRlYnVnIiwiam9pbiIsImV4ZWMiLCJfIiwiaXNTdHJpbmciLCJfa2V5Y2hhaW5zQmFja3VwUGF0aCIsInVubGluayIsInJlc3RvcmVLZXljaGFpbnMiLCJleGNsdWRlUGF0dGVybnMiLCJFcnJvciIsInNwbGl0IiwibWFwIiwieCIsInRyaW0iLCJpc1NlcnZlclJ1bm5pbmciLCJpc1J1bm5pbmciLCJwbGlzdFBhdGgiLCJzaW1jdGwiLCJzcGF3blByb2Nlc3MiLCJyaW1yYWYiLCJta2RpcnAiLCJ1bnppcEFyZ3MiLCJmbGF0TWFwIiwiY2xlYXJLZXljaGFpbnMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvZXh0ZW5zaW9ucy9rZXljaGFpbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBmcywgbWtkaXJwLCB0ZW1wRGlyIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgZ2V0RGV2ZWxvcGVyUm9vdCB9IGZyb20gJy4uL3V0aWxzJztcblxuY29uc3QgZXh0ZW5zaW9ucyA9IHt9O1xuXG4vKipcbiAqIFJlc29sdmUgZnVsbCBwYXRoIHRvIFNpbWxhdG9yJ3MgTGF1bmNoRGFlbW9ucyByb290IGZvbGRlclxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEZ1bGwgcGF0aCB0byBTaW1sYXRvcidzIExhdW5jaERhZW1vbnMgcm9vdCBmb2xkZXJcbiAqL1xuZXh0ZW5zaW9ucy5nZXRMYXVuY2hEYWVtb25zUm9vdCA9IGFzeW5jIGZ1bmN0aW9uIGdldExhdW5jaERhZW1vbnNSb290ICgpIHtcbiAgY29uc3QgZGV2Um9vdCA9IGF3YWl0IGdldERldmVsb3BlclJvb3QoKTtcbiAgcmV0dXJuIHBhdGgucmVzb2x2ZShcbiAgICBkZXZSb290LFxuICAgICdQbGF0Zm9ybXMvaVBob25lU2ltdWxhdG9yLnBsYXRmb3JtL0RldmVsb3Blci9TREtzL2lQaG9uZVNpbXVsYXRvci5zZGsvU3lzdGVtL0xpYnJhcnkvTGF1bmNoRGFlbW9ucydcbiAgKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBiYWNrdXAgb2Yga2V5Y2hhaW5zIGZvbGRlci5cbiAqIFRoZSBwcmV2aW91c2x5IGNyZWF0ZWQgYmFja3VwIHdpbGwgYmUgYXV0b21hdGljYWxseVxuICogZGVsZXRlZCBpZiB0aGlzIG1ldGhvZCB3YXMgY2FsbGVkIHR3aWNlIGluIGEgcm93IHdpdGhvdXRcbiAqIGByZXN0b3JlS2V5Y2hhaW5zYCBiZWluZyBpbnZva2VkLlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBiYWNrdXAgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsbC5cbiAqL1xuZXh0ZW5zaW9ucy5iYWNrdXBLZXljaGFpbnMgPSBhc3luYyBmdW5jdGlvbiBiYWNrdXBLZXljaGFpbnMgKCkge1xuICBpZiAoIWF3YWl0IGZzLmV4aXN0cyh0aGlzLmtleWNoYWluUGF0aCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBiYWNrdXBQYXRoID0gYXdhaXQgdGVtcERpci5wYXRoKHtcbiAgICBwcmVmaXg6IGBrZXljaGFpbnNfYmFja3VwXyR7TWF0aC5mbG9vcigoMSArIE1hdGgucmFuZG9tKCkpICogMHgxMDAwMCkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygxKX1gLFxuICAgIHN1ZmZpeDogJy56aXAnLFxuICB9KTtcbiAgY29uc3QgemlwQXJncyA9IFtcbiAgICAnLXInLCBiYWNrdXBQYXRoLFxuICAgIGAke3RoaXMua2V5Y2hhaW5QYXRofSR7cGF0aC5zZXB9YFxuICBdO1xuICBsb2cuZGVidWcoYENyZWF0aW5nIGtleWNoYWlucyBiYWNrdXAgd2l0aCAnemlwICR7emlwQXJncy5qb2luKCcgJyl9JyBjb21tYW5kYCk7XG4gIGF3YWl0IGV4ZWMoJ3ppcCcsIHppcEFyZ3MpO1xuICBpZiAoXy5pc1N0cmluZyh0aGlzLl9rZXljaGFpbnNCYWNrdXBQYXRoKSAmJiBhd2FpdCBmcy5leGlzdHModGhpcy5fa2V5Y2hhaW5zQmFja3VwUGF0aCkpIHtcbiAgICBhd2FpdCBmcy51bmxpbmsodGhpcy5fa2V5Y2hhaW5zQmFja3VwUGF0aCk7XG4gIH1cbiAgdGhpcy5fa2V5Y2hhaW5zQmFja3VwUGF0aCA9IGJhY2t1cFBhdGg7XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBSZXN0b3JlIHRoZSBwcmV2aXNvdWx5IGNyZWF0ZWQga2V5Y2hhaW5zIGJhY2t1cC5cbiAqXG4gKiBAcGFyYW0gez9zdHJpbmd8QXJyYXk8c3RyaW5nPn0gZXhjbHVkZVBhdHRlcm5zIC0gVGhlIGxpc3RcbiAqIG9mIGZpbGUgbmFtZSBwYXR0ZXJucyB0byBiZSBleGNsdWRlZCBmcm9tIHJlc3RvcmUuIFRoZSBmb3JtYXRcbiAqIG9mIGVhY2ggaXRlbSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgJy14JyBvcHRpb24gZm9ybWF0IGZvclxuICogJ3VuemlwJyB1dGlsaXR5LiBUaGlzIGNhbiBhbHNvIGJlIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZyxcbiAqIHdoaWNoIGlzIGdvaW5nIGJlIHRyYW5zZm9ybWVkIGludG8gYSBsaXN0IGF1dG9tYXRpY2FsbHksXG4gKiBmb3IgZXhhbXBsZTogJyouZGIqLGJsYWJsYS5zcWxpdGUnXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gSWYgdGhlIHJlc3RvcmUgb3ByYXRpb24gd2FzIHN1Y2Nlc3NmdWwuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgaXMgbm8ga2V5Y2hhaW5zIGJhY2t1cCBhdmFpbGFibGUgZm9yIHJlc3RvcmUuXG4gKi9cbmV4dGVuc2lvbnMucmVzdG9yZUtleWNoYWlucyA9IGFzeW5jIGZ1bmN0aW9uIHJlc3RvcmVLZXljaGFpbnMgKGV4Y2x1ZGVQYXR0ZXJucyA9IFtdKSB7XG4gIGlmICghXy5pc1N0cmluZyh0aGlzLl9rZXljaGFpbnNCYWNrdXBQYXRoKSB8fCAhYXdhaXQgZnMuZXhpc3RzKHRoaXMuX2tleWNoYWluc0JhY2t1cFBhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUga2V5Y2hhaW5zIGJhY2t1cCBhcmNoaXZlIGRvZXMgbm90IGV4aXN0LiBgICtcbiAgICAgICAgICAgICAgICAgICAgYEFyZSB5b3Ugc3VyZSBpdCB3YXMgY3JlYXRlZCBiZWZvcmU/YCk7XG4gIH1cblxuICBpZiAoXy5pc1N0cmluZyhleGNsdWRlUGF0dGVybnMpKSB7XG4gICAgZXhjbHVkZVBhdHRlcm5zID0gZXhjbHVkZVBhdHRlcm5zLnNwbGl0KCcsJykubWFwKCh4KSA9PiB4LnRyaW0oKSk7XG4gIH1cbiAgY29uc3QgaXNTZXJ2ZXJSdW5uaW5nID0gYXdhaXQgdGhpcy5pc1J1bm5pbmcoKTtcbiAgbGV0IHBsaXN0UGF0aDtcbiAgaWYgKGlzU2VydmVyUnVubmluZykge1xuICAgIHBsaXN0UGF0aCA9IHBhdGgucmVzb2x2ZShhd2FpdCB0aGlzLmdldExhdW5jaERhZW1vbnNSb290KCksICdjb20uYXBwbGUuc2VjdXJpdHlkLnBsaXN0Jyk7XG4gICAgaWYgKCFhd2FpdCBmcy5leGlzdHMocGxpc3RQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY2xlYXIga2V5Y2hhaW5zIGJlY2F1c2UgJyR7cGxpc3RQYXRofScgZG9lcyBub3QgZXhpc3RgKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5zaW1jdGwuc3Bhd25Qcm9jZXNzKFsnbGF1bmNoY3RsJywgJ3VubG9hZCcsIHBsaXN0UGF0aF0pO1xuICB9XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMucmltcmFmKHRoaXMua2V5Y2hhaW5QYXRoKTtcbiAgICBhd2FpdCBta2RpcnAodGhpcy5rZXljaGFpblBhdGgpO1xuICAgIGNvbnN0IHVuemlwQXJncyA9IFtcbiAgICAgICctbycsIHRoaXMuX2tleWNoYWluc0JhY2t1cFBhdGgsXG4gICAgICAuLi4oXy5mbGF0TWFwKGV4Y2x1ZGVQYXR0ZXJucy5tYXAoKHgpID0+IFsnLXgnLCB4XSkpKSxcbiAgICAgICctZCcsICcvJ1xuICAgIF07XG4gICAgbG9nLmRlYnVnKGBSZXN0b3Jpbmcga2V5Y2hhaW5zIHdpdGggJ3VuemlwICR7dW56aXBBcmdzLmpvaW4oJyAnKX0nIGNvbW1hbmRgKTtcbiAgICBhd2FpdCBleGVjKCd1bnppcCcsIHVuemlwQXJncyk7XG4gICAgYXdhaXQgZnMudW5saW5rKHRoaXMuX2tleWNoYWluc0JhY2t1cFBhdGgpO1xuICAgIHRoaXMuX2tleWNoYWluc0JhY2t1cFBhdGggPSBudWxsO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChpc1NlcnZlclJ1bm5pbmcgJiYgcGxpc3RQYXRoKSB7XG4gICAgICBhd2FpdCB0aGlzLnNpbWN0bC5zcGF3blByb2Nlc3MoWydsYXVuY2hjdGwnLCAnbG9hZCcsIHBsaXN0UGF0aF0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQ2xlYXJzIEtleWNoYWlucyBmb3IgdGhlIHBhcnRpY3VsYXIgc2ltdWxhdG9yIGluIHJ1bnRpbWUgKHRoZXJlIGlzIG5vIG5lZWQgdG8gc3RvcCBpdCkuXG4gKlxuICogQHRocm93cyB7RXJyb3J9IElmIGtleWNoYWluIGNsZWFudXAgaGFzIGZhaWxlZC5cbiAqL1xuZXh0ZW5zaW9ucy5jbGVhcktleWNoYWlucyA9IGFzeW5jIGZ1bmN0aW9uIGNsZWFyS2V5Y2hhaW5zICgpIHtcbiAgY29uc3QgcGxpc3RQYXRoID0gcGF0aC5yZXNvbHZlKGF3YWl0IHRoaXMuZ2V0TGF1bmNoRGFlbW9uc1Jvb3QoKSwgJ2NvbS5hcHBsZS5zZWN1cml0eWQucGxpc3QnKTtcbiAgaWYgKCFhd2FpdCBmcy5leGlzdHMocGxpc3RQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNsZWFyIGtleWNoYWlucyBiZWNhdXNlICcke3BsaXN0UGF0aH0nIGRvZXMgbm90IGV4aXN0YCk7XG4gIH1cbiAgYXdhaXQgdGhpcy5zaW1jdGwuc3Bhd25Qcm9jZXNzKFsnbGF1bmNoY3RsJywgJ3VubG9hZCcsIHBsaXN0UGF0aF0pO1xuICB0cnkge1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHModGhpcy5rZXljaGFpblBhdGgpKSB7XG4gICAgICBhd2FpdCBmcy5yaW1yYWYodGhpcy5rZXljaGFpblBhdGgpO1xuICAgICAgYXdhaXQgbWtkaXJwKHRoaXMua2V5Y2hhaW5QYXRoKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgdGhpcy5zaW1jdGwuc3Bhd25Qcm9jZXNzKFsnbGF1bmNoY3RsJywgJ2xvYWQnLCBwbGlzdFBhdGhdKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxNQUFNQSxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBT3JCQSxVQUFVLENBQUNDLG9CQUFvQixHQUFHLGVBQWVBLG9CQUFvQixHQUFJO0VBQ3ZFLE1BQU1DLE9BQU8sR0FBRyxNQUFNLElBQUFDLHVCQUFnQixHQUFFO0VBQ3hDLE9BQU9DLGFBQUksQ0FBQ0MsT0FBTyxDQUNqQkgsT0FBTyxFQUNQLG9HQUFvRyxDQUNyRztBQUNILENBQUM7QUFVREYsVUFBVSxDQUFDTSxlQUFlLEdBQUcsZUFBZUEsZUFBZSxHQUFJO0VBQzdELElBQUksRUFBQyxNQUFNQyxXQUFFLENBQUND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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain.js","names":["extensions","getLaunchDaemonsRoot","devRoot","getDeveloperRoot","path","resolve","backupKeychains","fs","exists","keychainPath","backupPath","tempDir","prefix","Math","floor","random","toString","substring","suffix","zipArgs","sep","log","debug","join","exec","_","isString","_keychainsBackupPath","unlink","restoreKeychains","excludePatterns","Error","split","map","x","trim","isServerRunning","isRunning","plistPath","simctl","spawnProcess","rimraf","mkdirp","unzipArgs","flatMap","clearKeychains"],"sources":["../../../lib/extensions/keychain.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport { fs, mkdirp, tempDir } from '@appium/support';\nimport log from '../logger';\nimport { exec } from 'teen_process';\nimport { getDeveloperRoot } from '../utils';\n\nconst extensions = {};\n\n/**\n * Resolve full path to Simlator's LaunchDaemons root folder\n *\n * @returns {string} Full path to Simlator's LaunchDaemons root folder\n */\nextensions.getLaunchDaemonsRoot = async function getLaunchDaemonsRoot () {\n const devRoot = await getDeveloperRoot();\n return path.resolve(\n devRoot,\n 'Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/LaunchDaemons'\n );\n};\n\n/**\n * Create the backup of keychains folder.\n * The previously created backup will be automatically\n * deleted if this method was called twice in a row without\n * `restoreKeychains` being invoked.\n *\n * @returns {boolean} True if the backup operation was successfull.\n */\nextensions.backupKeychains = async function backupKeychains () {\n if (!await fs.exists(this.keychainPath)) {\n return false;\n }\n\n const backupPath = await tempDir.path({\n prefix: `keychains_backup_${Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1)}`,\n suffix: '.zip',\n });\n const zipArgs = [\n '-r', backupPath,\n `${this.keychainPath}${path.sep}`\n ];\n log.debug(`Creating keychains backup with 'zip ${zipArgs.join(' ')}' command`);\n await exec('zip', zipArgs);\n if (_.isString(this._keychainsBackupPath) && await fs.exists(this._keychainsBackupPath)) {\n await fs.unlink(this._keychainsBackupPath);\n }\n this._keychainsBackupPath = backupPath;\n return true;\n};\n\n/**\n * Restore the previsouly created keychains backup.\n *\n * @param {?string|Array<string>} excludePatterns - The list\n * of file name patterns to be excluded from restore. The format\n * of each item should be the same as '-x' option format for\n * 'unzip' utility. This can also be a comma-separated string,\n * which is going be transformed into a list automatically,\n * for example: '*.db*,blabla.sqlite'\n * @returns {boolean} If the restore opration was successful.\n * @throws {Error} If there is no keychains backup available for restore.\n */\nextensions.restoreKeychains = async function restoreKeychains (excludePatterns = []) {\n if (!_.isString(this._keychainsBackupPath) || !await fs.exists(this._keychainsBackupPath)) {\n throw new Error(`The keychains backup archive does not exist. ` +\n `Are you sure it was created before?`);\n }\n\n if (_.isString(excludePatterns)) {\n excludePatterns = excludePatterns.split(',').map((x) => x.trim());\n }\n const isServerRunning = await this.isRunning();\n let plistPath;\n if (isServerRunning) {\n plistPath = path.resolve(await this.getLaunchDaemonsRoot(), 'com.apple.securityd.plist');\n if (!await fs.exists(plistPath)) {\n throw new Error(`Cannot clear keychains because '${plistPath}' does not exist`);\n }\n await this.simctl.spawnProcess(['launchctl', 'unload', plistPath]);\n }\n try {\n await fs.rimraf(this.keychainPath);\n await mkdirp(this.keychainPath);\n const unzipArgs = [\n '-o', this._keychainsBackupPath,\n ...(_.flatMap(excludePatterns.map((x) => ['-x', x]))),\n '-d', '/'\n ];\n log.debug(`Restoring keychains with 'unzip ${unzipArgs.join(' ')}' command`);\n await exec('unzip', unzipArgs);\n await fs.unlink(this._keychainsBackupPath);\n this._keychainsBackupPath = null;\n } finally {\n if (isServerRunning && plistPath) {\n await this.simctl.spawnProcess(['launchctl', 'load', plistPath]);\n }\n }\n return true;\n};\n\n/**\n * Clears Keychains for the particular simulator in runtime (there is no need to stop it).\n *\n * @throws {Error} If keychain cleanup has failed.\n */\nextensions.clearKeychains = async function clearKeychains () {\n const plistPath = path.resolve(await this.getLaunchDaemonsRoot(), 'com.apple.securityd.plist');\n if (!await fs.exists(plistPath)) {\n throw new Error(`Cannot clear keychains because '${plistPath}' does not exist`);\n }\n await this.simctl.spawnProcess(['launchctl', 'unload', plistPath]);\n try {\n if (await fs.exists(this.keychainPath)) {\n await fs.rimraf(this.keychainPath);\n await mkdirp(this.keychainPath);\n }\n } finally {\n await this.simctl.spawnProcess(['launchctl', 'load', plistPath]);\n }\n};\n\nexport default extensions;\n"],"mappings":"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"}
|