Skip to content

Commit 246b649

Browse files
authored
Merge branch 'master' into feat/add-dtl
2 parents 6d43647 + 501f4d8 commit 246b649

File tree

39 files changed

+423
-173
lines changed

39 files changed

+423
-173
lines changed

.github/workflows/collect-deps.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313

1414
strategy:
1515
matrix:
16-
os: [ubuntu-20.04, ubuntu-22.04, ubuntu-24.04]
16+
os: [ubuntu-22.04, ubuntu-24.04]
1717
steps:
1818
- name: Checkout repository
1919
uses: actions/checkout@v2

package-lock.json

Lines changed: 3 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@
7575
"@testplane/wdio-utils": "9.5.3",
7676
"@testplane/webdriverio": "9.5.20",
7777
"@vitest/spy": "2.1.4",
78-
"bluebird": "3.5.1",
7978
"chalk": "2.4.2",
8079
"clear-require": "1.0.1",
8180
"cli-progress": "3.12.0",
@@ -129,7 +128,6 @@
129128
"@testplane/wdio-types": "9.5.2",
130129
"@types/babel__code-frame": "7.0.6",
131130
"@types/babel__core": "7.20.5",
132-
"@types/bluebird": "3.5.38",
133131
"@types/browserify": "12.0.40",
134132
"@types/chai": "4.3.4",
135133
"@types/chai-as-promised": "7.1.5",

src/browser-installer/ubuntu-packages/collect-dependencies/cache/autogenerated/processed-browsers-linux.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
"136",
4141
"137",
4242
"138",
43+
"139",
4344
"73",
4445
"74",
4546
"75",
@@ -109,6 +110,7 @@
109110
"136",
110111
"137",
111112
"138",
113+
"139",
112114
"57",
113115
"58",
114116
"59",

src/browser/commands/assert-view/capture-processors/assert-refs.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
"use strict";
22

3-
const Promise = require("bluebird");
43
const { ImageDiffError } = require("../errors/image-diff-error");
54
const { NoRefImageError } = require("../errors/no-ref-image-error");
65
const { InvalidRefImageError } = require("../errors/invalid-ref-image-error");

src/browser/commands/assert-view/index.js

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
const fs = require("fs-extra");
44
const path = require("path");
55
const _ = require("lodash");
6-
const Promise = require("bluebird");
76
const { pngValidator: validatePng } = require("png-validator");
87
const { Image } = require("../../../image");
98
const ScreenShooter = require("../../screen-shooter");
@@ -159,16 +158,18 @@ module.exports.default = browser => {
159158
};
160159

161160
const waitSelectorsForExist = async (browser, selectors) => {
162-
await Promise.map([].concat(selectors), async selector => {
163-
await browser
164-
.$(selector)
165-
.then(el => el.waitForExist())
166-
.catch(() => {
167-
throw new Error(
168-
`element ("${selector}") still not existing after ${browser.options.waitforTimeout} ms`,
169-
);
170-
});
171-
});
161+
await Promise.all(
162+
[].concat(selectors).map(selector =>
163+
browser
164+
.$(selector)
165+
.then(el => el.waitForExist())
166+
.catch(() => {
167+
throw new Error(
168+
`element ("${selector}") still not existing after ${browser.options.waitforTimeout} ms`,
169+
);
170+
}),
171+
),
172+
);
172173
};
173174

174175
const assertViewBySelector = async (browser, state, selectors, opts) => {

src/events/async-emitter/index.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
import { EventEmitter } from "events";
2-
import BluebirdPromise from "bluebird";
2+
import { promiseMethod } from "../../utils/promise";
33

44
export class AsyncEmitter extends EventEmitter {
55
async emitAndWait(event: string | symbol, ...args: unknown[]): Promise<unknown[]> {
66
const results = await Promise.allSettled(
7-
this.listeners(event).map(l =>
8-
BluebirdPromise.method(l as (...args: unknown[]) => unknown).apply(this, args as []),
9-
),
7+
this.listeners(event).map(l => promiseMethod(l as (...args: unknown[]) => unknown).apply(this, args as [])),
108
);
119

1210
const rejected = results.find(({ status }) => status === "rejected");

src/utils/promise.ts

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
export function promiseMethod<T, ThisArg = unknown, Args extends unknown[] = unknown[]>(
2+
fn: (this: ThisArg, ...args: Args) => T,
3+
): (this: ThisArg, ...args: Args) => Promise<T> {
4+
return function (this: ThisArg, ...args: Args): Promise<T> {
5+
try {
6+
const result = fn.apply(this, args);
7+
return Promise.resolve(result);
8+
} catch (err) {
9+
return Promise.reject(err);
10+
}
11+
};
12+
}
13+
14+
export function promiseTimeout<T>(promise: Promise<T>, ms: number, message: string): Promise<T> {
15+
let timeoutId: NodeJS.Timeout;
16+
let isCancelled = false;
17+
18+
const timeoutPromise = new Promise<never>((_, reject) => {
19+
timeoutId = setTimeout(() => {
20+
if (!isCancelled) {
21+
reject(new Error(message));
22+
}
23+
}, ms);
24+
25+
if (timeoutId.unref) {
26+
timeoutId.unref();
27+
}
28+
});
29+
30+
const wrappedPromise = new Promise<T>((resolve, reject) => {
31+
promise.then(
32+
value => {
33+
if (!isCancelled) {
34+
resolve(value);
35+
}
36+
},
37+
error => {
38+
if (!isCancelled) {
39+
reject(error);
40+
}
41+
},
42+
);
43+
});
44+
45+
return Promise.race([wrappedPromise, timeoutPromise]).finally(() => {
46+
isCancelled = true;
47+
clearTimeout(timeoutId);
48+
});
49+
}
50+
51+
export function promiseDelay(ms: number): Promise<void> {
52+
return new Promise(resolve => setTimeout(resolve, ms));
53+
}
54+
55+
export async function promiseMapSeries<T, R>(
56+
items: T[],
57+
mapper: (item: T, index: number) => Promise<R> | R,
58+
): Promise<R[]> {
59+
const results: R[] = [];
60+
61+
for (let i = 0; i < items.length; i++) {
62+
results.push(await Promise.resolve(mapper(items[i], i)));
63+
}
64+
65+
return results;
66+
}

src/utils/workers-registry.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
const { EventEmitter } = require("events");
44
const workerFarm = require("worker-farm");
5-
const Promise = require("bluebird");
5+
const { promisify } = require("util");
66
const _ = require("lodash");
77
const { MasterEvents } = require("../events");
88
const RuntimeConfig = require("../config/runtime-config");
@@ -39,7 +39,7 @@ module.exports = class WorkersRegistry extends EventEmitter {
3939

4040
async end() {
4141
this._ended = true;
42-
await Promise.promisify(workerFarm.end)(this._workerFarm);
42+
await promisify(workerFarm.end)(this._workerFarm);
4343
}
4444

4545
isEnded() {
@@ -55,7 +55,7 @@ module.exports = class WorkersRegistry extends EventEmitter {
5555
if (this._ended) {
5656
return Promise.reject(new Error(`Can't execute method '${methodName}' because worker farm ended.`));
5757
}
58-
return Promise.promisify(this._workerFarm)(workerFilepath, methodName, args);
58+
return promisify(this._workerFarm)(workerFilepath, methodName, args);
5959
};
6060
}
6161

src/worker/browser-env/runner/test-runner/index.ts

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import crypto from "node:crypto";
2-
import P from "bluebird";
32
import _ from "lodash";
43
import { io } from "socket.io-client";
54
import urljoin from "url-join";
65

6+
import { promiseTimeout } from "../../../../utils/promise";
77
import NodejsEnvTestRunner from "../../../runner/test-runner";
88
import { wrapExecutionThread } from "./execution-thread";
99
import { WorkerEventNames } from "./types";
@@ -143,34 +143,33 @@ export class TestRunner extends NodejsEnvTestRunner {
143143
private _waitBroInitOnReconnect(): Promise<void> {
144144
let intervalId: NodeJS.Timeout | null = null;
145145

146-
return new P((resolve, reject) => {
147-
intervalId = setInterval(() => {
148-
if (_.isNull(this._broInitResOnReconnect)) {
149-
return;
150-
}
146+
return promiseTimeout(
147+
new Promise<void>((resolve, reject) => {
148+
intervalId = setInterval(() => {
149+
if (_.isNull(this._broInitResOnReconnect)) {
150+
return;
151+
}
151152

152-
if (intervalId) {
153-
clearInterval(intervalId);
154-
}
153+
if (intervalId) {
154+
clearInterval(intervalId);
155+
}
155156

156-
if (_.isEmpty(this._broInitResOnReconnect)) {
157-
resolve();
158-
} else {
159-
reject(this._broInitResOnReconnect[0]);
160-
}
161-
}, BRO_INIT_INTERVAL_ON_RECONNECT).unref();
162-
})
163-
.timeout(
164-
BRO_INIT_TIMEOUT_ON_RECONNECT,
165-
`Browser didn't connect to the Vite server after reconnect in ${BRO_INIT_TIMEOUT_ON_RECONNECT}ms`,
166-
)
167-
.catch(err => {
168-
if (intervalId) {
169-
clearInterval(intervalId);
170-
}
157+
if (_.isEmpty(this._broInitResOnReconnect)) {
158+
resolve();
159+
} else {
160+
reject(this._broInitResOnReconnect[0]);
161+
}
162+
}, BRO_INIT_INTERVAL_ON_RECONNECT).unref();
163+
}),
164+
BRO_INIT_TIMEOUT_ON_RECONNECT,
165+
`Browser didn't connect to the Vite server after reconnect in ${BRO_INIT_TIMEOUT_ON_RECONNECT}ms`,
166+
).catch(err => {
167+
if (intervalId) {
168+
clearInterval(intervalId);
169+
}
171170

172-
throw err;
173-
});
171+
throw err;
172+
});
174173
}
175174

176175
_getPreparePageActions(browser: Browser, history: BrowserHistory): (() => Promise<void>)[] {
@@ -298,7 +297,7 @@ export class TestRunner extends NodejsEnvTestRunner {
298297
}
299298

300299
private async _openViteUrl(browser: Browser): Promise<void> {
301-
const browserInitialize = new P((resolve, reject) => {
300+
const browserInitialize = new Promise<void>((resolve, reject) => {
302301
this._socket.once(BrowserEventNames.initialize, errors => {
303302
_.isEmpty(errors) ? resolve() : reject(errors[0]);
304303
});
@@ -308,7 +307,7 @@ export class TestRunner extends NodejsEnvTestRunner {
308307
const uri = urljoin(this._config.baseUrl, VITE_RUN_UUID_ROUTE, this._runUuid);
309308

310309
await Promise.all([
311-
browserInitialize.timeout(timeout, `Browser didn't connect to the Vite server in ${timeout}ms`),
310+
promiseTimeout(browserInitialize, timeout, `Browser didn't connect to the Vite server in ${timeout}ms`),
312311
browser.publicAPI.url(uri),
313312
]);
314313
}

0 commit comments

Comments
 (0)