testcafe 1.13.0 → 1.14.2

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.
Files changed (336) hide show
  1. package/CHANGELOG.md +88 -10
  2. package/LICENSE +21 -21
  3. package/README.md +52 -48
  4. package/bin/testcafe-with-v8-flag-filter.js +0 -0
  5. package/lib/api/exportable-lib/index.js +50 -50
  6. package/lib/api/request-hooks/assert-type.js +7 -7
  7. package/lib/api/request-hooks/hook-method-names.js +11 -0
  8. package/lib/api/request-hooks/hook.js +33 -39
  9. package/lib/api/request-hooks/interfaces.js +3 -3
  10. package/lib/api/request-hooks/request-logger.js +113 -111
  11. package/lib/api/request-hooks/request-mock/create-request-mock.js +12 -0
  12. package/lib/api/request-hooks/request-mock/index.js +46 -0
  13. package/lib/api/request-hooks/request-mock.js +47 -48
  14. package/lib/api/structure/base-unit.js +11 -11
  15. package/lib/api/structure/fixture.js +75 -75
  16. package/lib/api/structure/interfaces.js +2 -2
  17. package/lib/api/structure/test-file.js +31 -31
  18. package/lib/api/structure/test-timeout.js +9 -9
  19. package/lib/api/structure/test.js +85 -85
  20. package/lib/api/structure/testing-unit.js +89 -89
  21. package/lib/api/structure/unit-type.js +9 -9
  22. package/lib/api/test-controller/assertion.js +88 -88
  23. package/lib/api/test-controller/execution-context.js +82 -82
  24. package/lib/api/test-controller/index.js +359 -319
  25. package/lib/api/test-controller/proxy.js +28 -28
  26. package/lib/api/test-page-url.js +60 -60
  27. package/lib/api/test-run-tracker.js +68 -68
  28. package/lib/api/wrap-test-function.js +49 -49
  29. package/lib/assertions/executor.js +74 -74
  30. package/lib/assertions/get-fn.js +46 -46
  31. package/lib/assertions/type.js +20 -20
  32. package/lib/assets/content-types.js +9 -9
  33. package/lib/assets/injectables.js +18 -18
  34. package/lib/browser/connection/command.js +10 -10
  35. package/lib/browser/connection/error-hints.js +9 -9
  36. package/lib/browser/connection/gateway.js +159 -159
  37. package/lib/browser/connection/get-hints.js +33 -33
  38. package/lib/browser/connection/heartbeat-status.js +8 -8
  39. package/lib/browser/connection/index.js +328 -328
  40. package/lib/browser/connection/remotes-queue.js +46 -46
  41. package/lib/browser/connection/service-routes.js +12 -12
  42. package/lib/browser/connection/status.js +12 -12
  43. package/lib/browser/interfaces.js +2 -2
  44. package/lib/browser/provider/built-in/dedicated/base.js +80 -80
  45. package/lib/browser/provider/built-in/dedicated/chrome/browser-client.js +204 -204
  46. package/lib/browser/provider/built-in/dedicated/chrome/build-chrome-args.js +17 -17
  47. package/lib/browser/provider/built-in/dedicated/chrome/config.js +110 -110
  48. package/lib/browser/provider/built-in/dedicated/chrome/create-temp-profile.js +45 -45
  49. package/lib/browser/provider/built-in/dedicated/chrome/elapsed-upperbounds.js +15 -15
  50. package/lib/browser/provider/built-in/dedicated/chrome/index.js +102 -102
  51. package/lib/browser/provider/built-in/dedicated/chrome/interfaces.js +2 -2
  52. package/lib/browser/provider/built-in/dedicated/chrome/local-chrome.js +24 -24
  53. package/lib/browser/provider/built-in/dedicated/chrome/runtime-info.js +29 -29
  54. package/lib/browser/provider/built-in/dedicated/edge/index.js +10 -10
  55. package/lib/browser/provider/built-in/dedicated/edge/runtime-info.js +29 -29
  56. package/lib/browser/provider/built-in/dedicated/firefox/config.js +33 -33
  57. package/lib/browser/provider/built-in/dedicated/firefox/create-temp-profile.js +78 -78
  58. package/lib/browser/provider/built-in/dedicated/firefox/index.js +73 -73
  59. package/lib/browser/provider/built-in/dedicated/firefox/local-firefox.js +36 -36
  60. package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/commands.js +13 -13
  61. package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/index.js +200 -200
  62. package/lib/browser/provider/built-in/dedicated/firefox/runtime-info.js +17 -17
  63. package/lib/browser/provider/built-in/index.js +21 -21
  64. package/lib/browser/provider/built-in/locally-installed.js +30 -30
  65. package/lib/browser/provider/built-in/path.js +47 -47
  66. package/lib/browser/provider/built-in/remote.js +58 -58
  67. package/lib/browser/provider/index.js +303 -303
  68. package/lib/browser/provider/parse-provider-name.js +16 -16
  69. package/lib/browser/provider/plugin-host.js +121 -121
  70. package/lib/browser/provider/pool.js +115 -115
  71. package/lib/browser/provider/utils/argument-parsing.js +74 -74
  72. package/lib/browser/provider/utils/browser-starter.js +34 -34
  73. package/lib/browser/provider/utils/client-functions.js +24 -24
  74. package/lib/browser/provider/utils/get-maximized-headless-window-size.js +9 -9
  75. package/lib/cli/argument-parser.js +284 -279
  76. package/lib/cli/authentication-helper.js +35 -35
  77. package/lib/cli/cli.js +134 -134
  78. package/lib/cli/correct-browsers-and-sources.js +40 -40
  79. package/lib/cli/index.js +19 -19
  80. package/lib/cli/log.js +43 -43
  81. package/lib/cli/remotes-wizard.js +36 -36
  82. package/lib/cli/termination-handler.js +38 -38
  83. package/lib/client/automation/index.js +144 -46
  84. package/lib/client/automation/index.min.js +1 -1
  85. package/lib/client/browser/idle-page/index.html.mustache +35 -35
  86. package/lib/client/browser/idle-page/logo.svg +86 -86
  87. package/lib/client/browser/service-worker.js +4 -6
  88. package/lib/client/core/index.js +19 -13
  89. package/lib/client/core/index.min.js +1 -1
  90. package/lib/client/driver/index.js +1807 -451
  91. package/lib/client/driver/index.min.js +1 -1
  92. package/lib/client/driver/internal-properties.js +9 -9
  93. package/lib/client/test-run/iframe.js.mustache +17 -17
  94. package/lib/client/test-run/index.js.mustache +51 -51
  95. package/lib/client/ui/index.js +14 -12
  96. package/lib/client/ui/index.min.js +1 -1
  97. package/lib/client/ui/sprite.svg +42 -42
  98. package/lib/client-functions/builder-symbol.js +4 -4
  99. package/lib/client-functions/client-function-builder.js +156 -135
  100. package/lib/client-functions/replicator.js +61 -61
  101. package/lib/client-functions/return-single-prop-mode.js +8 -8
  102. package/lib/client-functions/selector-api-execution-mode.js +22 -0
  103. package/lib/client-functions/selectors/add-api.js +646 -588
  104. package/lib/client-functions/selectors/create-snapshot-methods.js +13 -13
  105. package/lib/client-functions/selectors/prepare-api-args.js +20 -20
  106. package/lib/client-functions/selectors/selector-attribute-filter.js +22 -22
  107. package/lib/client-functions/selectors/selector-builder.js +154 -150
  108. package/lib/client-functions/selectors/selector-text-filter.js +43 -43
  109. package/lib/client-functions/selectors/snapshot-properties.js +48 -48
  110. package/lib/client-functions/types.js +18 -18
  111. package/lib/compiler/babel/format-babel-produced-code.js +10 -10
  112. package/lib/compiler/babel/get-base-babel-options.js +11 -11
  113. package/lib/compiler/babel/load-libs.js +64 -62
  114. package/lib/compiler/babel/preset-stage-2.js +19 -19
  115. package/lib/compiler/compile-client-function.js +73 -73
  116. package/lib/compiler/compilers.js +33 -33
  117. package/lib/compiler/index.js +92 -92
  118. package/lib/compiler/interfaces.js +2 -2
  119. package/lib/compiler/test-file/api-based.js +146 -146
  120. package/lib/compiler/test-file/base.js +36 -36
  121. package/lib/compiler/test-file/exportble-lib-path.js +5 -5
  122. package/lib/compiler/test-file/formats/coffeescript/compiler.js +38 -38
  123. package/lib/compiler/test-file/formats/coffeescript/get-test-list.js +29 -29
  124. package/lib/compiler/test-file/formats/es-next/compiler.js +43 -43
  125. package/lib/compiler/test-file/formats/es-next/get-test-list.js +166 -166
  126. package/lib/compiler/test-file/formats/es-next/is-flow-code.js +7 -7
  127. package/lib/compiler/test-file/formats/raw.js +85 -85
  128. package/lib/compiler/test-file/formats/typescript/compiler.js +135 -135
  129. package/lib/compiler/test-file/formats/typescript/get-test-list.js +185 -185
  130. package/lib/compiler/test-file/test-file-parser-base.js +214 -214
  131. package/lib/configuration/configuration-base.js +165 -165
  132. package/lib/configuration/constants.js +9 -9
  133. package/lib/configuration/customizable-compilers.js +7 -7
  134. package/lib/configuration/default-values.js +51 -51
  135. package/lib/configuration/interfaces.js +3 -3
  136. package/lib/configuration/option-names.js +53 -53
  137. package/lib/configuration/option-source.js +9 -9
  138. package/lib/configuration/option.js +14 -14
  139. package/lib/configuration/quarantine-option-names.js +10 -0
  140. package/lib/configuration/run-option-names.js +26 -26
  141. package/lib/configuration/screenshot-option-names.js +10 -10
  142. package/lib/configuration/testcafe-configuration.js +164 -165
  143. package/lib/configuration/types.js +2 -2
  144. package/lib/configuration/typescript-configuration.js +62 -62
  145. package/lib/custom-client-scripts/assert-type.js +7 -7
  146. package/lib/custom-client-scripts/client-script-init.js +3 -3
  147. package/lib/custom-client-scripts/client-script.js +107 -108
  148. package/lib/custom-client-scripts/get-code.js +11 -11
  149. package/lib/custom-client-scripts/get-url.js +6 -6
  150. package/lib/custom-client-scripts/load.js +15 -15
  151. package/lib/custom-client-scripts/problematic-scripts.js +2 -2
  152. package/lib/custom-client-scripts/routing.js +36 -36
  153. package/lib/custom-client-scripts/utils.js +60 -60
  154. package/lib/embedding-utils.js +83 -83
  155. package/lib/errors/create-stack-filter.js +18 -18
  156. package/lib/errors/error-list.js +26 -26
  157. package/lib/errors/get-callsite.js +31 -31
  158. package/lib/errors/internal-modules-prefix.js +8 -8
  159. package/lib/errors/is-internal-stack-frame.js +46 -46
  160. package/lib/errors/process-test-fn-error.js +37 -37
  161. package/lib/errors/runtime/index.js +123 -123
  162. package/lib/errors/runtime/templates.js +116 -114
  163. package/lib/errors/runtime/type-assertions.js +112 -112
  164. package/lib/errors/stack-cleaning-hook.js +64 -64
  165. package/lib/errors/test-run/formattable-adapter.js +59 -59
  166. package/lib/errors/test-run/index.js +302 -302
  167. package/lib/errors/test-run/render-error-template.js +31 -31
  168. package/lib/errors/test-run/templates.js +93 -95
  169. package/lib/errors/test-run/utils.js +90 -85
  170. package/lib/errors/types.js +157 -155
  171. package/lib/index.js +81 -81
  172. package/lib/live/bootstrapper.js +44 -44
  173. package/lib/live/controller.js +107 -107
  174. package/lib/live/file-watcher/index.js +67 -67
  175. package/lib/live/file-watcher/modules-graph.js +58 -58
  176. package/lib/live/keyboard-observer.js +76 -76
  177. package/lib/live/logger/index.js +64 -64
  178. package/lib/live/test-run-controller.js +96 -96
  179. package/lib/live/test-run-state.js +6 -6
  180. package/lib/live/test-run.js +56 -56
  181. package/lib/live/test-runner.js +168 -168
  182. package/lib/load-assets.js +29 -29
  183. package/lib/notifications/add-rendered-warning.js +16 -16
  184. package/lib/notifications/debug-logger.js +78 -78
  185. package/lib/notifications/deprecated.js +24 -24
  186. package/lib/notifications/information-message.js +12 -12
  187. package/lib/notifications/warning-log.js +32 -31
  188. package/lib/notifications/warning-message.js +48 -48
  189. package/lib/reporter/command/command-formatter.js +120 -109
  190. package/lib/reporter/command/format-command.js +8 -8
  191. package/lib/reporter/command/interfaces.js +2 -2
  192. package/lib/reporter/index.js +319 -314
  193. package/lib/reporter/interfaces.js +2 -2
  194. package/lib/reporter/plugin-host.js +136 -137
  195. package/lib/reporter/plugin-methods.js +12 -12
  196. package/lib/role/index.js +74 -74
  197. package/lib/role/marker-symbol.js +7 -7
  198. package/lib/role/phase.js +9 -9
  199. package/lib/runner/bootstrapper.js +272 -272
  200. package/lib/runner/browser-job-result.js +9 -9
  201. package/lib/runner/browser-job.js +153 -123
  202. package/lib/runner/browser-set.js +114 -114
  203. package/lib/runner/fixture-hook-controller.js +85 -85
  204. package/lib/runner/index.js +450 -442
  205. package/lib/runner/interfaces.js +3 -3
  206. package/lib/runner/reporter-stream-controller.js +28 -28
  207. package/lib/runner/task/index.js +152 -133
  208. package/lib/runner/task/phase.js +9 -9
  209. package/lib/runner/test-run-controller.js +166 -185
  210. package/lib/runner/tested-app.js +73 -72
  211. package/lib/screenshots/capturer.js +141 -141
  212. package/lib/screenshots/constants.js +11 -11
  213. package/lib/screenshots/crop.js +111 -111
  214. package/lib/screenshots/default-extension.js +4 -4
  215. package/lib/screenshots/index.js +67 -67
  216. package/lib/screenshots/utils.js +39 -39
  217. package/lib/services/compiler/host.js +190 -106
  218. package/lib/services/compiler/io.js +9 -9
  219. package/lib/services/compiler/protocol.js +17 -16
  220. package/lib/services/compiler/service.js +225 -106
  221. package/lib/services/compiler/test-run-proxy.js +111 -73
  222. package/lib/services/interfaces.js +3 -0
  223. package/lib/services/process-title.js +8 -8
  224. package/lib/services/serialization/prepare-options.js +17 -17
  225. package/lib/services/serialization/replicator/create-replicator.js +27 -0
  226. package/lib/services/serialization/replicator/custom-error-transform.js +28 -0
  227. package/lib/services/serialization/test-structure.js +93 -77
  228. package/lib/services/utils/ipc/interfaces.js +30 -30
  229. package/lib/services/utils/ipc/io.js +108 -108
  230. package/lib/services/utils/ipc/message.js +76 -73
  231. package/lib/services/utils/ipc/packet.js +55 -55
  232. package/lib/services/utils/ipc/proxy.js +110 -118
  233. package/lib/services/utils/ipc/transport.js +64 -64
  234. package/lib/shared/errors/index.js +382 -382
  235. package/lib/shared/node-modules-folder-name.js +4 -4
  236. package/lib/test-run/bookmark.js +90 -90
  237. package/lib/test-run/browser-console-messages.js +73 -73
  238. package/lib/test-run/browser-manipulation-queue.js +92 -92
  239. package/lib/test-run/client-messages.js +9 -9
  240. package/lib/test-run/commands/actions.js +486 -425
  241. package/lib/test-run/commands/assertion.js +45 -45
  242. package/lib/test-run/commands/base.js +14 -14
  243. package/lib/test-run/commands/browser-manipulation.js +95 -95
  244. package/lib/test-run/commands/from-object.js +82 -82
  245. package/lib/test-run/commands/observation.js +61 -61
  246. package/lib/test-run/commands/options.js +231 -215
  247. package/lib/test-run/commands/service.js +54 -48
  248. package/lib/test-run/commands/type.js +65 -60
  249. package/lib/test-run/commands/utils.js +87 -87
  250. package/lib/test-run/commands/validations/argument.js +90 -90
  251. package/lib/test-run/commands/validations/factories.js +47 -47
  252. package/lib/test-run/commands/validations/initializers.js +44 -44
  253. package/lib/test-run/debug-log.js +32 -32
  254. package/lib/test-run/execute-js-expression.js +74 -74
  255. package/lib/test-run/index.js +823 -752
  256. package/lib/test-run/marker-symbol.js +7 -7
  257. package/lib/test-run/observed-callsites-storage.js +17 -17
  258. package/lib/test-run/phase.js +16 -16
  259. package/lib/test-run/session-controller.js +104 -104
  260. package/lib/testcafe.js +119 -114
  261. package/lib/utils/assignable.js +39 -39
  262. package/lib/utils/async-event-emitter.js +28 -28
  263. package/lib/utils/async-queue.js +14 -14
  264. package/lib/utils/browser-connection-timeouts.js +19 -19
  265. package/lib/utils/callsite.js +17 -17
  266. package/lib/utils/check-file-path.js +31 -31
  267. package/lib/utils/check-url.js +51 -51
  268. package/lib/utils/convert-to-best-fit-type.js +16 -16
  269. package/lib/utils/correct-file-path.js +21 -21
  270. package/lib/utils/define-lazy-property.js +13 -13
  271. package/lib/utils/delay.js +6 -6
  272. package/lib/utils/delegated-api.js +44 -44
  273. package/lib/utils/detect-display.js +6 -6
  274. package/lib/utils/detect-ffmpeg.js +44 -44
  275. package/lib/utils/diff/colors.js +29 -29
  276. package/lib/utils/diff/index.js +53 -53
  277. package/lib/utils/diff/util.js +24 -22
  278. package/lib/utils/diff.js +29 -29
  279. package/lib/utils/escape-user-agent.js +10 -10
  280. package/lib/utils/flag-list.js +17 -17
  281. package/lib/utils/get-any-key.js +8 -8
  282. package/lib/utils/get-browser.js +8 -8
  283. package/lib/utils/get-common-path.js +34 -34
  284. package/lib/utils/get-filter-fn.js +40 -40
  285. package/lib/utils/get-options/base.js +36 -36
  286. package/lib/utils/get-options/compiler.js +33 -33
  287. package/lib/utils/get-options/grep.js +15 -15
  288. package/lib/utils/get-options/index.js +21 -19
  289. package/lib/utils/get-options/meta.js +22 -22
  290. package/lib/utils/get-options/quarantine.js +92 -0
  291. package/lib/utils/get-options/screenshot.js +17 -17
  292. package/lib/utils/get-options/ssl.js +45 -45
  293. package/lib/utils/get-options/video.js +10 -10
  294. package/lib/utils/get-viewport-width.js +18 -18
  295. package/lib/utils/guard-time-execution.js +10 -10
  296. package/lib/utils/handle-errors.js +74 -74
  297. package/lib/utils/handle-tag-args.js +8 -8
  298. package/lib/utils/http.js +30 -30
  299. package/lib/utils/is-localhost.js +11 -11
  300. package/lib/utils/is-password-input.js +11 -0
  301. package/lib/utils/is-repl.js +12 -0
  302. package/lib/utils/is-window-in-iframe.js +6 -6
  303. package/lib/utils/limit-number.js +10 -10
  304. package/lib/utils/make-reg-exp.js +7 -7
  305. package/lib/utils/moment-loader.js +20 -20
  306. package/lib/utils/parse-file-list.js +71 -71
  307. package/lib/utils/parse-user-agent.js +55 -55
  308. package/lib/utils/path-pattern.js +114 -114
  309. package/lib/utils/prepare-reporters.js +30 -30
  310. package/lib/utils/prerender-callsite.js +18 -18
  311. package/lib/utils/process.js +119 -119
  312. package/lib/utils/promisified-functions.js +46 -46
  313. package/lib/utils/re-executable-promise.js +39 -39
  314. package/lib/utils/render-callsite-sync.js +29 -29
  315. package/lib/utils/render-template.js +10 -10
  316. package/lib/utils/reporter.js +30 -30
  317. package/lib/utils/resolve-path-relatively-cwd.js +7 -7
  318. package/lib/utils/string.js +105 -105
  319. package/lib/utils/temp-directory/cleanup-process/commands.js +7 -7
  320. package/lib/utils/temp-directory/cleanup-process/index.js +143 -143
  321. package/lib/utils/temp-directory/cleanup-process/worker.js +58 -58
  322. package/lib/utils/temp-directory/index.js +87 -87
  323. package/lib/utils/temp-directory/lockfile.js +56 -56
  324. package/lib/utils/thennable.js +7 -7
  325. package/lib/utils/timer.js +15 -15
  326. package/lib/utils/to-posix-path.js +8 -8
  327. package/lib/utils/types.js +2 -2
  328. package/lib/video-recorder/interfaces.js +2 -2
  329. package/lib/video-recorder/process.js +126 -126
  330. package/lib/video-recorder/recorder.js +136 -136
  331. package/lib/video-recorder/test-run-video-recorder.js +69 -69
  332. package/lib/video-recorder/videos.js +37 -37
  333. package/package.json +7 -7
  334. package/ts-defs/index.d.ts +109 -17
  335. package/ts-defs/selectors.d.ts +95 -7
  336. package/ts-defs/testcafe-scripts.d.ts +96 -8
@@ -1,201 +1,201 @@
1
- "use strict";
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
- const net_1 = require("net");
7
- const promisify_event_1 = __importDefault(require("promisify-event"));
8
- const events_1 = __importDefault(require("events"));
9
- const delay_1 = __importDefault(require("../../../../../../utils/delay"));
10
- const client_functions_1 = require("../../../../utils/client-functions");
11
- const commands_1 = __importDefault(require("./commands"));
12
- const CONNECTION_TIMEOUT = 30000;
13
- const CONNECTION_RETRY_DELAY = 300;
14
- const MAX_RESIZE_RETRY_COUNT = 2;
15
- const HEADER_SEPARATOR = ':';
16
- module.exports = class MarionetteClient {
17
- constructor(port = 2828, runtimeInfo, host = '127.0.0.1') {
18
- this.currentPacketNumber = 1;
19
- this.events = new events_1.default();
20
- this.port = port;
21
- this.host = host;
22
- this.socket = new net_1.Socket();
23
- this.buffer = Buffer.alloc(0);
24
- this.getPacketPromise = Promise.resolve();
25
- this.sendPacketPromise = Promise.resolve();
26
- this._runtimeInfo = runtimeInfo;
27
- this._windowHandles = {};
28
- this.protocolInfo = {
29
- applicationType: '',
30
- marionetteProtocol: '',
31
- };
32
- this.sessionInfo = null;
33
- }
34
- get activeWindowId() {
35
- return this._runtimeInfo.activeWindowId;
36
- }
37
- async _attemptToConnect(port, host) {
38
- this.socket.connect(port, host);
39
- const connectionPromise = Promise.race([
40
- promisify_event_1.default(this.socket, 'connect'),
41
- promisify_event_1.default(this.socket, 'error')
42
- ]);
43
- return await connectionPromise
44
- .then(() => true)
45
- .catch(() => {
46
- this.socket.removeAllListeners('connect');
47
- return delay_1.default(CONNECTION_RETRY_DELAY);
48
- });
49
- }
50
- async _connectSocket(port, host) {
51
- const connectionStartTime = Date.now();
52
- let connected = await this._attemptToConnect(port, host);
53
- while (!connected && Date.now() - connectionStartTime < CONNECTION_TIMEOUT)
54
- connected = await this._attemptToConnect(port, host);
55
- if (!connected)
56
- throw new Error('Unable to connect');
57
- this.socket.on('data', data => this._handleNewData(data));
58
- }
59
- async _writeSocket(message) {
60
- if (!this.socket.write(message))
61
- await promisify_event_1.default(this.socket, 'drain');
62
- }
63
- _handleNewData(data) {
64
- if (!data)
65
- return;
66
- this.buffer = Buffer.concat([this.buffer, data]);
67
- this.events.emit('new-data');
68
- }
69
- _getPacket() {
70
- this.getPacketPromise = this.getPacketPromise.then(async () => {
71
- let headerEndIndex = this.buffer.indexOf(HEADER_SEPARATOR);
72
- while (headerEndIndex < 0) {
73
- await promisify_event_1.default(this.events, 'new-data');
74
- headerEndIndex = this.buffer.indexOf(HEADER_SEPARATOR);
75
- }
76
- const packet = {
77
- length: NaN,
78
- body: null
79
- };
80
- packet.length = parseInt(this.buffer.toString('utf8', 0, headerEndIndex), 10) || 0;
81
- const bodyStartIndex = headerEndIndex + HEADER_SEPARATOR.length;
82
- const bodyEndIndex = bodyStartIndex + packet.length;
83
- if (packet.length) {
84
- while (this.buffer.length < bodyEndIndex)
85
- await promisify_event_1.default(this.events, 'new-data');
86
- packet.body = JSON.parse(this.buffer.toString('utf8', bodyStartIndex, bodyEndIndex));
87
- }
88
- this.buffer = this.buffer.slice(bodyEndIndex);
89
- return packet;
90
- });
91
- return this.getPacketPromise;
92
- }
93
- _sendPacket(payload) {
94
- this.sendPacketPromise = this.sendPacketPromise.then(async () => {
95
- const body = [0, this.currentPacketNumber++, payload.command, payload.parameters];
96
- const serialized = JSON.stringify(body);
97
- const message = Buffer.byteLength(serialized, 'utf8') + HEADER_SEPARATOR + serialized;
98
- this._writeSocket(message);
99
- });
100
- return this.sendPacketPromise;
101
- }
102
- _throwMarionetteError(error) {
103
- throw new Error(`${error.error}${error.message ? ': ' + error.message : ''}`);
104
- }
105
- async _switchToWindow(windowHandle) {
106
- await this._getResponse({
107
- command: commands_1.default.switchToWindow,
108
- parameters: { handle: windowHandle }
109
- });
110
- }
111
- async _getActiveWindowHandle() {
112
- const windowHandles = await this._getResponse({
113
- command: commands_1.default.getWindowHandles
114
- });
115
- for (const handle of windowHandles) {
116
- await this._switchToWindow(handle);
117
- const title = await this._getResponse({ command: commands_1.default.getTitle });
118
- if (title.value.includes(this.activeWindowId))
119
- return handle;
120
- }
121
- return null;
122
- }
123
- async _ensureActiveWindow() {
124
- let handle = this._windowHandles[this.activeWindowId];
125
- if (handle) {
126
- await this._switchToWindow(handle);
127
- return;
128
- }
129
- handle = await this._getActiveWindowHandle();
130
- if (handle)
131
- this._windowHandles[this.activeWindowId] = handle;
132
- }
133
- async _request(packet) {
134
- await this._ensureActiveWindow();
135
- return this._getResponse(packet);
136
- }
137
- async _getResponse(packet) {
138
- const packetNumber = this.currentPacketNumber;
139
- await this._sendPacket(packet);
140
- let responsePacket = await this._getPacket();
141
- while (!responsePacket.body || responsePacket.body[1] !== packetNumber)
142
- responsePacket = await this._getPacket();
143
- if (responsePacket.body[2])
144
- this._throwMarionetteError(responsePacket.body[2]);
145
- return responsePacket.body[3];
146
- }
147
- async _getScreenshotRawData(fullPage = false) {
148
- return await this._request({
149
- command: commands_1.default.takeScreenshot,
150
- parameters: {
151
- full: fullPage,
152
- hash: false,
153
- scroll: false
154
- }
155
- });
156
- }
157
- async connect() {
158
- await this._connectSocket(this.port, this.host);
159
- const infoPacket = await this._getPacket();
160
- this.protocolInfo = {
161
- applicationType: infoPacket.body.applicationType,
162
- marionetteProtocol: infoPacket.body.marionetteProtocol
163
- };
164
- this.sessionInfo = await this._getResponse({ command: commands_1.default.newSession });
165
- }
166
- dispose() {
167
- this.socket.end();
168
- this.buffer = null;
169
- }
170
- async executeScript(code) {
171
- return await this._request({
172
- command: commands_1.default.executeScript,
173
- parameters: { script: `return (${code})()` }
174
- });
175
- }
176
- async getScreenshotData(fullPage) {
177
- const frameData = await this._getScreenshotRawData(fullPage);
178
- return Buffer.from(frameData.value, 'base64');
179
- }
180
- async setWindowSize(width, height) {
181
- let { value: pageRect } = await this.executeScript(client_functions_1.GET_WINDOW_DIMENSIONS_INFO_SCRIPT);
182
- let attemptCounter = 0;
183
- while (attemptCounter++ < MAX_RESIZE_RETRY_COUNT && (pageRect.width !== width || pageRect.height !== height)) {
184
- const currentRect = await this._request({ command: commands_1.default.getWindowRect });
185
- await this._request({
186
- command: commands_1.default.setWindowRect,
187
- parameters: {
188
- x: currentRect.x,
189
- y: currentRect.y,
190
- width: width + (currentRect.width - pageRect.width),
191
- height: height + (currentRect.height - pageRect.height)
192
- }
193
- });
194
- ({ value: pageRect } = await this.executeScript(client_functions_1.GET_WINDOW_DIMENSIONS_INFO_SCRIPT));
195
- }
196
- }
197
- async quit() {
198
- await this._request({ command: commands_1.default.quit });
199
- }
200
- };
1
+ "use strict";
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
+ const net_1 = require("net");
7
+ const promisify_event_1 = __importDefault(require("promisify-event"));
8
+ const events_1 = __importDefault(require("events"));
9
+ const delay_1 = __importDefault(require("../../../../../../utils/delay"));
10
+ const client_functions_1 = require("../../../../utils/client-functions");
11
+ const commands_1 = __importDefault(require("./commands"));
12
+ const CONNECTION_TIMEOUT = 30000;
13
+ const CONNECTION_RETRY_DELAY = 300;
14
+ const MAX_RESIZE_RETRY_COUNT = 2;
15
+ const HEADER_SEPARATOR = ':';
16
+ module.exports = class MarionetteClient {
17
+ constructor(port = 2828, runtimeInfo, host = '127.0.0.1') {
18
+ this.currentPacketNumber = 1;
19
+ this.events = new events_1.default();
20
+ this.port = port;
21
+ this.host = host;
22
+ this.socket = new net_1.Socket();
23
+ this.buffer = Buffer.alloc(0);
24
+ this.getPacketPromise = Promise.resolve();
25
+ this.sendPacketPromise = Promise.resolve();
26
+ this._runtimeInfo = runtimeInfo;
27
+ this._windowHandles = {};
28
+ this.protocolInfo = {
29
+ applicationType: '',
30
+ marionetteProtocol: '',
31
+ };
32
+ this.sessionInfo = null;
33
+ }
34
+ get activeWindowId() {
35
+ return this._runtimeInfo.activeWindowId;
36
+ }
37
+ async _attemptToConnect(port, host) {
38
+ this.socket.connect(port, host);
39
+ const connectionPromise = Promise.race([
40
+ promisify_event_1.default(this.socket, 'connect'),
41
+ promisify_event_1.default(this.socket, 'error')
42
+ ]);
43
+ return await connectionPromise
44
+ .then(() => true)
45
+ .catch(() => {
46
+ this.socket.removeAllListeners('connect');
47
+ return delay_1.default(CONNECTION_RETRY_DELAY);
48
+ });
49
+ }
50
+ async _connectSocket(port, host) {
51
+ const connectionStartTime = Date.now();
52
+ let connected = await this._attemptToConnect(port, host);
53
+ while (!connected && Date.now() - connectionStartTime < CONNECTION_TIMEOUT)
54
+ connected = await this._attemptToConnect(port, host);
55
+ if (!connected)
56
+ throw new Error('Unable to connect');
57
+ this.socket.on('data', data => this._handleNewData(data));
58
+ }
59
+ async _writeSocket(message) {
60
+ if (!this.socket.write(message))
61
+ await promisify_event_1.default(this.socket, 'drain');
62
+ }
63
+ _handleNewData(data) {
64
+ if (!data)
65
+ return;
66
+ this.buffer = Buffer.concat([this.buffer, data]);
67
+ this.events.emit('new-data');
68
+ }
69
+ _getPacket() {
70
+ this.getPacketPromise = this.getPacketPromise.then(async () => {
71
+ let headerEndIndex = this.buffer.indexOf(HEADER_SEPARATOR);
72
+ while (headerEndIndex < 0) {
73
+ await promisify_event_1.default(this.events, 'new-data');
74
+ headerEndIndex = this.buffer.indexOf(HEADER_SEPARATOR);
75
+ }
76
+ const packet = {
77
+ length: NaN,
78
+ body: null
79
+ };
80
+ packet.length = parseInt(this.buffer.toString('utf8', 0, headerEndIndex), 10) || 0;
81
+ const bodyStartIndex = headerEndIndex + HEADER_SEPARATOR.length;
82
+ const bodyEndIndex = bodyStartIndex + packet.length;
83
+ if (packet.length) {
84
+ while (this.buffer.length < bodyEndIndex)
85
+ await promisify_event_1.default(this.events, 'new-data');
86
+ packet.body = JSON.parse(this.buffer.toString('utf8', bodyStartIndex, bodyEndIndex));
87
+ }
88
+ this.buffer = this.buffer.slice(bodyEndIndex);
89
+ return packet;
90
+ });
91
+ return this.getPacketPromise;
92
+ }
93
+ _sendPacket(payload) {
94
+ this.sendPacketPromise = this.sendPacketPromise.then(async () => {
95
+ const body = [0, this.currentPacketNumber++, payload.command, payload.parameters];
96
+ const serialized = JSON.stringify(body);
97
+ const message = Buffer.byteLength(serialized, 'utf8') + HEADER_SEPARATOR + serialized;
98
+ this._writeSocket(message);
99
+ });
100
+ return this.sendPacketPromise;
101
+ }
102
+ _throwMarionetteError(error) {
103
+ throw new Error(`${error.error}${error.message ? ': ' + error.message : ''}`);
104
+ }
105
+ async _switchToWindow(windowHandle) {
106
+ await this._getResponse({
107
+ command: commands_1.default.switchToWindow,
108
+ parameters: { handle: windowHandle }
109
+ });
110
+ }
111
+ async _getActiveWindowHandle() {
112
+ const windowHandles = await this._getResponse({
113
+ command: commands_1.default.getWindowHandles
114
+ });
115
+ for (const handle of windowHandles) {
116
+ await this._switchToWindow(handle);
117
+ const title = await this._getResponse({ command: commands_1.default.getTitle });
118
+ if (title.value.includes(this.activeWindowId))
119
+ return handle;
120
+ }
121
+ return null;
122
+ }
123
+ async _ensureActiveWindow() {
124
+ let handle = this._windowHandles[this.activeWindowId];
125
+ if (handle) {
126
+ await this._switchToWindow(handle);
127
+ return;
128
+ }
129
+ handle = await this._getActiveWindowHandle();
130
+ if (handle)
131
+ this._windowHandles[this.activeWindowId] = handle;
132
+ }
133
+ async _request(packet) {
134
+ await this._ensureActiveWindow();
135
+ return this._getResponse(packet);
136
+ }
137
+ async _getResponse(packet) {
138
+ const packetNumber = this.currentPacketNumber;
139
+ await this._sendPacket(packet);
140
+ let responsePacket = await this._getPacket();
141
+ while (!responsePacket.body || responsePacket.body[1] !== packetNumber)
142
+ responsePacket = await this._getPacket();
143
+ if (responsePacket.body[2])
144
+ this._throwMarionetteError(responsePacket.body[2]);
145
+ return responsePacket.body[3];
146
+ }
147
+ async _getScreenshotRawData(fullPage = false) {
148
+ return await this._request({
149
+ command: commands_1.default.takeScreenshot,
150
+ parameters: {
151
+ full: fullPage,
152
+ hash: false,
153
+ scroll: false
154
+ }
155
+ });
156
+ }
157
+ async connect() {
158
+ await this._connectSocket(this.port, this.host);
159
+ const infoPacket = await this._getPacket();
160
+ this.protocolInfo = {
161
+ applicationType: infoPacket.body.applicationType,
162
+ marionetteProtocol: infoPacket.body.marionetteProtocol
163
+ };
164
+ this.sessionInfo = await this._getResponse({ command: commands_1.default.newSession });
165
+ }
166
+ dispose() {
167
+ this.socket.end();
168
+ this.buffer = null;
169
+ }
170
+ async executeScript(code) {
171
+ return await this._request({
172
+ command: commands_1.default.executeScript,
173
+ parameters: { script: `return (${code})()` }
174
+ });
175
+ }
176
+ async getScreenshotData(fullPage) {
177
+ const frameData = await this._getScreenshotRawData(fullPage);
178
+ return Buffer.from(frameData.value, 'base64');
179
+ }
180
+ async setWindowSize(width, height) {
181
+ let { value: pageRect } = await this.executeScript(client_functions_1.GET_WINDOW_DIMENSIONS_INFO_SCRIPT);
182
+ let attemptCounter = 0;
183
+ while (attemptCounter++ < MAX_RESIZE_RETRY_COUNT && (pageRect.width !== width || pageRect.height !== height)) {
184
+ const currentRect = await this._request({ command: commands_1.default.getWindowRect });
185
+ await this._request({
186
+ command: commands_1.default.setWindowRect,
187
+ parameters: {
188
+ x: currentRect.x,
189
+ y: currentRect.y,
190
+ width: width + (currentRect.width - pageRect.width),
191
+ height: height + (currentRect.height - pageRect.height)
192
+ }
193
+ });
194
+ ({ value: pageRect } = await this.executeScript(client_functions_1.GET_WINDOW_DIMENSIONS_INFO_SCRIPT));
195
+ }
196
+ }
197
+ async quit() {
198
+ await this._request({ command: commands_1.default.quit });
199
+ }
200
+ };
201
201
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYnJvd3Nlci9wcm92aWRlci9idWlsdC1pbi9kZWRpY2F0ZWQvZmlyZWZveC9tYXJpb25ldHRlLWNsaWVudC9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZCQUE2QjtBQUM3QixzRUFBNkM7QUFDN0Msb0RBQWtDO0FBQ2xDLDBFQUFrRDtBQUNsRCx5RUFBdUY7QUFDdkYsMERBQWtDO0FBR2xDLE1BQU0sa0JBQWtCLEdBQU8sS0FBSyxDQUFDO0FBQ3JDLE1BQU0sc0JBQXNCLEdBQUcsR0FBRyxDQUFDO0FBQ25DLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLE1BQU0sZ0JBQWdCLEdBQVMsR0FBRyxDQUFDO0FBRW5DLE1BQU0sQ0FBQyxPQUFPLEdBQUcsTUFBTSxnQkFBZ0I7SUFDbkMsWUFBYSxJQUFJLEdBQUcsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEdBQUcsV0FBVztRQUNyRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLEdBQWdCLElBQUksZ0JBQVksRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxJQUFJLEdBQWtCLElBQUksQ0FBQztRQUNoQyxJQUFJLENBQUMsSUFBSSxHQUFrQixJQUFJLENBQUM7UUFDaEMsSUFBSSxDQUFDLE1BQU0sR0FBZ0IsSUFBSSxZQUFNLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFnQixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxnQkFBZ0IsR0FBTSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDN0MsSUFBSSxDQUFDLGlCQUFpQixHQUFLLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUU3QyxJQUFJLENBQUMsWUFBWSxHQUFLLFdBQVcsQ0FBQztR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RyxRQUFRLENBQUMsTUFBTSxDQUFDO2lCQUMxRDthQUNKLENBQUMsQ0FBQztZQUVILENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLG9EQUFpQyxDQUFDLENBQUMsQ0FBQztTQUN2RjtJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSTtRQUNOLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sRUFBRSxrQkFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQztDQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTb2NrZXQgfSBmcm9tICduZXQnO1xuaW1wb3J0IHByb21pc2lmeUV2ZW50IGZyb20gJ3Byb21pc2lmeS1ldmVudCc7XG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgZGVsYXkgZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vdXRpbHMvZGVsYXknO1xuaW1wb3J0IHsgR0VUX1dJTkRPV19ESU1FTlNJT05TX0lORk9fU0NSSVBUIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMvY2xpZW50LWZ1bmN0aW9ucyc7XG5pbXBvcnQgQ09NTUFORFMgZnJvbSAnLi9jb21tYW5kcyc7XG5cblxuY29uc3QgQ09OTkVDVElPTl9USU1FT1VUICAgICA9IDMwMDAwO1xuY29uc3QgQ09OTkVDVElPTl9SRVRSWV9ERUxBWSA9IDMwMDtcbmNvbnN0IE1BWF9SRVNJWkVfUkVUUllfQ09VTlQgPSAyO1xuY29uc3QgSEVBREVSX1NFUEFSQVRPUiAgICAgICA9ICc6JztcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBNYXJpb25ldHRlQ2xpZW50IHtcbiAgICBjb25zdHJ1Y3RvciAocG9ydCA9IDI4MjgsIHJ1bnRpbWVJbmZvLCBob3N0ID0gJzEyNy4wLjAuMScpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFja2V0TnVtYmVyID0gMTtcbiAgICAgICAgdGhpcy5ldmVudHMgICAgICAgICAgICAgID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLnBvcnQgICAgICAgICAgICAgICAgPSBwb3J0O1xuICAgICAgICB0aGlzLmhvc3QgICAgICAgICAgICAgICAgPSBob3N0O1xuICAgICAgICB0aGlzLnNvY2tldCAgICAgICAgICAgICAgPSBuZXcgU29ja2V0KCk7XG4gICAgICAgIHRoaXMuYnVmZmVyICAgICAgICAgICAgICA9IEJ1ZmZlci5hbGxvYygwKTtcbiAgICAgICAgdGhpcy5nZXRQYWNrZXRQcm9taXNlICAgID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIHRoaXMuc2VuZFBhY2tldFByb21pc2UgICA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gICAgICAgIHRoaXMuX3J1bnRpbWVJbmZvICAgPSBydW50aW1lSW5mbztcbiAgICAgICAgdGhpcy5fd2luZG93SGFuZGxlcyA9IHt9O1xuXG4gICAgICAgIHRoaXMucHJvdG9jb2xJbmZvID0ge1xuICAgICAgICAgICAgYXBwbGljYXRpb25UeXBlOiAgICAnJyxcbiAgICAgICAgICAgIG1hcmlvbmV0dGVQcm90b2NvbDogJycsXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5zZXNzaW9uSW5mbyA9IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IGFjdGl2ZVdpbmRvd0lkICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bnRpbWVJbmZvLmFjdGl2ZVdpbmRvd0lkO1xuICAgIH1cblxuICAgIGFzeW5jIF9hdHRlbXB0VG9Db25uZWN0IChwb3J0LCBob3N0KSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmNvbm5lY3QocG9ydCwgaG9zdCk7XG5cbiAgICAgICAgY29uc3QgY29ubmVjdGlvblByb21pc2UgPSBQcm9taXNlLnJhY2UoW1xuICAgICAgICAgICAgcHJvbWlzaWZ5RXZlbnQodGhpcy5zb2NrZXQsICdjb25uZWN0JyksXG4gICAgICAgICAgICBwcm9taXNpZnlFdmVudCh0aGlzLnNvY2tldCwgJ2Vycm9yJylcbiAgICAgICAgXSk7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IGNvbm5lY3Rpb25Qcm9taXNlXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2Nvbm5lY3QnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVsYXkoQ09OTkVDVElPTl9SRVRSWV9ERUxBWSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBfY29ubmVjdFNvY2tldCAocG9ydCwgaG9zdCkge1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgICAgICBsZXQgY29ubmVjdGVkID0gYXdhaXQgdGhpcy5fYXR0ZW1wdFRvQ29ubmVjdChwb3J0LCBob3N0KTtcblxuICAgICAgICB3aGlsZSAoIWNvbm5lY3RlZCAmJiBEYXRlLm5vdygpIC0gY29ubmVjdGlvblN0YXJ0VGltZSA8IENPTk5FQ1RJT05fVElNRU9VVClcbiAgICAgICAgICAgIGNvbm5lY3RlZCA9IGF3YWl0IHRoaXMuX2F0dGVtcHRUb0Nvbm5lY3QocG9ydCwgaG9zdCk7XG5cbiAgICAgICAgaWYgKCFjb25uZWN0ZWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBjb25uZWN0Jyk7XG5cbiAgICAgICAgdGhpcy5zb2NrZXQub24oJ2RhdGEnLCBkYXRhID0+IHRoaXMuX2hhbmRsZU5ld0RhdGEoZGF0YSkpO1xuICAgIH1cblxuICAgIGFzeW5jIF93cml0ZVNvY2tldCAobWVzc2FnZSkge1xuICAgICAgICBpZiAoIXRoaXMuc29ja2V0LndyaXRlKG1lc3NhZ2UpKVxuICAgICAgICAgICAgYXdhaXQgcHJvbWlzaWZ5RXZlbnQodGhpcy5zb2NrZXQsICdkcmFpbicpO1xuICAgIH1cblxuICAgIF9oYW5kbGVOZXdEYXRhIChkYXRhKSB7XG4gICAgICAgIGlmICghZGF0YSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuYnVmZmVyLCBkYXRhXSk7XG5cbiAgICAgICAgdGhpcy5ldmVudHMuZW1pdCgnbmV3LWRhdGEnKTtcbiAgICB9XG5cbiAgICBfZ2V0UGFja2V0ICgpIHtcbiAgICAgICAgdGhpcy5nZXRQYWNrZXRQcm9taXNlID0gdGhpcy5nZXRQYWNrZXRQcm9taXNlLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGhlYWRlckVuZEluZGV4ID0gdGhpcy5idWZmZXIuaW5kZXhPZihIRUFERVJfU0VQQVJBVE9SKTtcblxuICAgICAgICAgICAgd2hpbGUgKGhlYWRlckVuZEluZGV4IDwgMCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHByb21pc2lmeUV2ZW50KHRoaXMuZXZlbnRzLCAnbmV3LWRhdGEnKTtcblxuICAgICAgICAgICAgICAgIGhlYWRlckVuZEluZGV4ID0gdGhpcy5idWZmZXIuaW5kZXhPZihIRUFERVJfU0VQQVJBVE9SKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcGFja2V0ID0ge1xuICAgICAgICAgICAgICAgIGxlbmd0aDogTmFOLFxuICAgICAgICAgICAgICAgIGJvZHk6ICAgbnVsbFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcGFja2V0Lmxlbmd0aCA9IHBhcnNlSW50KHRoaXMuYnVmZmVyLnRvU3RyaW5nKCd1dGY4JywgMCwgaGVhZGVyRW5kSW5kZXgpLCAxMCkgfHwgMDtcblxuICAgICAgICAgICAgY29uc3QgYm9keVN0YXJ0SW5kZXggPSBoZWFkZXJFbmRJbmRleCArIEhFQURFUl9TRVBBUkFUT1IubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgYm9keUVuZEluZGV4ICAgPSBib2R5U3RhcnRJbmRleCArIHBhY2tldC5sZW5ndGg7XG5cbiAgICAgICAgICAgIGlmIChwYWNrZXQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuYnVmZmVyLmxlbmd0aCA8IGJvZHlFbmRJbmRleClcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvbWlzaWZ5RXZlbnQodGhpcy5ldmVudHMsICduZXctZGF0YScpO1xuXG4gICAgICAgICAgICAgICAgcGFja2V0LmJvZHkgPSBKU09OLnBhcnNlKHRoaXMuYnVmZmVyLnRvU3RyaW5nKCd1dGY4JywgYm9keVN0YXJ0SW5kZXgsIGJvZHlFbmRJbmRleCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IHRoaXMuYnVmZmVyLnNsaWNlKGJvZHlFbmRJbmRleCk7XG5cbiAgICAgICAgICAgIHJldHVybiBwYWNrZXQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhY2tldFByb21pc2U7XG4gICAgfVxuXG4gICAgX3NlbmRQYWNrZXQgKHBheWxvYWQpIHtcbiAgICAgICAgdGhpcy5zZW5kUGFja2V0UHJvbWlzZSA9IHRoaXMuc2VuZFBhY2tldFByb21pc2UudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBib2R5ICAgICAgID0gWzAsIHRoaXMuY3VycmVudFBhY2tldE51bWJlcisrLCBwYXlsb2FkLmNvbW1hbmQsIHBheWxvYWQucGFyYW1ldGVyc107XG4gICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlICAgID0gQnVmZmVyLmJ5dGVMZW5ndGgoc2VyaWFsaXplZCwgJ3V0ZjgnKSArIEhFQURFUl9TRVBBUkFUT1IgKyBzZXJpYWxpemVkO1xuXG4gICAgICAgICAgICB0aGlzLl93cml0ZVNvY2tldChtZXNzYWdlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFBhY2tldFByb21pc2U7XG4gICAgfVxuXG4gICAgX3Rocm93TWFyaW9uZXR0ZUVycm9yIChlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZXJyb3IuZXJyb3J9JHtlcnJvci5tZXNzYWdlID8gJzogJyArIGVycm9yLm1lc3NhZ2UgOiAnJ31gKTtcbiAgICB9XG5cbiAgICBhc3luYyBfc3dpdGNoVG9XaW5kb3cgKHdpbmRvd0hhbmRsZSkge1xuICAgICAgICBhd2FpdCB0aGlzLl9nZXRSZXNwb25zZSh7XG4gICAgICAgICAgICBjb21tYW5kOiAgICBDT01NQU5EUy5zd2l0Y2hUb1dpbmRvdyxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHsgaGFuZGxlOiB3aW5kb3dIYW5kbGUgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBfZ2V0QWN0aXZlV2luZG93SGFuZGxlICgpIHtcbiAgICAgICAgY29uc3Qgd2luZG93SGFuZGxlcyA9IGF3YWl0IHRoaXMuX2dldFJlc3BvbnNlKHtcbiAgICAgICAgICAgIGNvbW1hbmQ6IENPTU1BTkRTLmdldFdpbmRvd0hhbmRsZXNcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBoYW5kbGUgb2Ygd2luZG93SGFuZGxlcykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fc3dpdGNoVG9XaW5kb3coaGFuZGxlKTtcblxuICAgICAgICAgICAgY29uc3QgdGl0bGUgPSBhd2FpdCB0aGlzLl9nZXRSZXNwb25zZSh7IGNvbW1hbmQ6IENPTU1BTkRTLmdldFRpdGxlIH0pO1xuXG4gICAgICAgICAgICBpZiAodGl0bGUudmFsdWUuaW5jbHVkZXModGhpcy5hY3RpdmVXaW5kb3dJZCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGFzeW5jIF9lbnN1cmVBY3RpdmVXaW5kb3cgKCkge1xuICAgICAgICBsZXQgaGFuZGxlID0gdGhpcy5fd2luZG93SGFuZGxlc1t0aGlzLmFjdGl2ZVdpbmRvd0lkXTtcblxuICAgICAgICBpZiAoaGFuZGxlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9zd2l0Y2hUb1dpbmRvdyhoYW5kbGUpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBoYW5kbGUgPSBhd2FpdCB0aGlzLl9nZXRBY3RpdmVXaW5kb3dIYW5kbGUoKTtcblxuICAgICAgICBpZiAoaGFuZGxlKVxuICAgICAgICAgICAgdGhpcy5fd2luZG93SGFuZGxlc1t0aGlzLmFjdGl2ZVdpbmRvd0lkXSA9IGhhbmRsZTtcbiAgICB9XG5cbiAgICBhc3luYyBfcmVxdWVzdCAocGFja2V0KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2Vuc3VyZUFjdGl2ZVdpbmRvdygpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRSZXNwb25zZShwYWNrZXQpO1xuICAgIH1cblxuICAgIGFzeW5jIF9nZXRSZXNwb25zZSAocGFja2V0KSB7XG4gICAgICAgIGNvbnN0IHBhY2tldE51bWJlciA9IHRoaXMuY3VycmVudFBhY2tldE51bWJlcjtcblxuICAgICAgICBhd2FpdCB0aGlzLl9zZW5kUGFja2V0KHBhY2tldCk7XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlUGFja2V0ID0gYXdhaXQgdGhpcy5fZ2V0UGFja2V0KCk7XG5cbiAgICAgICAgd2hpbGUgKCFyZXNwb25zZVBhY2tldC5ib2R5IHx8IHJlc3BvbnNlUGFja2V0LmJvZHlbMV0gIT09IHBhY2tldE51bWJlcilcbiAgICAgICAgICAgIHJlc3BvbnNlUGFja2V0ID0gYXdhaXQgdGhpcy5fZ2V0UGFja2V0KCk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlUGFja2V0LmJvZHlbMl0pXG4gICAgICAgICAgICB0aGlzLl90aHJvd01hcmlvbmV0dGVFcnJvcihyZXNwb25zZVBhY2tldC5ib2R5WzJdKTtcblxuICAgICAgICByZXR1cm4gcmVzcG9uc2VQYWNrZXQuYm9keVszXTtcbiAgICB9XG5cbiAgICBhc3luYyBfZ2V0U2NyZWVuc2hvdFJhd0RhdGEgKGZ1bGxQYWdlID0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3JlcXVlc3Qoe1xuICAgICAgICAgICAgY29tbWFuZDogICAgQ09NTUFORFMudGFrZVNjcmVlbnNob3QsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgICAgZnVsbDogICBmdWxsUGFnZSxcbiAgICAgICAgICAgICAgICBoYXNoOiAgIGZhbHNlLFxuICAgICAgICAgICAgICAgIHNjcm9sbDogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgY29ubmVjdCAoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2Nvbm5lY3RTb2NrZXQodGhpcy5wb3J0LCB0aGlzLmhvc3QpO1xuXG4gICAgICAgIGNvbnN0IGluZm9QYWNrZXQgPSBhd2FpdCB0aGlzLl9nZXRQYWNrZXQoKTtcblxuICAgICAgICB0aGlzLnByb3RvY29sSW5mbyA9IHtcbiAgICAgICAgICAgIGFwcGxpY2F0aW9uVHlwZTogICAgaW5mb1BhY2tldC5ib2R5LmFwcGxpY2F0aW9uVHlwZSxcbiAgICAgICAgICAgIG1hcmlvbmV0dGVQcm90b2NvbDogaW5mb1BhY2tldC5ib2R5Lm1hcmlvbmV0dGVQcm90b2NvbFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuc2Vzc2lvbkluZm8gPSBhd2FpdCB0aGlzLl9nZXRSZXNwb25zZSh7IGNvbW1hbmQ6IENPTU1BTkRTLm5ld1Nlc3Npb24gfSk7XG4gICAgfVxuXG4gICAgZGlzcG9zZSAoKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmVuZCgpO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IG51bGw7XG4gICAgfVxuXG4gICAgYXN5bmMgZXhlY3V0ZVNjcmlwdCAoY29kZSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fcmVxdWVzdCh7XG4gICAgICAgICAgICBjb21tYW5kOiAgICBDT01NQU5EUy5leGVjdXRlU2NyaXB0LFxuICAgICAgICAgICAgcGFyYW1ldGVyczogeyBzY3JpcHQ6IGByZXR1cm4gKCR7Y29kZX0pKClgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0U2NyZWVuc2hvdERhdGEgKGZ1bGxQYWdlKSB7XG4gICAgICAgIGNvbnN0IGZyYW1lRGF0YSA9IGF3YWl0IHRoaXMuX2dldFNjcmVlbnNob3RSYXdEYXRhKGZ1bGxQYWdlKTtcblxuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oZnJhbWVEYXRhLnZhbHVlLCAnYmFzZTY0Jyk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0V2luZG93U2l6ZSAod2lkdGgsIGhlaWdodCkge1xuICAgICAgICBsZXQgeyB2YWx1ZTogcGFnZVJlY3QgfSA9IGF3YWl0IHRoaXMuZXhlY3V0ZVNjcmlwdChHRVRfV0lORE9XX0RJTUVOU0lPTlNfSU5GT19TQ1JJUFQpO1xuICAgICAgICBsZXQgYXR0ZW1wdENvdW50ZXIgICAgICA9IDA7XG5cbiAgICAgICAgd2hpbGUgKGF0dGVtcHRDb3VudGVyKysgPCBNQVhfUkVTSVpFX1JFVFJZX0NPVU5UICYmIChwYWdlUmVjdC53aWR0aCAhPT0gd2lkdGggfHwgcGFnZVJlY3QuaGVpZ2h0ICE9PSBoZWlnaHQpKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UmVjdCA9IGF3YWl0IHRoaXMuX3JlcXVlc3QoeyBjb21tYW5kOiBDT01NQU5EUy5nZXRXaW5kb3dSZWN0IH0pO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9yZXF1ZXN0KHtcbiAgICAgICAgICAgICAgICBjb21tYW5kOiBDT01NQU5EUy5zZXRXaW5kb3dSZWN0LFxuXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICAgICAgICB4OiAgICAgIGN1cnJlbnRSZWN0LngsXG4gICAgICAgICAgICAgICAgICAgIHk6ICAgICAgY3VycmVudFJlY3QueSxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6ICB3aWR0aCArIChjdXJyZW50UmVjdC53aWR0aCAtIHBhZ2VSZWN0LndpZHRoKSxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQgKyAoY3VycmVudFJlY3QuaGVpZ2h0IC0gcGFnZVJlY3QuaGVpZ2h0KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAoeyB2YWx1ZTogcGFnZVJlY3QgfSA9IGF3YWl0IHRoaXMuZXhlY3V0ZVNjcmlwdChHRVRfV0lORE9XX0RJTUVOU0lPTlNfSU5GT19TQ1JJUFQpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHF1aXQgKCkge1xuICAgICAgICBhd2FpdCB0aGlzLl9yZXF1ZXN0KHsgY29tbWFuZDogQ09NTUFORFMucXVpdCB9KTtcbiAgICB9XG59O1xuXG4iXX0=
@@ -1,19 +1,19 @@
1
- "use strict";
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
- const endpoint_utils_1 = require("endpoint-utils");
7
- const config_1 = __importDefault(require("./config"));
8
- const create_temp_profile_1 = __importDefault(require("./create-temp-profile"));
9
- async function default_1(configString) {
10
- const config = config_1.default(configString);
11
- const marionettePort = config.marionettePort || (!config.userProfile ? await endpoint_utils_1.getFreePort() : null);
12
- const runtimeInfo = { config, marionettePort };
13
- runtimeInfo.tempProfileDir = !config.userProfile ? await create_temp_profile_1.default(runtimeInfo) : null;
14
- runtimeInfo.activeWindowId = null;
15
- return runtimeInfo;
16
- }
17
- exports.default = default_1;
1
+ "use strict";
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
+ const endpoint_utils_1 = require("endpoint-utils");
7
+ const config_1 = __importDefault(require("./config"));
8
+ const create_temp_profile_1 = __importDefault(require("./create-temp-profile"));
9
+ async function default_1(configString) {
10
+ const config = config_1.default(configString);
11
+ const marionettePort = config.marionettePort || (!config.userProfile ? await endpoint_utils_1.getFreePort() : null);
12
+ const runtimeInfo = { config, marionettePort };
13
+ runtimeInfo.tempProfileDir = !config.userProfile ? await create_temp_profile_1.default(runtimeInfo) : null;
14
+ runtimeInfo.activeWindowId = null;
15
+ return runtimeInfo;
16
+ }
17
+ exports.default = default_1;
18
18
  module.exports = exports.default;
19
19
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS1pbmZvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2Jyb3dzZXIvcHJvdmlkZXIvYnVpbHQtaW4vZGVkaWNhdGVkL2ZpcmVmb3gvcnVudGltZS1pbmZvLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbURBQTZDO0FBQzdDLHNEQUFpQztBQUNqQyxnRkFBc0Q7QUFHdkMsS0FBSyxvQkFBVyxZQUFZO0lBQ3ZDLE1BQU0sTUFBTSxHQUFXLGdCQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDL0MsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSw0QkFBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25HLE1BQU0sV0FBVyxHQUFNLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxDQUFDO0lBRWxELFdBQVcsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLDZCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDL0YsV0FBVyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7SUFFbEMsT0FBTyxXQUFXLENBQUM7QUFDdkIsQ0FBQztBQVRELDRCQVNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0RnJlZVBvcnQgfSBmcm9tICdlbmRwb2ludC11dGlscyc7XG5pbXBvcnQgZ2V0Q29uZmlnIGZyb20gJy4vY29uZmlnJztcbmltcG9ydCBjcmVhdGVUZW1wUHJvZmlsZSBmcm9tICcuL2NyZWF0ZS10ZW1wLXByb2ZpbGUnO1xuXG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIChjb25maWdTdHJpbmcpIHtcbiAgICBjb25zdCBjb25maWcgICAgICAgICA9IGdldENvbmZpZyhjb25maWdTdHJpbmcpO1xuICAgIGNvbnN0IG1hcmlvbmV0dGVQb3J0ID0gY29uZmlnLm1hcmlvbmV0dGVQb3J0IHx8ICghY29uZmlnLnVzZXJQcm9maWxlID8gYXdhaXQgZ2V0RnJlZVBvcnQoKSA6IG51bGwpO1xuICAgIGNvbnN0IHJ1bnRpbWVJbmZvICAgID0geyBjb25maWcsIG1hcmlvbmV0dGVQb3J0IH07XG5cbiAgICBydW50aW1lSW5mby50ZW1wUHJvZmlsZURpciA9ICFjb25maWcudXNlclByb2ZpbGUgPyBhd2FpdCBjcmVhdGVUZW1wUHJvZmlsZShydW50aW1lSW5mbykgOiBudWxsO1xuICAgIHJ1bnRpbWVJbmZvLmFjdGl2ZVdpbmRvd0lkID0gbnVsbDtcblxuICAgIHJldHVybiBydW50aW1lSW5mbztcbn1cbiJdfQ==
@@ -1,23 +1,23 @@
1
- "use strict";
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
- const path_1 = __importDefault(require("./path"));
7
- const locally_installed_1 = __importDefault(require("./locally-installed"));
8
- const remote_1 = __importDefault(require("./remote"));
9
- const firefox_1 = __importDefault(require("./dedicated/firefox"));
10
- const chrome_1 = __importDefault(require("./dedicated/chrome"));
11
- const edge_1 = __importDefault(require("./dedicated/edge"));
12
- exports.default = Object.assign({
13
- 'locally-installed': locally_installed_1.default,
14
- 'path': path_1.default,
15
- 'remote': remote_1.default,
16
- 'firefox': firefox_1.default,
17
- 'chrome': chrome_1.default,
18
- 'chromium': chrome_1.default,
19
- 'chrome-canary': chrome_1.default,
20
- 'edge': edge_1.default
21
- });
1
+ "use strict";
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
+ const path_1 = __importDefault(require("./path"));
7
+ const locally_installed_1 = __importDefault(require("./locally-installed"));
8
+ const remote_1 = __importDefault(require("./remote"));
9
+ const firefox_1 = __importDefault(require("./dedicated/firefox"));
10
+ const chrome_1 = __importDefault(require("./dedicated/chrome"));
11
+ const edge_1 = __importDefault(require("./dedicated/edge"));
12
+ exports.default = Object.assign({
13
+ 'locally-installed': locally_installed_1.default,
14
+ 'path': path_1.default,
15
+ 'remote': remote_1.default,
16
+ 'firefox': firefox_1.default,
17
+ 'chrome': chrome_1.default,
18
+ 'chromium': chrome_1.default,
19
+ 'chrome-canary': chrome_1.default,
20
+ 'edge': edge_1.default
21
+ });
22
22
  module.exports = exports.default;
23
23
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYnJvd3Nlci9wcm92aWRlci9idWlsdC1pbi9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGtEQUF5QztBQUN6Qyw0RUFBa0U7QUFDbEUsc0RBQTZDO0FBQzdDLGtFQUFrRDtBQUNsRCxnRUFBZ0Q7QUFDaEQsNERBQTRDO0FBRTVDLGtCQUFlLE1BQU0sQ0FBQyxNQUFNLENBQ3hCO0lBQ0ksbUJBQW1CLEVBQUUsMkJBQStCO0lBQ3BELE1BQU0sRUFBZSxjQUFtQjtJQUN4QyxRQUFRLEVBQWEsZ0JBQXFCO0lBQzFDLFNBQVMsRUFBWSxpQkFBZTtJQUNwQyxRQUFRLEVBQWEsZ0JBQWM7SUFDbkMsVUFBVSxFQUFXLGdCQUFjO0lBQ25DLGVBQWUsRUFBTSxnQkFBYztJQUNuQyxNQUFNLEVBQWUsY0FBWTtDQUNwQyxDQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aEJyb3dzZXJQcm92aWRlciBmcm9tICcuL3BhdGgnO1xuaW1wb3J0IGxvY2FsbHlJbnN0YWxsZWRCcm93c2VyUHJvdmlkZXIgZnJvbSAnLi9sb2NhbGx5LWluc3RhbGxlZCc7XG5pbXBvcnQgcmVtb3RlQnJvd3NlclByb3ZpZGVyIGZyb20gJy4vcmVtb3RlJztcbmltcG9ydCBmaXJlZm94UHJvdmlkZXIgZnJvbSAnLi9kZWRpY2F0ZWQvZmlyZWZveCc7XG5pbXBvcnQgY2hyb21lUHJvdmlkZXIgZnJvbSAnLi9kZWRpY2F0ZWQvY2hyb21lJztcbmltcG9ydCBlZGdlUHJvdmlkZXIgZnJvbSAnLi9kZWRpY2F0ZWQvZWRnZSc7XG5cbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oXG4gICAge1xuICAgICAgICAnbG9jYWxseS1pbnN0YWxsZWQnOiBsb2NhbGx5SW5zdGFsbGVkQnJvd3NlclByb3ZpZGVyLFxuICAgICAgICAncGF0aCc6ICAgICAgICAgICAgICBwYXRoQnJvd3NlclByb3ZpZGVyLFxuICAgICAgICAncmVtb3RlJzogICAgICAgICAgICByZW1vdGVCcm93c2VyUHJvdmlkZXIsXG4gICAgICAgICdmaXJlZm94JzogICAgICAgICAgIGZpcmVmb3hQcm92aWRlcixcbiAgICAgICAgJ2Nocm9tZSc6ICAgICAgICAgICAgY2hyb21lUHJvdmlkZXIsXG4gICAgICAgICdjaHJvbWl1bSc6ICAgICAgICAgIGNocm9tZVByb3ZpZGVyLFxuICAgICAgICAnY2hyb21lLWNhbmFyeSc6ICAgICBjaHJvbWVQcm92aWRlcixcbiAgICAgICAgJ2VkZ2UnOiAgICAgICAgICAgICAgZWRnZVByb3ZpZGVyXG4gICAgfVxuKTtcbiJdfQ==
@@ -1,32 +1,32 @@
1
- "use strict";
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
- const testcafe_browser_tools_1 = __importDefault(require("testcafe-browser-tools"));
7
- exports.default = {
8
- isMultiBrowser: true,
9
- async openBrowser(browserId, pageUrl, browserName) {
10
- const args = browserName.split(' ');
11
- const alias = args.shift();
12
- const browserInfo = await testcafe_browser_tools_1.default.getBrowserInfo(alias);
13
- const openParameters = Object.assign({}, browserInfo);
14
- if (args.length)
15
- openParameters.cmd = args.join(' ') + (openParameters.cmd ? ' ' + openParameters.cmd : '');
16
- await testcafe_browser_tools_1.default.open(openParameters, pageUrl);
17
- },
18
- async isLocalBrowser() {
19
- return true;
20
- },
21
- async getBrowserList() {
22
- const installations = await testcafe_browser_tools_1.default.getInstallations();
23
- return Object.keys(installations);
24
- },
25
- async isValidBrowserName(browserName) {
26
- const browserNames = await this.getBrowserList();
27
- browserName = browserName.toLowerCase().split(' ')[0];
28
- return browserNames.indexOf(browserName) > -1;
29
- }
30
- };
1
+ "use strict";
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
+ const testcafe_browser_tools_1 = __importDefault(require("testcafe-browser-tools"));
7
+ exports.default = {
8
+ isMultiBrowser: true,
9
+ async openBrowser(browserId, pageUrl, browserName) {
10
+ const args = browserName.split(' ');
11
+ const alias = args.shift();
12
+ const browserInfo = await testcafe_browser_tools_1.default.getBrowserInfo(alias);
13
+ const openParameters = Object.assign({}, browserInfo);
14
+ if (args.length)
15
+ openParameters.cmd = args.join(' ') + (openParameters.cmd ? ' ' + openParameters.cmd : '');
16
+ await testcafe_browser_tools_1.default.open(openParameters, pageUrl);
17
+ },
18
+ async isLocalBrowser() {
19
+ return true;
20
+ },
21
+ async getBrowserList() {
22
+ const installations = await testcafe_browser_tools_1.default.getInstallations();
23
+ return Object.keys(installations);
24
+ },
25
+ async isValidBrowserName(browserName) {
26
+ const browserNames = await this.getBrowserList();
27
+ browserName = browserName.toLowerCase().split(' ')[0];
28
+ return browserNames.indexOf(browserName) > -1;
29
+ }
30
+ };
31
31
  module.exports = exports.default;
32
32
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxseS1pbnN0YWxsZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYnJvd3Nlci9wcm92aWRlci9idWlsdC1pbi9sb2NhbGx5LWluc3RhbGxlZC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9GQUFrRDtBQUVsRCxrQkFBZTtJQUNYLGNBQWMsRUFBRSxJQUFJO0lBRXBCLEtBQUssQ0FBQyxXQUFXLENBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxXQUFXO1FBQzlDLE1BQU0sSUFBSSxHQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTNCLE1BQU0sV0FBVyxHQUFNLE1BQU0sZ0NBQVksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEUsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFdEQsSUFBSSxJQUFJLENBQUMsTUFBTTtZQUNYLGNBQWMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUUvRixNQUFNLGdDQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELEtBQUssQ0FBQyxjQUFjO1FBQ2hCLE1BQU0sYUFBYSxHQUFHLE1BQU0sZ0NBQVksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRTVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsS0FBSyxDQUFDLGtCQUFrQixDQUFFLFdBQVc7UUFDakMsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFakQsV0FBVyxHQUFHLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdEQsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7Q0FDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGJyb3dzZXJUb29scyBmcm9tICd0ZXN0Y2FmZS1icm93c2VyLXRvb2xzJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIGlzTXVsdGlCcm93c2VyOiB0cnVlLFxuXG4gICAgYXN5bmMgb3BlbkJyb3dzZXIgKGJyb3dzZXJJZCwgcGFnZVVybCwgYnJvd3Nlck5hbWUpIHtcbiAgICAgICAgY29uc3QgYXJncyAgPSBicm93c2VyTmFtZS5zcGxpdCgnICcpO1xuICAgICAgICBjb25zdCBhbGlhcyA9IGFyZ3Muc2hpZnQoKTtcblxuICAgICAgICBjb25zdCBicm93c2VySW5mbyAgICA9IGF3YWl0IGJyb3dzZXJUb29scy5nZXRCcm93c2VySW5mbyhhbGlhcyk7XG4gICAgICAgIGNvbnN0IG9wZW5QYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgYnJvd3NlckluZm8pO1xuXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aClcbiAgICAgICAgICAgIG9wZW5QYXJhbWV0ZXJzLmNtZCA9IGFyZ3Muam9pbignICcpICsgKG9wZW5QYXJhbWV0ZXJzLmNtZCA/ICcgJyArIG9wZW5QYXJhbWV0ZXJzLmNtZCA6ICcnKTtcblxuICAgICAgICBhd2FpdCBicm93c2VyVG9vbHMub3BlbihvcGVuUGFyYW1ldGVycywgcGFnZVVybCk7XG4gICAgfSxcblxuICAgIGFzeW5jIGlzTG9jYWxCcm93c2VyICgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldEJyb3dzZXJMaXN0ICgpIHtcbiAgICAgICAgY29uc3QgaW5zdGFsbGF0aW9ucyA9IGF3YWl0IGJyb3dzZXJUb29scy5nZXRJbnN0YWxsYXRpb25zKCk7XG5cbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGluc3RhbGxhdGlvbnMpO1xuICAgIH0sXG5cbiAgICBhc3luYyBpc1ZhbGlkQnJvd3Nlck5hbWUgKGJyb3dzZXJOYW1lKSB7XG4gICAgICAgIGNvbnN0IGJyb3dzZXJOYW1lcyA9IGF3YWl0IHRoaXMuZ2V0QnJvd3Nlckxpc3QoKTtcblxuICAgICAgICBicm93c2VyTmFtZSA9IGJyb3dzZXJOYW1lLnRvTG93ZXJDYXNlKCkuc3BsaXQoJyAnKVswXTtcblxuICAgICAgICByZXR1cm4gYnJvd3Nlck5hbWVzLmluZGV4T2YoYnJvd3Nlck5hbWUpID4gLTE7XG4gICAgfVxufTtcbiJdfQ==