testcontainers 9.10.0 → 9.11.0
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/dist/package.json +18 -16
- package/dist/src/docker/client/docker-client-types.d.ts +21 -0
- package/dist/src/docker/client/docker-client-types.js +2 -0
- package/dist/src/docker/client/docker-client.d.ts +1 -17
- package/dist/src/docker/client/docker-client.js +50 -23
- package/dist/src/docker/client/strategy/configuration-strategy.d.ts +1 -1
- package/dist/src/docker/client/strategy/configuration-strategy.js +2 -4
- package/dist/src/docker/client/strategy/docker-client-strategy.d.ts +1 -1
- package/dist/src/docker/client/strategy/npipe-socket-strategy.d.ts +1 -1
- package/dist/src/docker/client/strategy/npipe-socket-strategy.js +1 -5
- package/dist/src/docker/client/strategy/rootless-unix-socket-strategy.d.ts +1 -1
- package/dist/src/docker/client/strategy/rootless-unix-socket-strategy.js +1 -2
- package/dist/src/docker/client/strategy/testcontainers-host-strategy.d.ts +1 -1
- package/dist/src/docker/client/strategy/testcontainers-host-strategy.js +2 -7
- package/dist/src/docker/client/strategy/unix-socket-strategy.d.ts +1 -1
- package/dist/src/docker/client/strategy/unix-socket-strategy.js +1 -5
- package/dist/src/docker/functions/container/create-container.d.ts +1 -1
- package/dist/src/docker/functions/container/create-container.js +2 -2
- package/dist/src/docker/functions/create-labels.d.ts +1 -2
- package/dist/src/docker/functions/create-labels.js +2 -3
- package/dist/src/docker/functions/image/build-image.d.ts +2 -1
- package/dist/src/docker/functions/image/build-image.js +2 -2
- package/dist/src/docker/functions/network/create-network.d.ts +1 -1
- package/dist/src/docker/functions/network/create-network.js +2 -2
- package/dist/src/docker/remote-docker-unix-socket-path.d.ts +2 -2
- package/dist/src/docker/types.d.ts +3 -0
- package/dist/src/docker-compose-environment/docker-compose-environment.js +2 -2
- package/dist/src/file-lock.d.ts +1 -0
- package/dist/src/file-lock.js +47 -0
- package/dist/src/generic-container/generic-container-builder.d.ts +4 -1
- package/dist/src/generic-container/generic-container-builder.js +4 -5
- package/dist/src/generic-container/generic-container.d.ts +8 -4
- package/dist/src/generic-container/generic-container.js +75 -72
- package/dist/src/index.d.ts +1 -1
- package/dist/src/modules/selenium/selenium-container.js +11 -8
- package/dist/src/network.js +3 -3
- package/dist/src/port-forwarder.js +2 -2
- package/dist/src/reaper.d.ts +5 -14
- package/dist/src/reaper.js +124 -114
- package/dist/src/test-container.d.ts +2 -1
- package/package.json +18 -16
- package/dist/src/docker/session-id.d.ts +0 -1
- package/dist/src/docker/session-id.js +0 -5
package/dist/src/reaper.js
CHANGED
|
@@ -9,139 +9,149 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.
|
|
12
|
+
exports.startReaper = exports.registerComposeProjectForCleanup = exports.registerSessionIdForCleanup = void 0;
|
|
13
13
|
const net_1 = require("net");
|
|
14
14
|
const logger_1 = require("./logger");
|
|
15
15
|
const generic_container_1 = require("./generic-container/generic-container");
|
|
16
|
-
const session_id_1 = require("./docker/session-id");
|
|
17
16
|
const images_1 = require("./images");
|
|
18
|
-
const port_1 = require("./port");
|
|
19
17
|
const labels_1 = require("./labels");
|
|
20
18
|
const wait_1 = require("./wait-strategy/wait");
|
|
21
19
|
const retry_strategy_1 = require("./retry-strategy");
|
|
22
20
|
const remote_docker_unix_socket_path_1 = require("./docker/remote-docker-unix-socket-path");
|
|
23
21
|
const docker_client_1 = require("./docker/client/docker-client");
|
|
22
|
+
const isReaperEnabled = process.env.TESTCONTAINERS_RYUK_DISABLED !== "true";
|
|
23
|
+
let reaper;
|
|
24
|
+
function registerSessionIdForCleanup(sessionId) {
|
|
25
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
26
|
+
if (!reaper) {
|
|
27
|
+
yield (0, docker_client_1.getDockerClient)();
|
|
28
|
+
}
|
|
29
|
+
(yield reaper).addSession(sessionId);
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
exports.registerSessionIdForCleanup = registerSessionIdForCleanup;
|
|
33
|
+
function registerComposeProjectForCleanup(project) {
|
|
34
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
35
|
+
if (!reaper) {
|
|
36
|
+
yield (0, docker_client_1.getDockerClient)();
|
|
37
|
+
}
|
|
38
|
+
(yield reaper).addProject(project);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
exports.registerComposeProjectForCleanup = registerComposeProjectForCleanup;
|
|
42
|
+
function startReaper(dockerClient, sessionId, existingReaperContainer) {
|
|
43
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
44
|
+
reaper = !isReaperEnabled
|
|
45
|
+
? yield createDisabledReaper()
|
|
46
|
+
: existingReaperContainer
|
|
47
|
+
? yield useExistingReaper(dockerClient, sessionId, existingReaperContainer)
|
|
48
|
+
: yield createNewReaper(dockerClient, sessionId);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
exports.startReaper = startReaper;
|
|
52
|
+
function createDisabledReaper() {
|
|
53
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
54
|
+
return new DisabledReaper();
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function useExistingReaper(dockerClient, sessionId, reaperContainer) {
|
|
58
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
59
|
+
logger_1.log.debug(`Reusing existing Reaper for session "${sessionId}"...`);
|
|
60
|
+
const reaperPort = getReaperPublicPort(reaperContainer);
|
|
61
|
+
const socket = yield connectToReaperSocket(dockerClient.host, reaperPort, sessionId, reaperContainer.Id);
|
|
62
|
+
return new RealReaper(sessionId, socket);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
function getReaperPublicPort(reaperContainer) {
|
|
66
|
+
var _a;
|
|
67
|
+
const port = (_a = reaperContainer.Ports.find((port) => port.PrivatePort == 8080)) === null || _a === void 0 ? void 0 : _a.PublicPort;
|
|
68
|
+
if (!port) {
|
|
69
|
+
throw new Error("Expected Reaper to map exposed port 8080");
|
|
70
|
+
}
|
|
71
|
+
return port;
|
|
72
|
+
}
|
|
73
|
+
function createNewReaper(dockerClient, sessionId) {
|
|
74
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
75
|
+
const remoteDockerUnixSocketPath = (0, remote_docker_unix_socket_path_1.getRemoteDockerUnixSocketPath)(dockerClient);
|
|
76
|
+
logger_1.log.debug(`Creating new Reaper for session "${sessionId}" with socket path "${remoteDockerUnixSocketPath}"...`);
|
|
77
|
+
const startedContainer = yield createAndStartReaperContainer(sessionId, remoteDockerUnixSocketPath);
|
|
78
|
+
const containerId = startedContainer.getId();
|
|
79
|
+
const host = startedContainer.getHost();
|
|
80
|
+
const port = startedContainer.getMappedPort(8080);
|
|
81
|
+
const socket = yield connectToReaperSocket(host, port, sessionId, containerId);
|
|
82
|
+
return new RealReaper(sessionId, socket);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
function createAndStartReaperContainer(sessionId, socketPath) {
|
|
86
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
87
|
+
const exposedPort = process.env["TESTCONTAINERS_RYUK_PORT"]
|
|
88
|
+
? { container: 8080, host: Number(process.env["TESTCONTAINERS_RYUK_PORT"]) }
|
|
89
|
+
: 8080;
|
|
90
|
+
const container = new generic_container_1.GenericContainer(images_1.REAPER_IMAGE)
|
|
91
|
+
.withName(`testcontainers-ryuk-${sessionId}`)
|
|
92
|
+
.withExposedPorts(exposedPort)
|
|
93
|
+
.withBindMounts([{ source: socketPath, target: "/var/run/docker.sock" }])
|
|
94
|
+
.withWaitStrategy(wait_1.Wait.forLogMessage(/.+ Started!/));
|
|
95
|
+
if (process.env.TESTCONTAINERS_RYUK_PRIVILEGED === "true") {
|
|
96
|
+
container.withPrivilegedMode();
|
|
97
|
+
}
|
|
98
|
+
return yield container.start();
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
function connectToReaperSocket(host, port, sessionId, containerId) {
|
|
102
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
103
|
+
const retryResult = yield new retry_strategy_1.IntervalRetryStrategy(1000).retryUntil((attempt) => {
|
|
104
|
+
return new Promise((resolve) => {
|
|
105
|
+
logger_1.log.debug(`Connecting to Reaper (attempt ${attempt + 1}) on "${host}:${port}"...`, { containerId });
|
|
106
|
+
const socket = new net_1.Socket();
|
|
107
|
+
socket
|
|
108
|
+
.unref()
|
|
109
|
+
.on("timeout", () => logger_1.log.error(`Reaper ${containerId} socket timed out`))
|
|
110
|
+
.on("error", (err) => logger_1.log.error(`Reaper ${containerId} socket error: ${err}`))
|
|
111
|
+
.on("close", (hadError) => {
|
|
112
|
+
if (hadError) {
|
|
113
|
+
logger_1.log.error(`Connection to Reaper closed with error`, { containerId });
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
logger_1.log.warn(`Connection to Reaper closed`, { containerId });
|
|
117
|
+
}
|
|
118
|
+
resolve(undefined);
|
|
119
|
+
})
|
|
120
|
+
.connect(port, host, () => {
|
|
121
|
+
logger_1.log.debug(`Connected to Reaper`, { containerId });
|
|
122
|
+
resolve(socket);
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
}, (result) => result !== undefined, () => {
|
|
126
|
+
const message = `Failed to connect to Reaper`;
|
|
127
|
+
logger_1.log.error(message, { containerId });
|
|
128
|
+
return new Error(message);
|
|
129
|
+
}, 4000);
|
|
130
|
+
if (retryResult instanceof net_1.Socket) {
|
|
131
|
+
return retryResult;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
throw retryResult;
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}
|
|
24
138
|
class RealReaper {
|
|
25
|
-
constructor(
|
|
26
|
-
this.
|
|
139
|
+
constructor(sessionId, socket) {
|
|
140
|
+
this.sessionId = sessionId;
|
|
27
141
|
this.socket = socket;
|
|
28
142
|
}
|
|
143
|
+
addSession(sessionId) {
|
|
144
|
+
this.socket.write(`label=${labels_1.LABEL_TESTCONTAINERS_SESSION_ID}=${sessionId}\r\n`);
|
|
145
|
+
}
|
|
29
146
|
addProject(projectName) {
|
|
30
147
|
this.socket.write(`label=com.docker.compose.project=${projectName}\r\n`);
|
|
31
148
|
}
|
|
32
|
-
getContainerId() {
|
|
33
|
-
return this.container.getId();
|
|
34
|
-
}
|
|
35
|
-
stop() {
|
|
36
|
-
this.socket.end();
|
|
37
|
-
}
|
|
38
149
|
}
|
|
39
150
|
class DisabledReaper {
|
|
40
|
-
|
|
151
|
+
addSession() {
|
|
41
152
|
// noop
|
|
42
153
|
}
|
|
43
|
-
|
|
154
|
+
addProject() {
|
|
44
155
|
// noop
|
|
45
156
|
}
|
|
46
|
-
getContainerId() {
|
|
47
|
-
return "";
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
class ReaperInstance {
|
|
51
|
-
static getInstance() {
|
|
52
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
53
|
-
if (!this.instance) {
|
|
54
|
-
if (this.isEnabled()) {
|
|
55
|
-
this.instance = this.createRealInstance();
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
this.instance = this.createDisabledInstance();
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return this.instance;
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
static stopInstance() {
|
|
65
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
66
|
-
if (this.instance) {
|
|
67
|
-
const reaper = yield this.instance;
|
|
68
|
-
reaper.stop();
|
|
69
|
-
this.instance = undefined;
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
static isEnabled() {
|
|
74
|
-
return process.env.TESTCONTAINERS_RYUK_DISABLED !== "true";
|
|
75
|
-
}
|
|
76
|
-
static isPrivileged() {
|
|
77
|
-
return process.env.TESTCONTAINERS_RYUK_PRIVILEGED === "true";
|
|
78
|
-
}
|
|
79
|
-
static createDisabledInstance() {
|
|
80
|
-
logger_1.log.debug(`Not creating new Reaper for session "${session_id_1.sessionId}"`);
|
|
81
|
-
return Promise.resolve(new DisabledReaper());
|
|
82
|
-
}
|
|
83
|
-
static createRealInstance() {
|
|
84
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
85
|
-
const containerPort = process.env["TESTCONTAINERS_RYUK_PORT"]
|
|
86
|
-
? { container: 8080, host: Number(process.env["TESTCONTAINERS_RYUK_PORT"]) }
|
|
87
|
-
: 8080;
|
|
88
|
-
const dockerClient = yield (0, docker_client_1.getDockerClient)();
|
|
89
|
-
const remoteDockerUnixSocketPath = (0, remote_docker_unix_socket_path_1.getRemoteDockerUnixSocketPath)(dockerClient);
|
|
90
|
-
logger_1.log.debug(`Creating new Reaper for session "${session_id_1.sessionId}" with socket path "${remoteDockerUnixSocketPath}"...`);
|
|
91
|
-
const container = new generic_container_1.GenericContainer(images_1.REAPER_IMAGE)
|
|
92
|
-
.withName(`testcontainers-ryuk-${session_id_1.sessionId}`)
|
|
93
|
-
.withExposedPorts(containerPort)
|
|
94
|
-
.withBindMounts([
|
|
95
|
-
{
|
|
96
|
-
source: remoteDockerUnixSocketPath,
|
|
97
|
-
target: "/var/run/docker.sock",
|
|
98
|
-
},
|
|
99
|
-
])
|
|
100
|
-
.withWaitStrategy(wait_1.Wait.forLogMessage(/.+ Started!/));
|
|
101
|
-
if (this.isPrivileged()) {
|
|
102
|
-
container.withPrivilegedMode();
|
|
103
|
-
}
|
|
104
|
-
const startedContainer = yield container.start();
|
|
105
|
-
const containerId = startedContainer.getId();
|
|
106
|
-
const host = startedContainer.getHost();
|
|
107
|
-
const port = startedContainer.getMappedPort(8080);
|
|
108
|
-
const retryStrategy = new retry_strategy_1.IntervalRetryStrategy(1000);
|
|
109
|
-
const retryResult = yield retryStrategy.retryUntil((attempt) => {
|
|
110
|
-
return new Promise((resolve) => {
|
|
111
|
-
logger_1.log.debug(`Connecting to Reaper (attempt ${attempt + 1}) on "${host}:${port}"...`, { containerId });
|
|
112
|
-
const socket = new net_1.Socket();
|
|
113
|
-
socket
|
|
114
|
-
.unref()
|
|
115
|
-
.on("timeout", () => logger_1.log.error(`Reaper ${containerId} socket timed out`))
|
|
116
|
-
.on("error", (err) => logger_1.log.error(`Reaper ${containerId} socket error: ${err}`))
|
|
117
|
-
.on("close", (hadError) => {
|
|
118
|
-
if (hadError) {
|
|
119
|
-
logger_1.log.error(`Connection to Reaper closed with error`, { containerId });
|
|
120
|
-
}
|
|
121
|
-
else {
|
|
122
|
-
logger_1.log.warn(`Connection to Reaper closed`, { containerId });
|
|
123
|
-
}
|
|
124
|
-
resolve(undefined);
|
|
125
|
-
})
|
|
126
|
-
.connect((0, port_1.getContainerPort)(port), host, () => {
|
|
127
|
-
logger_1.log.debug(`Connected to Reaper`, { containerId });
|
|
128
|
-
socket.write(`label=${labels_1.LABEL_TESTCONTAINERS_SESSION_ID}=${session_id_1.sessionId}\r\n`);
|
|
129
|
-
const reaper = new RealReaper(startedContainer, socket);
|
|
130
|
-
resolve(reaper);
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
}, (result) => result !== undefined, () => {
|
|
134
|
-
const message = `Failed to connect to Reaper`;
|
|
135
|
-
logger_1.log.error(message, { containerId });
|
|
136
|
-
return new Error(message);
|
|
137
|
-
}, 4000);
|
|
138
|
-
if (retryResult instanceof RealReaper) {
|
|
139
|
-
return retryResult;
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
throw retryResult;
|
|
143
|
-
}
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
157
|
}
|
|
147
|
-
exports.ReaperInstance = ReaperInstance;
|
|
@@ -4,7 +4,7 @@ import { PortWithOptionalBinding } from "./port";
|
|
|
4
4
|
import { PullPolicy } from "./pull-policy";
|
|
5
5
|
import { WaitStrategy } from "./wait-strategy/wait-strategy";
|
|
6
6
|
import { Readable } from "stream";
|
|
7
|
-
import { BindMount, ContentToCopy, Environment, ExecResult, ExtraHost, FileToCopy, Labels, ResourcesQuota, TmpFs, Ulimits } from "./docker/types";
|
|
7
|
+
import { BindMount, ContentToCopy, DirectoryToCopy, Environment, ExecResult, ExtraHost, FileToCopy, Labels, ResourcesQuota, TmpFs, Ulimits } from "./docker/types";
|
|
8
8
|
import { StartedNetwork } from "./network";
|
|
9
9
|
export interface TestContainer {
|
|
10
10
|
start(): Promise<StartedTestContainer>;
|
|
@@ -28,6 +28,7 @@ export interface TestContainer {
|
|
|
28
28
|
withPullPolicy(pullPolicy: PullPolicy): this;
|
|
29
29
|
withReuse(): this;
|
|
30
30
|
withCopyFilesToContainer(filesToCopy: FileToCopy[]): this;
|
|
31
|
+
withCopyDirectoriesToContainer(directoriesToCopy: DirectoryToCopy[]): this;
|
|
31
32
|
withCopyContentToContainer(contentsToCopy: ContentToCopy[]): this;
|
|
32
33
|
withWorkingDir(workingDir: string): this;
|
|
33
34
|
withResourcesQuota(resourcesQuota: ResourcesQuota): this;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "testcontainers",
|
|
3
3
|
"author": "Cristian Greco",
|
|
4
|
-
"version": "9.
|
|
4
|
+
"version": "9.11.0",
|
|
5
5
|
"main": "dist/src/index",
|
|
6
6
|
"types": "dist/src/index",
|
|
7
7
|
"keywords": [
|
|
@@ -46,46 +46,48 @@
|
|
|
46
46
|
"docker-compose": "^0.24.1",
|
|
47
47
|
"dockerode": "^3.3.5",
|
|
48
48
|
"get-port": "^5.1.1",
|
|
49
|
-
"node-fetch": "^2.6.
|
|
49
|
+
"node-fetch": "^2.6.12",
|
|
50
|
+
"proper-lockfile": "^4.1.2",
|
|
50
51
|
"properties-reader": "^2.2.0",
|
|
51
52
|
"ssh-remote-port-forward": "^1.0.4",
|
|
52
53
|
"tar-fs": "^2.1.1",
|
|
53
54
|
"tmp": "^0.2.1"
|
|
54
55
|
},
|
|
55
56
|
"devDependencies": {
|
|
56
|
-
"@elastic/elasticsearch": "^7.17.
|
|
57
|
+
"@elastic/elasticsearch": "^7.17.11",
|
|
57
58
|
"@types/async-lock": "^1.4.0",
|
|
58
59
|
"@types/byline": "^4.2.33",
|
|
59
60
|
"@types/debug": "4.1.8",
|
|
60
|
-
"@types/jest": "^29.5.
|
|
61
|
-
"@types/node": "^18.16.
|
|
61
|
+
"@types/jest": "^29.5.3",
|
|
62
|
+
"@types/node": "^18.16.19",
|
|
62
63
|
"@types/node-fetch": "^2.6.4",
|
|
63
64
|
"@types/pg": "^8.10.2",
|
|
65
|
+
"@types/proper-lockfile": "^4.1.2",
|
|
64
66
|
"@types/properties-reader": "^2.1.1",
|
|
65
67
|
"@types/selenium-webdriver": "^4.1.15",
|
|
66
68
|
"@types/tar-fs": "^2.0.1",
|
|
67
69
|
"@types/tmp": "^0.2.3",
|
|
68
|
-
"@typescript-eslint/eslint-plugin": "^5.
|
|
69
|
-
"@typescript-eslint/parser": "^5.
|
|
70
|
-
"arangojs": "^8.
|
|
70
|
+
"@typescript-eslint/eslint-plugin": "^5.62.0",
|
|
71
|
+
"@typescript-eslint/parser": "^5.62.0",
|
|
72
|
+
"arangojs": "^8.4.0",
|
|
71
73
|
"cross-env": "^7.0.3",
|
|
72
|
-
"eslint": "^8.
|
|
74
|
+
"eslint": "^8.44.0",
|
|
73
75
|
"eslint-config-prettier": "^8.8.0",
|
|
74
76
|
"eslint-plugin-prettier": "^4.2.1",
|
|
75
77
|
"husky": "^8.0.3",
|
|
76
|
-
"jest": "^29.
|
|
78
|
+
"jest": "^29.6.1",
|
|
77
79
|
"kafkajs": "^2.2.4",
|
|
78
|
-
"lint-staged": "^13.2.
|
|
79
|
-
"mongoose": "^6.11.
|
|
80
|
+
"lint-staged": "^13.2.3",
|
|
81
|
+
"mongoose": "^6.11.3",
|
|
80
82
|
"mqtt": "^4.3.7",
|
|
81
83
|
"mysql2": "^2.3.3",
|
|
82
|
-
"nats": "^2.
|
|
83
|
-
"neo4j-driver": "^5.
|
|
84
|
-
"pg": "^8.11.
|
|
84
|
+
"nats": "^2.15.1",
|
|
85
|
+
"neo4j-driver": "^5.10.0",
|
|
86
|
+
"pg": "^8.11.1",
|
|
85
87
|
"prettier": "^2.8.8",
|
|
86
88
|
"rimraf": "^3.0.2",
|
|
87
89
|
"selenium-webdriver": "^4.10.0",
|
|
88
|
-
"ts-jest": "^29.1.
|
|
90
|
+
"ts-jest": "^29.1.1",
|
|
89
91
|
"ts-node": "^10.9.1",
|
|
90
92
|
"typescript": "^4.9.5",
|
|
91
93
|
"wait-for-expect": "^3.0.2"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const sessionId: string;
|