appium-xcuitest-driver 3.60.1 → 3.61.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.
@@ -21,9 +21,15 @@ var _path = _interopRequireDefault(require("path"));
21
21
 
22
22
  var _lodash = _interopRequireDefault(require("lodash"));
23
23
 
24
+ var _pyIosDeviceClient = _interopRequireDefault(require("../py-ios-device-client"));
25
+
26
+ const REAL_DEVICE_MAGIC = '3620bbb0-fb9f-4b62-a668-896f2edc4d88';
27
+ const MAGIC_SEP = '/';
28
+
24
29
  class IOSCrashLog {
25
30
  constructor(opts = {}) {
26
31
  this.udid = opts.udid;
32
+ this.pyideviceClient = this.udid ? new _pyIosDeviceClient.default(this.udid) : null;
27
33
  const logDir = opts.udid ? _path.default.resolve(process.env.HOME, 'Library', 'Logs', 'CrashReporter', 'MobileDevice') : _path.default.resolve(process.env.HOME, 'Library', 'Logs', 'DiagnosticReports');
28
34
  this.logDir = logDir || _path.default.resolve(process.env.HOME || '/', 'Library', 'Logs', 'DiagnosticReports');
29
35
  this.prevLogs = [];
@@ -32,7 +38,11 @@ class IOSCrashLog {
32
38
  this.sim = opts.sim;
33
39
  }
34
40
 
35
- async getCrashes() {
41
+ async _gatherFromRealDevice() {
42
+ if (await this.pyideviceClient.assertExists(false)) {
43
+ return (await this.pyideviceClient.listCrashes()).map(x => `${REAL_DEVICE_MAGIC}${MAGIC_SEP}${x}`);
44
+ }
45
+
36
46
  let crashLogsRoot = this.logDir;
37
47
 
38
48
  if (this.udid) {
@@ -49,11 +59,19 @@ class IOSCrashLog {
49
59
  const foundFiles = await _appiumSupport.fs.glob(`${crashLogsRoot}/**/*.crash`, {
50
60
  strict: false
51
61
  });
62
+ return foundFiles;
63
+ }
52
64
 
53
- if (this.udid) {
54
- return foundFiles;
65
+ async _gatherFromSimulator() {
66
+ if (!(await _appiumSupport.fs.exists(this.logDir))) {
67
+ _logger.default.debug(`Crash reports root '${this.logDir}' does not exist. Got nothing to gather.`);
68
+
69
+ return [];
55
70
  }
56
71
 
72
+ const foundFiles = await _appiumSupport.fs.glob(`${this.logDir}/**/*.crash`, {
73
+ strict: false
74
+ });
57
75
  return await _bluebird.default.filter(foundFiles, async x => {
58
76
  try {
59
77
  const content = await _appiumSupport.fs.readFile(x, 'utf8');
@@ -64,6 +82,10 @@ class IOSCrashLog {
64
82
  });
65
83
  }
66
84
 
85
+ async getCrashes() {
86
+ return this.udid ? await this._gatherFromRealDevice() : await this._gatherFromSimulator();
87
+ }
88
+
67
89
  async startCapture() {
68
90
  this.prevLogs = await this.getCrashes();
69
91
  }
@@ -88,14 +110,34 @@ class IOSCrashLog {
88
110
  }
89
111
 
90
112
  async filesToJSON(paths) {
91
- return await _bluebird.default.map(paths, async fullPath => {
92
- const stat = await _appiumSupport.fs.stat(fullPath);
93
- return {
94
- timestamp: stat.ctime.getTime(),
95
- level: 'ALL',
96
- message: await _appiumSupport.fs.readFile(fullPath, 'utf8')
97
- };
98
- });
113
+ const tmpRoot = await _appiumSupport.tempDir.openDir();
114
+
115
+ try {
116
+ return (await _bluebird.default.map(paths, async fullPath => {
117
+ if (_lodash.default.includes(fullPath, REAL_DEVICE_MAGIC)) {
118
+ const fileName = _lodash.default.last(fullPath.split(MAGIC_SEP));
119
+
120
+ try {
121
+ await this.pyideviceClient.exportCrash(fileName, tmpRoot);
122
+ } catch (e) {
123
+ _logger.default.warn(`Cannot export the crash report '${fileName}'. Skipping it. ` + `Original error: ${e.message}`);
124
+
125
+ return;
126
+ }
127
+
128
+ fullPath = _path.default.join(tmpRoot, fileName);
129
+ }
130
+
131
+ const stat = await _appiumSupport.fs.stat(fullPath);
132
+ return {
133
+ timestamp: stat.ctime.getTime(),
134
+ level: 'ALL',
135
+ message: await _appiumSupport.fs.readFile(fullPath, 'utf8')
136
+ };
137
+ })).filter(Boolean);
138
+ } finally {
139
+ await _appiumSupport.fs.rimraf(tmpRoot);
140
+ }
99
141
  }
100
142
 
101
143
  }
@@ -105,4 +147,4 @@ var _default = IOSCrashLog;
105
147
  exports.default = _default;require('source-map-support').install();
106
148
 
107
149
 
108
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9kZXZpY2UtbG9nL2lvcy1jcmFzaC1sb2cuanMiXSwibmFtZXMiOlsiSU9TQ3Jhc2hMb2ciLCJjb25zdHJ1Y3RvciIsIm9wdHMiLCJ1ZGlkIiwibG9nRGlyIiwicGF0aCIsInJlc29sdmUiLCJwcm9jZXNzIiwiZW52IiwiSE9NRSIsInByZXZMb2dzIiwibG9nc1NpbmNlTGFzdFJlcXVlc3QiLCJwaG9uZU5hbWUiLCJzaW0iLCJnZXRDcmFzaGVzIiwiY3Jhc2hMb2dzUm9vdCIsInV0aWxpdGllcyIsImdldERldmljZU5hbWUiLCJmcyIsImV4aXN0cyIsImxvZyIsImRlYnVnIiwiZm91bmRGaWxlcyIsImdsb2IiLCJzdHJpY3QiLCJCIiwiZmlsdGVyIiwieCIsImNvbnRlbnQiLCJyZWFkRmlsZSIsInRvVXBwZXJDYXNlIiwiaW5jbHVkZXMiLCJlcnIiLCJzdGFydENhcHR1cmUiLCJzdG9wQ2FwdHVyZSIsImdldExvZ3MiLCJjcmFzaEZpbGVzIiwiZGlmZiIsIl8iLCJkaWZmZXJlbmNlIiwidW5pb24iLCJmaWxlc1RvSlNPTiIsImdldEFsbExvZ3MiLCJsb2dGaWxlcyIsInBhdGhzIiwibWFwIiwiZnVsbFBhdGgiLCJzdGF0IiwidGltZXN0YW1wIiwiY3RpbWUiLCJnZXRUaW1lIiwibGV2ZWwiLCJtZXNzYWdlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLFdBQU4sQ0FBa0I7QUFDaEJDLEVBQUFBLFdBQVcsQ0FBRUMsSUFBSSxHQUFHLEVBQVQsRUFBYTtBQUN0QixTQUFLQyxJQUFMLEdBQVlELElBQUksQ0FBQ0MsSUFBakI7QUFDQSxVQUFNQyxNQUFNLEdBQUdGLElBQUksQ0FBQ0MsSUFBTCxHQUNYRSxjQUFLQyxPQUFMLENBQWFDLE9BQU8sQ0FBQ0MsR0FBUixDQUFZQyxJQUF6QixFQUErQixTQUEvQixFQUEwQyxNQUExQyxFQUFrRCxlQUFsRCxFQUFtRSxjQUFuRSxD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QixXQUFPLE1BQU1uQixrQkFBRW9CLEdBQUYsQ0FBTUQsS0FBTixFQUFhLE1BQU9FLFFBQVAsSUFBb0I7QUFDNUMsWUFBTUMsSUFBSSxHQUFHLE1BQU03QixrQkFBRzZCLElBQUgsQ0FBUUQsUUFBUixDQUFuQjtBQUNBLGFBQU87QUFDTEUsUUFBQUEsU0FBUyxFQUFFRCxJQUFJLENBQUNFLEtBQUwsQ0FBV0MsT0FBWCxFQUROO0FBRUxDLFFBQUFBLEtBQUssRUFBRSxLQUZGO0FBR0xDLFFBQUFBLE9BQU8sRUFBRSxNQUFNbEMsa0JBQUdXLFFBQUgsQ0FBWWlCLFFBQVosRUFBc0IsTUFBdEI7QUFIVixPQUFQO0FBS0QsS0FQWSxDQUFiO0FBUUQ7O0FBdkVlOzs7ZUEyRUg5QyxXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZnMgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyB1dGlsaXRpZXMgfSBmcm9tICdhcHBpdW0taW9zLWRldmljZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cblxuY2xhc3MgSU9TQ3Jhc2hMb2cge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9KSB7XG4gICAgdGhpcy51ZGlkID0gb3B0cy51ZGlkO1xuICAgIGNvbnN0IGxvZ0RpciA9IG9wdHMudWRpZFxuICAgICAgPyBwYXRoLnJlc29sdmUocHJvY2Vzcy5lbnYuSE9NRSwgJ0xpYnJhcnknLCAnTG9ncycsICdDcmFzaFJlcG9ydGVyJywgJ01vYmlsZURldmljZScpXG4gICAgICA6IHBhdGgucmVzb2x2ZShwcm9jZXNzLmVudi5IT01FLCAnTGlicmFyeScsICdMb2dzJywgJ0RpYWdub3N0aWNSZXBvcnRzJyk7XG4gICAgdGhpcy5sb2dEaXIgPSBsb2dEaXJcbiAgICAgIHx8IHBhdGgucmVzb2x2ZShwcm9jZXNzLmVudi5IT01FIHx8ICcvJywgJ0xpYnJhcnknLCAnTG9ncycsICdEaWFnbm9zdGljUmVwb3J0cycpO1xuICAgIHRoaXMucHJldkxvZ3MgPSBbXTtcbiAgICB0aGlzLmxvZ3NTaW5jZUxhc3RSZXF1ZXN0ID0gW107XG4gICAgdGhpcy5waG9uZU5hbWUgPSBudWxsO1xuICAgIHRoaXMuc2ltID0gb3B0cy5zaW07XG4gIH1cblxuICBhc3luYyBnZXRDcmFzaGVzICgpIHtcbiAgICBsZXQgY3Jhc2hMb2dzUm9vdCA9IHRoaXMubG9nRGlyO1xuICAgIGlmICh0aGlzLnVkaWQpIHtcbiAgICAgIHRoaXMucGhvbmVOYW1lID0gdGhpcy5waG9uZU5hbWUgfHwgYXdhaXQgdXRpbGl0aWVzLmdldERldmljZU5hbWUodGhpcy51ZGlkKTtcbiAgICAgIGNyYXNoTG9nc1Jvb3QgPSBwYXRoLnJlc29sdmUoY3Jhc2hMb2dzUm9vdCwgdGhpcy5waG9uZU5hbWUpO1xuICAgIH1cbiAgICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhjcmFzaExvZ3NSb290KSkge1xuICAgICAgbG9nLmRlYnVnKGBDcmFzaCByZXBvcnRzIHJvb3QgJyR7Y3Jhc2hMb2dzUm9vdH0nIGRvZXMgbm90IGV4aXN0LiBHb3Qgbm90aGluZyB0byBnYXRoZXIuYCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IGZvdW5kRmlsZXMgPSBhd2FpdCBmcy5nbG9iKGAke2NyYXNoTG9nc1Jvb3R9LyoqLyouY3Jhc2hgLCB7XG4gICAgICBzdHJpY3Q6IGZhbHNlXG4gICAgfSk7XG4gICAgaWYgKHRoaXMudWRpZCkge1xuICAgICAgcmV0dXJuIGZvdW5kRmlsZXM7XG4gICAgfVxuICAgIC8vIEZvciBTaW11bGF0b3Igb25seSBpbmNsdWRlIGZpbGVzLCB0aGF0IGNvbnRhaW4gY3VycmVudCBVRElEXG4gICAgcmV0dXJuIGF3YWl0IEIuZmlsdGVyKGZvdW5kRmlsZXMsIGFzeW5jICh4KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoeCwgJ3V0ZjgnKTtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQudG9VcHBlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnNpbS51ZGlkLnRvVXBwZXJDYXNlKCkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0Q2FwdHVyZSAoKSB7XG4gICAgdGhpcy5wcmV2TG9ncyA9IGF3YWl0IHRoaXMuZ2V0Q3Jhc2hlcygpO1xuICB9XG5cbiAgYXN5bmMgc3RvcENhcHR1cmUgKCkge1xuICAgIC8vIG5lZWRlZCBmb3IgY29uc2lzdGVudCBBUEkgd2l0aCBvdGhlciBsb2dzXG4gIH1cblxuICBhc3luYyBnZXRMb2dzICgpIHtcbiAgICBsZXQgY3Jhc2hGaWxlcyA9IGF3YWl0IHRoaXMuZ2V0Q3Jhc2hlcygpO1xuICAgIGxldCBkaWZmID0gXy5kaWZmZXJlbmNlKGNyYXNoRmlsZXMsIHRoaXMucHJldkxvZ3MsIHRoaXMubG9nc1NpbmNlTGFzdFJlcXVlc3QpO1xuICAgIHRoaXMubG9nc1NpbmNlTGFzdFJlcXVlc3QgPSBfLnVuaW9uKHRoaXMubG9nc1NpbmNlTGFzdFJlcXVlc3QsIGRpZmYpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbGVzVG9KU09OKGRpZmYpO1xuICB9XG5cbiAgYXN5bmMgZ2V0QWxsTG9ncyAoKSB7XG4gICAgbGV0IGNyYXNoRmlsZXMgPSBhd2FpdCB0aGlzLmdldENyYXNoZXMoKTtcbiAgICBsZXQgbG9nRmlsZXMgPSBfLmRpZmZlcmVuY2UoY3Jhc2hGaWxlcywgdGhpcy5wcmV2TG9ncyk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZmlsZXNUb0pTT04obG9nRmlsZXMpO1xuICB9XG5cbiAgYXN5bmMgZmlsZXNUb0pTT04gKHBhdGhzKSB7XG4gICAgcmV0dXJuIGF3YWl0IEIubWFwKHBhdGhzLCBhc3luYyAoZnVsbFBhdGgpID0+IHtcbiAgICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5zdGF0KGZ1bGxQYXRoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRpbWVzdGFtcDogc3RhdC5jdGltZS5nZXRUaW1lKCksXG4gICAgICAgIGxldmVsOiAnQUxMJyxcbiAgICAgICAgbWVzc2FnZTogYXdhaXQgZnMucmVhZEZpbGUoZnVsbFBhdGgsICd1dGY4JylcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgSU9TQ3Jhc2hMb2cgfTtcbmV4cG9ydCBkZWZhdWx0IElPU0NyYXNoTG9nO1xuIl0sImZpbGUiOiJsaWIvZGV2aWNlLWxvZy9pb3MtY3Jhc2gtbG9nLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
150
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9kZXZpY2UtbG9nL2lvcy1jcmFzaC1sb2cuanMiXSwibmFtZXMiOlsiUkVBTF9ERVZJQ0VfTUFHSUMiLCJNQUdJQ19TRVAiLCJJT1NDcmFzaExvZyIsImNvbnN0cnVjdG9yIiwib3B0cyIsInVkaWQiLCJweWlkZXZpY2VDbGllbnQiLCJQeWlkZXZpY2UiLCJsb2dEaXIiLCJwYXRoIiwicmVzb2x2ZSIsInByb2Nlc3MiLCJlbnYiLCJIT01FIiwicHJldkxvZ3MiLCJsb2dzU2luY2VMYXN0UmVxdWVzdCIsInBob25lTmFtZSIsInNpbSIsIl9nYXRoZXJGcm9tUmVhbERldmljZSIsImFzc2VydEV4aXN0cyIsImxpc3RDcmFzaGVzIiwibWFwIiwieCIsImNyYXNoTG9nc1Jvb3QiLCJ1dGlsaXRpZXMiLCJnZXREZXZpY2VOYW1lIiwiZnMiLCJleGlzdHMiLCJsb2ciLCJkZWJ1ZyIsImZvdW5kRmlsZXMiLCJnbG9iIiwic3RyaWN0IiwiX2dhdGhlckZyb21TaW11bGF0b3IiLCJCIiwiZmlsdGVyIiwiY29udGVudCIsInJlYWRGaWxlIiwidG9VcHBlckNhc2UiLCJpbmNsdWRlcyIsImVyciIsImdldENyYXNoZXMiLCJzdGFydENhcHR1cmUiLCJzdG9wQ2FwdHVyZSIsImdldExvZ3MiLCJjcmFzaEZpbGVzIiwiZGlmZiIsIl8iLCJkaWZmZXJlbmNlIiwidW5pb24iLCJmaWxlc1RvSlNPTiIsImdldEFsbExvZ3MiLCJsb2dGaWxlcyIsInBhdGhzIiwidG1wUm9vdCIsInRlbXBEaXIiLCJvcGVuRGlyIiwiZnVsbFBhdGgiLCJmaWxlTmFtZSIsImxhc3QiLCJzcGxpdCIsImV4cG9ydENyYXNoIiwiZSIsIndhcm4iLCJtZXNzYWdlIiwiam9pbiIsInN0YXQiLCJ0aW1lc3RhbXAiLCJjdGltZSIsImdldFRpbWUiLCJsZXZlbCIsIkJvb2xlYW4iLCJyaW1yYWYiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7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QVVsQixPQUFWLENBQU47QUFDRDtBQUNGOztBQTNHZTs7O2VBK0dIcEQsVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZzLCB0ZW1wRGlyIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHsgdXRpbGl0aWVzIH0gZnJvbSAnYXBwaXVtLWlvcy1kZXZpY2UnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IFB5aWRldmljZSBmcm9tICcuLi9weS1pb3MtZGV2aWNlLWNsaWVudCc7XG5cbmNvbnN0IFJFQUxfREVWSUNFX01BR0lDID0gJzM2MjBiYmIwLWZiOWYtNGI2Mi1hNjY4LTg5NmYyZWRjNGQ4OCc7XG5jb25zdCBNQUdJQ19TRVAgPSAnLyc7XG5cblxuY2xhc3MgSU9TQ3Jhc2hMb2cge1xuICBjb25zdHJ1Y3RvciAob3B0cyA9IHt9KSB7XG4gICAgdGhpcy51ZGlkID0gb3B0cy51ZGlkO1xuICAgIHRoaXMucHlpZGV2aWNlQ2xpZW50ID0gdGhpcy51ZGlkID8gbmV3IFB5aWRldmljZSh0aGlzLnVkaWQpIDogbnVsbDtcbiAgICBjb25zdCBsb2dEaXIgPSBvcHRzLnVkaWRcbiAgICAgID8gcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52LkhPTUUsICdMaWJyYXJ5JywgJ0xvZ3MnLCAnQ3Jhc2hSZXBvcnRlcicsICdNb2JpbGVEZXZpY2UnKVxuICAgICAgOiBwYXRoLnJlc29sdmUocHJvY2Vzcy5lbnYuSE9NRSwgJ0xpYnJhcnknLCAnTG9ncycsICdEaWFnbm9zdGljUmVwb3J0cycpO1xuICAgIHRoaXMubG9nRGlyID0gbG9nRGlyXG4gICAgICB8fCBwYXRoLnJlc29sdmUocHJvY2Vzcy5lbnYuSE9NRSB8fCAnLycsICdMaWJyYXJ5JywgJ0xvZ3MnLCAnRGlhZ25vc3RpY1JlcG9ydHMnKTtcbiAgICB0aGlzLnByZXZMb2dzID0gW107XG4gICAgdGhpcy5sb2dzU2luY2VMYXN0UmVxdWVzdCA9IFtdO1xuICAgIHRoaXMucGhvbmVOYW1lID0gbnVsbDtcbiAgICB0aGlzLnNpbSA9IG9wdHMuc2ltO1xuICB9XG5cbiAgYXN5bmMgX2dhdGhlckZyb21SZWFsRGV2aWNlICgpIHtcbiAgICBpZiAoYXdhaXQgdGhpcy5weWlkZXZpY2VDbGllbnQuYXNzZXJ0RXhpc3RzKGZhbHNlKSkge1xuICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLnB5aWRldmljZUNsaWVudC5saXN0Q3Jhc2hlcygpKVxuICAgICAgICAubWFwKCh4KSA9PiBgJHtSRUFMX0RFVklDRV9NQUdJQ30ke01BR0lDX1NFUH0ke3h9YCk7XG4gICAgfVxuXG4gICAgbGV0IGNyYXNoTG9nc1Jvb3QgPSB0aGlzLmxvZ0RpcjtcbiAgICBpZiAodGhpcy51ZGlkKSB7XG4gICAgICB0aGlzLnBob25lTmFtZSA9IHRoaXMucGhvbmVOYW1lIHx8IGF3YWl0IHV0aWxpdGllcy5nZXREZXZpY2VOYW1lKHRoaXMudWRpZCk7XG4gICAgICBjcmFzaExvZ3NSb290ID0gcGF0aC5yZXNvbHZlKGNyYXNoTG9nc1Jvb3QsIHRoaXMucGhvbmVOYW1lKTtcbiAgICB9XG4gICAgaWYgKCFhd2FpdCBmcy5leGlzdHMoY3Jhc2hMb2dzUm9vdCkpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgQ3Jhc2ggcmVwb3J0cyByb290ICcke2NyYXNoTG9nc1Jvb3R9JyBkb2VzIG5vdCBleGlzdC4gR290IG5vdGhpbmcgdG8gZ2F0aGVyLmApO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBmb3VuZEZpbGVzID0gYXdhaXQgZnMuZ2xvYihgJHtjcmFzaExvZ3NSb290fS8qKi8qLmNyYXNoYCwge1xuICAgICAgc3RyaWN0OiBmYWxzZVxuICAgIH0pO1xuICAgIHJldHVybiBmb3VuZEZpbGVzO1xuICB9XG5cbiAgYXN5bmMgX2dhdGhlckZyb21TaW11bGF0b3IgKCkge1xuICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKHRoaXMubG9nRGlyKSkge1xuICAgICAgbG9nLmRlYnVnKGBDcmFzaCByZXBvcnRzIHJvb3QgJyR7dGhpcy5sb2dEaXJ9JyBkb2VzIG5vdCBleGlzdC4gR290IG5vdGhpbmcgdG8gZ2F0aGVyLmApO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBmb3VuZEZpbGVzID0gYXdhaXQgZnMuZ2xvYihgJHt0aGlzLmxvZ0Rpcn0vKiovKi5jcmFzaGAsIHtcbiAgICAgIHN0cmljdDogZmFsc2VcbiAgICB9KTtcbiAgICAvLyBGb3IgU2ltdWxhdG9yIG9ubHkgaW5jbHVkZSBmaWxlcywgdGhhdCBjb250YWluIGN1cnJlbnQgVURJRFxuICAgIHJldHVybiBhd2FpdCBCLmZpbHRlcihmb3VuZEZpbGVzLCBhc3luYyAoeCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHgsICd1dGY4Jyk7XG4gICAgICAgIHJldHVybiBjb250ZW50LnRvVXBwZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zaW0udWRpZC50b1VwcGVyQ2FzZSgpKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBnZXRDcmFzaGVzICgpIHtcbiAgICByZXR1cm4gdGhpcy51ZGlkXG4gICAgICA/IGF3YWl0IHRoaXMuX2dhdGhlckZyb21SZWFsRGV2aWNlKClcbiAgICAgIDogYXdhaXQgdGhpcy5fZ2F0aGVyRnJvbVNpbXVsYXRvcigpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRDYXB0dXJlICgpIHtcbiAgICB0aGlzLnByZXZMb2dzID0gYXdhaXQgdGhpcy5nZXRDcmFzaGVzKCk7XG4gIH1cblxuICBhc3luYyBzdG9wQ2FwdHVyZSAoKSB7XG4gICAgLy8gbmVlZGVkIGZvciBjb25zaXN0ZW50IEFQSSB3aXRoIG90aGVyIGxvZ3NcbiAgfVxuXG4gIGFzeW5jIGdldExvZ3MgKCkge1xuICAgIGxldCBjcmFzaEZpbGVzID0gYXdhaXQgdGhpcy5nZXRDcmFzaGVzKCk7XG4gICAgbGV0IGRpZmYgPSBfLmRpZmZlcmVuY2UoY3Jhc2hGaWxlcywgdGhpcy5wcmV2TG9ncywgdGhpcy5sb2dzU2luY2VMYXN0UmVxdWVzdCk7XG4gICAgdGhpcy5sb2dzU2luY2VMYXN0UmVxdWVzdCA9IF8udW5pb24odGhpcy5sb2dzU2luY2VMYXN0UmVxdWVzdCwgZGlmZik7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZmlsZXNUb0pTT04oZGlmZik7XG4gIH1cblxuICBhc3luYyBnZXRBbGxMb2dzICgpIHtcbiAgICBsZXQgY3Jhc2hGaWxlcyA9IGF3YWl0IHRoaXMuZ2V0Q3Jhc2hlcygpO1xuICAgIGxldCBsb2dGaWxlcyA9IF8uZGlmZmVyZW5jZShjcmFzaEZpbGVzLCB0aGlzLnByZXZMb2dzKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5maWxlc1RvSlNPTihsb2dGaWxlcyk7XG4gIH1cblxuICBhc3luYyBmaWxlc1RvSlNPTiAocGF0aHMpIHtcbiAgICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoYXdhaXQgQi5tYXAocGF0aHMsIGFzeW5jIChmdWxsUGF0aCkgPT4ge1xuICAgICAgICBpZiAoXy5pbmNsdWRlcyhmdWxsUGF0aCwgUkVBTF9ERVZJQ0VfTUFHSUMpKSB7XG4gICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBfLmxhc3QoZnVsbFBhdGguc3BsaXQoTUFHSUNfU0VQKSk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHlpZGV2aWNlQ2xpZW50LmV4cG9ydENyYXNoKGZpbGVOYW1lLCB0bXBSb290KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2cud2FybihgQ2Fubm90IGV4cG9ydCB0aGUgY3Jhc2ggcmVwb3J0ICcke2ZpbGVOYW1lfScuIFNraXBwaW5nIGl0LiBgICtcbiAgICAgICAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZnVsbFBhdGggPSBwYXRoLmpvaW4odG1wUm9vdCwgZmlsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5zdGF0KGZ1bGxQYXRoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0aW1lc3RhbXA6IHN0YXQuY3RpbWUuZ2V0VGltZSgpLFxuICAgICAgICAgIGxldmVsOiAnQUxMJyxcbiAgICAgICAgICBtZXNzYWdlOiBhd2FpdCBmcy5yZWFkRmlsZShmdWxsUGF0aCwgJ3V0ZjgnKVxuICAgICAgICB9O1xuICAgICAgfSkpLmZpbHRlcihCb29sZWFuKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBJT1NDcmFzaExvZyB9O1xuZXhwb3J0IGRlZmF1bHQgSU9TQ3Jhc2hMb2c7XG4iXSwiZmlsZSI6ImxpYi9kZXZpY2UtbG9nL2lvcy1jcmFzaC1sb2cuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
@@ -45,6 +45,7 @@ class Pyidevice {
45
45
  async execute(args, opts = {}) {
46
46
  await this.assertExists();
47
47
  const {
48
+ cwd,
48
49
  format = 'json',
49
50
  logStdout = false
50
51
  } = opts;
@@ -59,7 +60,9 @@ class Pyidevice {
59
60
  _logger.default.debug(`Executing ${cmdStr}`);
60
61
 
61
62
  try {
62
- const result = await (0, _teen_process.exec)(this.binaryPath, finalArgs);
63
+ const result = await (0, _teen_process.exec)(this.binaryPath, finalArgs, {
64
+ cwd
65
+ });
63
66
 
64
67
  if (logStdout) {
65
68
  _logger.default.debug(`Command output: ${result.stdout}`);
@@ -78,31 +81,29 @@ class Pyidevice {
78
81
  return JSON.parse(stdout);
79
82
  }
80
83
 
81
- async installProfile(opts = {}) {
82
- const {
83
- profilePath,
84
- payload
85
- } = opts;
86
-
84
+ async installProfile({
85
+ profilePath,
86
+ payload
87
+ } = {}) {
87
88
  if (!profilePath && !payload) {
88
- throw new TypeError('Profile must be defined');
89
+ throw new Error('Either the full path to the profile or its payload must be provided');
89
90
  }
90
91
 
91
- if (profilePath) {
92
- await this.execute(['profiles', 'install', '--path', profilePath], {
93
- logStdout: true
94
- });
95
- } else {
96
- const tmpRoot = await _appiumSupport.tempDir.openDir();
92
+ let tmpRoot;
93
+ let srcPath = profilePath;
97
94
 
98
- const tmpProfilePath = _path.default.join(tmpRoot, 'cert.pem');
95
+ try {
96
+ if (!srcPath) {
97
+ tmpRoot = await _appiumSupport.tempDir.openDir();
98
+ srcPath = _path.default.join(tmpRoot, 'cert.pem');
99
+ await _appiumSupport.fs.writeFile(srcPath, payload, 'utf8');
100
+ }
99
101
 
100
- try {
101
- await _appiumSupport.fs.writeFile(tmpProfilePath, payload, 'utf8');
102
- await this.execute(['profiles', 'install', '--path', tmpProfilePath], {
103
- logStdout: true
104
- });
105
- } finally {
102
+ await this.execute(['profiles', 'install', '--path', srcPath], {
103
+ logStdout: true
104
+ });
105
+ } finally {
106
+ if (tmpRoot) {
106
107
  await _appiumSupport.fs.rimraf(tmpRoot);
107
108
  }
108
109
  }
@@ -114,6 +115,20 @@ class Pyidevice {
114
115
  });
115
116
  }
116
117
 
118
+ async listCrashes() {
119
+ const {
120
+ stdout
121
+ } = await this.execute(['crash', 'list']);
122
+ return JSON.parse(stdout.replace(/'/g, '"')).filter(x => !['.', '..'].includes(x));
123
+ }
124
+
125
+ async exportCrash(name, dstFolder) {
126
+ await this.execute(['crash', 'export', '--name', name], {
127
+ logStdout: true,
128
+ cwd: dstFolder
129
+ });
130
+ }
131
+
117
132
  }
118
133
 
119
134
  exports.Pyidevice = Pyidevice;
@@ -121,4 +136,4 @@ var _default = Pyidevice;
121
136
  exports.default = _default;require('source-map-support').install();
122
137
 
123
138
 
124
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9weS1pb3MtZGV2aWNlLWNsaWVudC5qcyJdLCJuYW1lcyI6WyJCSU5BUllfTkFNRSIsIlB5aWRldmljZSIsImNvbnN0cnVjdG9yIiwidWRpZCIsImJpbmFyeVBhdGgiLCJhc3NlcnRFeGlzdHMiLCJpc1N0cmljdCIsImZzIiwid2hpY2giLCJlIiwiRXJyb3IiLCJleGVjdXRlIiwiYXJncyIsIm9wdHMiLCJmb3JtYXQiLCJsb2dTdGRvdXQiLCJmaW5hbEFyZ3MiLCJwdXNoIiwiY21kU3RyIiwidXRpbCIsInF1b3RlIiwibG9nIiwiZGVidWciLCJyZXN1bHQiLCJzdGRvdXQiLCJzdGRlcnIiLCJtZXNzYWdlIiwibGlzdFByb2ZpbGVzIiwiSlNPTiIsInBhcnNlIiwiaW5zdGFsbFByb2ZpbGUiLCJwcm9maWxlUGF0aCIsInBheWxvYWQiLCJUeXBlRXJyb3IiLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJ0bXBQcm9maWxlUGF0aCIsInBhdGgiLCJqb2luIiwid3JpdGVGaWxlIiwicmltcmFmIiwicmVtb3ZlUHJvZmlsZSIsIm5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBSUEsTUFBTUEsV0FBVyxHQUFHLFdBQXBCOztBQUVBLE1BQU1DLFNBQU4sQ0FBZ0I7QUFDZEMsRUFBQUEsV0FBVyxDQUFFQyxJQUFGLEVBQVE7QUFDakIsU0FBS0EsSUFBTCxHQUFZQSxJQUFaO0FBQ0EsU0FBS0MsVUFBTCxHQUFrQixJQUFsQjtBQUNEOztBQUVpQixRQUFaQyxZQUFZLENBQUVDLFFBQVEsR0FBRyxJQUFiLEVBQW1CO0FBQ25DLFFBQUksS0FBS0YsVUFBVCxFQUFxQjtBQUNuQixhQUFPLElBQVA7QUFDRDs7QUFFRCxRQUFJO0FBQ0YsV0FBS0EsVUFBTCxHQUFrQixNQUFNRyxrQkFBR0MsS0FBSCxDQUFTUixXQUFULENBQXhCO0FBQ0EsYUFBTyxJQUFQO0FBQ0QsS0FIRCxDQUdFLE9BQU9TLENBQVAsRUFB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QUFFQyxJQUFGLEVBQVE7QUFDekIsVUFBTSxLQUFLaEMsT0FBTCxDQUFhLENBQUMsVUFBRCxFQUFhLFFBQWIsRUFBdUJnQyxJQUF2QixDQUFiLEVBQTJDO0FBQUM1QixNQUFBQSxTQUFTLEVBQUU7QUFBWixLQUEzQyxDQUFOO0FBQ0Q7O0FBbEZhOzs7ZUFzRkRkLFMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCB7IGZzLCB1dGlsLCB0ZW1wRGlyIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL1l1ZUNoZW4tQy9weS1pb3MtZGV2aWNlXG5cbmNvbnN0IEJJTkFSWV9OQU1FID0gJ3B5aWRldmljZSc7XG5cbmNsYXNzIFB5aWRldmljZSB7XG4gIGNvbnN0cnVjdG9yICh1ZGlkKSB7XG4gICAgdGhpcy51ZGlkID0gdWRpZDtcbiAgICB0aGlzLmJpbmFyeVBhdGggPSBudWxsO1xuICB9XG5cbiAgYXN5bmMgYXNzZXJ0RXhpc3RzIChpc1N0cmljdCA9IHRydWUpIHtcbiAgICBpZiAodGhpcy5iaW5hcnlQYXRoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5iaW5hcnlQYXRoID0gYXdhaXQgZnMud2hpY2goQklOQVJZX05BTUUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtCSU5BUllfTkFNRX0gYmluYXJ5IGNhbm5vdCBiZSBmb3VuZCBpbiBQQVRILiBgICtcbiAgICAgICAgICBgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBpbnN0YWxsZWQuIFZpc2l0IGh0dHBzOi8vZ2l0aHViLmNvbS9ZdWVDaGVuLUMvcHktaW9zLWRldmljZSBmb3IgYCArXG4gICAgICAgICAgYG1vcmUgZGV0YWlscy5gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBleGVjdXRlIChhcmdzLCBvcHRzID0ge30pIHtcbiAgICBhd2FpdCB0aGlzLmFzc2VydEV4aXN0cygpO1xuICAgIGNvbnN0IHtcbiAgICAgIGZvcm1hdCA9ICdqc29uJyxcbiAgICAgIGxvZ1N0ZG91dCA9IGZhbHNlLFxuICAgIH0gPSBvcHRzO1xuXG4gICAgY29uc3QgZmluYWxBcmdzID0gWy4uLmFyZ3MsICctLXVkaWQnLCB0aGlzLnVkaWRdO1xuICAgIGlmIChmb3JtYXQpIHtcbiAgICAgIGZpbmFsQXJncy5wdXNoKCctLWZvcm1hdCcsIGZvcm1hdCk7XG4gICAgfVxuICAgIGNvbnN0IGNtZFN0ciA9IHV0aWwucXVvdGUoW3RoaXMuYmluYXJ5UGF0aCwgLi4uZmluYWxBcmdzXSk7XG4gICAgbG9nLmRlYnVnKGBFeGVjdXRpbmcgJHtjbWRTdHJ9YCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWModGhpcy5iaW5hcnlQYXRoLCBmaW5hbEFyZ3MpO1xuICAgICAgaWYgKGxvZ1N0ZG91dCkge1xuICAgICAgICBsb2cuZGVidWcoYENvbW1hbmQgb3V0cHV0OiAke3Jlc3VsdC5zdGRvdXR9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7Y21kU3RyfScgZmFpbGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlLnN0ZGVyciB8fCBlLnN0ZG91dCB8fCBlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbGlzdFByb2ZpbGVzICgpIHtcbiAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IHRoaXMuZXhlY3V0ZShbJ3Byb2ZpbGVzJywgJ2xpc3QnXSk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2Uoc3Rkb3V0KTtcbiAgfVxuXG4gIGFzeW5jIGluc3RhbGxQcm9maWxlIChvcHRzID0ge30pIHtcbiAgICBjb25zdCB7XG4gICAgICBwcm9maWxlUGF0aCxcbiAgICAgIHBheWxvYWQsXG4gICAgfSA9IG9wdHM7XG4gICAgaWYgKCFwcm9maWxlUGF0aCAmJiAhcGF5bG9hZCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUHJvZmlsZSBtdXN0IGJlIGRlZmluZWQnKTtcbiAgICB9XG5cbiAgICBpZiAocHJvZmlsZVBhdGgpIHtcbiAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZShbJ3Byb2ZpbGVzJywgJ2luc3RhbGwnLCAnLS1wYXRoJywgcHJvZmlsZVBhdGhdLCB7XG4gICAgICAgIGxvZ1N0ZG91dDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICAgIGNvbnN0IHRtcFByb2ZpbGVQYXRoID0gcGF0aC5qb2luKHRtcFJvb3QsICdjZXJ0LnBlbScpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHRtcFByb2ZpbGVQYXRoLCBwYXlsb2FkLCAndXRmOCcpO1xuICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGUoWydwcm9maWxlcycsICdpbnN0YWxsJywgJy0tcGF0aCcsIHRtcFByb2ZpbGVQYXRoXSwge1xuICAgICAgICAgIGxvZ1N0ZG91dDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyByZW1vdmVQcm9maWxlIChuYW1lKSB7XG4gICAgYXdhaXQgdGhpcy5leGVjdXRlKFsncHJvZmlsZXMnLCAncmVtb3ZlJywgbmFtZV0sIHtsb2dTdGRvdXQ6IHRydWV9KTtcbiAgfVxufVxuXG5leHBvcnQgeyBQeWlkZXZpY2UgfTtcbmV4cG9ydCBkZWZhdWx0IFB5aWRldmljZTtcbiJdLCJmaWxlIjoibGliL3B5LWlvcy1kZXZpY2UtY2xpZW50LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
139
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9weS1pb3MtZGV2aWNlLWNsaWVudC5qcyJdLCJuYW1lcyI6WyJCSU5BUllfTkFNRSIsIlB5aWRldmljZSIsImNvbnN0cnVjdG9yIiwidWRpZCIsImJpbmFyeVBhdGgiLCJhc3NlcnRFeGlzdHMiLCJpc1N0cmljdCIsImZzIiwid2hpY2giLCJlIiwiRXJyb3IiLCJleGVjdXRlIiwiYXJncyIsIm9wdHMiLCJjd2QiLCJmb3JtYXQiLCJsb2dTdGRvdXQiLCJmaW5hbEFyZ3MiLCJwdXNoIiwiY21kU3RyIiwidXRpbCIsInF1b3RlIiwibG9nIiwiZGVidWciLCJyZXN1bHQiLCJzdGRvdXQiLCJzdGRlcnIiLCJtZXNzYWdlIiwibGlzdFByb2ZpbGVzIiwiSlNPTiIsInBhcnNlIiwiaW5zdGFsbFByb2ZpbGUiLCJwcm9maWxlUGF0aCIsInBheWxvYWQiLCJ0bXBSb290Iiwic3JjUGF0aCIsInRlbXBEaXIiLCJvcGVuRGlyIiwicGF0aCIsImpvaW4iLCJ3cml0ZUZpbGUiLCJyaW1yYWYiLCJyZW1vdmVQcm9maWxlIiwibmFtZSIsImxpc3RDcmFzaGVzIiwicmVwbGFjZSIsImZpbHRlciIsIngiLCJpbmNsdWRlcyIsImV4cG9ydENyYXNoIiwiZHN0Rm9sZGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUlBLE1BQU1BLFdBQVcsR0FBRyxXQUFwQjs7QUFFQSxNQUFNQyxTQUFOLENBQWdCO0FBQ2RDLEVBQUFBLFdBQVcsQ0FBRUMsSUFBRixFQUFRO0FBQ2pCLFNBQUtBLElBQUwsR0FBWUEsSUFBWjtBQUNBLFNBQUtDLFVBQUwsR0FBa0IsSUFBbEI7QUFDRDs7QUFFaUIsUUFBWkMsWUFBWSxDQUFFQyxRQUFRLEdBQUcsSUFBYixFQUFtQjtBQUNuQyxRQUFJLEtBQUtGLFVBQVQsRUFBcUI7QUFDbkIsYUFBTyxJQUFQO0FBQ0Q7O0FBRUQsUUFBSTtBQUNGLFdBQUtBLFVBQUwsR0FBa0IsTUFBTUcsa0JBQUdDLEtBQUgsQ0FBU1IsV0FBVCxDQUF4QjtBQUNBLGFBQU8sSUFBUDtBQUNELEtBSEQsQ0FHRSxPQUFPUyxDQUFQLEVBQVU7QUFDVixVQUFJSCxRQUFKLEVBQWM7QUFDWixjQUFNLElBQUlJLEtBQUosQ0FBVyxHQUFFVixXQUFZLG1DQUFmLEdBQ2IseUZBRGEsR0FFYixlQUZHLENBQU47QUFHRDs7QUFDRCxhQUFPLEtBQVA7QUFDRDtBQUNGOztBQUVZLFFBQVBXLE9BQU8sQ0FBRUMsSUFBRixFQUFRQyxJQUFJLEdBQUcsRUFBZixFQUFtQjtBQUM5QixVQUFNLEtBQUtSLFlBQUwsRUFBTjtBQUNBLFVBQU07QUFDSlMsTUFBQUEsR0FESTtBQUVKQyxNQUFBQSxNQUFNLEdBQUcsTUFGTDtBQUdKQyxNQUFBQSxTQUFTLEdBQUc7QUFIUixRQUlGSCxJQUpKO0FBTUEsVUFBTUksU0FBUyxHQUFHLENBQUMsR0FBR0wsSUFBSixFQUFVLFFBQVYsRUFBb0IsS0FBS1QsSUFBekIsQ0FBbEI7O0FBQ0EsUUFBSVksTUFBSixFQUFZO0FBQ1ZFLE1BQUFBLFNBQVMsQ0FBQ0MsSUFBVixDQUFlLFVBQWYsRUFBMkJILE1BQTNCO0FBQ0Q7O0FBQ0QsVUFBTUksTUFBTSxHQUFHQyxvQkFBS0MsS0FBTCxDQUFXLENBQUMsS0FBS2pCLFVBQU4sRUFBa0IsR0FBR2EsU0FBckIsQ0FBWCxDQUFmOztBQUNBSyxvQkFBSUMsS0FBSixDQUFXLGFBQVlKLE1BQU8sRUFBOUI7O0FBQ0EsUUFBSTtBQUNGLFlBQU1LLE1BQU0sR0FBRyxNQUFNLHdCQUFLLEtBQUtwQixVQUFWLEVBQXNCYSxTQUF0QixFQUFpQztBQUFDSCxRQUFBQTtBQUFELE9BQWpDLENBQXJCOztBQUNBLFVBQUlFLFNBQUosRUFBZTtBQUNiTSx3QkFBSUMsS0FBSixDQUFXLG1CQUFrQkMsTUFBTSxDQUFDQyxNQUFPLEVBQTNDO0FBQ0Q7O0FBQ0QsYUFBT0QsTUFBUDtBQUNELEtBTkQsQ0FNRSxPQUFPZixDQUFQLEVBQVU7QUFDVixZQUFNLElBQUlDLEtBQUosQ0FBVyxJQUFHUyxNQUFPLDZCQUE0QlYsQ0FBQyxDQUFDaUIsTUFBRixJQUFZakIsQ0FBQyxDQUFDZ0IsTUFBZCxJQUF3QmhCLENBQUMsQ0FBQ2tCLE9BQVEsRUFBbkYsQ0FBTjtBQUNEO0FBQ0Y7O0FBRWlCLFFBQVpDLFlBQVksR0FBSTtBQUNwQixVQUFNO0FBQUNILE1BQUFBO0FBQUQsUUFBVyxNQUFNLEtBQUtkLE9BQUwsQ0FBYSxDQUFDLFVBQUQsRUFBYSxNQUFiLENBQWIsQ0FBdkI7QUFDQSxXQUFPa0IsSUFBSSxDQUFDQyxLQUFMLENBQVdMLE1BQVgsQ0FBUDtBQUNEOztBQUVtQixRQUFkTSxjQUFjLENBQUU7QUFBQ0MsSUFBQUEsV0FBRDtBQUFjQyxJQUFBQTtBQUFkLE1BQXlCLEVBQTNCLEVBQStCO0FBQ2pELFFBQUksQ0FBQ0QsV0FBRCxJQUFnQixDQUFDQyxPQUFyQixFQUE4QjtBQUM1QixZQUFNLElBQUl2QixLQUFKLENBQVUscUVBQVYsQ0FBTjtBQUNEOztBQUVELFFBQUl3QixPQUFKO0FBQ0EsUUFBSUMsT0FBTyxHQUFHSCxXQUFkOztBQUNBLFFBQUk7QUFDRixVQUFJLENBQUNHLE9BQUwsRUFBYztBQUNaRCxRQUFBQSxPQUFPLEdBQUcsTUFBTUUsdUJBQVFDLE9BQVIsRUFBaEI7QUFDQUYsUUFBQUEsT0FBTyxHQUFHRyxjQUFLQyxJQUFMLENBQVVMLE9BQVYsRUFBbUIsVUFBbkIsQ0FBVjtBQUNBLGNBQU0zQixrQkFBR2lDLFNBQUgsQ0FBYUwsT0FBYixFQUFzQkYsT0FBdEIsRUFBK0IsTUFBL0IsQ0FBTjtBQUNEOztBQUNELFlBQU0sS0FBS3RCLE9BQUwsQ0FBYSxDQUFDLFVBQUQsRUFBYSxTQUFiLEVBQXdCLFFBQXhCLEVBQWtDd0IsT0FBbEMsQ0FBYixFQUF5RDtBQUM3RG5CLFFBQUFBLFNBQVMsRUFBRTtBQURrRCxPQUF6RCxDQUFOO0FBR0QsS0FURCxTQVNVO0FBQ1IsVUFBSWtCLE9BQUosRUFBYTtBQUNYLGNBQU0zQixrQkFBR2tDLE1BQUgsQ0FBVVAsT0FBVixDQUFOO0FBQ0Q7QUFDRjtBQUNGOztBQUVrQixRQUFiUSxhQUFhLENBQUVDLElBQUYsRUFBUTtBQUN6QixVQUFNLEtBQUtoQyxPQUFMLENBQWEsQ0FBQyxVQUFELEVBQWEsUUFBYixFQUF1QmdDLElBQXZCLENBQWIsRUFBMkM7QUFBQzNCLE1BQUFBLFNBQVMsRUFBRTtBQUFaLEtBQTNDLENBQU47QUFDRDs7QUFFZ0IsUUFBWDRCLFdBQVcsR0FBSTtBQUNuQixVQUFNO0FBQUNuQixNQUFBQTtBQUFELFFBQVcsTUFBTSxLQUFLZCxPQUFMLENBQWEsQ0FBQyxPQUFELEVBQVUsTUFBVixDQUFiLENBQXZCO0FBQ0EsV0FBT2tCLElBQUksQ0FBQ0MsS0FBTCxDQUFXTCxNQUFNLENBQUNvQixPQUFQLENBQWUsSUFBZixFQUFxQixHQUFyQixDQUFYLEVBQXNDQyxNQUF0QyxDQUE4Q0MsQ0FBRCxJQUFPLENBQUMsQ0FBQyxHQUFELEVBQU0sSUFBTixFQUFZQyxRQUFaLENBQXFCRCxDQUFyQixDQUFyRCxDQUFQO0FBQ0Q7O0FBRWdCLFFBQVhFLFdBQVcsQ0FBRU4sSUFBRixFQUFRTyxTQUFSLEVBQW1CO0FBQ2xDLFVBQU0sS0FBS3ZDLE9BQUwsQ0FBYSxDQUFDLE9BQUQsRUFBVSxRQUFWLEVBQW9CLFFBQXBCLEVBQThCZ0MsSUFBOUIsQ0FBYixFQUFrRDtBQUN0RDNCLE1BQUFBLFNBQVMsRUFBRSxJQUQyQztBQUd0REYsTUFBQUEsR0FBRyxFQUFFb0M7QUFIaUQsS0FBbEQsQ0FBTjtBQUtEOztBQTVGYTs7O2VBZ0dEakQsUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgZnMsIHV0aWwsIHRlbXBEaXIgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vWXVlQ2hlbi1DL3B5LWlvcy1kZXZpY2VcblxuY29uc3QgQklOQVJZX05BTUUgPSAncHlpZGV2aWNlJztcblxuY2xhc3MgUHlpZGV2aWNlIHtcbiAgY29uc3RydWN0b3IgKHVkaWQpIHtcbiAgICB0aGlzLnVkaWQgPSB1ZGlkO1xuICAgIHRoaXMuYmluYXJ5UGF0aCA9IG51bGw7XG4gIH1cblxuICBhc3luYyBhc3NlcnRFeGlzdHMgKGlzU3RyaWN0ID0gdHJ1ZSkge1xuICAgIGlmICh0aGlzLmJpbmFyeVBhdGgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB0aGlzLmJpbmFyeVBhdGggPSBhd2FpdCBmcy53aGljaChCSU5BUllfTkFNRSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0JJTkFSWV9OQU1FfSBiaW5hcnkgY2Fubm90IGJlIGZvdW5kIGluIFBBVEguIGAgK1xuICAgICAgICAgIGBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGluc3RhbGxlZC4gVmlzaXQgaHR0cHM6Ly9naXRodWIuY29tL1l1ZUNoZW4tQy9weS1pb3MtZGV2aWNlIGZvciBgICtcbiAgICAgICAgICBgbW9yZSBkZXRhaWxzLmApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGUgKGFyZ3MsIG9wdHMgPSB7fSkge1xuICAgIGF3YWl0IHRoaXMuYXNzZXJ0RXhpc3RzKCk7XG4gICAgY29uc3Qge1xuICAgICAgY3dkLFxuICAgICAgZm9ybWF0ID0gJ2pzb24nLFxuICAgICAgbG9nU3Rkb3V0ID0gZmFsc2UsXG4gICAgfSA9IG9wdHM7XG5cbiAgICBjb25zdCBmaW5hbEFyZ3MgPSBbLi4uYXJncywgJy0tdWRpZCcsIHRoaXMudWRpZF07XG4gICAgaWYgKGZvcm1hdCkge1xuICAgICAgZmluYWxBcmdzLnB1c2goJy0tZm9ybWF0JywgZm9ybWF0KTtcbiAgICB9XG4gICAgY29uc3QgY21kU3RyID0gdXRpbC5xdW90ZShbdGhpcy5iaW5hcnlQYXRoLCAuLi5maW5hbEFyZ3NdKTtcbiAgICBsb2cuZGVidWcoYEV4ZWN1dGluZyAke2NtZFN0cn1gKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlYyh0aGlzLmJpbmFyeVBhdGgsIGZpbmFsQXJncywge2N3ZH0pO1xuICAgICAgaWYgKGxvZ1N0ZG91dCkge1xuICAgICAgICBsb2cuZGVidWcoYENvbW1hbmQgb3V0cHV0OiAke3Jlc3VsdC5zdGRvdXR9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7Y21kU3RyfScgZmFpbGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlLnN0ZGVyciB8fCBlLnN0ZG91dCB8fCBlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbGlzdFByb2ZpbGVzICgpIHtcbiAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IHRoaXMuZXhlY3V0ZShbJ3Byb2ZpbGVzJywgJ2xpc3QnXSk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2Uoc3Rkb3V0KTtcbiAgfVxuXG4gIGFzeW5jIGluc3RhbGxQcm9maWxlICh7cHJvZmlsZVBhdGgsIHBheWxvYWR9ID0ge30pIHtcbiAgICBpZiAoIXByb2ZpbGVQYXRoICYmICFwYXlsb2FkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VpdGhlciB0aGUgZnVsbCBwYXRoIHRvIHRoZSBwcm9maWxlIG9yIGl0cyBwYXlsb2FkIG11c3QgYmUgcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICBsZXQgdG1wUm9vdDtcbiAgICBsZXQgc3JjUGF0aCA9IHByb2ZpbGVQYXRoO1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXNyY1BhdGgpIHtcbiAgICAgICAgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgICAgICBzcmNQYXRoID0gcGF0aC5qb2luKHRtcFJvb3QsICdjZXJ0LnBlbScpO1xuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUoc3JjUGF0aCwgcGF5bG9hZCwgJ3V0ZjgnKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZShbJ3Byb2ZpbGVzJywgJ2luc3RhbGwnLCAnLS1wYXRoJywgc3JjUGF0aF0sIHtcbiAgICAgICAgbG9nU3Rkb3V0OiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRtcFJvb3QpIHtcbiAgICAgICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlbW92ZVByb2ZpbGUgKG5hbWUpIHtcbiAgICBhd2FpdCB0aGlzLmV4ZWN1dGUoWydwcm9maWxlcycsICdyZW1vdmUnLCBuYW1lXSwge2xvZ1N0ZG91dDogdHJ1ZX0pO1xuICB9XG5cbiAgYXN5bmMgbGlzdENyYXNoZXMgKCkge1xuICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgdGhpcy5leGVjdXRlKFsnY3Jhc2gnLCAnbGlzdCddKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzdGRvdXQucmVwbGFjZSgvJy9nLCAnXCInKSkuZmlsdGVyKCh4KSA9PiAhWycuJywgJy4uJ10uaW5jbHVkZXMoeCkpO1xuICB9XG5cbiAgYXN5bmMgZXhwb3J0Q3Jhc2ggKG5hbWUsIGRzdEZvbGRlcikge1xuICAgIGF3YWl0IHRoaXMuZXhlY3V0ZShbJ2NyYXNoJywgJ2V4cG9ydCcsICctLW5hbWUnLCBuYW1lXSwge1xuICAgICAgbG9nU3Rkb3V0OiB0cnVlLFxuICAgICAgLy8gVGhlIHRvb2wgZXhwb3J0cyBjcmFzaCByZXBvcnRzIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyXG4gICAgICBjd2Q6IGRzdEZvbGRlclxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCB7IFB5aWRldmljZSB9O1xuZXhwb3J0IGRlZmF1bHQgUHlpZGV2aWNlO1xuIl0sImZpbGUiOiJsaWIvcHktaW9zLWRldmljZS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
@@ -1,14 +1,19 @@
1
- import { fs } from 'appium-support';
1
+ import { fs, tempDir } from 'appium-support';
2
2
  import B from 'bluebird';
3
3
  import log from '../logger';
4
4
  import { utilities } from 'appium-ios-device';
5
5
  import path from 'path';
6
6
  import _ from 'lodash';
7
+ import Pyidevice from '../py-ios-device-client';
8
+
9
+ const REAL_DEVICE_MAGIC = '3620bbb0-fb9f-4b62-a668-896f2edc4d88';
10
+ const MAGIC_SEP = '/';
7
11
 
8
12
 
9
13
  class IOSCrashLog {
10
14
  constructor (opts = {}) {
11
15
  this.udid = opts.udid;
16
+ this.pyideviceClient = this.udid ? new Pyidevice(this.udid) : null;
12
17
  const logDir = opts.udid
13
18
  ? path.resolve(process.env.HOME, 'Library', 'Logs', 'CrashReporter', 'MobileDevice')
14
19
  : path.resolve(process.env.HOME, 'Library', 'Logs', 'DiagnosticReports');
@@ -20,7 +25,12 @@ class IOSCrashLog {
20
25
  this.sim = opts.sim;
21
26
  }
22
27
 
23
- async getCrashes () {
28
+ async _gatherFromRealDevice () {
29
+ if (await this.pyideviceClient.assertExists(false)) {
30
+ return (await this.pyideviceClient.listCrashes())
31
+ .map((x) => `${REAL_DEVICE_MAGIC}${MAGIC_SEP}${x}`);
32
+ }
33
+
24
34
  let crashLogsRoot = this.logDir;
25
35
  if (this.udid) {
26
36
  this.phoneName = this.phoneName || await utilities.getDeviceName(this.udid);
@@ -33,9 +43,17 @@ class IOSCrashLog {
33
43
  const foundFiles = await fs.glob(`${crashLogsRoot}/**/*.crash`, {
34
44
  strict: false
35
45
  });
36
- if (this.udid) {
37
- return foundFiles;
46
+ return foundFiles;
47
+ }
48
+
49
+ async _gatherFromSimulator () {
50
+ if (!await fs.exists(this.logDir)) {
51
+ log.debug(`Crash reports root '${this.logDir}' does not exist. Got nothing to gather.`);
52
+ return [];
38
53
  }
54
+ const foundFiles = await fs.glob(`${this.logDir}/**/*.crash`, {
55
+ strict: false
56
+ });
39
57
  // For Simulator only include files, that contain current UDID
40
58
  return await B.filter(foundFiles, async (x) => {
41
59
  try {
@@ -47,6 +65,12 @@ class IOSCrashLog {
47
65
  });
48
66
  }
49
67
 
68
+ async getCrashes () {
69
+ return this.udid
70
+ ? await this._gatherFromRealDevice()
71
+ : await this._gatherFromSimulator();
72
+ }
73
+
50
74
  async startCapture () {
51
75
  this.prevLogs = await this.getCrashes();
52
76
  }
@@ -69,14 +93,30 @@ class IOSCrashLog {
69
93
  }
70
94
 
71
95
  async filesToJSON (paths) {
72
- return await B.map(paths, async (fullPath) => {
73
- const stat = await fs.stat(fullPath);
74
- return {
75
- timestamp: stat.ctime.getTime(),
76
- level: 'ALL',
77
- message: await fs.readFile(fullPath, 'utf8')
78
- };
79
- });
96
+ const tmpRoot = await tempDir.openDir();
97
+ try {
98
+ return (await B.map(paths, async (fullPath) => {
99
+ if (_.includes(fullPath, REAL_DEVICE_MAGIC)) {
100
+ const fileName = _.last(fullPath.split(MAGIC_SEP));
101
+ try {
102
+ await this.pyideviceClient.exportCrash(fileName, tmpRoot);
103
+ } catch (e) {
104
+ log.warn(`Cannot export the crash report '${fileName}'. Skipping it. ` +
105
+ `Original error: ${e.message}`);
106
+ return;
107
+ }
108
+ fullPath = path.join(tmpRoot, fileName);
109
+ }
110
+ const stat = await fs.stat(fullPath);
111
+ return {
112
+ timestamp: stat.ctime.getTime(),
113
+ level: 'ALL',
114
+ message: await fs.readFile(fullPath, 'utf8')
115
+ };
116
+ })).filter(Boolean);
117
+ } finally {
118
+ await fs.rimraf(tmpRoot);
119
+ }
80
120
  }
81
121
  }
82
122
 
@@ -34,6 +34,7 @@ class Pyidevice {
34
34
  async execute (args, opts = {}) {
35
35
  await this.assertExists();
36
36
  const {
37
+ cwd,
37
38
  format = 'json',
38
39
  logStdout = false,
39
40
  } = opts;
@@ -45,7 +46,7 @@ class Pyidevice {
45
46
  const cmdStr = util.quote([this.binaryPath, ...finalArgs]);
46
47
  log.debug(`Executing ${cmdStr}`);
47
48
  try {
48
- const result = await exec(this.binaryPath, finalArgs);
49
+ const result = await exec(this.binaryPath, finalArgs, {cwd});
49
50
  if (logStdout) {
50
51
  log.debug(`Command output: ${result.stdout}`);
51
52
  }
@@ -60,28 +61,24 @@ class Pyidevice {
60
61
  return JSON.parse(stdout);
61
62
  }
62
63
 
63
- async installProfile (opts = {}) {
64
- const {
65
- profilePath,
66
- payload,
67
- } = opts;
64
+ async installProfile ({profilePath, payload} = {}) {
68
65
  if (!profilePath && !payload) {
69
- throw new TypeError('Profile must be defined');
66
+ throw new Error('Either the full path to the profile or its payload must be provided');
70
67
  }
71
68
 
72
- if (profilePath) {
73
- await this.execute(['profiles', 'install', '--path', profilePath], {
69
+ let tmpRoot;
70
+ let srcPath = profilePath;
71
+ try {
72
+ if (!srcPath) {
73
+ tmpRoot = await tempDir.openDir();
74
+ srcPath = path.join(tmpRoot, 'cert.pem');
75
+ await fs.writeFile(srcPath, payload, 'utf8');
76
+ }
77
+ await this.execute(['profiles', 'install', '--path', srcPath], {
74
78
  logStdout: true
75
79
  });
76
- } else {
77
- const tmpRoot = await tempDir.openDir();
78
- const tmpProfilePath = path.join(tmpRoot, 'cert.pem');
79
- try {
80
- await fs.writeFile(tmpProfilePath, payload, 'utf8');
81
- await this.execute(['profiles', 'install', '--path', tmpProfilePath], {
82
- logStdout: true
83
- });
84
- } finally {
80
+ } finally {
81
+ if (tmpRoot) {
85
82
  await fs.rimraf(tmpRoot);
86
83
  }
87
84
  }
@@ -90,6 +87,19 @@ class Pyidevice {
90
87
  async removeProfile (name) {
91
88
  await this.execute(['profiles', 'remove', name], {logStdout: true});
92
89
  }
90
+
91
+ async listCrashes () {
92
+ const {stdout} = await this.execute(['crash', 'list']);
93
+ return JSON.parse(stdout.replace(/'/g, '"')).filter((x) => !['.', '..'].includes(x));
94
+ }
95
+
96
+ async exportCrash (name, dstFolder) {
97
+ await this.execute(['crash', 'export', '--name', name], {
98
+ logStdout: true,
99
+ // The tool exports crash reports to the current working dir
100
+ cwd: dstFolder
101
+ });
102
+ }
93
103
  }
94
104
 
95
105
  export { Pyidevice };
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "xcuitest",
9
9
  "xctest"
10
10
  ],
11
- "version": "3.60.1",
11
+ "version": "3.61.0",
12
12
  "author": "appium",
13
13
  "license": "Apache-2.0",
14
14
  "repository": {