1 | ;
|
2 | var __importDefault = (this && this.__importDefault) || function (mod) {
|
3 | return (mod && mod.__esModule) ? mod : { "default": mod };
|
4 | };
|
5 | var __importStar = (this && this.__importStar) || function (mod) {
|
6 | if (mod && mod.__esModule) return mod;
|
7 | var result = {};
|
8 | if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
9 | result["default"] = mod;
|
10 | return result;
|
11 | };
|
12 | Object.defineProperty(exports, "__esModule", { value: true });
|
13 | const runtime_1 = require("./errors/runtime");
|
14 | const types_1 = require("./errors/types");
|
15 | const content_types_1 = __importDefault(require("./assets/content-types"));
|
16 | const option_names_1 = __importDefault(require("./configuration/option-names"));
|
17 | const INJECTABLES = __importStar(require("./assets/injectables"));
|
18 | const lazyRequire = require('import-lazy')(require);
|
19 | const sourceMapSupport = lazyRequire('source-map-support');
|
20 | const hammerhead = lazyRequire('testcafe-hammerhead');
|
21 | const loadAssets = lazyRequire('./load-assets');
|
22 | const errorHandlers = lazyRequire('./utils/handle-errors');
|
23 | const BrowserConnectionGateway = lazyRequire('./browser/connection/gateway');
|
24 | const BrowserConnection = lazyRequire('./browser/connection');
|
25 | const browserProviderPool = lazyRequire('./browser/provider/pool');
|
26 | const Runner = lazyRequire('./runner');
|
27 | const LiveModeRunner = lazyRequire('./live/test-runner');
|
28 | // NOTE: CoffeeScript can't be loaded lazily, because it will break stack traces
|
29 | require('coffeescript');
|
30 | class TestCafe {
|
31 | constructor(configuration) {
|
32 | this._setupSourceMapsSupport();
|
33 | errorHandlers.registerErrorHandlers();
|
34 | const { hostname, port1, port2, options } = configuration.startOptions;
|
35 | this.closed = false;
|
36 | this.proxy = new hammerhead.Proxy(hostname, port1, port2, options);
|
37 | this.browserConnectionGateway = new BrowserConnectionGateway(this.proxy, { retryTestPages: configuration.getOption(option_names_1.default.retryTestPages) });
|
38 | this.runners = [];
|
39 | this.configuration = configuration;
|
40 | this._registerAssets(options.developmentMode);
|
41 | }
|
42 | _registerAssets(developmentMode) {
|
43 | const { favIcon, coreScript, driverScript, uiScript, uiStyle, uiSprite, uiSpriteSvg, automationScript, legacyRunnerScript } = loadAssets(developmentMode);
|
44 | this.proxy.GET(INJECTABLES.TESTCAFE_CORE, { content: coreScript, contentType: content_types_1.default.javascript });
|
45 | this.proxy.GET(INJECTABLES.TESTCAFE_DRIVER, { content: driverScript, contentType: content_types_1.default.javascript });
|
46 | this.proxy.GET(INJECTABLES.TESTCAFE_LEGACY_RUNNER, {
|
47 | content: legacyRunnerScript,
|
48 | contentType: content_types_1.default.javascript
|
49 | });
|
50 | this.proxy.GET(INJECTABLES.TESTCAFE_AUTOMATION, { content: automationScript, contentType: content_types_1.default.javascript });
|
51 | this.proxy.GET(INJECTABLES.TESTCAFE_UI, { content: uiScript, contentType: content_types_1.default.javascript });
|
52 | this.proxy.GET(INJECTABLES.TESTCAFE_UI_SPRITE, { content: uiSprite, contentType: content_types_1.default.png });
|
53 | this.proxy.GET(INJECTABLES.TESTCAFE_UI_SPRITE_SVG, { content: uiSpriteSvg, contentType: content_types_1.default.svg });
|
54 | this.proxy.GET(INJECTABLES.TESTCAFE_ICON, { content: favIcon, contentType: content_types_1.default.icon });
|
55 | this.proxy.GET(INJECTABLES.TESTCAFE_UI_STYLES, {
|
56 | content: uiStyle,
|
57 | contentType: content_types_1.default.css,
|
58 | isShadowUIStylesheet: true
|
59 | });
|
60 | }
|
61 | _setupSourceMapsSupport() {
|
62 | sourceMapSupport.install({
|
63 | hookRequire: true,
|
64 | handleUncaughtExceptions: false,
|
65 | environment: 'node'
|
66 | });
|
67 | }
|
68 | _createRunner(isLiveMode) {
|
69 | const Ctor = isLiveMode ? LiveModeRunner : Runner;
|
70 | const newRunner = new Ctor(this.proxy, this.browserConnectionGateway, this.configuration.clone());
|
71 | this.runners.push(newRunner);
|
72 | return newRunner;
|
73 | }
|
74 | // API
|
75 | async createBrowserConnection() {
|
76 | const browserInfo = await browserProviderPool.getBrowserInfo('remote');
|
77 | return new BrowserConnection(this.browserConnectionGateway, browserInfo, true);
|
78 | }
|
79 | createRunner() {
|
80 | return this._createRunner(false);
|
81 | }
|
82 | createLiveModeRunner() {
|
83 | if (this.runners.some(runner => runner instanceof LiveModeRunner))
|
84 | throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.cannotCreateMultipleLiveModeRunners);
|
85 | return this._createRunner(true);
|
86 | }
|
87 | async close() {
|
88 | if (this.closed)
|
89 | return;
|
90 | this.closed = true;
|
91 | await Promise.all(this.runners.map(runner => runner.stop()));
|
92 | await browserProviderPool.dispose();
|
93 | this.browserConnectionGateway.close();
|
94 | this.proxy.close();
|
95 | }
|
96 | }
|
97 | exports.default = TestCafe;
|
98 | module.exports = exports.default;
|
99 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdGNhZmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdGVzdGNhZmUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsOENBQWdEO0FBQ2hELDBDQUFnRDtBQUNoRCwyRUFBbUQ7QUFDbkQsZ0ZBQXdEO0FBQ3hELGtFQUFvRDtBQUVwRCxNQUFNLFdBQVcsR0FBZ0IsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2pFLE1BQU0sZ0JBQWdCLEdBQVcsV0FBVyxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDbkUsTUFBTSxVQUFVLEdBQWlCLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBQ3BFLE1BQU0sVUFBVSxHQUFpQixXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDOUQsTUFBTSxhQUFhLEdBQWMsV0FBVyxDQUFDLHVCQUF1QixDQUFDLENBQUM7QUFDdEUsTUFBTSx3QkFBd0IsR0FBRyxXQUFXLENBQUMsOEJBQThCLENBQUMsQ0FBQztBQUM3RSxNQUFNLGlCQUFpQixHQUFVLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQ3JFLE1BQU0sbUJBQW1CLEdBQVEsV0FBVyxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDeEUsTUFBTSxNQUFNLEdBQXFCLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN6RCxNQUFNLGNBQWMsR0FBYSxXQUFXLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUVuRSxnRkFBZ0Y7QUFDaEYsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRXhCLE1BQXFCLFFBQVE7SUFDekIsWUFBYSxhQUFhO1FBQ3RCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQy9CLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBRXRDLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxhQUFhLENBQUMsWUFB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QUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUU3RCxNQUFNLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRXBDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3ZCLENBQUM7Q0FDSjtBQXpGRCwyQkF5RkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHZW5lcmFsRXJyb3IgfSBmcm9tICcuL2Vycm9ycy9ydW50aW1lJztcbmltcG9ydCB7IFJVTlRJTUVfRVJST1JTIH0gZnJvbSAnLi9lcnJvcnMvdHlwZXMnO1xuaW1wb3J0IENPTlRFTlRfVFlQRVMgZnJvbSAnLi9hc3NldHMvY29udGVudC10eXBlcyc7XG5pbXBvcnQgT1BUSU9OX05BTUVTIGZyb20gJy4vY29uZmlndXJhdGlvbi9vcHRpb24tbmFtZXMnO1xuaW1wb3J0ICogYXMgSU5KRUNUQUJMRVMgZnJvbSAnLi9hc3NldHMvaW5qZWN0YWJsZXMnO1xuXG5jb25zdCBsYXp5UmVxdWlyZSAgICAgICAgICAgICAgPSByZXF1aXJlKCdpbXBvcnQtbGF6eScpKHJlcXVpcmUpO1xuY29uc3Qgc291cmNlTWFwU3VwcG9ydCAgICAgICAgID0gbGF6eVJlcXVpcmUoJ3NvdXJjZS1tYXAtc3VwcG9ydCcpO1xuY29uc3QgaGFtbWVyaGVhZCAgICAgICAgICAgICAgID0gbGF6eVJlcXVpcmUoJ3Rlc3RjYWZlLWhhbW1lcmhlYWQnKTtcbmNvbnN0IGxvYWRBc3NldHMgICAgICAgICAgICAgICA9IGxhenlSZXF1aXJlKCcuL2xvYWQtYXNzZXRzJyk7XG5jb25zdCBlcnJvckhhbmRsZXJzICAgICAgICAgICAgPSBsYXp5UmVxdWlyZSgnLi91dGlscy9oYW5kbGUtZXJyb3JzJyk7XG5jb25zdCBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkgPSBsYXp5UmVxdWlyZSgnLi9icm93c2VyL2Nvbm5lY3Rpb24vZ2F0ZXdheScpO1xuY29uc3QgQnJvd3NlckNvbm5lY3Rpb24gICAgICAgID0gbGF6eVJlcXVpcmUoJy4vYnJvd3Nlci9jb25uZWN0aW9uJyk7XG5jb25zdCBicm93c2VyUHJvdmlkZXJQb29sICAgICAgPSBsYXp5UmVxdWlyZSgnLi9icm93c2VyL3Byb3ZpZGVyL3Bvb2wnKTtcbmNvbnN0IFJ1bm5lciAgICAgICAgICAgICAgICAgICA9IGxhenlSZXF1aXJlKCcuL3J1bm5lcicpO1xuY29uc3QgTGl2ZU1vZGVSdW5uZXIgICAgICAgICAgID0gbGF6eVJlcXVpcmUoJy4vbGl2ZS90ZXN0LXJ1bm5lcicpO1xuXG4vLyBOT1RFOiBDb2ZmZWVTY3JpcHQgY2FuJ3QgYmUgbG9hZGVkIGxhemlseSwgYmVjYXVzZSBpdCB3aWxsIGJyZWFrIHN0YWNrIHRyYWNlc1xucmVxdWlyZSgnY29mZmVlc2NyaXB0Jyk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlc3RDYWZlIHtcbiAgICBjb25zdHJ1Y3RvciAoY29uZmlndXJhdGlvbikge1xuICAgICAgICB0aGlzLl9zZXR1cFNvdXJjZU1hcHNTdXBwb3J0KCk7XG4gICAgICAgIGVycm9ySGFuZGxlcnMucmVnaXN0ZXJFcnJvckhhbmRsZXJzKCk7XG5cbiAgICAgICAgY29uc3QgeyBob3N0bmFtZSwgcG9ydDEsIHBvcnQyLCBvcHRpb25zIH0gPSBjb25maWd1cmF0aW9uLnN0YXJ0T3B0aW9ucztcblxuICAgICAgICB0aGlzLmNsb3NlZCAgICAgICAgICAgICAgICAgICA9IGZhbHNlO1xuICAgICAgICB0aGlzLnByb3h5ICAgICAgICAgICAgICAgICAgICA9IG5ldyBoYW1tZXJoZWFkLlByb3h5KGhvc3RuYW1lLCBwb3J0MSwgcG9ydDIsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheSA9IG5ldyBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkodGhpcy5wcm94eSwgeyByZXRyeVRlc3RQYWdlczogY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLnJldHJ5VGVzdFBhZ2VzKSB9KTtcbiAgICAgICAgdGhpcy5ydW5uZXJzICAgICAgICAgICAgICAgICAgPSBbXTtcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uICAgICAgICAgICAgPSBjb25maWd1cmF0aW9uO1xuXG4gICAgICAgIHRoaXMuX3JlZ2lzdGVyQXNzZXRzKG9wdGlvbnMuZGV2ZWxvcG1lbnRNb2RlKTtcbiAgICB9XG5cbiAgICBfcmVnaXN0ZXJBc3NldHMgKGRldmVsb3BtZW50TW9kZSkge1xuICAgICAgICBjb25zdCB7IGZhdkljb24sIGNvcmVTY3JpcHQsIGRyaXZlclNjcmlwdCwgdWlTY3JpcHQsXG4gICAgICAgICAgICB1aVN0eWxlLCB1aVNwcml0ZSwgdWlTcHJpdGVTdmcsIGF1dG9tYXRpb25TY3JpcHQsIGxlZ2FjeVJ1bm5lclNjcmlwdCB9ID0gbG9hZEFzc2V0cyhkZXZlbG9wbWVudE1vZGUpO1xuXG4gICAgICAgIHRoaXMucHJveHkuR0VUKElOSkVDVEFCTEVTLlRFU1RDQUZFX0NPUkUsIHsgY29udGVudDogY29yZVNjcmlwdCwgY29udGVudFR5cGU6IENPTlRFTlRfVFlQRVMuamF2YXNjcmlwdCB9KTtcbiAgICAgICAgdGhpcy5wcm94eS5HRVQoSU5KRUNUQUJMRVMuVEVTVENBRkVfRFJJVkVSLCB7IGNvbnRlbnQ6IGRyaXZlclNjcmlwdCwgY29udGVudFR5cGU6IENPTlRFTlRfVFlQRVMuamF2YXNjcmlwdCB9KTtcblxuICAgICAgICB0aGlzLnByb3h5LkdFVChJTkpFQ1RBQkxFUy5URVNUQ0FGRV9MRUdBQ1lfUlVOTkVSLCB7XG4gICAgICAgICAgICBjb250ZW50OiAgICAgbGVnYWN5UnVubmVyU2NyaXB0LFxuICAgICAgICAgICAgY29udGVudFR5cGU6IENPTlRFTlRfVFlQRVMuamF2YXNjcmlwdFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnByb3h5LkdFVChJTkpFQ1RBQkxFUy5URVNUQ0FGRV9BVVRPTUFUSU9OLCB7IGNvbnRlbnQ6IGF1dG9tYXRpb25TY3JpcHQsIGNvbnRlbnRUeXBlOiBDT05URU5UX1RZUEVTLmphdmFzY3JpcHQgfSk7XG4gICAgICAgIHRoaXMucHJveHkuR0VUKElOSkVDVEFCTEVTLlRFU1RDQUZFX1VJLCB7IGNvbnRlbnQ6IHVpU2NyaXB0LCBjb250ZW50VHlwZTogQ09OVEVOVF9UWVBFUy5qYXZhc2NyaXB0IH0pO1xuICAgICAgICB0aGlzLnByb3h5LkdFVChJTkpFQ1RBQkxFUy5URVNUQ0FGRV9VSV9TUFJJVEUsIHsgY29udGVudDogdWlTcHJpdGUsIGNvbnRlbnRUeXBlOiBDT05URU5UX1RZUEVTLnBuZyB9KTtcbiAgICAgICAgdGhpcy5wcm94eS5HRVQoSU5KRUNUQUJMRVMuVEVTVENBRkVfVUlfU1BSSVRFX1NWRywgeyBjb250ZW50OiB1aVNwcml0ZVN2ZywgY29udGVudFR5cGU6IENPTlRFTlRfVFlQRVMuc3ZnIH0pO1xuICAgICAgICB0aGlzLnByb3h5LkdFVChJTkpFQ1RBQkxFUy5URVNUQ0FGRV9JQ09OLCB7IGNvbnRlbnQ6IGZhdkljb24sIGNvbnRlbnRUeXBlOiBDT05URU5UX1RZUEVTLmljb24gfSk7XG5cbiAgICAgICAgdGhpcy5wcm94eS5HRVQoSU5KRUNUQUJMRVMuVEVTVENBRkVfVUlfU1RZTEVTLCB7XG4gICAgICAgICAgICBjb250ZW50OiAgICAgICAgICAgICAgdWlTdHlsZSxcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiAgICAgICAgICBDT05URU5UX1RZUEVTLmNzcyxcbiAgICAgICAgICAgIGlzU2hhZG93VUlTdHlsZXNoZWV0OiB0cnVlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9zZXR1cFNvdXJjZU1hcHNTdXBwb3J0ICgpIHtcbiAgICAgICAgc291cmNlTWFwU3VwcG9ydC5pbnN0YWxsKHtcbiAgICAgICAgICAgIGhvb2tSZXF1aXJlOiAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIGhhbmRsZVVuY2F1Z2h0RXhjZXB0aW9uczogZmFsc2UsXG4gICAgICAgICAgICBlbnZpcm9ubWVudDogICAgICAgICAgICAgICdub2RlJ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfY3JlYXRlUnVubmVyIChpc0xpdmVNb2RlKSB7XG4gICAgICAgIGNvbnN0IEN0b3IgICAgICA9IGlzTGl2ZU1vZGUgPyBMaXZlTW9kZVJ1bm5lciA6IFJ1bm5lcjtcbiAgICAgICAgY29uc3QgbmV3UnVubmVyID0gbmV3IEN0b3IodGhpcy5wcm94eSwgdGhpcy5icm93c2VyQ29ubmVjdGlvbkdhdGV3YXksIHRoaXMuY29uZmlndXJhdGlvbi5jbG9uZSgpKTtcblxuICAgICAgICB0aGlzLnJ1bm5lcnMucHVzaChuZXdSdW5uZXIpO1xuXG4gICAgICAgIHJldHVybiBuZXdSdW5uZXI7XG4gICAgfVxuXG4gICAgLy8gQVBJXG4gICAgYXN5bmMgY3JlYXRlQnJvd3NlckNvbm5lY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBicm93c2VySW5mbyA9IGF3YWl0IGJyb3dzZXJQcm92aWRlclBvb2wuZ2V0QnJvd3NlckluZm8oJ3JlbW90ZScpO1xuXG4gICAgICAgIHJldHVybiBuZXcgQnJvd3NlckNvbm5lY3Rpb24odGhpcy5icm93c2VyQ29ubmVjdGlvbkdhdGV3YXksIGJyb3dzZXJJbmZvLCB0cnVlKTtcbiAgICB9XG5cbiAgICBjcmVhdGVSdW5uZXIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlUnVubmVyKGZhbHNlKTtcbiAgICB9XG5cbiAgICBjcmVhdGVMaXZlTW9kZVJ1bm5lciAoKSB7XG4gICAgICAgIGlmICh0aGlzLnJ1bm5lcnMuc29tZShydW5uZXIgPT4gcnVubmVyIGluc3RhbmNlb2YgTGl2ZU1vZGVSdW5uZXIpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5jYW5ub3RDcmVhdGVNdWx0aXBsZUxpdmVNb2RlUnVubmVycyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVJ1bm5lcih0cnVlKTtcbiAgICB9XG5cbiAgICBhc3luYyBjbG9zZSAoKSB7XG4gICAgICAgIGlmICh0aGlzLmNsb3NlZClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5ydW5uZXJzLm1hcChydW5uZXIgPT4gcnVubmVyLnN0b3AoKSkpO1xuXG4gICAgICAgIGF3YWl0IGJyb3dzZXJQcm92aWRlclBvb2wuZGlzcG9zZSgpO1xuXG4gICAgICAgIHRoaXMuYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LmNsb3NlKCk7XG4gICAgICAgIHRoaXMucHJveHkuY2xvc2UoKTtcbiAgICB9XG59XG4iXX0= |
\ | No newline at end of file |