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,15 +1,15 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- function createSnapshotMethods(snapshot) {
4
- const isElementSnapshot = !!snapshot.tagName;
5
- if (isElementSnapshot) {
6
- snapshot.hasClass = name => snapshot.classNames.indexOf(name) > -1;
7
- snapshot.getStyleProperty = prop => snapshot.style[prop];
8
- snapshot.getAttribute = attrName => snapshot.attributes[attrName];
9
- snapshot.hasAttribute = attrName => snapshot.attributes.hasOwnProperty(attrName);
10
- snapshot.getBoundingClientRectProperty = prop => snapshot.boundingClientRect[prop];
11
- }
12
- }
13
- exports.default = createSnapshotMethods;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ function createSnapshotMethods(snapshot) {
4
+ const isElementSnapshot = !!snapshot.tagName;
5
+ if (isElementSnapshot) {
6
+ snapshot.hasClass = name => snapshot.classNames.indexOf(name) > -1;
7
+ snapshot.getStyleProperty = prop => snapshot.style[prop];
8
+ snapshot.getAttribute = attrName => snapshot.attributes[attrName];
9
+ snapshot.hasAttribute = attrName => snapshot.attributes.hasOwnProperty(attrName);
10
+ snapshot.getBoundingClientRectProperty = prop => snapshot.boundingClientRect[prop];
11
+ }
12
+ }
13
+ exports.default = createSnapshotMethods;
14
14
  module.exports = exports.default;
15
15
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXNuYXBzaG90LW1ldGhvZHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpZW50LWZ1bmN0aW9ucy9zZWxlY3RvcnMvY3JlYXRlLXNuYXBzaG90LW1ldGhvZHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxTQUF3QixxQkFBcUIsQ0FBRSxRQUFRO0lBQ25ELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFFN0MsSUFBSSxpQkFBaUIsRUFBRTtRQUNuQixRQUFRLENBQUMsUUFBUSxHQUF3QixJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLFFBQVEsQ0FBQyxnQkFBZ0IsR0FBZ0IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RFLFFBQVEsQ0FBQyxZQUFZLEdBQW9CLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRixRQUFRLENBQUMsWUFBWSxHQUFvQixRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xHLFFBQVEsQ0FBQyw2QkFBNkIsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUN0RjtBQUNMLENBQUM7QUFWRCx3Q0FVQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVNuYXBzaG90TWV0aG9kcyAoc25hcHNob3QpIHtcbiAgICBjb25zdCBpc0VsZW1lbnRTbmFwc2hvdCA9ICEhc25hcHNob3QudGFnTmFtZTtcblxuICAgIGlmIChpc0VsZW1lbnRTbmFwc2hvdCkge1xuICAgICAgICBzbmFwc2hvdC5oYXNDbGFzcyAgICAgICAgICAgICAgICAgICAgICA9IG5hbWUgPT4gc25hcHNob3QuY2xhc3NOYW1lcy5pbmRleE9mKG5hbWUpID4gLTE7XG4gICAgICAgIHNuYXBzaG90LmdldFN0eWxlUHJvcGVydHkgICAgICAgICAgICAgID0gcHJvcCA9PiBzbmFwc2hvdC5zdHlsZVtwcm9wXTtcbiAgICAgICAgc25hcHNob3QuZ2V0QXR0cmlidXRlICAgICAgICAgICAgICAgICAgPSBhdHRyTmFtZSA9PiBzbmFwc2hvdC5hdHRyaWJ1dGVzW2F0dHJOYW1lXTtcbiAgICAgICAgc25hcHNob3QuaGFzQXR0cmlidXRlICAgICAgICAgICAgICAgICAgPSBhdHRyTmFtZSA9PiBzbmFwc2hvdC5hdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KGF0dHJOYW1lKTtcbiAgICAgICAgc25hcHNob3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0UHJvcGVydHkgPSBwcm9wID0+IHNuYXBzaG90LmJvdW5kaW5nQ2xpZW50UmVjdFtwcm9wXTtcbiAgICB9XG59XG4iXX0=
@@ -1,22 +1,22 @@
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 util_1 = __importDefault(require("util"));
7
- function prepareApiFnArgs(fnName, ...args) {
8
- args = args.map(arg => {
9
- if (typeof arg === 'string')
10
- return `'${arg}'`;
11
- if (typeof arg === 'function')
12
- return '[function]';
13
- if (typeof arg === 'object')
14
- return util_1.default.inspect(arg, { compact: true, breakLength: Infinity });
15
- return arg;
16
- });
17
- args = args.join(', ');
18
- return `.${fnName}(${args})`;
19
- }
20
- exports.default = prepareApiFnArgs;
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 util_1 = __importDefault(require("util"));
7
+ function prepareApiFnArgs(fnName, ...args) {
8
+ args = args.map(arg => {
9
+ if (typeof arg === 'string')
10
+ return `'${arg}'`;
11
+ if (typeof arg === 'function')
12
+ return '[function]';
13
+ if (typeof arg === 'object')
14
+ return util_1.default.inspect(arg, { compact: true, breakLength: Infinity });
15
+ return arg;
16
+ });
17
+ args = args.join(', ');
18
+ return `.${fnName}(${args})`;
19
+ }
20
+ exports.default = prepareApiFnArgs;
21
21
  module.exports = exports.default;
22
22
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlcGFyZS1hcGktYXJncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jbGllbnQtZnVuY3Rpb25zL3NlbGVjdG9ycy9wcmVwYXJlLWFwaS1hcmdzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsZ0RBQXdCO0FBRXhCLFNBQXdCLGdCQUFnQixDQUFFLE1BQU0sRUFBRSxHQUFHLElBQUk7SUFDckQsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDbEIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1lBQ3ZCLE9BQU8sSUFBSSxHQUFHLEdBQUcsQ0FBQztRQUN0QixJQUFJLE9BQU8sR0FBRyxLQUFLLFVBQVU7WUFDekIsT0FBTyxZQUFZLENBQUM7UUFDeEIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1lBQ3ZCLE9BQU8sY0FBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQyxDQUFDLENBQUM7SUFDSCxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUV2QixPQUFPLElBQUksTUFBTSxJQUFJLElBQUksR0FBRyxDQUFDO0FBQ2pDLENBQUM7QUFiRCxtQ0FhQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB1dGlsIGZyb20gJ3V0aWwnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwcmVwYXJlQXBpRm5BcmdzIChmbk5hbWUsIC4uLmFyZ3MpIHtcbiAgICBhcmdzID0gYXJncy5tYXAoYXJnID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgcmV0dXJuIGAnJHthcmd9J2A7XG4gICAgICAgIGlmICh0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgcmV0dXJuICdbZnVuY3Rpb25dJztcbiAgICAgICAgaWYgKHR5cGVvZiBhcmcgPT09ICdvYmplY3QnKVxuICAgICAgICAgICAgcmV0dXJuIHV0aWwuaW5zcGVjdChhcmcsIHsgY29tcGFjdDogdHJ1ZSwgYnJlYWtMZW5ndGg6IEluZmluaXR5IH0pO1xuICAgICAgICByZXR1cm4gYXJnO1xuICAgIH0pO1xuICAgIGFyZ3MgPSBhcmdzLmpvaW4oJywgJyk7XG5cbiAgICByZXR1cm4gYC4ke2ZuTmFtZX0oJHthcmdzfSlgO1xufVxuIl19
@@ -1,24 +1,24 @@
1
- "use strict";
2
- // -------------------------------------------------------------
3
- // WARNING: this file is used by both the client and the server.
4
- // Do not use any browser or node-specific API!
5
- // -------------------------------------------------------------
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- /* eslint-disable no-undef */
8
- function selectorAttributeFilter(node, index, originNode, attrName, attrValue) {
9
- if (node.nodeType !== 1)
10
- return false;
11
- const attributes = node.attributes;
12
- let attr = null;
13
- const check = (actual, expect) => typeof expect === 'string' ? expect === actual : expect.test(actual);
14
- for (let i = 0; i < attributes.length; i++) {
15
- attr = attributes[i];
16
- if (check(attr.nodeName, attrName) && (!attrValue || check(attr.nodeValue, attrValue)))
17
- return true;
18
- }
19
- return false;
20
- }
21
- exports.default = selectorAttributeFilter;
22
- /* eslint-enable no-undef */
1
+ "use strict";
2
+ // -------------------------------------------------------------
3
+ // WARNING: this file is used by both the client and the server.
4
+ // Do not use any browser or node-specific API!
5
+ // -------------------------------------------------------------
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ /* eslint-disable no-undef */
8
+ function selectorAttributeFilter(node, index, originNode, attrName, attrValue) {
9
+ if (node.nodeType !== 1)
10
+ return false;
11
+ const attributes = node.attributes;
12
+ let attr = null;
13
+ const check = (actual, expect) => typeof expect === 'string' ? expect === actual : expect.test(actual);
14
+ for (let i = 0; i < attributes.length; i++) {
15
+ attr = attributes[i];
16
+ if (check(attr.nodeName, attrName) && (!attrValue || check(attr.nodeValue, attrValue)))
17
+ return true;
18
+ }
19
+ return false;
20
+ }
21
+ exports.default = selectorAttributeFilter;
22
+ /* eslint-enable no-undef */
23
23
  module.exports = exports.default;
24
24
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0b3ItYXR0cmlidXRlLWZpbHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jbGllbnQtZnVuY3Rpb25zL3NlbGVjdG9ycy9zZWxlY3Rvci1hdHRyaWJ1dGUtZmlsdGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxnRUFBZ0U7QUFDaEUsZ0VBQWdFO0FBQ2hFLCtDQUErQztBQUMvQyxnRUFBZ0U7O0FBRWhFLDZCQUE2QjtBQUM3QixTQUF3Qix1QkFBdUIsQ0FBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsU0FBUztJQUN6RixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQztRQUNuQixPQUFPLEtBQUssQ0FBQztJQUVqQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ25DLElBQUksSUFBSSxHQUFTLElBQUksQ0FBQztJQUV0QixNQUFNLEtBQUssR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLE9BQU8sTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUV2RyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN4QyxJQUFJLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXJCLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNsRixPQUFPLElBQUksQ0FBQztLQUNuQjtJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUM7QUFqQkQsMENBaUJDO0FBQ0QsNEJBQTRCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV0FSTklORzogdGhpcyBmaWxlIGlzIHVzZWQgYnkgYm90aCB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLlxuLy8gRG8gbm90IHVzZSBhbnkgYnJvd3NlciBvciBub2RlLXNwZWNpZmljIEFQSSFcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNlbGVjdG9yQXR0cmlidXRlRmlsdGVyIChub2RlLCBpbmRleCwgb3JpZ2luTm9kZSwgYXR0ck5hbWUsIGF0dHJWYWx1ZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSAxKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gbm9kZS5hdHRyaWJ1dGVzO1xuICAgIGxldCBhdHRyICAgICAgID0gbnVsbDtcblxuICAgIGNvbnN0IGNoZWNrID0gKGFjdHVhbCwgZXhwZWN0KSA9PiB0eXBlb2YgZXhwZWN0ID09PSAnc3RyaW5nJyA/IGV4cGVjdCA9PT0gYWN0dWFsIDogZXhwZWN0LnRlc3QoYWN0dWFsKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBhdHRyID0gYXR0cmlidXRlc1tpXTtcblxuICAgICAgICBpZiAoY2hlY2soYXR0ci5ub2RlTmFtZSwgYXR0ck5hbWUpICYmICghYXR0clZhbHVlIHx8IGNoZWNrKGF0dHIubm9kZVZhbHVlLCBhdHRyVmFsdWUpKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8qIGVzbGludC1lbmFibGUgbm8tdW5kZWYgKi9cbiJdfQ==
@@ -1,60 +1,61 @@
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 dedent_1 = __importDefault(require("dedent"));
8
- const client_function_builder_1 = __importDefault(require("../client-function-builder"));
9
- const replicator_1 = require("../replicator");
10
- const runtime_1 = require("../../errors/runtime");
11
- const builder_symbol_1 = __importDefault(require("../builder-symbol"));
12
- const types_1 = require("../../errors/types");
13
- const type_assertions_1 = require("../../errors/runtime/type-assertions");
14
- const observation_1 = require("../../test-run/commands/observation");
15
- const define_lazy_property_1 = __importDefault(require("../../utils/define-lazy-property"));
16
- const add_api_1 = require("./add-api");
17
- const create_snapshot_methods_1 = __importDefault(require("./create-snapshot-methods"));
18
- const prepare_api_args_1 = __importDefault(require("./prepare-api-args"));
19
- const return_single_prop_mode_1 = __importDefault(require("../return-single-prop-mode"));
20
- class SelectorBuilder extends client_function_builder_1.default {
21
- constructor(fn, options, callsiteNames) {
22
- const apiFn = options && options.apiFn;
23
- const apiFnID = options && options.apiFnID;
24
- const builderFromSelector = fn && fn[builder_symbol_1.default];
25
- const builderFromPromiseOrSnapshot = fn && fn.selector && fn.selector[builder_symbol_1.default];
26
- let builder = builderFromSelector || builderFromPromiseOrSnapshot;
27
- builder = builder instanceof SelectorBuilder ? builder : null;
28
- if (builder) {
29
- fn = builder.fn;
30
- if (options === void 0 || typeof options === 'object')
31
- options = lodash_1.merge({}, builder.options, options, { sourceSelectorBuilder: builder });
32
- }
33
- super(fn, options, callsiteNames);
34
- if (!this.options.apiFnChain) {
35
- const fnType = typeof this.fn;
36
- let item = fnType === 'string' ? `'${this.fn}'` : `[${fnType}]`;
37
- item = `Selector(${item})`;
38
- this.options.apiFn = item;
39
- this.options.apiFnChain = [item];
40
- }
41
- if (apiFn)
42
- this.options.apiFnChain.push(apiFn);
43
- this.options.apiFnID = typeof apiFnID === 'number' ? apiFnID : this.options.apiFnChain.length - 1;
44
- }
45
- _getCompiledFnCode() {
46
- // OPTIMIZATION: if selector was produced from another selector and
47
- // it has same dependencies as source selector, then we can
48
- // avoid recompilation and just re-use already compiled code.
49
- const hasSameDependenciesAsSourceSelector = this.options.sourceSelectorBuilder &&
50
- this.options.sourceSelectorBuilder.options.dependencies ===
51
- this.options.dependencies;
52
- if (hasSameDependenciesAsSourceSelector)
53
- return this.options.sourceSelectorBuilder.compiledFnCode;
54
- const code = typeof this.fn === 'string' ?
55
- `(function(){return document.querySelectorAll(${JSON.stringify(this.fn)});});` :
56
- super._getCompiledFnCode();
57
- if (code) {
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 dedent_1 = __importDefault(require("dedent"));
8
+ const client_function_builder_1 = __importDefault(require("../client-function-builder"));
9
+ const replicator_1 = require("../replicator");
10
+ const runtime_1 = require("../../errors/runtime");
11
+ const builder_symbol_1 = __importDefault(require("../builder-symbol"));
12
+ const types_1 = require("../../errors/types");
13
+ const type_assertions_1 = require("../../errors/runtime/type-assertions");
14
+ const observation_1 = require("../../test-run/commands/observation");
15
+ const define_lazy_property_1 = __importDefault(require("../../utils/define-lazy-property"));
16
+ const add_api_1 = require("./add-api");
17
+ const create_snapshot_methods_1 = __importDefault(require("./create-snapshot-methods"));
18
+ const prepare_api_args_1 = __importDefault(require("./prepare-api-args"));
19
+ const return_single_prop_mode_1 = __importDefault(require("../return-single-prop-mode"));
20
+ const selector_api_execution_mode_1 = __importDefault(require("../selector-api-execution-mode"));
21
+ class SelectorBuilder extends client_function_builder_1.default {
22
+ constructor(fn, options, callsiteNames) {
23
+ const apiFn = options && options.apiFn;
24
+ const apiFnID = options && options.apiFnID;
25
+ const builderFromSelector = fn && fn[builder_symbol_1.default];
26
+ const builderFromPromiseOrSnapshot = fn && fn.selector && fn.selector[builder_symbol_1.default];
27
+ let builder = builderFromSelector || builderFromPromiseOrSnapshot;
28
+ builder = builder instanceof SelectorBuilder ? builder : null;
29
+ if (builder) {
30
+ fn = builder.fn;
31
+ if (options === void 0 || typeof options === 'object')
32
+ options = lodash_1.merge({}, builder.options, options, { sourceSelectorBuilder: builder });
33
+ }
34
+ super(fn, options, callsiteNames);
35
+ if (!this.options.apiFnChain) {
36
+ const fnType = typeof this.fn;
37
+ let item = fnType === 'string' ? `'${this.fn}'` : `[${fnType}]`;
38
+ item = `Selector(${item})`;
39
+ this.options.apiFn = item;
40
+ this.options.apiFnChain = [item];
41
+ }
42
+ if (apiFn)
43
+ this.options.apiFnChain.push(apiFn);
44
+ this.options.apiFnID = typeof apiFnID === 'number' ? apiFnID : this.options.apiFnChain.length - 1;
45
+ }
46
+ _getCompiledFnCode() {
47
+ // OPTIMIZATION: if selector was produced from another selector and
48
+ // it has same dependencies as source selector, then we can
49
+ // avoid recompilation and just re-use already compiled code.
50
+ const hasSameDependenciesAsSourceSelector = this.options.sourceSelectorBuilder &&
51
+ this.options.sourceSelectorBuilder.options.dependencies ===
52
+ this.options.dependencies;
53
+ if (hasSameDependenciesAsSourceSelector)
54
+ return this.options.sourceSelectorBuilder.compiledFnCode;
55
+ const code = typeof this.fn === 'string' ?
56
+ `(function(){return document.querySelectorAll(${JSON.stringify(this.fn)});});` :
57
+ super._getCompiledFnCode();
58
+ if (code) {
58
59
  return dedent_1.default(`(function(){
59
60
  var __f$=${code};
60
61
  return function(){
@@ -69,97 +70,100 @@ class SelectorBuilder extends client_function_builder_1.default {
69
70
 
70
71
  return selectorFilter.filter(nodes, __dependencies$.filterOptions, __dependencies$.apiInfo);
71
72
  };
72
- })();`);
73
- }
74
- return null;
75
- }
76
- _createInvalidFnTypeError() {
77
- return new runtime_1.ClientFunctionAPIError(this.callsiteNames.instantiation, this.callsiteNames.instantiation, types_1.RUNTIME_ERRORS.selectorInitializedWithWrongType, typeof this.fn);
78
- }
79
- _executeCommand(args, testRun, callsite) {
80
- const resultPromise = super._executeCommand(args, testRun, callsite);
81
- this._addBoundArgsSelectorGetter(resultPromise, args);
82
- // OPTIMIZATION: use buffer function as selector not to trigger lazy property ahead of time
83
- add_api_1.addAPI(resultPromise, () => resultPromise.selector, SelectorBuilder, this.options.customDOMProperties, this.options.customMethods);
84
- return resultPromise;
85
- }
86
- _getSourceSelectorBuilderApiFnID() {
87
- let selectorAncestor = this;
88
- while (selectorAncestor.options.sourceSelectorBuilder)
89
- selectorAncestor = selectorAncestor.options.sourceSelectorBuilder;
90
- return selectorAncestor.options.apiFnID;
91
- }
92
- getFunctionDependencies() {
93
- const dependencies = super.getFunctionDependencies();
94
- const { filterVisible, filterHidden, counterMode, collectionMode, getVisibleValueMode, index, customDOMProperties, customMethods, apiFnChain, boundArgs } = this.options;
95
- return lodash_1.merge({}, dependencies, {
96
- filterOptions: {
97
- filterVisible,
98
- filterHidden,
99
- counterMode,
100
- collectionMode,
101
- index: lodash_1.isNil(index) ? null : index,
102
- getVisibleValueMode
103
- },
104
- apiInfo: {
105
- apiFnChain,
106
- apiFnID: this._getSourceSelectorBuilderApiFnID()
107
- },
108
- boundArgs,
109
- customDOMProperties,
110
- customMethods
111
- });
112
- }
113
- _createTestRunCommand(encodedArgs, encodedDependencies) {
114
- return new observation_1.ExecuteSelectorCommand({
115
- instantiationCallsiteName: this.callsiteNames.instantiation,
116
- fnCode: this.compiledFnCode,
117
- args: encodedArgs,
118
- dependencies: encodedDependencies,
119
- needError: this.options.needError,
120
- apiFnChain: this.options.apiFnChain,
121
- visibilityCheck: !!this.options.visibilityCheck,
122
- timeout: this.options.timeout
123
- });
124
- }
125
- _validateOptions(options) {
126
- super._validateOptions(options);
127
- if (!lodash_1.isNil(options.visibilityCheck))
128
- type_assertions_1.assertType(type_assertions_1.is.boolean, this.callsiteNames.instantiation, '"visibilityCheck" option', options.visibilityCheck);
129
- if (!lodash_1.isNil(options.timeout))
130
- type_assertions_1.assertType(type_assertions_1.is.nonNegativeNumber, this.callsiteNames.instantiation, '"timeout" option', options.timeout);
131
- }
132
- _getReplicatorTransforms() {
133
- const transforms = super._getReplicatorTransforms();
134
- transforms.push(new replicator_1.SelectorNodeTransform());
135
- return transforms;
136
- }
137
- _addBoundArgsSelectorGetter(obj, selectorArgs) {
138
- define_lazy_property_1.default(obj, 'selector', () => {
139
- const builder = new SelectorBuilder(this.getFunction(), { boundArgs: selectorArgs });
140
- return builder.getFunction();
141
- });
142
- }
143
- _decorateFunction(selectorFn) {
144
- super._decorateFunction(selectorFn);
145
- add_api_1.addAPI(selectorFn, () => selectorFn, SelectorBuilder, this.options.customDOMProperties, this.options.customMethods, this._getTestRun() ? this._getTestRun().observedCallsites : null);
146
- }
147
- _getClientFnWithOverriddenOptions(options) {
148
- const apiFn = prepare_api_args_1.default('with', options);
149
- const previousSelectorID = this.options.apiFnChain.length - 1;
150
- return super._getClientFnWithOverriddenOptions(Object.assign(options, { apiFn, apiFnID: previousSelectorID }));
151
- }
152
- _processResult(result, selectorArgs) {
153
- const snapshot = super._processResult(result, selectorArgs);
154
- if (snapshot && !return_single_prop_mode_1.default(this.options)) {
155
- this._addBoundArgsSelectorGetter(snapshot, selectorArgs);
156
- create_snapshot_methods_1.default(snapshot);
157
- if (this.options.customMethods)
158
- add_api_1.addCustomMethods(snapshot, () => snapshot.selector, SelectorBuilder, this.options.customMethods);
159
- }
160
- return snapshot;
161
- }
162
- }
163
- exports.default = SelectorBuilder;
73
+ })();`);
74
+ }
75
+ return null;
76
+ }
77
+ _createInvalidFnTypeError() {
78
+ return new runtime_1.ClientFunctionAPIError(this.callsiteNames.instantiation, this.callsiteNames.instantiation, types_1.RUNTIME_ERRORS.selectorInitializedWithWrongType, typeof this.fn);
79
+ }
80
+ _executeCommand(args, testRun, callsite) {
81
+ const resultPromise = super._executeCommand(args, testRun, callsite);
82
+ this._addBoundArgsSelectorGetter(resultPromise, args);
83
+ // OPTIMIZATION: use buffer function as selector not to trigger lazy property ahead of time
84
+ add_api_1.addAPI(resultPromise, () => resultPromise.selector, SelectorBuilder, this.options.customDOMProperties, this.options.customMethods);
85
+ return resultPromise;
86
+ }
87
+ _getSourceSelectorBuilderApiFnID() {
88
+ let selectorAncestor = this;
89
+ while (selectorAncestor.options.sourceSelectorBuilder)
90
+ selectorAncestor = selectorAncestor.options.sourceSelectorBuilder;
91
+ return selectorAncestor.options.apiFnID;
92
+ }
93
+ getFunctionDependencies() {
94
+ const dependencies = super.getFunctionDependencies();
95
+ const { filterVisible, filterHidden, counterMode, collectionMode, getVisibleValueMode, index, customDOMProperties, customMethods, apiFnChain, boundArgs } = this.options;
96
+ return lodash_1.merge({}, dependencies, {
97
+ filterOptions: {
98
+ filterVisible,
99
+ filterHidden,
100
+ counterMode,
101
+ collectionMode,
102
+ index: lodash_1.isNil(index) ? null : index,
103
+ getVisibleValueMode
104
+ },
105
+ apiInfo: {
106
+ apiFnChain,
107
+ apiFnID: this._getSourceSelectorBuilderApiFnID()
108
+ },
109
+ boundArgs,
110
+ customDOMProperties,
111
+ customMethods
112
+ });
113
+ }
114
+ _createTestRunCommand(encodedArgs, encodedDependencies) {
115
+ return new observation_1.ExecuteSelectorCommand({
116
+ instantiationCallsiteName: this.callsiteNames.instantiation,
117
+ fnCode: this.compiledFnCode,
118
+ args: encodedArgs,
119
+ dependencies: encodedDependencies,
120
+ needError: this.options.needError,
121
+ apiFnChain: this.options.apiFnChain,
122
+ visibilityCheck: !!this.options.visibilityCheck,
123
+ timeout: this.options.timeout
124
+ });
125
+ }
126
+ _validateOptions(options) {
127
+ super._validateOptions(options);
128
+ if (!lodash_1.isNil(options.visibilityCheck))
129
+ type_assertions_1.assertType(type_assertions_1.is.boolean, this.callsiteNames.instantiation, '"visibilityCheck" option', options.visibilityCheck);
130
+ if (!lodash_1.isNil(options.timeout))
131
+ type_assertions_1.assertType(type_assertions_1.is.nonNegativeNumber, this.callsiteNames.instantiation, '"timeout" option', options.timeout);
132
+ }
133
+ _getReplicatorTransforms() {
134
+ const transforms = super._getReplicatorTransforms();
135
+ transforms.push(new replicator_1.SelectorNodeTransform());
136
+ return transforms;
137
+ }
138
+ _addBoundArgsSelectorGetter(obj, selectorArgs) {
139
+ define_lazy_property_1.default(obj, 'selector', () => {
140
+ const builder = new SelectorBuilder(this.getFunction(), { boundArgs: selectorArgs });
141
+ return builder.getFunction();
142
+ });
143
+ }
144
+ _decorateFunction(selectorFn) {
145
+ super._decorateFunction(selectorFn);
146
+ add_api_1.addAPI(selectorFn, () => selectorFn, SelectorBuilder, this.options.customDOMProperties, this.options.customMethods, this._getObservedCallsites());
147
+ }
148
+ _getClientFnWithOverriddenOptions(options) {
149
+ const apiFn = prepare_api_args_1.default('with', options);
150
+ const previousSelectorID = this.options.apiFnChain.length - 1;
151
+ return super._getClientFnWithOverriddenOptions(Object.assign(options, { apiFn, apiFnID: previousSelectorID }));
152
+ }
153
+ _processResult(result, selectorArgs) {
154
+ const snapshot = super._processResult(result, selectorArgs);
155
+ if (snapshot && !return_single_prop_mode_1.default(this.options)) {
156
+ this._addBoundArgsSelectorGetter(snapshot, selectorArgs);
157
+ create_snapshot_methods_1.default(snapshot);
158
+ if (this.options.customMethods)
159
+ add_api_1.addCustomMethods(snapshot, () => snapshot.selector, SelectorBuilder, this.options.customMethods);
160
+ if (selector_api_execution_mode_1.default.isSync) {
161
+ add_api_1.addAPI(snapshot, () => snapshot.selector, SelectorBuilder, this.options.customDOMProperties, this.options.customMethods, this._getObservedCallsites(), true);
162
+ }
163
+ }
164
+ return snapshot;
165
+ }
166
+ }
167
+ exports.default = SelectorBuilder;
164
168
  module.exports = exports.default;
165
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0b3ItYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jbGllbnQtZnVuY3Rpb25zL3NlbGVjdG9ycy9zZWxlY3Rvci1idWlsZGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbUNBQTJEO0FBQzNELG9EQUE0QjtBQUM1Qix5RkFBK0Q7QUFDL0QsOENBQXNEO0FBQ3RELGtEQUE4RDtBQUM5RCx1RUFBc0Q7QUFDdEQsOENBQW9EO0FBQ3BELDBFQUFzRTtBQUN0RSxxRUFBNkU7QUFDN0UsNEZBQWtFO0FBQ2xFLHVDQUFxRDtBQUNyRCx3RkFBOEQ7QUFDOUQsMEVBQWtEO0FBQ2xELHlGQUE4RDtBQUU5RCxNQUFxQixlQUFnQixTQUFRLGlDQUFxQjtJQUM5RCxZQUFhLEVBQUUsRUFBRSxPQUFPLEVBQUUsYUFBYTtRQUNuQyxNQUFNLEtBQUssR0FBMEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDOUQsTUFBTSxPQUFPLEdBQXdCLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQ2hFLE1BQU0sbUJBQW1CLEdBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyx3QkFBcUIsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sNEJBQTRCLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyx3QkFBcUIsQ0FBQyxDQUFDO1FBQzdGLElBQUksT0FBTyxHQUEwQixtQkFBbUIsSUFBSSw0QkFBNEIsQ0FBQztRQUV6RixPQUFPLEdBQUcsT0FBTyxZQUFZLGVBQWUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFOUQsSUFBSSxPQUFPLEVBQUU7WUFDVCxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUVoQixJQUFJLE9BQU8sS0FBSyxLQUFLLENBQUMsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRO2dCQUNq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QUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhO2dCQUMxQiwwQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUN4RztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7Q0FDSjtBQTNNRCxrQ0EyTUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc05pbCBhcyBpc051bGxPclVuZGVmaW5lZCwgbWVyZ2UgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGRlZGVudCBmcm9tICdkZWRlbnQnO1xuaW1wb3J0IENsaWVudEZ1bmN0aW9uQnVpbGRlciBmcm9tICcuLi9jbGllbnQtZnVuY3Rpb24tYnVpbGRlcic7XG5pbXBvcnQgeyBTZWxlY3Rvck5vZGVUcmFuc2Zvcm0gfSBmcm9tICcuLi9yZXBsaWNhdG9yJztcbmltcG9ydCB7IENsaWVudEZ1bmN0aW9uQVBJRXJyb3IgfSBmcm9tICcuLi8uLi9lcnJvcnMvcnVudGltZSc7XG5pbXBvcnQgZnVuY3Rpb25CdWlsZGVyU3ltYm9sIGZyb20gJy4uL2J1aWxkZXItc3ltYm9sJztcbmltcG9ydCB7IFJVTlRJTUVfRVJST1JTIH0gZnJvbSAnLi4vLi4vZXJyb3JzL3R5cGVzJztcbmltcG9ydCB7IGFzc2VydFR5cGUsIGlzIH0gZnJvbSAnLi4vLi4vZXJyb3JzL3J1bnRpbWUvdHlwZS1hc3NlcnRpb25zJztcbmltcG9ydCB7IEV4ZWN1dGVTZWxlY3RvckNvbW1hbmQgfSBmcm9tICcuLi8uLi90ZXN0LXJ1bi9jb21tYW5kcy9vYnNlcnZhdGlvbic7XG5pbXBvcnQgZGVmaW5lTGF6eVByb3BlcnR5IGZyb20gJy4uLy4uL3V0aWxzL2RlZmluZS1sYXp5LXByb3BlcnR5JztcbmltcG9ydCB7IGFkZEFQSSwgYWRkQ3VzdG9tTWV0aG9kcyB9IGZyb20gJy4vYWRkLWFwaSc7XG5pbXBvcnQgY3JlYXRlU25hcHNob3RNZXRob2RzIGZyb20gJy4vY3JlYXRlLXNuYXBzaG90LW1ldGhvZHMnO1xuaW1wb3J0IHByZXBhcmVBcGlGbkFyZ3MgZnJvbSAnLi9wcmVwYXJlLWFwaS1hcmdzJztcbmltcG9ydCByZXR1cm5TaW5nbGVQcm9wTW9kZSBmcm9tICcuLi9yZXR1cm4tc2luZ2xlLXByb3AtbW9kZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlbGVjdG9yQnVpbGRlciBleHRlbmRzIENsaWVudEZ1bmN0aW9uQnVpbGRlciB7XG4gICAgY29uc3RydWN0b3IgKGZuLCBvcHRpb25zLCBjYWxsc2l0ZU5hbWVzKSB7XG4gICAgICAgIGNvbnN0IGFwaUZuICAgICAgICAgICAgICAgICAgICAgICAgPSBvcHRpb25zICYmIG9wdGlvbnMuYXBpRm47XG4gICAgICAgIGNvbnN0IGFwaUZuSUQgICAgICAgICAgICAgICAgICAgICAgPSBvcHRpb25zICYmIG9wdGlvbnMuYXBpRm5JRDtcbiAgICAgICAgY29uc3QgYnVpbGRlckZyb21TZWxlY3RvciAgICAgICAgICA9IGZuICYmIGZuW2Z1bmN0aW9uQnVpbGRlclN5bWJvbF07XG4gICAgICAgIGNvbnN0IGJ1aWxkZXJGcm9tUHJvbWlzZU9yU25hcHNob3QgPSBmbiAmJiBmbi5zZWxlY3RvciAmJiBmbi5zZWxlY3RvcltmdW5jdGlvbkJ1aWxkZXJTeW1ib2xdO1xuICAgICAgICBsZXQgYnVpbGRlciAgICAgICAgICAgICAgICAgICAgICAgID0gYnVpbGRlckZyb21TZWxlY3RvciB8fCBidWlsZGVyRnJvbVByb21pc2VPclNuYXBzaG90O1xuXG4gICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyIGluc3RhbmNlb2YgU2VsZWN0b3JCdWlsZGVyID8gYnVpbGRlciA6IG51bGw7XG5cbiAgICAgICAgaWYgKGJ1aWxkZXIpIHtcbiAgICAgICAgICAgIGZuID0gYnVpbGRlci5mbjtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCB8fCB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcpXG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IG1lcmdlKHt9LCBidWlsZGVyLm9wdGlvbnMsIG9wdGlvbnMsIHsgc291cmNlU2VsZWN0b3JCdWlsZGVyOiBidWlsZGVyIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VwZXIoZm4sIG9wdGlvbnMsIGNhbGxzaXRlTmFtZXMpO1xuXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLmFwaUZuQ2hhaW4pIHtcbiAgICAgICAgICAgIGNvbnN0IGZuVHlwZSA9IHR5cGVvZiB0aGlzLmZuO1xuICAgICAgICAgICAgbGV0IGl0ZW0gICAgID0gZm5UeXBlID09PSAnc3RyaW5nJyA/IGAnJHt0aGlzLmZufSdgIDogYFske2ZuVHlwZX1dYDtcblxuICAgICAgICAgICAgaXRlbSAgICAgICAgICAgICAgICAgICAgPSBgU2VsZWN0b3IoJHtpdGVtfSlgO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFwaUZuICAgICAgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFwaUZuQ2hhaW4gPSBbaXRlbV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXBpRm4pXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXBpRm5DaGFpbi5wdXNoKGFwaUZuKTtcblxuICAgICAgICB0aGlzLm9wdGlvbnMuYXBpRm5JRCA9IHR5cGVvZiBhcGlGbklEID09PSAnbnVtYmVyJyA/IGFwaUZuSUQgOiB0aGlzLm9wdGlvbnMuYXBpRm5DaGFpbi5sZW5ndGggLSAxO1xuICAgIH1cblxuICAgIF9nZXRDb21waWxlZEZuQ29kZSAoKSB7XG4gICAgICAgIC8vIE9QVElNSVpBVElPTjogaWYgc2VsZWN0b3Igd2FzIHByb2R1Y2VkIGZyb20gYW5vdGhlciBzZWxlY3RvciBhbmRcbiAgICAgICAgLy8gaXQgaGFzIHNhbWUgZGVwZW5kZW5jaWVzIGFzIHNvdXJjZSBzZWxlY3RvciwgdGhlbiB3ZSBjYW5cbiAgICAgICAgLy8gYXZvaWQgcmVjb21waWxhdGlvbiBhbmQganVzdCByZS11c2UgYWxyZWFkeSBjb21waWxlZCBjb2RlLlxuICAgICAgICBjb25zdCBoYXNTYW1lRGVwZW5kZW5jaWVzQXNTb3VyY2VTZWxlY3RvciA9IHRoaXMub3B0aW9ucy5zb3VyY2VTZWxlY3RvckJ1aWxkZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc291cmNlU2VsZWN0b3JCdWlsZGVyLm9wdGlvbnMuZGVwZW5kZW5jaWVzID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kZXBlbmRlbmNpZXM7XG5cbiAgICAgICAgaWYgKGhhc1NhbWVEZXBlbmRlbmNpZXNBc1NvdXJjZVNlbGVjdG9yKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zb3VyY2VTZWxlY3RvckJ1aWxkZXIuY29tcGlsZWRGbkNvZGU7XG5cbiAgICAgICAgY29uc3QgY29kZSA9IHR5cGVvZiB0aGlzLmZuID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgICBgKGZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJHtKU09OLnN0cmluZ2lmeSh0aGlzLmZuKX0pO30pO2AgOlxuICAgICAgICAgICAgc3VwZXIuX2dldENvbXBpbGVkRm5Db2RlKCk7XG5cbiAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWRlbnQoXG4gICAgICAgICAgICAgICAgYChmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICB2YXIgX19mJD0ke2NvZGV9O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzICAgICAgICAgICA9IF9fZGVwZW5kZW5jaWVzJC5ib3VuZEFyZ3MgfHwgYXJndW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9yRmlsdGVyID0gd2luZG93WycldGVzdENhZmVTZWxlY3RvckZpbHRlciUnXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGVzID0gX19mJC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzICAgICA9IHNlbGVjdG9yRmlsdGVyLmNhc3Qobm9kZXMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGVzLmxlbmd0aCAmJiAhc2VsZWN0b3JGaWx0ZXIuZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JGaWx0ZXIuZXJyb3IgPSBfX2RlcGVuZGVuY2llcyQuYXBpSW5mby5hcGlGbklEO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0b3JGaWx0ZXIuZmlsdGVyKG5vZGVzLCBfX2RlcGVuZGVuY2llcyQuZmlsdGVyT3B0aW9ucywgX19kZXBlbmRlbmNpZXMkLmFwaUluZm8pO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICB9KSgpO2BcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBfY3JlYXRlSW52YWxpZEZuVHlwZUVycm9yICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDbGllbnRGdW5jdGlvbkFQSUVycm9yKHRoaXMuY2FsbHNpdGVOYW1lcy5pbnN0YW50aWF0aW9uLCB0aGlzLmNhbGxzaXRlTmFtZXMuaW5zdGFudGlhdGlvbiwgUlVOVElNRV9FUlJPUlMuc2VsZWN0b3JJbml0aWFsaXplZFdpdGhXcm9uZ1R5cGUsIHR5cGVvZiB0aGlzLmZuKTtcbiAgICB9XG5cbiAgICBfZXhlY3V0ZUNvbW1hbmQgKGFyZ3MsIHRlc3RSdW4sIGNhbGxzaXRlKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdFByb21pc2UgPSBzdXBlci5fZXhlY3V0ZUNvbW1hbmQoYXJncywgdGVzdFJ1biwgY2FsbHNpdGUpO1xuXG4gICAgICAgIHRoaXMuX2FkZEJvdW5kQXJnc1NlbGVjdG9yR2V0dGVyKHJlc3VsdFByb21pc2UsIGFyZ3MpO1xuXG4gICAgICAgIC8vIE9QVElNSVpBVElPTjogdXNlIGJ1ZmZlciBmdW5jdGlvbiBhcyBzZWxlY3RvciBub3QgdG8gdHJpZ2dlciBsYXp5IHByb3BlcnR5IGFoZWFkIG9mIHRpbWVcbiAgICAgICAgYWRkQVBJKHJlc3VsdFByb21pc2UsICgpID0+IHJlc3VsdFByb21pc2Uuc2VsZWN0b3IsIFNlbGVjdG9yQnVpbGRlciwgdGhpcy5vcHRpb25zLmN1c3RvbURPTVByb3BlcnRpZXMsIHRoaXMub3B0aW9ucy5jdXN0b21NZXRob2RzKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0UHJvbWlzZTtcbiAgICB9XG5cbiAgICBfZ2V0U291cmNlU2VsZWN0b3JCdWlsZGVyQXBpRm5JRCAoKSB7XG4gICAgICAgIGxldCBzZWxlY3RvckFuY2VzdG9yID0gdGhpcztcblxuICAgICAgICB3aGlsZSAoc2VsZWN0b3JBbmNlc3Rvci5vcHRpb25zLnNvdXJjZVNlbGVjdG9yQnVpbGRlcilcbiAgICAgICAgICAgIHNlbGVjdG9yQW5jZXN0b3IgPSBzZWxlY3RvckFuY2VzdG9yLm9wdGlvbnMuc291cmNlU2VsZWN0b3JCdWlsZGVyO1xuXG4gICAgICAgIHJldHVybiBzZWxlY3RvckFuY2VzdG9yLm9wdGlvbnMuYXBpRm5JRDtcbiAgICB9XG5cbiAgICBnZXRGdW5jdGlvbkRlcGVuZGVuY2llcyAoKSB7XG4gICAgICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IHN1cGVyLmdldEZ1bmN0aW9uRGVwZW5kZW5jaWVzKCk7XG5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZmlsdGVyVmlzaWJsZSxcbiAgICAgICAgICAgIGZpbHRlckhpZGRlbixcbiAgICAgICAgICAgIGNvdW50ZXJNb2RlLFxuICAgICAgICAgICAgY29sbGVjdGlvbk1vZGUsXG4gICAgICAgICAgICBnZXRWaXNpYmxlVmFsdWVNb2RlLFxuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICBjdXN0b21ET01Qcm9wZXJ0aWVzLFxuICAgICAgICAgICAgY3VzdG9tTWV0aG9kcyxcbiAgICAgICAgICAgIGFwaUZuQ2hhaW4sXG4gICAgICAgICAgICBib3VuZEFyZ3NcbiAgICAgICAgfSA9IHRoaXMub3B0aW9ucztcblxuICAgICAgICByZXR1cm4gbWVyZ2Uoe30sIGRlcGVuZGVuY2llcywge1xuICAgICAgICAgICAgZmlsdGVyT3B0aW9uczoge1xuICAgICAgICAgICAgICAgIGZpbHRlclZpc2libGUsXG4gICAgICAgICAgICAgICAgZmlsdGVySGlkZGVuLFxuICAgICAgICAgICAgICAgIGNvdW50ZXJNb2RlLFxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25Nb2RlLFxuICAgICAgICAgICAgICAgIGluZGV4OiBpc051bGxPclVuZGVmaW5lZChpbmRleCkgPyBudWxsIDogaW5kZXgsXG4gICAgICAgICAgICAgICAgZ2V0VmlzaWJsZVZhbHVlTW9kZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFwaUluZm86IHtcbiAgICAgICAgICAgICAgICBhcGlGbkNoYWluLFxuICAgICAgICAgICAgICAgIGFwaUZuSUQ6IHRoaXMuX2dldFNvdXJjZVNlbGVjdG9yQnVpbGRlckFwaUZuSUQoKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJvdW5kQXJncyxcbiAgICAgICAgICAgIGN1c3RvbURPTVByb3BlcnRpZXMsXG4gICAgICAgICAgICBjdXN0b21NZXRob2RzXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9jcmVhdGVUZXN0UnVuQ29tbWFuZCAoZW5jb2RlZEFyZ3MsIGVuY29kZWREZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFeGVjdXRlU2VsZWN0b3JDb21tYW5kKHtcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWU6IHRoaXMuY2FsbHNpdGVOYW1lcy5pbnN0YW50aWF0aW9uLFxuICAgICAgICAgICAgZm5Db2RlOiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21waWxlZEZuQ29kZSxcbiAgICAgICAgICAgIGFyZ3M6ICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRBcmdzLFxuICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiAgICAgICAgICAgICAgZW5jb2RlZERlcGVuZGVuY2llcyxcbiAgICAgICAgICAgIG5lZWRFcnJvcjogICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5uZWVkRXJyb3IsXG4gICAgICAgICAgICBhcGlGbkNoYWluOiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXBpRm5DaGFpbixcbiAgICAgICAgICAgIHZpc2liaWxpdHlDaGVjazogICAgICAgICAgICEhdGhpcy5vcHRpb25zLnZpc2liaWxpdHlDaGVjayxcbiAgICAgICAgICAgIHRpbWVvdXQ6ICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50aW1lb3V0XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZU9wdGlvbnMgKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIuX3ZhbGlkYXRlT3B0aW9ucyhvcHRpb25zKTtcblxuICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKG9wdGlvbnMudmlzaWJpbGl0eUNoZWNrKSlcbiAgICAgICAgICAgIGFzc2VydFR5cGUoaXMuYm9vbGVhbiwgdGhpcy5jYWxsc2l0ZU5hbWVzLmluc3RhbnRpYXRpb24sICdcInZpc2liaWxpdHlDaGVja1wiIG9wdGlvbicsIG9wdGlvbnMudmlzaWJpbGl0eUNoZWNrKTtcblxuICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKG9wdGlvbnMudGltZW91dCkpXG4gICAgICAgICAgICBhc3NlcnRUeXBlKGlzLm5vbk5lZ2F0aXZlTnVtYmVyLCB0aGlzLmNhbGxzaXRlTmFtZXMuaW5zdGFudGlhdGlvbiwgJ1widGltZW91dFwiIG9wdGlvbicsIG9wdGlvbnMudGltZW91dCk7XG4gICAgfVxuXG4gICAgX2dldFJlcGxpY2F0b3JUcmFuc2Zvcm1zICgpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtcyA9IHN1cGVyLl9nZXRSZXBsaWNhdG9yVHJhbnNmb3JtcygpO1xuXG4gICAgICAgIHRyYW5zZm9ybXMucHVzaChuZXcgU2VsZWN0b3JOb2RlVHJhbnNmb3JtKCkpO1xuXG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1zO1xuICAgIH1cblxuICAgIF9hZGRCb3VuZEFyZ3NTZWxlY3RvckdldHRlciAob2JqLCBzZWxlY3RvckFyZ3MpIHtcbiAgICAgICAgZGVmaW5lTGF6eVByb3BlcnR5KG9iaiwgJ3NlbGVjdG9yJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBTZWxlY3RvckJ1aWxkZXIodGhpcy5nZXRGdW5jdGlvbigpLCB7IGJvdW5kQXJnczogc2VsZWN0b3JBcmdzIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gYnVpbGRlci5nZXRGdW5jdGlvbigpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfZGVjb3JhdGVGdW5jdGlvbiAoc2VsZWN0b3JGbikge1xuICAgICAgICBzdXBlci5fZGVjb3JhdGVGdW5jdGlvbihzZWxlY3RvckZuKTtcblxuICAgICAgICBhZGRBUEkoXG4gICAgICAgICAgICBzZWxlY3RvckZuLFxuICAgICAgICAgICAgKCkgPT4gc2VsZWN0b3JGbixcbiAgICAgICAgICAgIFNlbGVjdG9yQnVpbGRlcixcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jdXN0b21ET01Qcm9wZXJ0aWVzLFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmN1c3RvbU1ldGhvZHMsXG4gICAgICAgICAgICB0aGlzLl9nZXRUZXN0UnVuKCkgPyB0aGlzLl9nZXRUZXN0UnVuKCkub2JzZXJ2ZWRDYWxsc2l0ZXMgOiBudWxsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgX2dldENsaWVudEZuV2l0aE92ZXJyaWRkZW5PcHRpb25zIChvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGFwaUZuICAgICAgICAgICAgICA9IHByZXBhcmVBcGlGbkFyZ3MoJ3dpdGgnLCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNTZWxlY3RvcklEID0gdGhpcy5vcHRpb25zLmFwaUZuQ2hhaW4ubGVuZ3RoIC0gMTtcblxuICAgICAgICByZXR1cm4gc3VwZXIuX2dldENsaWVudEZuV2l0aE92ZXJyaWRkZW5PcHRpb25zKE9iamVjdC5hc3NpZ24ob3B0aW9ucywgeyBhcGlGbiwgYXBpRm5JRDogcHJldmlvdXNTZWxlY3RvcklEIH0pKTtcbiAgICB9XG5cbiAgICBfcHJvY2Vzc1Jlc3VsdCAocmVzdWx0LCBzZWxlY3RvckFyZ3MpIHtcbiAgICAgICAgY29uc3Qgc25hcHNob3QgPSBzdXBlci5fcHJvY2Vzc1Jlc3VsdChyZXN1bHQsIHNlbGVjdG9yQXJncyk7XG5cbiAgICAgICAgaWYgKHNuYXBzaG90ICYmICFyZXR1cm5TaW5nbGVQcm9wTW9kZSh0aGlzLm9wdGlvbnMpKSB7XG4gICAgICAgICAgICB0aGlzLl9hZGRCb3VuZEFyZ3NTZWxlY3RvckdldHRlcihzbmFwc2hvdCwgc2VsZWN0b3JBcmdzKTtcbiAgICAgICAgICAgIGNyZWF0ZVNuYXBzaG90TWV0aG9kcyhzbmFwc2hvdCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY3VzdG9tTWV0aG9kcylcbiAgICAgICAgICAgICAgICBhZGRDdXN0b21NZXRob2RzKHNuYXBzaG90LCAoKSA9PiBzbmFwc2hvdC5zZWxlY3RvciwgU2VsZWN0b3JCdWlsZGVyLCB0aGlzLm9wdGlvbnMuY3VzdG9tTWV0aG9kcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc25hcHNob3Q7XG4gICAgfVxufVxuXG4iXX0=
169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0b3ItYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jbGllbnQtZnVuY3Rpb25zL3NlbGVjdG9ycy9zZWxlY3Rvci1idWlsZGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbUNBQTJEO0FBQzNELG9EQUE0QjtBQUM1Qix5RkFBK0Q7QUFDL0QsOENBQXNEO0FBQ3RELGtEQUE4RDtBQUM5RCx1RUFBc0Q7QUFDdEQsOENBQW9EO0FBQ3BELDBFQUFzRTtBQUN0RSxxRUFBNkU7QUFDN0UsNEZBQWtFO0FBQ2xFLHVDQUFxRDtBQUNyRCx3RkFBOEQ7QUFDOUQsMEVBQWtEO0FBQ2xELHlGQUE4RDtBQUM5RCxpR0FBc0U7QUFFdEUsTUFBcUIsZUFBZ0IsU0FBUSxpQ0FBcUI7SUFDOUQsWUFBYSxFQUFFLEVBQUUsT0FBTyxFQUFFLGFBQWE7UUFDbkMsTUFBTSxLQUFLLEdBQTBCLE9BQU8sSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQzlELE1BQU0sT0FBTyxHQUF3QixPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUNoRSxNQUFNLG1CQUFtQixHQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsd0JBQXFCLENBQUMsQ0FBQztRQUNyRSxNQUFNLDRCQUE0QixHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsd0JBQXFCLENBQUMsQ0FBQztRQUM3RixJQUFJLE9BQU8sR0FBMEIsbUJBQW1CLElBQUksNEJBQTRCLENBQUM7UUFFekYsT0FBTyxHQUFHLE9BQU8sWUFBWSxlQUFlLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRTlELElBQUksT0FBTyxFQUFFO1lBQ1QsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFFaEIsSUFBSSxPQUFPLEtBQUssS0FBSyxDQUFDLElBQUksT0FBTyxPQUFPLEtB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RUFBRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRXJHLElBQUkscUNBQXdCLENBQUMsTUFBTSxFQUFFO2dCQUNqQyxnQkFBTSxDQUNGLFFBQVEsRUFDUixHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUN2QixlQUFlLEVBQ2YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQzFCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxFQUM1QixJQUFJLENBQ1AsQ0FBQzthQUNMO1NBQ0o7UUFFRCxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0NBQ0o7QUF2TkQsa0NBdU5DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNOaWwgYXMgaXNOdWxsT3JVbmRlZmluZWQsIG1lcmdlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBkZWRlbnQgZnJvbSAnZGVkZW50JztcbmltcG9ydCBDbGllbnRGdW5jdGlvbkJ1aWxkZXIgZnJvbSAnLi4vY2xpZW50LWZ1bmN0aW9uLWJ1aWxkZXInO1xuaW1wb3J0IHsgU2VsZWN0b3JOb2RlVHJhbnNmb3JtIH0gZnJvbSAnLi4vcmVwbGljYXRvcic7XG5pbXBvcnQgeyBDbGllbnRGdW5jdGlvbkFQSUVycm9yIH0gZnJvbSAnLi4vLi4vZXJyb3JzL3J1bnRpbWUnO1xuaW1wb3J0IGZ1bmN0aW9uQnVpbGRlclN5bWJvbCBmcm9tICcuLi9idWlsZGVyLXN5bWJvbCc7XG5pbXBvcnQgeyBSVU5USU1FX0VSUk9SUyB9IGZyb20gJy4uLy4uL2Vycm9ycy90eXBlcyc7XG5pbXBvcnQgeyBhc3NlcnRUeXBlLCBpcyB9IGZyb20gJy4uLy4uL2Vycm9ycy9ydW50aW1lL3R5cGUtYXNzZXJ0aW9ucyc7XG5pbXBvcnQgeyBFeGVjdXRlU2VsZWN0b3JDb21tYW5kIH0gZnJvbSAnLi4vLi4vdGVzdC1ydW4vY29tbWFuZHMvb2JzZXJ2YXRpb24nO1xuaW1wb3J0IGRlZmluZUxhenlQcm9wZXJ0eSBmcm9tICcuLi8uLi91dGlscy9kZWZpbmUtbGF6eS1wcm9wZXJ0eSc7XG5pbXBvcnQgeyBhZGRBUEksIGFkZEN1c3RvbU1ldGhvZHMgfSBmcm9tICcuL2FkZC1hcGknO1xuaW1wb3J0IGNyZWF0ZVNuYXBzaG90TWV0aG9kcyBmcm9tICcuL2NyZWF0ZS1zbmFwc2hvdC1tZXRob2RzJztcbmltcG9ydCBwcmVwYXJlQXBpRm5BcmdzIGZyb20gJy4vcHJlcGFyZS1hcGktYXJncyc7XG5pbXBvcnQgcmV0dXJuU2luZ2xlUHJvcE1vZGUgZnJvbSAnLi4vcmV0dXJuLXNpbmdsZS1wcm9wLW1vZGUnO1xuaW1wb3J0IHNlbGVjdG9yQXBpRXhlY3V0aW9uTW9kZSBmcm9tICcuLi9zZWxlY3Rvci1hcGktZXhlY3V0aW9uLW1vZGUnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWxlY3RvckJ1aWxkZXIgZXh0ZW5kcyBDbGllbnRGdW5jdGlvbkJ1aWxkZXIge1xuICAgIGNvbnN0cnVjdG9yIChmbiwgb3B0aW9ucywgY2FsbHNpdGVOYW1lcykge1xuICAgICAgICBjb25zdCBhcGlGbiAgICAgICAgICAgICAgICAgICAgICAgID0gb3B0aW9ucyAmJiBvcHRpb25zLmFwaUZuO1xuICAgICAgICBjb25zdCBhcGlGbklEICAgICAgICAgICAgICAgICAgICAgID0gb3B0aW9ucyAmJiBvcHRpb25zLmFwaUZuSUQ7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXJGcm9tU2VsZWN0b3IgICAgICAgICAgPSBmbiAmJiBmbltmdW5jdGlvbkJ1aWxkZXJTeW1ib2xdO1xuICAgICAgICBjb25zdCBidWlsZGVyRnJvbVByb21pc2VPclNuYXBzaG90ID0gZm4gJiYgZm4uc2VsZWN0b3IgJiYgZm4uc2VsZWN0b3JbZnVuY3Rpb25CdWlsZGVyU3ltYm9sXTtcbiAgICAgICAgbGV0IGJ1aWxkZXIgICAgICAgICAgICAgICAgICAgICAgICA9IGJ1aWxkZXJGcm9tU2VsZWN0b3IgfHwgYnVpbGRlckZyb21Qcm9taXNlT3JTbmFwc2hvdDtcblxuICAgICAgICBidWlsZGVyID0gYnVpbGRlciBpbnN0YW5jZW9mIFNlbGVjdG9yQnVpbGRlciA/IGJ1aWxkZXIgOiBudWxsO1xuXG4gICAgICAgIGlmIChidWlsZGVyKSB7XG4gICAgICAgICAgICBmbiA9IGJ1aWxkZXIuZm47XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDAgfHwgdHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnKVxuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBtZXJnZSh7fSwgYnVpbGRlci5vcHRpb25zLCBvcHRpb25zLCB7IHNvdXJjZVNlbGVjdG9yQnVpbGRlcjogYnVpbGRlciB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1cGVyKGZuLCBvcHRpb25zLCBjYWxsc2l0ZU5hbWVzKTtcblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hcGlGbkNoYWluKSB7XG4gICAgICAgICAgICBjb25zdCBmblR5cGUgPSB0eXBlb2YgdGhpcy5mbjtcbiAgICAgICAgICAgIGxldCBpdGVtICAgICA9IGZuVHlwZSA9PT0gJ3N0cmluZycgPyBgJyR7dGhpcy5mbn0nYCA6IGBbJHtmblR5cGV9XWA7XG5cbiAgICAgICAgICAgIGl0ZW0gICAgICAgICAgICAgICAgICAgID0gYFNlbGVjdG9yKCR7aXRlbX0pYDtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hcGlGbiAgICAgID0gaXRlbTtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hcGlGbkNoYWluID0gW2l0ZW1dO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFwaUZuKVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFwaUZuQ2hhaW4ucHVzaChhcGlGbik7XG5cbiAgICAgICAgdGhpcy5vcHRpb25zLmFwaUZuSUQgPSB0eXBlb2YgYXBpRm5JRCA9PT0gJ251bWJlcicgPyBhcGlGbklEIDogdGhpcy5vcHRpb25zLmFwaUZuQ2hhaW4ubGVuZ3RoIC0gMTtcbiAgICB9XG5cbiAgICBfZ2V0Q29tcGlsZWRGbkNvZGUgKCkge1xuICAgICAgICAvLyBPUFRJTUlaQVRJT046IGlmIHNlbGVjdG9yIHdhcyBwcm9kdWNlZCBmcm9tIGFub3RoZXIgc2VsZWN0b3IgYW5kXG4gICAgICAgIC8vIGl0IGhhcyBzYW1lIGRlcGVuZGVuY2llcyBhcyBzb3VyY2Ugc2VsZWN0b3IsIHRoZW4gd2UgY2FuXG4gICAgICAgIC8vIGF2b2lkIHJlY29tcGlsYXRpb24gYW5kIGp1c3QgcmUtdXNlIGFscmVhZHkgY29tcGlsZWQgY29kZS5cbiAgICAgICAgY29uc3QgaGFzU2FtZURlcGVuZGVuY2llc0FzU291cmNlU2VsZWN0b3IgPSB0aGlzLm9wdGlvbnMuc291cmNlU2VsZWN0b3JCdWlsZGVyICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNvdXJjZVNlbGVjdG9yQnVpbGRlci5vcHRpb25zLmRlcGVuZGVuY2llcyA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZGVwZW5kZW5jaWVzO1xuXG4gICAgICAgIGlmIChoYXNTYW1lRGVwZW5kZW5jaWVzQXNTb3VyY2VTZWxlY3RvcilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc291cmNlU2VsZWN0b3JCdWlsZGVyLmNvbXBpbGVkRm5Db2RlO1xuXG4gICAgICAgIGNvbnN0IGNvZGUgPSB0eXBlb2YgdGhpcy5mbiA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgICAgYChmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCR7SlNPTi5zdHJpbmdpZnkodGhpcy5mbil9KTt9KTtgIDpcbiAgICAgICAgICAgIHN1cGVyLl9nZXRDb21waWxlZEZuQ29kZSgpO1xuXG4gICAgICAgIGlmIChjb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVkZW50KFxuICAgICAgICAgICAgICAgIGAoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9fZiQ9JHtjb2RlfTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyAgICAgICAgICAgPSBfX2RlcGVuZGVuY2llcyQuYm91bmRBcmdzIHx8IGFyZ3VtZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvckZpbHRlciA9IHdpbmRvd1snJXRlc3RDYWZlU2VsZWN0b3JGaWx0ZXIlJ107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlcyA9IF9fZiQuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlcyAgICAgPSBzZWxlY3RvckZpbHRlci5jYXN0KG5vZGVzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFub2Rlcy5sZW5ndGggJiYgIXNlbGVjdG9yRmlsdGVyLmVycm9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yRmlsdGVyLmVycm9yID0gX19kZXBlbmRlbmNpZXMkLmFwaUluZm8uYXBpRm5JRDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yRmlsdGVyLmZpbHRlcihub2RlcywgX19kZXBlbmRlbmNpZXMkLmZpbHRlck9wdGlvbnMsIF9fZGVwZW5kZW5jaWVzJC5hcGlJbmZvKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgfSkoKTtgXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUludmFsaWRGblR5cGVFcnJvciAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2xpZW50RnVuY3Rpb25BUElFcnJvcih0aGlzLmNhbGxzaXRlTmFtZXMuaW5zdGFudGlhdGlvbiwgdGhpcy5jYWxsc2l0ZU5hbWVzLmluc3RhbnRpYXRpb24sIFJVTlRJTUVfRVJST1JTLnNlbGVjdG9ySW5pdGlhbGl6ZWRXaXRoV3JvbmdUeXBlLCB0eXBlb2YgdGhpcy5mbik7XG4gICAgfVxuXG4gICAgX2V4ZWN1dGVDb21tYW5kIChhcmdzLCB0ZXN0UnVuLCBjYWxsc2l0ZSkge1xuICAgICAgICBjb25zdCByZXN1bHRQcm9taXNlID0gc3VwZXIuX2V4ZWN1dGVDb21tYW5kKGFyZ3MsIHRlc3RSdW4sIGNhbGxzaXRlKTtcblxuICAgICAgICB0aGlzLl9hZGRCb3VuZEFyZ3NTZWxlY3RvckdldHRlcihyZXN1bHRQcm9taXNlLCBhcmdzKTtcblxuICAgICAgICAvLyBPUFRJTUlaQVRJT046IHVzZSBidWZmZXIgZnVuY3Rpb24gYXMgc2VsZWN0b3Igbm90IHRvIHRyaWdnZXIgbGF6eSBwcm9wZXJ0eSBhaGVhZCBvZiB0aW1lXG4gICAgICAgIGFkZEFQSShyZXN1bHRQcm9taXNlLCAoKSA9PiByZXN1bHRQcm9taXNlLnNlbGVjdG9yLCBTZWxlY3RvckJ1aWxkZXIsIHRoaXMub3B0aW9ucy5jdXN0b21ET01Qcm9wZXJ0aWVzLCB0aGlzLm9wdGlvbnMuY3VzdG9tTWV0aG9kcyk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFByb21pc2U7XG4gICAgfVxuXG4gICAgX2dldFNvdXJjZVNlbGVjdG9yQnVpbGRlckFwaUZuSUQgKCkge1xuICAgICAgICBsZXQgc2VsZWN0b3JBbmNlc3RvciA9IHRoaXM7XG5cbiAgICAgICAgd2hpbGUgKHNlbGVjdG9yQW5jZXN0b3Iub3B0aW9ucy5zb3VyY2VTZWxlY3RvckJ1aWxkZXIpXG4gICAgICAgICAgICBzZWxlY3RvckFuY2VzdG9yID0gc2VsZWN0b3JBbmNlc3Rvci5vcHRpb25zLnNvdXJjZVNlbGVjdG9yQnVpbGRlcjtcblxuICAgICAgICByZXR1cm4gc2VsZWN0b3JBbmNlc3Rvci5vcHRpb25zLmFwaUZuSUQ7XG4gICAgfVxuXG4gICAgZ2V0RnVuY3Rpb25EZXBlbmRlbmNpZXMgKCkge1xuICAgICAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBzdXBlci5nZXRGdW5jdGlvbkRlcGVuZGVuY2llcygpO1xuXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGZpbHRlclZpc2libGUsXG4gICAgICAgICAgICBmaWx0ZXJIaWRkZW4sXG4gICAgICAgICAgICBjb3VudGVyTW9kZSxcbiAgICAgICAgICAgIGNvbGxlY3Rpb25Nb2RlLFxuICAgICAgICAgICAgZ2V0VmlzaWJsZVZhbHVlTW9kZSxcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgY3VzdG9tRE9NUHJvcGVydGllcyxcbiAgICAgICAgICAgIGN1c3RvbU1ldGhvZHMsXG4gICAgICAgICAgICBhcGlGbkNoYWluLFxuICAgICAgICAgICAgYm91bmRBcmdzXG4gICAgICAgIH0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgICAgcmV0dXJuIG1lcmdlKHt9LCBkZXBlbmRlbmNpZXMsIHtcbiAgICAgICAgICAgIGZpbHRlck9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJWaXNpYmxlLFxuICAgICAgICAgICAgICAgIGZpbHRlckhpZGRlbixcbiAgICAgICAgICAgICAgICBjb3VudGVyTW9kZSxcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uTW9kZSxcbiAgICAgICAgICAgICAgICBpbmRleDogaXNOdWxsT3JVbmRlZmluZWQoaW5kZXgpID8gbnVsbCA6IGluZGV4LFxuICAgICAgICAgICAgICAgIGdldFZpc2libGVWYWx1ZU1vZGVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhcGlJbmZvOiB7XG4gICAgICAgICAgICAgICAgYXBpRm5DaGFpbixcbiAgICAgICAgICAgICAgICBhcGlGbklEOiB0aGlzLl9nZXRTb3VyY2VTZWxlY3RvckJ1aWxkZXJBcGlGbklEKClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib3VuZEFyZ3MsXG4gICAgICAgICAgICBjdXN0b21ET01Qcm9wZXJ0aWVzLFxuICAgICAgICAgICAgY3VzdG9tTWV0aG9kc1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfY3JlYXRlVGVzdFJ1bkNvbW1hbmQgKGVuY29kZWRBcmdzLCBlbmNvZGVkRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXhlY3V0ZVNlbGVjdG9yQ29tbWFuZCh7XG4gICAgICAgICAgICBpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lOiB0aGlzLmNhbGxzaXRlTmFtZXMuaW5zdGFudGlhdGlvbixcbiAgICAgICAgICAgIGZuQ29kZTogICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGlsZWRGbkNvZGUsXG4gICAgICAgICAgICBhcmdzOiAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkQXJncyxcbiAgICAgICAgICAgIGRlcGVuZGVuY2llczogICAgICAgICAgICAgIGVuY29kZWREZXBlbmRlbmNpZXMsXG4gICAgICAgICAgICBuZWVkRXJyb3I6ICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubmVlZEVycm9yLFxuICAgICAgICAgICAgYXBpRm5DaGFpbjogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFwaUZuQ2hhaW4sXG4gICAgICAgICAgICB2aXNpYmlsaXR5Q2hlY2s6ICAgICAgICAgICAhIXRoaXMub3B0aW9ucy52aXNpYmlsaXR5Q2hlY2ssXG4gICAgICAgICAgICB0aW1lb3V0OiAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudGltZW91dFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGVPcHRpb25zIChvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyLl92YWxpZGF0ZU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChvcHRpb25zLnZpc2liaWxpdHlDaGVjaykpXG4gICAgICAgICAgICBhc3NlcnRUeXBlKGlzLmJvb2xlYW4sIHRoaXMuY2FsbHNpdGVOYW1lcy5pbnN0YW50aWF0aW9uLCAnXCJ2aXNpYmlsaXR5Q2hlY2tcIiBvcHRpb24nLCBvcHRpb25zLnZpc2liaWxpdHlDaGVjayk7XG5cbiAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChvcHRpb25zLnRpbWVvdXQpKVxuICAgICAgICAgICAgYXNzZXJ0VHlwZShpcy5ub25OZWdhdGl2ZU51bWJlciwgdGhpcy5jYWxsc2l0ZU5hbWVzLmluc3RhbnRpYXRpb24sICdcInRpbWVvdXRcIiBvcHRpb24nLCBvcHRpb25zLnRpbWVvdXQpO1xuICAgIH1cblxuICAgIF9nZXRSZXBsaWNhdG9yVHJhbnNmb3JtcyAoKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybXMgPSBzdXBlci5fZ2V0UmVwbGljYXRvclRyYW5zZm9ybXMoKTtcblxuICAgICAgICB0cmFuc2Zvcm1zLnB1c2gobmV3IFNlbGVjdG9yTm9kZVRyYW5zZm9ybSgpKTtcblxuICAgICAgICByZXR1cm4gdHJhbnNmb3JtcztcbiAgICB9XG5cbiAgICBfYWRkQm91bmRBcmdzU2VsZWN0b3JHZXR0ZXIgKG9iaiwgc2VsZWN0b3JBcmdzKSB7XG4gICAgICAgIGRlZmluZUxhenlQcm9wZXJ0eShvYmosICdzZWxlY3RvcicsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgU2VsZWN0b3JCdWlsZGVyKHRoaXMuZ2V0RnVuY3Rpb24oKSwgeyBib3VuZEFyZ3M6IHNlbGVjdG9yQXJncyB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0RnVuY3Rpb24oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2RlY29yYXRlRnVuY3Rpb24gKHNlbGVjdG9yRm4pIHtcbiAgICAgICAgc3VwZXIuX2RlY29yYXRlRnVuY3Rpb24oc2VsZWN0b3JGbik7XG5cbiAgICAgICAgYWRkQVBJKFxuICAgICAgICAgICAgc2VsZWN0b3JGbixcbiAgICAgICAgICAgICgpID0+IHNlbGVjdG9yRm4sXG4gICAgICAgICAgICBTZWxlY3RvckJ1aWxkZXIsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY3VzdG9tRE9NUHJvcGVydGllcyxcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jdXN0b21NZXRob2RzLFxuICAgICAgICAgICAgdGhpcy5fZ2V0T2JzZXJ2ZWRDYWxsc2l0ZXMoKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIF9nZXRDbGllbnRGbldpdGhPdmVycmlkZGVuT3B0aW9ucyAob3B0aW9ucykge1xuICAgICAgICBjb25zdCBhcGlGbiAgICAgICAgICAgICAgPSBwcmVwYXJlQXBpRm5BcmdzKCd3aXRoJywgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzU2VsZWN0b3JJRCA9IHRoaXMub3B0aW9ucy5hcGlGbkNoYWluLmxlbmd0aCAtIDE7XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLl9nZXRDbGllbnRGbldpdGhPdmVycmlkZGVuT3B0aW9ucyhPYmplY3QuYXNzaWduKG9wdGlvbnMsIHsgYXBpRm4sIGFwaUZuSUQ6IHByZXZpb3VzU2VsZWN0b3JJRCB9KSk7XG4gICAgfVxuXG4gICAgX3Byb2Nlc3NSZXN1bHQgKHJlc3VsdCwgc2VsZWN0b3JBcmdzKSB7XG4gICAgICAgIGNvbnN0IHNuYXBzaG90ID0gc3VwZXIuX3Byb2Nlc3NSZXN1bHQocmVzdWx0LCBzZWxlY3RvckFyZ3MpO1xuXG4gICAgICAgIGlmIChzbmFwc2hvdCAmJiAhcmV0dXJuU2luZ2xlUHJvcE1vZGUodGhpcy5vcHRpb25zKSkge1xuICAgICAgICAgICAgdGhpcy5fYWRkQm91bmRBcmdzU2VsZWN0b3JHZXR0ZXIoc25hcHNob3QsIHNlbGVjdG9yQXJncyk7XG4gICAgICAgICAgICBjcmVhdGVTbmFwc2hvdE1ldGhvZHMoc25hcHNob3QpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmN1c3RvbU1ldGhvZHMpXG4gICAgICAgICAgICAgICAgYWRkQ3VzdG9tTWV0aG9kcyhzbmFwc2hvdCwgKCkgPT4gc25hcHNob3Quc2VsZWN0b3IsIFNlbGVjdG9yQnVpbGRlciwgdGhpcy5vcHRpb25zLmN1c3RvbU1ldGhvZHMpO1xuXG4gICAgICAgICAgICBpZiAoc2VsZWN0b3JBcGlFeGVjdXRpb25Nb2RlLmlzU3luYykge1xuICAgICAgICAgICAgICAgIGFkZEFQSShcbiAgICAgICAgICAgICAgICAgICAgc25hcHNob3QsXG4gICAgICAgICAgICAgICAgICAgICgpID0+IHNuYXBzaG90LnNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBTZWxlY3RvckJ1aWxkZXIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jdXN0b21ET01Qcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY3VzdG9tTWV0aG9kcyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0T2JzZXJ2ZWRDYWxsc2l0ZXMoKSxcbiAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc25hcHNob3Q7XG4gICAgfVxufVxuXG4iXX0=