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, 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_ICON, { content: favIcon, contentType: content_types_1.default.icon });
|
54 | this.proxy.GET(INJECTABLES.TESTCAFE_UI_STYLES, {
|
55 | content: uiStyle,
|
56 | contentType: content_types_1.default.css,
|
57 | isShadowUIStylesheet: true
|
58 | });
|
59 | }
|
60 | _setupSourceMapsSupport() {
|
61 | sourceMapSupport.install({
|
62 | hookRequire: true,
|
63 | handleUncaughtExceptions: false,
|
64 | environment: 'node'
|
65 | });
|
66 | }
|
67 | _createRunner(isLiveMode) {
|
68 | const Ctor = isLiveMode ? LiveModeRunner : Runner;
|
69 | const newRunner = new Ctor(this.proxy, this.browserConnectionGateway, this.configuration.clone());
|
70 | this.runners.push(newRunner);
|
71 | return newRunner;
|
72 | }
|
73 | // API
|
74 | async createBrowserConnection() {
|
75 | const browserInfo = await browserProviderPool.getBrowserInfo('remote');
|
76 | return new BrowserConnection(this.browserConnectionGateway, browserInfo, true);
|
77 | }
|
78 | createRunner() {
|
79 | return this._createRunner(false);
|
80 | }
|
81 | createLiveModeRunner() {
|
82 | if (this.runners.some(runner => runner instanceof LiveModeRunner))
|
83 | throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.cannotCreateMultipleLiveModeRunners);
|
84 | return this._createRunner(true);
|
85 | }
|
86 | async close() {
|
87 | if (this.closed)
|
88 | return;
|
89 | this.closed = true;
|
90 | await Promise.all(this.runners.map(runner => runner.stop()));
|
91 | await browserProviderPool.dispose();
|
92 | this.browserConnectionGateway.close();
|
93 | this.proxy.close();
|
94 | }
|
95 | }
|
96 | exports.default = TestCafe;
|
97 | module.exports = exports.default;
|
98 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdGNhZmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdGVzdGNhZmUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsOENBQWdEO0FBQ2hELDBDQUFnRDtBQUNoRCwyRUFBbUQ7QUFDbkQsZ0ZBQXdEO0FBQ3hELGtFQUFvRDtBQUVwRCxNQUFNLFdBQVcsR0FBZ0IsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2pFLE1BQU0sZ0JBQWdCLEdBQVcsV0FBVyxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDbkUsTUFBTSxVQUFVLEdBQWlCLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBQ3BFLE1BQU0sVUFBVSxHQUFpQixXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDOUQsTUFBTSxhQUFhLEdBQWMsV0FBVyxDQUFDLHVCQUF1QixDQUFDLENBQUM7QUFDdEUsTUFBTSx3QkFBd0IsR0FBRyxXQUFXLENBQUMsOEJBQThCLENBQUMsQ0FBQztBQUM3RSxNQUFNLGlCQUFpQixHQUFVLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQ3JFLE1BQU0sbUJBQW1CLEdBQVEsV0FBVyxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDeEUsTUFBTSxNQUFNLEdBQXFCLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN6RCxNQUFNLGNBQWMsR0FBYSxXQUFXLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUVuRSxnRkFBZ0Y7QUFDaEYsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRXhCLE1BQXFCLFFBQVE7SUFDekIsWUFBYSxhQUFhO1FBQ3RCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQy9CLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBRXRDLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxhQUFhLENBQUMsWUFB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QUUsQ0FBQztRQUVwQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN2QixDQUFDO0NBQ0o7QUF4RkQsMkJBd0ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR2VuZXJhbEVycm9yIH0gZnJvbSAnLi9lcnJvcnMvcnVudGltZSc7XG5pbXBvcnQgeyBSVU5USU1FX0VSUk9SUyB9IGZyb20gJy4vZXJyb3JzL3R5cGVzJztcbmltcG9ydCBDT05URU5UX1RZUEVTIGZyb20gJy4vYXNzZXRzL2NvbnRlbnQtdHlwZXMnO1xuaW1wb3J0IE9QVElPTl9OQU1FUyBmcm9tICcuL2NvbmZpZ3VyYXRpb24vb3B0aW9uLW5hbWVzJztcbmltcG9ydCAqIGFzIElOSkVDVEFCTEVTIGZyb20gJy4vYXNzZXRzL2luamVjdGFibGVzJztcblxuY29uc3QgbGF6eVJlcXVpcmUgICAgICAgICAgICAgID0gcmVxdWlyZSgnaW1wb3J0LWxhenknKShyZXF1aXJlKTtcbmNvbnN0IHNvdXJjZU1hcFN1cHBvcnQgICAgICAgICA9IGxhenlSZXF1aXJlKCdzb3VyY2UtbWFwLXN1cHBvcnQnKTtcbmNvbnN0IGhhbW1lcmhlYWQgICAgICAgICAgICAgICA9IGxhenlSZXF1aXJlKCd0ZXN0Y2FmZS1oYW1tZXJoZWFkJyk7XG5jb25zdCBsb2FkQXNzZXRzICAgICAgICAgICAgICAgPSBsYXp5UmVxdWlyZSgnLi9sb2FkLWFzc2V0cycpO1xuY29uc3QgZXJyb3JIYW5kbGVycyAgICAgICAgICAgID0gbGF6eVJlcXVpcmUoJy4vdXRpbHMvaGFuZGxlLWVycm9ycycpO1xuY29uc3QgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5ID0gbGF6eVJlcXVpcmUoJy4vYnJvd3Nlci9jb25uZWN0aW9uL2dhdGV3YXknKTtcbmNvbnN0IEJyb3dzZXJDb25uZWN0aW9uICAgICAgICA9IGxhenlSZXF1aXJlKCcuL2Jyb3dzZXIvY29ubmVjdGlvbicpO1xuY29uc3QgYnJvd3NlclByb3ZpZGVyUG9vbCAgICAgID0gbGF6eVJlcXVpcmUoJy4vYnJvd3Nlci9wcm92aWRlci9wb29sJyk7XG5jb25zdCBSdW5uZXIgICAgICAgICAgICAgICAgICAgPSBsYXp5UmVxdWlyZSgnLi9ydW5uZXInKTtcbmNvbnN0IExpdmVNb2RlUnVubmVyICAgICAgICAgICA9IGxhenlSZXF1aXJlKCcuL2xpdmUvdGVzdC1ydW5uZXInKTtcblxuLy8gTk9URTogQ29mZmVlU2NyaXB0IGNhbid0IGJlIGxvYWRlZCBsYXppbHksIGJlY2F1c2UgaXQgd2lsbCBicmVhayBzdGFjayB0cmFjZXNcbnJlcXVpcmUoJ2NvZmZlZXNjcmlwdCcpO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZXN0Q2FmZSB7XG4gICAgY29uc3RydWN0b3IgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgdGhpcy5fc2V0dXBTb3VyY2VNYXBzU3VwcG9ydCgpO1xuICAgICAgICBlcnJvckhhbmRsZXJzLnJlZ2lzdGVyRXJyb3JIYW5kbGVycygpO1xuXG4gICAgICAgIGNvbnN0IHsgaG9zdG5hbWUsIHBvcnQxLCBwb3J0Miwgb3B0aW9ucyB9ID0gY29uZmlndXJhdGlvbi5zdGFydE9wdGlvbnM7XG5cbiAgICAgICAgdGhpcy5jbG9zZWQgICAgICAgICAgICAgICAgICAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wcm94eSAgICAgICAgICAgICAgICAgICAgPSBuZXcgaGFtbWVyaGVhZC5Qcm94eShob3N0bmFtZSwgcG9ydDEsIHBvcnQyLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5icm93c2VyQ29ubmVjdGlvbkdhdGV3YXkgPSBuZXcgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5KHRoaXMucHJveHksIHsgcmV0cnlUZXN0UGFnZXM6IGNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5yZXRyeVRlc3RQYWdlcykgfSk7XG4gICAgICAgIHRoaXMucnVubmVycyAgICAgICAgICAgICAgICAgID0gW107XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiAgICAgICAgICAgID0gY29uZmlndXJhdGlvbjtcblxuICAgICAgICB0aGlzLl9yZWdpc3RlckFzc2V0cyhvcHRpb25zLmRldmVsb3BtZW50TW9kZSk7XG4gICAgfVxuXG4gICAgX3JlZ2lzdGVyQXNzZXRzIChkZXZlbG9wbWVudE1vZGUpIHtcbiAgICAgICAgY29uc3QgeyBmYXZJY29uLCBjb3JlU2NyaXB0LCBkcml2ZXJTY3JpcHQsIHVpU2NyaXB0LFxuICAgICAgICAgICAgdWlTdHlsZSwgdWlTcHJpdGUsIGF1dG9tYXRpb25TY3JpcHQsIGxlZ2FjeVJ1bm5lclNjcmlwdCB9ID0gbG9hZEFzc2V0cyhkZXZlbG9wbWVudE1vZGUpO1xuXG4gICAgICAgIHRoaXMucHJveHkuR0VUKElOSkVDVEFCTEVTLlRFU1RDQUZFX0NPUkUsIHsgY29udGVudDogY29yZVNjcmlwdCwgY29udGVudFR5cGU6IENPTlRFTlRfVFlQRVMuamF2YXNjcmlwdCB9KTtcbiAgICAgICAgdGhpcy5wcm94eS5HRVQoSU5KRUNUQUJMRVMuVEVTVENBRkVfRFJJVkVSLCB7IGNvbnRlbnQ6IGRyaXZlclNjcmlwdCwgY29udGVudFR5cGU6IENPTlRFTlRfVFlQRVMuamF2YXNjcmlwdCB9KTtcblxuICAgICAgICB0aGlzLnByb3h5LkdFVChJTkpFQ1RBQkxFUy5URVNUQ0FGRV9MRUdBQ1lfUlVOTkVSLCB7XG4gICAgICAgICAgICBjb250ZW50OiAgICAgbGVnYWN5UnVubmVyU2NyaXB0LFxuICAgICAgICAgICAgY29udGVudFR5cGU6IENPTlRFTlRfVFlQRVMuamF2YXNjcmlwdFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnByb3h5LkdFVChJTkpFQ1RBQkxFUy5URVNUQ0FGRV9BVVRPTUFUSU9OLCB7IGNvbnRlbnQ6IGF1dG9tYXRpb25TY3JpcHQsIGNvbnRlbnRUeXBlOiBDT05URU5UX1RZUEVTLmphdmFzY3JpcHQgfSk7XG4gICAgICAgIHRoaXMucHJveHkuR0VUKElOSkVDVEFCTEVTLlRFU1RDQUZFX1VJLCB7IGNvbnRlbnQ6IHVpU2NyaXB0LCBjb250ZW50VHlwZTogQ09OVEVOVF9UWVBFUy5qYXZhc2NyaXB0IH0pO1xuICAgICAgICB0aGlzLnByb3h5LkdFVChJTkpFQ1RBQkxFUy5URVNUQ0FGRV9VSV9TUFJJVEUsIHsgY29udGVudDogdWlTcHJpdGUsIGNvbnRlbnRUeXBlOiBDT05URU5UX1RZUEVTLnBuZyB9KTtcbiAgICAgICAgdGhpcy5wcm94eS5HRVQoSU5KRUNUQUJMRVMuVEVTVENBRkVfSUNPTiwgeyBjb250ZW50OiBmYXZJY29uLCBjb250ZW50VHlwZTogQ09OVEVOVF9UWVBFUy5pY29uIH0pO1xuXG4gICAgICAgIHRoaXMucHJveHkuR0VUKElOSkVDVEFCTEVTLlRFU1RDQUZFX1VJX1NUWUxFUywge1xuICAgICAgICAgICAgY29udGVudDogICAgICAgICAgICAgIHVpU3R5bGUsXG4gICAgICAgICAgICBjb250ZW50VHlwZTogICAgICAgICAgQ09OVEVOVF9UWVBFUy5jc3MsXG4gICAgICAgICAgICBpc1NoYWRvd1VJU3R5bGVzaGVldDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfc2V0dXBTb3VyY2VNYXBzU3VwcG9ydCAoKSB7XG4gICAgICAgIHNvdXJjZU1hcFN1cHBvcnQuaW5zdGFsbCh7XG4gICAgICAgICAgICBob29rUmVxdWlyZTogICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICBoYW5kbGVVbmNhdWdodEV4Y2VwdGlvbnM6IGZhbHNlLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6ICAgICAgICAgICAgICAnbm9kZSdcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZVJ1bm5lciAoaXNMaXZlTW9kZSkge1xuICAgICAgICBjb25zdCBDdG9yICAgICAgPSBpc0xpdmVNb2RlID8gTGl2ZU1vZGVSdW5uZXIgOiBSdW5uZXI7XG4gICAgICAgIGNvbnN0IG5ld1J1bm5lciA9IG5ldyBDdG9yKHRoaXMucHJveHksIHRoaXMuYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LCB0aGlzLmNvbmZpZ3VyYXRpb24uY2xvbmUoKSk7XG5cbiAgICAgICAgdGhpcy5ydW5uZXJzLnB1c2gobmV3UnVubmVyKTtcblxuICAgICAgICByZXR1cm4gbmV3UnVubmVyO1xuICAgIH1cblxuICAgIC8vIEFQSVxuICAgIGFzeW5jIGNyZWF0ZUJyb3dzZXJDb25uZWN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnJvd3NlckluZm8gPSBhd2FpdCBicm93c2VyUHJvdmlkZXJQb29sLmdldEJyb3dzZXJJbmZvKCdyZW1vdGUnKTtcblxuICAgICAgICByZXR1cm4gbmV3IEJyb3dzZXJDb25uZWN0aW9uKHRoaXMuYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LCBicm93c2VySW5mbywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgY3JlYXRlUnVubmVyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVJ1bm5lcihmYWxzZSk7XG4gICAgfVxuXG4gICAgY3JlYXRlTGl2ZU1vZGVSdW5uZXIgKCkge1xuICAgICAgICBpZiAodGhpcy5ydW5uZXJzLnNvbWUocnVubmVyID0+IHJ1bm5lciBpbnN0YW5jZW9mIExpdmVNb2RlUnVubmVyKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMuY2Fubm90Q3JlYXRlTXVsdGlwbGVMaXZlTW9kZVJ1bm5lcnMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVSdW5uZXIodHJ1ZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgY2xvc2UgKCkge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMucnVubmVycy5tYXAocnVubmVyID0+IHJ1bm5lci5zdG9wKCkpKTtcblxuICAgICAgICBhd2FpdCBicm93c2VyUHJvdmlkZXJQb29sLmRpc3Bvc2UoKTtcblxuICAgICAgICB0aGlzLmJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5jbG9zZSgpO1xuICAgICAgICB0aGlzLnByb3h5LmNsb3NlKCk7XG4gICAgfVxufVxuIl19 |
\ | No newline at end of file |