diff --git a/package-lock.json b/package-lock.json index b636b9d6d..a30260f8a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2375,7 +2375,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", - "dev": true, "engines": { "node": ">=14" } @@ -5465,16 +5464,6 @@ "undici-types": "~5.26.4" } }, - "node_modules/@types/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", - "dev": true, - "dependencies": { - "@types/node": "*", - "form-data": "^4.0.0" - } - }, "node_modules/@types/pg": { "version": "8.11.6", "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.6.tgz", @@ -7844,15 +7833,6 @@ "node": ">=4" } }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, "node_modules/data-view-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", @@ -8277,6 +8257,7 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -8989,29 +8970,6 @@ "bser": "2.1.1" } }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -9237,18 +9195,6 @@ "node": ">= 14.17" } }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dev": true, - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, "node_modules/fp-and-or": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/fp-and-or/-/fp-and-or-0.1.4.tgz", @@ -10939,7 +10885,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "devOptional": true, + "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -14249,29 +14195,11 @@ "integrity": "sha512-ucQW+SbYCUPfprvmzBsnjT034IGRB2XK8rRc78BgjNKhTdFKgAwAmgW704bKIBmcYW48it0Gkjpkd39Azrwquw==", "dev": true }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -14290,17 +14218,20 @@ "node_modules/node-fetch/node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "node_modules/node-fetch/node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -18318,7 +18249,6 @@ "version": "5.28.4", "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", - "dev": true, "dependencies": { "@fastify/busboy": "^2.0.0" }, @@ -18580,15 +18510,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -19305,26 +19226,7 @@ "testcontainers": "^10.10.4" }, "devDependencies": { - "kafkajs": "^2.2.4", - "node-fetch": "^3.3.2" - } - }, - "packages/modules/redpanda/node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "dev": true, - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" + "kafkajs": "^2.2.4" } }, "packages/modules/selenium": { @@ -19363,19 +19265,18 @@ "docker-compose": "^0.24.8", "dockerode": "^3.3.5", "get-port": "^5.1.1", - "node-fetch": "^2.7.0", "proper-lockfile": "^4.1.2", "properties-reader": "^2.3.0", "ssh-remote-port-forward": "^1.0.4", "tar-fs": "^3.0.6", - "tmp": "^0.2.3" + "tmp": "^0.2.3", + "undici": "^5.28.4" }, "devDependencies": { "@types/archiver": "^5.3.4", "@types/async-lock": "^1.4.2", "@types/byline": "^4.2.36", "@types/debug": "^4.1.12", - "@types/node-fetch": "^2.6.11", "@types/proper-lockfile": "^4.1.4", "@types/properties-reader": "^2.1.3", "@types/tar-fs": "^2.0.4", diff --git a/packages/modules/couchbase/src/couchbase-container.test.ts b/packages/modules/couchbase/src/couchbase-container.test.ts index 0a76e291b..d375a2cf8 100644 --- a/packages/modules/couchbase/src/couchbase-container.test.ts +++ b/packages/modules/couchbase/src/couchbase-container.test.ts @@ -50,11 +50,11 @@ describe("CouchbaseContainer", () => { // connectAndQuery { it("should connect and query using enterprise image", async () => { const bucketDefinition = new BucketDefinition("mybucket"); - const container = await new CouchbaseContainer(COUCHBASE_IMAGE_ENTERPRISE).withBucket(bucketDefinition); + const container = new CouchbaseContainer(COUCHBASE_IMAGE_ENTERPRISE).withBucket(bucketDefinition); startedTestContainer = await container.start(); - cluster = new couchbase.Cluster(startedTestContainer.getConnectionString(), { + cluster = await couchbase.Cluster.connect(startedTestContainer.getConnectionString(), { username: startedTestContainer.getUsername(), password: startedTestContainer.getPassword(), }); @@ -68,10 +68,10 @@ describe("CouchbaseContainer", () => { it("should flush bucket if flushEnabled and check any document exists", async () => { const bucketDefinition = new BucketDefinition("mybucket").withFlushEnabled(true); - const container = await new CouchbaseContainer(COUCHBASE_IMAGE_ENTERPRISE).withBucket(bucketDefinition); + const container = new CouchbaseContainer(COUCHBASE_IMAGE_ENTERPRISE).withBucket(bucketDefinition); startedTestContainer = await container.start(); - cluster = new couchbase.Cluster(startedTestContainer.getConnectionString(), { + cluster = await couchbase.Cluster.connect(startedTestContainer.getConnectionString(), { username: startedTestContainer.getUsername(), password: startedTestContainer.getPassword(), }); @@ -105,10 +105,10 @@ describe("CouchbaseContainer", () => { it("should connect and query using community image", async () => { const bucketDefinition = new BucketDefinition("mybucket"); - const container = await new CouchbaseContainer(COUCHBASE_IMAGE_COMMUNITY).withBucket(bucketDefinition); + const container = new CouchbaseContainer(COUCHBASE_IMAGE_COMMUNITY).withBucket(bucketDefinition); startedTestContainer = await container.start(); - cluster = new couchbase.Cluster(startedTestContainer.getConnectionString(), { + cluster = await couchbase.Cluster.connect(startedTestContainer.getConnectionString(), { username: startedTestContainer.getUsername(), password: startedTestContainer.getPassword(), }); @@ -121,10 +121,10 @@ describe("CouchbaseContainer", () => { it("should flush bucket if flushEnabled and check any document exists", async () => { const bucketDefinition = new BucketDefinition("mybucket").withFlushEnabled(true); - const container = await new CouchbaseContainer(COUCHBASE_IMAGE_COMMUNITY).withBucket(bucketDefinition); + const container = new CouchbaseContainer(COUCHBASE_IMAGE_COMMUNITY).withBucket(bucketDefinition); startedTestContainer = await container.start(); - cluster = new couchbase.Cluster(startedTestContainer.getConnectionString(), { + cluster = await couchbase.Cluster.connect(startedTestContainer.getConnectionString(), { username: startedTestContainer.getUsername(), password: startedTestContainer.getPassword(), }); @@ -140,7 +140,7 @@ describe("CouchbaseContainer", () => { }); it("should throw error if analytics service enabled with community version", async () => { - const container = await new CouchbaseContainer(COUCHBASE_IMAGE_COMMUNITY).withEnabledServices( + const container = new CouchbaseContainer(COUCHBASE_IMAGE_COMMUNITY).withEnabledServices( CouchbaseService.KV, CouchbaseService.ANALYTICS ); @@ -151,7 +151,7 @@ describe("CouchbaseContainer", () => { }); it("should throw error if eventing service enabled with community version", async () => { - const container = await new CouchbaseContainer(COUCHBASE_IMAGE_COMMUNITY).withEnabledServices( + const container = new CouchbaseContainer(COUCHBASE_IMAGE_COMMUNITY).withEnabledServices( CouchbaseService.KV, CouchbaseService.EVENTING ); diff --git a/packages/modules/couchbase/src/couchbase-container.ts b/packages/modules/couchbase/src/couchbase-container.ts index 6b2c27e44..8f6e049ab 100644 --- a/packages/modules/couchbase/src/couchbase-container.ts +++ b/packages/modules/couchbase/src/couchbase-container.ts @@ -11,7 +11,6 @@ import { BoundPorts } from "testcontainers/src/utils/bound-ports"; import { ContainerRuntimeClient, getContainerRuntimeClient } from "testcontainers/src/container-runtime"; import { CouchbaseService } from "./couchbase-service"; import { BucketDefinition } from "./bucket-definition"; -import fetch, { Response } from "node-fetch"; import PORTS from "./ports"; import { IntervalRetry } from "testcontainers/src/common"; @@ -194,7 +193,7 @@ export class CouchbaseContainer extends GenericContainer { ); let jsonResponse; try { - jsonResponse = await response.json(); + jsonResponse = (await response.json()) as { isEnterprise: boolean }; } catch (e) { throw new Error("Couchbase /pools did not return valid JSON"); } @@ -447,7 +446,7 @@ export class CouchbaseContainer extends GenericContainer { if (response === undefined) { return false; } - const jsonResponse = await response.json(); + const jsonResponse = (await response.json()) as { results: Array<{ present: boolean }> }; return jsonResponse.results[0].present; }, () => { @@ -508,7 +507,7 @@ export class CouchbaseContainer extends GenericContainer { if (response === undefined) { return false; } - const jsonResponse = await response.json(); + const jsonResponse = (await response.json()) as { results: Array<{ online: boolean }> }; return jsonResponse.results[0].online; }, () => { diff --git a/packages/modules/ollama/src/ollama-container.test.ts b/packages/modules/ollama/src/ollama-container.test.ts index a58d58ad0..4a3a964b2 100644 --- a/packages/modules/ollama/src/ollama-container.test.ts +++ b/packages/modules/ollama/src/ollama-container.test.ts @@ -9,7 +9,7 @@ describe("OllamaContainer", () => { // } const response = await fetch(`${container.getEndpoint()}/api/version`); expect(response.status).toEqual(200); - const body = await response.json(); + const body = (await response.json()) as { version: string }; expect(body.version).toEqual("0.1.44"); await container.stop(); }); @@ -22,7 +22,7 @@ describe("OllamaContainer", () => { console.log(execResult.output); const response = await fetch(`${container.getEndpoint()}/api/tags`); expect(response.status).toEqual(200); - const body = await response.json(); + const body = (await response.json()) as { models: { name: string }[] }; expect(body.models[0].name).toContain("all-minilm"); const newImageName: string = "tc-ollama-allminilm-" + (Math.random() + 1).toString(36).substring(4).toLowerCase(); @@ -36,7 +36,7 @@ describe("OllamaContainer", () => { // } const response2 = await fetch(`${newContainer.getEndpoint()}/api/tags`); expect(response2.status).toEqual(200); - const body2 = await response2.json(); + const body2 = (await response2.json()) as { models: { name: string }[] }; expect(body2.models[0].name).toContain("all-minilm"); await newContainer.stop(); }); diff --git a/packages/modules/redpanda/package.json b/packages/modules/redpanda/package.json index 26ae64bae..1bf9d2aa2 100644 --- a/packages/modules/redpanda/package.json +++ b/packages/modules/redpanda/package.json @@ -33,7 +33,6 @@ "testcontainers": "^10.10.4" }, "devDependencies": { - "kafkajs": "^2.2.4", - "node-fetch": "^3.3.2" + "kafkajs": "^2.2.4" } } diff --git a/packages/testcontainers/package.json b/packages/testcontainers/package.json index ab409c810..4afc1c3ef 100644 --- a/packages/testcontainers/package.json +++ b/packages/testcontainers/package.json @@ -39,19 +39,18 @@ "docker-compose": "^0.24.8", "dockerode": "^3.3.5", "get-port": "^5.1.1", - "node-fetch": "^2.7.0", "proper-lockfile": "^4.1.2", "properties-reader": "^2.3.0", "ssh-remote-port-forward": "^1.0.4", "tar-fs": "^3.0.6", - "tmp": "^0.2.3" + "tmp": "^0.2.3", + "undici": "^5.28.4" }, "devDependencies": { "@types/archiver": "^5.3.4", "@types/async-lock": "^1.4.2", "@types/byline": "^4.2.36", "@types/debug": "^4.1.12", - "@types/node-fetch": "^2.6.11", "@types/proper-lockfile": "^4.1.4", "@types/properties-reader": "^2.1.3", "@types/tar-fs": "^2.0.4", diff --git a/packages/testcontainers/src/docker-compose-environment/docker-compose-environment.test.ts b/packages/testcontainers/src/docker-compose-environment/docker-compose-environment.test.ts index 1932f6c20..f2c099d61 100644 --- a/packages/testcontainers/src/docker-compose-environment/docker-compose-environment.test.ts +++ b/packages/testcontainers/src/docker-compose-environment/docker-compose-environment.test.ts @@ -1,4 +1,3 @@ -import fetch from "node-fetch"; import path from "path"; import { DockerComposeEnvironment } from "./docker-compose-environment"; import { RandomUuid } from "../common"; @@ -19,7 +18,7 @@ describe("DockerComposeEnvironment", () => { const fixtures = path.resolve(__dirname, "..", "..", "fixtures", "docker-compose"); it("should throw error when compose file is malformed", async () => { - await expect(new DockerComposeEnvironment(fixtures, "docker-compose-malformed.yml").up()).rejects.toThrowError(); + await expect(new DockerComposeEnvironment(fixtures, "docker-compose-malformed.yml").up()).rejects.toThrow(); }); it("should start all containers in the compose file", async () => { @@ -81,7 +80,7 @@ describe("DockerComposeEnvironment", () => { const url = `http://${container.getHost()}:${container.getMappedPort(8080)}`; const response = await fetch(`${url}/env`); - const responseBody = await response.json(); + const responseBody = (await response.json()) as { [key: string]: string }; expect(responseBody["IS_OVERRIDDEN"]).toBe("true"); @@ -109,7 +108,7 @@ describe("DockerComposeEnvironment", () => { .withWaitStrategy("custom_container_name", Wait.forLogMessage("unexpected")) .withStartupTimeout(0) .up() - ).rejects.toThrowError(`Log message "unexpected" not received after 0ms`); + ).rejects.toThrow(`Log message "unexpected" not received after 0ms`); expect(await getRunningContainerNames()).not.toContain("custom_container_name"); }); @@ -139,7 +138,7 @@ describe("DockerComposeEnvironment", () => { .withWaitStrategy(await composeContainerName("container"), Wait.forHealthCheck()) .withStartupTimeout(0) .up() - ).rejects.toThrowError(`Health check not healthy after 0ms`); + ).rejects.toThrow(`Health check not healthy after 0ms`); expect(await getRunningContainerNames()).not.toContain("container_1"); }); @@ -182,7 +181,7 @@ describe("DockerComposeEnvironment", () => { const container = startedEnvironment.getContainer(await composeContainerName("container")); const response = await fetch(`http://${container.getHost()}:${container.getMappedPort(8080)}/env`); - const responseBody = await response.json(); + const responseBody = (await response.json()) as { [key: string]: string }; expect(responseBody["ENV_VAR"]).toBe("ENV_VAR_VALUE"); await startedEnvironment.down(); @@ -191,7 +190,7 @@ describe("DockerComposeEnvironment", () => { it("should throw error when you get container that does not exist", async () => { const startedEnvironment = await new DockerComposeEnvironment(fixtures, "docker-compose.yml").up(); - expect(() => startedEnvironment.getContainer("non_existent_container")).toThrowError( + expect(() => startedEnvironment.getContainer("non_existent_container")).toThrow( `Cannot get container "non_existent_container" as it is not running` ); @@ -204,7 +203,7 @@ describe("DockerComposeEnvironment", () => { ); await checkEnvironmentContainerIsHealthy(startedEnvironment, await composeContainerName("service_2")); - expect(() => startedEnvironment.getContainer("service_1")).toThrowError( + expect(() => startedEnvironment.getContainer("service_1")).toThrow( `Cannot get container "service_1" as it is not running` ); @@ -230,7 +229,7 @@ describe("DockerComposeEnvironment", () => { const container = startedEnvironment.getContainer(await composeContainerName("container")); const response = await fetch(`http://${container.getHost()}:${container.getMappedPort(8080)}/env`); - const responseBody = await response.json(); + const responseBody = (await response.json()) as { [key: string]: string }; expect(responseBody["ENV_VAR"]).toBe("default"); await startedEnvironment.down(); @@ -245,7 +244,7 @@ describe("DockerComposeEnvironment", () => { const container = startedEnvironment.getContainer(await composeContainerName("container")); const response = await fetch(`http://${container.getHost()}:${container.getMappedPort(8080)}/env`); - const responseBody = await response.json(); + const responseBody = (await response.json()) as { [key: string]: string }; expect(responseBody["ENV_VAR"]).toBe("override"); await startedEnvironment.down(); diff --git a/packages/testcontainers/src/generic-container/generic-container.test.ts b/packages/testcontainers/src/generic-container/generic-container.test.ts index d8b3b8afd..fa02099d7 100644 --- a/packages/testcontainers/src/generic-container/generic-container.test.ts +++ b/packages/testcontainers/src/generic-container/generic-container.test.ts @@ -1,4 +1,3 @@ -import fetch from "node-fetch"; import path from "path"; import getPort from "get-port"; import { GenericContainer } from "./generic-container"; @@ -93,7 +92,7 @@ describe("GenericContainer", () => { const url = `http://${container.getHost()}:${container.getMappedPort(8080)}`; const response = await fetch(`${url}/env`); - const responseBody = await response.json(); + const responseBody = (await response.json()) as { [key: string]: string }; expect(responseBody.customKey).toBe("customValue"); await container.stop(); diff --git a/packages/testcontainers/src/utils/test-helper.ts b/packages/testcontainers/src/utils/test-helper.ts index 97e436e96..47640dbe4 100644 --- a/packages/testcontainers/src/utils/test-helper.ts +++ b/packages/testcontainers/src/utils/test-helper.ts @@ -1,8 +1,7 @@ import { Readable } from "stream"; +import { Agent } from "undici"; import { StartedDockerComposeEnvironment } from "../docker-compose-environment/started-docker-compose-environment"; -import fetch from "node-fetch"; import { StartedTestContainer } from "../test-container"; -import https from "https"; import { GetEventsOptions } from "dockerode"; import { getContainerRuntimeClient } from "../container-runtime"; import { GenericContainer } from "../generic-container/generic-container"; @@ -16,8 +15,8 @@ export const checkContainerIsHealthy = async (container: StartedTestContainer): export const checkContainerIsHealthyTls = async (container: StartedTestContainer): Promise => { const url = `https://${container.getHost()}:${container.getMappedPort(8443)}`; - const agent = new https.Agent({ rejectUnauthorized: false }); - const response = await fetch(`${url}/hello-world`, { agent }); + const dispatcher = new Agent({ connect: { rejectUnauthorized: false } }); + const response = await fetch(`${url}/hello-world`, { dispatcher }); expect(response.status).toBe(200); }; diff --git a/packages/testcontainers/src/wait-strategies/http-wait-strategy.ts b/packages/testcontainers/src/wait-strategies/http-wait-strategy.ts index 935dcceec..0544ff9f6 100644 --- a/packages/testcontainers/src/wait-strategies/http-wait-strategy.ts +++ b/packages/testcontainers/src/wait-strategies/http-wait-strategy.ts @@ -1,7 +1,6 @@ import Dockerode from "dockerode"; +import { Agent } from "undici"; import { AbstractWaitStrategy } from "./wait-strategy"; -import fetch, { Response } from "node-fetch"; -import https, { Agent } from "https"; import { BoundPorts } from "../utils/bound-ports"; import { IntervalRetry, log } from "../common"; import { getContainerRuntimeClient } from "../container-runtime"; @@ -99,9 +98,9 @@ export class HttpWaitStrategy extends AbstractWaitStrategy { return await fetch(url, { method: this.method, - timeout: this.readTimeout, + signal: AbortSignal.timeout(this.readTimeout), headers: this.headers, - agent: this.getAgent(), + dispatcher: this.getAgent(), }); } catch { return undefined; @@ -166,8 +165,10 @@ export class HttpWaitStrategy extends AbstractWaitStrategy { private getAgent(): Agent | undefined { if (this._allowInsecure) { - return new https.Agent({ - rejectUnauthorized: false, + return new Agent({ + connect: { + rejectUnauthorized: false, + }, }); } } diff --git a/tsconfig.base.json b/tsconfig.base.json index 199c1e229..7318a5558 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1,6 +1,9 @@ { "compilerOptions": { "incremental": true, + "lib": [ + "ES2022" + ], "target": "es2022", "module": "commonjs", "declaration": true,