appium-ios-device 2.5.3 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/README.md +47 -0
- package/build/lib/base-service.js +1 -1
- package/build/lib/base-service.js.map +1 -1
- package/build/lib/imagemounter/index.js +109 -0
- package/build/lib/imagemounter/index.js.map +1 -0
- package/build/lib/imagemounter/utils/list_developer_image.js +134 -0
- package/build/lib/imagemounter/utils/list_developer_image.js.map +1 -0
- package/build/lib/instrument/transformer/nskeyed.js +4 -3
- package/build/lib/instrument/transformer/nskeyed.js.map +1 -1
- package/build/lib/services.js +7 -1
- package/build/lib/services.js.map +1 -1
- package/build/lib/utilities.js +10 -1
- package/build/lib/utilities.js.map +1 -1
- package/build/lib/xctest.js +2 -2
- package/build/lib/xctest.js.map +1 -1
- package/lib/base-service.js +8 -5
- package/lib/imagemounter/index.js +124 -0
- package/lib/imagemounter/utils/list_developer_image.js +185 -0
- package/lib/instrument/transformer/nskeyed.js +3 -2
- package/lib/services.js +27 -22
- package/lib/utilities.js +34 -9
- package/lib/xctest.js +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
## [2.6.0](https://github.com/appium/appium-ios-device/compare/v2.5.4...v2.6.0) (2023-08-03)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* Add ImageMounterService and auto fetch developer image if start service failed with 'InvalidService' ([#112](https://github.com/appium/appium-ios-device/issues/112)) ([9fcc5c3](https://github.com/appium/appium-ios-device/commit/9fcc5c3c864470a941a3aa84cad736e114116acb))
|
|
7
|
+
|
|
8
|
+
## [2.5.4](https://github.com/appium/appium-ios-device/compare/v2.5.3...v2.5.4) (2023-07-07)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Miscellaneous Chores
|
|
12
|
+
|
|
13
|
+
* Bump prettier from 2.8.8 to 3.0.0 ([#121](https://github.com/appium/appium-ios-device/issues/121)) ([65f9fd0](https://github.com/appium/appium-ios-device/commit/65f9fd0de7f8fdc572d76e92963bfbd2e9311674))
|
|
14
|
+
|
|
1
15
|
## [2.5.3](https://github.com/appium/appium-ios-device/compare/v2.5.2...v2.5.3) (2023-06-07)
|
|
2
16
|
|
|
3
17
|
|
package/README.md
CHANGED
|
@@ -30,6 +30,7 @@ This module should be used over the `utilities` and `services` modules or export
|
|
|
30
30
|
* `utilities.startLockdownSession`
|
|
31
31
|
* `utilities.connectPort`
|
|
32
32
|
* `utilities.connectPortSSL`
|
|
33
|
+
* `utilities.fetchImageFromGithubRepo`
|
|
33
34
|
* `services.startSyslogService`
|
|
34
35
|
* `services.startWebInspectorService`
|
|
35
36
|
* `services.startInstallationProxyService`
|
|
@@ -40,6 +41,7 @@ This module should be used over the `utilities` and `services` modules or export
|
|
|
40
41
|
* `services.startInstrumentService`
|
|
41
42
|
* `services.startTestmanagerdService`
|
|
42
43
|
* `services.startMCInstallService`
|
|
44
|
+
* `services.startImageMounterService`
|
|
43
45
|
|
|
44
46
|
### Classes
|
|
45
47
|
|
|
@@ -63,6 +65,51 @@ This class simulates the procedure which Xcode uses to invoke xctests.
|
|
|
63
65
|
* `xctest.stop()`
|
|
64
66
|
* Stop xctest process.
|
|
65
67
|
|
|
68
|
+
### Mount Developer Image
|
|
69
|
+
|
|
70
|
+
When using a higher version of iOS devices with a lower version of Xcode or other non-macOS operating systems, most of the functions in `services` or `Xctest` may not be available because the developer image is not mounted. Sometimes it can be solved automatically by opening Xcode and waiting for a while. But more often you need to manually download and mount the developer image as follows:
|
|
71
|
+
|
|
72
|
+
1. Download .dmg file with new Xcode(sometimes beta version is needed) from [Apple Developer Downloads Page](https://developer.apple.com/download/more/).
|
|
73
|
+
2. Unarchive new Xcode from .dmg file without replacing old one.
|
|
74
|
+
3. Find the folder named after the target iOS version in `(New Xcode.app)/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport`. A `DeveloperDiskImage.dmg` and a `DeveloperDiskImage.dmg.signature` should be inside that folder.
|
|
75
|
+
4. Copy the folder you found from last step and paste to `(Old Xcode.app)/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport`.
|
|
76
|
+
5. The operations in the above two steps are also applicable to platforms other than the iPhone. e.g. the folder for tvOS is `(Xcode.app)/Contents/Developer/Platforms/AppleTVOS.platform/DeviceSupport`.
|
|
77
|
+
6. Restart your old Xcode and reconnect your devices, wait for a while until the "preparing device for development" prompt disappears.
|
|
78
|
+
7. You can also mount this image using `ideviceimagemounter` binary file compiled by [libimobiledevice](https://github.com/libimobiledevice/libimobiledevice) project on your operating system.
|
|
79
|
+
|
|
80
|
+
These operations are very cumbersome. Fortunately there are many repositories of these developer images in the open source community. The folders mentioned in the above process are zipped and uploaded into open source repositories according to different versions. You can also make your own mirror repository on GitHub in a similar way. With `services.startImageMounterService` and `utilities.fetchImageFromGithubRepo`, you can automate the whole process cross-platform.
|
|
81
|
+
|
|
82
|
+
As an example, assuming we are using a repo from `https://github/example/iOSDeviceSupport`. All the .zip files are inside `DeviceSupportFiles/iOS` folder of root. We can check the mount status, download and mount the image using following code:
|
|
83
|
+
|
|
84
|
+
```js
|
|
85
|
+
import { services, utilities } from 'appium-ios-device';
|
|
86
|
+
import _ from 'lodash';
|
|
87
|
+
const { startImageMounterService } = services;
|
|
88
|
+
...
|
|
89
|
+
async function checkAndMountDeveloperImage(udid) {
|
|
90
|
+
const imageMountService = await startImageMounterService(udid);
|
|
91
|
+
try {
|
|
92
|
+
const mountStatus = await imageMountService.isDeveloperImageMounted();
|
|
93
|
+
if (!mountStatus) {
|
|
94
|
+
const { fetchImageFromGithubRepo } = utilities;
|
|
95
|
+
const repoOpts = {
|
|
96
|
+
githubRepo: 'example/iOSDeviceSupport',
|
|
97
|
+
subFolderList: ['DeviceSupportFiles', 'iOS']
|
|
98
|
+
}
|
|
99
|
+
const downloadedImagePath = await fetchImageFromGithubRepo(udid, repoOpts);
|
|
100
|
+
if (!_.isEmpty(downloadedImagePath)) {
|
|
101
|
+
const {developerImage, developerImageSignature} = downloadedImagePath;
|
|
102
|
+
await imageMountService.mount(developerImage, developerImageSignature);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
} catch(e) {
|
|
106
|
+
// Failed to mount, do something...
|
|
107
|
+
} finally {
|
|
108
|
+
imageMountService.close();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
66
113
|
## Test
|
|
67
114
|
|
|
68
115
|
``` shell
|
|
@@ -30,4 +30,4 @@ class BaseServicePlist {
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
exports.BaseServicePlist = BaseServicePlist;
|
|
33
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
33
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCYXNlU2VydmljZVNvY2tldCIsImNvbnN0cnVjdG9yIiwic29ja2V0Q2xpZW50IiwiX3NvY2tldENsaWVudCIsIl9hc3NpZ25DbGllbnRGYWlsdXJlSGFuZGxlcnMiLCJzb3VyY2VTdHJlYW1zIiwiZXZ0Iiwib25jZSIsIm1hcCIsInMiLCJ1bnBpcGUiLCJjbG9zZSIsImRlc3Ryb3llZCIsImVuZCIsImV4cG9ydHMiLCJCYXNlU2VydmljZVBsaXN0IiwicGxpc3RTZXJ2aWNlIiwiX3BsaXN0U2VydmljZSJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9iYXNlLXNlcnZpY2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgQmFzZVNlcnZpY2VTb2NrZXQge1xuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoJ25ldCcpLlNvY2tldH0gc29ja2V0Q2xpZW50XG4gICAqL1xuICBjb25zdHJ1Y3Rvcihzb2NrZXRDbGllbnQpIHtcbiAgICB0aGlzLl9zb2NrZXRDbGllbnQgPSBzb2NrZXRDbGllbnQ7XG4gIH1cblxuICBfYXNzaWduQ2xpZW50RmFpbHVyZUhhbmRsZXJzKC4uLnNvdXJjZVN0cmVhbXMpIHtcbiAgICBmb3IgKGNvbnN0IGV2dCBpbiBbJ2Nsb3NlJywgJ2VuZCddKSB7XG4gICAgICB0aGlzLl9zb2NrZXRDbGllbnQub25jZShldnQsXG4gICAgICAgICgpID0+IHNvdXJjZVN0cmVhbXMubWFwKChzKSA9PiBzLnVucGlwZSh0aGlzLl9zb2NrZXRDbGllbnQpKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgdW5kZXJseWluZyBzb2NrZXQgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBwaG9uZVxuICAgKi9cbiAgY2xvc2UoKSB7XG4gICAgaWYgKCF0aGlzLl9zb2NrZXRDbGllbnQuZGVzdHJveWVkKSB7XG4gICAgICB0aGlzLl9zb2NrZXRDbGllbnQuZW5kKCk7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIEJhc2VTZXJ2aWNlUGxpc3Qge1xuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoJy4vcGxpc3Qtc2VydmljZScpLlBsaXN0U2VydmljZX0gcGxpc3RTZXJ2aWNlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwbGlzdFNlcnZpY2UpIHtcbiAgICB0aGlzLl9wbGlzdFNlcnZpY2UgPSBwbGlzdFNlcnZpY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSB1bmRlcmx5aW5nIHNvY2tldCBjb21tdW5pY2F0aW5nIHdpdGggdGhlIHBob25lXG4gICAqL1xuICBjbG9zZSgpIHtcbiAgICB0aGlzLl9wbGlzdFNlcnZpY2UuY2xvc2UoKTtcbiAgfVxufVxuXG5cbmV4cG9ydCB7IEJhc2VTZXJ2aWNlU29ja2V0LCBCYXNlU2VydmljZVBsaXN0IH07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxNQUFNQSxpQkFBaUIsQ0FBQztFQUl0QkMsV0FBV0EsQ0FBQ0MsWUFBWSxFQUFFO0lBQ3hCLElBQUksQ0FBQ0MsYUFBYSxHQUFHRCxZQUFZO0VBQ25DO0VBRUFFLDRCQUE0QkEsQ0FBQyxHQUFHQyxhQUFhLEVBQUU7SUFDN0MsS0FBSyxNQUFNQyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUU7TUFDbEMsSUFBSSxDQUFDSCxhQUFhLENBQUNJLElBQUksQ0FBQ0QsR0FBRyxFQUN6QixNQUFNRCxhQUFhLENBQUNHLEdBQUcsQ0FBRUMsQ0FBQyxJQUFLQSxDQUFDLENBQUNDLE1BQU0sQ0FBQyxJQUFJLENBQUNQLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDakU7RUFDRjtFQUtBUSxLQUFLQSxDQUFBLEVBQUc7SUFDTixJQUFJLENBQUMsSUFBSSxDQUFDUixhQUFhLENBQUNTLFNBQVMsRUFBRTtNQUNqQyxJQUFJLENBQUNULGFBQWEsQ0FBQ1UsR0FBRyxDQUFDLENBQUM7SUFDMUI7RUFDRjtBQUNGO0FBQUNDLE9BQUEsQ0FBQWQsaUJBQUEsR0FBQUEsaUJBQUE7QUFFRCxNQUFNZSxnQkFBZ0IsQ0FBQztFQUlyQmQsV0FBV0EsQ0FBQ2UsWUFBWSxFQUFFO0lBQ3hCLElBQUksQ0FBQ0MsYUFBYSxHQUFHRCxZQUFZO0VBQ25DO0VBS0FMLEtBQUtBLENBQUEsRUFBRztJQUNOLElBQUksQ0FBQ00sYUFBYSxDQUFDTixLQUFLLENBQUMsQ0FBQztFQUM1QjtBQUNGO0FBQUNHLE9BQUEsQ0FBQUMsZ0JBQUEsR0FBQUEsZ0JBQUEifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-service.js","names":["BaseServiceSocket","constructor","socketClient","_socketClient","_assignClientFailureHandlers","sourceStreams","evt","once","map","s","unpipe","close","destroyed","end","exports","BaseServicePlist","plistService","_plistService"],"sources":["../../lib/base-service.js"],"sourcesContent":["class BaseServiceSocket {\n /**\n * @param {import('net').Socket} socketClient\n */\n constructor
|
|
1
|
+
{"version":3,"file":"base-service.js","names":["BaseServiceSocket","constructor","socketClient","_socketClient","_assignClientFailureHandlers","sourceStreams","evt","once","map","s","unpipe","close","destroyed","end","exports","BaseServicePlist","plistService","_plistService"],"sources":["../../lib/base-service.js"],"sourcesContent":["class BaseServiceSocket {\n /**\n * @param {import('net').Socket} socketClient\n */\n constructor(socketClient) {\n this._socketClient = socketClient;\n }\n\n _assignClientFailureHandlers(...sourceStreams) {\n for (const evt in ['close', 'end']) {\n this._socketClient.once(evt,\n () => sourceStreams.map((s) => s.unpipe(this._socketClient)));\n }\n }\n\n /**\n * Closes the underlying socket communicating with the phone\n */\n close() {\n if (!this._socketClient.destroyed) {\n this._socketClient.end();\n }\n }\n}\n\nclass BaseServicePlist {\n /**\n * @param {import('./plist-service').PlistService} plistService\n */\n constructor(plistService) {\n this._plistService = plistService;\n }\n\n /**\n * Closes the underlying socket communicating with the phone\n */\n close() {\n this._plistService.close();\n }\n}\n\n\nexport { BaseServiceSocket, BaseServicePlist };\n"],"mappings":";;;;;;;AAAA,MAAMA,iBAAiB,CAAC;EAItBC,WAAWA,CAACC,YAAY,EAAE;IACxB,IAAI,CAACC,aAAa,GAAGD,YAAY;EACnC;EAEAE,4BAA4BA,CAAC,GAAGC,aAAa,EAAE;IAC7C,KAAK,MAAMC,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;MAClC,IAAI,CAACH,aAAa,CAACI,IAAI,CAACD,GAAG,EACzB,MAAMD,aAAa,CAACG,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACC,MAAM,CAAC,IAAI,CAACP,aAAa,CAAC,CAAC,CAAC;IACjE;EACF;EAKAQ,KAAKA,CAAA,EAAG;IACN,IAAI,CAAC,IAAI,CAACR,aAAa,CAACS,SAAS,EAAE;MACjC,IAAI,CAACT,aAAa,CAACU,GAAG,CAAC,CAAC;IAC1B;EACF;AACF;AAACC,OAAA,CAAAd,iBAAA,GAAAA,iBAAA;AAED,MAAMe,gBAAgB,CAAC;EAIrBd,WAAWA,CAACe,YAAY,EAAE;IACxB,IAAI,CAACC,aAAa,GAAGD,YAAY;EACnC;EAKAL,KAAKA,CAAA,EAAG;IACN,IAAI,CAACM,aAAa,CAACN,KAAK,CAAC,CAAC;EAC5B;AACF;AAACG,OAAA,CAAAC,gBAAA,GAAAA,gBAAA"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.MOBILE_IMAGE_MOUNTER_SERVICE_NAME = exports.ImageMounter = void 0;
|
|
8
|
+
require("source-map-support/register");
|
|
9
|
+
var _baseService = require("../base-service");
|
|
10
|
+
var _support = require("@appium/support");
|
|
11
|
+
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
12
|
+
var _logger = _interopRequireDefault(require("../logger"));
|
|
13
|
+
const {
|
|
14
|
+
lstat,
|
|
15
|
+
readFile,
|
|
16
|
+
createReadStream
|
|
17
|
+
} = _support.fs;
|
|
18
|
+
const MOBILE_IMAGE_MOUNTER_SERVICE_NAME = 'com.apple.mobile.mobile_image_mounter';
|
|
19
|
+
exports.MOBILE_IMAGE_MOUNTER_SERVICE_NAME = MOBILE_IMAGE_MOUNTER_SERVICE_NAME;
|
|
20
|
+
const FILE_TYPE_IMAGE = 'image';
|
|
21
|
+
const FILE_TYPE_SIGNATURE = 'signature';
|
|
22
|
+
function checkIfError(ret) {
|
|
23
|
+
if (ret.Error) {
|
|
24
|
+
throw new Error(ret.Error);
|
|
25
|
+
}
|
|
26
|
+
return ret;
|
|
27
|
+
}
|
|
28
|
+
async function assertIsFile(filePath, fileType) {
|
|
29
|
+
let fileStat;
|
|
30
|
+
try {
|
|
31
|
+
fileStat = await lstat(filePath);
|
|
32
|
+
} catch (err) {
|
|
33
|
+
if (err.code === 'ENOENT') {
|
|
34
|
+
throw new Error(`The provided ${fileType} path does not exist: ${filePath}`);
|
|
35
|
+
}
|
|
36
|
+
throw err;
|
|
37
|
+
}
|
|
38
|
+
if (fileStat.isDirectory()) {
|
|
39
|
+
throw new Error(`The provided ${fileType} path is expected to be a file, but a directory was given: ${filePath}`);
|
|
40
|
+
}
|
|
41
|
+
return fileStat;
|
|
42
|
+
}
|
|
43
|
+
class ImageMounter extends _baseService.BaseServicePlist {
|
|
44
|
+
async lookup(imageType = 'Developer') {
|
|
45
|
+
const ret = await this._plistService.sendPlistAndReceive({
|
|
46
|
+
Command: 'LookupImage',
|
|
47
|
+
ImageType: imageType
|
|
48
|
+
});
|
|
49
|
+
return checkIfError(ret).ImageSignature || [];
|
|
50
|
+
}
|
|
51
|
+
async isDeveloperImageMounted() {
|
|
52
|
+
return (await this.lookup()).length > 0;
|
|
53
|
+
}
|
|
54
|
+
async mount(imageFilePath, imageSignatureFilePath, imageType = 'Developer') {
|
|
55
|
+
var _mountResult$Detailed;
|
|
56
|
+
const [imageFileStat] = await _bluebird.default.all([assertIsFile(imageFilePath, FILE_TYPE_IMAGE), assertIsFile(imageSignatureFilePath, FILE_TYPE_SIGNATURE)]);
|
|
57
|
+
const signature = await readFile(imageSignatureFilePath);
|
|
58
|
+
const mountedImages = await this.lookup(imageType);
|
|
59
|
+
if (mountedImages.find(mountedSignature => signature.equals(mountedSignature))) {
|
|
60
|
+
_logger.default.info(`An image with same signature of ${imageSignatureFilePath} is mounted. Doing nothing here`);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const imageSize = imageFileStat.size;
|
|
64
|
+
const receiveBytesResult = await this._plistService.sendPlistAndReceive({
|
|
65
|
+
Command: 'ReceiveBytes',
|
|
66
|
+
ImageSignature: signature,
|
|
67
|
+
ImageSize: imageSize,
|
|
68
|
+
ImageType: imageType
|
|
69
|
+
});
|
|
70
|
+
if (checkIfError(receiveBytesResult).Status !== 'ReceiveBytesAck') {
|
|
71
|
+
const errMsg = `Unexpected return from ${MOBILE_IMAGE_MOUNTER_SERVICE_NAME} on sending ReceiveBytes`;
|
|
72
|
+
throw new Error(`${errMsg}: ${JSON.stringify(receiveBytesResult)}`);
|
|
73
|
+
}
|
|
74
|
+
const stream = createReadStream(imageFilePath);
|
|
75
|
+
try {
|
|
76
|
+
await new _bluebird.default((resolve, reject) => {
|
|
77
|
+
stream.on('end', resolve);
|
|
78
|
+
stream.on('error', reject);
|
|
79
|
+
stream.on('data', async data => {
|
|
80
|
+
try {
|
|
81
|
+
await this._plistService._socketClient.write(data);
|
|
82
|
+
} catch (e) {
|
|
83
|
+
stream.emit('error', e);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
} finally {
|
|
88
|
+
stream.close();
|
|
89
|
+
}
|
|
90
|
+
const pushImageResult = await this._plistService.receivePlist();
|
|
91
|
+
if (checkIfError(pushImageResult).Status !== 'Complete') {
|
|
92
|
+
const errMsg = `Unexpected return from ${MOBILE_IMAGE_MOUNTER_SERVICE_NAME} on pushing image file`;
|
|
93
|
+
throw new Error(`${errMsg}: ${JSON.stringify(pushImageResult)}`);
|
|
94
|
+
}
|
|
95
|
+
const mountResult = await this._plistService.sendPlistAndReceive({
|
|
96
|
+
Command: 'MountImage',
|
|
97
|
+
ImagePath: '/private/var/mobile/Media/PublicStaging/staging.dimag',
|
|
98
|
+
ImageSignature: signature,
|
|
99
|
+
ImageType: imageType
|
|
100
|
+
});
|
|
101
|
+
if ((_mountResult$Detailed = mountResult.DetailedError) !== null && _mountResult$Detailed !== void 0 && _mountResult$Detailed.includes('is already mounted at /Developer')) {
|
|
102
|
+
_logger.default.info('DeveloperImage was already mounted');
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
checkIfError(mountResult);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
exports.ImageMounter = ImageMounter;
|
|
109
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYmFzZVNlcnZpY2UiLCJyZXF1aXJlIiwiX3N1cHBvcnQiLCJfYmx1ZWJpcmQiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2xvZ2dlciIsImxzdGF0IiwicmVhZEZpbGUiLCJjcmVhdGVSZWFkU3RyZWFtIiwiZnMiLCJNT0JJTEVfSU1BR0VfTU9VTlRFUl9TRVJWSUNFX05BTUUiLCJleHBvcnRzIiwiRklMRV9UWVBFX0lNQUdFIiwiRklMRV9UWVBFX1NJR05BVFVSRSIsImNoZWNrSWZFcnJvciIsInJldCIsIkVycm9yIiwiYXNzZXJ0SXNGaWxlIiwiZmlsZVBhdGgiLCJmaWxlVHlwZSIsImZpbGVTdGF0IiwiZXJyIiwiY29kZSIsImlzRGlyZWN0b3J5IiwiSW1hZ2VNb3VudGVyIiwiQmFzZVNlcnZpY2VQbGlzdCIsImxvb2t1cCIsImltYWdlVHlwZSIsIl9wbGlzdFNlcnZpY2UiLCJzZW5kUGxpc3RBbmRSZWNlaXZlIiwiQ29tbWFuZCIsIkltYWdlVHlwZSIsIkltYWdlU2lnbmF0dXJlIiwiaXNEZXZlbG9wZXJJbWFnZU1vdW50ZWQiLCJsZW5ndGgiLCJtb3VudCIsImltYWdlRmlsZVBhdGgiLCJpbWFnZVNpZ25hdHVyZUZpbGVQYXRoIiwiX21vdW50UmVzdWx0JERldGFpbGVkIiwiaW1hZ2VGaWxlU3RhdCIsIkIiLCJhbGwiLCJzaWduYXR1cmUiLCJtb3VudGVkSW1hZ2VzIiwiZmluZCIsIm1vdW50ZWRTaWduYXR1cmUiLCJlcXVhbHMiLCJsb2ciLCJpbmZvIiwiaW1hZ2VTaXplIiwic2l6ZSIsInJlY2VpdmVCeXRlc1Jlc3VsdCIsIkltYWdlU2l6ZSIsIlN0YXR1cyIsImVyck1zZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJzdHJlYW0iLCJyZXNvbHZlIiwicmVqZWN0Iiwib24iLCJkYXRhIiwiX3NvY2tldENsaWVudCIsIndyaXRlIiwiZSIsImVtaXQiLCJjbG9zZSIsInB1c2hJbWFnZVJlc3VsdCIsInJlY2VpdmVQbGlzdCIsIm1vdW50UmVzdWx0IiwiSW1hZ2VQYXRoIiwiRGV0YWlsZWRFcnJvciIsImluY2x1ZGVzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2ltYWdlbW91bnRlci9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlU2VydmljZVBsaXN0IH0gZnJvbSAnLi4vYmFzZS1zZXJ2aWNlJztcbmltcG9ydCB7IGZzIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcbmNvbnN0IHsgbHN0YXQsIHJlYWRGaWxlLCBjcmVhdGVSZWFkU3RyZWFtIH0gPSBmcztcblxuY29uc3QgTU9CSUxFX0lNQUdFX01PVU5URVJfU0VSVklDRV9OQU1FID0gJ2NvbS5hcHBsZS5tb2JpbGUubW9iaWxlX2ltYWdlX21vdW50ZXInO1xuY29uc3QgRklMRV9UWVBFX0lNQUdFID0gJ2ltYWdlJztcbmNvbnN0IEZJTEVfVFlQRV9TSUdOQVRVUkUgPSAnc2lnbmF0dXJlJztcblxuZnVuY3Rpb24gY2hlY2tJZkVycm9yKHJldCkge1xuICAgIGlmIChyZXQuRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJldC5FcnJvcik7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFzc2VydElzRmlsZShmaWxlUGF0aCwgZmlsZVR5cGUpIHtcbiAgICAvKiogQHR5cGUge2ltcG9ydCgnZnMnKS5TdGF0cyB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgZmlsZVN0YXQ7XG4gICAgdHJ5IHtcbiAgICAgICAgZmlsZVN0YXQgPSBhd2FpdCBsc3RhdChmaWxlUGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICgvKiogQHR5cGUge05vZGVKUy5FcnJub0V4Y2VwdGlvbn0gKi8oZXJyKS5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvdmlkZWQgJHtmaWxlVHlwZX0gcGF0aCBkb2VzIG5vdCBleGlzdDogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIGlmIChmaWxlU3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHByb3ZpZGVkICR7ZmlsZVR5cGV9IHBhdGggaXMgZXhwZWN0ZWQgdG8gYmUgYSBmaWxlLCBidXQgYSBkaXJlY3Rvcnkgd2FzIGdpdmVuOiAke2ZpbGVQYXRofWApO1xuICAgIH1cbiAgICByZXR1cm4gZmlsZVN0YXQ7XG59XG5cbmNsYXNzIEltYWdlTW91bnRlciBleHRlbmRzIEJhc2VTZXJ2aWNlUGxpc3Qge1xuXG4gICAgLyoqXG4gICAgICogTG9va3VwIGZvciBtb3VudGVkIGltYWdlcy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaW1hZ2VUeXBlIFR5cGUgb2YgaW1hZ2UsIGBEZXZlbG9wZXJgIGJ5IGRlZmF1bHQuXG4gICAgICogQHJldHVybnMge1Byb21pc2U8QnVmZmVyW10+fSBTaWduYXR1cmUgb2YgZWFjaCBtb3VudGVkIGltYWdlLlxuICAgICAqL1xuICAgIGFzeW5jIGxvb2t1cChpbWFnZVR5cGUgPSAnRGV2ZWxvcGVyJykge1xuICAgICAgICBjb25zdCByZXQgPSBhd2FpdCB0aGlzLl9wbGlzdFNlcnZpY2Uuc2VuZFBsaXN0QW5kUmVjZWl2ZSh7XG4gICAgICAgICAgICBDb21tYW5kOiAnTG9va3VwSW1hZ2UnLFxuICAgICAgICAgICAgSW1hZ2VUeXBlOiBpbWFnZVR5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjaGVja0lmRXJyb3IocmV0KS5JbWFnZVNpZ25hdHVyZSB8fCBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBkZXZlbG9wZXIgaW1hZ2UgaXMgbW91bnRlZC5cbiAgICAgKi9cbiAgICBhc3luYyBpc0RldmVsb3BlckltYWdlTW91bnRlZCgpIHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmxvb2t1cCgpKS5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdW50IGltYWdlIGZvciBkZXZpY2UuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGltYWdlRmlsZVBhdGggVGhlIGZpbGUgcGF0aCBvZiBpbWFnZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaW1hZ2VTaWduYXR1cmVGaWxlUGF0aCBUaGUgc2lnbmF0dXJlIGZpbGUgcGF0aCBvZiBnaXZlbiBgRGV2ZWxvcGVyRGlza0ltYWdlLmRtZ2BcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaW1hZ2VUeXBlIFR5cGUgb2YgaW1hZ2UsIGBEZXZlbG9wZXJgIGJ5IGRlZmF1bHQuXG4gICAgICovXG4gICAgYXN5bmMgbW91bnQoaW1hZ2VGaWxlUGF0aCwgaW1hZ2VTaWduYXR1cmVGaWxlUGF0aCwgaW1hZ2VUeXBlID0gJ0RldmVsb3BlcicpIHtcbiAgICAgICAgLy9jaGVjayBmaWxlIHN0YXRzXG4gICAgICAgIGNvbnN0IFtpbWFnZUZpbGVTdGF0XSA9IGF3YWl0IEIuYWxsKFtcbiAgICAgICAgICAgIGFzc2VydElzRmlsZShpbWFnZUZpbGVQYXRoLCBGSUxFX1RZUEVfSU1BR0UpLFxuICAgICAgICAgICAgYXNzZXJ0SXNGaWxlKGltYWdlU2lnbmF0dXJlRmlsZVBhdGgsIEZJTEVfVFlQRV9TSUdOQVRVUkUpXG4gICAgICAgIF0pO1xuICAgICAgICAvL3JlYWQgc2lnbmF0dXJlXG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IHJlYWRGaWxlKGltYWdlU2lnbmF0dXJlRmlsZVBhdGgpO1xuICAgICAgICBjb25zdCBtb3VudGVkSW1hZ2VzID0gYXdhaXQgdGhpcy5sb29rdXAoaW1hZ2VUeXBlKTtcbiAgICAgICAgaWYgKG1vdW50ZWRJbWFnZXMuZmluZCgobW91bnRlZFNpZ25hdHVyZSkgPT4gc2lnbmF0dXJlLmVxdWFscyhtb3VudGVkU2lnbmF0dXJlKSkpIHtcbiAgICAgICAgICAgIGxvZy5pbmZvKGBBbiBpbWFnZSB3aXRoIHNhbWUgc2lnbmF0dXJlIG9mICR7aW1hZ2VTaWduYXR1cmVGaWxlUGF0aH0gaXMgbW91bnRlZC4gRG9pbmcgbm90aGluZyBoZXJlYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy9ub3RpZnkgZGV2aWNlXG4gICAgICAgIGNvbnN0IGltYWdlU2l6ZSA9IGltYWdlRmlsZVN0YXQuc2l6ZTtcbiAgICAgICAgY29uc3QgcmVjZWl2ZUJ5dGVzUmVzdWx0ID0gYXdhaXQgdGhpcy5fcGxpc3RTZXJ2aWNlLnNlbmRQbGlzdEFuZFJlY2VpdmUoe1xuICAgICAgICAgICAgQ29tbWFuZDogJ1JlY2VpdmVCeXRlcycsXG4gICAgICAgICAgICBJbWFnZVNpZ25hdHVyZTogc2lnbmF0dXJlLFxuICAgICAgICAgICAgSW1hZ2VTaXplOiBpbWFnZVNpemUsXG4gICAgICAgICAgICBJbWFnZVR5cGU6IGltYWdlVHlwZVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNoZWNrSWZFcnJvcihyZWNlaXZlQnl0ZXNSZXN1bHQpLlN0YXR1cyAhPT0gJ1JlY2VpdmVCeXRlc0FjaycpIHtcbiAgICAgICAgICAgIGNvbnN0IGVyck1zZyA9IGBVbmV4cGVjdGVkIHJldHVybiBmcm9tICR7TU9CSUxFX0lNQUdFX01PVU5URVJfU0VSVklDRV9OQU1FfSBvbiBzZW5kaW5nIFJlY2VpdmVCeXRlc2A7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZXJyTXNnfTogJHtKU09OLnN0cmluZ2lmeShyZWNlaXZlQnl0ZXNSZXN1bHQpfWApO1xuICAgICAgICB9XG4gICAgICAgIC8vcHVzaCBpbWFnZSB0byBkZXZpY2VcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gY3JlYXRlUmVhZFN0cmVhbShpbWFnZUZpbGVQYXRoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBzdHJlYW0ub24oJ2VuZCcsIHJlc29sdmUpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5vbignZXJyb3InLCByZWplY3QpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5vbignZGF0YScsIGFzeW5jIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9wbGlzdFNlcnZpY2UuX3NvY2tldENsaWVudC53cml0ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHVzaEltYWdlUmVzdWx0ID0gYXdhaXQgdGhpcy5fcGxpc3RTZXJ2aWNlLnJlY2VpdmVQbGlzdCgpO1xuICAgICAgICBpZiAoY2hlY2tJZkVycm9yKHB1c2hJbWFnZVJlc3VsdCkuU3RhdHVzICE9PSAnQ29tcGxldGUnKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJNc2cgPSBgVW5leHBlY3RlZCByZXR1cm4gZnJvbSAke01PQklMRV9JTUFHRV9NT1VOVEVSX1NFUlZJQ0VfTkFNRX0gb24gcHVzaGluZyBpbWFnZSBmaWxlYDtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlcnJNc2d9OiAke0pTT04uc3RyaW5naWZ5KHB1c2hJbWFnZVJlc3VsdCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy9tb3VudCBpbWFnZVxuICAgICAgICBjb25zdCBtb3VudFJlc3VsdCA9IGF3YWl0IHRoaXMuX3BsaXN0U2VydmljZS5zZW5kUGxpc3RBbmRSZWNlaXZlKHtcbiAgICAgICAgICAgIENvbW1hbmQ6ICdNb3VudEltYWdlJyxcbiAgICAgICAgICAgIEltYWdlUGF0aDogJy9wcml2YXRlL3Zhci9tb2JpbGUvTWVkaWEvUHVibGljU3RhZ2luZy9zdGFnaW5nLmRpbWFnJyxcbiAgICAgICAgICAgIEltYWdlU2lnbmF0dXJlOiBzaWduYXR1cmUsXG4gICAgICAgICAgICBJbWFnZVR5cGU6IGltYWdlVHlwZVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG1vdW50UmVzdWx0LkRldGFpbGVkRXJyb3I/LmluY2x1ZGVzKCdpcyBhbHJlYWR5IG1vdW50ZWQgYXQgL0RldmVsb3BlcicpKSB7XG4gICAgICAgICAgICBsb2cuaW5mbygnRGV2ZWxvcGVySW1hZ2Ugd2FzIGFscmVhZHkgbW91bnRlZCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNoZWNrSWZFcnJvcihtb3VudFJlc3VsdCk7XG4gICAgfVxufVxuZXhwb3J0IHsgSW1hZ2VNb3VudGVyLCBNT0JJTEVfSU1BR0VfTU9VTlRFUl9TRVJWSUNFX05BTUUgfTsiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsWUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsUUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsU0FBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksT0FBQSxHQUFBRCxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsTUFBTTtFQUFFSyxLQUFLO0VBQUVDLFFBQVE7RUFBRUM7QUFBaUIsQ0FBQyxHQUFHQyxXQUFFO0FBRWhELE1BQU1DLGlDQUFpQyxHQUFHLHVDQUF1QztBQUFDQyxPQUFBLENBQUFELGlDQUFBLEdBQUFBLGlDQUFBO0FBQ2xGLE1BQU1FLGVBQWUsR0FBRyxPQUFPO0FBQy9CLE1BQU1DLG1CQUFtQixHQUFHLFdBQVc7QUFFdkMsU0FBU0MsWUFBWUEsQ0FBQ0MsR0FBRyxFQUFFO0VBQ3ZCLElBQUlBLEdBQUcsQ0FBQ0MsS0FBSyxFQUFFO0lBQ1gsTUFBTSxJQUFJQSxLQUFLLENBQUNELEdBQUcsQ0FBQ0MsS0FBSyxDQUFDO0VBQzlCO0VBQ0EsT0FBT0QsR0FBRztBQUNkO0FBRUEsZUFBZUUsWUFBWUEsQ0FBQ0MsUUFBUSxFQUFFQyxRQUFRLEVBQUU7RUFFNUMsSUFBSUMsUUFBUTtFQUNaLElBQUk7SUFDQUEsUUFBUSxHQUFHLE1BQU1kLEtBQUssQ0FBQ1ksUUFBUSxDQUFDO0VBQ3BDLENBQUMsQ0FBQyxPQUFPRyxHQUFHLEVBQUU7SUFDVixJQUF5Q0EsR0FBRyxDQUFFQyxJQUFJLEtBQUssUUFBUSxFQUFFO01BQzdELE1BQU0sSUFBSU4sS0FBSyxDQUFFLGdCQUFlRyxRQUFTLHlCQUF3QkQsUUFBUyxFQUFDLENBQUM7SUFDaEY7SUFDQSxNQUFNRyxHQUFHO0VBQ2I7RUFDQSxJQUFJRCxRQUFRLENBQUNHLFdBQVcsQ0FBQyxDQUFDLEVBQUU7SUFDeEIsTUFBTSxJQUFJUCxLQUFLLENBQUUsZ0JBQWVHLFFBQVMsOERBQTZERCxRQUFTLEVBQUMsQ0FBQztFQUNySDtFQUNBLE9BQU9FLFFBQVE7QUFDbkI7QUFFQSxNQUFNSSxZQUFZLFNBQVNDLDZCQUFnQixDQUFDO0VBT3hDLE1BQU1DLE1BQU1BLENBQUNDLFNBQVMsR0FBRyxXQUFXLEVBQUU7SUFDbEMsTUFBTVosR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDYSxhQUFhLENBQUNDLG1CQUFtQixDQUFDO01BQ3JEQyxPQUFPLEVBQUUsYUFBYTtNQUN0QkMsU0FBUyxFQUFFSjtJQUNmLENBQUMsQ0FBQztJQUNGLE9BQU9iLFlBQVksQ0FBQ0MsR0FBRyxDQUFDLENBQUNpQixjQUFjLElBQUksRUFBRTtFQUNqRDtFQUtBLE1BQU1DLHVCQUF1QkEsQ0FBQSxFQUFHO0lBQzVCLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQ1AsTUFBTSxDQUFDLENBQUMsRUFBRVEsTUFBTSxHQUFHLENBQUM7RUFDM0M7RUFRQSxNQUFNQyxLQUFLQSxDQUFDQyxhQUFhLEVBQUVDLHNCQUFzQixFQUFFVixTQUFTLEdBQUcsV0FBVyxFQUFFO0lBQUEsSUFBQVcscUJBQUE7SUFFeEUsTUFBTSxDQUFDQyxhQUFhLENBQUMsR0FBRyxNQUFNQyxpQkFBQyxDQUFDQyxHQUFHLENBQUMsQ0FDaEN4QixZQUFZLENBQUNtQixhQUFhLEVBQUV4QixlQUFlLENBQUMsRUFDNUNLLFlBQVksQ0FBQ29CLHNCQUFzQixFQUFFeEIsbUJBQW1CLENBQUMsQ0FDNUQsQ0FBQztJQUVGLE1BQU02QixTQUFTLEdBQUcsTUFBTW5DLFFBQVEsQ0FBQzhCLHNCQUFzQixDQUFDO0lBQ3hELE1BQU1NLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQ2pCLE1BQU0sQ0FBQ0MsU0FBUyxDQUFDO0lBQ2xELElBQUlnQixhQUFhLENBQUNDLElBQUksQ0FBRUMsZ0JBQWdCLElBQUtILFNBQVMsQ0FBQ0ksTUFBTSxDQUFDRCxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUU7TUFDOUVFLGVBQUcsQ0FBQ0MsSUFBSSxDQUFFLG1DQUFrQ1gsc0JBQXVCLGlDQUFnQyxDQUFDO01BQ3BHO0lBQ0o7SUFFQSxNQUFNWSxTQUFTLEdBQUdWLGFBQWEsQ0FBQ1csSUFBSTtJQUNwQyxNQUFNQyxrQkFBa0IsR0FBRyxNQUFNLElBQUksQ0FBQ3ZCLGFBQWEsQ0FBQ0MsbUJBQW1CLENBQUM7TUFDcEVDLE9BQU8sRUFBRSxjQUFjO01BQ3ZCRSxjQUFjLEVBQUVVLFNBQVM7TUFDekJVLFNBQVMsRUFBRUgsU0FBUztNQUNwQmxCLFNBQVMsRUFBRUo7SUFDZixDQUFDLENBQUM7SUFDRixJQUFJYixZQUFZLENBQUNxQyxrQkFBa0IsQ0FBQyxDQUFDRSxNQUFNLEtBQUssaUJBQWlCLEVBQUU7TUFDL0QsTUFBTUMsTUFBTSxHQUFJLDBCQUF5QjVDLGlDQUFrQywwQkFBeUI7TUFDcEcsTUFBTSxJQUFJTSxLQUFLLENBQUUsR0FBRXNDLE1BQU8sS0FBSUMsSUFBSSxDQUFDQyxTQUFTLENBQUNMLGtCQUFrQixDQUFFLEVBQUMsQ0FBQztJQUN2RTtJQUVBLE1BQU1NLE1BQU0sR0FBR2pELGdCQUFnQixDQUFDNEIsYUFBYSxDQUFDO0lBQzlDLElBQUk7TUFDQSxNQUFNLElBQUlJLGlCQUFDLENBQUMsQ0FBQ2tCLE9BQU8sRUFBRUMsTUFBTSxLQUFLO1FBQzdCRixNQUFNLENBQUNHLEVBQUUsQ0FBQyxLQUFLLEVBQUVGLE9BQU8sQ0FBQztRQUN6QkQsTUFBTSxDQUFDRyxFQUFFLENBQUMsT0FBTyxFQUFFRCxNQUFNLENBQUM7UUFDMUJGLE1BQU0sQ0FBQ0csRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFPQyxJQUFJLElBQUs7VUFDOUIsSUFBSTtZQUNBLE1BQU0sSUFBSSxDQUFDakMsYUFBYSxDQUFDa0MsYUFBYSxDQUFDQyxLQUFLLENBQUNGLElBQUksQ0FBQztVQUN0RCxDQUFDLENBQUMsT0FBT0csQ0FBQyxFQUFFO1lBQ1JQLE1BQU0sQ0FBQ1EsSUFBSSxDQUFDLE9BQU8sRUFBRUQsQ0FBQyxDQUFDO1VBQzNCO1FBQ0osQ0FBQyxDQUFDO01BQ04sQ0FBQyxDQUFDO0lBQ04sQ0FBQyxTQUFTO01BQ05QLE1BQU0sQ0FBQ1MsS0FBSyxDQUFDLENBQUM7SUFDbEI7SUFDQSxNQUFNQyxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUN2QyxhQUFhLENBQUN3QyxZQUFZLENBQUMsQ0FBQztJQUMvRCxJQUFJdEQsWUFBWSxDQUFDcUQsZUFBZSxDQUFDLENBQUNkLE1BQU0sS0FBSyxVQUFVLEVBQUU7TUFDckQsTUFBTUMsTUFBTSxHQUFJLDBCQUF5QjVDLGlDQUFrQyx3QkFBdUI7TUFDbEcsTUFBTSxJQUFJTSxLQUFLLENBQUUsR0FBRXNDLE1BQU8sS0FBSUMsSUFBSSxDQUFDQyxTQUFTLENBQUNXLGVBQWUsQ0FBRSxFQUFDLENBQUM7SUFDcEU7SUFFQSxNQUFNRSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUN6QyxhQUFhLENBQUNDLG1CQUFtQixDQUFDO01BQzdEQyxPQUFPLEVBQUUsWUFBWTtNQUNyQndDLFNBQVMsRUFBRSx1REFBdUQ7TUFDbEV0QyxjQUFjLEVBQUVVLFNBQVM7TUFDekJYLFNBQVMsRUFBRUo7SUFDZixDQUFDLENBQUM7SUFDRixLQUFBVyxxQkFBQSxHQUFJK0IsV0FBVyxDQUFDRSxhQUFhLGNBQUFqQyxxQkFBQSxlQUF6QkEscUJBQUEsQ0FBMkJrQyxRQUFRLENBQUMsa0NBQWtDLENBQUMsRUFBRTtNQUN6RXpCLGVBQUcsQ0FBQ0MsSUFBSSxDQUFDLG9DQUFvQyxDQUFDO01BQzlDO0lBQ0o7SUFDQWxDLFlBQVksQ0FBQ3VELFdBQVcsQ0FBQztFQUM3QjtBQUNKO0FBQUMxRCxPQUFBLENBQUFhLFlBQUEsR0FBQUEsWUFBQSJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["_baseService","require","_support","_bluebird","_interopRequireDefault","_logger","lstat","readFile","createReadStream","fs","MOBILE_IMAGE_MOUNTER_SERVICE_NAME","exports","FILE_TYPE_IMAGE","FILE_TYPE_SIGNATURE","checkIfError","ret","Error","assertIsFile","filePath","fileType","fileStat","err","code","isDirectory","ImageMounter","BaseServicePlist","lookup","imageType","_plistService","sendPlistAndReceive","Command","ImageType","ImageSignature","isDeveloperImageMounted","length","mount","imageFilePath","imageSignatureFilePath","_mountResult$Detailed","imageFileStat","B","all","signature","mountedImages","find","mountedSignature","equals","log","info","imageSize","size","receiveBytesResult","ImageSize","Status","errMsg","JSON","stringify","stream","resolve","reject","on","data","_socketClient","write","e","emit","close","pushImageResult","receivePlist","mountResult","ImagePath","DetailedError","includes"],"sources":["../../../lib/imagemounter/index.js"],"sourcesContent":["import { BaseServicePlist } from '../base-service';\nimport { fs } from '@appium/support';\nimport B from 'bluebird';\nimport log from '../logger';\nconst { lstat, readFile, createReadStream } = fs;\n\nconst MOBILE_IMAGE_MOUNTER_SERVICE_NAME = 'com.apple.mobile.mobile_image_mounter';\nconst FILE_TYPE_IMAGE = 'image';\nconst FILE_TYPE_SIGNATURE = 'signature';\n\nfunction checkIfError(ret) {\n if (ret.Error) {\n throw new Error(ret.Error);\n }\n return ret;\n}\n\nasync function assertIsFile(filePath, fileType) {\n /** @type {import('fs').Stats | undefined} */\n let fileStat;\n try {\n fileStat = await lstat(filePath);\n } catch (err) {\n if (/** @type {NodeJS.ErrnoException} */(err).code === 'ENOENT') {\n throw new Error(`The provided ${fileType} path does not exist: ${filePath}`);\n }\n throw err;\n }\n if (fileStat.isDirectory()) {\n throw new Error(`The provided ${fileType} path is expected to be a file, but a directory was given: ${filePath}`);\n }\n return fileStat;\n}\n\nclass ImageMounter extends BaseServicePlist {\n\n /**\n * Lookup for mounted images.\n * @param {string} imageType Type of image, `Developer` by default.\n * @returns {Promise<Buffer[]>} Signature of each mounted image.\n */\n async lookup(imageType = 'Developer') {\n const ret = await this._plistService.sendPlistAndReceive({\n Command: 'LookupImage',\n ImageType: imageType\n });\n return checkIfError(ret).ImageSignature || [];\n }\n\n /**\n * Check if developer image is mounted.\n */\n async isDeveloperImageMounted() {\n return (await this.lookup()).length > 0;\n }\n\n /**\n * Mount image for device.\n * @param {string} imageFilePath The file path of image.\n * @param {string} imageSignatureFilePath The signature file path of given `DeveloperDiskImage.dmg`\n * @param {string} imageType Type of image, `Developer` by default.\n */\n async mount(imageFilePath, imageSignatureFilePath, imageType = 'Developer') {\n //check file stats\n const [imageFileStat] = await B.all([\n assertIsFile(imageFilePath, FILE_TYPE_IMAGE),\n assertIsFile(imageSignatureFilePath, FILE_TYPE_SIGNATURE)\n ]);\n //read signature\n const signature = await readFile(imageSignatureFilePath);\n const mountedImages = await this.lookup(imageType);\n if (mountedImages.find((mountedSignature) => signature.equals(mountedSignature))) {\n log.info(`An image with same signature of ${imageSignatureFilePath} is mounted. Doing nothing here`);\n return;\n }\n //notify device\n const imageSize = imageFileStat.size;\n const receiveBytesResult = await this._plistService.sendPlistAndReceive({\n Command: 'ReceiveBytes',\n ImageSignature: signature,\n ImageSize: imageSize,\n ImageType: imageType\n });\n if (checkIfError(receiveBytesResult).Status !== 'ReceiveBytesAck') {\n const errMsg = `Unexpected return from ${MOBILE_IMAGE_MOUNTER_SERVICE_NAME} on sending ReceiveBytes`;\n throw new Error(`${errMsg}: ${JSON.stringify(receiveBytesResult)}`);\n }\n //push image to device\n const stream = createReadStream(imageFilePath);\n try {\n await new B((resolve, reject) => {\n stream.on('end', resolve);\n stream.on('error', reject);\n stream.on('data', async (data) => {\n try {\n await this._plistService._socketClient.write(data);\n } catch (e) {\n stream.emit('error', e);\n }\n });\n });\n } finally {\n stream.close();\n }\n const pushImageResult = await this._plistService.receivePlist();\n if (checkIfError(pushImageResult).Status !== 'Complete') {\n const errMsg = `Unexpected return from ${MOBILE_IMAGE_MOUNTER_SERVICE_NAME} on pushing image file`;\n throw new Error(`${errMsg}: ${JSON.stringify(pushImageResult)}`);\n }\n //mount image\n const mountResult = await this._plistService.sendPlistAndReceive({\n Command: 'MountImage',\n ImagePath: '/private/var/mobile/Media/PublicStaging/staging.dimag',\n ImageSignature: signature,\n ImageType: imageType\n });\n if (mountResult.DetailedError?.includes('is already mounted at /Developer')) {\n log.info('DeveloperImage was already mounted');\n return;\n }\n checkIfError(mountResult);\n }\n}\nexport { ImageMounter, MOBILE_IMAGE_MOUNTER_SERVICE_NAME };"],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.findDeveloperImage = findDeveloperImage;
|
|
8
|
+
require("source-map-support/register");
|
|
9
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
10
|
+
var _support = require("@appium/support");
|
|
11
|
+
var _path = require("path");
|
|
12
|
+
var _axios = _interopRequireDefault(require("axios"));
|
|
13
|
+
var _logger = _interopRequireDefault(require("../../logger"));
|
|
14
|
+
const {
|
|
15
|
+
exists,
|
|
16
|
+
readdir,
|
|
17
|
+
mkdir,
|
|
18
|
+
rimraf
|
|
19
|
+
} = _support.fs;
|
|
20
|
+
const DEFAULT_IMAGE_DIR_NAME = 'iOSDeviceSupport';
|
|
21
|
+
const DEVELOPER_IMAGE_FILE_NAME = 'DeveloperDiskImage.dmg';
|
|
22
|
+
const DEVELOPER_IMAGE_SIGNATURE_FILE_NAME = 'DeveloperDiskImage.dmg.signature';
|
|
23
|
+
async function listGithubImageList(githubImageOption) {
|
|
24
|
+
const {
|
|
25
|
+
githubRepo,
|
|
26
|
+
subFolderList = [],
|
|
27
|
+
branch = 'master'
|
|
28
|
+
} = githubImageOption;
|
|
29
|
+
const initialUrl = `https://api.github.com/repos/${githubRepo}/git/trees/${branch}`;
|
|
30
|
+
const repoUrl = `https://github.com/${githubRepo}/`;
|
|
31
|
+
const fileList = [];
|
|
32
|
+
let curUrl = initialUrl;
|
|
33
|
+
for (let i = 0; i <= subFolderList.length; i++) {
|
|
34
|
+
const res = await _axios.default.get(curUrl);
|
|
35
|
+
const body = res.data;
|
|
36
|
+
const treeList = body === null || body === void 0 ? void 0 : body.tree;
|
|
37
|
+
if (!treeList) {
|
|
38
|
+
throw new Error(`Failed on looking up ${fileList.join('/')} under ${repoUrl}: ${JSON.stringify(body)}`);
|
|
39
|
+
}
|
|
40
|
+
if (i === subFolderList.length) {
|
|
41
|
+
return treeList;
|
|
42
|
+
}
|
|
43
|
+
const entry = subFolderList[i];
|
|
44
|
+
const nextItem = _lodash.default.find(treeList, item => item.path === entry);
|
|
45
|
+
if (!nextItem) {
|
|
46
|
+
const errMsg = `Unable to find ${entry} under ${fileList.join('/')} in ${repoUrl}`;
|
|
47
|
+
throw new Error(`${errMsg}: ${JSON.stringify(treeList)}`);
|
|
48
|
+
}
|
|
49
|
+
if (nextItem.type !== 'tree') {
|
|
50
|
+
const errMsg = `${entry} under ${fileList.join('/')} in ${repoUrl} is expected to be a tree`;
|
|
51
|
+
throw new Error(`${errMsg}, got ${nextItem.type} instead.`);
|
|
52
|
+
}
|
|
53
|
+
fileList.push(entry);
|
|
54
|
+
curUrl = nextItem.url;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async function findDeveloperImageFromDirectory(entry) {
|
|
58
|
+
const fileList = await readdir(entry, {
|
|
59
|
+
withFileTypes: true
|
|
60
|
+
});
|
|
61
|
+
for (const subEntry of fileList) {
|
|
62
|
+
if (subEntry.name === DEVELOPER_IMAGE_FILE_NAME && subEntry.isFile()) {
|
|
63
|
+
return entry;
|
|
64
|
+
}
|
|
65
|
+
if (subEntry.isDirectory()) {
|
|
66
|
+
const fullPath = (0, _path.join)(entry, subEntry.name);
|
|
67
|
+
const subFolderResult = await findDeveloperImageFromDirectory(fullPath);
|
|
68
|
+
if (subFolderResult) {
|
|
69
|
+
return subFolderResult;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async function findDeveloperImage(version, githubImageOption) {
|
|
75
|
+
const finalVersion = version.split('.').splice(0, 2).join('.');
|
|
76
|
+
const fileName = `${finalVersion}.zip`;
|
|
77
|
+
const DEFAULT_IMAGE_DIR = (0, _path.join)(await _support.env.resolveAppiumHome(), DEFAULT_IMAGE_DIR_NAME);
|
|
78
|
+
const fullDownloadPath = (0, _path.join)(DEFAULT_IMAGE_DIR, fileName);
|
|
79
|
+
if (!(await exists(DEFAULT_IMAGE_DIR))) {
|
|
80
|
+
await mkdir(DEFAULT_IMAGE_DIR, {
|
|
81
|
+
recursive: true
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
if (!(await exists(fullDownloadPath))) {
|
|
85
|
+
await searchAndDownloadDeveloperImageFromGithub(finalVersion, fullDownloadPath, githubImageOption);
|
|
86
|
+
}
|
|
87
|
+
const decompressPath = (0, _path.join)(DEFAULT_IMAGE_DIR, finalVersion);
|
|
88
|
+
let developerImageParentFolder;
|
|
89
|
+
if (await exists(decompressPath)) {
|
|
90
|
+
developerImageParentFolder = await findDeveloperImageFromDirectory(decompressPath);
|
|
91
|
+
}
|
|
92
|
+
if (!developerImageParentFolder) {
|
|
93
|
+
await _support.zip.extractAllTo(fullDownloadPath, decompressPath);
|
|
94
|
+
developerImageParentFolder = await findDeveloperImageFromDirectory(decompressPath);
|
|
95
|
+
}
|
|
96
|
+
if (!developerImageParentFolder) {
|
|
97
|
+
throw new Error(`Unable to find unzipped developer image in ${decompressPath}`);
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
developerImage: (0, _path.join)(developerImageParentFolder, DEVELOPER_IMAGE_FILE_NAME),
|
|
101
|
+
developerImageSignature: (0, _path.join)(developerImageParentFolder, DEVELOPER_IMAGE_SIGNATURE_FILE_NAME)
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
async function searchAndDownloadDeveloperImageFromGithub(finalVersion, fullDownloadPath, githubImageOption) {
|
|
105
|
+
const fileNameRegExp = new RegExp(`${_lodash.default.escapeRegExp(finalVersion)}(\\(([\\w_|.()])+\\))?.zip`);
|
|
106
|
+
const {
|
|
107
|
+
githubRepo,
|
|
108
|
+
subFolderList = [],
|
|
109
|
+
branch = 'master'
|
|
110
|
+
} = githubImageOption;
|
|
111
|
+
let fileUrl;
|
|
112
|
+
const fileList = await listGithubImageList(githubImageOption);
|
|
113
|
+
if (!fileList) {
|
|
114
|
+
throw new Error(`Failed to list https://github.com/${githubRepo}`);
|
|
115
|
+
;
|
|
116
|
+
}
|
|
117
|
+
const targetFile = _lodash.default.find(fileList, item => fileNameRegExp.test(item.path));
|
|
118
|
+
const splitter = subFolderList.length > 0 ? '/' : '';
|
|
119
|
+
const subFolderPath = `${splitter}${subFolderList.join('/')}${splitter}`;
|
|
120
|
+
if (targetFile) {
|
|
121
|
+
fileUrl = `https://raw.githubusercontent.com/${githubRepo}/${branch}${subFolderPath}${targetFile.path}`;
|
|
122
|
+
}
|
|
123
|
+
if (!fileUrl) {
|
|
124
|
+
throw new Error(`Failed to get developer image for iOS ${finalVersion}`);
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
_logger.default.info(`Downloading developer image for ${finalVersion} to ${fullDownloadPath} from ${fileUrl}`);
|
|
128
|
+
await _support.net.downloadFile(fileUrl, fullDownloadPath);
|
|
129
|
+
} catch (e) {
|
|
130
|
+
await rimraf(fullDownloadPath);
|
|
131
|
+
throw e;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfc3VwcG9ydCIsIl9wYXRoIiwiX2F4aW9zIiwiX2xvZ2dlciIsImV4aXN0cyIsInJlYWRkaXIiLCJta2RpciIsInJpbXJhZiIsImZzIiwiREVGQVVMVF9JTUFHRV9ESVJfTkFNRSIsIkRFVkVMT1BFUl9JTUFHRV9GSUxFX05BTUUiLCJERVZFTE9QRVJfSU1BR0VfU0lHTkFUVVJFX0ZJTEVfTkFNRSIsImxpc3RHaXRodWJJbWFnZUxpc3QiLCJnaXRodWJJbWFnZU9wdGlvbiIsImdpdGh1YlJlcG8iLCJzdWJGb2xkZXJMaXN0IiwiYnJhbmNoIiwiaW5pdGlhbFVybCIsInJlcG9VcmwiLCJmaWxlTGlzdCIsImN1clVybCIsImkiLCJsZW5ndGgiLCJyZXMiLCJheGlvcyIsImdldCIsImJvZHkiLCJkYXRhIiwidHJlZUxpc3QiLCJ0cmVlIiwiRXJyb3IiLCJqb2luIiwiSlNPTiIsInN0cmluZ2lmeSIsImVudHJ5IiwibmV4dEl0ZW0iLCJfIiwiZmluZCIsIml0ZW0iLCJwYXRoIiwiZXJyTXNnIiwidHlwZSIsInB1c2giLCJ1cmwiLCJmaW5kRGV2ZWxvcGVySW1hZ2VGcm9tRGlyZWN0b3J5Iiwid2l0aEZpbGVUeXBlcyIsInN1YkVudHJ5IiwibmFtZSIsImlzRmlsZSIsImlzRGlyZWN0b3J5IiwiZnVsbFBhdGgiLCJqb2luUGF0aCIsInN1YkZvbGRlclJlc3VsdCIsImZpbmREZXZlbG9wZXJJbWFnZSIsInZlcnNpb24iLCJmaW5hbFZlcnNpb24iLCJzcGxpdCIsInNwbGljZSIsImZpbGVOYW1lIiwiREVGQVVMVF9JTUFHRV9ESVIiLCJlbnYiLCJyZXNvbHZlQXBwaXVtSG9tZSIsImZ1bGxEb3dubG9hZFBhdGgiLCJyZWN1cnNpdmUiLCJzZWFyY2hBbmREb3dubG9hZERldmVsb3BlckltYWdlRnJvbUdpdGh1YiIsImRlY29tcHJlc3NQYXRoIiwiZGV2ZWxvcGVySW1hZ2VQYXJlbnRGb2xkZXIiLCJ6aXAiLCJleHRyYWN0QWxsVG8iLCJkZXZlbG9wZXJJbWFnZSIsImRldmVsb3BlckltYWdlU2lnbmF0dXJlIiwiZmlsZU5hbWVSZWdFeHAiLCJSZWdFeHAiLCJlc2NhcGVSZWdFeHAiLCJmaWxlVXJsIiwidGFyZ2V0RmlsZSIsInRlc3QiLCJzcGxpdHRlciIsInN1YkZvbGRlclBhdGgiLCJsb2ciLCJpbmZvIiwibmV0IiwiZG93bmxvYWRGaWxlIiwiZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9pbWFnZW1vdW50ZXIvdXRpbHMvbGlzdF9kZXZlbG9wZXJfaW1hZ2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHppcCwgbmV0LCBlbnYsIGZzIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IGpvaW4gYXMgam9pblBhdGggfSBmcm9tICdwYXRoJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgbG9nIGZyb20gJy4uLy4uL2xvZ2dlcic7XG5cbmNvbnN0IHsgZXhpc3RzLCByZWFkZGlyLCBta2RpciwgcmltcmFmIH0gPSBmcztcbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR2l0aHViVHJlZU9iamVjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGhcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2RlXG4gKiBAcHJvcGVydHkgeydibG9iJyB8ICd0cmVlJ30gdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNoYVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNpemVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmxcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEdpdGh1YlRyZWVSZXNwb25zZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNoYVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHVybFxuICogQHByb3BlcnR5IHtHaXRodWJUcmVlT2JqZWN0W119IFt0cmVlXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbdHJ1bmNhdGVkXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtub2RlX2lkXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtzaXplXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb250ZW50XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtiYXNlNjRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbWFnZUZyb21HaXRodWJSZXBvIE9wdGlvbiB0byBpbmRpY2F0ZSB3aGljaCBnaXRodWIgcmVwbyBhbmQgc3ViZm9sZGVyIHRvIHVzZSB0byBzZWFyY2ggZGV2ZWxvcGVyXG4gKiBpbWFnZS4gVGhlIGltYWdlIGFuZCBzaWduYXR1cmUgZmlsZXMgc2hvdWxkIGJlIGNvbXByZXNzZWQgaW50byBhIHppcCBmb3JtYXQsIGFuZCB0aGUgZmlsZW5hbWUgc2hvdWxkIG1hdGNoIHRoaXNcbiAqIHJlZ3VsYXIgZXhwcmVzc2lvbjogYCR7ZmluYWxWZXJzaW9ufShcXFxcKChbXFxcXHdffC4oKV0pK1xcXFwpKT8uemlwYFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGdpdGh1YlJlcG8gVGhpcyBzaG91bGQgYmUgaW4gZm9ybWF0IG9mIGAkKGdyb3VwIG9yIHVzZXJuYW1lKS8ke3JlcG9zaXRvcnl9YCwgd2hpY2ggY29udGFpbnNcbiAqIGF2YWlsYWJsZSBpbWFnZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYnJhbmNoXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbc3ViRm9sZGVyTGlzdF0gc3ViZm9sZGVyIGxpc3QgaW4gbGV2ZWwgb3JkZXJcbiAqL1xuY29uc3QgREVGQVVMVF9JTUFHRV9ESVJfTkFNRSA9ICdpT1NEZXZpY2VTdXBwb3J0JztcbmNvbnN0IERFVkVMT1BFUl9JTUFHRV9GSUxFX05BTUUgPSAnRGV2ZWxvcGVyRGlza0ltYWdlLmRtZyc7XG5jb25zdCBERVZFTE9QRVJfSU1BR0VfU0lHTkFUVVJFX0ZJTEVfTkFNRSA9ICdEZXZlbG9wZXJEaXNrSW1hZ2UuZG1nLnNpZ25hdHVyZSc7XG5cbi8qKlxuICogVXNlIGxpc3QgYXBpIHRvIHJldHVybiB0aGUgZmlsZSBsaXN0IG9mIGZvbGRlci5cbiAqIEBwYXJhbSB7SW1hZ2VGcm9tR2l0aHViUmVwb30gZ2l0aHViSW1hZ2VPcHRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlPEdpdGh1YlRyZWVPYmplY3RbXSB8IHVuZGVmaW5lZD59IGZpbGUgbGlzdCB1bmRlciB0YXJnZXQgZm9sZGVyXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxpc3RHaXRodWJJbWFnZUxpc3QoZ2l0aHViSW1hZ2VPcHRpb24pIHtcbiAgICBjb25zdCB7IGdpdGh1YlJlcG8sIHN1YkZvbGRlckxpc3QgPSBbXSwgYnJhbmNoID0gJ21hc3RlcicgfSA9IGdpdGh1YkltYWdlT3B0aW9uO1xuICAgIGNvbnN0IGluaXRpYWxVcmwgPSBgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8ke2dpdGh1YlJlcG99L2dpdC90cmVlcy8ke2JyYW5jaH1gO1xuICAgIGNvbnN0IHJlcG9VcmwgPSBgaHR0cHM6Ly9naXRodWIuY29tLyR7Z2l0aHViUmVwb30vYDtcbiAgICBjb25zdCBmaWxlTGlzdCA9IFtdO1xuICAgIGxldCBjdXJVcmwgPSBpbml0aWFsVXJsO1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtHaXRodWJUcmVlT2JqZWN0W10gfCB1bmRlZmluZWR9XG4gICAgICovXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gc3ViRm9sZGVyTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBheGlvcy5nZXQoY3VyVXJsKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtHaXRodWJUcmVlUmVzcG9uc2V9XG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBib2R5ID0gcmVzLmRhdGE7XG4gICAgICAgIGNvbnN0IHRyZWVMaXN0ID0gYm9keT8udHJlZTtcbiAgICAgICAgaWYgKCF0cmVlTGlzdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgb24gbG9va2luZyB1cCAke2ZpbGVMaXN0LmpvaW4oJy8nKX0gdW5kZXIgJHtyZXBvVXJsfTogJHtKU09OLnN0cmluZ2lmeShib2R5KX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA9PT0gc3ViRm9sZGVyTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmVlTGlzdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRyeSA9IHN1YkZvbGRlckxpc3RbaV07XG4gICAgICAgIGNvbnN0IG5leHRJdGVtID0gXy5maW5kKHRyZWVMaXN0LCAoaXRlbSkgPT4gaXRlbS5wYXRoID09PSBlbnRyeSk7XG4gICAgICAgIGlmICghbmV4dEl0ZW0pIHtcbiAgICAgICAgICAgIGNvbnN0IGVyck1zZyA9IGBVbmFibGUgdG8gZmluZCAke2VudHJ5fSB1bmRlciAke2ZpbGVMaXN0LmpvaW4oJy8nKX0gaW4gJHtyZXBvVXJsfWA7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZXJyTXNnfTogJHtKU09OLnN0cmluZ2lmeSh0cmVlTGlzdCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5leHRJdGVtLnR5cGUgIT09ICd0cmVlJykge1xuICAgICAgICAgICAgY29uc3QgZXJyTXNnID0gYCR7ZW50cnl9IHVuZGVyICR7ZmlsZUxpc3Quam9pbignLycpfSBpbiAke3JlcG9Vcmx9IGlzIGV4cGVjdGVkIHRvIGJlIGEgdHJlZWA7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZXJyTXNnfSwgZ290ICR7bmV4dEl0ZW0udHlwZX0gaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBmaWxlTGlzdC5wdXNoKGVudHJ5KTtcbiAgICAgICAgY3VyVXJsID0gbmV4dEl0ZW0udXJsO1xuICAgIH1cbn1cblxuLyoqXG4gKiBGaW5kIGBEZXZlbG9wZXJEaXNrSW1hZ2UuZG1nYCByZWN1cnNpdmVseSB1bmRlciBmb2xkZXIgYW5kIHN1YmZvbGRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBlbnRyeSBjdXJyZW50IGZvbGRlclxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPn0gcGFyZW50IGZvbGRlciBvZiBgRGV2ZWxvcGVyRGlza0ltYWdlLmRtZ2AsXG4gKiAgb3IgYHVuZGVmaW5lZGAgaWYgbm8gc3VjaCBmaWxlIGV4aXN0c1xuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kRGV2ZWxvcGVySW1hZ2VGcm9tRGlyZWN0b3J5KGVudHJ5KSB7XG4gICAgY29uc3QgZmlsZUxpc3QgPSBhd2FpdCByZWFkZGlyKGVudHJ5LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBzdWJFbnRyeSBvZiBmaWxlTGlzdCkge1xuICAgICAgICBpZiAoc3ViRW50cnkubmFtZSA9PT0gREVWRUxPUEVSX0lNQUdFX0ZJTEVfTkFNRSAmJiBzdWJFbnRyeS5pc0ZpbGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdWJFbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICBjb25zdCBmdWxsUGF0aCA9IGpvaW5QYXRoKGVudHJ5LCBzdWJFbnRyeS5uYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHN1YkZvbGRlclJlc3VsdCA9IGF3YWl0IGZpbmREZXZlbG9wZXJJbWFnZUZyb21EaXJlY3RvcnkoZnVsbFBhdGgpO1xuICAgICAgICAgICAgaWYgKHN1YkZvbGRlclJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdWJGb2xkZXJSZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW1hZ2VQYXRoXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGV2ZWxvcGVySW1hZ2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXZlbG9wZXJJbWFnZVNpZ25hdHVyZVxuICovXG5cbi8qKlxuICogRmluZCBkZXZlbG9wZXIgaW1hZ2UgZm9yIGNlcnRhaW4gdmVyc2lvbi4gSWYgZGV2ZWxvcGVyIGltYWdlIGRvZXMgbm90IGV4aXN0cyxcbiAqIHRoaXMgd2lsbCB0cnkgdG8gZmluZCBhbmQgZG93bmxvYWQgZGV2ZWxvcGVyIGltYWdlLCB1bnppcCB0byBgJHtBUFBJVU1fSE9NRX0vaU9TU3VwcG9ydC9gXG4gKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiBmdWxsIHZlcnNpb24gb2YgaU9TIGRldmljZS4gVGhlIGZpcnN0IHR3byBwYXJ0cyBvZiB2ZXJzaW9uXG4gKiB3aWxsIGJlIHByZXNlcnZlZCB3aGVuIHNlbmRpbmcgdGhlIHJlcXVlc3QsIGUuZy4gYDE0LjcuMWAgd2lsbCBiZSBjaGFuZ2VkIHRvIGAxNC43YFxuICogQHBhcmFtIHtJbWFnZUZyb21HaXRodWJSZXBvfSBnaXRodWJJbWFnZU9wdGlvblxuICogQHJldHVybnMge1Byb21pc2U8SW1hZ2VQYXRoPn1cbiAqIEB0aHJvd3MgSWYgZGV2ZWxvcGVyIGltYWdlIGlzIG5vdCBmb3VuZCwgb3IgZXJyb3Igd2hpbGUgZG93bmxvYWRpbmcgb3IgdW56aXBwaW5nLlxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kRGV2ZWxvcGVySW1hZ2UodmVyc2lvbiwgZ2l0aHViSW1hZ2VPcHRpb24pIHtcbiAgICBjb25zdCBmaW5hbFZlcnNpb24gPSB2ZXJzaW9uLnNwbGl0KCcuJykuc3BsaWNlKDAsIDIpLmpvaW4oJy4nKTtcbiAgICBjb25zdCBmaWxlTmFtZSA9IGAke2ZpbmFsVmVyc2lvbn0uemlwYDtcbiAgICBjb25zdCBERUZBVUxUX0lNQUdFX0RJUiA9IGpvaW5QYXRoKGF3YWl0IGVudi5yZXNvbHZlQXBwaXVtSG9tZSgpLCBERUZBVUxUX0lNQUdFX0RJUl9OQU1FKTtcbiAgICBjb25zdCBmdWxsRG93bmxvYWRQYXRoID0gam9pblBhdGgoREVGQVVMVF9JTUFHRV9ESVIsIGZpbGVOYW1lKTtcbiAgICBpZiAoIWF3YWl0IGV4aXN0cyhERUZBVUxUX0lNQUdFX0RJUikpIHtcbiAgICAgICAgYXdhaXQgbWtkaXIoREVGQVVMVF9JTUFHRV9ESVIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cbiAgICBpZiAoIWF3YWl0IGV4aXN0cyhmdWxsRG93bmxvYWRQYXRoKSkge1xuICAgICAgICBhd2FpdCBzZWFyY2hBbmREb3dubG9hZERldmVsb3BlckltYWdlRnJvbUdpdGh1YihmaW5hbFZlcnNpb24sIGZ1bGxEb3dubG9hZFBhdGgsIGdpdGh1YkltYWdlT3B0aW9uKTtcbiAgICB9XG4gICAgY29uc3QgZGVjb21wcmVzc1BhdGggPSBqb2luUGF0aChERUZBVUxUX0lNQUdFX0RJUiwgZmluYWxWZXJzaW9uKTtcbiAgICAvKiogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgZGV2ZWxvcGVySW1hZ2VQYXJlbnRGb2xkZXI7XG4gICAgaWYgKGF3YWl0IGV4aXN0cyhkZWNvbXByZXNzUGF0aCkpIHtcbiAgICAgICAgZGV2ZWxvcGVySW1hZ2VQYXJlbnRGb2xkZXIgPSBhd2FpdCBmaW5kRGV2ZWxvcGVySW1hZ2VGcm9tRGlyZWN0b3J5KGRlY29tcHJlc3NQYXRoKTtcbiAgICB9XG4gICAgaWYgKCFkZXZlbG9wZXJJbWFnZVBhcmVudEZvbGRlcikge1xuICAgICAgICBhd2FpdCB6aXAuZXh0cmFjdEFsbFRvKGZ1bGxEb3dubG9hZFBhdGgsIGRlY29tcHJlc3NQYXRoKTtcbiAgICAgICAgZGV2ZWxvcGVySW1hZ2VQYXJlbnRGb2xkZXIgPSBhd2FpdCBmaW5kRGV2ZWxvcGVySW1hZ2VGcm9tRGlyZWN0b3J5KGRlY29tcHJlc3NQYXRoKTtcbiAgICB9XG4gICAgaWYgKCFkZXZlbG9wZXJJbWFnZVBhcmVudEZvbGRlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBmaW5kIHVuemlwcGVkIGRldmVsb3BlciBpbWFnZSBpbiAke2RlY29tcHJlc3NQYXRofWApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBkZXZlbG9wZXJJbWFnZTogam9pblBhdGgoZGV2ZWxvcGVySW1hZ2VQYXJlbnRGb2xkZXIsIERFVkVMT1BFUl9JTUFHRV9GSUxFX05BTUUpLFxuICAgICAgICBkZXZlbG9wZXJJbWFnZVNpZ25hdHVyZTogam9pblBhdGgoZGV2ZWxvcGVySW1hZ2VQYXJlbnRGb2xkZXIsIERFVkVMT1BFUl9JTUFHRV9TSUdOQVRVUkVfRklMRV9OQU1FKVxuICAgIH07XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaW5hbFZlcnNpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBmdWxsRG93bmxvYWRQYXRoXG4gKiBAcGFyYW0ge0ltYWdlRnJvbUdpdGh1YlJlcG99IGdpdGh1YkltYWdlT3B0aW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNlYXJjaEFuZERvd25sb2FkRGV2ZWxvcGVySW1hZ2VGcm9tR2l0aHViKGZpbmFsVmVyc2lvbiwgZnVsbERvd25sb2FkUGF0aCwgZ2l0aHViSW1hZ2VPcHRpb24pIHtcbiAgICBjb25zdCBmaWxlTmFtZVJlZ0V4cCA9IG5ldyBSZWdFeHAoYCR7Xy5lc2NhcGVSZWdFeHAoZmluYWxWZXJzaW9uKX0oXFxcXCgoW1xcXFx3X3wuKCldKStcXFxcKSk/LnppcGApO1xuICAgIGNvbnN0IHsgZ2l0aHViUmVwbywgc3ViRm9sZGVyTGlzdCA9IFtdLCBicmFuY2ggPSAnbWFzdGVyJyB9ID0gZ2l0aHViSW1hZ2VPcHRpb247XG4gICAgLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IGZpbGVVcmw7XG4gICAgY29uc3QgZmlsZUxpc3QgPSBhd2FpdCBsaXN0R2l0aHViSW1hZ2VMaXN0KGdpdGh1YkltYWdlT3B0aW9uKTtcbiAgICBpZiAoIWZpbGVMaXN0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxpc3QgaHR0cHM6Ly9naXRodWIuY29tLyR7Z2l0aHViUmVwb31gKTs7XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldEZpbGUgPSBfLmZpbmQoZmlsZUxpc3QsIChpdGVtKSA9PiBmaWxlTmFtZVJlZ0V4cC50ZXN0KGl0ZW0ucGF0aCkpO1xuICAgIGNvbnN0IHNwbGl0dGVyID0gc3ViRm9sZGVyTGlzdC5sZW5ndGggPiAwID8gJy8nIDogJyc7XG4gICAgY29uc3Qgc3ViRm9sZGVyUGF0aCA9IGAke3NwbGl0dGVyfSR7c3ViRm9sZGVyTGlzdC5qb2luKCcvJyl9JHtzcGxpdHRlcn1gO1xuICAgIGlmICh0YXJnZXRGaWxlKSB7XG4gICAgICAgIGZpbGVVcmwgPSBgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLyR7Z2l0aHViUmVwb30vJHticmFuY2h9JHtzdWJGb2xkZXJQYXRofSR7dGFyZ2V0RmlsZS5wYXRofWA7XG4gICAgfVxuICAgIGlmICghZmlsZVVybCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBnZXQgZGV2ZWxvcGVyIGltYWdlIGZvciBpT1MgJHtmaW5hbFZlcnNpb259YCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGxvZy5pbmZvKGBEb3dubG9hZGluZyBkZXZlbG9wZXIgaW1hZ2UgZm9yICR7ZmluYWxWZXJzaW9ufSB0byAke2Z1bGxEb3dubG9hZFBhdGh9IGZyb20gJHtmaWxlVXJsfWApO1xuICAgICAgICBhd2FpdCBuZXQuZG93bmxvYWRGaWxlKGZpbGVVcmwsIGZ1bGxEb3dubG9hZFBhdGgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgYXdhaXQgcmltcmFmKGZ1bGxEb3dubG9hZFBhdGgpO1xuICAgICAgICB0aHJvdyBlO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgZmluZERldmVsb3BlckltYWdlIH07Il0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFFBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLEtBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLE1BQUEsR0FBQUos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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list_developer_image.js","names":["_lodash","_interopRequireDefault","require","_support","_path","_axios","_logger","exists","readdir","mkdir","rimraf","fs","DEFAULT_IMAGE_DIR_NAME","DEVELOPER_IMAGE_FILE_NAME","DEVELOPER_IMAGE_SIGNATURE_FILE_NAME","listGithubImageList","githubImageOption","githubRepo","subFolderList","branch","initialUrl","repoUrl","fileList","curUrl","i","length","res","axios","get","body","data","treeList","tree","Error","join","JSON","stringify","entry","nextItem","_","find","item","path","errMsg","type","push","url","findDeveloperImageFromDirectory","withFileTypes","subEntry","name","isFile","isDirectory","fullPath","joinPath","subFolderResult","findDeveloperImage","version","finalVersion","split","splice","fileName","DEFAULT_IMAGE_DIR","env","resolveAppiumHome","fullDownloadPath","recursive","searchAndDownloadDeveloperImageFromGithub","decompressPath","developerImageParentFolder","zip","extractAllTo","developerImage","developerImageSignature","fileNameRegExp","RegExp","escapeRegExp","fileUrl","targetFile","test","splitter","subFolderPath","log","info","net","downloadFile","e"],"sources":["../../../../lib/imagemounter/utils/list_developer_image.js"],"sourcesContent":["import _ from 'lodash';\nimport { zip, net, env, fs } from '@appium/support';\nimport { join as joinPath } from 'path';\nimport axios from 'axios';\nimport log from '../../logger';\n\nconst { exists, readdir, mkdir, rimraf } = fs;\n/**\n * @typedef {Object} GithubTreeObject\n * @property {string} path\n * @property {string} mode\n * @property {'blob' | 'tree'} type\n * @property {string} sha\n * @property {number} size\n * @property {string} url\n */\n\n/**\n * @typedef {Object} GithubTreeResponse\n * @property {string} sha\n * @property {string} url\n * @property {GithubTreeObject[]} [tree]\n * @property {boolean} [truncated]\n * @property {string} [node_id]\n * @property {number} [size]\n * @property {string} [content]\n * @property {string} [base64]\n */\n\n/**\n * @typedef {Object} ImageFromGithubRepo Option to indicate which github repo and subfolder to use to search developer\n * image. The image and signature files should be compressed into a zip format, and the filename should match this\n * regular expression: `${finalVersion}(\\\\(([\\\\w_|.()])+\\\\))?.zip`\n * @property {string} githubRepo This should be in format of `$(group or username)/${repository}`, which contains\n * available images.\n * @property {string} branch\n * @property {string[]} [subFolderList] subfolder list in level order\n */\nconst DEFAULT_IMAGE_DIR_NAME = 'iOSDeviceSupport';\nconst DEVELOPER_IMAGE_FILE_NAME = 'DeveloperDiskImage.dmg';\nconst DEVELOPER_IMAGE_SIGNATURE_FILE_NAME = 'DeveloperDiskImage.dmg.signature';\n\n/**\n * Use list api to return the file list of folder.\n * @param {ImageFromGithubRepo} githubImageOption\n * @returns {Promise<GithubTreeObject[] | undefined>} file list under target folder\n */\nasync function listGithubImageList(githubImageOption) {\n const { githubRepo, subFolderList = [], branch = 'master' } = githubImageOption;\n const initialUrl = `https://api.github.com/repos/${githubRepo}/git/trees/${branch}`;\n const repoUrl = `https://github.com/${githubRepo}/`;\n const fileList = [];\n let curUrl = initialUrl;\n /**\n * @type {GithubTreeObject[] | undefined}\n */\n for (let i = 0; i <= subFolderList.length; i++) {\n const res = await axios.get(curUrl);\n /**\n * @type {GithubTreeResponse}\n */\n const body = res.data;\n const treeList = body?.tree;\n if (!treeList) {\n throw new Error(`Failed on looking up ${fileList.join('/')} under ${repoUrl}: ${JSON.stringify(body)}`);\n }\n if (i === subFolderList.length) {\n return treeList;\n }\n const entry = subFolderList[i];\n const nextItem = _.find(treeList, (item) => item.path === entry);\n if (!nextItem) {\n const errMsg = `Unable to find ${entry} under ${fileList.join('/')} in ${repoUrl}`;\n throw new Error(`${errMsg}: ${JSON.stringify(treeList)}`);\n }\n if (nextItem.type !== 'tree') {\n const errMsg = `${entry} under ${fileList.join('/')} in ${repoUrl} is expected to be a tree`;\n throw new Error(`${errMsg}, got ${nextItem.type} instead.`);\n }\n fileList.push(entry);\n curUrl = nextItem.url;\n }\n}\n\n/**\n * Find `DeveloperDiskImage.dmg` recursively under folder and subfolder.\n * @param {string} entry current folder\n * @returns {Promise<string | undefined>} parent folder of `DeveloperDiskImage.dmg`,\n * or `undefined` if no such file exists\n */\nasync function findDeveloperImageFromDirectory(entry) {\n const fileList = await readdir(entry, { withFileTypes: true });\n for (const subEntry of fileList) {\n if (subEntry.name === DEVELOPER_IMAGE_FILE_NAME && subEntry.isFile()) {\n return entry;\n }\n if (subEntry.isDirectory()) {\n const fullPath = joinPath(entry, subEntry.name);\n const subFolderResult = await findDeveloperImageFromDirectory(fullPath);\n if (subFolderResult) {\n return subFolderResult;\n }\n }\n }\n}\n\n/**\n * @typedef {Object} ImagePath\n * @property {string} developerImage\n * @property {string} developerImageSignature\n */\n\n/**\n * Find developer image for certain version. If developer image does not exists,\n * this will try to find and download developer image, unzip to `${APPIUM_HOME}/iOSSupport/`\n * @param {string} version full version of iOS device. The first two parts of version\n * will be preserved when sending the request, e.g. `14.7.1` will be changed to `14.7`\n * @param {ImageFromGithubRepo} githubImageOption\n * @returns {Promise<ImagePath>}\n * @throws If developer image is not found, or error while downloading or unzipping.\n */\nasync function findDeveloperImage(version, githubImageOption) {\n const finalVersion = version.split('.').splice(0, 2).join('.');\n const fileName = `${finalVersion}.zip`;\n const DEFAULT_IMAGE_DIR = joinPath(await env.resolveAppiumHome(), DEFAULT_IMAGE_DIR_NAME);\n const fullDownloadPath = joinPath(DEFAULT_IMAGE_DIR, fileName);\n if (!await exists(DEFAULT_IMAGE_DIR)) {\n await mkdir(DEFAULT_IMAGE_DIR, { recursive: true });\n }\n if (!await exists(fullDownloadPath)) {\n await searchAndDownloadDeveloperImageFromGithub(finalVersion, fullDownloadPath, githubImageOption);\n }\n const decompressPath = joinPath(DEFAULT_IMAGE_DIR, finalVersion);\n /** @type {string | undefined} */\n let developerImageParentFolder;\n if (await exists(decompressPath)) {\n developerImageParentFolder = await findDeveloperImageFromDirectory(decompressPath);\n }\n if (!developerImageParentFolder) {\n await zip.extractAllTo(fullDownloadPath, decompressPath);\n developerImageParentFolder = await findDeveloperImageFromDirectory(decompressPath);\n }\n if (!developerImageParentFolder) {\n throw new Error(`Unable to find unzipped developer image in ${decompressPath}`);\n }\n return {\n developerImage: joinPath(developerImageParentFolder, DEVELOPER_IMAGE_FILE_NAME),\n developerImageSignature: joinPath(developerImageParentFolder, DEVELOPER_IMAGE_SIGNATURE_FILE_NAME)\n };\n}\n\n/**\n *\n * @param {string} finalVersion\n * @param {string} fullDownloadPath\n * @param {ImageFromGithubRepo} githubImageOption\n */\nasync function searchAndDownloadDeveloperImageFromGithub(finalVersion, fullDownloadPath, githubImageOption) {\n const fileNameRegExp = new RegExp(`${_.escapeRegExp(finalVersion)}(\\\\(([\\\\w_|.()])+\\\\))?.zip`);\n const { githubRepo, subFolderList = [], branch = 'master' } = githubImageOption;\n /** @type {string | undefined} */\n let fileUrl;\n const fileList = await listGithubImageList(githubImageOption);\n if (!fileList) {\n throw new Error(`Failed to list https://github.com/${githubRepo}`);;\n }\n const targetFile = _.find(fileList, (item) => fileNameRegExp.test(item.path));\n const splitter = subFolderList.length > 0 ? '/' : '';\n const subFolderPath = `${splitter}${subFolderList.join('/')}${splitter}`;\n if (targetFile) {\n fileUrl = `https://raw.githubusercontent.com/${githubRepo}/${branch}${subFolderPath}${targetFile.path}`;\n }\n if (!fileUrl) {\n throw new Error(`Failed to get developer image for iOS ${finalVersion}`);\n }\n try {\n log.info(`Downloading developer image for ${finalVersion} to ${fullDownloadPath} from ${fileUrl}`);\n await net.downloadFile(fileUrl, fullDownloadPath);\n } catch (e) {\n await rimraf(fullDownloadPath);\n throw e;\n }\n}\n\nexport { findDeveloperImage };"],"mappings":"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"}
|