testcafe 1.19.0-alpha.1 → 1.19.0-alpha.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 +4360 -0
- package/bin/testcafe-with-v8-flag-filter.js +0 -0
- package/lib/api/exportable-lib/index.js +64 -64
- 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 +43 -43
- 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 +77 -77
- package/lib/api/structure/interfaces.js +2 -2
- package/lib/api/structure/test-file.js +32 -32
- package/lib/api/structure/test-timeout.js +9 -9
- package/lib/api/structure/test.js +98 -98
- 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 +105 -105
- package/lib/api/test-controller/execution-context.js +88 -88
- package/lib/api/test-controller/index.js +413 -413
- 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 +86 -86
- package/lib/api/user-variables/index.js +11 -11
- package/lib/api/wrap-test-function.js +49 -49
- package/lib/assertions/executor.js +87 -87
- 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 +168 -168
- package/lib/browser/connection/get-hints.js +33 -33
- package/lib/browser/connection/heartbeat-status.js +8 -8
- package/lib/browser/connection/index.js +335 -335
- 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 +105 -105
- package/lib/browser/provider/built-in/dedicated/chrome/build-chrome-args.js +17 -17
- package/lib/browser/provider/built-in/dedicated/chrome/cdp-client/automations/click/create-mouse-click-strategy.js +57 -57
- package/lib/browser/provider/built-in/dedicated/chrome/cdp-client/barriers/emitters/client-request.js +44 -44
- package/lib/browser/provider/built-in/dedicated/chrome/cdp-client/barriers/emitters/script-execution.js +37 -37
- package/lib/browser/provider/built-in/dedicated/chrome/cdp-client/barriers/page-unload-barrier.js +37 -37
- package/lib/browser/provider/built-in/dedicated/chrome/cdp-client/client-function-executor.js +123 -123
- package/lib/browser/provider/built-in/dedicated/chrome/cdp-client/clients-manager.js +13 -13
- package/lib/browser/provider/built-in/dedicated/chrome/cdp-client/execution-context.js +83 -83
- package/lib/browser/provider/built-in/dedicated/chrome/cdp-client/index.js +312 -312
- package/lib/browser/provider/built-in/dedicated/chrome/cdp-client/shared-adapter-initializer.js +98 -98
- package/lib/browser/provider/built-in/dedicated/chrome/cdp-client/utils/create-event-sequence.js +38 -38
- package/lib/browser/provider/built-in/dedicated/chrome/cdp-client/utils/cursor.js +102 -102
- package/lib/browser/provider/built-in/dedicated/chrome/cdp-client/utils/dom-utils.js +194 -194
- package/lib/browser/provider/built-in/dedicated/chrome/cdp-client/utils/event-utils.js +8 -8
- package/lib/browser/provider/built-in/dedicated/chrome/cdp-client/utils/index.js +9 -9
- package/lib/browser/provider/built-in/dedicated/chrome/cdp-client/utils/position-utils.js +128 -128
- package/lib/browser/provider/built-in/dedicated/chrome/cdp-client/utils/style-utils.js +147 -147
- 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 +110 -110
- package/lib/browser/provider/built-in/dedicated/chrome/interfaces.js +2 -2
- package/lib/browser/provider/built-in/dedicated/chrome/local-chrome.js +54 -54
- package/lib/browser/provider/built-in/dedicated/chrome/runtime-info.js +28 -28
- 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 +123 -123
- package/lib/browser/provider/built-in/dedicated/firefox/index.js +73 -73
- package/lib/browser/provider/built-in/dedicated/firefox/interfaces.js +2 -2
- 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 +15 -15
- 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 +318 -318
- package/lib/browser/provider/parse-provider-name.js +16 -16
- package/lib/browser/provider/plugin-host.js +127 -127
- package/lib/browser/provider/pool.js +123 -123
- 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/command-names.js +10 -0
- package/lib/cli/argument-parser/index.js +391 -0
- package/lib/cli/argument-parser/parse-utils.js +14 -0
- package/lib/cli/authentication-helper.js +35 -35
- package/lib/cli/cli.js +150 -143
- 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/node-arguments-filter.js +48 -48
- package/lib/cli/remotes-wizard.js +36 -36
- package/lib/cli/termination-handler.js +38 -38
- package/lib/client/core/scroll/adapter/index.js +14 -14
- package/lib/client/core/scroll/index.js +234 -234
- package/lib/client/core/utils/shared/adapter/index.js +17 -17
- package/lib/client/core/utils/shared/position.js +85 -85
- package/lib/client/core/utils/shared/scroll.js +84 -84
- package/lib/client/core/utils/shared/style.js +26 -26
- package/lib/client/driver/command-executors/client-functions/adapter/index.js +17 -17
- package/lib/client/driver/command-executors/client-functions/selector-executor/check-element-delay.js +4 -4
- package/lib/client/driver/command-executors/client-functions/selector-executor/filter.js +85 -85
- package/lib/client/driver/command-executors/client-functions/selector-executor/utils.js +37 -37
- package/lib/client/driver/deps/hammerhead.js +15 -15
- package/lib/client/driver/generate-id.js +7 -7
- package/lib/client/driver/internal-properties.js +8 -8
- package/lib/client/driver/status.js +37 -37
- package/lib/client-functions/builder-symbol.js +4 -4
- package/lib/client-functions/client-function-builder.js +174 -174
- 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 +651 -651
- 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 +154 -154
- 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 +66 -66
- package/lib/compiler/babel/preset-stage-2.js +19 -19
- package/lib/compiler/compile-client-function.js +82 -82
- 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/add-export-api.js +24 -24
- package/lib/compiler/test-file/api-based.js +202 -202
- package/lib/compiler/test-file/base.js +36 -36
- package/lib/compiler/test-file/cache-proxy.js +44 -44
- package/lib/compiler/test-file/disable-v8-optimization-note.js +4 -4
- 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 +49 -49
- package/lib/compiler/test-file/formats/es-next/get-test-list.js +167 -167
- package/lib/compiler/test-file/formats/es-next/is-flow-code.js +7 -7
- package/lib/compiler/test-file/formats/raw.js +86 -86
- package/lib/compiler/test-file/formats/typescript/compiler.js +169 -169
- package/lib/compiler/test-file/formats/typescript/get-test-list.js +186 -186
- package/lib/compiler/test-file/test-file-parser-base.js +231 -231
- package/lib/compiler/test-file/test-file-temp-variable-name.js +4 -4
- package/lib/configuration/configuration-base.js +230 -230
- package/lib/configuration/constants.js +9 -9
- package/lib/configuration/customizable-compilers.js +7 -7
- package/lib/configuration/default-values.js +55 -55
- package/lib/configuration/formats.js +6 -6
- package/lib/configuration/interfaces.js +2 -2
- package/lib/configuration/option-names.js +61 -61
- package/lib/configuration/option-source.js +10 -10
- package/lib/configuration/option.js +14 -14
- package/lib/configuration/quarantine-option-names.js +8 -8
- package/lib/configuration/run-option-names.js +29 -29
- package/lib/configuration/screenshot-option-names.js +11 -11
- package/lib/configuration/testcafe-configuration.js +206 -206
- package/lib/configuration/types.js +2 -2
- package/lib/configuration/typescript-configuration.js +65 -65
- 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/dashboard/config-storage.js +22 -0
- package/lib/dashboard/connector.js +84 -0
- package/lib/dashboard/get-dashboard-url.js +10 -0
- package/lib/dashboard/get-default-project-link.js +23 -0
- package/lib/dashboard/index.js +124 -0
- package/lib/dashboard/interfaces.js +3 -0
- package/lib/dashboard/messages.js +19 -0
- package/lib/embedding-utils.js +83 -83
- package/lib/errors/create-stack-filter.js +18 -18
- package/lib/errors/error-list.js +27 -27
- 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 +124 -124
- package/lib/errors/runtime/templates.js +119 -119
- 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 +60 -60
- package/lib/errors/test-run/index.js +362 -360
- package/lib/errors/test-run/render-error-template/index.js +28 -28
- package/lib/errors/test-run/render-error-template/utils.js +20 -20
- package/lib/errors/test-run/templates.js +111 -111
- package/lib/errors/test-run/utils.js +91 -91
- package/lib/errors/types.js +170 -170
- package/lib/index.js +89 -89
- package/lib/live/bootstrapper.js +45 -45
- 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 +172 -172
- package/lib/load-assets.js +29 -29
- package/lib/notifications/add-rendered-warning.js +21 -21
- 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 +61 -61
- package/lib/notifications/warning-message.js +49 -49
- package/lib/reporter/command/command-formatter.js +127 -127
- package/lib/reporter/command/format-command.js +8 -8
- package/lib/reporter/command/interfaces.js +2 -2
- package/lib/reporter/index.js +419 -419
- package/lib/reporter/interfaces.js +2 -2
- package/lib/reporter/plugin-host.js +141 -141
- package/lib/reporter/plugin-methods.js +14 -14
- package/lib/role/index.js +26 -26
- package/lib/role/marker-symbol.js +7 -7
- package/lib/role/phase.js +9 -9
- package/lib/role/role.js +120 -120
- package/lib/runner/bootstrapper.js +237 -237
- package/lib/runner/browser-job-result.js +9 -9
- package/lib/runner/browser-job.js +155 -155
- package/lib/runner/browser-set.js +114 -114
- package/lib/runner/fixture-hook-controller.js +105 -105
- package/lib/runner/index.js +605 -602
- package/lib/runner/interfaces.js +2 -2
- package/lib/runner/reporter-stream-controller.js +27 -27
- package/lib/runner/task/index.js +140 -140
- package/lib/runner/task/phase.js +9 -9
- package/lib/runner/test-run-controller.js +169 -169
- package/lib/runner/test-run-hook-controller.js +64 -64
- package/lib/runner/tested-app.js +73 -73
- package/lib/screenshots/capturer.js +145 -145
- 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 +68 -68
- package/lib/screenshots/utils.js +36 -36
- package/lib/services/compiler/esm-runtime-holder-name.js +4 -4
- package/lib/services/compiler/host.js +368 -368
- package/lib/services/compiler/interfaces.js +2 -2
- package/lib/services/compiler/io.js +9 -9
- package/lib/services/compiler/protocol.js +16 -16
- package/lib/services/compiler/service-loader.js +17 -17
- package/lib/services/compiler/service.js +359 -359
- package/lib/services/compiler/test-run-proxy.js +154 -154
- package/lib/services/interfaces.js +2 -2
- package/lib/services/process-title.js +8 -8
- package/lib/services/serialization/prepare-options.js +21 -21
- package/lib/services/serialization/replicator/create-replicator.js +56 -56
- package/lib/services/serialization/replicator/interfaces.js +2 -2
- package/lib/services/serialization/replicator/transforms/base-transform.js +14 -14
- package/lib/services/serialization/replicator/transforms/browser-console-messages-transform.js +21 -21
- package/lib/services/serialization/replicator/transforms/callsite-record-transform.js +22 -22
- package/lib/services/serialization/replicator/transforms/command-base-trasform/assertion-command-constructors.js +26 -26
- package/lib/services/serialization/replicator/transforms/command-base-trasform/command-constructors.js +60 -60
- package/lib/services/serialization/replicator/transforms/command-base-trasform/index.js +47 -47
- package/lib/services/serialization/replicator/transforms/command-base-trasform/types.js +2 -2
- package/lib/services/serialization/replicator/transforms/configure-response-event-option-transform.js +19 -19
- package/lib/services/serialization/replicator/transforms/custom-error-transform.js +27 -27
- package/lib/services/serialization/replicator/transforms/function-marker-transform/index.js +19 -19
- package/lib/services/serialization/replicator/transforms/function-marker-transform/marker.js +8 -8
- package/lib/services/serialization/replicator/transforms/promise-marker-transform/index.js +19 -19
- package/lib/services/serialization/replicator/transforms/promise-marker-transform/marker.js +8 -8
- package/lib/services/serialization/replicator/transforms/raw-command-callsite-record-transform.js +20 -20
- package/lib/services/serialization/replicator/transforms/re-executable-promise-transform/index.js +20 -20
- package/lib/services/serialization/replicator/transforms/re-executable-promise-transform/marker.js +5 -5
- package/lib/services/serialization/replicator/transforms/request-filter-rule-transform.js +21 -21
- package/lib/services/serialization/replicator/transforms/request-hook-event-data-transform.js +39 -39
- package/lib/services/serialization/replicator/transforms/response-mock-transform.js +21 -21
- package/lib/services/serialization/replicator/transforms/role-transform.js +19 -19
- package/lib/services/serialization/replicator/transforms/testcafe-error-list-transform.js +21 -21
- package/lib/services/serialization/replicator/transforms/url-transform.js +21 -21
- package/lib/services/serialization/test-structure.js +90 -90
- 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 +83 -83
- package/lib/services/utils/ipc/packet.js +55 -55
- package/lib/services/utils/ipc/proxy.js +96 -96
- package/lib/services/utils/ipc/transport.js +64 -64
- package/lib/services/utils/method-should-not-be-called-error.js +8 -8
- package/lib/shared/actions/action-executor.js +157 -157
- package/lib/shared/actions/automations/click/index.js +51 -51
- package/lib/shared/actions/automations/click/mouse-click-strategy-base.js +20 -20
- package/lib/shared/actions/automations/last-hovered-element-holder.js +11 -11
- package/lib/shared/actions/automations/move.js +218 -218
- package/lib/shared/actions/automations/settings.js +29 -29
- package/lib/shared/actions/automations/visible-element-automation.js +160 -160
- package/lib/shared/actions/cursor.js +61 -61
- package/lib/shared/actions/get-element.js +66 -66
- package/lib/shared/actions/utils/get-automation-point.js +19 -19
- package/lib/shared/actions/utils/get-device-point.js +20 -20
- package/lib/shared/actions/utils/is-window-iframe.js +6 -6
- package/lib/shared/actions/utils/offsets.js +32 -32
- package/lib/shared/actions/utils/screen-point-to-client.js +13 -13
- package/lib/shared/adapter/index.js +13 -13
- package/lib/shared/barriers/complex-barrier.js +27 -27
- package/lib/shared/barriers/request.js +77 -77
- package/lib/shared/barriers/script-execution.js +71 -71
- package/lib/shared/errors/automation-errors.js +6 -6
- package/lib/shared/errors/index.js +400 -400
- package/lib/shared/errors/selector-error-ctor-callback.js +29 -29
- package/lib/shared/node-modules-folder-name.js +4 -4
- package/lib/shared/utils/delay.js +8 -8
- package/lib/shared/utils/elements-retriever.js +47 -47
- package/lib/shared/utils/event-emitter.js +50 -50
- package/lib/shared/utils/get-line-rect-intersection.js +40 -40
- package/lib/shared/utils/next-tick.js +10 -10
- package/lib/shared/utils/node-type-descriptions.js +17 -17
- package/lib/shared/utils/position.js +19 -19
- package/lib/shared/utils/promise.js +13 -13
- package/lib/shared/utils/values/axis-values.js +42 -42
- package/lib/shared/utils/values/boundary-values.js +40 -40
- package/lib/shared/utils/values/dimensions.js +16 -16
- package/lib/test-run/bookmark.js +131 -131
- package/lib/test-run/browser-console-messages.js +73 -73
- package/lib/test-run/browser-manipulation-queue.js +105 -105
- package/lib/test-run/client-messages.js +9 -9
- package/lib/test-run/commands/actions.js +582 -582
- package/lib/test-run/commands/assertion.js +118 -118
- package/lib/test-run/commands/base.js +27 -27
- package/lib/test-run/commands/browser-manipulation.js +105 -105
- package/lib/test-run/commands/from-object.js +88 -88
- package/lib/test-run/commands/observation.js +75 -75
- package/lib/test-run/commands/options.js +254 -254
- package/lib/test-run/commands/service.js +61 -61
- package/lib/test-run/commands/type.js +70 -70
- package/lib/test-run/commands/utils.js +92 -92
- package/lib/test-run/commands/validations/argument.js +132 -132
- package/lib/test-run/commands/validations/factories.js +69 -69
- package/lib/test-run/commands/validations/initializers.js +44 -44
- package/lib/test-run/debug-log.js +23 -23
- package/lib/test-run/execute-js-expression/constants.js +11 -11
- package/lib/test-run/execute-js-expression/index.js +85 -85
- package/lib/test-run/index.js +1071 -1071
- 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 +19 -19
- package/lib/test-run/proxyless-commands-support.js +12 -12
- package/lib/test-run/session-controller.js +107 -107
- package/lib/testcafe.js +115 -115
- package/lib/utils/assignable.js +39 -39
- package/lib/utils/async-event-emitter.js +28 -28
- package/lib/utils/async-filter.js +7 -7
- 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/debug-action.js +6 -6
- package/lib/utils/define-lazy-property.js +13 -13
- package/lib/utils/delay.js +6 -6
- package/lib/utils/delegated-api.js +71 -71
- 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/execute-fn-with-timeout.js +16 -16
- 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 +42 -42
- package/lib/utils/get-options/base.js +36 -36
- package/lib/utils/get-options/compiler.js +33 -33
- package/lib/utils/get-options/dashboard.js +17 -17
- package/lib/utils/get-options/get-assertion-timeout.js +10 -10
- package/lib/utils/get-options/grep.js +15 -15
- package/lib/utils/get-options/index.js +22 -22
- package/lib/utils/get-options/meta.js +22 -22
- package/lib/utils/get-options/quarantine.js +98 -98
- 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-renderes.js +9 -9
- package/lib/utils/get-testcafe-version.js +8 -0
- package/lib/utils/get-viewport-width.js +17 -17
- package/lib/utils/guard-time-execution.js +10 -10
- package/lib/utils/handle-errors.js +77 -77
- 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 +9 -9
- 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/log-entry.js +24 -24
- package/lib/utils/make-reg-exp.js +7 -7
- package/lib/utils/message-bus.js +12 -12
- package/lib/utils/moment-loader.js +20 -20
- package/lib/utils/parse-file-list.js +84 -84
- 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 +19 -19
- package/lib/utils/process.js +131 -131
- package/lib/utils/promisified-functions.js +46 -46
- package/lib/utils/raw-command-callsite-record.js +69 -69
- package/lib/utils/re-executable-promise.js +39 -39
- package/lib/utils/render-callsite-sync.js +30 -30
- 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/setup-sourcemap-support.js +14 -14
- 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 +138 -138
- package/lib/video-recorder/recorder.js +153 -153
- package/lib/video-recorder/test-run-video-recorder.js +83 -83
- package/lib/video-recorder/videos.js +40 -40
- package/package.json +7 -3
- package/ts-defs/index.d.ts +109 -31
- package/ts-defs/selectors.d.ts +109 -31
- package/ts-defs/testcafe-scripts.d.ts +109 -31
- package/lib/cli/argument-parser.js +0 -334
- package/lib/runner/dashboard-config-storage/base.js +0 -13
- package/lib/runner/dashboard-config-storage/index.js +0 -13
|
@@ -1,168 +1,168 @@
|
|
|
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
|
-
exports.getTestListFromCode = exports.getTestList = exports.EsNextTestFileParser = void 0;
|
|
7
|
-
const lodash_1 = require("lodash");
|
|
8
|
-
const core_1 = require("@babel/core");
|
|
9
|
-
const compiler_1 = __importDefault(require("./compiler"));
|
|
10
|
-
const test_file_parser_base_1 = require("../../test-file-parser-base");
|
|
11
|
-
const TOKEN_TYPE = {
|
|
12
|
-
Identifier: 'Identifier',
|
|
13
|
-
PropertyAccessExpression: 'MemberExpression',
|
|
14
|
-
CallExpression: 'CallExpression',
|
|
15
|
-
TaggedTemplateExpression: 'TaggedTemplateExpression',
|
|
16
|
-
TemplateLiteral: 'TemplateLiteral',
|
|
17
|
-
StringLiteral: 'StringLiteral',
|
|
18
|
-
ArrowFunctionExpression: 'ArrowFunctionExpression',
|
|
19
|
-
FunctionExpression: 'FunctionExpression',
|
|
20
|
-
ExpressionStatement: 'ExpressionStatement',
|
|
21
|
-
ReturnStatement: 'ReturnStatement',
|
|
22
|
-
FunctionDeclaration: 'FunctionDeclaration',
|
|
23
|
-
VariableStatement: 'VariableStatement',
|
|
24
|
-
VariableDeclaration: 'VariableDeclaration',
|
|
25
|
-
ObjectLiteralExpression: 'ObjectExpression',
|
|
26
|
-
};
|
|
27
|
-
class EsNextTestFileParser extends test_file_parser_base_1.TestFileParserBase {
|
|
28
|
-
constructor() {
|
|
29
|
-
super(TOKEN_TYPE);
|
|
30
|
-
}
|
|
31
|
-
static getTagStrValue(exp) {
|
|
32
|
-
//NOTE: we set <computed name> if template literal has at least one computed substring ${...}
|
|
33
|
-
return exp.expressions.length ? EsNextTestFileParser.formatComputedName(exp.loc.start.line) : exp.quasis[0].value.raw;
|
|
34
|
-
}
|
|
35
|
-
isAsyncFn(token) {
|
|
36
|
-
return token.async || token.generator;
|
|
37
|
-
}
|
|
38
|
-
getTokenType(token) {
|
|
39
|
-
return token.type;
|
|
40
|
-
}
|
|
41
|
-
getRValue(token) {
|
|
42
|
-
return token.declarations[0].init;
|
|
43
|
-
}
|
|
44
|
-
getStringValue(token) {
|
|
45
|
-
const stringTypes = [this.tokenType.StringLiteral, this.tokenType.TemplateLiteral, this.tokenType.Identifier];
|
|
46
|
-
if (stringTypes.indexOf(token.type) > -1)
|
|
47
|
-
return this.formatFnArg(token);
|
|
48
|
-
return null;
|
|
49
|
-
}
|
|
50
|
-
getFunctionBody(token) {
|
|
51
|
-
return token.body && token.body.body ? token.body.body : [];
|
|
52
|
-
}
|
|
53
|
-
getCalleeToken(token) {
|
|
54
|
-
return token.callee;
|
|
55
|
-
}
|
|
56
|
-
getMemberFnName(token) {
|
|
57
|
-
return token.callee.property.name;
|
|
58
|
-
}
|
|
59
|
-
formatFnData(name, value, token, meta = [{}]) {
|
|
60
|
-
return {
|
|
61
|
-
fnName: name,
|
|
62
|
-
value: value,
|
|
63
|
-
loc: token.loc,
|
|
64
|
-
start: token.start,
|
|
65
|
-
end: token.end,
|
|
66
|
-
meta: lodash_1.merge({}, ...meta),
|
|
67
|
-
isSkipped: test_file_parser_base_1.TestFileParserBase.isSkipped(token),
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
getKeyValue(prop) {
|
|
71
|
-
const { key, value } = prop;
|
|
72
|
-
return {
|
|
73
|
-
key: key.name || this.formatFnArg(key),
|
|
74
|
-
value: this.getStringValue(value),
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
analyzeMemberExp(token) {
|
|
78
|
-
let exp = token;
|
|
79
|
-
const tokenType = this.tokenType;
|
|
80
|
-
const callStack = [exp];
|
|
81
|
-
while (exp.type !== tokenType.Identifier) {
|
|
82
|
-
if (exp.type === tokenType.CallExpression)
|
|
83
|
-
exp = exp.callee;
|
|
84
|
-
else if (exp.type === tokenType.PropertyAccessExpression)
|
|
85
|
-
exp = exp.object;
|
|
86
|
-
else if (exp.type === tokenType.TaggedTemplateExpression)
|
|
87
|
-
exp = exp.tag;
|
|
88
|
-
else
|
|
89
|
-
return null;
|
|
90
|
-
if (exp.type !== tokenType.Identifier)
|
|
91
|
-
callStack.push(exp);
|
|
92
|
-
}
|
|
93
|
-
if (!this.isApiFn(exp.name))
|
|
94
|
-
return null;
|
|
95
|
-
const meta = this.getMetaInfo(callStack.slice());
|
|
96
|
-
let parentExp = callStack.pop();
|
|
97
|
-
if (parentExp.type === tokenType.CallExpression)
|
|
98
|
-
return this.formatFnData(exp.name, this.formatFnArg(parentExp.arguments[0]), token, meta);
|
|
99
|
-
if (parentExp.type === tokenType.TaggedTemplateExpression)
|
|
100
|
-
return this.formatFnData(exp.name, EsNextTestFileParser.getTagStrValue(parentExp.quasi), token, meta);
|
|
101
|
-
if (parentExp.type === tokenType.PropertyAccessExpression) {
|
|
102
|
-
while (parentExp) {
|
|
103
|
-
if (parentExp.type === tokenType.CallExpression && parentExp.callee) {
|
|
104
|
-
const calleeType = parentExp.callee.type;
|
|
105
|
-
const calleeMemberFn = parentExp.callee.property && parentExp.callee.property.name;
|
|
106
|
-
if (this.checkExpDefineTargetName(calleeType, calleeMemberFn))
|
|
107
|
-
return this.formatFnData(exp.name, this.formatFnArg(parentExp.arguments[0]), token, meta);
|
|
108
|
-
}
|
|
109
|
-
if (parentExp.type === tokenType.TaggedTemplateExpression && parentExp.tag) {
|
|
110
|
-
const tagType = parentExp.tag.type;
|
|
111
|
-
const tagMemberFn = parentExp.tag.property && parentExp.tag.property.name;
|
|
112
|
-
if (this.checkExpDefineTargetName(tagType, tagMemberFn))
|
|
113
|
-
return this.formatFnData(exp.name, EsNextTestFileParser.getTagStrValue(parentExp.quasi), token, meta);
|
|
114
|
-
}
|
|
115
|
-
parentExp = callStack.pop();
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
return null;
|
|
119
|
-
}
|
|
120
|
-
formatFnArg(arg) {
|
|
121
|
-
if (arg.type === this.tokenType.Identifier)
|
|
122
|
-
return EsNextTestFileParser.formatComputedName(arg.loc.start.line);
|
|
123
|
-
if (arg.type === this.tokenType.TemplateLiteral)
|
|
124
|
-
return EsNextTestFileParser.getTagStrValue(arg);
|
|
125
|
-
if (arg.type === this.tokenType.StringLiteral)
|
|
126
|
-
return arg.value;
|
|
127
|
-
return null;
|
|
128
|
-
}
|
|
129
|
-
getFnCall(token) {
|
|
130
|
-
if (!this.isApiFn(token.callee.name))
|
|
131
|
-
return null;
|
|
132
|
-
return this.formatFnData(token.callee.name, this.formatFnArg(token.arguments[0]), token);
|
|
133
|
-
}
|
|
134
|
-
getTaggedTemplateExp(token) {
|
|
135
|
-
return this.formatFnData(token.tag.name, EsNextTestFileParser.getTagStrValue(token.quasi), token);
|
|
136
|
-
}
|
|
137
|
-
analyzeFnCall(token) {
|
|
138
|
-
const tokenType = this.tokenType;
|
|
139
|
-
if (token.type === tokenType.PropertyAccessExpression)
|
|
140
|
-
return this.analyzeMemberExp(token);
|
|
141
|
-
if (token.type === tokenType.CallExpression) {
|
|
142
|
-
const calleeType = token.callee.type;
|
|
143
|
-
if (calleeType === tokenType.PropertyAccessExpression || calleeType === tokenType.CallExpression)
|
|
144
|
-
return this.analyzeMemberExp(token);
|
|
145
|
-
if (calleeType === tokenType.FunctionExpression || calleeType === tokenType.ArrowFunctionExpression)
|
|
146
|
-
return this.collectTestCafeCalls(token.callee.body.body);
|
|
147
|
-
return this.getFnCall(token);
|
|
148
|
-
}
|
|
149
|
-
if (token.type === tokenType.TaggedTemplateExpression) {
|
|
150
|
-
if (token.tag.type === tokenType.PropertyAccessExpression)
|
|
151
|
-
return this.analyzeMemberExp(token);
|
|
152
|
-
return this.getTaggedTemplateExp(token);
|
|
153
|
-
}
|
|
154
|
-
return null;
|
|
155
|
-
}
|
|
156
|
-
parse(code) {
|
|
157
|
-
const compilerOptions = compiler_1.default.getBabelOptions(null, code);
|
|
158
|
-
delete compilerOptions.filename;
|
|
159
|
-
const opts = lodash_1.assign(compilerOptions, { ast: true });
|
|
160
|
-
const ast = core_1.transform(code, opts).ast;
|
|
161
|
-
return this.analyze(ast.program.body);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
exports.EsNextTestFileParser = EsNextTestFileParser;
|
|
165
|
-
const parser = new EsNextTestFileParser();
|
|
166
|
-
exports.getTestList = parser.getTestList.bind(parser);
|
|
167
|
-
exports.getTestListFromCode = parser.getTestListFromCode.bind(parser);
|
|
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
|
+
exports.getTestListFromCode = exports.getTestList = exports.EsNextTestFileParser = void 0;
|
|
7
|
+
const lodash_1 = require("lodash");
|
|
8
|
+
const core_1 = require("@babel/core");
|
|
9
|
+
const compiler_1 = __importDefault(require("./compiler"));
|
|
10
|
+
const test_file_parser_base_1 = require("../../test-file-parser-base");
|
|
11
|
+
const TOKEN_TYPE = {
|
|
12
|
+
Identifier: 'Identifier',
|
|
13
|
+
PropertyAccessExpression: 'MemberExpression',
|
|
14
|
+
CallExpression: 'CallExpression',
|
|
15
|
+
TaggedTemplateExpression: 'TaggedTemplateExpression',
|
|
16
|
+
TemplateLiteral: 'TemplateLiteral',
|
|
17
|
+
StringLiteral: 'StringLiteral',
|
|
18
|
+
ArrowFunctionExpression: 'ArrowFunctionExpression',
|
|
19
|
+
FunctionExpression: 'FunctionExpression',
|
|
20
|
+
ExpressionStatement: 'ExpressionStatement',
|
|
21
|
+
ReturnStatement: 'ReturnStatement',
|
|
22
|
+
FunctionDeclaration: 'FunctionDeclaration',
|
|
23
|
+
VariableStatement: 'VariableStatement',
|
|
24
|
+
VariableDeclaration: 'VariableDeclaration',
|
|
25
|
+
ObjectLiteralExpression: 'ObjectExpression',
|
|
26
|
+
};
|
|
27
|
+
class EsNextTestFileParser extends test_file_parser_base_1.TestFileParserBase {
|
|
28
|
+
constructor() {
|
|
29
|
+
super(TOKEN_TYPE);
|
|
30
|
+
}
|
|
31
|
+
static getTagStrValue(exp) {
|
|
32
|
+
//NOTE: we set <computed name> if template literal has at least one computed substring ${...}
|
|
33
|
+
return exp.expressions.length ? EsNextTestFileParser.formatComputedName(exp.loc.start.line) : exp.quasis[0].value.raw;
|
|
34
|
+
}
|
|
35
|
+
isAsyncFn(token) {
|
|
36
|
+
return token.async || token.generator;
|
|
37
|
+
}
|
|
38
|
+
getTokenType(token) {
|
|
39
|
+
return token.type;
|
|
40
|
+
}
|
|
41
|
+
getRValue(token) {
|
|
42
|
+
return token.declarations[0].init;
|
|
43
|
+
}
|
|
44
|
+
getStringValue(token) {
|
|
45
|
+
const stringTypes = [this.tokenType.StringLiteral, this.tokenType.TemplateLiteral, this.tokenType.Identifier];
|
|
46
|
+
if (stringTypes.indexOf(token.type) > -1)
|
|
47
|
+
return this.formatFnArg(token);
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
getFunctionBody(token) {
|
|
51
|
+
return token.body && token.body.body ? token.body.body : [];
|
|
52
|
+
}
|
|
53
|
+
getCalleeToken(token) {
|
|
54
|
+
return token.callee;
|
|
55
|
+
}
|
|
56
|
+
getMemberFnName(token) {
|
|
57
|
+
return token.callee.property.name;
|
|
58
|
+
}
|
|
59
|
+
formatFnData(name, value, token, meta = [{}]) {
|
|
60
|
+
return {
|
|
61
|
+
fnName: name,
|
|
62
|
+
value: value,
|
|
63
|
+
loc: token.loc,
|
|
64
|
+
start: token.start,
|
|
65
|
+
end: token.end,
|
|
66
|
+
meta: lodash_1.merge({}, ...meta),
|
|
67
|
+
isSkipped: test_file_parser_base_1.TestFileParserBase.isSkipped(token),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
getKeyValue(prop) {
|
|
71
|
+
const { key, value } = prop;
|
|
72
|
+
return {
|
|
73
|
+
key: key.name || this.formatFnArg(key),
|
|
74
|
+
value: this.getStringValue(value),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
analyzeMemberExp(token) {
|
|
78
|
+
let exp = token;
|
|
79
|
+
const tokenType = this.tokenType;
|
|
80
|
+
const callStack = [exp];
|
|
81
|
+
while (exp.type !== tokenType.Identifier) {
|
|
82
|
+
if (exp.type === tokenType.CallExpression)
|
|
83
|
+
exp = exp.callee;
|
|
84
|
+
else if (exp.type === tokenType.PropertyAccessExpression)
|
|
85
|
+
exp = exp.object;
|
|
86
|
+
else if (exp.type === tokenType.TaggedTemplateExpression)
|
|
87
|
+
exp = exp.tag;
|
|
88
|
+
else
|
|
89
|
+
return null;
|
|
90
|
+
if (exp.type !== tokenType.Identifier)
|
|
91
|
+
callStack.push(exp);
|
|
92
|
+
}
|
|
93
|
+
if (!this.isApiFn(exp.name))
|
|
94
|
+
return null;
|
|
95
|
+
const meta = this.getMetaInfo(callStack.slice());
|
|
96
|
+
let parentExp = callStack.pop();
|
|
97
|
+
if (parentExp.type === tokenType.CallExpression)
|
|
98
|
+
return this.formatFnData(exp.name, this.formatFnArg(parentExp.arguments[0]), token, meta);
|
|
99
|
+
if (parentExp.type === tokenType.TaggedTemplateExpression)
|
|
100
|
+
return this.formatFnData(exp.name, EsNextTestFileParser.getTagStrValue(parentExp.quasi), token, meta);
|
|
101
|
+
if (parentExp.type === tokenType.PropertyAccessExpression) {
|
|
102
|
+
while (parentExp) {
|
|
103
|
+
if (parentExp.type === tokenType.CallExpression && parentExp.callee) {
|
|
104
|
+
const calleeType = parentExp.callee.type;
|
|
105
|
+
const calleeMemberFn = parentExp.callee.property && parentExp.callee.property.name;
|
|
106
|
+
if (this.checkExpDefineTargetName(calleeType, calleeMemberFn))
|
|
107
|
+
return this.formatFnData(exp.name, this.formatFnArg(parentExp.arguments[0]), token, meta);
|
|
108
|
+
}
|
|
109
|
+
if (parentExp.type === tokenType.TaggedTemplateExpression && parentExp.tag) {
|
|
110
|
+
const tagType = parentExp.tag.type;
|
|
111
|
+
const tagMemberFn = parentExp.tag.property && parentExp.tag.property.name;
|
|
112
|
+
if (this.checkExpDefineTargetName(tagType, tagMemberFn))
|
|
113
|
+
return this.formatFnData(exp.name, EsNextTestFileParser.getTagStrValue(parentExp.quasi), token, meta);
|
|
114
|
+
}
|
|
115
|
+
parentExp = callStack.pop();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
formatFnArg(arg) {
|
|
121
|
+
if (arg.type === this.tokenType.Identifier)
|
|
122
|
+
return EsNextTestFileParser.formatComputedName(arg.loc.start.line);
|
|
123
|
+
if (arg.type === this.tokenType.TemplateLiteral)
|
|
124
|
+
return EsNextTestFileParser.getTagStrValue(arg);
|
|
125
|
+
if (arg.type === this.tokenType.StringLiteral)
|
|
126
|
+
return arg.value;
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
getFnCall(token) {
|
|
130
|
+
if (!this.isApiFn(token.callee.name))
|
|
131
|
+
return null;
|
|
132
|
+
return this.formatFnData(token.callee.name, this.formatFnArg(token.arguments[0]), token);
|
|
133
|
+
}
|
|
134
|
+
getTaggedTemplateExp(token) {
|
|
135
|
+
return this.formatFnData(token.tag.name, EsNextTestFileParser.getTagStrValue(token.quasi), token);
|
|
136
|
+
}
|
|
137
|
+
analyzeFnCall(token) {
|
|
138
|
+
const tokenType = this.tokenType;
|
|
139
|
+
if (token.type === tokenType.PropertyAccessExpression)
|
|
140
|
+
return this.analyzeMemberExp(token);
|
|
141
|
+
if (token.type === tokenType.CallExpression) {
|
|
142
|
+
const calleeType = token.callee.type;
|
|
143
|
+
if (calleeType === tokenType.PropertyAccessExpression || calleeType === tokenType.CallExpression)
|
|
144
|
+
return this.analyzeMemberExp(token);
|
|
145
|
+
if (calleeType === tokenType.FunctionExpression || calleeType === tokenType.ArrowFunctionExpression)
|
|
146
|
+
return this.collectTestCafeCalls(token.callee.body.body);
|
|
147
|
+
return this.getFnCall(token);
|
|
148
|
+
}
|
|
149
|
+
if (token.type === tokenType.TaggedTemplateExpression) {
|
|
150
|
+
if (token.tag.type === tokenType.PropertyAccessExpression)
|
|
151
|
+
return this.analyzeMemberExp(token);
|
|
152
|
+
return this.getTaggedTemplateExp(token);
|
|
153
|
+
}
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
parse(code) {
|
|
157
|
+
const compilerOptions = compiler_1.default.getBabelOptions(null, code);
|
|
158
|
+
delete compilerOptions.filename;
|
|
159
|
+
const opts = lodash_1.assign(compilerOptions, { ast: true });
|
|
160
|
+
const ast = core_1.transform(code, opts).ast;
|
|
161
|
+
return this.analyze(ast.program.body);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
exports.EsNextTestFileParser = EsNextTestFileParser;
|
|
165
|
+
const parser = new EsNextTestFileParser();
|
|
166
|
+
exports.getTestList = parser.getTestList.bind(parser);
|
|
167
|
+
exports.getTestListFromCode = parser.getTestListFromCode.bind(parser);
|
|
168
168
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXRlc3QtbGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21waWxlci90ZXN0LWZpbGUvZm9ybWF0cy9lcy1uZXh0L2dldC10ZXN0LWxpc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbUNBQXVDO0FBQ3ZDLHNDQUF3QztBQUN4QywwREFBZ0Q7QUFDaEQsdUVBQWlFO0FBRWpFLE1BQU0sVUFBVSxHQUFHO0lBQ2YsVUFBVSxFQUFnQixZQUFZO0lBQ3RDLHdCQUF3QixFQUFFLGtCQUFrQjtJQUM1QyxjQUFjLEVBQVksZ0JBQWdCO0lBQzFDLHdCQUF3QixFQUFFLDBCQUEwQjtJQUNwRCxlQUFlLEVBQVcsaUJBQWlCO0lBQzNDLGFBQWEsRUFBYSxlQUFlO0lBQ3pDLHVCQUF1QixFQUFHLHlCQUF5QjtJQUNuRCxrQkFBa0IsRUFBUSxvQkFBb0I7SUFDOUMsbUJBQW1CLEVBQU8scUJBQXFCO0lBQy9DLGVBQWUsRUFBVyxpQkFBaUI7SUFDM0MsbUJBQW1CLEVBQU8scUJBQXFCO0lBQy9DLGlCQUFpQixFQUFTLG1CQUFtQjtJQUM3QyxtQkFBbUIsRUFBTyxxQkFBcUI7SUFDL0MsdUJBQXVCLEVBQUcsa0JBQWtCO0NBQy9DLENBQUM7QUFFRixNQUFhLG9CQUFxQixTQUFRLDBDQUFrQjtJQUN4RDtRQUNJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBRSxHQUFHO1FBQ3RCLDZGQUE2RjtRQUM3RixPQUFPLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO0lBQzFILENB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LE1BQU0sTUFBTSxHQUFHLElBQUksb0JBQW9CLEVBQUUsQ0FBQztBQUU3QixRQUFBLFdBQVcsR0FBVyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN0RCxRQUFBLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhc3NpZ24sIG1lcmdlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHRyYW5zZm9ybSB9IGZyb20gJ0BiYWJlbC9jb3JlJztcbmltcG9ydCBFU05leHRUZXN0RmlsZUNvbXBpbGVyIGZyb20gJy4vY29tcGlsZXInO1xuaW1wb3J0IHsgVGVzdEZpbGVQYXJzZXJCYXNlIH0gZnJvbSAnLi4vLi4vdGVzdC1maWxlLXBhcnNlci1iYXNlJztcblxuY29uc3QgVE9LRU5fVFlQRSA9IHtcbiAgICBJZGVudGlmaWVyOiAgICAgICAgICAgICAgICdJZGVudGlmaWVyJyxcbiAgICBQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb246ICdNZW1iZXJFeHByZXNzaW9uJyxcbiAgICBDYWxsRXhwcmVzc2lvbjogICAgICAgICAgICdDYWxsRXhwcmVzc2lvbicsXG4gICAgVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uOiAnVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uJyxcbiAgICBUZW1wbGF0ZUxpdGVyYWw6ICAgICAgICAgICdUZW1wbGF0ZUxpdGVyYWwnLFxuICAgIFN0cmluZ0xpdGVyYWw6ICAgICAgICAgICAgJ1N0cmluZ0xpdGVyYWwnLFxuICAgIEFycm93RnVuY3Rpb25FeHByZXNzaW9uOiAgJ0Fycm93RnVuY3Rpb25FeHByZXNzaW9uJyxcbiAgICBGdW5jdGlvbkV4cHJlc3Npb246ICAgICAgICdGdW5jdGlvbkV4cHJlc3Npb24nLFxuICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQ6ICAgICAgJ0V4cHJlc3Npb25TdGF0ZW1lbnQnLFxuICAgIFJldHVyblN0YXRlbWVudDogICAgICAgICAgJ1JldHVyblN0YXRlbWVudCcsXG4gICAgRnVuY3Rpb25EZWNsYXJhdGlvbjogICAgICAnRnVuY3Rpb25EZWNsYXJhdGlvbicsXG4gICAgVmFyaWFibGVTdGF0ZW1lbnQ6ICAgICAgICAnVmFyaWFibGVTdGF0ZW1lbnQnLFxuICAgIFZhcmlhYmxlRGVjbGFyYXRpb246ICAgICAgJ1ZhcmlhYmxlRGVjbGFyYXRpb24nLFxuICAgIE9iamVjdExpdGVyYWxFeHByZXNzaW9uOiAgJ09iamVjdEV4cHJlc3Npb24nLFxufTtcblxuZXhwb3J0IGNsYXNzIEVzTmV4dFRlc3RGaWxlUGFyc2VyIGV4dGVuZHMgVGVzdEZpbGVQYXJzZXJCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKFRPS0VOX1RZUEUpO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRUYWdTdHJWYWx1ZSAoZXhwKSB7XG4gICAgICAgIC8vTk9URTogd2Ugc2V0IDxjb21wdXRlZCBuYW1lPiBpZiB0ZW1wbGF0ZSBsaXRlcmFsIGhhcyBhdCBsZWFzdCBvbmUgY29tcHV0ZWQgc3Vic3RyaW5nICR7Li4ufVxuICAgICAgICByZXR1cm4gZXhwLmV4cHJlc3Npb25zLmxlbmd0aCA/IEVzTmV4dFRlc3RGaWxlUGFyc2VyLmZvcm1hdENvbXB1dGVkTmFtZShleHAubG9jLnN0YXJ0LmxpbmUpIDogZXhwLnF1YXNpc1swXS52YWx1ZS5yYXc7XG4gICAgfVxuXG4gICAgaXNBc3luY0ZuICh0b2tlbikge1xuICAgICAgICByZXR1cm4gdG9rZW4uYXN5bmMgfHwgdG9rZW4uZ2VuZXJhdG9yO1xuICAgIH1cblxuICAgIGdldFRva2VuVHlwZSAodG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHRva2VuLnR5cGU7XG4gICAgfVxuXG4gICAgZ2V0UlZhbHVlICh0b2tlbikge1xuICAgICAgICByZXR1cm4gdG9rZW4uZGVjbGFyYXRpb25zWzBdLmluaXQ7XG4gICAgfVxuXG4gICAgZ2V0U3RyaW5nVmFsdWUgKHRva2VuKSB7XG4gICAgICAgIGNvbnN0IHN0cmluZ1R5cGVzID0gW3RoaXMudG9rZW5UeXBlLlN0cmluZ0xpdGVyYWwsIHRoaXMudG9rZW5UeXBlLlRlbXBsYXRlTGl0ZXJhbCwgdGhpcy50b2tlblR5cGUuSWRlbnRpZmllcl07XG5cbiAgICAgICAgaWYgKHN0cmluZ1R5cGVzLmluZGV4T2YodG9rZW4udHlwZSkgPiAtMSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1hdEZuQXJnKHRva2VuKTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBnZXRGdW5jdGlvbkJvZHkgKHRva2VuKSB7XG4gICAgICAgIHJldHVybiB0b2tlbi5ib2R5ICYmIHRva2VuLmJvZHkuYm9keSA/IHRva2VuLmJvZHkuYm9keSA6IFtdO1xuICAgIH1cblxuICAgIGdldENhbGxlZVRva2VuICh0b2tlbikge1xuICAgICAgICByZXR1cm4gdG9rZW4uY2FsbGVlO1xuICAgIH1cblxuICAgIGdldE1lbWJlckZuTmFtZSAodG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHRva2VuLmNhbGxlZS5wcm9wZXJ0eS5uYW1lO1xuICAgIH1cblxuICAgIGZvcm1hdEZuRGF0YSAobmFtZSwgdmFsdWUsIHRva2VuLCBtZXRhID0gW3t9XSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZm5OYW1lOiAgICBuYW1lLFxuICAgICAgICAgICAgdmFsdWU6ICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGxvYzogICAgICAgdG9rZW4ubG9jLFxuICAgICAgICAgICAgc3RhcnQ6ICAgICB0b2tlbi5zdGFydCxcbiAgICAgICAgICAgIGVuZDogICAgICAgdG9rZW4uZW5kLFxuICAgICAgICAgICAgbWV0YTogICAgICBtZXJnZSh7fSwgLi4ubWV0YSksXG4gICAgICAgICAgICBpc1NraXBwZWQ6IFRlc3RGaWxlUGFyc2VyQmFzZS5pc1NraXBwZWQodG9rZW4pLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldEtleVZhbHVlIChwcm9wKSB7XG4gICAgICAgIGNvbnN0IHsga2V5LCB2YWx1ZSB9ID0gcHJvcDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2V5OiAgIGtleS5uYW1lIHx8IHRoaXMuZm9ybWF0Rm5Bcmcoa2V5KSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmdldFN0cmluZ1ZhbHVlKHZhbHVlKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBhbmFseXplTWVtYmVyRXhwICh0b2tlbikge1xuICAgICAgICBsZXQgZXhwICAgICAgICAgPSB0b2tlbjtcbiAgICAgICAgY29uc3QgdG9rZW5UeXBlID0gdGhpcy50b2tlblR5cGU7XG4gICAgICAgIGNvbnN0IGNhbGxTdGFjayA9IFtleHBdO1xuXG4gICAgICAgIHdoaWxlIChleHAudHlwZSAhPT0gdG9rZW5UeXBlLklkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIGlmIChleHAudHlwZSA9PT0gdG9rZW5UeXBlLkNhbGxFeHByZXNzaW9uKVxuICAgICAgICAgICAgICAgIGV4cCA9IGV4cC5jYWxsZWU7XG5cbiAgICAgICAgICAgIGVsc2UgaWYgKGV4cC50eXBlID09PSB0b2tlblR5cGUuUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKVxuICAgICAgICAgICAgICAgIGV4cCA9IGV4cC5vYmplY3Q7XG5cbiAgICAgICAgICAgIGVsc2UgaWYgKGV4cC50eXBlID09PSB0b2tlblR5cGUuVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uKVxuICAgICAgICAgICAgICAgIGV4cCA9IGV4cC50YWc7XG5cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgaWYgKGV4cC50eXBlICE9PSB0b2tlblR5cGUuSWRlbnRpZmllcilcbiAgICAgICAgICAgICAgICBjYWxsU3RhY2sucHVzaChleHApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzQXBpRm4oZXhwLm5hbWUpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5nZXRNZXRhSW5mbyhjYWxsU3RhY2suc2xpY2UoKSk7XG5cbiAgICAgICAgbGV0IHBhcmVudEV4cCA9IGNhbGxTdGFjay5wb3AoKTtcblxuICAgICAgICBpZiAocGFyZW50RXhwLnR5cGUgPT09IHRva2VuVHlwZS5DYWxsRXhwcmVzc2lvbilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1hdEZuRGF0YShleHAubmFtZSwgdGhpcy5mb3JtYXRGbkFyZyhwYXJlbnRFeHAuYXJndW1lbnRzWzBdKSwgdG9rZW4sIG1ldGEpO1xuXG4gICAgICAgIGlmIChwYXJlbnRFeHAudHlwZSA9PT0gdG9rZW5UeXBlLlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1hdEZuRGF0YShleHAubmFtZSwgRXNOZXh0VGVzdEZpbGVQYXJzZXIuZ2V0VGFnU3RyVmFsdWUocGFyZW50RXhwLnF1YXNpKSwgdG9rZW4sIG1ldGEpO1xuXG4gICAgICAgIGlmIChwYXJlbnRFeHAudHlwZSA9PT0gdG9rZW5UeXBlLlByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgd2hpbGUgKHBhcmVudEV4cCkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRFeHAudHlwZSA9PT0gdG9rZW5UeXBlLkNhbGxFeHByZXNzaW9uICYmIHBhcmVudEV4cC5jYWxsZWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbGVlVHlwZSAgICAgPSBwYXJlbnRFeHAuY2FsbGVlLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxlZU1lbWJlckZuID0gcGFyZW50RXhwLmNhbGxlZS5wcm9wZXJ0eSAmJiBwYXJlbnRFeHAuY2FsbGVlLnByb3BlcnR5Lm5hbWU7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tFeHBEZWZpbmVUYXJnZXROYW1lKGNhbGxlZVR5cGUsIGNhbGxlZU1lbWJlckZuKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1hdEZuRGF0YShleHAubmFtZSwgdGhpcy5mb3JtYXRGbkFyZyhwYXJlbnRFeHAuYXJndW1lbnRzWzBdKSwgdG9rZW4sIG1ldGEpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRFeHAudHlwZSA9PT0gdG9rZW5UeXBlLlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbiAmJiBwYXJlbnRFeHAudGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZ1R5cGUgICAgID0gcGFyZW50RXhwLnRhZy50eXBlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdNZW1iZXJGbiA9IHBhcmVudEV4cC50YWcucHJvcGVydHkgJiYgcGFyZW50RXhwLnRhZy5wcm9wZXJ0eS5uYW1lO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrRXhwRGVmaW5lVGFyZ2V0TmFtZSh0YWdUeXBlLCB0YWdNZW1iZXJGbikpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRGbkRhdGEoZXhwLm5hbWUsIEVzTmV4dFRlc3RGaWxlUGFyc2VyLmdldFRhZ1N0clZhbHVlKHBhcmVudEV4cC5xdWFzaSksIHRva2VuLCBtZXRhKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwYXJlbnRFeHAgPSBjYWxsU3RhY2sucG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmb3JtYXRGbkFyZyAoYXJnKSB7XG4gICAgICAgIGlmIChhcmcudHlwZSA9PT0gdGhpcy50b2tlblR5cGUuSWRlbnRpZmllcilcbiAgICAgICAgICAgIHJldHVybiBFc05leHRUZXN0RmlsZVBhcnNlci5mb3JtYXRDb21wdXRlZE5hbWUoYXJnLmxvYy5zdGFydC5saW5lKTtcblxuICAgICAgICBpZiAoYXJnLnR5cGUgPT09IHRoaXMudG9rZW5UeXBlLlRlbXBsYXRlTGl0ZXJhbClcbiAgICAgICAgICAgIHJldHVybiBFc05leHRUZXN0RmlsZVBhcnNlci5nZXRUYWdTdHJWYWx1ZShhcmcpO1xuXG4gICAgICAgIGlmIChhcmcudHlwZSA9PT0gdGhpcy50b2tlblR5cGUuU3RyaW5nTGl0ZXJhbClcbiAgICAgICAgICAgIHJldHVybiBhcmcudmFsdWU7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZ2V0Rm5DYWxsICh0b2tlbikge1xuICAgICAgICBpZiAoIXRoaXMuaXNBcGlGbih0b2tlbi5jYWxsZWUubmFtZSkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdEZuRGF0YSh0b2tlbi5jYWxsZWUubmFtZSwgdGhpcy5mb3JtYXRGbkFyZyh0b2tlbi5hcmd1bWVudHNbMF0pLCB0b2tlbik7XG4gICAgfVxuXG4gICAgZ2V0VGFnZ2VkVGVtcGxhdGVFeHAgKHRva2VuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdEZuRGF0YSh0b2tlbi50YWcubmFtZSwgRXNOZXh0VGVzdEZpbGVQYXJzZXIuZ2V0VGFnU3RyVmFsdWUodG9rZW4ucXVhc2kpLCB0b2tlbik7XG4gICAgfVxuXG4gICAgYW5hbHl6ZUZuQ2FsbCAodG9rZW4pIHtcbiAgICAgICAgY29uc3QgdG9rZW5UeXBlID0gdGhpcy50b2tlblR5cGU7XG5cbiAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09IHRva2VuVHlwZS5Qcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hbmFseXplTWVtYmVyRXhwKHRva2VuKTtcblxuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gdG9rZW5UeXBlLkNhbGxFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICBjb25zdCBjYWxsZWVUeXBlID0gdG9rZW4uY2FsbGVlLnR5cGU7XG5cbiAgICAgICAgICAgIGlmIChjYWxsZWVUeXBlID09PSB0b2tlblR5cGUuUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uIHx8IGNhbGxlZVR5cGUgPT09IHRva2VuVHlwZS5DYWxsRXhwcmVzc2lvbilcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hbmFseXplTWVtYmVyRXhwKHRva2VuKTtcblxuICAgICAgICAgICAgaWYgKGNhbGxlZVR5cGUgPT09IHRva2VuVHlwZS5GdW5jdGlvbkV4cHJlc3Npb24gfHwgY2FsbGVlVHlwZSA9PT0gdG9rZW5UeXBlLkFycm93RnVuY3Rpb25FeHByZXNzaW9uKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbGxlY3RUZXN0Q2FmZUNhbGxzKHRva2VuLmNhbGxlZS5ib2R5LmJvZHkpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGbkNhbGwodG9rZW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09IHRva2VuVHlwZS5UYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIGlmICh0b2tlbi50YWcudHlwZSA9PT0gdG9rZW5UeXBlLlByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbilcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hbmFseXplTWVtYmVyRXhwKHRva2VuKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGFnZ2VkVGVtcGxhdGVFeHAodG9rZW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcGFyc2UgKGNvZGUpIHtcbiAgICAgICAgY29uc3QgY29tcGlsZXJPcHRpb25zID0gRVNOZXh0VGVzdEZpbGVDb21waWxlci5nZXRCYWJlbE9wdGlvbnMobnVsbCwgY29kZSk7XG5cbiAgICAgICAgZGVsZXRlIGNvbXBpbGVyT3B0aW9ucy5maWxlbmFtZTtcblxuICAgICAgICBjb25zdCBvcHRzID0gYXNzaWduKGNvbXBpbGVyT3B0aW9ucywgeyBhc3Q6IHRydWUgfSk7XG4gICAgICAgIGNvbnN0IGFzdCAgPSB0cmFuc2Zvcm0oY29kZSwgb3B0cykuYXN0O1xuXG4gICAgICAgIHJldHVybiB0aGlzLmFuYWx5emUoYXN0LnByb2dyYW0uYm9keSk7XG4gICAgfVxufVxuXG5jb25zdCBwYXJzZXIgPSBuZXcgRXNOZXh0VGVzdEZpbGVQYXJzZXIoKTtcblxuZXhwb3J0IGNvbnN0IGdldFRlc3RMaXN0ICAgICAgICAgPSBwYXJzZXIuZ2V0VGVzdExpc3QuYmluZChwYXJzZXIpO1xuZXhwb3J0IGNvbnN0IGdldFRlc3RMaXN0RnJvbUNvZGUgPSBwYXJzZXIuZ2V0VGVzdExpc3RGcm9tQ29kZS5iaW5kKHBhcnNlcik7XG4iXX0=
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const FLOW_MARKER_RE = /^\s*\/\/\s*@flow\s*\n|^\s*\/\*\s*@flow\s*\*\//;
|
|
4
|
-
function default_1(code) {
|
|
5
|
-
return FLOW_MARKER_RE.test(code);
|
|
6
|
-
}
|
|
7
|
-
exports.default = default_1;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const FLOW_MARKER_RE = /^\s*\/\/\s*@flow\s*\n|^\s*\/\*\s*@flow\s*\*\//;
|
|
4
|
+
function default_1(code) {
|
|
5
|
+
return FLOW_MARKER_RE.test(code);
|
|
6
|
+
}
|
|
7
|
+
exports.default = default_1;
|
|
8
8
|
module.exports = exports.default;
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtZmxvdy1jb2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGVyL3Rlc3QtZmlsZS9mb3JtYXRzL2VzLW5leHQvaXMtZmxvdy1jb2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsTUFBTSxjQUFjLEdBQUcsK0NBQStDLENBQUM7QUFFdkUsbUJBQXlCLElBQVk7SUFDakMsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFGRCw0QkFFQyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IEZMT1dfTUFSS0VSX1JFID0gL15cXHMqXFwvXFwvXFxzKkBmbG93XFxzKlxcbnxeXFxzKlxcL1xcKlxccypAZmxvd1xccypcXCpcXC8vO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoY29kZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEZMT1dfTUFSS0VSX1JFLnRlc3QoY29kZSk7XG59XG4iXX0=
|
|
@@ -1,88 +1,88 @@
|
|
|
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 base_1 = __importDefault(require("../base"));
|
|
7
|
-
const runtime_1 = require("../../../errors/runtime");
|
|
8
|
-
const types_1 = require("../../../errors/types");
|
|
9
|
-
const test_file_1 = __importDefault(require("../../../api/structure/test-file"));
|
|
10
|
-
const fixture_1 = __importDefault(require("../../../api/structure/fixture"));
|
|
11
|
-
const test_1 = __importDefault(require("../../../api/structure/test"));
|
|
12
|
-
const from_object_1 = __importDefault(require("../../../test-run/commands/from-object"));
|
|
13
|
-
const raw_command_callsite_record_1 = require("../../../utils/raw-command-callsite-record");
|
|
14
|
-
class RawTestFileCompiler extends base_1.default {
|
|
15
|
-
static _createTestFn(commands) {
|
|
16
|
-
return async (t) => {
|
|
17
|
-
var _a, _b;
|
|
18
|
-
for (let i = 0; i < commands.length; i++) {
|
|
19
|
-
const callsite = ((_a = commands[i]) === null || _a === void 0 ? void 0 : _a.id) ? new raw_command_callsite_record_1.RawCommandCallsiteRecord(commands[i].id, commands) : (_b = commands[i]) === null || _b === void 0 ? void 0 : _b.callsite;
|
|
20
|
-
try {
|
|
21
|
-
const command = from_object_1.default(commands[i], t.testRun);
|
|
22
|
-
await t.testRun.executeCommand(command, callsite);
|
|
23
|
-
}
|
|
24
|
-
catch (err) {
|
|
25
|
-
err.callsite = callsite;
|
|
26
|
-
throw err;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
static _assignCommonTestingUnitProperties(src, dest) {
|
|
32
|
-
if (src.pageUrl)
|
|
33
|
-
dest.page(src.pageUrl);
|
|
34
|
-
if (src.authCredentials)
|
|
35
|
-
dest.httpAuth(src.authCredentials);
|
|
36
|
-
/* eslint-disable no-unused-expressions */
|
|
37
|
-
if (src.only)
|
|
38
|
-
dest.only;
|
|
39
|
-
if (src.skip)
|
|
40
|
-
dest.skip;
|
|
41
|
-
if (src.disablePageReloads)
|
|
42
|
-
dest.disablePageReloads;
|
|
43
|
-
if (src.enablePageReloads)
|
|
44
|
-
dest.enablePageReloads;
|
|
45
|
-
/* eslint-enable no-unused-expressions */
|
|
46
|
-
}
|
|
47
|
-
static _addTest(testFile, src) {
|
|
48
|
-
const test = new test_1.default(testFile);
|
|
49
|
-
test(src.name, RawTestFileCompiler._createTestFn(src.commands));
|
|
50
|
-
RawTestFileCompiler._assignCommonTestingUnitProperties(src, test);
|
|
51
|
-
if (src.beforeCommands)
|
|
52
|
-
test.before(RawTestFileCompiler._createTestFn(src.beforeCommands));
|
|
53
|
-
if (src.afterCommands)
|
|
54
|
-
test.after(RawTestFileCompiler._createTestFn(src.afterCommands));
|
|
55
|
-
return test;
|
|
56
|
-
}
|
|
57
|
-
static _addFixture(testFile, src) {
|
|
58
|
-
const fixture = new fixture_1.default(testFile);
|
|
59
|
-
fixture(src.name);
|
|
60
|
-
RawTestFileCompiler._assignCommonTestingUnitProperties(src, fixture);
|
|
61
|
-
if (src.beforeEachCommands)
|
|
62
|
-
fixture.beforeEach(RawTestFileCompiler._createTestFn(src.beforeEachCommands));
|
|
63
|
-
if (src.afterEachCommands)
|
|
64
|
-
fixture.afterEach(RawTestFileCompiler._createTestFn(src.afterEachCommands));
|
|
65
|
-
src.tests.forEach(testSrc => RawTestFileCompiler._addTest(testFile, testSrc));
|
|
66
|
-
}
|
|
67
|
-
_hasTests() {
|
|
68
|
-
return true;
|
|
69
|
-
}
|
|
70
|
-
getSupportedExtension() {
|
|
71
|
-
return '.testcafe';
|
|
72
|
-
}
|
|
73
|
-
compile(code, filename) {
|
|
74
|
-
const testFile = new test_file_1.default(filename);
|
|
75
|
-
let data = null;
|
|
76
|
-
try {
|
|
77
|
-
data = JSON.parse(code);
|
|
78
|
-
data.fixtures.forEach(fixtureSrc => RawTestFileCompiler._addFixture(testFile, fixtureSrc));
|
|
79
|
-
return testFile.getTests();
|
|
80
|
-
}
|
|
81
|
-
catch (err) {
|
|
82
|
-
throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.cannotParseRawFile, filename, err.toString());
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
exports.default = RawTestFileCompiler;
|
|
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 base_1 = __importDefault(require("../base"));
|
|
7
|
+
const runtime_1 = require("../../../errors/runtime");
|
|
8
|
+
const types_1 = require("../../../errors/types");
|
|
9
|
+
const test_file_1 = __importDefault(require("../../../api/structure/test-file"));
|
|
10
|
+
const fixture_1 = __importDefault(require("../../../api/structure/fixture"));
|
|
11
|
+
const test_1 = __importDefault(require("../../../api/structure/test"));
|
|
12
|
+
const from_object_1 = __importDefault(require("../../../test-run/commands/from-object"));
|
|
13
|
+
const raw_command_callsite_record_1 = require("../../../utils/raw-command-callsite-record");
|
|
14
|
+
class RawTestFileCompiler extends base_1.default {
|
|
15
|
+
static _createTestFn(commands) {
|
|
16
|
+
return async (t) => {
|
|
17
|
+
var _a, _b;
|
|
18
|
+
for (let i = 0; i < commands.length; i++) {
|
|
19
|
+
const callsite = ((_a = commands[i]) === null || _a === void 0 ? void 0 : _a.id) ? new raw_command_callsite_record_1.RawCommandCallsiteRecord(commands[i].id, commands) : (_b = commands[i]) === null || _b === void 0 ? void 0 : _b.callsite;
|
|
20
|
+
try {
|
|
21
|
+
const command = from_object_1.default(commands[i], t.testRun);
|
|
22
|
+
await t.testRun.executeCommand(command, callsite);
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
err.callsite = callsite;
|
|
26
|
+
throw err;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
static _assignCommonTestingUnitProperties(src, dest) {
|
|
32
|
+
if (src.pageUrl)
|
|
33
|
+
dest.page(src.pageUrl);
|
|
34
|
+
if (src.authCredentials)
|
|
35
|
+
dest.httpAuth(src.authCredentials);
|
|
36
|
+
/* eslint-disable no-unused-expressions */
|
|
37
|
+
if (src.only)
|
|
38
|
+
dest.only;
|
|
39
|
+
if (src.skip)
|
|
40
|
+
dest.skip;
|
|
41
|
+
if (src.disablePageReloads)
|
|
42
|
+
dest.disablePageReloads;
|
|
43
|
+
if (src.enablePageReloads)
|
|
44
|
+
dest.enablePageReloads;
|
|
45
|
+
/* eslint-enable no-unused-expressions */
|
|
46
|
+
}
|
|
47
|
+
static _addTest(testFile, src) {
|
|
48
|
+
const test = new test_1.default(testFile);
|
|
49
|
+
test(src.name, RawTestFileCompiler._createTestFn(src.commands));
|
|
50
|
+
RawTestFileCompiler._assignCommonTestingUnitProperties(src, test);
|
|
51
|
+
if (src.beforeCommands)
|
|
52
|
+
test.before(RawTestFileCompiler._createTestFn(src.beforeCommands));
|
|
53
|
+
if (src.afterCommands)
|
|
54
|
+
test.after(RawTestFileCompiler._createTestFn(src.afterCommands));
|
|
55
|
+
return test;
|
|
56
|
+
}
|
|
57
|
+
static _addFixture(testFile, src) {
|
|
58
|
+
const fixture = new fixture_1.default(testFile);
|
|
59
|
+
fixture(src.name);
|
|
60
|
+
RawTestFileCompiler._assignCommonTestingUnitProperties(src, fixture);
|
|
61
|
+
if (src.beforeEachCommands)
|
|
62
|
+
fixture.beforeEach(RawTestFileCompiler._createTestFn(src.beforeEachCommands));
|
|
63
|
+
if (src.afterEachCommands)
|
|
64
|
+
fixture.afterEach(RawTestFileCompiler._createTestFn(src.afterEachCommands));
|
|
65
|
+
src.tests.forEach(testSrc => RawTestFileCompiler._addTest(testFile, testSrc));
|
|
66
|
+
}
|
|
67
|
+
_hasTests() {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
getSupportedExtension() {
|
|
71
|
+
return '.testcafe';
|
|
72
|
+
}
|
|
73
|
+
compile(code, filename) {
|
|
74
|
+
const testFile = new test_file_1.default(filename);
|
|
75
|
+
let data = null;
|
|
76
|
+
try {
|
|
77
|
+
data = JSON.parse(code);
|
|
78
|
+
data.fixtures.forEach(fixtureSrc => RawTestFileCompiler._addFixture(testFile, fixtureSrc));
|
|
79
|
+
return testFile.getTests();
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.cannotParseRawFile, filename, err.toString());
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
exports.default = RawTestFileCompiler;
|
|
87
87
|
module.exports = exports.default;
|
|
88
88
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGVyL3Rlc3QtZmlsZS9mb3JtYXRzL3Jhdy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1EQUEyQztBQUMzQyxxREFBdUQ7QUFDdkQsaURBQXVEO0FBQ3ZELGlGQUF3RDtBQUN4RCw2RUFBcUQ7QUFDckQsdUVBQStDO0FBQy9DLHlGQUE2RTtBQUM3RSw0RkFBc0Y7QUFFdEYsTUFBcUIsbUJBQW9CLFNBQVEsY0FBb0I7SUFDakUsTUFBTSxDQUFDLGFBQWEsQ0FBRSxRQUFRO1FBQzFCLE9BQU8sS0FBSyxFQUFDLENBQUMsRUFBQyxFQUFFOztZQUNiLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN0QyxNQUFNLFFBQVEsR0FBRyxPQUFBLFFBQVEsQ0FBQyxDQUFDLENBQUMsMENBQUUsRUFBRSxFQUFDLENBQUMsQ0FBQyxJQUFJLHNEQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsMENBQUUsUUFBUSxDQUFDO2dCQUVsSCxJQUFJO29CQUNBLE1BQU0sT0FBTyxHQUFHLHFCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBRWhFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2lCQUNyRDtnQkFDRCxPQUFPLEdBQUcsRUFBRTtvQkFDUixHQUFHLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztvQkFDeEIsTUFBTSxHQUFHLENBQUM7aUJBQ2I7YUFDSjtRQUNMLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRCxNQUFNLENB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RixPQUFPLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUM5QjtRQUNELE9BQU8sR0FBRyxFQUFFO1lBQ1IsTUFBTSxJQUFJLHNCQUFZLENBQUMsc0JBQWMsQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDdkY7SUFDTCxDQUFDO0NBQ0o7QUFqR0Qsc0NBaUdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlc3RGaWxlQ29tcGlsZXJCYXNlIGZyb20gJy4uL2Jhc2UnO1xuaW1wb3J0IHsgR2VuZXJhbEVycm9yIH0gZnJvbSAnLi4vLi4vLi4vZXJyb3JzL3J1bnRpbWUnO1xuaW1wb3J0IHsgUlVOVElNRV9FUlJPUlMgfSBmcm9tICcuLi8uLi8uLi9lcnJvcnMvdHlwZXMnO1xuaW1wb3J0IFRlc3RGaWxlIGZyb20gJy4uLy4uLy4uL2FwaS9zdHJ1Y3R1cmUvdGVzdC1maWxlJztcbmltcG9ydCBGaXh0dXJlIGZyb20gJy4uLy4uLy4uL2FwaS9zdHJ1Y3R1cmUvZml4dHVyZSc7XG5pbXBvcnQgVGVzdCBmcm9tICcuLi8uLi8uLi9hcGkvc3RydWN0dXJlL3Rlc3QnO1xuaW1wb3J0IGNyZWF0ZUNvbW1hbmRGcm9tT2JqZWN0IGZyb20gJy4uLy4uLy4uL3Rlc3QtcnVuL2NvbW1hbmRzL2Zyb20tb2JqZWN0JztcbmltcG9ydCB7IFJhd0NvbW1hbmRDYWxsc2l0ZVJlY29yZCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3Jhdy1jb21tYW5kLWNhbGxzaXRlLXJlY29yZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJhd1Rlc3RGaWxlQ29tcGlsZXIgZXh0ZW5kcyBUZXN0RmlsZUNvbXBpbGVyQmFzZSB7XG4gICAgc3RhdGljIF9jcmVhdGVUZXN0Rm4gKGNvbW1hbmRzKSB7XG4gICAgICAgIHJldHVybiBhc3luYyB0ID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWFuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYWxsc2l0ZSA9IGNvbW1hbmRzW2ldPy5pZCA/IG5ldyBSYXdDb21tYW5kQ2FsbHNpdGVSZWNvcmQoY29tbWFuZHNbaV0uaWQsIGNvbW1hbmRzKSA6IGNvbW1hbmRzW2ldPy5jYWxsc2l0ZTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1hbmQgPSBjcmVhdGVDb21tYW5kRnJvbU9iamVjdChjb21tYW5kc1tpXSwgdC50ZXN0UnVuKTtcblxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0LnRlc3RSdW4uZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCwgY2FsbHNpdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGVyci5jYWxsc2l0ZSA9IGNhbGxzaXRlO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHN0YXRpYyBfYXNzaWduQ29tbW9uVGVzdGluZ1VuaXRQcm9wZXJ0aWVzIChzcmMsIGRlc3QpIHtcbiAgICAgICAgaWYgKHNyYy5wYWdlVXJsKVxuICAgICAgICAgICAgZGVzdC5wYWdlKHNyYy5wYWdlVXJsKTtcblxuICAgICAgICBpZiAoc3JjLmF1dGhDcmVkZW50aWFscylcbiAgICAgICAgICAgIGRlc3QuaHR0cEF1dGgoc3JjLmF1dGhDcmVkZW50aWFscyk7XG5cbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4gICAgICAgIGlmIChzcmMub25seSlcbiAgICAgICAgICAgIGRlc3Qub25seTtcblxuICAgICAgICBpZiAoc3JjLnNraXApXG4gICAgICAgICAgICBkZXN0LnNraXA7XG5cbiAgICAgICAgaWYgKHNyYy5kaXNhYmxlUGFnZVJlbG9hZHMpXG4gICAgICAgICAgICBkZXN0LmRpc2FibGVQYWdlUmVsb2FkcztcblxuICAgICAgICBpZiAoc3JjLmVuYWJsZVBhZ2VSZWxvYWRzKVxuICAgICAgICAgICAgZGVzdC5lbmFibGVQYWdlUmVsb2FkcztcbiAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtZXhwcmVzc2lvbnMgKi9cbiAgICB9XG5cbiAgICBzdGF0aWMgX2FkZFRlc3QgKHRlc3RGaWxlLCBzcmMpIHtcbiAgICAgICAgY29uc3QgdGVzdCA9IG5ldyBUZXN0KHRlc3RGaWxlKTtcblxuICAgICAgICB0ZXN0KHNyYy5uYW1lLCBSYXdUZXN0RmlsZUNvbXBpbGVyLl9jcmVhdGVUZXN0Rm4oc3JjLmNvbW1hbmRzKSk7XG5cbiAgICAgICAgUmF3VGVzdEZpbGVDb21waWxlci5fYXNzaWduQ29tbW9uVGVzdGluZ1VuaXRQcm9wZXJ0aWVzKHNyYywgdGVzdCk7XG5cbiAgICAgICAgaWYgKHNyYy5iZWZvcmVDb21tYW5kcylcbiAgICAgICAgICAgIHRlc3QuYmVmb3JlKFJhd1Rlc3RGaWxlQ29tcGlsZXIuX2NyZWF0ZVRlc3RGbihzcmMuYmVmb3JlQ29tbWFuZHMpKTtcblxuICAgICAgICBpZiAoc3JjLmFmdGVyQ29tbWFuZHMpXG4gICAgICAgICAgICB0ZXN0LmFmdGVyKFJhd1Rlc3RGaWxlQ29tcGlsZXIuX2NyZWF0ZVRlc3RGbihzcmMuYWZ0ZXJDb21tYW5kcykpO1xuXG4gICAgICAgIHJldHVybiB0ZXN0O1xuICAgIH1cblxuICAgIHN0YXRpYyBfYWRkRml4dHVyZSAodGVzdEZpbGUsIHNyYykge1xuICAgICAgICBjb25zdCBmaXh0dXJlID0gbmV3IEZpeHR1cmUodGVzdEZpbGUpO1xuXG4gICAgICAgIGZpeHR1cmUoc3JjLm5hbWUpO1xuXG4gICAgICAgIFJhd1Rlc3RGaWxlQ29tcGlsZXIuX2Fzc2lnbkNvbW1vblRlc3RpbmdVbml0UHJvcGVydGllcyhzcmMsIGZpeHR1cmUpO1xuXG4gICAgICAgIGlmIChzcmMuYmVmb3JlRWFjaENvbW1hbmRzKVxuICAgICAgICAgICAgZml4dHVyZS5iZWZvcmVFYWNoKFJhd1Rlc3RGaWxlQ29tcGlsZXIuX2NyZWF0ZVRlc3RGbihzcmMuYmVmb3JlRWFjaENvbW1hbmRzKSk7XG5cbiAgICAgICAgaWYgKHNyYy5hZnRlckVhY2hDb21tYW5kcylcbiAgICAgICAgICAgIGZpeHR1cmUuYWZ0ZXJFYWNoKFJhd1Rlc3RGaWxlQ29tcGlsZXIuX2NyZWF0ZVRlc3RGbihzcmMuYWZ0ZXJFYWNoQ29tbWFuZHMpKTtcblxuICAgICAgICBzcmMudGVzdHMuZm9yRWFjaCh0ZXN0U3JjID0+IFJhd1Rlc3RGaWxlQ29tcGlsZXIuX2FkZFRlc3QodGVzdEZpbGUsIHRlc3RTcmMpKTtcbiAgICB9XG5cbiAgICBfaGFzVGVzdHMgKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXRTdXBwb3J0ZWRFeHRlbnNpb24gKCkge1xuICAgICAgICByZXR1cm4gJy50ZXN0Y2FmZSc7XG4gICAgfVxuXG4gICAgY29tcGlsZSAoY29kZSwgZmlsZW5hbWUpIHtcbiAgICAgICAgY29uc3QgdGVzdEZpbGUgPSBuZXcgVGVzdEZpbGUoZmlsZW5hbWUpO1xuXG4gICAgICAgIGxldCBkYXRhID0gbnVsbDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoY29kZSk7XG5cbiAgICAgICAgICAgIGRhdGEuZml4dHVyZXMuZm9yRWFjaChmaXh0dXJlU3JjID0+IFJhd1Rlc3RGaWxlQ29tcGlsZXIuX2FkZEZpeHR1cmUodGVzdEZpbGUsIGZpeHR1cmVTcmMpKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRlc3RGaWxlLmdldFRlc3RzKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5jYW5ub3RQYXJzZVJhd0ZpbGUsIGZpbGVuYW1lLCBlcnIudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
|