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.
- package/CHANGELOG.md +6 -0
- package/LICENSE +21 -21
- package/bin/testcafe-with-v8-flag-filter.js +0 -0
- package/lib/api/exportable-lib/index.js +49 -49
- package/lib/api/request-hooks/assert-type.js +7 -7
- package/lib/api/request-hooks/hook-method-names.js +9 -9
- package/lib/api/request-hooks/hook.js +32 -32
- package/lib/api/request-hooks/interfaces.js +2 -2
- package/lib/api/request-hooks/request-logger.js +112 -112
- package/lib/api/request-hooks/request-mock/create-request-mock.js +10 -10
- package/lib/api/request-hooks/request-mock/index.js +44 -44
- package/lib/api/request-hooks/request-mock.js +46 -46
- package/lib/api/structure/base-unit.js +11 -11
- package/lib/api/structure/fixture.js +75 -75
- package/lib/api/structure/interfaces.js +2 -2
- package/lib/api/structure/test-file.js +31 -31
- package/lib/api/structure/test-timeout.js +9 -9
- package/lib/api/structure/test.js +85 -85
- package/lib/api/structure/testing-unit.js +89 -89
- package/lib/api/structure/unit-type.js +9 -9
- package/lib/api/test-controller/assertion.js +88 -88
- package/lib/api/test-controller/execution-context.js +82 -82
- package/lib/api/test-controller/index.js +358 -358
- package/lib/api/test-controller/proxy.js +28 -28
- package/lib/api/test-page-url.js +60 -60
- package/lib/api/test-run-tracker.js +68 -68
- package/lib/api/wrap-test-function.js +49 -49
- package/lib/assertions/executor.js +74 -74
- package/lib/assertions/get-fn.js +46 -46
- package/lib/assertions/type.js +20 -20
- package/lib/assets/content-types.js +9 -9
- package/lib/assets/injectables.js +18 -18
- package/lib/browser/connection/command.js +10 -10
- package/lib/browser/connection/error-hints.js +9 -9
- package/lib/browser/connection/gateway.js +159 -159
- package/lib/browser/connection/get-hints.js +33 -33
- package/lib/browser/connection/heartbeat-status.js +8 -8
- package/lib/browser/connection/index.js +328 -328
- package/lib/browser/connection/remotes-queue.js +46 -46
- package/lib/browser/connection/service-routes.js +12 -12
- package/lib/browser/connection/status.js +12 -12
- package/lib/browser/interfaces.js +2 -2
- package/lib/browser/provider/built-in/dedicated/base.js +80 -80
- package/lib/browser/provider/built-in/dedicated/chrome/browser-client.js +204 -204
- package/lib/browser/provider/built-in/dedicated/chrome/build-chrome-args.js +17 -17
- package/lib/browser/provider/built-in/dedicated/chrome/config.js +110 -110
- package/lib/browser/provider/built-in/dedicated/chrome/create-temp-profile.js +45 -45
- package/lib/browser/provider/built-in/dedicated/chrome/elapsed-upperbounds.js +15 -15
- package/lib/browser/provider/built-in/dedicated/chrome/index.js +102 -102
- package/lib/browser/provider/built-in/dedicated/chrome/interfaces.js +2 -2
- package/lib/browser/provider/built-in/dedicated/chrome/local-chrome.js +24 -24
- package/lib/browser/provider/built-in/dedicated/chrome/runtime-info.js +29 -29
- package/lib/browser/provider/built-in/dedicated/edge/index.js +10 -10
- package/lib/browser/provider/built-in/dedicated/edge/runtime-info.js +29 -29
- package/lib/browser/provider/built-in/dedicated/firefox/config.js +33 -33
- package/lib/browser/provider/built-in/dedicated/firefox/create-temp-profile.js +78 -78
- package/lib/browser/provider/built-in/dedicated/firefox/index.js +73 -73
- package/lib/browser/provider/built-in/dedicated/firefox/local-firefox.js +36 -36
- package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/commands.js +13 -13
- package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/index.js +200 -200
- package/lib/browser/provider/built-in/dedicated/firefox/runtime-info.js +17 -17
- package/lib/browser/provider/built-in/index.js +21 -21
- package/lib/browser/provider/built-in/locally-installed.js +30 -30
- package/lib/browser/provider/built-in/path.js +47 -47
- package/lib/browser/provider/built-in/remote.js +58 -58
- package/lib/browser/provider/index.js +303 -303
- package/lib/browser/provider/parse-provider-name.js +16 -16
- package/lib/browser/provider/plugin-host.js +121 -121
- package/lib/browser/provider/pool.js +115 -115
- package/lib/browser/provider/utils/argument-parsing.js +74 -74
- package/lib/browser/provider/utils/browser-starter.js +34 -34
- package/lib/browser/provider/utils/client-functions.js +24 -24
- package/lib/browser/provider/utils/get-maximized-headless-window-size.js +9 -9
- package/lib/cli/argument-parser.js +284 -284
- package/lib/cli/authentication-helper.js +35 -35
- package/lib/cli/cli.js +134 -134
- package/lib/cli/correct-browsers-and-sources.js +40 -40
- package/lib/cli/index.js +19 -19
- package/lib/cli/log.js +43 -43
- package/lib/cli/remotes-wizard.js +36 -36
- package/lib/cli/termination-handler.js +38 -38
- package/lib/client/automation/index.js +34 -16
- package/lib/client/automation/index.min.js +1 -1
- package/lib/client/browser/idle-page/index.html.mustache +35 -35
- package/lib/client/browser/idle-page/logo.svg +86 -86
- package/lib/client/core/index.js +14 -14
- package/lib/client/driver/index.js +46 -16
- package/lib/client/driver/index.min.js +1 -1
- package/lib/client/driver/internal-properties.js +9 -9
- package/lib/client/test-run/iframe.js.mustache +17 -17
- package/lib/client/test-run/index.js.mustache +51 -51
- package/lib/client/ui/index.js +14 -14
- package/lib/client/ui/sprite.svg +42 -42
- package/lib/client-functions/builder-symbol.js +4 -4
- package/lib/client-functions/client-function-builder.js +155 -155
- package/lib/client-functions/replicator.js +61 -61
- package/lib/client-functions/return-single-prop-mode.js +8 -8
- package/lib/client-functions/selector-api-execution-mode.js +20 -20
- package/lib/client-functions/selectors/add-api.js +645 -645
- package/lib/client-functions/selectors/create-snapshot-methods.js +13 -13
- package/lib/client-functions/selectors/prepare-api-args.js +20 -20
- package/lib/client-functions/selectors/selector-attribute-filter.js +22 -22
- package/lib/client-functions/selectors/selector-builder.js +153 -153
- package/lib/client-functions/selectors/selector-text-filter.js +43 -43
- package/lib/client-functions/selectors/snapshot-properties.js +48 -48
- package/lib/client-functions/types.js +18 -18
- package/lib/compiler/babel/format-babel-produced-code.js +10 -10
- package/lib/compiler/babel/get-base-babel-options.js +11 -11
- package/lib/compiler/babel/load-libs.js +63 -63
- package/lib/compiler/babel/preset-stage-2.js +19 -19
- package/lib/compiler/compile-client-function.js +73 -73
- package/lib/compiler/compilers.js +33 -33
- package/lib/compiler/index.js +92 -92
- package/lib/compiler/interfaces.js +2 -2
- package/lib/compiler/test-file/api-based.js +146 -146
- package/lib/compiler/test-file/base.js +36 -36
- package/lib/compiler/test-file/exportble-lib-path.js +5 -5
- package/lib/compiler/test-file/formats/coffeescript/compiler.js +38 -38
- package/lib/compiler/test-file/formats/coffeescript/get-test-list.js +29 -29
- package/lib/compiler/test-file/formats/es-next/compiler.js +42 -42
- package/lib/compiler/test-file/formats/es-next/get-test-list.js +166 -166
- package/lib/compiler/test-file/formats/es-next/is-flow-code.js +7 -7
- package/lib/compiler/test-file/formats/raw.js +85 -85
- package/lib/compiler/test-file/formats/typescript/compiler.js +135 -135
- package/lib/compiler/test-file/formats/typescript/get-test-list.js +185 -185
- package/lib/compiler/test-file/test-file-parser-base.js +214 -214
- package/lib/configuration/configuration-base.js +165 -165
- package/lib/configuration/constants.js +9 -9
- package/lib/configuration/customizable-compilers.js +7 -7
- package/lib/configuration/default-values.js +51 -51
- package/lib/configuration/interfaces.js +2 -2
- package/lib/configuration/option-names.js +53 -53
- package/lib/configuration/option-source.js +9 -9
- package/lib/configuration/option.js +14 -14
- package/lib/configuration/quarantine-option-names.js +8 -8
- package/lib/configuration/run-option-names.js +26 -26
- package/lib/configuration/screenshot-option-names.js +10 -10
- package/lib/configuration/testcafe-configuration.js +163 -163
- package/lib/configuration/types.js +2 -2
- package/lib/configuration/typescript-configuration.js +62 -62
- package/lib/custom-client-scripts/assert-type.js +7 -7
- package/lib/custom-client-scripts/client-script-init.js +2 -2
- package/lib/custom-client-scripts/client-script.js +106 -106
- package/lib/custom-client-scripts/get-code.js +11 -11
- package/lib/custom-client-scripts/get-url.js +6 -6
- package/lib/custom-client-scripts/load.js +15 -15
- package/lib/custom-client-scripts/problematic-scripts.js +2 -2
- package/lib/custom-client-scripts/routing.js +36 -36
- package/lib/custom-client-scripts/utils.js +60 -60
- package/lib/embedding-utils.js +83 -83
- package/lib/errors/create-stack-filter.js +18 -18
- package/lib/errors/error-list.js +26 -26
- package/lib/errors/get-callsite.js +31 -31
- package/lib/errors/internal-modules-prefix.js +8 -8
- package/lib/errors/is-internal-stack-frame.js +45 -45
- package/lib/errors/process-test-fn-error.js +37 -37
- package/lib/errors/runtime/index.js +123 -123
- package/lib/errors/runtime/templates.js +115 -115
- package/lib/errors/runtime/type-assertions.js +112 -112
- package/lib/errors/stack-cleaning-hook.js +64 -64
- package/lib/errors/test-run/formattable-adapter.js +59 -59
- package/lib/errors/test-run/index.js +301 -301
- package/lib/errors/test-run/render-error-template.js +31 -31
- package/lib/errors/test-run/templates.js +91 -91
- package/lib/errors/test-run/utils.js +89 -89
- package/lib/errors/types.js +156 -156
- package/lib/index.js +81 -81
- package/lib/live/bootstrapper.js +43 -43
- package/lib/live/controller.js +107 -107
- package/lib/live/file-watcher/index.js +67 -67
- package/lib/live/file-watcher/modules-graph.js +58 -58
- package/lib/live/keyboard-observer.js +76 -76
- package/lib/live/logger/index.js +64 -64
- package/lib/live/test-run-controller.js +96 -96
- package/lib/live/test-run-state.js +6 -6
- package/lib/live/test-run.js +56 -56
- package/lib/live/test-runner.js +167 -167
- package/lib/load-assets.js +29 -29
- package/lib/notifications/add-rendered-warning.js +16 -16
- package/lib/notifications/debug-logger.js +78 -78
- package/lib/notifications/deprecated.js +24 -24
- package/lib/notifications/information-message.js +9 -9
- package/lib/notifications/warning-log.js +31 -31
- package/lib/notifications/warning-message.js +47 -47
- package/lib/reporter/command/command-formatter.js +120 -109
- package/lib/reporter/command/format-command.js +8 -8
- package/lib/reporter/command/interfaces.js +2 -2
- package/lib/reporter/index.js +319 -314
- package/lib/reporter/interfaces.js +2 -2
- package/lib/reporter/plugin-host.js +135 -135
- package/lib/reporter/plugin-methods.js +12 -12
- package/lib/role/index.js +74 -74
- package/lib/role/marker-symbol.js +7 -7
- package/lib/role/phase.js +9 -9
- package/lib/runner/bootstrapper.js +271 -271
- package/lib/runner/browser-job-result.js +9 -9
- package/lib/runner/browser-job.js +152 -152
- package/lib/runner/browser-set.js +114 -114
- package/lib/runner/fixture-hook-controller.js +85 -85
- package/lib/runner/index.js +449 -449
- package/lib/runner/interfaces.js +2 -2
- package/lib/runner/reporter-stream-controller.js +27 -27
- package/lib/runner/task/index.js +151 -151
- package/lib/runner/task/phase.js +9 -9
- package/lib/runner/test-run-controller.js +165 -165
- package/lib/runner/tested-app.js +72 -72
- package/lib/screenshots/capturer.js +141 -141
- package/lib/screenshots/constants.js +11 -11
- package/lib/screenshots/crop.js +111 -111
- package/lib/screenshots/default-extension.js +4 -4
- package/lib/screenshots/index.js +67 -67
- package/lib/screenshots/utils.js +39 -39
- package/lib/services/compiler/host.js +190 -190
- package/lib/services/compiler/io.js +9 -9
- package/lib/services/compiler/protocol.js +17 -16
- package/lib/services/compiler/service.js +225 -212
- package/lib/services/compiler/test-run-proxy.js +111 -111
- package/lib/services/interfaces.js +2 -2
- package/lib/services/process-title.js +8 -8
- package/lib/services/serialization/prepare-options.js +17 -17
- package/lib/services/serialization/replicator/create-replicator.js +25 -25
- package/lib/services/serialization/replicator/custom-error-transform.js +26 -26
- package/lib/services/serialization/test-structure.js +92 -92
- package/lib/services/utils/ipc/interfaces.js +30 -30
- package/lib/services/utils/ipc/io.js +108 -108
- package/lib/services/utils/ipc/message.js +75 -75
- package/lib/services/utils/ipc/packet.js +55 -55
- package/lib/services/utils/ipc/proxy.js +109 -109
- package/lib/services/utils/ipc/transport.js +64 -64
- package/lib/shared/errors/index.js +382 -382
- package/lib/shared/node-modules-folder-name.js +4 -4
- package/lib/test-run/bookmark.js +90 -90
- package/lib/test-run/browser-console-messages.js +73 -73
- package/lib/test-run/browser-manipulation-queue.js +92 -92
- package/lib/test-run/client-messages.js +9 -9
- package/lib/test-run/commands/actions.js +486 -483
- package/lib/test-run/commands/assertion.js +45 -45
- package/lib/test-run/commands/base.js +14 -14
- package/lib/test-run/commands/browser-manipulation.js +95 -95
- package/lib/test-run/commands/from-object.js +82 -82
- package/lib/test-run/commands/observation.js +61 -61
- package/lib/test-run/commands/options.js +231 -215
- package/lib/test-run/commands/service.js +54 -48
- package/lib/test-run/commands/type.js +65 -64
- package/lib/test-run/commands/utils.js +87 -87
- package/lib/test-run/commands/validations/argument.js +90 -90
- package/lib/test-run/commands/validations/factories.js +47 -47
- package/lib/test-run/commands/validations/initializers.js +44 -44
- package/lib/test-run/debug-log.js +32 -32
- package/lib/test-run/execute-js-expression.js +74 -74
- package/lib/test-run/index.js +823 -799
- package/lib/test-run/marker-symbol.js +7 -7
- package/lib/test-run/observed-callsites-storage.js +17 -17
- package/lib/test-run/phase.js +16 -16
- package/lib/test-run/session-controller.js +104 -104
- package/lib/testcafe.js +118 -118
- package/lib/utils/assignable.js +39 -39
- package/lib/utils/async-event-emitter.js +28 -28
- package/lib/utils/async-queue.js +14 -14
- package/lib/utils/browser-connection-timeouts.js +19 -19
- package/lib/utils/callsite.js +17 -17
- package/lib/utils/check-file-path.js +31 -31
- package/lib/utils/check-url.js +51 -51
- package/lib/utils/convert-to-best-fit-type.js +16 -16
- package/lib/utils/correct-file-path.js +21 -21
- package/lib/utils/define-lazy-property.js +13 -13
- package/lib/utils/delay.js +6 -6
- package/lib/utils/delegated-api.js +44 -44
- package/lib/utils/detect-display.js +6 -6
- package/lib/utils/detect-ffmpeg.js +44 -44
- package/lib/utils/diff/colors.js +29 -29
- package/lib/utils/diff/index.js +52 -52
- package/lib/utils/diff/util.js +23 -23
- package/lib/utils/diff.js +29 -29
- package/lib/utils/escape-user-agent.js +10 -10
- package/lib/utils/flag-list.js +17 -17
- package/lib/utils/get-any-key.js +8 -8
- package/lib/utils/get-browser.js +8 -8
- package/lib/utils/get-common-path.js +34 -34
- package/lib/utils/get-filter-fn.js +40 -40
- package/lib/utils/get-options/base.js +36 -36
- package/lib/utils/get-options/compiler.js +33 -33
- package/lib/utils/get-options/grep.js +15 -15
- package/lib/utils/get-options/index.js +20 -20
- package/lib/utils/get-options/meta.js +22 -22
- package/lib/utils/get-options/quarantine.js +91 -91
- package/lib/utils/get-options/screenshot.js +17 -17
- package/lib/utils/get-options/ssl.js +45 -45
- package/lib/utils/get-options/video.js +10 -10
- package/lib/utils/get-viewport-width.js +17 -17
- package/lib/utils/guard-time-execution.js +10 -10
- package/lib/utils/handle-errors.js +74 -74
- package/lib/utils/handle-tag-args.js +8 -8
- package/lib/utils/http.js +30 -30
- package/lib/utils/is-localhost.js +11 -11
- package/lib/utils/is-password-input.js +11 -0
- package/lib/utils/is-repl.js +10 -10
- package/lib/utils/is-window-in-iframe.js +6 -6
- package/lib/utils/limit-number.js +10 -10
- package/lib/utils/make-reg-exp.js +7 -7
- package/lib/utils/moment-loader.js +20 -20
- package/lib/utils/parse-file-list.js +71 -71
- package/lib/utils/parse-user-agent.js +55 -55
- package/lib/utils/path-pattern.js +114 -114
- package/lib/utils/prepare-reporters.js +30 -30
- package/lib/utils/prerender-callsite.js +18 -18
- package/lib/utils/process.js +119 -119
- package/lib/utils/promisified-functions.js +46 -46
- package/lib/utils/re-executable-promise.js +39 -39
- package/lib/utils/render-callsite-sync.js +29 -29
- package/lib/utils/render-template.js +9 -9
- package/lib/utils/reporter.js +30 -30
- package/lib/utils/resolve-path-relatively-cwd.js +7 -7
- package/lib/utils/string.js +105 -105
- package/lib/utils/temp-directory/cleanup-process/commands.js +7 -7
- package/lib/utils/temp-directory/cleanup-process/index.js +143 -143
- package/lib/utils/temp-directory/cleanup-process/worker.js +58 -58
- package/lib/utils/temp-directory/index.js +87 -87
- package/lib/utils/temp-directory/lockfile.js +56 -56
- package/lib/utils/thennable.js +7 -7
- package/lib/utils/timer.js +15 -15
- package/lib/utils/to-posix-path.js +8 -8
- package/lib/utils/types.js +2 -2
- package/lib/video-recorder/interfaces.js +2 -2
- package/lib/video-recorder/process.js +126 -126
- package/lib/video-recorder/recorder.js +136 -136
- package/lib/video-recorder/test-run-video-recorder.js +69 -69
- package/lib/video-recorder/videos.js +37 -37
- package/package.json +2 -2
- package/ts-defs/index.d.ts +25 -14
- package/ts-defs/selectors.d.ts +16 -5
- package/ts-defs/testcafe-scripts.d.ts +17 -6
|
@@ -1,191 +1,191 @@
|
|
|
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 child_process_1 = require("child_process");
|
|
7
|
-
const io_1 = require("./io");
|
|
8
|
-
const test_structure_1 = require("../serialization/test-structure");
|
|
9
|
-
const prepare_options_1 = __importDefault(require("../serialization/prepare-options"));
|
|
10
|
-
const test_run_tracker_1 = __importDefault(require("../../api/test-run-tracker"));
|
|
11
|
-
const proxy_1 = require("../utils/ipc/proxy");
|
|
12
|
-
const transport_1 = require("../utils/ipc/transport");
|
|
13
|
-
const async_event_emitter_1 = __importDefault(require("../../utils/async-event-emitter"));
|
|
14
|
-
const error_list_1 = __importDefault(require("../../errors/error-list"));
|
|
15
|
-
const testcafe_hammerhead_1 = require("testcafe-hammerhead");
|
|
16
|
-
const SERVICE_PATH = require.resolve('./service');
|
|
17
|
-
class CompilerHost extends async_event_emitter_1.default {
|
|
18
|
-
constructor() {
|
|
19
|
-
super();
|
|
20
|
-
this.runtime = Promise.resolve(void 0);
|
|
21
|
-
}
|
|
22
|
-
_setupRoutes(proxy) {
|
|
23
|
-
proxy.register([
|
|
24
|
-
this.executeAction,
|
|
25
|
-
this.executeCommand,
|
|
26
|
-
this.ready,
|
|
27
|
-
this.onRequestHookEvent,
|
|
28
|
-
this.setMock,
|
|
29
|
-
this.setConfigureResponseEventOptions,
|
|
30
|
-
this.setHeaderOnConfigureResponseEvent,
|
|
31
|
-
this.removeHeaderOnConfigureResponseEvent,
|
|
32
|
-
this.executeRequestFilterRulePredicate,
|
|
33
|
-
this.executeMockPredicate,
|
|
34
|
-
this.getWarningMessages,
|
|
35
|
-
this.addRequestEventListeners,
|
|
36
|
-
this.removeRequestEventListeners,
|
|
37
|
-
this.
|
|
38
|
-
], this);
|
|
39
|
-
}
|
|
40
|
-
async _init(runtime) {
|
|
41
|
-
const resolvedRuntime = await runtime;
|
|
42
|
-
if (resolvedRuntime)
|
|
43
|
-
return resolvedRuntime;
|
|
44
|
-
try {
|
|
45
|
-
const service = child_process_1.spawn(process.argv0, [SERVICE_PATH], { stdio: [0, 1, 2, 'pipe', 'pipe', 'pipe'] });
|
|
46
|
-
// HACK: Node.js definition are not correct when additional I/O channels are sp
|
|
47
|
-
const stdio = service.stdio;
|
|
48
|
-
const proxy = new proxy_1.IPCProxy(new transport_1.HostTransport(stdio[io_1.HOST_INPUT_FD], stdio[io_1.HOST_OUTPUT_FD], stdio[io_1.HOST_SYNC_FD]));
|
|
49
|
-
this._setupRoutes(proxy);
|
|
50
|
-
await this.once('ready');
|
|
51
|
-
return { proxy, service };
|
|
52
|
-
}
|
|
53
|
-
catch (e) {
|
|
54
|
-
return void 0;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
async _getRuntime() {
|
|
58
|
-
const runtime = await this.runtime;
|
|
59
|
-
if (!runtime)
|
|
60
|
-
throw new Error('Runtime is not available.');
|
|
61
|
-
return runtime;
|
|
62
|
-
}
|
|
63
|
-
_prepareEventData(eventData) {
|
|
64
|
-
// TODO: Remove eventData._requestContext into 'testcafe-hammerhead' module
|
|
65
|
-
// after switching to the compiler service mode.
|
|
66
|
-
// NOTE: Access to the deprecated property inside of the unserializable 'eventData._requestContext' property
|
|
67
|
-
// causes the node's deprecation warning.
|
|
68
|
-
const clonedEventData = Object.assign({}, eventData);
|
|
69
|
-
// @ts-ignore
|
|
70
|
-
delete clonedEventData._requestContext;
|
|
71
|
-
return clonedEventData;
|
|
72
|
-
}
|
|
73
|
-
async init() {
|
|
74
|
-
this.runtime = this._init(this.runtime);
|
|
75
|
-
await this.runtime;
|
|
76
|
-
}
|
|
77
|
-
async stop() {
|
|
78
|
-
const { service } = await this._getRuntime();
|
|
79
|
-
service.kill();
|
|
80
|
-
}
|
|
81
|
-
_wrapTestFunction(id, functionName) {
|
|
82
|
-
return async (testRun) => {
|
|
83
|
-
try {
|
|
84
|
-
return await this.
|
|
85
|
-
}
|
|
86
|
-
catch (err) {
|
|
87
|
-
const errList = new error_list_1.default();
|
|
88
|
-
errList.addError(err);
|
|
89
|
-
throw errList;
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
_wrapRequestFilterRulePredicate({ testId, hookId, ruleId }) {
|
|
94
|
-
return async (requestInfo) => {
|
|
95
|
-
return await this.executeRequestFilterRulePredicate({ testId, hookId, ruleId, requestInfo });
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
_wrapMockPredicate({ mock, testId, hookId, ruleId }) {
|
|
99
|
-
mock.body = async (requestInfo, res) => {
|
|
100
|
-
return await this.executeMockPredicate({ testId, hookId, ruleId, requestInfo, res });
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
async ready() {
|
|
104
|
-
this.emit('ready');
|
|
105
|
-
}
|
|
106
|
-
async executeAction(data) {
|
|
107
|
-
const targetTestRun = test_run_tracker_1.default.activeTestRuns[data.id];
|
|
108
|
-
if (!targetTestRun)
|
|
109
|
-
return void 0;
|
|
110
|
-
return targetTestRun.executeAction(data.apiMethodName, data.command, data.callsite);
|
|
111
|
-
}
|
|
112
|
-
executeActionSync() {
|
|
113
|
-
throw new Error('The method should not be called.');
|
|
114
|
-
}
|
|
115
|
-
async executeCommand({ command, id }) {
|
|
116
|
-
const targetTestRun = test_run_tracker_1.default.activeTestRuns[id];
|
|
117
|
-
if (!targetTestRun)
|
|
118
|
-
return void 0;
|
|
119
|
-
return targetTestRun.executeCommand(command);
|
|
120
|
-
}
|
|
121
|
-
async getTests({ sourceList, compilerOptions }) {
|
|
122
|
-
const { proxy } = await this._getRuntime();
|
|
123
|
-
const units = await proxy.call(this.getTests, { sourceList, compilerOptions });
|
|
124
|
-
return test_structure_1.restore(units, (...args) => this._wrapTestFunction(...args), (ruleLocator) => this._wrapRequestFilterRulePredicate(ruleLocator));
|
|
125
|
-
}
|
|
126
|
-
async
|
|
127
|
-
const { proxy } = await this._getRuntime();
|
|
128
|
-
return await proxy.call(this.
|
|
129
|
-
}
|
|
130
|
-
async cleanUp() {
|
|
131
|
-
const { proxy } = await this._getRuntime();
|
|
132
|
-
await proxy.call(this.cleanUp);
|
|
133
|
-
}
|
|
134
|
-
async setOptions({ value }) {
|
|
135
|
-
const { proxy } = await this._getRuntime();
|
|
136
|
-
const preparedOptions = prepare_options_1.default(value);
|
|
137
|
-
await proxy.call(this.setOptions, { value: preparedOptions });
|
|
138
|
-
}
|
|
139
|
-
async onRequestHookEvent({ name, testId, hookId, eventData }) {
|
|
140
|
-
const { proxy } = await this._getRuntime();
|
|
141
|
-
await proxy.call(this.onRequestHookEvent, {
|
|
142
|
-
name,
|
|
143
|
-
testId,
|
|
144
|
-
hookId,
|
|
145
|
-
eventData: this._prepareEventData(eventData)
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
async setMock({ testId, hookId, ruleId, responseEventId, mock }) {
|
|
149
|
-
const mockDefinedWithPredicate = mock.isPredicate;
|
|
150
|
-
mock = testcafe_hammerhead_1.ResponseMock.from(mock);
|
|
151
|
-
if (mockDefinedWithPredicate)
|
|
152
|
-
this._wrapMockPredicate({ mock, testId, hookId, ruleId });
|
|
153
|
-
await this.emit('setMock', [responseEventId, mock]);
|
|
154
|
-
}
|
|
155
|
-
async setConfigureResponseEventOptions({ eventId, opts }) {
|
|
156
|
-
await this.emit('setConfigureResponseEventOptions', [eventId, opts]);
|
|
157
|
-
}
|
|
158
|
-
async setHeaderOnConfigureResponseEvent({ eventId, headerName, headerValue }) {
|
|
159
|
-
await this.emit('setHeaderOnConfigureResponseEvent', [eventId, headerName, headerValue]);
|
|
160
|
-
}
|
|
161
|
-
async removeHeaderOnConfigureResponseEvent({ eventId, headerName }) {
|
|
162
|
-
await this.emit('removeHeaderOnConfigureResponseEvent', [eventId, headerName]);
|
|
163
|
-
}
|
|
164
|
-
async executeRequestFilterRulePredicate({ testId, hookId, ruleId, requestInfo }) {
|
|
165
|
-
const { proxy } = await this._getRuntime();
|
|
166
|
-
return await proxy.call(this.executeRequestFilterRulePredicate, { testId, hookId, ruleId, requestInfo });
|
|
167
|
-
}
|
|
168
|
-
async executeMockPredicate({ testId, hookId, ruleId, requestInfo, res }) {
|
|
169
|
-
const { proxy } = await this._getRuntime();
|
|
170
|
-
return await proxy.call(this.executeMockPredicate, { testId, hookId, ruleId, requestInfo, res });
|
|
171
|
-
}
|
|
172
|
-
async getWarningMessages({ testRunId }) {
|
|
173
|
-
const { proxy } = await this._getRuntime();
|
|
174
|
-
return proxy.call(this.getWarningMessages, { testRunId });
|
|
175
|
-
}
|
|
176
|
-
async addRequestEventListeners({ hookId, hookClassName, rules }) {
|
|
177
|
-
rules = testcafe_hammerhead_1.RequestFilterRule.fromArray(rules);
|
|
178
|
-
await this.emit('addRequestEventListeners', { hookId, hookClassName, rules });
|
|
179
|
-
}
|
|
180
|
-
async removeRequestEventListeners({ rules }) {
|
|
181
|
-
rules = testcafe_hammerhead_1.RequestFilterRule.fromArray(rules);
|
|
182
|
-
await this.emit('removeRequestEventListeners', { rules });
|
|
183
|
-
}
|
|
184
|
-
async
|
|
185
|
-
const { proxy } = await this._getRuntime();
|
|
186
|
-
return proxy.call(this.
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
exports.default = CompilerHost;
|
|
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 child_process_1 = require("child_process");
|
|
7
|
+
const io_1 = require("./io");
|
|
8
|
+
const test_structure_1 = require("../serialization/test-structure");
|
|
9
|
+
const prepare_options_1 = __importDefault(require("../serialization/prepare-options"));
|
|
10
|
+
const test_run_tracker_1 = __importDefault(require("../../api/test-run-tracker"));
|
|
11
|
+
const proxy_1 = require("../utils/ipc/proxy");
|
|
12
|
+
const transport_1 = require("../utils/ipc/transport");
|
|
13
|
+
const async_event_emitter_1 = __importDefault(require("../../utils/async-event-emitter"));
|
|
14
|
+
const error_list_1 = __importDefault(require("../../errors/error-list"));
|
|
15
|
+
const testcafe_hammerhead_1 = require("testcafe-hammerhead");
|
|
16
|
+
const SERVICE_PATH = require.resolve('./service');
|
|
17
|
+
class CompilerHost extends async_event_emitter_1.default {
|
|
18
|
+
constructor() {
|
|
19
|
+
super();
|
|
20
|
+
this.runtime = Promise.resolve(void 0);
|
|
21
|
+
}
|
|
22
|
+
_setupRoutes(proxy) {
|
|
23
|
+
proxy.register([
|
|
24
|
+
this.executeAction,
|
|
25
|
+
this.executeCommand,
|
|
26
|
+
this.ready,
|
|
27
|
+
this.onRequestHookEvent,
|
|
28
|
+
this.setMock,
|
|
29
|
+
this.setConfigureResponseEventOptions,
|
|
30
|
+
this.setHeaderOnConfigureResponseEvent,
|
|
31
|
+
this.removeHeaderOnConfigureResponseEvent,
|
|
32
|
+
this.executeRequestFilterRulePredicate,
|
|
33
|
+
this.executeMockPredicate,
|
|
34
|
+
this.getWarningMessages,
|
|
35
|
+
this.addRequestEventListeners,
|
|
36
|
+
this.removeRequestEventListeners,
|
|
37
|
+
this.initializeTestRunData
|
|
38
|
+
], this);
|
|
39
|
+
}
|
|
40
|
+
async _init(runtime) {
|
|
41
|
+
const resolvedRuntime = await runtime;
|
|
42
|
+
if (resolvedRuntime)
|
|
43
|
+
return resolvedRuntime;
|
|
44
|
+
try {
|
|
45
|
+
const service = child_process_1.spawn(process.argv0, [SERVICE_PATH], { stdio: [0, 1, 2, 'pipe', 'pipe', 'pipe'] });
|
|
46
|
+
// HACK: Node.js definition are not correct when additional I/O channels are sp
|
|
47
|
+
const stdio = service.stdio;
|
|
48
|
+
const proxy = new proxy_1.IPCProxy(new transport_1.HostTransport(stdio[io_1.HOST_INPUT_FD], stdio[io_1.HOST_OUTPUT_FD], stdio[io_1.HOST_SYNC_FD]));
|
|
49
|
+
this._setupRoutes(proxy);
|
|
50
|
+
await this.once('ready');
|
|
51
|
+
return { proxy, service };
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
return void 0;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async _getRuntime() {
|
|
58
|
+
const runtime = await this.runtime;
|
|
59
|
+
if (!runtime)
|
|
60
|
+
throw new Error('Runtime is not available.');
|
|
61
|
+
return runtime;
|
|
62
|
+
}
|
|
63
|
+
_prepareEventData(eventData) {
|
|
64
|
+
// TODO: Remove eventData._requestContext into 'testcafe-hammerhead' module
|
|
65
|
+
// after switching to the compiler service mode.
|
|
66
|
+
// NOTE: Access to the deprecated property inside of the unserializable 'eventData._requestContext' property
|
|
67
|
+
// causes the node's deprecation warning.
|
|
68
|
+
const clonedEventData = Object.assign({}, eventData);
|
|
69
|
+
// @ts-ignore
|
|
70
|
+
delete clonedEventData._requestContext;
|
|
71
|
+
return clonedEventData;
|
|
72
|
+
}
|
|
73
|
+
async init() {
|
|
74
|
+
this.runtime = this._init(this.runtime);
|
|
75
|
+
await this.runtime;
|
|
76
|
+
}
|
|
77
|
+
async stop() {
|
|
78
|
+
const { service } = await this._getRuntime();
|
|
79
|
+
service.kill();
|
|
80
|
+
}
|
|
81
|
+
_wrapTestFunction(id, functionName) {
|
|
82
|
+
return async (testRun) => {
|
|
83
|
+
try {
|
|
84
|
+
return await this.runTestFn({ id, functionName, testRunId: testRun.id });
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
const errList = new error_list_1.default();
|
|
88
|
+
errList.addError(err);
|
|
89
|
+
throw errList;
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
_wrapRequestFilterRulePredicate({ testId, hookId, ruleId }) {
|
|
94
|
+
return async (requestInfo) => {
|
|
95
|
+
return await this.executeRequestFilterRulePredicate({ testId, hookId, ruleId, requestInfo });
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
_wrapMockPredicate({ mock, testId, hookId, ruleId }) {
|
|
99
|
+
mock.body = async (requestInfo, res) => {
|
|
100
|
+
return await this.executeMockPredicate({ testId, hookId, ruleId, requestInfo, res });
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
async ready() {
|
|
104
|
+
this.emit('ready');
|
|
105
|
+
}
|
|
106
|
+
async executeAction(data) {
|
|
107
|
+
const targetTestRun = test_run_tracker_1.default.activeTestRuns[data.id];
|
|
108
|
+
if (!targetTestRun)
|
|
109
|
+
return void 0;
|
|
110
|
+
return targetTestRun.executeAction(data.apiMethodName, data.command, data.callsite);
|
|
111
|
+
}
|
|
112
|
+
executeActionSync() {
|
|
113
|
+
throw new Error('The method should not be called.');
|
|
114
|
+
}
|
|
115
|
+
async executeCommand({ command, id }) {
|
|
116
|
+
const targetTestRun = test_run_tracker_1.default.activeTestRuns[id];
|
|
117
|
+
if (!targetTestRun)
|
|
118
|
+
return void 0;
|
|
119
|
+
return targetTestRun.executeCommand(command);
|
|
120
|
+
}
|
|
121
|
+
async getTests({ sourceList, compilerOptions }) {
|
|
122
|
+
const { proxy } = await this._getRuntime();
|
|
123
|
+
const units = await proxy.call(this.getTests, { sourceList, compilerOptions });
|
|
124
|
+
return test_structure_1.restore(units, (...args) => this._wrapTestFunction(...args), (ruleLocator) => this._wrapRequestFilterRulePredicate(ruleLocator));
|
|
125
|
+
}
|
|
126
|
+
async runTestFn({ id, functionName, testRunId }) {
|
|
127
|
+
const { proxy } = await this._getRuntime();
|
|
128
|
+
return await proxy.call(this.runTestFn, { id, functionName, testRunId });
|
|
129
|
+
}
|
|
130
|
+
async cleanUp() {
|
|
131
|
+
const { proxy } = await this._getRuntime();
|
|
132
|
+
await proxy.call(this.cleanUp);
|
|
133
|
+
}
|
|
134
|
+
async setOptions({ value }) {
|
|
135
|
+
const { proxy } = await this._getRuntime();
|
|
136
|
+
const preparedOptions = prepare_options_1.default(value);
|
|
137
|
+
await proxy.call(this.setOptions, { value: preparedOptions });
|
|
138
|
+
}
|
|
139
|
+
async onRequestHookEvent({ name, testId, hookId, eventData }) {
|
|
140
|
+
const { proxy } = await this._getRuntime();
|
|
141
|
+
await proxy.call(this.onRequestHookEvent, {
|
|
142
|
+
name,
|
|
143
|
+
testId,
|
|
144
|
+
hookId,
|
|
145
|
+
eventData: this._prepareEventData(eventData)
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
async setMock({ testId, hookId, ruleId, responseEventId, mock }) {
|
|
149
|
+
const mockDefinedWithPredicate = mock.isPredicate;
|
|
150
|
+
mock = testcafe_hammerhead_1.ResponseMock.from(mock);
|
|
151
|
+
if (mockDefinedWithPredicate)
|
|
152
|
+
this._wrapMockPredicate({ mock, testId, hookId, ruleId });
|
|
153
|
+
await this.emit('setMock', [responseEventId, mock]);
|
|
154
|
+
}
|
|
155
|
+
async setConfigureResponseEventOptions({ eventId, opts }) {
|
|
156
|
+
await this.emit('setConfigureResponseEventOptions', [eventId, opts]);
|
|
157
|
+
}
|
|
158
|
+
async setHeaderOnConfigureResponseEvent({ eventId, headerName, headerValue }) {
|
|
159
|
+
await this.emit('setHeaderOnConfigureResponseEvent', [eventId, headerName, headerValue]);
|
|
160
|
+
}
|
|
161
|
+
async removeHeaderOnConfigureResponseEvent({ eventId, headerName }) {
|
|
162
|
+
await this.emit('removeHeaderOnConfigureResponseEvent', [eventId, headerName]);
|
|
163
|
+
}
|
|
164
|
+
async executeRequestFilterRulePredicate({ testId, hookId, ruleId, requestInfo }) {
|
|
165
|
+
const { proxy } = await this._getRuntime();
|
|
166
|
+
return await proxy.call(this.executeRequestFilterRulePredicate, { testId, hookId, ruleId, requestInfo });
|
|
167
|
+
}
|
|
168
|
+
async executeMockPredicate({ testId, hookId, ruleId, requestInfo, res }) {
|
|
169
|
+
const { proxy } = await this._getRuntime();
|
|
170
|
+
return await proxy.call(this.executeMockPredicate, { testId, hookId, ruleId, requestInfo, res });
|
|
171
|
+
}
|
|
172
|
+
async getWarningMessages({ testRunId }) {
|
|
173
|
+
const { proxy } = await this._getRuntime();
|
|
174
|
+
return proxy.call(this.getWarningMessages, { testRunId });
|
|
175
|
+
}
|
|
176
|
+
async addRequestEventListeners({ hookId, hookClassName, rules }) {
|
|
177
|
+
rules = testcafe_hammerhead_1.RequestFilterRule.fromArray(rules);
|
|
178
|
+
await this.emit('addRequestEventListeners', { hookId, hookClassName, rules });
|
|
179
|
+
}
|
|
180
|
+
async removeRequestEventListeners({ rules }) {
|
|
181
|
+
rules = testcafe_hammerhead_1.RequestFilterRule.fromArray(rules);
|
|
182
|
+
await this.emit('removeRequestEventListeners', { rules });
|
|
183
|
+
}
|
|
184
|
+
async initializeTestRunData({ testRunId, testId }) {
|
|
185
|
+
const { proxy } = await this._getRuntime();
|
|
186
|
+
return proxy.call(this.initializeTestRunData, { testRunId, testId });
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
exports.default = CompilerHost;
|
|
190
190
|
module.exports = exports.default;
|
|
191
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9zdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9jb21waWxlci9ob3N0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsaURBQW9EO0FBQ3BELDZCQUljO0FBRWQsb0VBQWtGO0FBQ2xGLHVGQUE4RDtBQUM5RCxrRkFBZ0Y7QUFDaEYsOENBQThDO0FBQzlDLHNEQUF1RDtBQUN2RCwwRkFBZ0U7QUFDaEUseUVBQXdEO0FBeUJ4RCw2REFRNkI7QUFFN0IsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQW1CbEQsTUFBcUIsWUFBYSxTQUFRLDZCQUFpQjtJQUd2RDtRQUNJLEtBQUssRUFBRSxDQUFDO1FBRVIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVPLFlBQVksQ0FBRSxLQUFlO1FBQ2pDLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDWCxJQUFJLENBQUMsYUFBYTtZQUNsQixJQUFJLENBQUMsY0FBYztZQUNuQixJQUFJLENBQUMsS0FBSztZQUNWLElBQUksQ0FBQyxrQkFBa0I7WUFDdkIsSUFBSSxDQUFDLE9BQU87WUFDWixJQUFJLENBQUMsZ0NBQWdDO1lBQ3JDLElBQUksQ0FBQyxpQ0FBaUM7WUFDdEMsSUFBSSxDQUFDLG9DQUFvQztZQUN6QyxJQUFJLENBQUMsaUNBQWlDO1lBQ3RDLElBQUksQ0FBQyxvQkFBb0I7WUFDekIsSUFBSSxDQUFDLGtCQUFrQjtZQUN2QixJQUFJLENBQUMsd0JBQXdCO1lBQzdCLElBQUksQ0FBQywyQkFBMkI7WUFDaEMsSUFBSSxDQUFDLHNCQUFzQjtTQUM5QixFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUVPLEtBQUssQ0FBQyxLQUFLLENBQUUsT0FBNEM7UUFDN0QsTUFBTSxlQUFlLEdBQUcsTUFBTSxPQUFPLENB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LEVBQUUsQ0FBQztRQUUzQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRU0sS0FBSyxDQUFDLHdCQUF3QixDQUFHLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQXFDO1FBQ3ZHLEtBQUssR0FBRyx1Q0FBaUIsQ0FBQyxTQUFTLENBQUMsS0FBaUIsQ0FBQyxDQUFDO1FBRXZELE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRU0sS0FBSyxDQUFDLDJCQUEyQixDQUFFLEVBQUUsS0FBSyxFQUF3QztRQUNyRixLQUFLLEdBQUcsdUNBQWlCLENBQUMsU0FBUyxDQUFDLEtBQWlCLENBQUMsQ0FBQztRQUV2RCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFTSxLQUFLLENBQUMsc0JBQXNCLENBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFtQztRQUN2RixNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFM0MsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLENBQUM7Q0FDSjtBQWxQRCwrQkFrUEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3biwgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge1xuICAgIEhPU1RfSU5QVVRfRkQsXG4gICAgSE9TVF9PVVRQVVRfRkQsXG4gICAgSE9TVF9TWU5DX0ZEXG59IGZyb20gJy4vaW8nO1xuXG5pbXBvcnQgeyByZXN0b3JlIGFzIHJlc3RvcmVUZXN0U3RydWN0dXJlIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi90ZXN0LXN0cnVjdHVyZSc7XG5pbXBvcnQgcHJlcGFyZU9wdGlvbnMgZnJvbSAnLi4vc2VyaWFsaXphdGlvbi9wcmVwYXJlLW9wdGlvbnMnO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyB0ZXN0UnVuVHJhY2tlciwgVGVzdFJ1biB9IGZyb20gJy4uLy4uL2FwaS90ZXN0LXJ1bi10cmFja2VyJztcbmltcG9ydCB7IElQQ1Byb3h5IH0gZnJvbSAnLi4vdXRpbHMvaXBjL3Byb3h5JztcbmltcG9ydCB7IEhvc3RUcmFuc3BvcnQgfSBmcm9tICcuLi91dGlscy9pcGMvdHJhbnNwb3J0JztcbmltcG9ydCBBc3luY0V2ZW50RW1pdHRlciBmcm9tICcuLi8uLi91dGlscy9hc3luYy1ldmVudC1lbWl0dGVyJztcbmltcG9ydCBUZXN0Q2FmZUVycm9yTGlzdCBmcm9tICcuLi8uLi9lcnJvcnMvZXJyb3ItbGlzdCc7XG5cbmltcG9ydCB7XG4gICAgQ29tcGlsZXJQcm90b2NvbCxcbiAgICBSdW5UZXN0QXJndW1lbnRzLFxuICAgIEV4ZWN1dGVBY3Rpb25Bcmd1bWVudHMsXG4gICAgRnVuY3Rpb25Qcm9wZXJ0aWVzLFxuICAgIFNldE9wdGlvbnNBcmd1bWVudHMsXG4gICAgRXhlY3V0ZUNvbW1hbmRBcmd1bWVudHMsXG4gICAgUmVxdWVzdEhvb2tFdmVudEFyZ3VtZW50cyxcbiAgICBTZXRNb2NrQXJndW1lbnRzLFxuICAgIFNldENvbmZpZ3VyZVJlc3BvbnNlRXZlbnRPcHRpb25zQXJndW1lbnRzLFxuICAgIFNldEhlYWRlck9uQ29uZmlndXJlUmVzcG9uc2VFdmVudEFyZ3VtZW50cyxcbiAgICBSZW1vdmVIZWFkZXJPbkNvbmZpZ3VyZVJlc3BvbnNlRXZlbnRBcmd1bWVudHMsXG4gICAgRXhlY3V0ZVJlcXVlc3RGaWx0ZXJSdWxlUHJlZGljYXRlQXJndW1lbnRzLFxuICAgIFJlcXVlc3RGaWx0ZXJSdWxlTG9jYXRvcixcbiAgICBFeGVjdXRlTW9ja1ByZWRpY2F0ZSxcbiAgICBHZXRXYXJuaW5nTWVzc2FnZXNBcmd1bWVudHMsXG4gICAgQWRkUmVxdWVzdEV2ZW50TGlzdGVuZXJzQXJndW1lbnRzLFxuICAgIFJlbW92ZVJlcXVlc3RFdmVudExpc3RlbmVyc0FyZ3VtZW50cyxcbiAgICBJbml0aWFsaXplVGVzdFJ1blByb3h5QXJndW1lbnRzXG59IGZyb20gJy4vcHJvdG9jb2wnO1xuXG5pbXBvcnQgeyBDb21waWxlckFyZ3VtZW50cyB9IGZyb20gJy4uLy4uL2NvbXBpbGVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IFRlc3QgZnJvbSAnLi4vLi4vYXBpL3N0cnVjdHVyZS90ZXN0JztcbmltcG9ydCB7XG4gICAgUmVxdWVzdEluZm8sXG4gICAgUmVzcG9uc2VNb2NrLFxuICAgIEluY29taW5nTWVzc2FnZUxpa2VJbml0T3B0aW9ucyxcbiAgICBSZXF1ZXN0RXZlbnQsXG4gICAgQ29uZmlndXJlUmVzcG9uc2VFdmVudCxcbiAgICBSZXNwb25zZUV2ZW50LFxuICAgIFJlcXVlc3RGaWx0ZXJSdWxlXG59IGZyb20gJ3Rlc3RjYWZlLWhhbW1lcmhlYWQnO1xuXG5jb25zdCBTRVJWSUNFX1BBVEggPSByZXF1aXJlLnJlc29sdmUoJy4vc2VydmljZScpO1xuXG5pbnRlcmZhY2UgUnVudGltZVJlc291cmNlcyB7XG4gICAgc2VydmljZTogQ2hpbGRQcm9jZXNzO1xuICAgIHByb3h5OiBJUENQcm94eTtcbn1cblxuaW50ZXJmYWNlIFRlc3RGdW5jdGlvbiB7XG4gICAgKHRlc3RSdW46IFRlc3RSdW4pOiBQcm9taXNlPHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgUmVxdWVzdEZpbHRlclJ1bGVQcmVkaWNhdGUge1xuICAgIChyZXF1ZXN0SW5mbzogUmVxdWVzdEluZm8pOiBQcm9taXNlPGJvb2xlYW4+O1xufVxuXG5pbnRlcmZhY2UgV3JhcE1vY2tQcmVkaWNhdGVBcmd1bWVudHMgZXh0ZW5kcyBSZXF1ZXN0RmlsdGVyUnVsZUxvY2F0b3Ige1xuICAgIG1vY2s6IFJlc3BvbnNlTW9jaztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29tcGlsZXJIb3N0IGV4dGVuZHMgQXN5bmNFdmVudEVtaXR0ZXIgaW1wbGVtZW50cyBDb21waWxlclByb3RvY29sIHtcbiAgICBwcml2YXRlIHJ1bnRpbWU6IFByb21pc2U8UnVudGltZVJlc291cmNlc3x1bmRlZmluZWQ+O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLnJ1bnRpbWUgPSBQcm9taXNlLnJlc29sdmUodm9pZCAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXR1cFJvdXRlcyAocHJveHk6IElQQ1Byb3h5KTogdm9pZCB7XG4gICAgICAgIHByb3h5LnJlZ2lzdGVyKFtcbiAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUFjdGlvbixcbiAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUNvbW1hbmQsXG4gICAgICAgICAgICB0aGlzLnJlYWR5LFxuICAgICAgICAgICAgdGhpcy5vblJlcXVlc3RIb29rRXZlbnQsXG4gICAgICAgICAgICB0aGlzLnNldE1vY2ssXG4gICAgICAgICAgICB0aGlzLnNldENvbmZpZ3VyZVJlc3BvbnNlRXZlbnRPcHRpb25zLFxuICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJPbkNvbmZpZ3VyZVJlc3BvbnNlRXZlbnQsXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUhlYWRlck9uQ29uZmlndXJlUmVzcG9uc2VFdmVudCxcbiAgICAgICAgICAgIHRoaXMuZXhlY3V0ZVJlcXVlc3RGaWx0ZXJSdWxlUHJlZGljYXRlLFxuICAgICAgICAgICAgdGhpcy5leGVjdXRlTW9ja1ByZWRpY2F0ZSxcbiAgICAgICAgICAgIHRoaXMuZ2V0V2FybmluZ01lc3NhZ2VzLFxuICAgICAgICAgICAgdGhpcy5hZGRSZXF1ZXN0RXZlbnRMaXN0ZW5lcnMsXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVJlcXVlc3RFdmVudExpc3RlbmVycyxcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVRlc3RSdW5Qcm94eVxuICAgICAgICBdLCB0aGlzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9pbml0IChydW50aW1lOiBQcm9taXNlPFJ1bnRpbWVSZXNvdXJjZXN8dW5kZWZpbmVkPik6IFByb21pc2U8UnVudGltZVJlc291cmNlc3x1bmRlZmluZWQ+IHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRSdW50aW1lID0gYXdhaXQgcnVudGltZTtcblxuICAgICAgICBpZiAocmVzb2x2ZWRSdW50aW1lKVxuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkUnVudGltZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc2VydmljZSA9IHNwYXduKHByb2Nlc3MuYXJndjAsIFtTRVJWSUNFX1BBVEhdLCB7IHN0ZGlvOiBbMCwgMSwgMiwgJ3BpcGUnLCAncGlwZScsICdwaXBlJ10gfSk7XG5cbiAgICAgICAgICAgIC8vIEhBQ0s6IE5vZGUuanMgZGVmaW5pdGlvbiBhcmUgbm90IGNvcnJlY3Qgd2hlbiBhZGRpdGlvbmFsIEkvTyBjaGFubmVscyBhcmUgc3BcbiAgICAgICAgICAgIGNvbnN0IHN0ZGlvID0gc2VydmljZS5zdGRpbyBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBwcm94eSA9IG5ldyBJUENQcm94eShuZXcgSG9zdFRyYW5zcG9ydChzdGRpb1tIT1NUX0lOUFVUX0ZEXSwgc3RkaW9bSE9TVF9PVVRQVVRfRkRdLCBzdGRpb1tIT1NUX1NZTkNfRkRdKSk7XG5cbiAgICAgICAgICAgIHRoaXMuX3NldHVwUm91dGVzKHByb3h5KTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5vbmNlKCdyZWFkeScpO1xuXG4gICAgICAgICAgICByZXR1cm4geyBwcm94eSwgc2VydmljZSB9O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0UnVudGltZSAoKTogUHJvbWlzZTxSdW50aW1lUmVzb3VyY2VzPiB7XG4gICAgICAgIGNvbnN0IHJ1bnRpbWUgPSBhd2FpdCB0aGlzLnJ1bnRpbWU7XG5cbiAgICAgICAgaWYgKCFydW50aW1lKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSdW50aW1lIGlzIG5vdCBhdmFpbGFibGUuJyk7XG5cbiAgICAgICAgcmV0dXJuIHJ1bnRpbWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcHJlcGFyZUV2ZW50RGF0YSAoZXZlbnREYXRhOiBSZXF1ZXN0RXZlbnQgfCBDb25maWd1cmVSZXNwb25zZUV2ZW50IHwgUmVzcG9uc2VFdmVudCk6IFJlcXVlc3RFdmVudCB8IENvbmZpZ3VyZVJlc3BvbnNlRXZlbnQgfCBSZXNwb25zZUV2ZW50IHtcbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIGV2ZW50RGF0YS5fcmVxdWVzdENvbnRleHQgaW50byAndGVzdGNhZmUtaGFtbWVyaGVhZCcgbW9kdWxlXG4gICAgICAgIC8vIGFmdGVyIHN3aXRjaGluZyB0byB0aGUgY29tcGlsZXIgc2VydmljZSBtb2RlLlxuXG4gICAgICAgIC8vIE5PVEU6IEFjY2VzcyB0byB0aGUgZGVwcmVjYXRlZCBwcm9wZXJ0eSBpbnNpZGUgb2YgdGhlIHVuc2VyaWFsaXphYmxlICdldmVudERhdGEuX3JlcXVlc3RDb250ZXh0JyBwcm9wZXJ0eVxuICAgICAgICAvLyBjYXVzZXMgdGhlIG5vZGUncyBkZXByZWNhdGlvbiB3YXJuaW5nLlxuXG4gICAgICAgIGNvbnN0IGNsb25lZEV2ZW50RGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGV2ZW50RGF0YSk7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBkZWxldGUgY2xvbmVkRXZlbnREYXRhLl9yZXF1ZXN0Q29udGV4dDtcblxuICAgICAgICByZXR1cm4gY2xvbmVkRXZlbnREYXRhO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBpbml0ICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5ydW50aW1lID0gdGhpcy5faW5pdCh0aGlzLnJ1bnRpbWUpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMucnVudGltZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc3RvcCAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgc2VydmljZSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIHNlcnZpY2Uua2lsbCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3dyYXBUZXN0RnVuY3Rpb24gKGlkOiBzdHJpbmcsIGZ1bmN0aW9uTmFtZTogRnVuY3Rpb25Qcm9wZXJ0aWVzKTogVGVzdEZ1bmN0aW9uIHtcbiAgICAgICAgcmV0dXJuIGFzeW5jIHRlc3RSdW4gPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW5UZXN0KHsgaWQsIGZ1bmN0aW9uTmFtZSwgdGVzdFJ1bklkOiB0ZXN0UnVuLmlkIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVyckxpc3QgPSBuZXcgVGVzdENhZmVFcnJvckxpc3QoKTtcblxuICAgICAgICAgICAgICAgIGVyckxpc3QuYWRkRXJyb3IoZXJyKTtcblxuICAgICAgICAgICAgICAgIHRocm93IGVyckxpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfd3JhcFJlcXVlc3RGaWx0ZXJSdWxlUHJlZGljYXRlICh7IHRlc3RJZCwgaG9va0lkLCBydWxlSWQgfTogUmVxdWVzdEZpbHRlclJ1bGVMb2NhdG9yKTogUmVxdWVzdEZpbHRlclJ1bGVQcmVkaWNhdGUge1xuICAgICAgICByZXR1cm4gYXN5bmMgKHJlcXVlc3RJbmZvOiBSZXF1ZXN0SW5mbykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZVJlcXVlc3RGaWx0ZXJSdWxlUHJlZGljYXRlKHsgdGVzdElkLCBob29rSWQsIHJ1bGVJZCwgcmVxdWVzdEluZm8gfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfd3JhcE1vY2tQcmVkaWNhdGUgKHsgbW9jaywgdGVzdElkLCBob29rSWQsIHJ1bGVJZCB9OiBXcmFwTW9ja1ByZWRpY2F0ZUFyZ3VtZW50cyk6IHZvaWQge1xuICAgICAgICBtb2NrLmJvZHkgPSBhc3luYyAocmVxdWVzdEluZm86IFJlcXVlc3RJbmZvLCByZXM6IEluY29taW5nTWVzc2FnZUxpa2VJbml0T3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZU1vY2tQcmVkaWNhdGUoeyB0ZXN0SWQsIGhvb2tJZCwgcnVsZUlkLCByZXF1ZXN0SW5mbywgcmVzIH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWFkeSAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuZW1pdCgncmVhZHknKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZXhlY3V0ZUFjdGlvbiAoZGF0YTogRXhlY3V0ZUFjdGlvbkFyZ3VtZW50cyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBjb25zdCB0YXJnZXRUZXN0UnVuID0gdGVzdFJ1blRyYWNrZXIuYWN0aXZlVGVzdFJ1bnNbZGF0YS5pZF07XG5cbiAgICAgICAgaWYgKCF0YXJnZXRUZXN0UnVuKVxuICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcblxuICAgICAgICByZXR1cm4gdGFyZ2V0VGVzdFJ1bi5leGVjdXRlQWN0aW9uKGRhdGEuYXBpTWV0aG9kTmFtZSwgZGF0YS5jb21tYW5kLCBkYXRhLmNhbGxzaXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhlY3V0ZUFjdGlvblN5bmMgKCk6IG5ldmVyIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkLicpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlQ29tbWFuZCAoeyBjb21tYW5kLCBpZCB9OiBFeGVjdXRlQ29tbWFuZEFyZ3VtZW50cyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBjb25zdCB0YXJnZXRUZXN0UnVuID0gdGVzdFJ1blRyYWNrZXIuYWN0aXZlVGVzdFJ1bnNbaWRdO1xuXG4gICAgICAgIGlmICghdGFyZ2V0VGVzdFJ1bilcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldFRlc3RSdW4uZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFRlc3RzICh7IHNvdXJjZUxpc3QsIGNvbXBpbGVyT3B0aW9ucyB9OiBDb21waWxlckFyZ3VtZW50cyk6IFByb21pc2U8VGVzdFtdPiB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IGF3YWl0IHRoaXMuX2dldFJ1bnRpbWUoKTtcblxuICAgICAgICBjb25zdCB1bml0cyA9IGF3YWl0IHByb3h5LmNhbGwodGhpcy5nZXRUZXN0cywgeyBzb3VyY2VMaXN0LCBjb21waWxlck9wdGlvbnMgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3RvcmVUZXN0U3RydWN0dXJlKFxuICAgICAgICAgICAgdW5pdHMsXG4gICAgICAgICAgICAoLi4uYXJncykgPT4gdGhpcy5fd3JhcFRlc3RGdW5jdGlvbiguLi5hcmdzKSxcbiAgICAgICAgICAgIChydWxlTG9jYXRvcjogUmVxdWVzdEZpbHRlclJ1bGVMb2NhdG9yKSA9PiB0aGlzLl93cmFwUmVxdWVzdEZpbHRlclJ1bGVQcmVkaWNhdGUocnVsZUxvY2F0b3IpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJ1blRlc3QgKHsgaWQsIGZ1bmN0aW9uTmFtZSwgdGVzdFJ1bklkIH06IFJ1blRlc3RBcmd1bWVudHMpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIHJldHVybiBhd2FpdCBwcm94eS5jYWxsKHRoaXMucnVuVGVzdCwgeyBpZCwgZnVuY3Rpb25OYW1lLCB0ZXN0UnVuSWQgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNsZWFuVXAgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB7IHByb3h5IH0gPSBhd2FpdCB0aGlzLl9nZXRSdW50aW1lKCk7XG5cbiAgICAgICAgYXdhaXQgcHJveHkuY2FsbCh0aGlzLmNsZWFuVXApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRPcHRpb25zICh7IHZhbHVlIH06IFNldE9wdGlvbnNBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIGNvbnN0IHByZXBhcmVkT3B0aW9ucyA9IHByZXBhcmVPcHRpb25zKHZhbHVlKTtcblxuICAgICAgICBhd2FpdCBwcm94eS5jYWxsKHRoaXMuc2V0T3B0aW9ucywgeyB2YWx1ZTogcHJlcGFyZWRPcHRpb25zIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBvblJlcXVlc3RIb29rRXZlbnQgKHsgbmFtZSwgdGVzdElkLCBob29rSWQsIGV2ZW50RGF0YSB9OiBSZXF1ZXN0SG9va0V2ZW50QXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IGF3YWl0IHRoaXMuX2dldFJ1bnRpbWUoKTtcblxuICAgICAgICBhd2FpdCBwcm94eS5jYWxsKHRoaXMub25SZXF1ZXN0SG9va0V2ZW50LCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgdGVzdElkLFxuICAgICAgICAgICAgaG9va0lkLFxuICAgICAgICAgICAgZXZlbnREYXRhOiB0aGlzLl9wcmVwYXJlRXZlbnREYXRhKGV2ZW50RGF0YSlcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldE1vY2sgKHsgdGVzdElkLCBob29rSWQsIHJ1bGVJZCwgcmVzcG9uc2VFdmVudElkLCBtb2NrIH06IFNldE1vY2tBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgbW9ja0RlZmluZWRXaXRoUHJlZGljYXRlID0gbW9jay5pc1ByZWRpY2F0ZTtcblxuICAgICAgICBtb2NrID0gUmVzcG9uc2VNb2NrLmZyb20obW9jayk7XG5cbiAgICAgICAgaWYgKG1vY2tEZWZpbmVkV2l0aFByZWRpY2F0ZSlcbiAgICAgICAgICAgIHRoaXMuX3dyYXBNb2NrUHJlZGljYXRlKHsgbW9jaywgdGVzdElkLCBob29rSWQsIHJ1bGVJZCB9KTtcblxuICAgICAgICBhd2FpdCB0aGlzLmVtaXQoJ3NldE1vY2snLCBbcmVzcG9uc2VFdmVudElkLCBtb2NrXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldENvbmZpZ3VyZVJlc3BvbnNlRXZlbnRPcHRpb25zICh7IGV2ZW50SWQsIG9wdHMgfTogU2V0Q29uZmlndXJlUmVzcG9uc2VFdmVudE9wdGlvbnNBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCdzZXRDb25maWd1cmVSZXNwb25zZUV2ZW50T3B0aW9ucycsIFtldmVudElkLCBvcHRzXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldEhlYWRlck9uQ29uZmlndXJlUmVzcG9uc2VFdmVudCAoeyBldmVudElkLCBoZWFkZXJOYW1lLCBoZWFkZXJWYWx1ZSB9OiBTZXRIZWFkZXJPbkNvbmZpZ3VyZVJlc3BvbnNlRXZlbnRBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCdzZXRIZWFkZXJPbkNvbmZpZ3VyZVJlc3BvbnNlRXZlbnQnLCBbZXZlbnRJZCwgaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWVdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVtb3ZlSGVhZGVyT25Db25maWd1cmVSZXNwb25zZUV2ZW50ICh7IGV2ZW50SWQsIGhlYWRlck5hbWUgfTogUmVtb3ZlSGVhZGVyT25Db25maWd1cmVSZXNwb25zZUV2ZW50QXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgncmVtb3ZlSGVhZGVyT25Db25maWd1cmVSZXNwb25zZUV2ZW50JywgW2V2ZW50SWQsIGhlYWRlck5hbWVdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZXhlY3V0ZVJlcXVlc3RGaWx0ZXJSdWxlUHJlZGljYXRlICh7IHRlc3RJZCwgaG9va0lkLCBydWxlSWQsIHJlcXVlc3RJbmZvIH06IEV4ZWN1dGVSZXF1ZXN0RmlsdGVyUnVsZVByZWRpY2F0ZUFyZ3VtZW50cyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCB7IHByb3h5IH0gPSBhd2FpdCB0aGlzLl9nZXRSdW50aW1lKCk7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHByb3h5LmNhbGwodGhpcy5leGVjdXRlUmVxdWVzdEZpbHRlclJ1bGVQcmVkaWNhdGUsIHsgdGVzdElkLCBob29rSWQsIHJ1bGVJZCwgcmVxdWVzdEluZm8gfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGV4ZWN1dGVNb2NrUHJlZGljYXRlICh7IHRlc3RJZCwgaG9va0lkLCBydWxlSWQsIHJlcXVlc3RJbmZvLCByZXMgfTogRXhlY3V0ZU1vY2tQcmVkaWNhdGUpOiBQcm9taXNlPEluY29taW5nTWVzc2FnZUxpa2VJbml0T3B0aW9ucz4ge1xuICAgICAgICBjb25zdCB7IHByb3h5IH0gPSBhd2FpdCB0aGlzLl9nZXRSdW50aW1lKCk7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHByb3h5LmNhbGwodGhpcy5leGVjdXRlTW9ja1ByZWRpY2F0ZSwgeyB0ZXN0SWQsIGhvb2tJZCwgcnVsZUlkLCByZXF1ZXN0SW5mbywgcmVzIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRXYXJuaW5nTWVzc2FnZXMgKHsgdGVzdFJ1bklkIH06IEdldFdhcm5pbmdNZXNzYWdlc0FyZ3VtZW50cyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIHJldHVybiBwcm94eS5jYWxsKHRoaXMuZ2V0V2FybmluZ01lc3NhZ2VzLCB7IHRlc3RSdW5JZCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYWRkUmVxdWVzdEV2ZW50TGlzdGVuZXJzICggeyBob29rSWQsIGhvb2tDbGFzc05hbWUsIHJ1bGVzIH06IEFkZFJlcXVlc3RFdmVudExpc3RlbmVyc0FyZ3VtZW50cyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBydWxlcyA9IFJlcXVlc3RGaWx0ZXJSdWxlLmZyb21BcnJheShydWxlcyBhcyBvYmplY3RbXSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCdhZGRSZXF1ZXN0RXZlbnRMaXN0ZW5lcnMnLCB7IGhvb2tJZCwgaG9va0NsYXNzTmFtZSwgcnVsZXMgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlbW92ZVJlcXVlc3RFdmVudExpc3RlbmVycyAoeyBydWxlcyB9OiBSZW1vdmVSZXF1ZXN0RXZlbnRMaXN0ZW5lcnNBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcnVsZXMgPSBSZXF1ZXN0RmlsdGVyUnVsZS5mcm9tQXJyYXkocnVsZXMgYXMgb2JqZWN0W10pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgncmVtb3ZlUmVxdWVzdEV2ZW50TGlzdGVuZXJzJywgeyBydWxlcyB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaW5pdGlhbGl6ZVRlc3RSdW5Qcm94eSAoeyB0ZXN0UnVuSWQsIHRlc3RJZCB9OiBJbml0aWFsaXplVGVzdFJ1blByb3h5QXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IGF3YWl0IHRoaXMuX2dldFJ1bnRpbWUoKTtcblxuICAgICAgICByZXR1cm4gcHJveHkuY2FsbCh0aGlzLmluaXRpYWxpemVUZXN0UnVuUHJveHksIHsgdGVzdFJ1bklkLCB0ZXN0SWQgfSk7XG4gICAgfVxufVxuIl19
|
|
191
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9zdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9jb21waWxlci9ob3N0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsaURBQW9EO0FBQ3BELDZCQUljO0FBRWQsb0VBQWtGO0FBQ2xGLHVGQUE4RDtBQUM5RCxrRkFBZ0Y7QUFDaEYsOENBQThDO0FBQzlDLHNEQUF1RDtBQUN2RCwwRkFBZ0U7QUFDaEUseUVBQXdEO0FBeUJ4RCw2REFRNkI7QUFFN0IsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQW1CbEQsTUFBcUIsWUFBYSxTQUFRLDZCQUFpQjtJQUd2RDtRQUNJLEtBQUssRUFBRSxDQUFDO1FBRVIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVPLFlBQVksQ0FBRSxLQUFlO1FBQ2pDLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDWCxJQUFJLENBQUMsYUFBYTtZQUNsQixJQUFJLENBQUMsY0FBYztZQUNuQixJQUFJLENBQUMsS0FBSztZQUNWLElBQUksQ0FBQyxrQkFBa0I7WUFDdkIsSUFBSSxDQUFDLE9BQU87WUFDWixJQUFJLENBQUMsZ0NBQWdDO1lBQ3JDLElBQUksQ0FBQyxpQ0FBaUM7WUFDdEMsSUFBSSxDQUFDLG9DQUFvQztZQUN6QyxJQUFJLENBQUMsaUNBQWlDO1lBQ3RDLElBQUksQ0FBQyxvQkFBb0I7WUFDekIsSUFBSSxDQUFDLGtCQUFrQjtZQUN2QixJQUFJLENBQUMsd0JBQXdCO1lBQzdCLElBQUksQ0FBQywyQkFBMkI7WUFDaEMsSUFBSSxDQUFDLHFCQUFxQjtTQUM3QixFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUVPLEtBQUssQ0FBQyxLQUFLLENBQUUsT0FBNEM7UUFDN0QsTUFBTSxlQUFlLEdBQUcsTUFBTSxPQUFPLENB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LEVBQUUsQ0FBQztRQUUzQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRU0sS0FBSyxDQUFDLHdCQUF3QixDQUFHLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQXFDO1FBQ3ZHLEtBQUssR0FBRyx1Q0FBaUIsQ0FBQyxTQUFTLENBQUMsS0FBaUIsQ0FBQyxDQUFDO1FBRXZELE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRU0sS0FBSyxDQUFDLDJCQUEyQixDQUFFLEVBQUUsS0FBSyxFQUF3QztRQUNyRixLQUFLLEdBQUcsdUNBQWlCLENBQUMsU0FBUyxDQUFDLEtBQWlCLENBQUMsQ0FBQztRQUV2RCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFTSxLQUFLLENBQUMscUJBQXFCLENBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFrQztRQUNyRixNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFM0MsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7Q0FDSjtBQWxQRCwrQkFrUEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3biwgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge1xuICAgIEhPU1RfSU5QVVRfRkQsXG4gICAgSE9TVF9PVVRQVVRfRkQsXG4gICAgSE9TVF9TWU5DX0ZEXG59IGZyb20gJy4vaW8nO1xuXG5pbXBvcnQgeyByZXN0b3JlIGFzIHJlc3RvcmVUZXN0U3RydWN0dXJlIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi90ZXN0LXN0cnVjdHVyZSc7XG5pbXBvcnQgcHJlcGFyZU9wdGlvbnMgZnJvbSAnLi4vc2VyaWFsaXphdGlvbi9wcmVwYXJlLW9wdGlvbnMnO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyB0ZXN0UnVuVHJhY2tlciwgVGVzdFJ1biB9IGZyb20gJy4uLy4uL2FwaS90ZXN0LXJ1bi10cmFja2VyJztcbmltcG9ydCB7IElQQ1Byb3h5IH0gZnJvbSAnLi4vdXRpbHMvaXBjL3Byb3h5JztcbmltcG9ydCB7IEhvc3RUcmFuc3BvcnQgfSBmcm9tICcuLi91dGlscy9pcGMvdHJhbnNwb3J0JztcbmltcG9ydCBBc3luY0V2ZW50RW1pdHRlciBmcm9tICcuLi8uLi91dGlscy9hc3luYy1ldmVudC1lbWl0dGVyJztcbmltcG9ydCBUZXN0Q2FmZUVycm9yTGlzdCBmcm9tICcuLi8uLi9lcnJvcnMvZXJyb3ItbGlzdCc7XG5cbmltcG9ydCB7XG4gICAgQ29tcGlsZXJQcm90b2NvbCxcbiAgICBSdW5UZXN0QXJndW1lbnRzLFxuICAgIEV4ZWN1dGVBY3Rpb25Bcmd1bWVudHMsXG4gICAgRnVuY3Rpb25Qcm9wZXJ0aWVzLFxuICAgIFNldE9wdGlvbnNBcmd1bWVudHMsXG4gICAgRXhlY3V0ZUNvbW1hbmRBcmd1bWVudHMsXG4gICAgUmVxdWVzdEhvb2tFdmVudEFyZ3VtZW50cyxcbiAgICBTZXRNb2NrQXJndW1lbnRzLFxuICAgIFNldENvbmZpZ3VyZVJlc3BvbnNlRXZlbnRPcHRpb25zQXJndW1lbnRzLFxuICAgIFNldEhlYWRlck9uQ29uZmlndXJlUmVzcG9uc2VFdmVudEFyZ3VtZW50cyxcbiAgICBSZW1vdmVIZWFkZXJPbkNvbmZpZ3VyZVJlc3BvbnNlRXZlbnRBcmd1bWVudHMsXG4gICAgRXhlY3V0ZVJlcXVlc3RGaWx0ZXJSdWxlUHJlZGljYXRlQXJndW1lbnRzLFxuICAgIFJlcXVlc3RGaWx0ZXJSdWxlTG9jYXRvcixcbiAgICBFeGVjdXRlTW9ja1ByZWRpY2F0ZSxcbiAgICBHZXRXYXJuaW5nTWVzc2FnZXNBcmd1bWVudHMsXG4gICAgQWRkUmVxdWVzdEV2ZW50TGlzdGVuZXJzQXJndW1lbnRzLFxuICAgIFJlbW92ZVJlcXVlc3RFdmVudExpc3RlbmVyc0FyZ3VtZW50cyxcbiAgICBJbml0aWFsaXplVGVzdFJ1bkRhdGFBcmd1bWVudHNcbn0gZnJvbSAnLi9wcm90b2NvbCc7XG5cbmltcG9ydCB7IENvbXBpbGVyQXJndW1lbnRzIH0gZnJvbSAnLi4vLi4vY29tcGlsZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgVGVzdCBmcm9tICcuLi8uLi9hcGkvc3RydWN0dXJlL3Rlc3QnO1xuaW1wb3J0IHtcbiAgICBSZXF1ZXN0SW5mbyxcbiAgICBSZXNwb25zZU1vY2ssXG4gICAgSW5jb21pbmdNZXNzYWdlTGlrZUluaXRPcHRpb25zLFxuICAgIFJlcXVlc3RFdmVudCxcbiAgICBDb25maWd1cmVSZXNwb25zZUV2ZW50LFxuICAgIFJlc3BvbnNlRXZlbnQsXG4gICAgUmVxdWVzdEZpbHRlclJ1bGVcbn0gZnJvbSAndGVzdGNhZmUtaGFtbWVyaGVhZCc7XG5cbmNvbnN0IFNFUlZJQ0VfUEFUSCA9IHJlcXVpcmUucmVzb2x2ZSgnLi9zZXJ2aWNlJyk7XG5cbmludGVyZmFjZSBSdW50aW1lUmVzb3VyY2VzIHtcbiAgICBzZXJ2aWNlOiBDaGlsZFByb2Nlc3M7XG4gICAgcHJveHk6IElQQ1Byb3h5O1xufVxuXG5pbnRlcmZhY2UgVGVzdEZ1bmN0aW9uIHtcbiAgICAodGVzdFJ1bjogVGVzdFJ1bik6IFByb21pc2U8dW5rbm93bj47XG59XG5cbmludGVyZmFjZSBSZXF1ZXN0RmlsdGVyUnVsZVByZWRpY2F0ZSB7XG4gICAgKHJlcXVlc3RJbmZvOiBSZXF1ZXN0SW5mbyk6IFByb21pc2U8Ym9vbGVhbj47XG59XG5cbmludGVyZmFjZSBXcmFwTW9ja1ByZWRpY2F0ZUFyZ3VtZW50cyBleHRlbmRzIFJlcXVlc3RGaWx0ZXJSdWxlTG9jYXRvciB7XG4gICAgbW9jazogUmVzcG9uc2VNb2NrO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb21waWxlckhvc3QgZXh0ZW5kcyBBc3luY0V2ZW50RW1pdHRlciBpbXBsZW1lbnRzIENvbXBpbGVyUHJvdG9jb2wge1xuICAgIHByaXZhdGUgcnVudGltZTogUHJvbWlzZTxSdW50aW1lUmVzb3VyY2VzfHVuZGVmaW5lZD47XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMucnVudGltZSA9IFByb21pc2UucmVzb2x2ZSh2b2lkIDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldHVwUm91dGVzIChwcm94eTogSVBDUHJveHkpOiB2b2lkIHtcbiAgICAgICAgcHJveHkucmVnaXN0ZXIoW1xuICAgICAgICAgICAgdGhpcy5leGVjdXRlQWN0aW9uLFxuICAgICAgICAgICAgdGhpcy5leGVjdXRlQ29tbWFuZCxcbiAgICAgICAgICAgIHRoaXMucmVhZHksXG4gICAgICAgICAgICB0aGlzLm9uUmVxdWVzdEhvb2tFdmVudCxcbiAgICAgICAgICAgIHRoaXMuc2V0TW9jayxcbiAgICAgICAgICAgIHRoaXMuc2V0Q29uZmlndXJlUmVzcG9uc2VFdmVudE9wdGlvbnMsXG4gICAgICAgICAgICB0aGlzLnNldEhlYWRlck9uQ29uZmlndXJlUmVzcG9uc2VFdmVudCxcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlSGVhZGVyT25Db25maWd1cmVSZXNwb25zZUV2ZW50LFxuICAgICAgICAgICAgdGhpcy5leGVjdXRlUmVxdWVzdEZpbHRlclJ1bGVQcmVkaWNhdGUsXG4gICAgICAgICAgICB0aGlzLmV4ZWN1dGVNb2NrUHJlZGljYXRlLFxuICAgICAgICAgICAgdGhpcy5nZXRXYXJuaW5nTWVzc2FnZXMsXG4gICAgICAgICAgICB0aGlzLmFkZFJlcXVlc3RFdmVudExpc3RlbmVycyxcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlUmVxdWVzdEV2ZW50TGlzdGVuZXJzLFxuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplVGVzdFJ1bkRhdGFcbiAgICAgICAgXSwgdGhpcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfaW5pdCAocnVudGltZTogUHJvbWlzZTxSdW50aW1lUmVzb3VyY2VzfHVuZGVmaW5lZD4pOiBQcm9taXNlPFJ1bnRpbWVSZXNvdXJjZXN8dW5kZWZpbmVkPiB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkUnVudGltZSA9IGF3YWl0IHJ1bnRpbWU7XG5cbiAgICAgICAgaWYgKHJlc29sdmVkUnVudGltZSlcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlZFJ1bnRpbWU7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2UgPSBzcGF3bihwcm9jZXNzLmFyZ3YwLCBbU0VSVklDRV9QQVRIXSwgeyBzdGRpbzogWzAsIDEsIDIsICdwaXBlJywgJ3BpcGUnLCAncGlwZSddIH0pO1xuXG4gICAgICAgICAgICAvLyBIQUNLOiBOb2RlLmpzIGRlZmluaXRpb24gYXJlIG5vdCBjb3JyZWN0IHdoZW4gYWRkaXRpb25hbCBJL08gY2hhbm5lbHMgYXJlIHNwXG4gICAgICAgICAgICBjb25zdCBzdGRpbyA9IHNlcnZpY2Uuc3RkaW8gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgcHJveHkgPSBuZXcgSVBDUHJveHkobmV3IEhvc3RUcmFuc3BvcnQoc3RkaW9bSE9TVF9JTlBVVF9GRF0sIHN0ZGlvW0hPU1RfT1VUUFVUX0ZEXSwgc3RkaW9bSE9TVF9TWU5DX0ZEXSkpO1xuXG4gICAgICAgICAgICB0aGlzLl9zZXR1cFJvdXRlcyhwcm94eSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMub25jZSgncmVhZHknKTtcblxuICAgICAgICAgICAgcmV0dXJuIHsgcHJveHksIHNlcnZpY2UgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2dldFJ1bnRpbWUgKCk6IFByb21pc2U8UnVudGltZVJlc291cmNlcz4ge1xuICAgICAgICBjb25zdCBydW50aW1lID0gYXdhaXQgdGhpcy5ydW50aW1lO1xuXG4gICAgICAgIGlmICghcnVudGltZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUnVudGltZSBpcyBub3QgYXZhaWxhYmxlLicpO1xuXG4gICAgICAgIHJldHVybiBydW50aW1lO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3ByZXBhcmVFdmVudERhdGEgKGV2ZW50RGF0YTogUmVxdWVzdEV2ZW50IHwgQ29uZmlndXJlUmVzcG9uc2VFdmVudCB8IFJlc3BvbnNlRXZlbnQpOiBSZXF1ZXN0RXZlbnQgfCBDb25maWd1cmVSZXNwb25zZUV2ZW50IHwgUmVzcG9uc2VFdmVudCB7XG4gICAgICAgIC8vIFRPRE86IFJlbW92ZSBldmVudERhdGEuX3JlcXVlc3RDb250ZXh0IGludG8gJ3Rlc3RjYWZlLWhhbW1lcmhlYWQnIG1vZHVsZVxuICAgICAgICAvLyBhZnRlciBzd2l0Y2hpbmcgdG8gdGhlIGNvbXBpbGVyIHNlcnZpY2UgbW9kZS5cblxuICAgICAgICAvLyBOT1RFOiBBY2Nlc3MgdG8gdGhlIGRlcHJlY2F0ZWQgcHJvcGVydHkgaW5zaWRlIG9mIHRoZSB1bnNlcmlhbGl6YWJsZSAnZXZlbnREYXRhLl9yZXF1ZXN0Q29udGV4dCcgcHJvcGVydHlcbiAgICAgICAgLy8gY2F1c2VzIHRoZSBub2RlJ3MgZGVwcmVjYXRpb24gd2FybmluZy5cblxuICAgICAgICBjb25zdCBjbG9uZWRFdmVudERhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBldmVudERhdGEpO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZGVsZXRlIGNsb25lZEV2ZW50RGF0YS5fcmVxdWVzdENvbnRleHQ7XG5cbiAgICAgICAgcmV0dXJuIGNsb25lZEV2ZW50RGF0YTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaW5pdCAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMucnVudGltZSA9IHRoaXMuX2luaXQodGhpcy5ydW50aW1lKTtcblxuICAgICAgICBhd2FpdCB0aGlzLnJ1bnRpbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHN0b3AgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB7IHNlcnZpY2UgfSA9IGF3YWl0IHRoaXMuX2dldFJ1bnRpbWUoKTtcblxuICAgICAgICBzZXJ2aWNlLmtpbGwoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF93cmFwVGVzdEZ1bmN0aW9uIChpZDogc3RyaW5nLCBmdW5jdGlvbk5hbWU6IEZ1bmN0aW9uUHJvcGVydGllcyk6IFRlc3RGdW5jdGlvbiB7XG4gICAgICAgIHJldHVybiBhc3luYyB0ZXN0UnVuID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuVGVzdEZuKHsgaWQsIGZ1bmN0aW9uTmFtZSwgdGVzdFJ1bklkOiB0ZXN0UnVuLmlkIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVyckxpc3QgPSBuZXcgVGVzdENhZmVFcnJvckxpc3QoKTtcblxuICAgICAgICAgICAgICAgIGVyckxpc3QuYWRkRXJyb3IoZXJyKTtcblxuICAgICAgICAgICAgICAgIHRocm93IGVyckxpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfd3JhcFJlcXVlc3RGaWx0ZXJSdWxlUHJlZGljYXRlICh7IHRlc3RJZCwgaG9va0lkLCBydWxlSWQgfTogUmVxdWVzdEZpbHRlclJ1bGVMb2NhdG9yKTogUmVxdWVzdEZpbHRlclJ1bGVQcmVkaWNhdGUge1xuICAgICAgICByZXR1cm4gYXN5bmMgKHJlcXVlc3RJbmZvOiBSZXF1ZXN0SW5mbykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZVJlcXVlc3RGaWx0ZXJSdWxlUHJlZGljYXRlKHsgdGVzdElkLCBob29rSWQsIHJ1bGVJZCwgcmVxdWVzdEluZm8gfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfd3JhcE1vY2tQcmVkaWNhdGUgKHsgbW9jaywgdGVzdElkLCBob29rSWQsIHJ1bGVJZCB9OiBXcmFwTW9ja1ByZWRpY2F0ZUFyZ3VtZW50cyk6IHZvaWQge1xuICAgICAgICBtb2NrLmJvZHkgPSBhc3luYyAocmVxdWVzdEluZm86IFJlcXVlc3RJbmZvLCByZXM6IEluY29taW5nTWVzc2FnZUxpa2VJbml0T3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZU1vY2tQcmVkaWNhdGUoeyB0ZXN0SWQsIGhvb2tJZCwgcnVsZUlkLCByZXF1ZXN0SW5mbywgcmVzIH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWFkeSAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuZW1pdCgncmVhZHknKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZXhlY3V0ZUFjdGlvbiAoZGF0YTogRXhlY3V0ZUFjdGlvbkFyZ3VtZW50cyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBjb25zdCB0YXJnZXRUZXN0UnVuID0gdGVzdFJ1blRyYWNrZXIuYWN0aXZlVGVzdFJ1bnNbZGF0YS5pZF07XG5cbiAgICAgICAgaWYgKCF0YXJnZXRUZXN0UnVuKVxuICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcblxuICAgICAgICByZXR1cm4gdGFyZ2V0VGVzdFJ1bi5leGVjdXRlQWN0aW9uKGRhdGEuYXBpTWV0aG9kTmFtZSwgZGF0YS5jb21tYW5kLCBkYXRhLmNhbGxzaXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhlY3V0ZUFjdGlvblN5bmMgKCk6IG5ldmVyIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkLicpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlQ29tbWFuZCAoeyBjb21tYW5kLCBpZCB9OiBFeGVjdXRlQ29tbWFuZEFyZ3VtZW50cyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBjb25zdCB0YXJnZXRUZXN0UnVuID0gdGVzdFJ1blRyYWNrZXIuYWN0aXZlVGVzdFJ1bnNbaWRdO1xuXG4gICAgICAgIGlmICghdGFyZ2V0VGVzdFJ1bilcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldFRlc3RSdW4uZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFRlc3RzICh7IHNvdXJjZUxpc3QsIGNvbXBpbGVyT3B0aW9ucyB9OiBDb21waWxlckFyZ3VtZW50cyk6IFByb21pc2U8VGVzdFtdPiB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IGF3YWl0IHRoaXMuX2dldFJ1bnRpbWUoKTtcblxuICAgICAgICBjb25zdCB1bml0cyA9IGF3YWl0IHByb3h5LmNhbGwodGhpcy5nZXRUZXN0cywgeyBzb3VyY2VMaXN0LCBjb21waWxlck9wdGlvbnMgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3RvcmVUZXN0U3RydWN0dXJlKFxuICAgICAgICAgICAgdW5pdHMsXG4gICAgICAgICAgICAoLi4uYXJncykgPT4gdGhpcy5fd3JhcFRlc3RGdW5jdGlvbiguLi5hcmdzKSxcbiAgICAgICAgICAgIChydWxlTG9jYXRvcjogUmVxdWVzdEZpbHRlclJ1bGVMb2NhdG9yKSA9PiB0aGlzLl93cmFwUmVxdWVzdEZpbHRlclJ1bGVQcmVkaWNhdGUocnVsZUxvY2F0b3IpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJ1blRlc3RGbiAoeyBpZCwgZnVuY3Rpb25OYW1lLCB0ZXN0UnVuSWQgfTogUnVuVGVzdEFyZ3VtZW50cyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBjb25zdCB7IHByb3h5IH0gPSBhd2FpdCB0aGlzLl9nZXRSdW50aW1lKCk7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHByb3h5LmNhbGwodGhpcy5ydW5UZXN0Rm4sIHsgaWQsIGZ1bmN0aW9uTmFtZSwgdGVzdFJ1bklkIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjbGVhblVwICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIGF3YWl0IHByb3h5LmNhbGwodGhpcy5jbGVhblVwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0T3B0aW9ucyAoeyB2YWx1ZSB9OiBTZXRPcHRpb25zQXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IGF3YWl0IHRoaXMuX2dldFJ1bnRpbWUoKTtcblxuICAgICAgICBjb25zdCBwcmVwYXJlZE9wdGlvbnMgPSBwcmVwYXJlT3B0aW9ucyh2YWx1ZSk7XG5cbiAgICAgICAgYXdhaXQgcHJveHkuY2FsbCh0aGlzLnNldE9wdGlvbnMsIHsgdmFsdWU6IHByZXBhcmVkT3B0aW9ucyB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgb25SZXF1ZXN0SG9va0V2ZW50ICh7IG5hbWUsIHRlc3RJZCwgaG9va0lkLCBldmVudERhdGEgfTogUmVxdWVzdEhvb2tFdmVudEFyZ3VtZW50cyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB7IHByb3h5IH0gPSBhd2FpdCB0aGlzLl9nZXRSdW50aW1lKCk7XG5cbiAgICAgICAgYXdhaXQgcHJveHkuY2FsbCh0aGlzLm9uUmVxdWVzdEhvb2tFdmVudCwge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHRlc3RJZCxcbiAgICAgICAgICAgIGhvb2tJZCxcbiAgICAgICAgICAgIGV2ZW50RGF0YTogdGhpcy5fcHJlcGFyZUV2ZW50RGF0YShldmVudERhdGEpXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRNb2NrICh7IHRlc3RJZCwgaG9va0lkLCBydWxlSWQsIHJlc3BvbnNlRXZlbnRJZCwgbW9jayB9OiBTZXRNb2NrQXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IG1vY2tEZWZpbmVkV2l0aFByZWRpY2F0ZSA9IG1vY2suaXNQcmVkaWNhdGU7XG5cbiAgICAgICAgbW9jayA9IFJlc3BvbnNlTW9jay5mcm9tKG1vY2spO1xuXG4gICAgICAgIGlmIChtb2NrRGVmaW5lZFdpdGhQcmVkaWNhdGUpXG4gICAgICAgICAgICB0aGlzLl93cmFwTW9ja1ByZWRpY2F0ZSh7IG1vY2ssIHRlc3RJZCwgaG9va0lkLCBydWxlSWQgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCdzZXRNb2NrJywgW3Jlc3BvbnNlRXZlbnRJZCwgbW9ja10pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRDb25maWd1cmVSZXNwb25zZUV2ZW50T3B0aW9ucyAoeyBldmVudElkLCBvcHRzIH06IFNldENvbmZpZ3VyZVJlc3BvbnNlRXZlbnRPcHRpb25zQXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgnc2V0Q29uZmlndXJlUmVzcG9uc2VFdmVudE9wdGlvbnMnLCBbZXZlbnRJZCwgb3B0c10pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRIZWFkZXJPbkNvbmZpZ3VyZVJlc3BvbnNlRXZlbnQgKHsgZXZlbnRJZCwgaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWUgfTogU2V0SGVhZGVyT25Db25maWd1cmVSZXNwb25zZUV2ZW50QXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgnc2V0SGVhZGVyT25Db25maWd1cmVSZXNwb25zZUV2ZW50JywgW2V2ZW50SWQsIGhlYWRlck5hbWUsIGhlYWRlclZhbHVlXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlbW92ZUhlYWRlck9uQ29uZmlndXJlUmVzcG9uc2VFdmVudCAoeyBldmVudElkLCBoZWFkZXJOYW1lIH06IFJlbW92ZUhlYWRlck9uQ29uZmlndXJlUmVzcG9uc2VFdmVudEFyZ3VtZW50cyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVtaXQoJ3JlbW92ZUhlYWRlck9uQ29uZmlndXJlUmVzcG9uc2VFdmVudCcsIFtldmVudElkLCBoZWFkZXJOYW1lXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGV4ZWN1dGVSZXF1ZXN0RmlsdGVyUnVsZVByZWRpY2F0ZSAoeyB0ZXN0SWQsIGhvb2tJZCwgcnVsZUlkLCByZXF1ZXN0SW5mbyB9OiBFeGVjdXRlUmVxdWVzdEZpbHRlclJ1bGVQcmVkaWNhdGVBcmd1bWVudHMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIHJldHVybiBhd2FpdCBwcm94eS5jYWxsKHRoaXMuZXhlY3V0ZVJlcXVlc3RGaWx0ZXJSdWxlUHJlZGljYXRlLCB7IHRlc3RJZCwgaG9va0lkLCBydWxlSWQsIHJlcXVlc3RJbmZvIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlTW9ja1ByZWRpY2F0ZSAoeyB0ZXN0SWQsIGhvb2tJZCwgcnVsZUlkLCByZXF1ZXN0SW5mbywgcmVzIH06IEV4ZWN1dGVNb2NrUHJlZGljYXRlKTogUHJvbWlzZTxJbmNvbWluZ01lc3NhZ2VMaWtlSW5pdE9wdGlvbnM+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIHJldHVybiBhd2FpdCBwcm94eS5jYWxsKHRoaXMuZXhlY3V0ZU1vY2tQcmVkaWNhdGUsIHsgdGVzdElkLCBob29rSWQsIHJ1bGVJZCwgcmVxdWVzdEluZm8sIHJlcyB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0V2FybmluZ01lc3NhZ2VzICh7IHRlc3RSdW5JZCB9OiBHZXRXYXJuaW5nTWVzc2FnZXNBcmd1bWVudHMpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IGF3YWl0IHRoaXMuX2dldFJ1bnRpbWUoKTtcblxuICAgICAgICByZXR1cm4gcHJveHkuY2FsbCh0aGlzLmdldFdhcm5pbmdNZXNzYWdlcywgeyB0ZXN0UnVuSWQgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGFkZFJlcXVlc3RFdmVudExpc3RlbmVycyAoIHsgaG9va0lkLCBob29rQ2xhc3NOYW1lLCBydWxlcyB9OiBBZGRSZXF1ZXN0RXZlbnRMaXN0ZW5lcnNBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcnVsZXMgPSBSZXF1ZXN0RmlsdGVyUnVsZS5mcm9tQXJyYXkocnVsZXMgYXMgb2JqZWN0W10pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgnYWRkUmVxdWVzdEV2ZW50TGlzdGVuZXJzJywgeyBob29rSWQsIGhvb2tDbGFzc05hbWUsIHJ1bGVzIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZW1vdmVSZXF1ZXN0RXZlbnRMaXN0ZW5lcnMgKHsgcnVsZXMgfTogUmVtb3ZlUmVxdWVzdEV2ZW50TGlzdGVuZXJzQXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJ1bGVzID0gUmVxdWVzdEZpbHRlclJ1bGUuZnJvbUFycmF5KHJ1bGVzIGFzIG9iamVjdFtdKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmVtaXQoJ3JlbW92ZVJlcXVlc3RFdmVudExpc3RlbmVycycsIHsgcnVsZXMgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGluaXRpYWxpemVUZXN0UnVuRGF0YSAoeyB0ZXN0UnVuSWQsIHRlc3RJZCB9OiBJbml0aWFsaXplVGVzdFJ1bkRhdGFBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIHJldHVybiBwcm94eS5jYWxsKHRoaXMuaW5pdGlhbGl6ZVRlc3RSdW5EYXRhLCB7IHRlc3RSdW5JZCwgdGVzdElkIH0pO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.HOST_SYNC_FD = exports.HOST_OUTPUT_FD = exports.HOST_INPUT_FD = exports.SERVICE_SYNC_FD = exports.SERVICE_OUTPUT_FD = exports.SERVICE_INPUT_FD = void 0;
|
|
4
|
-
exports.SERVICE_INPUT_FD = 3;
|
|
5
|
-
exports.SERVICE_OUTPUT_FD = 4;
|
|
6
|
-
exports.SERVICE_SYNC_FD = 5;
|
|
7
|
-
exports.HOST_INPUT_FD = exports.SERVICE_OUTPUT_FD;
|
|
8
|
-
exports.HOST_OUTPUT_FD = exports.SERVICE_INPUT_FD;
|
|
9
|
-
exports.HOST_SYNC_FD = exports.SERVICE_SYNC_FD;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HOST_SYNC_FD = exports.HOST_OUTPUT_FD = exports.HOST_INPUT_FD = exports.SERVICE_SYNC_FD = exports.SERVICE_OUTPUT_FD = exports.SERVICE_INPUT_FD = void 0;
|
|
4
|
+
exports.SERVICE_INPUT_FD = 3;
|
|
5
|
+
exports.SERVICE_OUTPUT_FD = 4;
|
|
6
|
+
exports.SERVICE_SYNC_FD = 5;
|
|
7
|
+
exports.HOST_INPUT_FD = exports.SERVICE_OUTPUT_FD;
|
|
8
|
+
exports.HOST_OUTPUT_FD = exports.SERVICE_INPUT_FD;
|
|
9
|
+
exports.HOST_SYNC_FD = exports.SERVICE_SYNC_FD;
|
|
10
10
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvY29tcGlsZXIvaW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQWEsUUFBQSxnQkFBZ0IsR0FBSSxDQUFDLENBQUM7QUFDdEIsUUFBQSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFDdEIsUUFBQSxlQUFlLEdBQUssQ0FBQyxDQUFDO0FBQ3RCLFFBQUEsYUFBYSxHQUFPLHlCQUFpQixDQUFDO0FBQ3RDLFFBQUEsY0FBYyxHQUFNLHdCQUFnQixDQUFDO0FBQ3JDLFFBQUEsWUFBWSxHQUFRLHVCQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgU0VSVklDRV9JTlBVVF9GRCAgPSAzO1xuZXhwb3J0IGNvbnN0IFNFUlZJQ0VfT1VUUFVUX0ZEID0gNDtcbmV4cG9ydCBjb25zdCBTRVJWSUNFX1NZTkNfRkQgICA9IDU7XG5leHBvcnQgY29uc3QgSE9TVF9JTlBVVF9GRCAgICAgPSBTRVJWSUNFX09VVFBVVF9GRDtcbmV4cG9ydCBjb25zdCBIT1NUX09VVFBVVF9GRCAgICA9IFNFUlZJQ0VfSU5QVVRfRkQ7XG5leHBvcnQgY29uc3QgSE9TVF9TWU5DX0ZEICAgICAgPSBTRVJWSUNFX1NZTkNfRkQ7XG4iXX0=
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isFixtureFunctionProperty = exports.isTestFunctionProperty = exports.FUNCTION_PROPERTIES = exports.TEST_FUNCTION_PROPERTIES = exports.BEFORE_AFTER_EACH_PROPERTIES = exports.BEFORE_AFTER_PROPERTIES = void 0;
|
|
4
|
-
exports.BEFORE_AFTER_PROPERTIES = ['beforeFn', 'afterFn'];
|
|
5
|
-
exports.BEFORE_AFTER_EACH_PROPERTIES = ['beforeEachFn', 'afterEachFn'];
|
|
6
|
-
exports.TEST_FUNCTION_PROPERTIES = ['fn', ...exports.BEFORE_AFTER_PROPERTIES];
|
|
7
|
-
exports.
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isFixtureFunctionProperty = exports.isTestFunctionProperty = exports.FUNCTION_PROPERTIES = exports.FIXTURE_FUNCTION_PROPERTIES = exports.TEST_FUNCTION_PROPERTIES = exports.BEFORE_AFTER_EACH_PROPERTIES = exports.BEFORE_AFTER_PROPERTIES = void 0;
|
|
4
|
+
exports.BEFORE_AFTER_PROPERTIES = ['beforeFn', 'afterFn'];
|
|
5
|
+
exports.BEFORE_AFTER_EACH_PROPERTIES = ['beforeEachFn', 'afterEachFn'];
|
|
6
|
+
exports.TEST_FUNCTION_PROPERTIES = ['fn', ...exports.BEFORE_AFTER_PROPERTIES];
|
|
7
|
+
exports.FIXTURE_FUNCTION_PROPERTIES = [...exports.BEFORE_AFTER_PROPERTIES, ...exports.BEFORE_AFTER_EACH_PROPERTIES];
|
|
8
|
+
exports.FUNCTION_PROPERTIES = [...exports.TEST_FUNCTION_PROPERTIES, ...exports.BEFORE_AFTER_EACH_PROPERTIES];
|
|
9
|
+
function isTestFunctionProperty(value) {
|
|
10
|
+
return exports.TEST_FUNCTION_PROPERTIES.includes(value);
|
|
11
|
+
}
|
|
12
|
+
exports.isTestFunctionProperty = isTestFunctionProperty;
|
|
13
|
+
function isFixtureFunctionProperty(value) {
|
|
14
|
+
return exports.FIXTURE_FUNCTION_PROPERTIES.includes(value);
|
|
15
|
+
}
|
|
16
|
+
exports.isFixtureFunctionProperty = isFixtureFunctionProperty;
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdG9jb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvY29tcGlsZXIvcHJvdG9jb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBY2EsUUFBQSx1QkFBdUIsR0FBUSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQVUsQ0FBQztBQUNoRSxRQUFBLDRCQUE0QixHQUFHLENBQUMsY0FBYyxFQUFFLGFBQWEsQ0FBVSxDQUFDO0FBQ3hFLFFBQUEsd0JBQXdCLEdBQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRywrQkFBdUIsQ0FBVSxDQUFDO0FBQzNFLFFBQUEsMkJBQTJCLEdBQUksQ0FBQyxHQUFHLCtCQUF1QixFQUFFLEdBQUcsb0NBQTRCLENBQVUsQ0FBQztBQUN0RyxRQUFBLG1CQUFtQixHQUFZLENBQUMsR0FBRyxnQ0FBd0IsRUFBRSxHQUFHLG9DQUE0QixDQUFVLENBQUM7QUFPcEgsU0FBZ0Isc0JBQXNCLENBQUUsS0FBeUI7SUFDN0QsT0FBTyxnQ0FBd0IsQ0FBQyxRQUFRLENBQUMsS0FBK0IsQ0FBQyxDQUFDO0FBQzlFLENBQUM7QUFGRCx3REFFQztBQUVELFNBQWdCLHlCQUF5QixDQUFFLEtBQXlCO0lBQ2hFLE9BQU8sbUNBQTJCLENBQUMsUUFBUSxDQUFDLEtBQWtDLENBQUMsQ0FBQztBQUNwRixDQUFDO0FBRkQsOERBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21waWxlckFyZ3VtZW50cyB9IGZyb20gJy4uLy4uL2NvbXBpbGVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgRGljdGlvbmFyeSB9IGZyb20gJy4uLy4uL2NvbmZpZ3VyYXRpb24vaW50ZXJmYWNlcyc7XG5pbXBvcnQgUmVxdWVzdEhvb2tNZXRob2ROYW1lcyBmcm9tICcuLi8uLi9hcGkvcmVxdWVzdC1ob29rcy9ob29rLW1ldGhvZC1uYW1lcyc7XG5pbXBvcnQge1xuICAgIENvbmZpZ3VyZVJlc3BvbnNlRXZlbnQsXG4gICAgQ29uZmlndXJlUmVzcG9uc2VFdmVudE9wdGlvbnMsXG4gICAgUmVxdWVzdEV2ZW50LFxuICAgIFJlc3BvbnNlRXZlbnQsXG4gICAgUmVzcG9uc2VNb2NrLFxuICAgIFJlcXVlc3RJbmZvLFxuICAgIEluY29taW5nTWVzc2FnZUxpa2VJbml0T3B0aW9ucyxcbiAgICBSZXF1ZXN0RmlsdGVyUnVsZVxufSBmcm9tICd0ZXN0Y2FmZS1oYW1tZXJoZWFkJztcblxuZXhwb3J0IGNvbnN0IEJFRk9SRV9BRlRFUl9QUk9QRVJUSUVTICAgICAgPSBbJ2JlZm9yZUZuJywgJ2FmdGVyRm4nXSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBCRUZPUkVfQUZURVJfRUFDSF9QUk9QRVJUSUVTID0gWydiZWZvcmVFYWNoRm4nLCAnYWZ0ZXJFYWNoRm4nXSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBURVNUX0ZVTkNUSU9OX1BST1BFUlRJRVMgICAgID0gWydmbicsIC4uLkJFRk9SRV9BRlRFUl9QUk9QRVJUSUVTXSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBGSVhUVVJFX0ZVTkNUSU9OX1BST1BFUlRJRVMgID0gWy4uLkJFRk9SRV9BRlRFUl9QUk9QRVJUSUVTLCAuLi5CRUZPUkVfQUZURVJfRUFDSF9QUk9QRVJUSUVTXSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBGVU5DVElPTl9QUk9QRVJUSUVTICAgICAgICAgID0gWy4uLlRFU1RfRlVOQ1RJT05fUFJPUEVSVElFUywgLi4uQkVGT1JFX0FGVEVSX0VBQ0hfUFJPUEVSVElFU10gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEZ1bmN0aW9uUHJvcGVydGllcyA9IHR5cGVvZiBGVU5DVElPTl9QUk9QRVJUSUVTW251bWJlcl07XG5leHBvcnQgdHlwZSBUZXN0RnVuY3Rpb25Qcm9wZXJ0aWVzID0gdHlwZW9mIFRFU1RfRlVOQ1RJT05fUFJPUEVSVElFU1tudW1iZXJdO1xuZXhwb3J0IHR5cGUgRml4dHVyZUZ1bmN0aW9uUHJvcGVydGllcyA9IHR5cGVvZiBGSVhUVVJFX0ZVTkNUSU9OX1BST1BFUlRJRVNbbnVtYmVyXTtcblxuXG5leHBvcnQgZnVuY3Rpb24gaXNUZXN0RnVuY3Rpb25Qcm9wZXJ0eSAodmFsdWU6IEZ1bmN0aW9uUHJvcGVydGllcyk6IHZhbHVlIGlzIFRlc3RGdW5jdGlvblByb3BlcnRpZXMge1xuICAgIHJldHVybiBURVNUX0ZVTkNUSU9OX1BST1BFUlRJRVMuaW5jbHVkZXModmFsdWUgYXMgVGVzdEZ1bmN0aW9uUHJvcGVydGllcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpeHR1cmVGdW5jdGlvblByb3BlcnR5ICh2YWx1ZTogRnVuY3Rpb25Qcm9wZXJ0aWVzKTogdmFsdWUgaXMgRml4dHVyZUZ1bmN0aW9uUHJvcGVydGllcyB7XG4gICAgcmV0dXJuIEZJWFRVUkVfRlVOQ1RJT05fUFJPUEVSVElFUy5pbmNsdWRlcyh2YWx1ZSBhcyBGaXh0dXJlRnVuY3Rpb25Qcm9wZXJ0aWVzKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW5UZXN0QXJndW1lbnRzIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGZ1bmN0aW9uTmFtZTogRnVuY3Rpb25Qcm9wZXJ0aWVzO1xuICAgIHRlc3RSdW5JZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGVBY3Rpb25Bcmd1bWVudHMge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgYXBpTWV0aG9kTmFtZTogc3RyaW5nO1xuICAgIGNvbW1hbmQ6IHVua25vd247XG4gICAgY2FsbHNpdGU6IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0ZUNvbW1hbmRBcmd1bWVudHMge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgY29tbWFuZDogdW5rbm93bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZW1vdmVSZXF1ZXN0RXZlbnRMaXN0ZW5lcnNBcmd1bWVudHMge1xuICAgIHJ1bGVzOiBSZXF1ZXN0RmlsdGVyUnVsZVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFkZFJlcXVlc3RFdmVudExpc3RlbmVyc0FyZ3VtZW50cyB7XG4gICAgaG9va0lkOiBzdHJpbmc7XG4gICAgaG9va0NsYXNzTmFtZTogc3RyaW5nO1xuICAgIHJ1bGVzOiBSZXF1ZXN0RmlsdGVyUnVsZVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldE9wdGlvbnNBcmd1bWVudHMge1xuICAgIHZhbHVlOiBEaWN0aW9uYXJ5PE9wdGlvblZhbHVlPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0SG9va0V2ZW50QXJndW1lbnRzIHtcbiAgICBuYW1lOiBSZXF1ZXN0SG9va01ldGhvZE5hbWVzO1xuICAgIHRlc3RJZDogc3RyaW5nO1xuICAgIGhvb2tJZDogc3RyaW5nO1xuICAgIGV2ZW50RGF0YTogUmVxdWVzdEV2ZW50IHwgQ29uZmlndXJlUmVzcG9uc2VFdmVudCB8IFJlc3BvbnNlRXZlbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2V0TW9ja0FyZ3VtZW50cyBleHRlbmRzIFJlcXVlc3RGaWx0ZXJSdWxlTG9jYXRvciB7XG4gICAgcmVzcG9uc2VFdmVudElkOiBzdHJpbmc7XG4gICAgbW9jazogUmVzcG9uc2VNb2NrO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldENvbmZpZ3VyZVJlc3BvbnNlRXZlbnRPcHRpb25zQXJndW1lbnRzIHtcbiAgICBldmVudElkOiBzdHJpbmc7XG4gICAgb3B0czogQ29uZmlndXJlUmVzcG9uc2VFdmVudE9wdGlvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2V0SGVhZGVyT25Db25maWd1cmVSZXNwb25zZUV2ZW50QXJndW1lbnRzIHtcbiAgICBldmVudElkOiBzdHJpbmc7XG4gICAgaGVhZGVyTmFtZTogc3RyaW5nO1xuICAgIGhlYWRlclZhbHVlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3ZlSGVhZGVyT25Db25maWd1cmVSZXNwb25zZUV2ZW50QXJndW1lbnRzIHtcbiAgICBldmVudElkOiBzdHJpbmc7XG4gICAgaGVhZGVyTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RIb29rTG9jYXRvciB7XG4gICAgdGVzdElkOiBzdHJpbmc7XG4gICAgaG9va0lkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdEZpbHRlclJ1bGVMb2NhdG9yIGV4dGVuZHMgUmVxdWVzdEhvb2tMb2NhdG9yIHtcbiAgICBydWxlSWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRlUmVxdWVzdEZpbHRlclJ1bGVQcmVkaWNhdGVBcmd1bWVudHMgZXh0ZW5kcyBSZXF1ZXN0RmlsdGVyUnVsZUxvY2F0b3Ige1xuICAgIHJlcXVlc3RJbmZvOiBSZXF1ZXN0SW5mbztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRlTW9ja1ByZWRpY2F0ZSBleHRlbmRzIFJlcXVlc3RGaWx0ZXJSdWxlTG9jYXRvciB7XG4gICAgcmVxdWVzdEluZm86IFJlcXVlc3RJbmZvO1xuICAgIHJlczogSW5jb21pbmdNZXNzYWdlTGlrZUluaXRPcHRpb25zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldFdhcm5pbmdNZXNzYWdlc0FyZ3VtZW50cyB7XG4gICAgdGVzdFJ1bklkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5pdGlhbGl6ZVRlc3RSdW5EYXRhQXJndW1lbnRzIHtcbiAgICB0ZXN0UnVuSWQ6IHN0cmluZztcbiAgICB0ZXN0SWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXN0UnVuRGlzcGF0Y2hlclByb3RvY29sIHtcbiAgICBleGVjdXRlQWN0aW9uU3luYyAoeyBpZCwgYXBpTWV0aG9kTmFtZSwgY29tbWFuZCwgY2FsbHNpdGUgfTogRXhlY3V0ZUFjdGlvbkFyZ3VtZW50cyk6IHVua25vd247XG4gICAgZXhlY3V0ZUFjdGlvbiAoeyBpZCwgYXBpTWV0aG9kTmFtZSwgY29tbWFuZCwgY2FsbHNpdGUgfTogRXhlY3V0ZUFjdGlvbkFyZ3VtZW50cyk6IFByb21pc2U8dW5rbm93bj47XG4gICAgZXhlY3V0ZUNvbW1hbmQgKHsgY29tbWFuZCB9OiBFeGVjdXRlQ29tbWFuZEFyZ3VtZW50cyk6IFByb21pc2U8dW5rbm93bj47XG4gICAgYWRkUmVxdWVzdEV2ZW50TGlzdGVuZXJzICggeyBob29rSWQsIGhvb2tDbGFzc05hbWUsIHJ1bGVzIH06IEFkZFJlcXVlc3RFdmVudExpc3RlbmVyc0FyZ3VtZW50cyk6IFByb21pc2U8dm9pZD47XG4gICAgcmVtb3ZlUmVxdWVzdEV2ZW50TGlzdGVuZXJzICh7IHJ1bGVzIH06IFJlbW92ZVJlcXVlc3RFdmVudExpc3RlbmVyc0FyZ3VtZW50cyk6IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZXJQcm90b2NvbCBleHRlbmRzIFRlc3RSdW5EaXNwYXRjaGVyUHJvdG9jb2wge1xuICAgIHJlYWR5ICgpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgZ2V0VGVzdHMgKHsgc291cmNlTGlzdCwgY29tcGlsZXJPcHRpb25zIH06IENvbXBpbGVyQXJndW1lbnRzKTogUHJvbWlzZTx1bmtub3duPjtcblxuICAgIHJ1blRlc3RGbiAoeyBpZCwgZnVuY3Rpb25OYW1lLCB0ZXN0UnVuSWQgfTogUnVuVGVzdEFyZ3VtZW50cyk6IFByb21pc2U8dW5rbm93bj47XG5cbiAgICBjbGVhblVwICgpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgc2V0T3B0aW9ucyAoeyB2YWx1ZSB9OiBTZXRPcHRpb25zQXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIG9uUmVxdWVzdEhvb2tFdmVudCAoeyBuYW1lLCB0ZXN0SWQsIGhvb2tJZCwgZXZlbnREYXRhIH06IFJlcXVlc3RIb29rRXZlbnRBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgc2V0TW9jayAoeyByZXNwb25zZUV2ZW50SWQsIG1vY2sgfTogU2V0TW9ja0FyZ3VtZW50cyk6IFByb21pc2U8dm9pZD47XG5cbiAgICBzZXRDb25maWd1cmVSZXNwb25zZUV2ZW50T3B0aW9ucyAoeyBldmVudElkLCBvcHRzIH06IFNldENvbmZpZ3VyZVJlc3BvbnNlRXZlbnRPcHRpb25zQXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIHNldEhlYWRlck9uQ29uZmlndXJlUmVzcG9uc2VFdmVudCAoeyBldmVudElkLCBoZWFkZXJOYW1lLCBoZWFkZXJWYWx1ZSB9OiBTZXRIZWFkZXJPbkNvbmZpZ3VyZVJlc3BvbnNlRXZlbnRBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgcmVtb3ZlSGVhZGVyT25Db25maWd1cmVSZXNwb25zZUV2ZW50ICh7IGV2ZW50SWQsIGhlYWRlck5hbWUgfTogUmVtb3ZlSGVhZGVyT25Db25maWd1cmVSZXNwb25zZUV2ZW50QXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIGV4ZWN1dGVSZXF1ZXN0RmlsdGVyUnVsZVByZWRpY2F0ZSAoeyB0ZXN0SWQsIGhvb2tJZCwgcnVsZUlkLCByZXF1ZXN0SW5mbyB9OiBFeGVjdXRlUmVxdWVzdEZpbHRlclJ1bGVQcmVkaWNhdGVBcmd1bWVudHMpOiBQcm9taXNlPGJvb2xlYW4+O1xuXG4gICAgZXhlY3V0ZU1vY2tQcmVkaWNhdGUgKHsgdGVzdElkLCBob29rSWQsIHJ1bGVJZCwgcmVxdWVzdEluZm8sIHJlcyB9OiBFeGVjdXRlTW9ja1ByZWRpY2F0ZSk6IFByb21pc2U8SW5jb21pbmdNZXNzYWdlTGlrZUluaXRPcHRpb25zPjtcblxuICAgIGdldFdhcm5pbmdNZXNzYWdlcyAoeyB0ZXN0UnVuSWQgfTogR2V0V2FybmluZ01lc3NhZ2VzQXJndW1lbnRzKTogUHJvbWlzZTxzdHJpbmdbXT47XG5cbiAgICBpbml0aWFsaXplVGVzdFJ1bkRhdGEgKHsgdGVzdFJ1bklkLCB0ZXN0SWQgfTogSW5pdGlhbGl6ZVRlc3RSdW5EYXRhQXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPjtcbn1cbiJdfQ==
|