appium-xcuitest-driver 4.20.0 → 4.21.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 +32 -0
- package/README.md +7 -9
- package/build/index.js +7 -16
- package/build/lib/app-utils.d.ts +58 -0
- package/build/lib/app-utils.d.ts.map +1 -0
- package/build/lib/app-utils.js +196 -155
- package/build/lib/app-utils.js.map +1 -1
- package/build/lib/commands/activeAppInfo.d.ts +12 -0
- package/build/lib/commands/activeAppInfo.d.ts.map +1 -0
- package/build/lib/commands/activeAppInfo.js +13 -15
- package/build/lib/commands/activeAppInfo.js.map +1 -1
- package/build/lib/commands/alert.d.ts +29 -0
- package/build/lib/commands/alert.d.ts.map +1 -0
- package/build/lib/commands/alert.js +57 -44
- package/build/lib/commands/alert.js.map +1 -1
- package/build/lib/commands/app-management.d.ts +89 -0
- package/build/lib/commands/app-management.d.ts.map +1 -0
- package/build/lib/commands/app-management.js +174 -125
- package/build/lib/commands/app-management.js.map +1 -1
- package/build/lib/commands/appearance.d.ts +35 -0
- package/build/lib/commands/appearance.d.ts.map +1 -0
- package/build/lib/commands/appearance.js +79 -57
- package/build/lib/commands/appearance.js.map +1 -1
- package/build/lib/commands/battery.d.ts +27 -0
- package/build/lib/commands/battery.d.ts.map +1 -0
- package/build/lib/commands/battery.js +24 -15
- package/build/lib/commands/battery.js.map +1 -1
- package/build/lib/commands/biometric.d.ts +46 -0
- package/build/lib/commands/biometric.d.ts.map +1 -0
- package/build/lib/commands/biometric.js +54 -36
- package/build/lib/commands/biometric.js.map +1 -1
- package/build/lib/commands/certificate.d.ts +66 -0
- package/build/lib/commands/certificate.d.ts.map +1 -0
- package/build/lib/commands/certificate.js +407 -322
- package/build/lib/commands/certificate.js.map +1 -1
- package/build/lib/commands/clipboard.d.ts +24 -0
- package/build/lib/commands/clipboard.d.ts.map +1 -0
- package/build/lib/commands/clipboard.js +34 -23
- package/build/lib/commands/clipboard.js.map +1 -1
- package/build/lib/commands/condition.d.ts +86 -0
- package/build/lib/commands/condition.d.ts.map +1 -0
- package/build/lib/commands/condition.js +123 -66
- package/build/lib/commands/condition.js.map +1 -1
- package/build/lib/commands/context.d.ts +118 -0
- package/build/lib/commands/context.d.ts.map +1 -0
- package/build/lib/commands/context.js +549 -413
- package/build/lib/commands/context.js.map +1 -1
- package/build/lib/commands/deviceInfo.d.ts +12 -0
- package/build/lib/commands/deviceInfo.d.ts.map +1 -0
- package/build/lib/commands/deviceInfo.js +19 -26
- package/build/lib/commands/deviceInfo.js.map +1 -1
- package/build/lib/commands/element.d.ts +81 -0
- package/build/lib/commands/element.d.ts.map +1 -0
- package/build/lib/commands/element.js +323 -246
- package/build/lib/commands/element.js.map +1 -1
- package/build/lib/commands/execute.d.ts +106 -0
- package/build/lib/commands/execute.d.ts.map +1 -0
- package/build/lib/commands/execute.js +94 -56
- package/build/lib/commands/execute.js.map +1 -1
- package/build/lib/commands/file-movement.d.ts +148 -0
- package/build/lib/commands/file-movement.d.ts.map +1 -0
- package/build/lib/commands/file-movement.js +453 -238
- package/build/lib/commands/file-movement.js.map +1 -1
- package/build/lib/commands/find.d.ts +21 -0
- package/build/lib/commands/find.d.ts.map +1 -0
- package/build/lib/commands/find.js +179 -130
- package/build/lib/commands/find.js.map +1 -1
- package/build/lib/commands/general.d.ts +147 -0
- package/build/lib/commands/general.d.ts.map +1 -0
- package/build/lib/commands/general.js +333 -257
- package/build/lib/commands/general.js.map +1 -1
- package/build/lib/commands/geolocation.d.ts +45 -0
- package/build/lib/commands/geolocation.d.ts.map +1 -0
- package/build/lib/commands/geolocation.js +37 -20
- package/build/lib/commands/geolocation.js.map +1 -1
- package/build/lib/commands/gesture.d.ts +112 -0
- package/build/lib/commands/gesture.d.ts.map +1 -0
- package/build/lib/commands/gesture.js +474 -394
- package/build/lib/commands/gesture.js.map +1 -1
- package/build/lib/commands/index.d.ts +80 -0
- package/build/lib/commands/index.d.ts.map +1 -0
- package/build/lib/commands/index.js +83 -51
- package/build/lib/commands/index.js.map +1 -1
- package/build/lib/commands/iohid.d.ts +34 -0
- package/build/lib/commands/iohid.d.ts.map +1 -0
- package/build/lib/commands/iohid.js +40 -30
- package/build/lib/commands/iohid.js.map +1 -1
- package/build/lib/commands/keychains.d.ts +12 -0
- package/build/lib/commands/keychains.d.ts.map +1 -0
- package/build/lib/commands/keychains.js +17 -21
- package/build/lib/commands/keychains.js.map +1 -1
- package/build/lib/commands/localization.d.ts +48 -0
- package/build/lib/commands/localization.d.ts.map +1 -0
- package/build/lib/commands/localization.js +39 -25
- package/build/lib/commands/localization.js.map +1 -1
- package/build/lib/commands/location.d.ts +54 -0
- package/build/lib/commands/location.d.ts.map +1 -0
- package/build/lib/commands/location.js +90 -63
- package/build/lib/commands/location.js.map +1 -1
- package/build/lib/commands/lock.d.ts +19 -0
- package/build/lib/commands/lock.d.ts.map +1 -0
- package/build/lib/commands/lock.js +38 -29
- package/build/lib/commands/lock.js.map +1 -1
- package/build/lib/commands/log.d.ts +74 -0
- package/build/lib/commands/log.d.ts.map +1 -0
- package/build/lib/commands/log.js +189 -154
- package/build/lib/commands/log.js.map +1 -1
- package/build/lib/commands/navigation.d.ts +40 -0
- package/build/lib/commands/navigation.d.ts.map +1 -0
- package/build/lib/commands/navigation.js +106 -77
- package/build/lib/commands/navigation.js.map +1 -1
- package/build/lib/commands/notifications.d.ts +57 -0
- package/build/lib/commands/notifications.d.ts.map +1 -0
- package/build/lib/commands/notifications.js +79 -45
- package/build/lib/commands/notifications.js.map +1 -1
- package/build/lib/commands/pasteboard.d.ts +13 -0
- package/build/lib/commands/pasteboard.d.ts.map +1 -0
- package/build/lib/commands/pasteboard.js +28 -29
- package/build/lib/commands/pasteboard.js.map +1 -1
- package/build/lib/commands/pcap.d.ts +50 -0
- package/build/lib/commands/pcap.d.ts.map +1 -0
- package/build/lib/commands/pcap.js +151 -118
- package/build/lib/commands/pcap.js.map +1 -1
- package/build/lib/commands/performance.d.ts +94 -0
- package/build/lib/commands/performance.d.ts.map +1 -0
- package/build/lib/commands/performance.js +318 -238
- package/build/lib/commands/performance.js.map +1 -1
- package/build/lib/commands/permissions.d.ts +81 -0
- package/build/lib/commands/permissions.d.ts.map +1 -0
- package/build/lib/commands/permissions.js +136 -83
- package/build/lib/commands/permissions.js.map +1 -1
- package/build/lib/commands/proxy-helper.d.ts +15 -0
- package/build/lib/commands/proxy-helper.d.ts.map +1 -0
- package/build/lib/commands/proxy-helper.js +121 -105
- package/build/lib/commands/proxy-helper.js.map +1 -1
- package/build/lib/commands/record-audio.d.ts +75 -0
- package/build/lib/commands/record-audio.d.ts.map +1 -0
- package/build/lib/commands/record-audio.js +226 -167
- package/build/lib/commands/record-audio.js.map +1 -1
- package/build/lib/commands/recordscreen.d.ts +171 -0
- package/build/lib/commands/recordscreen.d.ts.map +1 -0
- package/build/lib/commands/recordscreen.js +318 -227
- package/build/lib/commands/recordscreen.js.map +1 -1
- package/build/lib/commands/screenshots.d.ts +17 -0
- package/build/lib/commands/screenshots.d.ts.map +1 -0
- package/build/lib/commands/screenshots.js +86 -70
- package/build/lib/commands/screenshots.js.map +1 -1
- package/build/lib/commands/source.d.ts +17 -0
- package/build/lib/commands/source.d.ts.map +1 -0
- package/build/lib/commands/source.js +119 -95
- package/build/lib/commands/source.js.map +1 -1
- package/build/lib/commands/timeouts.d.ts +33 -0
- package/build/lib/commands/timeouts.d.ts.map +1 -0
- package/build/lib/commands/timeouts.js +57 -40
- package/build/lib/commands/timeouts.js.map +1 -1
- package/build/lib/commands/web.d.ts +178 -0
- package/build/lib/commands/web.d.ts.map +1 -0
- package/build/lib/commands/web.js +737 -537
- package/build/lib/commands/web.js.map +1 -1
- package/build/lib/commands/xctest.d.ts +161 -0
- package/build/lib/commands/xctest.d.ts.map +1 -0
- package/build/lib/commands/xctest.js +270 -169
- package/build/lib/commands/xctest.js.map +1 -1
- package/build/lib/cookies.d.ts +15 -0
- package/build/lib/cookies.d.ts.map +1 -0
- package/build/lib/cookies.js +79 -51
- package/build/lib/cookies.js.map +1 -1
- package/build/lib/css-converter.d.ts +80 -0
- package/build/lib/css-converter.d.ts.map +1 -0
- package/build/lib/css-converter.js +253 -158
- package/build/lib/css-converter.js.map +1 -1
- package/build/lib/desired-caps.d.ts +437 -0
- package/build/lib/desired-caps.d.ts.map +1 -0
- package/build/lib/desired-caps.js +341 -336
- package/build/lib/desired-caps.js.map +1 -1
- package/build/lib/device-connections-factory.d.ts +13 -0
- package/build/lib/device-connections-factory.d.ts.map +1 -0
- package/build/lib/device-connections-factory.js +221 -204
- package/build/lib/device-connections-factory.js.map +1 -1
- package/build/lib/device-log/ios-crash-log.d.ts +33 -0
- package/build/lib/device-log/ios-crash-log.d.ts.map +1 -0
- package/build/lib/device-log/ios-crash-log.js +110 -99
- package/build/lib/device-log/ios-crash-log.js.map +1 -1
- package/build/lib/device-log/ios-device-log.d.ts +12 -0
- package/build/lib/device-log/ios-device-log.d.ts.map +1 -0
- package/build/lib/device-log/ios-device-log.js +35 -40
- package/build/lib/device-log/ios-device-log.js.map +1 -1
- package/build/lib/device-log/ios-log.d.ts +15 -0
- package/build/lib/device-log/ios-log.d.ts.map +1 -0
- package/build/lib/device-log/ios-log.js +49 -53
- package/build/lib/device-log/ios-log.js.map +1 -1
- package/build/lib/device-log/ios-performance-log.d.ts +13 -0
- package/build/lib/device-log/ios-performance-log.d.ts.map +1 -0
- package/build/lib/device-log/ios-performance-log.js +42 -43
- package/build/lib/device-log/ios-performance-log.js.map +1 -1
- package/build/lib/device-log/ios-simulator-log.d.ts +20 -0
- package/build/lib/device-log/ios-simulator-log.d.ts.map +1 -0
- package/build/lib/device-log/ios-simulator-log.js +115 -111
- package/build/lib/device-log/ios-simulator-log.js.map +1 -1
- package/build/lib/device-log/rotating-log.d.ts +18 -0
- package/build/lib/device-log/rotating-log.d.ts.map +1 -0
- package/build/lib/device-log/rotating-log.js +50 -49
- package/build/lib/device-log/rotating-log.js.map +1 -1
- package/build/lib/device-log/safari-console-log.d.ts +8 -0
- package/build/lib/device-log/safari-console-log.d.ts.map +1 -0
- package/build/lib/device-log/safari-console-log.js +87 -54
- package/build/lib/device-log/safari-console-log.js.map +1 -1
- package/build/lib/device-log/safari-network-log.d.ts +10 -0
- package/build/lib/device-log/safari-network-log.d.ts.map +1 -0
- package/build/lib/device-log/safari-network-log.js +156 -135
- package/build/lib/device-log/safari-network-log.js.map +1 -1
- package/build/lib/driver.d.ts +1448 -0
- package/build/lib/driver.d.ts.map +1 -0
- package/build/lib/driver.js +1611 -1088
- package/build/lib/driver.js.map +1 -1
- package/build/lib/ios-deploy.d.ts +34 -0
- package/build/lib/ios-deploy.d.ts.map +1 -0
- package/build/lib/ios-deploy.js +199 -173
- package/build/lib/ios-deploy.js.map +1 -1
- package/build/lib/ios-fs-helpers.d.ts +55 -0
- package/build/lib/ios-fs-helpers.d.ts.map +1 -0
- package/build/lib/ios-fs-helpers.js +260 -189
- package/build/lib/ios-fs-helpers.js.map +1 -1
- package/build/lib/ios-generic-simulators.d.ts +6 -0
- package/build/lib/ios-generic-simulators.d.ts.map +1 -0
- package/build/lib/ios-generic-simulators.js +12 -11
- package/build/lib/ios-generic-simulators.js.map +1 -1
- package/build/lib/logger.d.ts +3 -0
- package/build/lib/logger.d.ts.map +1 -0
- package/build/lib/logger.js +5 -11
- package/build/lib/logger.js.map +1 -1
- package/build/lib/method-map.d.ts +213 -0
- package/build/lib/method-map.d.ts.map +1 -0
- package/build/lib/method-map.js +117 -219
- package/build/lib/method-map.js.map +1 -1
- package/build/lib/py-ios-device-client.d.ts +19 -0
- package/build/lib/py-ios-device-client.d.ts.map +1 -0
- package/build/lib/py-ios-device-client.js +98 -112
- package/build/lib/py-ios-device-client.js.map +1 -1
- package/build/lib/real-device-management.d.ts +34 -0
- package/build/lib/real-device-management.d.ts.map +1 -0
- package/build/lib/real-device-management.js +77 -70
- package/build/lib/real-device-management.js.map +1 -1
- package/build/lib/simulator-management.d.ts +84 -0
- package/build/lib/simulator-management.d.ts.map +1 -0
- package/build/lib/simulator-management.js +250 -202
- package/build/lib/simulator-management.js.map +1 -1
- package/build/lib/utils.d.ts +114 -0
- package/build/lib/utils.d.ts.map +1 -0
- package/build/lib/utils.js +369 -289
- package/build/lib/utils.js.map +1 -1
- package/lib/commands/activeAppInfo.js +11 -14
- package/lib/commands/alert.js +53 -37
- package/lib/commands/app-management.js +180 -129
- package/lib/commands/appearance.js +65 -74
- package/lib/commands/battery.js +13 -16
- package/lib/commands/biometric.js +48 -52
- package/lib/commands/certificate.js +259 -222
- package/lib/commands/clipboard.js +30 -30
- package/lib/commands/condition.js +114 -103
- package/lib/commands/context.js +579 -494
- package/lib/commands/deviceInfo.js +17 -21
- package/lib/commands/element.js +305 -247
- package/lib/commands/execute.js +82 -58
- package/lib/commands/file-movement.js +242 -208
- package/lib/commands/find.js +156 -146
- package/lib/commands/general.js +333 -282
- package/lib/commands/gesture.js +501 -390
- package/lib/commands/index.js +41 -18
- package/lib/commands/iohid.js +34 -36
- package/lib/commands/keychains.js +13 -16
- package/lib/commands/localization.js +26 -28
- package/lib/commands/location.js +86 -72
- package/lib/commands/lock.js +33 -23
- package/lib/commands/log.js +154 -134
- package/lib/commands/navigation.js +96 -75
- package/lib/commands/notifications.js +71 -60
- package/lib/commands/pasteboard.js +26 -19
- package/lib/commands/pcap.js +119 -107
- package/lib/commands/performance.js +201 -176
- package/lib/commands/permissions.js +59 -75
- package/lib/commands/proxy-helper.js +69 -52
- package/lib/commands/record-audio.js +173 -140
- package/lib/commands/recordscreen.js +230 -198
- package/lib/commands/screenshots.js +82 -69
- package/lib/commands/source.js +59 -52
- package/lib/commands/timeouts.js +56 -36
- package/lib/commands/web.js +356 -186
- package/lib/commands/xctest.js +168 -146
- package/lib/driver.js +739 -219
- package/lib/py-ios-device-client.js +1 -1
- package/lib/utils.js +1 -1
- package/npm-shrinkwrap.json +928 -1495
- package/package.json +27 -15
- package/scripts/build-docs.js +28 -30
- package/build/lib/commands/cookies.js +0 -66
- package/build/lib/commands/cookies.js.map +0 -1
- package/lib/commands/cookies.js +0 -67
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,35 @@
|
|
|
1
|
+
## [4.21.0](https://github.com/appium/appium-xcuitest-driver/compare/v4.20.1...v4.21.0) (2023-03-29)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* build docs with typedoc ([ab354a5](https://github.com/appium/appium-xcuitest-driver/commit/ab354a57d8677b639949959f8a7112cb11cd9848))
|
|
7
|
+
* refactor to support automatic command docs ([9b9e6fa](https://github.com/appium/appium-xcuitest-driver/commit/9b9e6fa860425f3ed2a9130d088889c05e3e10a9))
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Bug Fixes
|
|
11
|
+
|
|
12
|
+
* **driver:** use correct method name ([45330bb](https://github.com/appium/appium-xcuitest-driver/commit/45330bbbdc8b1d28a3dd43ba8628e80a9f278160))
|
|
13
|
+
* **execute:** better validation of "mobile commands" ([0b9b9cb](https://github.com/appium/appium-xcuitest-driver/commit/0b9b9cb697d3c18e1d65a122ac5029ad6452c916))
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
### Miscellaneous Chores
|
|
17
|
+
|
|
18
|
+
* add wallaby config ([1915292](https://github.com/appium/appium-xcuitest-driver/commit/1915292b830d8f60a98af1b211f83d3982bfba7b))
|
|
19
|
+
* fixup ([4fb1e8a](https://github.com/appium/appium-xcuitest-driver/commit/4fb1e8a1d31f807c92550f0677bf4e36fefd9076))
|
|
20
|
+
* rename method installXCTestBundle => mobileInstallXCTestBundle for consistency ([11349cb](https://github.com/appium/appium-xcuitest-driver/commit/11349cb52bea66ee4b2d7f48aa81d8891e69641d))
|
|
21
|
+
* rename runXCTest => mobileRunXCTest ([621ef8c](https://github.com/appium/appium-xcuitest-driver/commit/621ef8c6020c67bbc95bb7a44bbdf8a32a1a61e2))
|
|
22
|
+
* try to skip problem tests ([3cfea5d](https://github.com/appium/appium-xcuitest-driver/commit/3cfea5d72984035c6ee84a06b019c4151017e34f))
|
|
23
|
+
* upgrade appium ([fb6ed96](https://github.com/appium/appium-xcuitest-driver/commit/fb6ed9664246e63b8a49c35f2ab8a3231627bfd9))
|
|
24
|
+
* use random port for phony https server ([382d296](https://github.com/appium/appium-xcuitest-driver/commit/382d2966d5043fe93e3646f88e7b0416f6e4d6f3))
|
|
25
|
+
|
|
26
|
+
## [4.20.1](https://github.com/appium/appium-xcuitest-driver/compare/v4.20.0...v4.20.1) (2023-03-29)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
### Bug Fixes
|
|
30
|
+
|
|
31
|
+
* Add missing --name option to removeProfile ([#1530](https://github.com/appium/appium-xcuitest-driver/issues/1530)) ([a930762](https://github.com/appium/appium-xcuitest-driver/commit/a930762933a7008caab4fe1549e64e4d340b6ede))
|
|
32
|
+
|
|
1
33
|
## [4.20.0](https://github.com/appium/appium-xcuitest-driver/compare/v4.19.1...v4.20.0) (2023-03-28)
|
|
2
34
|
|
|
3
35
|
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# appium-xcuitest-driver
|
|
2
2
|
|
|
3
|
-
[](https://npmjs.org/package/appium-xcuitest-driver)
|
|
4
4
|
[](https://npmjs.org/package/appium-xcuitest-driver)
|
|
5
5
|
|
|
6
6
|
[](https://github.com/appium/appium-xcuitest-driver/actions/workflows/publish.js.yml)
|
|
@@ -19,23 +19,23 @@ The [Documentation](https://appium.github.io/appium-xcuitest-driver) is hosted s
|
|
|
19
19
|
|
|
20
20
|
## Contributing & Development
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
Clone this project from GitHub and run:
|
|
23
23
|
|
|
24
|
-
```
|
|
24
|
+
```bash
|
|
25
25
|
npm install
|
|
26
26
|
```
|
|
27
27
|
|
|
28
28
|
To watch changes during the development:
|
|
29
29
|
|
|
30
|
-
```
|
|
30
|
+
```bash
|
|
31
31
|
npm run watch
|
|
32
32
|
```
|
|
33
33
|
|
|
34
34
|
To run unit/functional tests:
|
|
35
35
|
|
|
36
|
-
```
|
|
37
|
-
npm test
|
|
38
|
-
npm e2e-test
|
|
36
|
+
```bash
|
|
37
|
+
npm test # unit
|
|
38
|
+
npm run e2e-test # functional
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
There are also a number of environment variables that can be used when running
|
|
@@ -49,5 +49,3 @@ the tests locally. These include:
|
|
|
49
49
|
the root directory of the repo with the extension "xcconfig")
|
|
50
50
|
* `UICATALOG_REAL_DEVICE` - path to the real device build of UICatalog, in case
|
|
51
51
|
the npm installed one is not built for real device
|
|
52
|
-
|
|
53
|
-
|
package/build/index.js
CHANGED
|
@@ -1,17 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
Object.defineProperty(exports, "XCUITestDriver", {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
return _driver.XCUITestDriver;
|
|
10
|
-
}
|
|
11
|
-
});
|
|
12
|
-
exports.default = void 0;
|
|
13
|
-
require("source-map-support/register");
|
|
14
|
-
var _driver = require("./lib/driver");
|
|
15
|
-
var _default = _driver.XCUITestDriver;
|
|
16
|
-
exports.default = _default;
|
|
17
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZHJpdmVyIiwicmVxdWlyZSIsIl9kZWZhdWx0IiwiWENVSVRlc3REcml2ZXIiLCJleHBvcnRzIiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHRyYW5zcGlsZTptYWluXG5pbXBvcnQgeyBYQ1VJVGVzdERyaXZlciB9IGZyb20gJy4vbGliL2RyaXZlcic7XG5cbmV4cG9ydCB7IFhDVUlUZXN0RHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBYQ1VJVGVzdERyaXZlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUNBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUE4QyxJQUFBQyxRQUFBLEdBRy9CQyxzQkFBYztBQUFBQyxPQUFBLENBQUFDLE9BQUEsR0FBQUgsUUFBQSJ9
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.XCUITestDriver = void 0;
|
|
4
|
+
// transpile:main
|
|
5
|
+
const driver_1 = require("./lib/driver");
|
|
6
|
+
Object.defineProperty(exports, "XCUITestDriver", { enumerable: true, get: function () { return driver_1.XCUITestDriver; } });
|
|
7
|
+
exports.default = driver_1.XCUITestDriver;
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export type PlatformOpts = {
|
|
2
|
+
/**
|
|
3
|
+
* - Whether the destination platform is a Simulator
|
|
4
|
+
*/
|
|
5
|
+
isSimulator: boolean;
|
|
6
|
+
/**
|
|
7
|
+
* - Whether the destination platform is a Simulator
|
|
8
|
+
*/
|
|
9
|
+
isTvOS: boolean;
|
|
10
|
+
};
|
|
11
|
+
export function extractBundleId(app: any): Promise<any>;
|
|
12
|
+
/**
|
|
13
|
+
* @typedef {Object} PlatformOpts
|
|
14
|
+
*
|
|
15
|
+
* @property {boolean} isSimulator - Whether the destination platform is a Simulator
|
|
16
|
+
* @property {boolean} isTvOS - Whether the destination platform is a Simulator
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Verify whether the given application is compatible to the
|
|
20
|
+
* platform where it is going to be installed and tested.
|
|
21
|
+
*
|
|
22
|
+
* @param {string} app - The actual path to the application bundle
|
|
23
|
+
* @param {PlatformOpts} expectedPlatform
|
|
24
|
+
* @throws {Error} If bundle architecture does not match the expected device architecture.
|
|
25
|
+
*/
|
|
26
|
+
export function verifyApplicationPlatform(app: string, expectedPlatform: PlatformOpts): Promise<void>;
|
|
27
|
+
export function parseLocalizableStrings(opts: any): Promise<{}>;
|
|
28
|
+
export const SAFARI_BUNDLE_ID: "com.apple.mobilesafari";
|
|
29
|
+
export function fetchSupportedAppPlatforms(app: any): Promise<any[]>;
|
|
30
|
+
export const APP_EXT: ".app";
|
|
31
|
+
export const IPA_EXT: ".ipa";
|
|
32
|
+
/**
|
|
33
|
+
* Check whether the given path on the file system points to the .app bundle root
|
|
34
|
+
*
|
|
35
|
+
* @param {string} appPath Possible .app bundle root
|
|
36
|
+
* @returns {boolean} Whether the given path points to an .app bundle
|
|
37
|
+
*/
|
|
38
|
+
export function isAppBundle(appPath: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Extract the given archive and looks for items with given extensions in it
|
|
41
|
+
*
|
|
42
|
+
* @param {string} archivePath Full path to a .zip archive
|
|
43
|
+
* @param {Array<string>} appExtensions List of matching item extensions
|
|
44
|
+
* @returns {Promise<[string, string[]]>} Tuple, where the first element points to
|
|
45
|
+
* a temporary folder root where the archive has been extracted and the second item
|
|
46
|
+
* contains a list of relative paths to matched items
|
|
47
|
+
*/
|
|
48
|
+
export function findApps(archivePath: string, appExtensions: Array<string>): Promise<[string, string[]]>;
|
|
49
|
+
/**
|
|
50
|
+
* Moves the application bundle to a newly created temporary folder
|
|
51
|
+
*
|
|
52
|
+
* @param {string} appRoot Full path to the .app bundle
|
|
53
|
+
* @returns {Promise<string>} The new path to the app bundle.
|
|
54
|
+
* The name of the app bundle remains though
|
|
55
|
+
*/
|
|
56
|
+
export function isolateAppBundle(appRoot: string): Promise<string>;
|
|
57
|
+
export function extractBundleVersion(app: any): Promise<any>;
|
|
58
|
+
//# sourceMappingURL=app-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-utils.d.ts","sourceRoot":"","sources":["../../lib/app-utils.js"],"names":[],"mappings":";;;;iBA8Ec,OAAO;;;;YACP,OAAO;;AA9BrB,wDAIC;AAsBD;;;;;GAKG;AAEH;;;;;;;GAOG;AACH,+CAJW,MAAM,oBACN,YAAY,iBAoBtB;AAWD,gEA+EC;AA9LD,wDAAkD;AAoDlD,qEAcC;AAjED,6BAAuB;AACvB,6BAAuB;AA8LvB;;;;;GAKG;AACH,qCAHW,MAAM,GACJ,OAAO,CAMnB;AAED;;;;;;;;GAQG;AACH,sCANW,MAAM,iBACN,MAAM,MAAM,CAAC,GACX,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAgBvC;AAED;;;;;;GAMG;AACH,0CAJW,MAAM,GACJ,QAAQ,MAAM,CAAC,CAQ3B;AA/LD,6DAEC"}
|
package/build/lib/app-utils.js
CHANGED
|
@@ -1,23 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
exports.findApps = findApps;
|
|
12
|
-
exports.isAppBundle = isAppBundle;
|
|
13
|
-
exports.isolateAppBundle = isolateAppBundle;
|
|
14
|
-
exports.parseLocalizableStrings = parseLocalizableStrings;
|
|
15
|
-
exports.verifyApplicationPlatform = verifyApplicationPlatform;
|
|
16
|
-
require("source-map-support/register");
|
|
17
|
-
var _lodash = _interopRequireDefault(require("lodash"));
|
|
18
|
-
var _path = _interopRequireDefault(require("path"));
|
|
19
|
-
var _support = require("appium/support");
|
|
20
|
-
var _logger = _interopRequireDefault(require("./logger.js"));
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.extractBundleVersion = exports.isolateAppBundle = exports.findApps = exports.isAppBundle = exports.IPA_EXT = exports.APP_EXT = exports.fetchSupportedAppPlatforms = exports.SAFARI_BUNDLE_ID = exports.parseLocalizableStrings = exports.verifyApplicationPlatform = exports.extractBundleId = void 0;
|
|
7
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const support_1 = require("appium/support");
|
|
10
|
+
const logger_js_1 = __importDefault(require("./logger.js"));
|
|
21
11
|
const STRINGSDICT_RESOURCE = '.stringsdict';
|
|
22
12
|
const STRINGS_RESOURCE = '.strings';
|
|
23
13
|
const SAFARI_BUNDLE_ID = 'com.apple.mobilesafari';
|
|
@@ -27,168 +17,219 @@ exports.APP_EXT = APP_EXT;
|
|
|
27
17
|
const IPA_EXT = '.ipa';
|
|
28
18
|
exports.IPA_EXT = IPA_EXT;
|
|
29
19
|
const PLIST_CACHE = new WeakMap();
|
|
20
|
+
/**
|
|
21
|
+
* Retrieves the value of the given entry name from the application's Info.plist.
|
|
22
|
+
*
|
|
23
|
+
* @this {Object} Optinal instance used for caching. Ususally the driver instance.
|
|
24
|
+
* @param {string} app Full path to the app bundle root.
|
|
25
|
+
* @param {string} entryName Key name in the plist.
|
|
26
|
+
* @returns {Promise<Any | undefined>} Either the extracted value or undefined if no such key has been found in the plist.
|
|
27
|
+
* @throws {Error} If the application's Info.plist cannot be parsed.
|
|
28
|
+
*/
|
|
30
29
|
async function extractPlistEntry(app, entryName) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
30
|
+
const plistPath = path_1.default.resolve(app, 'Info.plist');
|
|
31
|
+
const parseFile = async () => {
|
|
32
|
+
try {
|
|
33
|
+
return await support_1.plist.parsePlistFile(plistPath);
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
throw new Error(`Could not extract Info.plist from '${path_1.default.basename(app)}': ${err.message}`);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
let plistObj;
|
|
40
|
+
if (lodash_1.default.isNil(this)) {
|
|
41
|
+
plistObj = await parseFile();
|
|
37
42
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
PLIST_CACHE.set(this, {
|
|
48
|
-
...(PLIST_CACHE.get(this) || {}),
|
|
49
|
-
[app]: plistObj
|
|
50
|
-
});
|
|
43
|
+
else {
|
|
44
|
+
plistObj = PLIST_CACHE.get(this)?.[app];
|
|
45
|
+
if (!plistObj) {
|
|
46
|
+
plistObj = await parseFile();
|
|
47
|
+
PLIST_CACHE.set(this, {
|
|
48
|
+
...(PLIST_CACHE.get(this) || {}),
|
|
49
|
+
[app]: plistObj,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
51
52
|
}
|
|
52
|
-
|
|
53
|
-
return plistObj[entryName];
|
|
53
|
+
return plistObj[entryName];
|
|
54
54
|
}
|
|
55
55
|
async function extractBundleId(app) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
56
|
+
const bundleId = await extractPlistEntry.bind(this)(app, 'CFBundleIdentifier');
|
|
57
|
+
logger_js_1.default.debug(`Getting bundle ID from app '${app}': '${bundleId}'`);
|
|
58
|
+
return bundleId;
|
|
59
59
|
}
|
|
60
|
+
exports.extractBundleId = extractBundleId;
|
|
60
61
|
async function extractBundleVersion(app) {
|
|
61
|
-
|
|
62
|
+
return await extractPlistEntry.bind(this)(app, 'CFBundleVersion');
|
|
62
63
|
}
|
|
64
|
+
exports.extractBundleVersion = extractBundleVersion;
|
|
63
65
|
async function fetchSupportedAppPlatforms(app) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
66
|
+
try {
|
|
67
|
+
const result = await extractPlistEntry.bind(this)(app, 'CFBundleSupportedPlatforms');
|
|
68
|
+
if (!lodash_1.default.isArray(result)) {
|
|
69
|
+
logger_js_1.default.warn(`${path_1.default.basename(app)}': CFBundleSupportedPlatforms is not a valid list`);
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
logger_js_1.default.warn(`Cannot extract the list of supported platforms from '${path_1.default.basename(app)}': ${err.message}`);
|
|
76
|
+
return [];
|
|
69
77
|
}
|
|
70
|
-
return result;
|
|
71
|
-
} catch (err) {
|
|
72
|
-
_logger.default.warn(`Cannot extract the list of supported platforms from '${_path.default.basename(app)}': ${err.message}`);
|
|
73
|
-
return [];
|
|
74
|
-
}
|
|
75
78
|
}
|
|
79
|
+
exports.fetchSupportedAppPlatforms = fetchSupportedAppPlatforms;
|
|
80
|
+
/**
|
|
81
|
+
* @typedef {Object} PlatformOpts
|
|
82
|
+
*
|
|
83
|
+
* @property {boolean} isSimulator - Whether the destination platform is a Simulator
|
|
84
|
+
* @property {boolean} isTvOS - Whether the destination platform is a Simulator
|
|
85
|
+
*/
|
|
86
|
+
/**
|
|
87
|
+
* Verify whether the given application is compatible to the
|
|
88
|
+
* platform where it is going to be installed and tested.
|
|
89
|
+
*
|
|
90
|
+
* @param {string} app - The actual path to the application bundle
|
|
91
|
+
* @param {PlatformOpts} expectedPlatform
|
|
92
|
+
* @throws {Error} If bundle architecture does not match the expected device architecture.
|
|
93
|
+
*/
|
|
76
94
|
async function verifyApplicationPlatform(app, expectedPlatform) {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
throw new Error(`${isSimulator ? 'Simulator' : 'Real device'} architecture is unsupported by the '${app}' application. ` + `Make sure the correct deployment target has been selected for its compilation in Xcode.`);
|
|
89
|
-
}
|
|
95
|
+
logger_js_1.default.debug('Verifying application platform');
|
|
96
|
+
const supportedPlatforms = await fetchSupportedAppPlatforms.bind(this)(app);
|
|
97
|
+
logger_js_1.default.debug(`CFBundleSupportedPlatforms: ${JSON.stringify(supportedPlatforms)}`);
|
|
98
|
+
const { isSimulator, isTvOS, } = expectedPlatform;
|
|
99
|
+
const prefix = isTvOS ? 'AppleTV' : 'iPhone';
|
|
100
|
+
const suffix = isSimulator ? 'Simulator' : 'OS';
|
|
101
|
+
const dstPlatform = `${prefix}${suffix}`;
|
|
102
|
+
if (!supportedPlatforms.includes(dstPlatform)) {
|
|
103
|
+
throw new Error(`${isSimulator ? 'Simulator' : 'Real device'} architecture is unsupported by the '${app}' application. ` +
|
|
104
|
+
`Make sure the correct deployment target has been selected for its compilation in Xcode.`);
|
|
105
|
+
}
|
|
90
106
|
}
|
|
107
|
+
exports.verifyApplicationPlatform = verifyApplicationPlatform;
|
|
91
108
|
async function readResource(resourcePath) {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
109
|
+
const data = await support_1.plist.parsePlistFile(resourcePath);
|
|
110
|
+
const result = {};
|
|
111
|
+
for (const [key, value] of lodash_1.default.toPairs(data)) {
|
|
112
|
+
result[key] = lodash_1.default.isString(value) ? value : JSON.stringify(value);
|
|
113
|
+
}
|
|
114
|
+
return result;
|
|
98
115
|
}
|
|
99
116
|
async function parseLocalizableStrings(opts) {
|
|
100
|
-
|
|
101
|
-
app
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
const message = `Strings extraction is not supported if 'app' capability is not set`;
|
|
109
|
-
if (strictMode) {
|
|
110
|
-
throw new Error(message);
|
|
117
|
+
const { app, language = 'en', localizableStringsDir, stringFile, strictMode, } = opts;
|
|
118
|
+
if (!app) {
|
|
119
|
+
const message = `Strings extraction is not supported if 'app' capability is not set`;
|
|
120
|
+
if (strictMode) {
|
|
121
|
+
throw new Error(message);
|
|
122
|
+
}
|
|
123
|
+
logger_js_1.default.info(message);
|
|
124
|
+
return {};
|
|
111
125
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
126
|
+
let lprojRoot;
|
|
127
|
+
for (const subfolder of [`${language}.lproj`, localizableStringsDir, '']) {
|
|
128
|
+
lprojRoot = path_1.default.resolve(app, subfolder);
|
|
129
|
+
if (await support_1.fs.exists(lprojRoot)) {
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
const message = `No '${lprojRoot}' resources folder has been found`;
|
|
133
|
+
if (strictMode) {
|
|
134
|
+
throw new Error(message);
|
|
135
|
+
}
|
|
136
|
+
logger_js_1.default.debug(message);
|
|
120
137
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
138
|
+
logger_js_1.default.info(`Will extract resource strings from '${lprojRoot}'`);
|
|
139
|
+
const resourcePaths = [];
|
|
140
|
+
if (stringFile) {
|
|
141
|
+
const dstPath = path_1.default.resolve(lprojRoot, stringFile);
|
|
142
|
+
if (await support_1.fs.exists(dstPath)) {
|
|
143
|
+
resourcePaths.push(dstPath);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
const message = `No '${dstPath}' resource file has been found for '${app}'`;
|
|
147
|
+
if (strictMode) {
|
|
148
|
+
throw new Error(message);
|
|
149
|
+
}
|
|
150
|
+
logger_js_1.default.info(message);
|
|
151
|
+
logger_js_1.default.info(`Getting all the available strings from '${lprojRoot}'`);
|
|
152
|
+
}
|
|
124
153
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
const dstPath = _path.default.resolve(lprojRoot, stringFile);
|
|
131
|
-
if (await _support.fs.exists(dstPath)) {
|
|
132
|
-
resourcePaths.push(dstPath);
|
|
133
|
-
} else {
|
|
134
|
-
const message = `No '${dstPath}' resource file has been found for '${app}'`;
|
|
135
|
-
if (strictMode) {
|
|
136
|
-
throw new Error(message);
|
|
137
|
-
}
|
|
138
|
-
_logger.default.info(message);
|
|
139
|
-
_logger.default.info(`Getting all the available strings from '${lprojRoot}'`);
|
|
154
|
+
if (lodash_1.default.isEmpty(resourcePaths) && await support_1.fs.exists(lprojRoot)) {
|
|
155
|
+
const resourceFiles = (await support_1.fs.readdir(lprojRoot))
|
|
156
|
+
.filter((name) => lodash_1.default.some([STRINGS_RESOURCE, STRINGSDICT_RESOURCE], (x) => name.endsWith(x)))
|
|
157
|
+
.map((name) => path_1.default.resolve(lprojRoot, name));
|
|
158
|
+
resourcePaths.push(...resourceFiles);
|
|
140
159
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
resourcePaths.push(...resourceFiles);
|
|
145
|
-
}
|
|
146
|
-
_logger.default.info(`Got ${resourcePaths.length} resource file(s) in '${lprojRoot}'`);
|
|
147
|
-
if (_lodash.default.isEmpty(resourcePaths)) {
|
|
148
|
-
return {};
|
|
149
|
-
}
|
|
150
|
-
const resultStrings = {};
|
|
151
|
-
const toAbsolutePath = function (p) {
|
|
152
|
-
return _path.default.isAbsolute(p) ? p : _path.default.resolve(process.cwd(), p);
|
|
153
|
-
};
|
|
154
|
-
for (const resourcePath of resourcePaths) {
|
|
155
|
-
if (!_support.util.isSubPath(toAbsolutePath(resourcePath), toAbsolutePath(app))) {
|
|
156
|
-
throw new Error(`'${resourcePath}' is expected to be located under '${app}'`);
|
|
160
|
+
logger_js_1.default.info(`Got ${resourcePaths.length} resource file(s) in '${lprojRoot}'`);
|
|
161
|
+
if (lodash_1.default.isEmpty(resourcePaths)) {
|
|
162
|
+
return {};
|
|
157
163
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
+
const resultStrings = {};
|
|
165
|
+
const toAbsolutePath = function (p) {
|
|
166
|
+
return path_1.default.isAbsolute(p) ? p : path_1.default.resolve(process.cwd(), p);
|
|
167
|
+
};
|
|
168
|
+
for (const resourcePath of resourcePaths) {
|
|
169
|
+
if (!support_1.util.isSubPath(toAbsolutePath(resourcePath), toAbsolutePath(app))) {
|
|
170
|
+
// security precaution
|
|
171
|
+
throw new Error(`'${resourcePath}' is expected to be located under '${app}'`);
|
|
172
|
+
}
|
|
173
|
+
try {
|
|
174
|
+
const data = await readResource(resourcePath);
|
|
175
|
+
logger_js_1.default.debug(`Parsed ${lodash_1.default.keys(data).length} string(s) from '${resourcePath}'`);
|
|
176
|
+
lodash_1.default.merge(resultStrings, data);
|
|
177
|
+
}
|
|
178
|
+
catch (e) {
|
|
179
|
+
logger_js_1.default.warn(`Cannot parse '${resourcePath}' resource. Original error: ${e.message}`);
|
|
180
|
+
}
|
|
164
181
|
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
return resultStrings;
|
|
182
|
+
logger_js_1.default.info(`Got ${lodash_1.default.keys(resultStrings).length} string(s) from '${lprojRoot}'`);
|
|
183
|
+
return resultStrings;
|
|
168
184
|
}
|
|
185
|
+
exports.parseLocalizableStrings = parseLocalizableStrings;
|
|
186
|
+
/**
|
|
187
|
+
* Check whether the given path on the file system points to the .app bundle root
|
|
188
|
+
*
|
|
189
|
+
* @param {string} appPath Possible .app bundle root
|
|
190
|
+
* @returns {boolean} Whether the given path points to an .app bundle
|
|
191
|
+
*/
|
|
169
192
|
async function isAppBundle(appPath) {
|
|
170
|
-
|
|
193
|
+
return lodash_1.default.endsWith(lodash_1.default.toLower(appPath), APP_EXT)
|
|
194
|
+
&& (await support_1.fs.stat(appPath)).isDirectory()
|
|
195
|
+
&& await support_1.fs.exists(path_1.default.join(appPath, 'Info.plist'));
|
|
171
196
|
}
|
|
197
|
+
exports.isAppBundle = isAppBundle;
|
|
198
|
+
/**
|
|
199
|
+
* Extract the given archive and looks for items with given extensions in it
|
|
200
|
+
*
|
|
201
|
+
* @param {string} archivePath Full path to a .zip archive
|
|
202
|
+
* @param {Array<string>} appExtensions List of matching item extensions
|
|
203
|
+
* @returns {Promise<[string, string[]]>} Tuple, where the first element points to
|
|
204
|
+
* a temporary folder root where the archive has been extracted and the second item
|
|
205
|
+
* contains a list of relative paths to matched items
|
|
206
|
+
*/
|
|
172
207
|
async function findApps(archivePath, appExtensions) {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
useSystemUnzip
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
return [tmpRoot, sortedBundleItems];
|
|
208
|
+
const useSystemUnzipEnv = process.env.APPIUM_PREFER_SYSTEM_UNZIP;
|
|
209
|
+
const useSystemUnzip = lodash_1.default.isEmpty(useSystemUnzipEnv)
|
|
210
|
+
|| !['0', 'false'].includes(lodash_1.default.toLower(useSystemUnzipEnv));
|
|
211
|
+
const tmpRoot = await support_1.tempDir.openDir();
|
|
212
|
+
await support_1.zip.extractAllTo(archivePath, tmpRoot, { useSystemUnzip });
|
|
213
|
+
const globPattern = `**/*.+(${appExtensions.map((ext) => ext.replace(/^\./, '')).join('|')})`;
|
|
214
|
+
const sortedBundleItems = (await support_1.fs.glob(globPattern, {
|
|
215
|
+
cwd: tmpRoot,
|
|
216
|
+
strict: false,
|
|
217
|
+
})).sort((a, b) => a.split(path_1.default.sep).length - b.split(path_1.default.sep).length);
|
|
218
|
+
return [tmpRoot, sortedBundleItems];
|
|
185
219
|
}
|
|
220
|
+
exports.findApps = findApps;
|
|
221
|
+
/**
|
|
222
|
+
* Moves the application bundle to a newly created temporary folder
|
|
223
|
+
*
|
|
224
|
+
* @param {string} appRoot Full path to the .app bundle
|
|
225
|
+
* @returns {Promise<string>} The new path to the app bundle.
|
|
226
|
+
* The name of the app bundle remains though
|
|
227
|
+
*/
|
|
186
228
|
async function isolateAppBundle(appRoot) {
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
});
|
|
192
|
-
return dstRoot;
|
|
229
|
+
const tmpRoot = await support_1.tempDir.openDir();
|
|
230
|
+
const dstRoot = path_1.default.join(tmpRoot, path_1.default.basename(appRoot));
|
|
231
|
+
await support_1.fs.mv(appRoot, dstRoot, { mkdirp: true });
|
|
232
|
+
return dstRoot;
|
|
193
233
|
}
|
|
194
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfcGF0aCIsIl9zdXBwb3J0IiwiX2xvZ2dlciIsIlNUUklOR1NESUNUX1JFU09VUkNFIiwiU1RSSU5HU19SRVNPVVJDRSIsIlNBRkFSSV9CVU5ETEVfSUQiLCJleHBvcnRzIiwiQVBQX0VYVCIsIklQQV9FWFQiLCJQTElTVF9DQUNIRSIsIldlYWtNYXAiLCJleHRyYWN0UGxpc3RFbnRyeSIsImFwcCIsImVudHJ5TmFtZSIsInBsaXN0UGF0aCIsInBhdGgiLCJyZXNvbHZlIiwicGFyc2VGaWxlIiwicGxpc3QiLCJwYXJzZVBsaXN0RmlsZSIsImVyciIsIkVycm9yIiwiYmFzZW5hbWUiLCJtZXNzYWdlIiwicGxpc3RPYmoiLCJfIiwiaXNOaWwiLCJfUExJU1RfQ0FDSEUkZ2V0IiwiZ2V0Iiwic2V0IiwiZXh0cmFjdEJ1bmRsZUlkIiwiYnVuZGxlSWQiLCJiaW5kIiwibG9nIiwiZGVidWciLCJleHRyYWN0QnVuZGxlVmVyc2lvbiIsImZldGNoU3VwcG9ydGVkQXBwUGxhdGZvcm1zIiwicmVzdWx0IiwiaXNBcnJheSIsIndhcm4iLCJ2ZXJpZnlBcHBsaWNhdGlvblBsYXRmb3JtIiwiZXhwZWN0ZWRQbGF0Zm9ybSIsInN1cHBvcnRlZFBsYXRmb3JtcyIsIkpTT04iLCJzdHJpbmdpZnkiLCJpc1NpbXVsYXRvciIsImlzVHZPUyIsInByZWZpeCIsInN1ZmZpeCIsImRzdFBsYXRmb3JtIiwiaW5jbHVkZXMiLCJyZWFkUmVzb3VyY2UiLCJyZXNvdXJjZVBhdGgiLCJkYXRhIiwia2V5IiwidmFsdWUiLCJ0b1BhaXJzIiwiaXNTdHJpbmciLCJwYXJzZUxvY2FsaXphYmxlU3RyaW5ncyIsIm9wdHMiLCJsYW5ndWFnZSIsImxvY2FsaXphYmxlU3RyaW5nc0RpciIsInN0cmluZ0ZpbGUiLCJzdHJpY3RNb2RlIiwiaW5mbyIsImxwcm9qUm9vdCIsInN1YmZvbGRlciIsImZzIiwiZXhpc3RzIiwicmVzb3VyY2VQYXRocyIsImRzdFBhdGgiLCJwdXNoIiwiaXNFbXB0eSIsInJlc291cmNlRmlsZXMiLCJyZWFkZGlyIiwiZmlsdGVyIiwibmFtZSIsInNvbWUiLCJ4IiwiZW5kc1dpdGgiLCJtYXAiLCJsZW5ndGgiLCJyZXN1bHRTdHJpbmdzIiwidG9BYnNvbHV0ZVBhdGgiLCJwIiwiaXNBYnNvbHV0ZSIsInByb2Nlc3MiLCJjd2QiLCJ1dGlsIiwiaXNTdWJQYXRoIiwia2V5cyIsIm1lcmdlIiwiZSIsImlzQXBwQnVuZGxlIiwiYXBwUGF0aCIsInRvTG93ZXIiLCJzdGF0IiwiaXNEaXJlY3RvcnkiLCJqb2luIiwiZmluZEFwcHMiLCJhcmNoaXZlUGF0aCIsImFwcEV4dGVuc2lvbnMiLCJ1c2VTeXN0ZW1VbnppcEVudiIsImVudiIsIkFQUElVTV9QUkVGRVJfU1lTVEVNX1VOWklQIiwidXNlU3lzdGVtVW56aXAiLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJ6aXAiLCJleHRyYWN0QWxsVG8iLCJnbG9iUGF0dGVybiIsImV4dCIsInJlcGxhY2UiLCJzb3J0ZWRCdW5kbGVJdGVtcyIsImdsb2IiLCJzdHJpY3QiLCJzb3J0IiwiYSIsImIiLCJzcGxpdCIsInNlcCIsImlzb2xhdGVBcHBCdW5kbGUiLCJhcHBSb290IiwiZHN0Um9vdCIsIm12IiwibWtkaXJwIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2FwcC11dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBwbGlzdCwgZnMsIHV0aWwsIHRlbXBEaXIsIHppcCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXIuanMnO1xuXG5jb25zdCBTVFJJTkdTRElDVF9SRVNPVVJDRSA9ICcuc3RyaW5nc2RpY3QnO1xuY29uc3QgU1RSSU5HU19SRVNPVVJDRSA9ICcuc3RyaW5ncyc7XG5jb25zdCBTQUZBUklfQlVORExFX0lEID0gJ2NvbS5hcHBsZS5tb2JpbGVzYWZhcmknO1xuY29uc3QgQVBQX0VYVCA9ICcuYXBwJztcbmNvbnN0IElQQV9FWFQgPSAnLmlwYSc7XG5jb25zdCBQTElTVF9DQUNIRSA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZW50cnkgbmFtZSBmcm9tIHRoZSBhcHBsaWNhdGlvbidzIEluZm8ucGxpc3QuXG4gKlxuICogQHRoaXMge09iamVjdH0gT3B0aW5hbCBpbnN0YW5jZSB1c2VkIGZvciBjYWNoaW5nLiBVc3VzYWxseSB0aGUgZHJpdmVyIGluc3RhbmNlLlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcCBGdWxsIHBhdGggdG8gdGhlIGFwcCBidW5kbGUgcm9vdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBlbnRyeU5hbWUgS2V5IG5hbWUgaW4gdGhlIHBsaXN0LlxuICogQHJldHVybnMge1Byb21pc2U8QW55IHwgdW5kZWZpbmVkPn0gRWl0aGVyIHRoZSBleHRyYWN0ZWQgdmFsdWUgb3IgdW5kZWZpbmVkIGlmIG5vIHN1Y2gga2V5IGhhcyBiZWVuIGZvdW5kIGluIHRoZSBwbGlzdC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgYXBwbGljYXRpb24ncyBJbmZvLnBsaXN0IGNhbm5vdCBiZSBwYXJzZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RQbGlzdEVudHJ5IChhcHAsIGVudHJ5TmFtZSkge1xuICBjb25zdCBwbGlzdFBhdGggPSBwYXRoLnJlc29sdmUoYXBwLCAnSW5mby5wbGlzdCcpO1xuXG4gIGNvbnN0IHBhcnNlRmlsZSA9IGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHBsaXN0LnBhcnNlUGxpc3RGaWxlKHBsaXN0UGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBleHRyYWN0IEluZm8ucGxpc3QgZnJvbSAnJHtwYXRoLmJhc2VuYW1lKGFwcCl9JzogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gIH07XG5cbiAgbGV0IHBsaXN0T2JqO1xuICBpZiAoXy5pc05pbCh0aGlzKSkge1xuICAgIHBsaXN0T2JqID0gYXdhaXQgcGFyc2VGaWxlKCk7XG4gIH0gZWxzZSB7XG4gICAgcGxpc3RPYmogPSBQTElTVF9DQUNIRS5nZXQodGhpcyk/LlthcHBdO1xuICAgIGlmICghcGxpc3RPYmopIHtcbiAgICAgIHBsaXN0T2JqID0gYXdhaXQgcGFyc2VGaWxlKCk7XG4gICAgICBQTElTVF9DQUNIRS5zZXQodGhpcywge1xuICAgICAgICAuLi4oUExJU1RfQ0FDSEUuZ2V0KHRoaXMpIHx8IHt9KSxcbiAgICAgICAgW2FwcF06IHBsaXN0T2JqLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBsaXN0T2JqW2VudHJ5TmFtZV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RCdW5kbGVJZCAoYXBwKSB7XG4gIGNvbnN0IGJ1bmRsZUlkID0gYXdhaXQgZXh0cmFjdFBsaXN0RW50cnkuYmluZCh0aGlzKShhcHAsICdDRkJ1bmRsZUlkZW50aWZpZXInKTtcbiAgbG9nLmRlYnVnKGBHZXR0aW5nIGJ1bmRsZSBJRCBmcm9tIGFwcCAnJHthcHB9JzogJyR7YnVuZGxlSWR9J2ApO1xuICByZXR1cm4gYnVuZGxlSWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RCdW5kbGVWZXJzaW9uIChhcHApIHtcbiAgcmV0dXJuIGF3YWl0IGV4dHJhY3RQbGlzdEVudHJ5LmJpbmQodGhpcykoYXBwLCAnQ0ZCdW5kbGVWZXJzaW9uJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoU3VwcG9ydGVkQXBwUGxhdGZvcm1zIChhcHApIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleHRyYWN0UGxpc3RFbnRyeS5iaW5kKHRoaXMpKGFwcCwgJ0NGQnVuZGxlU3VwcG9ydGVkUGxhdGZvcm1zJyk7XG4gICAgaWYgKCFfLmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgbG9nLndhcm4oYCR7cGF0aC5iYXNlbmFtZShhcHApfSc6IENGQnVuZGxlU3VwcG9ydGVkUGxhdGZvcm1zIGlzIG5vdCBhIHZhbGlkIGxpc3RgKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oXG4gICAgICBgQ2Fubm90IGV4dHJhY3QgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHBsYXRmb3JtcyBmcm9tICcke3BhdGguYmFzZW5hbWUoYXBwKX0nOiAke2Vyci5tZXNzYWdlfWBcbiAgICApO1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBsYXRmb3JtT3B0c1xuICpcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNTaW11bGF0b3IgLSBXaGV0aGVyIHRoZSBkZXN0aW5hdGlvbiBwbGF0Zm9ybSBpcyBhIFNpbXVsYXRvclxuICogQHByb3BlcnR5IHtib29sZWFufSBpc1R2T1MgLSBXaGV0aGVyIHRoZSBkZXN0aW5hdGlvbiBwbGF0Zm9ybSBpcyBhIFNpbXVsYXRvclxuICovXG5cbi8qKlxuICogVmVyaWZ5IHdoZXRoZXIgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIGlzIGNvbXBhdGlibGUgdG8gdGhlXG4gKiBwbGF0Zm9ybSB3aGVyZSBpdCBpcyBnb2luZyB0byBiZSBpbnN0YWxsZWQgYW5kIHRlc3RlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwIC0gVGhlIGFjdHVhbCBwYXRoIHRvIHRoZSBhcHBsaWNhdGlvbiBidW5kbGVcbiAqIEBwYXJhbSB7UGxhdGZvcm1PcHRzfSBleHBlY3RlZFBsYXRmb3JtXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYnVuZGxlIGFyY2hpdGVjdHVyZSBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgZGV2aWNlIGFyY2hpdGVjdHVyZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5QXBwbGljYXRpb25QbGF0Zm9ybSAoYXBwLCBleHBlY3RlZFBsYXRmb3JtKSB7XG4gIGxvZy5kZWJ1ZygnVmVyaWZ5aW5nIGFwcGxpY2F0aW9uIHBsYXRmb3JtJyk7XG5cbiAgY29uc3Qgc3VwcG9ydGVkUGxhdGZvcm1zID0gYXdhaXQgZmV0Y2hTdXBwb3J0ZWRBcHBQbGF0Zm9ybXMuYmluZCh0aGlzKShhcHApO1xuICBsb2cuZGVidWcoYENGQnVuZGxlU3VwcG9ydGVkUGxhdGZvcm1zOiAke0pTT04uc3RyaW5naWZ5KHN1cHBvcnRlZFBsYXRmb3Jtcyl9YCk7XG5cbiAgY29uc3Qge1xuICAgIGlzU2ltdWxhdG9yLFxuICAgIGlzVHZPUyxcbiAgfSA9IGV4cGVjdGVkUGxhdGZvcm07XG4gIGNvbnN0IHByZWZpeCA9IGlzVHZPUyA/ICdBcHBsZVRWJyA6ICdpUGhvbmUnO1xuICBjb25zdCBzdWZmaXggPSBpc1NpbXVsYXRvciA/ICdTaW11bGF0b3InIDogJ09TJztcbiAgY29uc3QgZHN0UGxhdGZvcm0gPSBgJHtwcmVmaXh9JHtzdWZmaXh9YDtcbiAgaWYgKCFzdXBwb3J0ZWRQbGF0Zm9ybXMuaW5jbHVkZXMoZHN0UGxhdGZvcm0pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2lzU2ltdWxhdG9yID8gJ1NpbXVsYXRvcicgOiAnUmVhbCBkZXZpY2UnfSBhcmNoaXRlY3R1cmUgaXMgdW5zdXBwb3J0ZWQgYnkgdGhlICcke2FwcH0nIGFwcGxpY2F0aW9uLiBgICtcbiAgICAgIGBNYWtlIHN1cmUgdGhlIGNvcnJlY3QgZGVwbG95bWVudCB0YXJnZXQgaGFzIGJlZW4gc2VsZWN0ZWQgZm9yIGl0cyBjb21waWxhdGlvbiBpbiBYY29kZS5gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUmVzb3VyY2UgKHJlc291cmNlUGF0aCkge1xuICBjb25zdCBkYXRhID0gYXdhaXQgcGxpc3QucGFyc2VQbGlzdEZpbGUocmVzb3VyY2VQYXRoKTtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIF8udG9QYWlycyhkYXRhKSkge1xuICAgIHJlc3VsdFtrZXldID0gXy5pc1N0cmluZyh2YWx1ZSkgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBwYXJzZUxvY2FsaXphYmxlU3RyaW5ncyAob3B0cykge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxhbmd1YWdlID0gJ2VuJyxcbiAgICBsb2NhbGl6YWJsZVN0cmluZ3NEaXIsXG4gICAgc3RyaW5nRmlsZSxcbiAgICBzdHJpY3RNb2RlLFxuICB9ID0gb3B0cztcblxuICBpZiAoIWFwcCkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBgU3RyaW5ncyBleHRyYWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaWYgJ2FwcCcgY2FwYWJpbGl0eSBpcyBub3Qgc2V0YDtcbiAgICBpZiAoc3RyaWN0TW9kZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICBsb2cuaW5mbyhtZXNzYWdlKTtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBsZXQgbHByb2pSb290O1xuICBmb3IgKGNvbnN0IHN1YmZvbGRlciBvZiBbYCR7bGFuZ3VhZ2V9Lmxwcm9qYCwgbG9jYWxpemFibGVTdHJpbmdzRGlyLCAnJ10pIHtcbiAgICBscHJvalJvb3QgPSBwYXRoLnJlc29sdmUoYXBwLCBzdWJmb2xkZXIpO1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMobHByb2pSb290KSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2UgPSBgTm8gJyR7bHByb2pSb290fScgcmVzb3VyY2VzIGZvbGRlciBoYXMgYmVlbiBmb3VuZGA7XG4gICAgaWYgKHN0cmljdE1vZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKG1lc3NhZ2UpO1xuICB9XG4gIGxvZy5pbmZvKGBXaWxsIGV4dHJhY3QgcmVzb3VyY2Ugc3RyaW5ncyBmcm9tICcke2xwcm9qUm9vdH0nYCk7XG5cbiAgY29uc3QgcmVzb3VyY2VQYXRocyA9IFtdO1xuICBpZiAoc3RyaW5nRmlsZSkge1xuICAgIGNvbnN0IGRzdFBhdGggPSBwYXRoLnJlc29sdmUobHByb2pSb290LCBzdHJpbmdGaWxlKTtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGRzdFBhdGgpKSB7XG4gICAgICByZXNvdXJjZVBhdGhzLnB1c2goZHN0UGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgTm8gJyR7ZHN0UGF0aH0nIHJlc291cmNlIGZpbGUgaGFzIGJlZW4gZm91bmQgZm9yICcke2FwcH0nYDtcbiAgICAgIGlmIChzdHJpY3RNb2RlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKG1lc3NhZ2UpO1xuICAgICAgbG9nLmluZm8oYEdldHRpbmcgYWxsIHRoZSBhdmFpbGFibGUgc3RyaW5ncyBmcm9tICcke2xwcm9qUm9vdH0nYCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKF8uaXNFbXB0eShyZXNvdXJjZVBhdGhzKSAmJiBhd2FpdCBmcy5leGlzdHMobHByb2pSb290KSkge1xuICAgIGNvbnN0IHJlc291cmNlRmlsZXMgPSAoYXdhaXQgZnMucmVhZGRpcihscHJvalJvb3QpKVxuICAgICAgLmZpbHRlcigobmFtZSkgPT4gXy5zb21lKFtTVFJJTkdTX1JFU09VUkNFLCBTVFJJTkdTRElDVF9SRVNPVVJDRV0sICh4KSA9PiBuYW1lLmVuZHNXaXRoKHgpKSlcbiAgICAgIC5tYXAoKG5hbWUpID0+IHBhdGgucmVzb2x2ZShscHJvalJvb3QsIG5hbWUpKTtcbiAgICByZXNvdXJjZVBhdGhzLnB1c2goLi4ucmVzb3VyY2VGaWxlcyk7XG4gIH1cbiAgbG9nLmluZm8oYEdvdCAke3Jlc291cmNlUGF0aHMubGVuZ3RofSByZXNvdXJjZSBmaWxlKHMpIGluICcke2xwcm9qUm9vdH0nYCk7XG5cbiAgaWYgKF8uaXNFbXB0eShyZXNvdXJjZVBhdGhzKSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdFN0cmluZ3MgPSB7fTtcbiAgY29uc3QgdG9BYnNvbHV0ZVBhdGggPSBmdW5jdGlvbiAocCkge1xuICAgIHJldHVybiBwYXRoLmlzQWJzb2x1dGUocCkgPyBwIDogcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHApO1xuICB9O1xuICBmb3IgKGNvbnN0IHJlc291cmNlUGF0aCBvZiByZXNvdXJjZVBhdGhzKSB7XG4gICAgaWYgKCF1dGlsLmlzU3ViUGF0aCh0b0Fic29sdXRlUGF0aChyZXNvdXJjZVBhdGgpLCB0b0Fic29sdXRlUGF0aChhcHApKSkge1xuICAgICAgLy8gc2VjdXJpdHkgcHJlY2F1dGlvblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtyZXNvdXJjZVBhdGh9JyBpcyBleHBlY3RlZCB0byBiZSBsb2NhdGVkIHVuZGVyICcke2FwcH0nYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVhZFJlc291cmNlKHJlc291cmNlUGF0aCk7XG4gICAgICBsb2cuZGVidWcoYFBhcnNlZCAke18ua2V5cyhkYXRhKS5sZW5ndGh9IHN0cmluZyhzKSBmcm9tICcke3Jlc291cmNlUGF0aH0nYCk7XG4gICAgICBfLm1lcmdlKHJlc3VsdFN0cmluZ3MsIGRhdGEpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy53YXJuKGBDYW5ub3QgcGFyc2UgJyR7cmVzb3VyY2VQYXRofScgcmVzb3VyY2UuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBsb2cuaW5mbyhgR290ICR7Xy5rZXlzKHJlc3VsdFN0cmluZ3MpLmxlbmd0aH0gc3RyaW5nKHMpIGZyb20gJyR7bHByb2pSb290fSdgKTtcbiAgcmV0dXJuIHJlc3VsdFN0cmluZ3M7XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gcGF0aCBvbiB0aGUgZmlsZSBzeXN0ZW0gcG9pbnRzIHRvIHRoZSAuYXBwIGJ1bmRsZSByb290XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggUG9zc2libGUgLmFwcCBidW5kbGUgcm9vdFxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIHBhdGggcG9pbnRzIHRvIGFuIC5hcHAgYnVuZGxlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzQXBwQnVuZGxlIChhcHBQYXRoKSB7XG4gIHJldHVybiBfLmVuZHNXaXRoKF8udG9Mb3dlcihhcHBQYXRoKSwgQVBQX0VYVClcbiAgICAmJiAoYXdhaXQgZnMuc3RhdChhcHBQYXRoKSkuaXNEaXJlY3RvcnkoKVxuICAgICYmIGF3YWl0IGZzLmV4aXN0cyhwYXRoLmpvaW4oYXBwUGF0aCwgJ0luZm8ucGxpc3QnKSk7XG59XG5cbi8qKlxuICogRXh0cmFjdCB0aGUgZ2l2ZW4gYXJjaGl2ZSBhbmQgbG9va3MgZm9yIGl0ZW1zIHdpdGggZ2l2ZW4gZXh0ZW5zaW9ucyBpbiBpdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmNoaXZlUGF0aCBGdWxsIHBhdGggdG8gYSAuemlwIGFyY2hpdmVcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gYXBwRXh0ZW5zaW9ucyBMaXN0IG9mIG1hdGNoaW5nIGl0ZW0gZXh0ZW5zaW9uc1xuICogQHJldHVybnMge1Byb21pc2U8W3N0cmluZywgc3RyaW5nW11dPn0gVHVwbGUsIHdoZXJlIHRoZSBmaXJzdCBlbGVtZW50IHBvaW50cyB0b1xuICogYSB0ZW1wb3JhcnkgZm9sZGVyIHJvb3Qgd2hlcmUgdGhlIGFyY2hpdmUgaGFzIGJlZW4gZXh0cmFjdGVkIGFuZCB0aGUgc2Vjb25kIGl0ZW1cbiAqIGNvbnRhaW5zIGEgbGlzdCBvZiByZWxhdGl2ZSBwYXRocyB0byBtYXRjaGVkIGl0ZW1zXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpbmRBcHBzIChhcmNoaXZlUGF0aCwgYXBwRXh0ZW5zaW9ucykge1xuICBjb25zdCB1c2VTeXN0ZW1VbnppcEVudiA9IHByb2Nlc3MuZW52LkFQUElVTV9QUkVGRVJfU1lTVEVNX1VOWklQO1xuICBjb25zdCB1c2VTeXN0ZW1VbnppcCA9IF8uaXNFbXB0eSh1c2VTeXN0ZW1VbnppcEVudilcbiAgICB8fCAhWycwJywgJ2ZhbHNlJ10uaW5jbHVkZXMoXy50b0xvd2VyKHVzZVN5c3RlbVVuemlwRW52KSk7XG4gIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgYXdhaXQgemlwLmV4dHJhY3RBbGxUbyhhcmNoaXZlUGF0aCwgdG1wUm9vdCwge3VzZVN5c3RlbVVuemlwfSk7XG4gIGNvbnN0IGdsb2JQYXR0ZXJuID0gYCoqLyouKygke2FwcEV4dGVuc2lvbnMubWFwKChleHQpID0+IGV4dC5yZXBsYWNlKC9eXFwuLywgJycpKS5qb2luKCd8Jyl9KWA7XG4gIGNvbnN0IHNvcnRlZEJ1bmRsZUl0ZW1zID0gKGF3YWl0IGZzLmdsb2IoZ2xvYlBhdHRlcm4sIHtcbiAgICBjd2Q6IHRtcFJvb3QsXG4gICAgc3RyaWN0OiBmYWxzZSxcbiAgfSkpLnNvcnQoKGEsIGIpID0+IGEuc3BsaXQocGF0aC5zZXApLmxlbmd0aCAtIGIuc3BsaXQocGF0aC5zZXApLmxlbmd0aCk7XG4gIHJldHVybiBbdG1wUm9vdCwgc29ydGVkQnVuZGxlSXRlbXNdO1xufVxuXG4vKipcbiAqIE1vdmVzIHRoZSBhcHBsaWNhdGlvbiBidW5kbGUgdG8gYSBuZXdseSBjcmVhdGVkIHRlbXBvcmFyeSBmb2xkZXJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwUm9vdCBGdWxsIHBhdGggdG8gdGhlIC5hcHAgYnVuZGxlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBUaGUgbmV3IHBhdGggdG8gdGhlIGFwcCBidW5kbGUuXG4gKiBUaGUgbmFtZSBvZiB0aGUgYXBwIGJ1bmRsZSByZW1haW5zIHRob3VnaFxuICovXG5hc3luYyBmdW5jdGlvbiBpc29sYXRlQXBwQnVuZGxlIChhcHBSb290KSB7XG4gIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgY29uc3QgZHN0Um9vdCA9IHBhdGguam9pbih0bXBSb290LCBwYXRoLmJhc2VuYW1lKGFwcFJvb3QpKTtcbiAgYXdhaXQgZnMubXYoYXBwUm9vdCwgZHN0Um9vdCwge21rZGlycDogdHJ1ZX0pO1xuICByZXR1cm4gZHN0Um9vdDtcbn1cblxuZXhwb3J0IHtcbiAgZXh0cmFjdEJ1bmRsZUlkLCB2ZXJpZnlBcHBsaWNhdGlvblBsYXRmb3JtLCBwYXJzZUxvY2FsaXphYmxlU3RyaW5ncyxcbiAgU0FGQVJJX0JVTkRMRV9JRCwgZmV0Y2hTdXBwb3J0ZWRBcHBQbGF0Zm9ybXMsIEFQUF9FWFQsIElQQV9FWFQsXG4gIGlzQXBwQnVuZGxlLCBmaW5kQXBwcywgaXNvbGF0ZUFwcEJ1bmRsZSwgZXh0cmFjdEJ1bmRsZVZlcnNpb24sXG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsS0FBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsUUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsT0FBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBRUEsTUFBTUksb0JBQW9CLEdBQUcsY0FBYztBQUMzQyxNQUFNQyxnQkFBZ0IsR0FBRyxVQUFVO0FBQ25DLE1BQU1DLGdCQUFnQixHQUFHLHdCQUF3QjtBQUFDQyxPQUFBLENBQUFELGdCQUFBLEdBQUFBLGdCQUFBO0FBQ2xELE1BQU1FLE9BQU8sR0FBRyxNQUFNO0FBQUNELE9BQUEsQ0FBQUMsT0FBQSxHQUFBQSxPQUFBO0FBQ3ZCLE1BQU1DLE9BQU8sR0FBRyxNQUFNO0FBQUNGLE9BQUEsQ0FBQUUsT0FBQSxHQUFBQSxPQUFBO0FBQ3ZCLE1BQU1DLFdBQVcsR0FBRyxJQUFJQyxP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
|
|
234
|
+
exports.isolateAppBundle = isolateAppBundle;
|
|
235
|
+
//# sourceMappingURL=app-utils.js.map
|