From 30678d5d137a45ac6ecc863148a497d331b952f7 Mon Sep 17 00:00:00 2001 From: Luke Bunselmeyer Date: Wed, 8 Oct 2025 15:51:10 -0400 Subject: [PATCH 01/10] Support Node 16 - Updated `engines.node` to `>=10.16.0` - Updated tsdown.config.ts to target node 10 and strip `node:` import prefix. - Updated `cjs-project` with `main.js` to test node10 support. --- package-lock.json | 2 +- package.json | 2 +- test-integration/cjs-project/.node-version | 1 + test-integration/cjs-project/main.js | 33 ++++++++++++++++++++++ test-integration/cjs-project/package.json | 8 ++---- tsdown.config.ts | 4 +-- 6 files changed, 41 insertions(+), 9 deletions(-) create mode 100644 test-integration/cjs-project/.node-version create mode 100644 test-integration/cjs-project/main.js diff --git a/package-lock.json b/package-lock.json index cce74e7..1c82f07 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "vitest": "^3.2.4" }, "engines": { - "node": ">=22.19.0" + "node": ">=16" } }, "node_modules/@babel/generator": { diff --git a/package.json b/package.json index fb2c9d5..4c03bb3 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "vitest": "^3.2.4" }, "engines": { - "node": ">=22.19.0" + "node": ">=10.16.0" }, "packageManager": "npm@10.9.3" } diff --git a/test-integration/cjs-project/.node-version b/test-integration/cjs-project/.node-version new file mode 100644 index 0000000..f0da094 --- /dev/null +++ b/test-integration/cjs-project/.node-version @@ -0,0 +1 @@ +v10.16.0 diff --git a/test-integration/cjs-project/main.js b/test-integration/cjs-project/main.js new file mode 100644 index 0000000..1ef5025 --- /dev/null +++ b/test-integration/cjs-project/main.js @@ -0,0 +1,33 @@ +const { DockerClient } = require('@docker/node-sdk'); +const fs = require('fs'); + +async function main() { + try { + const docker = await DockerClient.fromDockerConfig(); + + await docker.systemPing(); + + const v = await docker.systemVersion(); + console.dir(v, { depth: null }); + + const ctr = await docker + .containerCreate({ + Image: 'alpine', + }) + .then((value) => { + console.dir(value, { depth: null }); + return value.Id; + }); + + const out = fs.createWriteStream('/tmp/test.tar'); + await docker.containerExport(ctr, out); + + docker.close(); + } catch (error) { + console.error(error); + } +} + +main().catch((error) => { + console.error('Error:', error); +}); diff --git a/test-integration/cjs-project/package.json b/test-integration/cjs-project/package.json index 71b42bc..6bcaa3f 100644 --- a/test-integration/cjs-project/package.json +++ b/test-integration/cjs-project/package.json @@ -3,14 +3,12 @@ "version": "1.0.0", "private": true, "scripts": { - "test": "node --test" + "test": "node --test", + "start": "node main.js" }, "type": "commonjs", + "main": "main.js", "dependencies": { "@docker/node-sdk": "file:../.." - }, - "devDependencies": { - "typescript": "^5.9.2", - "vitest": "^3.2.4" } } diff --git a/tsdown.config.ts b/tsdown.config.ts index 3621d28..41cc965 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -13,9 +13,9 @@ export default defineConfig({ sourcemap: true, unbundle: false, treeshake: false, - target: 'es2022', + target: ['es2022', 'node10.16.0'], platform: 'node', tsconfig: './tsconfig.json', - nodeProtocol: true, + nodeProtocol: 'strip', skipNodeModulesBundle: false, }); From 420ff009d11b187bfce8cac208544e157ed604eb Mon Sep 17 00:00:00 2001 From: Luke Bunselmeyer Date: Wed, 8 Oct 2025 17:27:19 -0400 Subject: [PATCH 02/10] Support current maintained Node TLS versions: 18, 20, and 22+ - Updated tsdown to target node18 - Updated `engines.node` versions - Updated test-integration projects to work with Node 18. --- package.json | 2 +- test-integration/cjs-project/.node-version | 2 +- test-integration/esm-project/.node-version | 1 + test-integration/esm-project/main.ts | 27 +++++++++++++++++++ test-integration/esm-project/package.json | 30 ++++++++++++---------- tsdown.config.ts | 2 +- 6 files changed, 47 insertions(+), 17 deletions(-) create mode 100644 test-integration/esm-project/.node-version create mode 100644 test-integration/esm-project/main.ts diff --git a/package.json b/package.json index 4c03bb3..ca87706 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "vitest": "^3.2.4" }, "engines": { - "node": ">=10.16.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "packageManager": "npm@10.9.3" } diff --git a/test-integration/cjs-project/.node-version b/test-integration/cjs-project/.node-version index f0da094..c3f7c27 100644 --- a/test-integration/cjs-project/.node-version +++ b/test-integration/cjs-project/.node-version @@ -1 +1 @@ -v10.16.0 +v18.20.8 diff --git a/test-integration/esm-project/.node-version b/test-integration/esm-project/.node-version new file mode 100644 index 0000000..c3f7c27 --- /dev/null +++ b/test-integration/esm-project/.node-version @@ -0,0 +1 @@ +v18.20.8 diff --git a/test-integration/esm-project/main.ts b/test-integration/esm-project/main.ts new file mode 100644 index 0000000..7c7c595 --- /dev/null +++ b/test-integration/esm-project/main.ts @@ -0,0 +1,27 @@ +import { DockerClient } from '@docker/node-sdk'; +import { createWriteStream } from 'node:fs'; + +try { + const docker = await DockerClient.fromDockerConfig(); + + await docker.systemPing(); + + const v = await docker.systemVersion(); + console.dir(v, { depth: null }); + + const ctr = await docker + .containerCreate({ + Image: 'alpine', + }) + .then((value) => { + console.dir(value, { depth: null }); + return value.Id; + }); + + const out = createWriteStream('/tmp/test.tar'); + await docker.containerExport(ctr, out); + + docker.close(); +} catch (error) { + console.error(error); +} diff --git a/test-integration/esm-project/package.json b/test-integration/esm-project/package.json index ab130ab..8c550fb 100644 --- a/test-integration/esm-project/package.json +++ b/test-integration/esm-project/package.json @@ -1,16 +1,18 @@ { - "name": "esm-project", - "version": "1.0.0", - "private": true, - "scripts": { - "test": "node --test" - }, - "type": "module", - "dependencies": { - "@docker/node-sdk": "file:../.." - }, - "devDependencies": { - "@types/node": "^24.5.2", - "typescript": "^5.9.2" - } + "name": "esm-project", + "version": "1.0.0", + "private": true, + "scripts": { + "test": "tsx --test import.test.ts", + "start": "tsx main.ts" + }, + "type": "module", + "dependencies": { + "@docker/node-sdk": "file:../.." + }, + "devDependencies": { + "@types/node": "^24.5.2", + "tsx": "^4.20.6", + "typescript": "^5.9.2" + } } diff --git a/tsdown.config.ts b/tsdown.config.ts index 41cc965..10e0e1b 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -13,7 +13,7 @@ export default defineConfig({ sourcemap: true, unbundle: false, treeshake: false, - target: ['es2022', 'node10.16.0'], + target: ['es2022', 'node18'], platform: 'node', tsconfig: './tsconfig.json', nodeProtocol: 'strip', From 354f6f23ee7feac4c2c87a041879f0ef1e027756 Mon Sep 17 00:00:00 2001 From: Luke Bunselmeyer Date: Wed, 8 Oct 2025 17:34:12 -0400 Subject: [PATCH 03/10] Add `node:` prefix to built-in node libs --- tsdown.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsdown.config.ts b/tsdown.config.ts index 10e0e1b..2577a47 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -16,6 +16,6 @@ export default defineConfig({ target: ['es2022', 'node18'], platform: 'node', tsconfig: './tsconfig.json', - nodeProtocol: 'strip', + nodeProtocol: true, skipNodeModulesBundle: false, }); From 6fdf97422829a32493e4204a7e98a5d12bb0395a Mon Sep 17 00:00:00 2001 From: Luke Bunselmeyer Date: Wed, 8 Oct 2025 20:40:30 -0400 Subject: [PATCH 04/10] Replace `/tmp` with `os.tmpdir()` --- main.ts | 3 ++- test-integration/cjs-project/main.js | 3 ++- test-integration/esm-project/main.ts | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/main.ts b/main.ts index 3c79d25..a1c6493 100644 --- a/main.ts +++ b/main.ts @@ -1,5 +1,6 @@ import { DockerClient } from './lib/docker-client.js'; import { createWriteStream } from 'node:fs'; +import { tmpdir } from 'node:os'; try { const docker = await DockerClient.fromDockerConfig(); @@ -18,7 +19,7 @@ try { return value.Id; }); - const out = createWriteStream('/tmp/test.tar'); + const out = createWriteStream(tmpdir() + '/test.tar'); await docker.containerExport(ctr, out); docker.close(); diff --git a/test-integration/cjs-project/main.js b/test-integration/cjs-project/main.js index 1ef5025..4b08bce 100644 --- a/test-integration/cjs-project/main.js +++ b/test-integration/cjs-project/main.js @@ -1,5 +1,6 @@ const { DockerClient } = require('@docker/node-sdk'); const fs = require('fs'); +const os = require('os'); async function main() { try { @@ -19,7 +20,7 @@ async function main() { return value.Id; }); - const out = fs.createWriteStream('/tmp/test.tar'); + const out = fs.createWriteStream(os.tmpdir() + '/test.tar'); await docker.containerExport(ctr, out); docker.close(); diff --git a/test-integration/esm-project/main.ts b/test-integration/esm-project/main.ts index 7c7c595..c588859 100644 --- a/test-integration/esm-project/main.ts +++ b/test-integration/esm-project/main.ts @@ -1,5 +1,6 @@ import { DockerClient } from '@docker/node-sdk'; import { createWriteStream } from 'node:fs'; +import { tmpdir } from 'node:os'; try { const docker = await DockerClient.fromDockerConfig(); @@ -18,7 +19,7 @@ try { return value.Id; }); - const out = createWriteStream('/tmp/test.tar'); + const out = createWriteStream(tmpdir() + '/test.tar'); await docker.containerExport(ctr, out); docker.close(); From 75d4c6c4f8dfb3d832b09eecc5872e44361fede0 Mon Sep 17 00:00:00 2001 From: Luke Bunselmeyer Date: Wed, 8 Oct 2025 21:04:18 -0400 Subject: [PATCH 05/10] Fixed possible logging of sensitive information --- main.ts | 4 ++-- test-integration/cjs-project/main.js | 2 +- test-integration/esm-project/main.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/main.ts b/main.ts index a1c6493..0fd11db 100644 --- a/main.ts +++ b/main.ts @@ -23,6 +23,6 @@ try { await docker.containerExport(ctr, out); docker.close(); -} catch (error) { - console.error(error); +} catch (error: any) { + console.error(`Error: ${error.message ?? error}`); } diff --git a/test-integration/cjs-project/main.js b/test-integration/cjs-project/main.js index 4b08bce..4f8080d 100644 --- a/test-integration/cjs-project/main.js +++ b/test-integration/cjs-project/main.js @@ -25,7 +25,7 @@ async function main() { docker.close(); } catch (error) { - console.error(error); + console.error(`Error: ${error.message ?? error}`); } } diff --git a/test-integration/esm-project/main.ts b/test-integration/esm-project/main.ts index c588859..8bd7044 100644 --- a/test-integration/esm-project/main.ts +++ b/test-integration/esm-project/main.ts @@ -23,6 +23,6 @@ try { await docker.containerExport(ctr, out); docker.close(); -} catch (error) { - console.error(error); +} catch (error: any) { + console.error(`Error: ${error?.message ?? error}`); } From 282bbe342759dd0fd1814cfc60ac44e2648f7607 Mon Sep 17 00:00:00 2001 From: Luke Bunselmeyer Date: Wed, 8 Oct 2025 21:50:55 -0400 Subject: [PATCH 06/10] Added node versions to GHA CI matrix --- .github/workflows/ci.yml | 12 ++++++++---- package-lock.json | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4fc5419..e99bce0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,15 +23,19 @@ jobs: - 28 - 27 - master + node: + - 18 + - 20 + - 22 steps: - name: Checkout uses: actions/checkout@v4 - - name: Setup Node + - name: Setup Node v${{ matrix.node }} uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 #v4.0.3 with: cache: npm - node-version-file: .node-version + node-version: ${{ matrix.node }} - name: Install run: | @@ -45,7 +49,7 @@ jobs: run: | npm run typecheck - - name: Set up Docker + - name: Set up Docker v${{ matrix.engine }} id: engine uses: docker/setup-docker-action@v4 with: @@ -57,7 +61,7 @@ jobs: env: DOCKER_HOST: ${{ steps.engine.outputs.sock }} - - name: Install + - name: Build run: | npm run build diff --git a/package-lock.json b/package-lock.json index 1c82f07..03b4ca0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "vitest": "^3.2.4" }, "engines": { - "node": ">=16" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" } }, "node_modules/@babel/generator": { From 2d6ff6eee73dcf9f7d8bfeaeae1531fe944c1763 Mon Sep 17 00:00:00 2001 From: Luke Bunselmeyer Date: Wed, 8 Oct 2025 22:05:03 -0400 Subject: [PATCH 07/10] Added node versions to GHA CI matrix --- .github/workflows/ci.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e99bce0..7b6fad5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -31,11 +31,11 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Setup Node v${{ matrix.node }} + - name: Setup Node for Build & Unit Tests uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 #v4.0.3 with: cache: npm - node-version: ${{ matrix.node }} + node-version-file: .node-version - name: Install run: | @@ -65,6 +65,12 @@ jobs: run: | npm run build + - name: Setup Node v${{ matrix.node }} for Integration Tests + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 #v4.0.3 + with: + cache: npm + node-version: ${{ matrix.node }} + - name: Integration tests ESM working-directory: ./test-integration/esm-project run: | From 844a0ecc23dcfc7a04412e46fd54769ba517dd74 Mon Sep 17 00:00:00 2001 From: Luke Bunselmeyer Date: Wed, 8 Oct 2025 22:15:49 -0400 Subject: [PATCH 08/10] Refactored GHA CI workflows: reorganized build and integration steps, removed redundant Docker configurations, and introduced a separate CI matrix for Node 18, 20, and 22. --- .github/workflows/ci.yml | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7b6fad5..51ed90f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,10 +23,6 @@ jobs: - 28 - 27 - master - node: - - 18 - - 20 - - 22 steps: - name: Checkout uses: actions/checkout@v4 @@ -49,7 +45,7 @@ jobs: run: | npm run typecheck - - name: Set up Docker v${{ matrix.engine }} + - name: Set up Docker id: engine uses: docker/setup-docker-action@v4 with: @@ -61,10 +57,39 @@ jobs: env: DOCKER_HOST: ${{ steps.engine.outputs.sock }} + ci-integration: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + node: + - 18 + - 20 + - 22 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node for Build & Unit Tests + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 #v4.0.3 + with: + cache: npm + node-version-file: .node-version + + - name: Install + run: | + npm install + - name: Build run: | npm run build + - name: Set up Docker + id: engine + uses: docker/setup-docker-action@v4 + with: + version: type=image,version=28 + - name: Setup Node v${{ matrix.node }} for Integration Tests uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 #v4.0.3 with: @@ -76,9 +101,13 @@ jobs: run: | npm install --install-links npm run test + env: + DOCKER_HOST: ${{ steps.engine.outputs.sock }} - name: Integration tests CJS working-directory: ./test-integration/cjs-project run: | npm install --install-links npm run test + env: + DOCKER_HOST: ${{ steps.engine.outputs.sock }} From 472a2e356ea0ca75e650108c31ab2a7633a60d58 Mon Sep 17 00:00:00 2001 From: Luke Bunselmeyer Date: Wed, 8 Oct 2025 22:25:10 -0400 Subject: [PATCH 09/10] Reorganized GHA workflows: separated build and integration steps, added artifact upload/download, and restructured CI matrix dependencies. --- .github/workflows/ci.yml | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 51ed90f..3e3a3a4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,7 +27,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Setup Node for Build & Unit Tests + - name: Setup Node for Unit Tests uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 #v4.0.3 with: cache: npm @@ -57,20 +57,13 @@ jobs: env: DOCKER_HOST: ${{ steps.engine.outputs.sock }} - ci-integration: + build: runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - node: - - 18 - - 20 - - 22 steps: - name: Checkout uses: actions/checkout@v4 - - name: Setup Node for Build & Unit Tests + - name: Setup Node for Build uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 #v4.0.3 with: cache: npm @@ -84,6 +77,32 @@ jobs: run: | npm run build + - name: Upload build artifacts + uses: actions/upload-artifact@v4 + with: + name: build-output + path: dist/ + + ci-integration: + runs-on: ubuntu-latest + needs: build + strategy: + fail-fast: false + matrix: + node: + - 18 + - 20 + - 22 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Download build artifacts + uses: actions/download-artifact@v4 + with: + name: build-output + path: dist + - name: Set up Docker id: engine uses: docker/setup-docker-action@v4 From 90918d247afdb6ad29f87e8d0b7622c5f7f4899f Mon Sep 17 00:00:00 2001 From: Luke Bunselmeyer Date: Wed, 8 Oct 2025 22:36:10 -0400 Subject: [PATCH 10/10] Resolve Unpinned tag for a non-immutable Action in workflow --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3e3a3a4..0f0ad04 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -47,7 +47,7 @@ jobs: - name: Set up Docker id: engine - uses: docker/setup-docker-action@v4 + uses: docker/setup-docker-action@b60f85385d03ac8acfca6d9996982511d8620a19 #v4.3.0 with: version: type=image,version=${{ matrix.engine }} @@ -105,7 +105,7 @@ jobs: - name: Set up Docker id: engine - uses: docker/setup-docker-action@v4 + uses: docker/setup-docker-action@b60f85385d03ac8acfca6d9996982511d8620a19 #v4.3.0 with: version: type=image,version=28