testcafe 1.14.1 → 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 (332) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/LICENSE +21 -21
  3. package/bin/testcafe-with-v8-flag-filter.js +0 -0
  4. package/lib/api/exportable-lib/index.js +49 -49
  5. package/lib/api/request-hooks/assert-type.js +7 -7
  6. package/lib/api/request-hooks/hook-method-names.js +9 -9
  7. package/lib/api/request-hooks/hook.js +32 -32
  8. package/lib/api/request-hooks/interfaces.js +2 -2
  9. package/lib/api/request-hooks/request-logger.js +112 -112
  10. package/lib/api/request-hooks/request-mock/create-request-mock.js +10 -10
  11. package/lib/api/request-hooks/request-mock/index.js +44 -44
  12. package/lib/api/request-hooks/request-mock.js +46 -46
  13. package/lib/api/structure/base-unit.js +11 -11
  14. package/lib/api/structure/fixture.js +75 -75
  15. package/lib/api/structure/interfaces.js +2 -2
  16. package/lib/api/structure/test-file.js +31 -31
  17. package/lib/api/structure/test-timeout.js +9 -9
  18. package/lib/api/structure/test.js +85 -85
  19. package/lib/api/structure/testing-unit.js +89 -89
  20. package/lib/api/structure/unit-type.js +9 -9
  21. package/lib/api/test-controller/assertion.js +88 -88
  22. package/lib/api/test-controller/execution-context.js +82 -82
  23. package/lib/api/test-controller/index.js +358 -358
  24. package/lib/api/test-controller/proxy.js +28 -28
  25. package/lib/api/test-page-url.js +60 -60
  26. package/lib/api/test-run-tracker.js +68 -68
  27. package/lib/api/wrap-test-function.js +49 -49
  28. package/lib/assertions/executor.js +74 -74
  29. package/lib/assertions/get-fn.js +46 -46
  30. package/lib/assertions/type.js +20 -20
  31. package/lib/assets/content-types.js +9 -9
  32. package/lib/assets/injectables.js +18 -18
  33. package/lib/browser/connection/command.js +10 -10
  34. package/lib/browser/connection/error-hints.js +9 -9
  35. package/lib/browser/connection/gateway.js +159 -159
  36. package/lib/browser/connection/get-hints.js +33 -33
  37. package/lib/browser/connection/heartbeat-status.js +8 -8
  38. package/lib/browser/connection/index.js +328 -328
  39. package/lib/browser/connection/remotes-queue.js +46 -46
  40. package/lib/browser/connection/service-routes.js +12 -12
  41. package/lib/browser/connection/status.js +12 -12
  42. package/lib/browser/interfaces.js +2 -2
  43. package/lib/browser/provider/built-in/dedicated/base.js +80 -80
  44. package/lib/browser/provider/built-in/dedicated/chrome/browser-client.js +204 -204
  45. package/lib/browser/provider/built-in/dedicated/chrome/build-chrome-args.js +17 -17
  46. package/lib/browser/provider/built-in/dedicated/chrome/config.js +110 -110
  47. package/lib/browser/provider/built-in/dedicated/chrome/create-temp-profile.js +45 -45
  48. package/lib/browser/provider/built-in/dedicated/chrome/elapsed-upperbounds.js +15 -15
  49. package/lib/browser/provider/built-in/dedicated/chrome/index.js +102 -102
  50. package/lib/browser/provider/built-in/dedicated/chrome/interfaces.js +2 -2
  51. package/lib/browser/provider/built-in/dedicated/chrome/local-chrome.js +24 -24
  52. package/lib/browser/provider/built-in/dedicated/chrome/runtime-info.js +29 -29
  53. package/lib/browser/provider/built-in/dedicated/edge/index.js +10 -10
  54. package/lib/browser/provider/built-in/dedicated/edge/runtime-info.js +29 -29
  55. package/lib/browser/provider/built-in/dedicated/firefox/config.js +33 -33
  56. package/lib/browser/provider/built-in/dedicated/firefox/create-temp-profile.js +78 -78
  57. package/lib/browser/provider/built-in/dedicated/firefox/index.js +73 -73
  58. package/lib/browser/provider/built-in/dedicated/firefox/local-firefox.js +36 -36
  59. package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/commands.js +13 -13
  60. package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/index.js +200 -200
  61. package/lib/browser/provider/built-in/dedicated/firefox/runtime-info.js +17 -17
  62. package/lib/browser/provider/built-in/index.js +21 -21
  63. package/lib/browser/provider/built-in/locally-installed.js +30 -30
  64. package/lib/browser/provider/built-in/path.js +47 -47
  65. package/lib/browser/provider/built-in/remote.js +58 -58
  66. package/lib/browser/provider/index.js +303 -303
  67. package/lib/browser/provider/parse-provider-name.js +16 -16
  68. package/lib/browser/provider/plugin-host.js +121 -121
  69. package/lib/browser/provider/pool.js +115 -115
  70. package/lib/browser/provider/utils/argument-parsing.js +74 -74
  71. package/lib/browser/provider/utils/browser-starter.js +34 -34
  72. package/lib/browser/provider/utils/client-functions.js +24 -24
  73. package/lib/browser/provider/utils/get-maximized-headless-window-size.js +9 -9
  74. package/lib/cli/argument-parser.js +284 -284
  75. package/lib/cli/authentication-helper.js +35 -35
  76. package/lib/cli/cli.js +134 -134
  77. package/lib/cli/correct-browsers-and-sources.js +40 -40
  78. package/lib/cli/index.js +19 -19
  79. package/lib/cli/log.js +43 -43
  80. package/lib/cli/remotes-wizard.js +36 -36
  81. package/lib/cli/termination-handler.js +38 -38
  82. package/lib/client/automation/index.js +34 -16
  83. package/lib/client/automation/index.min.js +1 -1
  84. package/lib/client/browser/idle-page/index.html.mustache +35 -35
  85. package/lib/client/browser/idle-page/logo.svg +86 -86
  86. package/lib/client/core/index.js +14 -14
  87. package/lib/client/driver/index.js +46 -16
  88. package/lib/client/driver/index.min.js +1 -1
  89. package/lib/client/driver/internal-properties.js +9 -9
  90. package/lib/client/test-run/iframe.js.mustache +17 -17
  91. package/lib/client/test-run/index.js.mustache +51 -51
  92. package/lib/client/ui/index.js +14 -14
  93. package/lib/client/ui/sprite.svg +42 -42
  94. package/lib/client-functions/builder-symbol.js +4 -4
  95. package/lib/client-functions/client-function-builder.js +155 -155
  96. package/lib/client-functions/replicator.js +61 -61
  97. package/lib/client-functions/return-single-prop-mode.js +8 -8
  98. package/lib/client-functions/selector-api-execution-mode.js +20 -20
  99. package/lib/client-functions/selectors/add-api.js +645 -645
  100. package/lib/client-functions/selectors/create-snapshot-methods.js +13 -13
  101. package/lib/client-functions/selectors/prepare-api-args.js +20 -20
  102. package/lib/client-functions/selectors/selector-attribute-filter.js +22 -22
  103. package/lib/client-functions/selectors/selector-builder.js +153 -153
  104. package/lib/client-functions/selectors/selector-text-filter.js +43 -43
  105. package/lib/client-functions/selectors/snapshot-properties.js +48 -48
  106. package/lib/client-functions/types.js +18 -18
  107. package/lib/compiler/babel/format-babel-produced-code.js +10 -10
  108. package/lib/compiler/babel/get-base-babel-options.js +11 -11
  109. package/lib/compiler/babel/load-libs.js +63 -63
  110. package/lib/compiler/babel/preset-stage-2.js +19 -19
  111. package/lib/compiler/compile-client-function.js +73 -73
  112. package/lib/compiler/compilers.js +33 -33
  113. package/lib/compiler/index.js +92 -92
  114. package/lib/compiler/interfaces.js +2 -2
  115. package/lib/compiler/test-file/api-based.js +146 -146
  116. package/lib/compiler/test-file/base.js +36 -36
  117. package/lib/compiler/test-file/exportble-lib-path.js +5 -5
  118. package/lib/compiler/test-file/formats/coffeescript/compiler.js +38 -38
  119. package/lib/compiler/test-file/formats/coffeescript/get-test-list.js +29 -29
  120. package/lib/compiler/test-file/formats/es-next/compiler.js +42 -42
  121. package/lib/compiler/test-file/formats/es-next/get-test-list.js +166 -166
  122. package/lib/compiler/test-file/formats/es-next/is-flow-code.js +7 -7
  123. package/lib/compiler/test-file/formats/raw.js +85 -85
  124. package/lib/compiler/test-file/formats/typescript/compiler.js +135 -135
  125. package/lib/compiler/test-file/formats/typescript/get-test-list.js +185 -185
  126. package/lib/compiler/test-file/test-file-parser-base.js +214 -214
  127. package/lib/configuration/configuration-base.js +165 -165
  128. package/lib/configuration/constants.js +9 -9
  129. package/lib/configuration/customizable-compilers.js +7 -7
  130. package/lib/configuration/default-values.js +51 -51
  131. package/lib/configuration/interfaces.js +2 -2
  132. package/lib/configuration/option-names.js +53 -53
  133. package/lib/configuration/option-source.js +9 -9
  134. package/lib/configuration/option.js +14 -14
  135. package/lib/configuration/quarantine-option-names.js +8 -8
  136. package/lib/configuration/run-option-names.js +26 -26
  137. package/lib/configuration/screenshot-option-names.js +10 -10
  138. package/lib/configuration/testcafe-configuration.js +163 -163
  139. package/lib/configuration/types.js +2 -2
  140. package/lib/configuration/typescript-configuration.js +62 -62
  141. package/lib/custom-client-scripts/assert-type.js +7 -7
  142. package/lib/custom-client-scripts/client-script-init.js +2 -2
  143. package/lib/custom-client-scripts/client-script.js +106 -106
  144. package/lib/custom-client-scripts/get-code.js +11 -11
  145. package/lib/custom-client-scripts/get-url.js +6 -6
  146. package/lib/custom-client-scripts/load.js +15 -15
  147. package/lib/custom-client-scripts/problematic-scripts.js +2 -2
  148. package/lib/custom-client-scripts/routing.js +36 -36
  149. package/lib/custom-client-scripts/utils.js +60 -60
  150. package/lib/embedding-utils.js +83 -83
  151. package/lib/errors/create-stack-filter.js +18 -18
  152. package/lib/errors/error-list.js +26 -26
  153. package/lib/errors/get-callsite.js +31 -31
  154. package/lib/errors/internal-modules-prefix.js +8 -8
  155. package/lib/errors/is-internal-stack-frame.js +45 -45
  156. package/lib/errors/process-test-fn-error.js +37 -37
  157. package/lib/errors/runtime/index.js +123 -123
  158. package/lib/errors/runtime/templates.js +115 -115
  159. package/lib/errors/runtime/type-assertions.js +112 -112
  160. package/lib/errors/stack-cleaning-hook.js +64 -64
  161. package/lib/errors/test-run/formattable-adapter.js +59 -59
  162. package/lib/errors/test-run/index.js +301 -301
  163. package/lib/errors/test-run/render-error-template.js +31 -31
  164. package/lib/errors/test-run/templates.js +91 -91
  165. package/lib/errors/test-run/utils.js +89 -89
  166. package/lib/errors/types.js +156 -156
  167. package/lib/index.js +81 -81
  168. package/lib/live/bootstrapper.js +43 -43
  169. package/lib/live/controller.js +107 -107
  170. package/lib/live/file-watcher/index.js +67 -67
  171. package/lib/live/file-watcher/modules-graph.js +58 -58
  172. package/lib/live/keyboard-observer.js +76 -76
  173. package/lib/live/logger/index.js +64 -64
  174. package/lib/live/test-run-controller.js +96 -96
  175. package/lib/live/test-run-state.js +6 -6
  176. package/lib/live/test-run.js +56 -56
  177. package/lib/live/test-runner.js +167 -167
  178. package/lib/load-assets.js +29 -29
  179. package/lib/notifications/add-rendered-warning.js +16 -16
  180. package/lib/notifications/debug-logger.js +78 -78
  181. package/lib/notifications/deprecated.js +24 -24
  182. package/lib/notifications/information-message.js +9 -9
  183. package/lib/notifications/warning-log.js +31 -31
  184. package/lib/notifications/warning-message.js +47 -47
  185. package/lib/reporter/command/command-formatter.js +120 -109
  186. package/lib/reporter/command/format-command.js +8 -8
  187. package/lib/reporter/command/interfaces.js +2 -2
  188. package/lib/reporter/index.js +319 -314
  189. package/lib/reporter/interfaces.js +2 -2
  190. package/lib/reporter/plugin-host.js +135 -135
  191. package/lib/reporter/plugin-methods.js +12 -12
  192. package/lib/role/index.js +74 -74
  193. package/lib/role/marker-symbol.js +7 -7
  194. package/lib/role/phase.js +9 -9
  195. package/lib/runner/bootstrapper.js +271 -271
  196. package/lib/runner/browser-job-result.js +9 -9
  197. package/lib/runner/browser-job.js +152 -152
  198. package/lib/runner/browser-set.js +114 -114
  199. package/lib/runner/fixture-hook-controller.js +85 -85
  200. package/lib/runner/index.js +449 -449
  201. package/lib/runner/interfaces.js +2 -2
  202. package/lib/runner/reporter-stream-controller.js +27 -27
  203. package/lib/runner/task/index.js +151 -151
  204. package/lib/runner/task/phase.js +9 -9
  205. package/lib/runner/test-run-controller.js +165 -165
  206. package/lib/runner/tested-app.js +72 -72
  207. package/lib/screenshots/capturer.js +141 -141
  208. package/lib/screenshots/constants.js +11 -11
  209. package/lib/screenshots/crop.js +111 -111
  210. package/lib/screenshots/default-extension.js +4 -4
  211. package/lib/screenshots/index.js +67 -67
  212. package/lib/screenshots/utils.js +39 -39
  213. package/lib/services/compiler/host.js +190 -190
  214. package/lib/services/compiler/io.js +9 -9
  215. package/lib/services/compiler/protocol.js +17 -16
  216. package/lib/services/compiler/service.js +225 -212
  217. package/lib/services/compiler/test-run-proxy.js +111 -111
  218. package/lib/services/interfaces.js +2 -2
  219. package/lib/services/process-title.js +8 -8
  220. package/lib/services/serialization/prepare-options.js +17 -17
  221. package/lib/services/serialization/replicator/create-replicator.js +25 -25
  222. package/lib/services/serialization/replicator/custom-error-transform.js +26 -26
  223. package/lib/services/serialization/test-structure.js +92 -92
  224. package/lib/services/utils/ipc/interfaces.js +30 -30
  225. package/lib/services/utils/ipc/io.js +108 -108
  226. package/lib/services/utils/ipc/message.js +75 -75
  227. package/lib/services/utils/ipc/packet.js +55 -55
  228. package/lib/services/utils/ipc/proxy.js +109 -109
  229. package/lib/services/utils/ipc/transport.js +64 -64
  230. package/lib/shared/errors/index.js +382 -382
  231. package/lib/shared/node-modules-folder-name.js +4 -4
  232. package/lib/test-run/bookmark.js +90 -90
  233. package/lib/test-run/browser-console-messages.js +73 -73
  234. package/lib/test-run/browser-manipulation-queue.js +92 -92
  235. package/lib/test-run/client-messages.js +9 -9
  236. package/lib/test-run/commands/actions.js +486 -483
  237. package/lib/test-run/commands/assertion.js +45 -45
  238. package/lib/test-run/commands/base.js +14 -14
  239. package/lib/test-run/commands/browser-manipulation.js +95 -95
  240. package/lib/test-run/commands/from-object.js +82 -82
  241. package/lib/test-run/commands/observation.js +61 -61
  242. package/lib/test-run/commands/options.js +231 -215
  243. package/lib/test-run/commands/service.js +54 -48
  244. package/lib/test-run/commands/type.js +65 -64
  245. package/lib/test-run/commands/utils.js +87 -87
  246. package/lib/test-run/commands/validations/argument.js +90 -90
  247. package/lib/test-run/commands/validations/factories.js +47 -47
  248. package/lib/test-run/commands/validations/initializers.js +44 -44
  249. package/lib/test-run/debug-log.js +32 -32
  250. package/lib/test-run/execute-js-expression.js +74 -74
  251. package/lib/test-run/index.js +823 -799
  252. package/lib/test-run/marker-symbol.js +7 -7
  253. package/lib/test-run/observed-callsites-storage.js +17 -17
  254. package/lib/test-run/phase.js +16 -16
  255. package/lib/test-run/session-controller.js +104 -104
  256. package/lib/testcafe.js +118 -118
  257. package/lib/utils/assignable.js +39 -39
  258. package/lib/utils/async-event-emitter.js +28 -28
  259. package/lib/utils/async-queue.js +14 -14
  260. package/lib/utils/browser-connection-timeouts.js +19 -19
  261. package/lib/utils/callsite.js +17 -17
  262. package/lib/utils/check-file-path.js +31 -31
  263. package/lib/utils/check-url.js +51 -51
  264. package/lib/utils/convert-to-best-fit-type.js +16 -16
  265. package/lib/utils/correct-file-path.js +21 -21
  266. package/lib/utils/define-lazy-property.js +13 -13
  267. package/lib/utils/delay.js +6 -6
  268. package/lib/utils/delegated-api.js +44 -44
  269. package/lib/utils/detect-display.js +6 -6
  270. package/lib/utils/detect-ffmpeg.js +44 -44
  271. package/lib/utils/diff/colors.js +29 -29
  272. package/lib/utils/diff/index.js +52 -52
  273. package/lib/utils/diff/util.js +23 -23
  274. package/lib/utils/diff.js +29 -29
  275. package/lib/utils/escape-user-agent.js +10 -10
  276. package/lib/utils/flag-list.js +17 -17
  277. package/lib/utils/get-any-key.js +8 -8
  278. package/lib/utils/get-browser.js +8 -8
  279. package/lib/utils/get-common-path.js +34 -34
  280. package/lib/utils/get-filter-fn.js +40 -40
  281. package/lib/utils/get-options/base.js +36 -36
  282. package/lib/utils/get-options/compiler.js +33 -33
  283. package/lib/utils/get-options/grep.js +15 -15
  284. package/lib/utils/get-options/index.js +20 -20
  285. package/lib/utils/get-options/meta.js +22 -22
  286. package/lib/utils/get-options/quarantine.js +91 -91
  287. package/lib/utils/get-options/screenshot.js +17 -17
  288. package/lib/utils/get-options/ssl.js +45 -45
  289. package/lib/utils/get-options/video.js +10 -10
  290. package/lib/utils/get-viewport-width.js +17 -17
  291. package/lib/utils/guard-time-execution.js +10 -10
  292. package/lib/utils/handle-errors.js +74 -74
  293. package/lib/utils/handle-tag-args.js +8 -8
  294. package/lib/utils/http.js +30 -30
  295. package/lib/utils/is-localhost.js +11 -11
  296. package/lib/utils/is-password-input.js +11 -0
  297. package/lib/utils/is-repl.js +10 -10
  298. package/lib/utils/is-window-in-iframe.js +6 -6
  299. package/lib/utils/limit-number.js +10 -10
  300. package/lib/utils/make-reg-exp.js +7 -7
  301. package/lib/utils/moment-loader.js +20 -20
  302. package/lib/utils/parse-file-list.js +71 -71
  303. package/lib/utils/parse-user-agent.js +55 -55
  304. package/lib/utils/path-pattern.js +114 -114
  305. package/lib/utils/prepare-reporters.js +30 -30
  306. package/lib/utils/prerender-callsite.js +18 -18
  307. package/lib/utils/process.js +119 -119
  308. package/lib/utils/promisified-functions.js +46 -46
  309. package/lib/utils/re-executable-promise.js +39 -39
  310. package/lib/utils/render-callsite-sync.js +29 -29
  311. package/lib/utils/render-template.js +9 -9
  312. package/lib/utils/reporter.js +30 -30
  313. package/lib/utils/resolve-path-relatively-cwd.js +7 -7
  314. package/lib/utils/string.js +105 -105
  315. package/lib/utils/temp-directory/cleanup-process/commands.js +7 -7
  316. package/lib/utils/temp-directory/cleanup-process/index.js +143 -143
  317. package/lib/utils/temp-directory/cleanup-process/worker.js +58 -58
  318. package/lib/utils/temp-directory/index.js +87 -87
  319. package/lib/utils/temp-directory/lockfile.js +56 -56
  320. package/lib/utils/thennable.js +7 -7
  321. package/lib/utils/timer.js +15 -15
  322. package/lib/utils/to-posix-path.js +8 -8
  323. package/lib/utils/types.js +2 -2
  324. package/lib/video-recorder/interfaces.js +2 -2
  325. package/lib/video-recorder/process.js +126 -126
  326. package/lib/video-recorder/recorder.js +136 -136
  327. package/lib/video-recorder/test-run-video-recorder.js +69 -69
  328. package/lib/video-recorder/videos.js +37 -37
  329. package/package.json +2 -2
  330. package/ts-defs/index.d.ts +25 -14
  331. package/ts-defs/selectors.d.ts +16 -5
  332. package/ts-defs/testcafe-scripts.d.ts +17 -6
@@ -1,17 +1,17 @@
1
- (function () {
2
- var IframeDriver = window['%testCafeIframeDriver%'];
3
- var driver = new IframeDriver({{{testRunId}}}, {
4
- selectorTimeout: {{{selectorTimeout}}},
5
- pageLoadTimeout: {{{pageLoadTimeout}}},
6
- dialogHandler: {{{dialogHandler}}},
7
- retryTestPages: {{{retryTestPages}}},
8
- speed: {{{speed}}}
9
- });
10
-
11
- driver.start();
12
-
13
- Object.defineProperty(window, '%testCafeDriverInstance%', {
14
- configurable: true,
15
- value: driver
16
- });
17
- })();
1
+ (function () {
2
+ var IframeDriver = window['%testCafeIframeDriver%'];
3
+ var driver = new IframeDriver({{{testRunId}}}, {
4
+ selectorTimeout: {{{selectorTimeout}}},
5
+ pageLoadTimeout: {{{pageLoadTimeout}}},
6
+ dialogHandler: {{{dialogHandler}}},
7
+ retryTestPages: {{{retryTestPages}}},
8
+ speed: {{{speed}}}
9
+ });
10
+
11
+ driver.start();
12
+
13
+ Object.defineProperty(window, '%testCafeDriverInstance%', {
14
+ configurable: true,
15
+ value: driver
16
+ });
17
+ })();
@@ -1,51 +1,51 @@
1
- (function () {
2
- if (window !== window.top)
3
- return;
4
-
5
- var origin = location.origin;
6
-
7
- // NOTE: location.origin doesn't exist in IE11 on Windows 10.10240 LTSB
8
- if (!origin)
9
- origin = location.protocol + '//' + location.hostname + (location.port ? ':' + location.port : '');
10
-
11
- var testRunId = {{{testRunId}}};
12
- var browserId = {{{browserId}}};
13
- var selectorTimeout = {{{selectorTimeout}}};
14
- var pageLoadTimeout = {{{pageLoadTimeout}}};
15
- var childWindowReadyTimeout = {{{childWindowReadyTimeout}}};
16
- var retryTestPages = {{{retryTestPages}}};
17
- var speed = {{{speed}}};
18
- var browserHeartbeatUrl = origin + {{{browserHeartbeatRelativeUrl}}};
19
- var browserStatusUrl = origin + {{{browserStatusRelativeUrl}}};
20
- var browserStatusDoneUrl = origin + {{{browserStatusDoneRelativeUrl}}};
21
- var browserActiveWindowIdUrl = origin + {{{browserActiveWindowIdUrl}}};
22
- var skipJsErrors = {{{skipJsErrors}}};
23
- var dialogHandler = {{{dialogHandler}}};
24
- var userAgent = {{{userAgent}}};
25
- var fixtureName = {{{fixtureName}}};
26
- var testName = {{{testName}}};
27
- var canUseDefaultWindowActions = {{{canUseDefaultWindowActions}}};
28
-
29
- var ClientDriver = window['%testCafeDriver%'];
30
- var driver = new ClientDriver(testRunId,
31
- { heartbeat: browserHeartbeatUrl, status: browserStatusUrl, statusDone: browserStatusDoneUrl, activeWindowId: browserActiveWindowIdUrl },
32
- { userAgent: userAgent, fixtureName: fixtureName, testName: testName },
33
- {
34
- selectorTimeout: selectorTimeout,
35
- pageLoadTimeout: pageLoadTimeout,
36
- childWindowReadyTimeout: childWindowReadyTimeout,
37
- skipJsErrors: skipJsErrors,
38
- dialogHandler: dialogHandler,
39
- retryTestPages: retryTestPages,
40
- speed: speed,
41
- canUseDefaultWindowActions: canUseDefaultWindowActions
42
- }
43
- );
44
-
45
- Object.defineProperty(window, '%testCafeDriverInstance%', {
46
- configurable: true,
47
- value: driver
48
- });
49
-
50
- driver.start();
51
- })();
1
+ (function () {
2
+ if (window !== window.top)
3
+ return;
4
+
5
+ var origin = location.origin;
6
+
7
+ // NOTE: location.origin doesn't exist in IE11 on Windows 10.10240 LTSB
8
+ if (!origin)
9
+ origin = location.protocol + '//' + location.hostname + (location.port ? ':' + location.port : '');
10
+
11
+ var testRunId = {{{testRunId}}};
12
+ var browserId = {{{browserId}}};
13
+ var selectorTimeout = {{{selectorTimeout}}};
14
+ var pageLoadTimeout = {{{pageLoadTimeout}}};
15
+ var childWindowReadyTimeout = {{{childWindowReadyTimeout}}};
16
+ var retryTestPages = {{{retryTestPages}}};
17
+ var speed = {{{speed}}};
18
+ var browserHeartbeatUrl = origin + {{{browserHeartbeatRelativeUrl}}};
19
+ var browserStatusUrl = origin + {{{browserStatusRelativeUrl}}};
20
+ var browserStatusDoneUrl = origin + {{{browserStatusDoneRelativeUrl}}};
21
+ var browserActiveWindowIdUrl = origin + {{{browserActiveWindowIdUrl}}};
22
+ var skipJsErrors = {{{skipJsErrors}}};
23
+ var dialogHandler = {{{dialogHandler}}};
24
+ var userAgent = {{{userAgent}}};
25
+ var fixtureName = {{{fixtureName}}};
26
+ var testName = {{{testName}}};
27
+ var canUseDefaultWindowActions = {{{canUseDefaultWindowActions}}};
28
+
29
+ var ClientDriver = window['%testCafeDriver%'];
30
+ var driver = new ClientDriver(testRunId,
31
+ { heartbeat: browserHeartbeatUrl, status: browserStatusUrl, statusDone: browserStatusDoneUrl, activeWindowId: browserActiveWindowIdUrl },
32
+ { userAgent: userAgent, fixtureName: fixtureName, testName: testName },
33
+ {
34
+ selectorTimeout: selectorTimeout,
35
+ pageLoadTimeout: pageLoadTimeout,
36
+ childWindowReadyTimeout: childWindowReadyTimeout,
37
+ skipJsErrors: skipJsErrors,
38
+ dialogHandler: dialogHandler,
39
+ retryTestPages: retryTestPages,
40
+ speed: speed,
41
+ canUseDefaultWindowActions: canUseDefaultWindowActions
42
+ }
43
+ );
44
+
45
+ Object.defineProperty(window, '%testCafeDriverInstance%', {
46
+ configurable: true,
47
+ value: driver
48
+ });
49
+
50
+ driver.start();
51
+ })();
@@ -1,12 +1,12 @@
1
- window['%hammerhead%'].utils.removeInjectedScript();
2
-
3
- // NOTE: We should have the capability to initialize scripts with different contexts.
4
- // This is required for iframes without the src attribute because Hammerhead does not
5
- // inject scripts into such iframes. So, we wrap all scripts in initialization functions.
6
- (function () {
7
- function initTestCafeUI(window) {
8
- var document = window.document;
9
-
1
+ window['%hammerhead%'].utils.removeInjectedScript();
2
+
3
+ // NOTE: We should have the capability to initialize scripts with different contexts.
4
+ // This is required for iframes without the src attribute because Hammerhead does not
5
+ // inject scripts into such iframes. So, we wrap all scripts in initialization functions.
6
+ (function () {
7
+ function initTestCafeUI(window) {
8
+ var document = window.document;
9
+
10
10
  (function (hammerhead, testCafeCore, Promise$3) {
11
11
  var hammerhead__default = 'default' in hammerhead ? hammerhead['default'] : hammerhead;
12
12
  var testCafeCore__default = 'default' in testCafeCore ? testCafeCore['default'] : testCafeCore;
@@ -1452,8 +1452,8 @@ window['%hammerhead%'].utils.removeInjectedScript();
1452
1452
  hammerhead__default.on(evalIframeScript, function (e) { return initTestCafeUI(nativeMethods$5.contentWindowGetter.call(e.iframe), true); });
1453
1453
 
1454
1454
  }(window['%hammerhead%'], window['%testCafeCore%'], window['%hammerhead%'].Promise));
1455
-
1456
- }
1457
-
1458
- initTestCafeUI(window);
1459
- })();
1455
+
1456
+ }
1457
+
1458
+ initTestCafeUI(window);
1459
+ })();
@@ -1,42 +1,42 @@
1
- <svg xmlns="http://www.w3.org/2000/svg">
2
- <defs>
3
- <style>
4
- .sprite{display:none}.sprite:target{display:inline}
5
- </style>
6
- </defs>
7
- <g class="sprite" id="logo-icon">
8
- <svg width="40" height="26" viewBox="0 0 40 26" fill="none">
9
- <path fill-rule="evenodd" clip-rule="evenodd" d="M30.3446 17.7898H24.1379L22.7585 19.1579H28.9656L34.4826 23.9475H5.51742L11.0344 19.1579H15.8621L14.4826 17.7898H9.65537L0 26H40L30.3446 17.7898Z" fill="white"/>
10
- <path fill-rule="evenodd" clip-rule="evenodd" d="M37.2416 3.42102L33.7933 0L19.3103 14.3684L13.7933 8.89492L10.3447 12.3159L19.3103 21.2109L37.2416 3.42102Z" fill="#36B6E5"/>
11
- </svg>
12
- </g>
13
- <g class="sprite" id="finish">
14
- <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
15
- <rect width="2.02408" height="8.05393" transform="matrix(0.699638 -0.714497 0.699639 0.714497 7 15.2456)" fill="white"/>
16
- <rect width="12.7588" height="2.02408" transform="matrix(0.70062 -0.713534 0.700621 0.713534 12.6428 18.1038)" fill="white"/>
17
- </svg>
18
- </g>
19
- <g class="sprite" id="step">
20
- <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
21
- <path d="M10 8L19 15L10 22V8Z" fill="white"/>
22
- <rect x="19" y="8" width="2" height="14" fill="white"/>
23
- </svg>
24
- </g>
25
- <g class="sprite" id="locked">
26
- <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
27
- <rect x="9" y="15" width="12" height="7" rx="1" fill="white"/>
28
- <path fill-rule="evenodd" clip-rule="evenodd" d="M17 15V11C17 9.89543 16.1046 9 15 9C13.8954 9 13 9.89543 13 11V15H11V11C11 8.79086 12.7909 7 15 7C17.2091 7 19 8.79086 19 11V15H17Z" fill="white"/>
29
- </svg>
30
- </g>
31
- <g class="sprite" id="unlocked">
32
- <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
33
- <path d="M9 15C9 14.4477 9.44772 14 10 14H20C20.5523 14 21 14.4477 21 15V21C21 21.5523 20.5523 22 20 22H10C9.44772 22 9 21.5523 9 21V15Z" fill="white"/>
34
- <path fill-rule="evenodd" clip-rule="evenodd" d="M17.1519 11V8C17.1519 6.89543 16.2564 6 15.1519 6C14.0473 6 13.1519 6.89543 13.1519 8V14.0429C13.1519 14.7186 13.4869 15.3161 14 15.6781V17.8746C12.3523 17.38 11.1519 15.8517 11.1519 14.0429V8C11.1519 5.79086 12.9427 4 15.1519 4C17.361 4 19.1519 5.79086 19.1519 8V11H17.1519Z" fill="white"/>
35
- </svg>
36
- </g>
37
- <g class="sprite" id="resume">
38
- <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
39
- <path d="M11 8L20 15L11 22V8Z" fill="white"/>
40
- </svg>
41
- </g>
42
- </svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg">
2
+ <defs>
3
+ <style>
4
+ .sprite{display:none}.sprite:target{display:inline}
5
+ </style>
6
+ </defs>
7
+ <g class="sprite" id="logo-icon">
8
+ <svg width="40" height="26" viewBox="0 0 40 26" fill="none">
9
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M30.3446 17.7898H24.1379L22.7585 19.1579H28.9656L34.4826 23.9475H5.51742L11.0344 19.1579H15.8621L14.4826 17.7898H9.65537L0 26H40L30.3446 17.7898Z" fill="white"/>
10
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M37.2416 3.42102L33.7933 0L19.3103 14.3684L13.7933 8.89492L10.3447 12.3159L19.3103 21.2109L37.2416 3.42102Z" fill="#36B6E5"/>
11
+ </svg>
12
+ </g>
13
+ <g class="sprite" id="finish">
14
+ <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
15
+ <rect width="2.02408" height="8.05393" transform="matrix(0.699638 -0.714497 0.699639 0.714497 7 15.2456)" fill="white"/>
16
+ <rect width="12.7588" height="2.02408" transform="matrix(0.70062 -0.713534 0.700621 0.713534 12.6428 18.1038)" fill="white"/>
17
+ </svg>
18
+ </g>
19
+ <g class="sprite" id="step">
20
+ <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
21
+ <path d="M10 8L19 15L10 22V8Z" fill="white"/>
22
+ <rect x="19" y="8" width="2" height="14" fill="white"/>
23
+ </svg>
24
+ </g>
25
+ <g class="sprite" id="locked">
26
+ <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
27
+ <rect x="9" y="15" width="12" height="7" rx="1" fill="white"/>
28
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M17 15V11C17 9.89543 16.1046 9 15 9C13.8954 9 13 9.89543 13 11V15H11V11C11 8.79086 12.7909 7 15 7C17.2091 7 19 8.79086 19 11V15H17Z" fill="white"/>
29
+ </svg>
30
+ </g>
31
+ <g class="sprite" id="unlocked">
32
+ <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
33
+ <path d="M9 15C9 14.4477 9.44772 14 10 14H20C20.5523 14 21 14.4477 21 15V21C21 21.5523 20.5523 22 20 22H10C9.44772 22 9 21.5523 9 21V15Z" fill="white"/>
34
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M17.1519 11V8C17.1519 6.89543 16.2564 6 15.1519 6C14.0473 6 13.1519 6.89543 13.1519 8V14.0429C13.1519 14.7186 13.4869 15.3161 14 15.6781V17.8746C12.3523 17.38 11.1519 15.8517 11.1519 14.0429V8C11.1519 5.79086 12.9427 4 15.1519 4C17.361 4 19.1519 5.79086 19.1519 8V11H17.1519Z" fill="white"/>
35
+ </svg>
36
+ </g>
37
+ <g class="sprite" id="resume">
38
+ <svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
39
+ <path d="M11 8L20 15L11 22V8Z" fill="white"/>
40
+ </svg>
41
+ </g>
42
+ </svg>
@@ -1,6 +1,6 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- /*global Symbol*/
4
- exports.default = Symbol('functionBuilder');
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /*global Symbol*/
4
+ exports.default = Symbol('functionBuilder');
5
5
  module.exports = exports.default;
6
6
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci1zeW1ib2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50LWZ1bmN0aW9ucy9idWlsZGVyLXN5bWJvbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGlCQUFpQjtBQUNqQixrQkFBZSxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qZ2xvYmFsIFN5bWJvbCovXG5leHBvcnQgZGVmYXVsdCBTeW1ib2woJ2Z1bmN0aW9uQnVpbGRlcicpO1xuIl19
@@ -1,157 +1,157 @@
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 lodash_1 = require("lodash");
7
- const test_run_tracker_1 = __importDefault(require("../api/test-run-tracker"));
8
- const builder_symbol_1 = __importDefault(require("./builder-symbol"));
9
- const replicator_1 = require("./replicator");
10
- const observation_1 = require("../test-run/commands/observation");
11
- const compile_client_function_1 = __importDefault(require("../compiler/compile-client-function"));
12
- const runtime_1 = require("../errors/runtime");
13
- const type_assertions_1 = require("../errors/runtime/type-assertions");
14
- const types_1 = require("../errors/types");
15
- const get_callsite_1 = require("../errors/get-callsite");
16
- const re_executable_promise_1 = __importDefault(require("../utils/re-executable-promise"));
17
- const marker_symbol_1 = __importDefault(require("../test-run/marker-symbol"));
18
- const selector_api_execution_mode_1 = __importDefault(require("./selector-api-execution-mode"));
19
- const DEFAULT_EXECUTION_CALLSITE_NAME = '__$$clientFunction$$';
20
- class ClientFunctionBuilder {
21
- constructor(fn, options, callsiteNames = {}) {
22
- this.callsiteNames = {
23
- instantiation: callsiteNames.instantiation,
24
- execution: callsiteNames.execution || DEFAULT_EXECUTION_CALLSITE_NAME
25
- };
26
- if (lodash_1.isNil(options))
27
- options = {};
28
- this._validateOptions(options);
29
- this.fn = fn;
30
- this.options = options;
31
- this.compiledFnCode = this._getCompiledFnCode();
32
- if (!this.compiledFnCode)
33
- throw this._createInvalidFnTypeError();
34
- this.replicator = replicator_1.createReplicator(this._getReplicatorTransforms());
35
- }
36
- _decorateFunction(clientFn) {
37
- clientFn[builder_symbol_1.default] = this;
38
- clientFn.with = options => {
39
- return this._getClientFnWithOverriddenOptions(options);
40
- };
41
- }
42
- _getClientFnWithOverriddenOptions(options) {
43
- if (typeof options === 'object')
44
- options = lodash_1.assign({}, this.options, options);
45
- const builder = new this.constructor(this.fn, options, {
46
- instantiation: 'with',
47
- execution: this.callsiteNames.execution
48
- });
49
- return builder.getFunction();
50
- }
51
- getBoundTestRun() {
52
- // NOTE: `boundTestRun` can be either TestController or TestRun instance.
53
- if (this.options.boundTestRun)
54
- return this.options.boundTestRun.testRun || this.options.boundTestRun;
55
- return null;
56
- }
57
- _getTestRun() {
58
- return this.getBoundTestRun() || test_run_tracker_1.default.resolveContextTestRun();
59
- }
60
- _getObservedCallsites() {
61
- var _a;
62
- return ((_a = this._getTestRun()) === null || _a === void 0 ? void 0 : _a.observedCallsites) || null;
63
- }
64
- getFunction() {
65
- const builder = this;
66
- const clientFn = function __$$clientFunction$$() {
67
- const testRun = builder._getTestRun();
68
- const callsite = get_callsite_1.getCallsiteForMethod(builder.callsiteNames.execution);
69
- const args = [];
70
- // OPTIMIZATION: don't leak `arguments` object.
71
- for (let i = 0; i < arguments.length; i++)
72
- args.push(arguments[i]);
73
- if (selector_api_execution_mode_1.default.isSync)
74
- return builder._executeCommandSync(args, testRun, callsite);
75
- return builder._executeCommand(args, testRun, callsite);
76
- };
77
- this._decorateFunction(clientFn);
78
- return clientFn;
79
- }
80
- getCommand(args) {
81
- const encodedArgs = this.replicator.encode(args);
82
- const encodedDependencies = this.replicator.encode(this.getFunctionDependencies());
83
- return this._createTestRunCommand(encodedArgs, encodedDependencies);
84
- }
85
- // Overridable methods
86
- getFunctionDependencies() {
87
- return this.options.dependencies || {};
88
- }
89
- _createTestRunCommand(encodedArgs, encodedDependencies) {
90
- return new observation_1.ExecuteClientFunctionCommand({
91
- instantiationCallsiteName: this.callsiteNames.instantiation,
92
- fnCode: this.compiledFnCode,
93
- args: encodedArgs,
94
- dependencies: encodedDependencies
95
- }, this._getTestRun());
96
- }
97
- _getCompiledFnCode() {
98
- if (typeof this.fn === 'function')
99
- return compile_client_function_1.default(this.fn.toString(), this.options.dependencies, this.callsiteNames.instantiation, this.callsiteNames.instantiation);
100
- return null;
101
- }
102
- _createInvalidFnTypeError() {
103
- return new runtime_1.ClientFunctionAPIError(this.callsiteNames.instantiation, this.callsiteNames.instantiation, types_1.RUNTIME_ERRORS.clientFunctionCodeIsNotAFunction, typeof this.fn);
104
- }
105
- _executeCommand(args, testRun, callsite) {
106
- // NOTE: should be kept outside of lazy promise to preserve
107
- // correct callsite in case of replicator error.
108
- const command = this.getCommand(args);
109
- return re_executable_promise_1.default.fromFn(async () => {
110
- if (!testRun) {
111
- const err = new runtime_1.ClientFunctionAPIError(this.callsiteNames.execution, this.callsiteNames.instantiation, types_1.RUNTIME_ERRORS.clientFunctionCannotResolveTestRun);
112
- // NOTE: force callsite here, because more likely it will
113
- // be impossible to resolve it by method name from a lazy promise.
114
- err.callsite = callsite;
115
- throw err;
116
- }
117
- const result = await testRun.executeAction(command.type, command, callsite);
118
- return this._processResult(result, args);
119
- });
120
- }
121
- _executeCommandSync(args, testRun, callsite) {
122
- // NOTE: should be kept outside of lazy promise to preserve
123
- // correct callsite in case of replicator error.
124
- const command = this.getCommand(args);
125
- if (!testRun) {
126
- const err = new runtime_1.ClientFunctionAPIError(this.callsiteNames.execution, this.callsiteNames.instantiation, types_1.RUNTIME_ERRORS.clientFunctionCannotResolveTestRun);
127
- // NOTE: force callsite here, because more likely it will
128
- // be impossible to resolve it by method name from a lazy promise.
129
- err.callsite = callsite;
130
- throw err;
131
- }
132
- const result = testRun.executeActionSync(command.type, command, callsite);
133
- return this._processResult(result, args);
134
- }
135
- _processResult(result) {
136
- return this.replicator.decode(result);
137
- }
138
- _validateOptions(options) {
139
- type_assertions_1.assertType(type_assertions_1.is.nonNullObject, this.callsiteNames.instantiation, '"options" argument', options);
140
- if (!lodash_1.isNil(options.boundTestRun)) {
141
- // NOTE: `boundTestRun` can be either TestController or TestRun instance.
142
- const boundTestRun = options.boundTestRun.testRun || options.boundTestRun;
143
- if (!boundTestRun[marker_symbol_1.default])
144
- throw new runtime_1.APIError(this.callsiteNames.instantiation, types_1.RUNTIME_ERRORS.invalidClientFunctionTestRunBinding);
145
- }
146
- if (!lodash_1.isNil(options.dependencies))
147
- type_assertions_1.assertType(type_assertions_1.is.nonNullObject, this.callsiteNames.instantiation, '"dependencies" option', options.dependencies);
148
- }
149
- _getReplicatorTransforms() {
150
- return [
151
- new replicator_1.FunctionTransform(this.callsiteNames)
152
- ];
153
- }
154
- }
155
- exports.default = ClientFunctionBuilder;
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 lodash_1 = require("lodash");
7
+ const test_run_tracker_1 = __importDefault(require("../api/test-run-tracker"));
8
+ const builder_symbol_1 = __importDefault(require("./builder-symbol"));
9
+ const replicator_1 = require("./replicator");
10
+ const observation_1 = require("../test-run/commands/observation");
11
+ const compile_client_function_1 = __importDefault(require("../compiler/compile-client-function"));
12
+ const runtime_1 = require("../errors/runtime");
13
+ const type_assertions_1 = require("../errors/runtime/type-assertions");
14
+ const types_1 = require("../errors/types");
15
+ const get_callsite_1 = require("../errors/get-callsite");
16
+ const re_executable_promise_1 = __importDefault(require("../utils/re-executable-promise"));
17
+ const marker_symbol_1 = __importDefault(require("../test-run/marker-symbol"));
18
+ const selector_api_execution_mode_1 = __importDefault(require("./selector-api-execution-mode"));
19
+ const DEFAULT_EXECUTION_CALLSITE_NAME = '__$$clientFunction$$';
20
+ class ClientFunctionBuilder {
21
+ constructor(fn, options, callsiteNames = {}) {
22
+ this.callsiteNames = {
23
+ instantiation: callsiteNames.instantiation,
24
+ execution: callsiteNames.execution || DEFAULT_EXECUTION_CALLSITE_NAME
25
+ };
26
+ if (lodash_1.isNil(options))
27
+ options = {};
28
+ this._validateOptions(options);
29
+ this.fn = fn;
30
+ this.options = options;
31
+ this.compiledFnCode = this._getCompiledFnCode();
32
+ if (!this.compiledFnCode)
33
+ throw this._createInvalidFnTypeError();
34
+ this.replicator = replicator_1.createReplicator(this._getReplicatorTransforms());
35
+ }
36
+ _decorateFunction(clientFn) {
37
+ clientFn[builder_symbol_1.default] = this;
38
+ clientFn.with = options => {
39
+ return this._getClientFnWithOverriddenOptions(options);
40
+ };
41
+ }
42
+ _getClientFnWithOverriddenOptions(options) {
43
+ if (typeof options === 'object')
44
+ options = lodash_1.assign({}, this.options, options);
45
+ const builder = new this.constructor(this.fn, options, {
46
+ instantiation: 'with',
47
+ execution: this.callsiteNames.execution
48
+ });
49
+ return builder.getFunction();
50
+ }
51
+ getBoundTestRun() {
52
+ // NOTE: `boundTestRun` can be either TestController or TestRun instance.
53
+ if (this.options.boundTestRun)
54
+ return this.options.boundTestRun.testRun || this.options.boundTestRun;
55
+ return null;
56
+ }
57
+ _getTestRun() {
58
+ return this.getBoundTestRun() || test_run_tracker_1.default.resolveContextTestRun();
59
+ }
60
+ _getObservedCallsites() {
61
+ var _a;
62
+ return ((_a = this._getTestRun()) === null || _a === void 0 ? void 0 : _a.observedCallsites) || null;
63
+ }
64
+ getFunction() {
65
+ const builder = this;
66
+ const clientFn = function __$$clientFunction$$() {
67
+ const testRun = builder._getTestRun();
68
+ const callsite = get_callsite_1.getCallsiteForMethod(builder.callsiteNames.execution);
69
+ const args = [];
70
+ // OPTIMIZATION: don't leak `arguments` object.
71
+ for (let i = 0; i < arguments.length; i++)
72
+ args.push(arguments[i]);
73
+ if (selector_api_execution_mode_1.default.isSync)
74
+ return builder._executeCommandSync(args, testRun, callsite);
75
+ return builder._executeCommand(args, testRun, callsite);
76
+ };
77
+ this._decorateFunction(clientFn);
78
+ return clientFn;
79
+ }
80
+ getCommand(args) {
81
+ const encodedArgs = this.replicator.encode(args);
82
+ const encodedDependencies = this.replicator.encode(this.getFunctionDependencies());
83
+ return this._createTestRunCommand(encodedArgs, encodedDependencies);
84
+ }
85
+ // Overridable methods
86
+ getFunctionDependencies() {
87
+ return this.options.dependencies || {};
88
+ }
89
+ _createTestRunCommand(encodedArgs, encodedDependencies) {
90
+ return new observation_1.ExecuteClientFunctionCommand({
91
+ instantiationCallsiteName: this.callsiteNames.instantiation,
92
+ fnCode: this.compiledFnCode,
93
+ args: encodedArgs,
94
+ dependencies: encodedDependencies
95
+ }, this._getTestRun());
96
+ }
97
+ _getCompiledFnCode() {
98
+ if (typeof this.fn === 'function')
99
+ return compile_client_function_1.default(this.fn.toString(), this.options.dependencies, this.callsiteNames.instantiation, this.callsiteNames.instantiation);
100
+ return null;
101
+ }
102
+ _createInvalidFnTypeError() {
103
+ return new runtime_1.ClientFunctionAPIError(this.callsiteNames.instantiation, this.callsiteNames.instantiation, types_1.RUNTIME_ERRORS.clientFunctionCodeIsNotAFunction, typeof this.fn);
104
+ }
105
+ _executeCommand(args, testRun, callsite) {
106
+ // NOTE: should be kept outside of lazy promise to preserve
107
+ // correct callsite in case of replicator error.
108
+ const command = this.getCommand(args);
109
+ return re_executable_promise_1.default.fromFn(async () => {
110
+ if (!testRun) {
111
+ const err = new runtime_1.ClientFunctionAPIError(this.callsiteNames.execution, this.callsiteNames.instantiation, types_1.RUNTIME_ERRORS.clientFunctionCannotResolveTestRun);
112
+ // NOTE: force callsite here, because more likely it will
113
+ // be impossible to resolve it by method name from a lazy promise.
114
+ err.callsite = callsite;
115
+ throw err;
116
+ }
117
+ const result = await testRun.executeAction(command.type, command, callsite);
118
+ return this._processResult(result, args);
119
+ });
120
+ }
121
+ _executeCommandSync(args, testRun, callsite) {
122
+ // NOTE: should be kept outside of lazy promise to preserve
123
+ // correct callsite in case of replicator error.
124
+ const command = this.getCommand(args);
125
+ if (!testRun) {
126
+ const err = new runtime_1.ClientFunctionAPIError(this.callsiteNames.execution, this.callsiteNames.instantiation, types_1.RUNTIME_ERRORS.clientFunctionCannotResolveTestRun);
127
+ // NOTE: force callsite here, because more likely it will
128
+ // be impossible to resolve it by method name from a lazy promise.
129
+ err.callsite = callsite;
130
+ throw err;
131
+ }
132
+ const result = testRun.executeActionSync(command.type, command, callsite);
133
+ return this._processResult(result, args);
134
+ }
135
+ _processResult(result) {
136
+ return this.replicator.decode(result);
137
+ }
138
+ _validateOptions(options) {
139
+ type_assertions_1.assertType(type_assertions_1.is.nonNullObject, this.callsiteNames.instantiation, '"options" argument', options);
140
+ if (!lodash_1.isNil(options.boundTestRun)) {
141
+ // NOTE: `boundTestRun` can be either TestController or TestRun instance.
142
+ const boundTestRun = options.boundTestRun.testRun || options.boundTestRun;
143
+ if (!boundTestRun[marker_symbol_1.default])
144
+ throw new runtime_1.APIError(this.callsiteNames.instantiation, types_1.RUNTIME_ERRORS.invalidClientFunctionTestRunBinding);
145
+ }
146
+ if (!lodash_1.isNil(options.dependencies))
147
+ type_assertions_1.assertType(type_assertions_1.is.nonNullObject, this.callsiteNames.instantiation, '"dependencies" option', options.dependencies);
148
+ }
149
+ _getReplicatorTransforms() {
150
+ return [
151
+ new replicator_1.FunctionTransform(this.callsiteNames)
152
+ ];
153
+ }
154
+ }
155
+ exports.default = ClientFunctionBuilder;
156
156
  module.exports = exports.default;
157
157
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LWZ1bmN0aW9uLWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50LWZ1bmN0aW9ucy9jbGllbnQtZnVuY3Rpb24tYnVpbGRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUE0RDtBQUM1RCwrRUFBcUQ7QUFDckQsc0VBQXFEO0FBQ3JELDZDQUFtRTtBQUNuRSxrRUFBZ0Y7QUFDaEYsa0dBQXdFO0FBQ3hFLCtDQUFxRTtBQUNyRSx1RUFBbUU7QUFDbkUsMkNBQWlEO0FBQ2pELHlEQUE4RDtBQUM5RCwyRkFBaUU7QUFDakUsOEVBQXNEO0FBQ3RELGdHQUFxRTtBQUVyRSxNQUFNLCtCQUErQixHQUFHLHNCQUFzQixDQUFDO0FBRS9ELE1BQXFCLHFCQUFxQjtJQUN0QyxZQUFhLEVBQUUsRUFBRSxPQUFPLEVBQUUsYUFBYSxHQUFHLEVBQUU7UUFDeEMsSUFBSSxDQUFDLGFBQWEsR0FBRztZQUNqQixhQUFhLEVBQUUsYUFBYSxDQUFDLGFBQWE7WUFDMUMsU0FBUyxFQUFNLGFBQWEsQ0FBQyxTQUFTLElBQUksK0JBQStCO1NBQzVFLENBQUM7UUFFRixJQUFJLGNBQWlCLENBQUMsT0FBTyxDQUFDO1lBQzFCLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFFakIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRS9CLElBQUksQ0FBQyxFQUFFLEdBQWUsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQVUsT0FBTyxDQUFDO1FBQzlCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjO1lBQ3BCLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFFM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyw2QkFBZ0IsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxD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LE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsZ0JBQWdCLENBQUUsT0FBTztRQUNyQiw0QkFBVSxDQUFDLG9CQUFFLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRTlGLElBQUksQ0FBQyxjQUFpQixDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUMxQyx5RUFBeUU7WUFDekUsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQztZQUUxRSxJQUFJLENBQUMsWUFBWSxDQUFDLHVCQUFhLENBQUM7Z0JBQzVCLE1BQU0sSUFBSSxrQkFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLHNCQUFjLENBQUMsbUNBQW1DLENBQUMsQ0FBQztTQUNoSDtRQUVELElBQUksQ0FBQyxjQUFpQixDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7WUFDeEMsNEJBQVUsQ0FBQyxvQkFBRSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSx1QkFBdUIsRUFBRSxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDdEgsQ0FBQztJQUVELHdCQUF3QjtRQUNwQixPQUFPO1lBQ0gsSUFBSSw4QkFBaUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1NBQzVDLENBQUM7SUFDTixDQUFDO0NBQ0o7QUFwTEQsd0NBb0xDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNOaWwgYXMgaXNOdWxsT3JVbmRlZmluZWQsIGFzc2lnbiB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgdGVzdFJ1blRyYWNrZXIgZnJvbSAnLi4vYXBpL3Rlc3QtcnVuLXRyYWNrZXInO1xuaW1wb3J0IGZ1bmN0aW9uQnVpbGRlclN5bWJvbCBmcm9tICcuL2J1aWxkZXItc3ltYm9sJztcbmltcG9ydCB7IGNyZWF0ZVJlcGxpY2F0b3IsIEZ1bmN0aW9uVHJhbnNmb3JtIH0gZnJvbSAnLi9yZXBsaWNhdG9yJztcbmltcG9ydCB7IEV4ZWN1dGVDbGllbnRGdW5jdGlvbkNvbW1hbmQgfSBmcm9tICcuLi90ZXN0LXJ1bi9jb21tYW5kcy9vYnNlcnZhdGlvbic7XG5pbXBvcnQgY29tcGlsZUNsaWVudEZ1bmN0aW9uIGZyb20gJy4uL2NvbXBpbGVyL2NvbXBpbGUtY2xpZW50LWZ1bmN0aW9uJztcbmltcG9ydCB7IEFQSUVycm9yLCBDbGllbnRGdW5jdGlvbkFQSUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL3J1bnRpbWUnO1xuaW1wb3J0IHsgYXNzZXJ0VHlwZSwgaXMgfSBmcm9tICcuLi9lcnJvcnMvcnVudGltZS90eXBlLWFzc2VydGlvbnMnO1xuaW1wb3J0IHsgUlVOVElNRV9FUlJPUlMgfSBmcm9tICcuLi9lcnJvcnMvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0Q2FsbHNpdGVGb3JNZXRob2QgfSBmcm9tICcuLi9lcnJvcnMvZ2V0LWNhbGxzaXRlJztcbmltcG9ydCBSZUV4ZWN1dGFibGVQcm9taXNlIGZyb20gJy4uL3V0aWxzL3JlLWV4ZWN1dGFibGUtcHJvbWlzZSc7XG5pbXBvcnQgdGVzdFJ1bk1hcmtlciBmcm9tICcuLi90ZXN0LXJ1bi9tYXJrZXItc3ltYm9sJztcbmltcG9ydCBzZWxlY3RvckFwaUV4ZWN1dGlvbk1vZGUgZnJvbSAnLi9zZWxlY3Rvci1hcGktZXhlY3V0aW9uLW1vZGUnO1xuXG5jb25zdCBERUZBVUxUX0VYRUNVVElPTl9DQUxMU0lURV9OQU1FID0gJ19fJCRjbGllbnRGdW5jdGlvbiQkJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2xpZW50RnVuY3Rpb25CdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3RvciAoZm4sIG9wdGlvbnMsIGNhbGxzaXRlTmFtZXMgPSB7fSkge1xuICAgICAgICB0aGlzLmNhbGxzaXRlTmFtZXMgPSB7XG4gICAgICAgICAgICBpbnN0YW50aWF0aW9uOiBjYWxsc2l0ZU5hbWVzLmluc3RhbnRpYXRpb24sXG4gICAgICAgICAgICBleGVjdXRpb246ICAgICBjYWxsc2l0ZU5hbWVzLmV4ZWN1dGlvbiB8fCBERUZBVUxUX0VYRUNVVElPTl9DQUxMU0lURV9OQU1FXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuXG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlT3B0aW9ucyhvcHRpb25zKTtcblxuICAgICAgICB0aGlzLmZuICAgICAgICAgICAgID0gZm47XG4gICAgICAgIHRoaXMub3B0aW9ucyAgICAgICAgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLmNvbXBpbGVkRm5Db2RlID0gdGhpcy5fZ2V0Q29tcGlsZWRGbkNvZGUoKTtcblxuICAgICAgICBpZiAoIXRoaXMuY29tcGlsZWRGbkNvZGUpXG4gICAgICAgICAgICB0aHJvdyB0aGlzLl9jcmVhdGVJbnZhbGlkRm5UeXBlRXJyb3IoKTtcblxuICAgICAgICB0aGlzLnJlcGxpY2F0b3IgPSBjcmVhdGVSZXBsaWNhdG9yKHRoaXMuX2dldFJlcGxpY2F0b3JUcmFuc2Zvcm1zKCkpO1xuICAgIH1cblxuICAgIF9kZWNvcmF0ZUZ1bmN0aW9uIChjbGllbnRGbikge1xuICAgICAgICBjbGllbnRGbltmdW5jdGlvbkJ1aWxkZXJTeW1ib2xdID0gdGhpcztcblxuICAgICAgICBjbGllbnRGbi53aXRoID0gb3B0aW9ucyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q2xpZW50Rm5XaXRoT3ZlcnJpZGRlbk9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgX2dldENsaWVudEZuV2l0aE92ZXJyaWRkZW5PcHRpb25zIChvcHRpb25zKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcpXG4gICAgICAgICAgICBvcHRpb25zID0gYXNzaWduKHt9LCB0aGlzLm9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmZuLCBvcHRpb25zLCB7XG4gICAgICAgICAgICBpbnN0YW50aWF0aW9uOiAnd2l0aCcsXG4gICAgICAgICAgICBleGVjdXRpb246ICAgICB0aGlzLmNhbGxzaXRlTmFtZXMuZXhlY3V0aW9uXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBidWlsZGVyLmdldEZ1bmN0aW9uKCk7XG4gICAgfVxuXG4gICAgZ2V0Qm91bmRUZXN0UnVuICgpIHtcbiAgICAgICAgLy8gTk9URTogYGJvdW5kVGVzdFJ1bmAgY2FuIGJlIGVpdGhlciBUZXN0Q29udHJvbGxlciBvciBUZXN0UnVuIGluc3RhbmNlLlxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJvdW5kVGVzdFJ1bilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYm91bmRUZXN0UnVuLnRlc3RSdW4gfHwgdGhpcy5vcHRpb25zLmJvdW5kVGVzdFJ1bjtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBfZ2V0VGVzdFJ1biAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJvdW5kVGVzdFJ1bigpIHx8IHRlc3RSdW5UcmFja2VyLnJlc29sdmVDb250ZXh0VGVzdFJ1bigpO1xuICAgIH1cblxuICAgIF9nZXRPYnNlcnZlZENhbGxzaXRlcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRUZXN0UnVuKCk/Lm9ic2VydmVkQ2FsbHNpdGVzIHx8IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0RnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gdGhpcztcblxuICAgICAgICBjb25zdCBjbGllbnRGbiA9IGZ1bmN0aW9uIF9fJCRjbGllbnRGdW5jdGlvbiQkICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlc3RSdW4gID0gYnVpbGRlci5fZ2V0VGVzdFJ1bigpO1xuICAgICAgICAgICAgY29uc3QgY2FsbHNpdGUgPSBnZXRDYWxsc2l0ZUZvck1ldGhvZChidWlsZGVyLmNhbGxzaXRlTmFtZXMuZXhlY3V0aW9uKTtcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgICAgID0gW107XG5cbiAgICAgICAgICAgIC8vIE9QVElNSVpBVElPTjogZG9uJ3QgbGVhayBgYXJndW1lbnRzYCBvYmplY3QuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTtcblxuICAgICAgICAgICAgaWYgKHNlbGVjdG9yQXBpRXhlY3V0aW9uTW9kZS5pc1N5bmMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuX2V4ZWN1dGVDb21tYW5kU3luYyhhcmdzLCB0ZXN0UnVuLCBjYWxsc2l0ZSk7XG5cbiAgICAgICAgICAgIHJldHVybiBidWlsZGVyLl9leGVjdXRlQ29tbWFuZChhcmdzLCB0ZXN0UnVuLCBjYWxsc2l0ZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fZGVjb3JhdGVGdW5jdGlvbihjbGllbnRGbik7XG5cbiAgICAgICAgcmV0dXJuIGNsaWVudEZuO1xuICAgIH1cblxuICAgIGdldENvbW1hbmQgKGFyZ3MpIHtcbiAgICAgICAgY29uc3QgZW5jb2RlZEFyZ3MgICAgICAgICA9IHRoaXMucmVwbGljYXRvci5lbmNvZGUoYXJncyk7XG4gICAgICAgIGNvbnN0IGVuY29kZWREZXBlbmRlbmNpZXMgPSB0aGlzLnJlcGxpY2F0b3IuZW5jb2RlKHRoaXMuZ2V0RnVuY3Rpb25EZXBlbmRlbmNpZXMoKSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVRlc3RSdW5Db21tYW5kKGVuY29kZWRBcmdzLCBlbmNvZGVkRGVwZW5kZW5jaWVzKTtcbiAgICB9XG5cblxuICAgIC8vIE92ZXJyaWRhYmxlIG1ldGhvZHNcbiAgICBnZXRGdW5jdGlvbkRlcGVuZGVuY2llcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZGVwZW5kZW5jaWVzIHx8IHt9O1xuICAgIH1cblxuICAgIF9jcmVhdGVUZXN0UnVuQ29tbWFuZCAoZW5jb2RlZEFyZ3MsIGVuY29kZWREZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFeGVjdXRlQ2xpZW50RnVuY3Rpb25Db21tYW5kKHtcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWU6IHRoaXMuY2FsbHNpdGVOYW1lcy5pbnN0YW50aWF0aW9uLFxuICAgICAgICAgICAgZm5Db2RlOiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21waWxlZEZuQ29kZSxcbiAgICAgICAgICAgIGFyZ3M6ICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRBcmdzLFxuICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiAgICAgICAgICAgICAgZW5jb2RlZERlcGVuZGVuY2llc1xuICAgICAgICB9LCB0aGlzLl9nZXRUZXN0UnVuKCkpO1xuICAgIH1cblxuICAgIF9nZXRDb21waWxlZEZuQ29kZSAoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5mbiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIHJldHVybiBjb21waWxlQ2xpZW50RnVuY3Rpb24odGhpcy5mbi50b1N0cmluZygpLCB0aGlzLm9wdGlvbnMuZGVwZW5kZW5jaWVzLCB0aGlzLmNhbGxzaXRlTmFtZXMuaW5zdGFudGlhdGlvbiwgdGhpcy5jYWxsc2l0ZU5hbWVzLmluc3RhbnRpYXRpb24pO1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIF9jcmVhdGVJbnZhbGlkRm5UeXBlRXJyb3IgKCkge1xuICAgICAgICByZXR1cm4gbmV3IENsaWVudEZ1bmN0aW9uQVBJRXJyb3IodGhpcy5jYWxsc2l0ZU5hbWVzLmluc3RhbnRpYXRpb24sIHRoaXMuY2FsbHNpdGVOYW1lcy5pbnN0YW50aWF0aW9uLCBSVU5USU1FX0VSUk9SUy5jbGllbnRGdW5jdGlvbkNvZGVJc05vdEFGdW5jdGlvbiwgdHlwZW9mIHRoaXMuZm4pO1xuICAgIH1cblxuICAgIF9leGVjdXRlQ29tbWFuZCAoYXJncywgdGVzdFJ1biwgY2FsbHNpdGUpIHtcbiAgICAgICAgLy8gTk9URTogc2hvdWxkIGJlIGtlcHQgb3V0c2lkZSBvZiBsYXp5IHByb21pc2UgdG8gcHJlc2VydmVcbiAgICAgICAgLy8gY29ycmVjdCBjYWxsc2l0ZSBpbiBjYXNlIG9mIHJlcGxpY2F0b3IgZXJyb3IuXG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSB0aGlzLmdldENvbW1hbmQoYXJncyk7XG5cbiAgICAgICAgcmV0dXJuIFJlRXhlY3V0YWJsZVByb21pc2UuZnJvbUZuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGVzdFJ1bikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBDbGllbnRGdW5jdGlvbkFQSUVycm9yKHRoaXMuY2FsbHNpdGVOYW1lcy5leGVjdXRpb24sIHRoaXMuY2FsbHNpdGVOYW1lcy5pbnN0YW50aWF0aW9uLCBSVU5USU1FX0VSUk9SUy5jbGllbnRGdW5jdGlvbkNhbm5vdFJlc29sdmVUZXN0UnVuKTtcblxuICAgICAgICAgICAgICAgIC8vIE5PVEU6IGZvcmNlIGNhbGxzaXRlIGhlcmUsIGJlY2F1c2UgbW9yZSBsaWtlbHkgaXQgd2lsbFxuICAgICAgICAgICAgICAgIC8vIGJlIGltcG9zc2libGUgdG8gcmVzb2x2ZSBpdCBieSBtZXRob2QgbmFtZSBmcm9tIGEgbGF6eSBwcm9taXNlLlxuICAgICAgICAgICAgICAgIGVyci5jYWxsc2l0ZSA9IGNhbGxzaXRlO1xuXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0ZXN0UnVuLmV4ZWN1dGVBY3Rpb24oY29tbWFuZC50eXBlLCBjb21tYW5kLCBjYWxsc2l0ZSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzUmVzdWx0KHJlc3VsdCwgYXJncyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9leGVjdXRlQ29tbWFuZFN5bmMgKGFyZ3MsIHRlc3RSdW4sIGNhbGxzaXRlKSB7XG4gICAgICAgIC8vIE5PVEU6IHNob3VsZCBiZSBrZXB0IG91dHNpZGUgb2YgbGF6eSBwcm9taXNlIHRvIHByZXNlcnZlXG4gICAgICAgIC8vIGNvcnJlY3QgY2FsbHNpdGUgaW4gY2FzZSBvZiByZXBsaWNhdG9yIGVycm9yLlxuICAgICAgICBjb25zdCBjb21tYW5kID0gdGhpcy5nZXRDb21tYW5kKGFyZ3MpO1xuXG4gICAgICAgIGlmICghdGVzdFJ1bikge1xuICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IENsaWVudEZ1bmN0aW9uQVBJRXJyb3IodGhpcy5jYWxsc2l0ZU5hbWVzLmV4ZWN1dGlvbiwgdGhpcy5jYWxsc2l0ZU5hbWVzLmluc3RhbnRpYXRpb24sIFJVTlRJTUVfRVJST1JTLmNsaWVudEZ1bmN0aW9uQ2Fubm90UmVzb2x2ZVRlc3RSdW4pO1xuXG4gICAgICAgICAgICAvLyBOT1RFOiBmb3JjZSBjYWxsc2l0ZSBoZXJlLCBiZWNhdXNlIG1vcmUgbGlrZWx5IGl0IHdpbGxcbiAgICAgICAgICAgIC8vIGJlIGltcG9zc2libGUgdG8gcmVzb2x2ZSBpdCBieSBtZXRob2QgbmFtZSBmcm9tIGEgbGF6eSBwcm9taXNlLlxuICAgICAgICAgICAgZXJyLmNhbGxzaXRlID0gY2FsbHNpdGU7XG5cbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRlc3RSdW4uZXhlY3V0ZUFjdGlvblN5bmMoY29tbWFuZC50eXBlLCBjb21tYW5kLCBjYWxsc2l0ZSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NSZXN1bHQocmVzdWx0LCBhcmdzKTtcbiAgICB9XG5cbiAgICBfcHJvY2Vzc1Jlc3VsdCAocmVzdWx0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcGxpY2F0b3IuZGVjb2RlKHJlc3VsdCk7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlT3B0aW9ucyAob3B0aW9ucykge1xuICAgICAgICBhc3NlcnRUeXBlKGlzLm5vbk51bGxPYmplY3QsIHRoaXMuY2FsbHNpdGVOYW1lcy5pbnN0YW50aWF0aW9uLCAnXCJvcHRpb25zXCIgYXJndW1lbnQnLCBvcHRpb25zKTtcblxuICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKG9wdGlvbnMuYm91bmRUZXN0UnVuKSkge1xuICAgICAgICAgICAgLy8gTk9URTogYGJvdW5kVGVzdFJ1bmAgY2FuIGJlIGVpdGhlciBUZXN0Q29udHJvbGxlciBvciBUZXN0UnVuIGluc3RhbmNlLlxuICAgICAgICAgICAgY29uc3QgYm91bmRUZXN0UnVuID0gb3B0aW9ucy5ib3VuZFRlc3RSdW4udGVzdFJ1biB8fCBvcHRpb25zLmJvdW5kVGVzdFJ1bjtcblxuICAgICAgICAgICAgaWYgKCFib3VuZFRlc3RSdW5bdGVzdFJ1bk1hcmtlcl0pXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFQSUVycm9yKHRoaXMuY2FsbHNpdGVOYW1lcy5pbnN0YW50aWF0aW9uLCBSVU5USU1FX0VSUk9SUy5pbnZhbGlkQ2xpZW50RnVuY3Rpb25UZXN0UnVuQmluZGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKG9wdGlvbnMuZGVwZW5kZW5jaWVzKSlcbiAgICAgICAgICAgIGFzc2VydFR5cGUoaXMubm9uTnVsbE9iamVjdCwgdGhpcy5jYWxsc2l0ZU5hbWVzLmluc3RhbnRpYXRpb24sICdcImRlcGVuZGVuY2llc1wiIG9wdGlvbicsIG9wdGlvbnMuZGVwZW5kZW5jaWVzKTtcbiAgICB9XG5cbiAgICBfZ2V0UmVwbGljYXRvclRyYW5zZm9ybXMgKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbmV3IEZ1bmN0aW9uVHJhbnNmb3JtKHRoaXMuY2FsbHNpdGVOYW1lcylcbiAgICAgICAgXTtcbiAgICB9XG59XG4iXX0=