diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4fc5419..0f0ad04 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 + - name: Setup Node for Unit Tests uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 #v4.0.3 with: cache: npm @@ -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 }} @@ -57,18 +57,76 @@ jobs: env: DOCKER_HOST: ${{ steps.engine.outputs.sock }} + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node for Build + 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: 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@b60f85385d03ac8acfca6d9996982511d8620a19 #v4.3.0 + with: + version: type=image,version=28 + + - 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: | 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 }} diff --git a/main.ts b/main.ts index 3c79d25..0fd11db 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,10 +19,10 @@ try { return value.Id; }); - const out = createWriteStream('/tmp/test.tar'); + const out = createWriteStream(tmpdir() + '/test.tar'); await docker.containerExport(ctr, out); docker.close(); -} catch (error) { - console.error(error); +} catch (error: any) { + console.error(`Error: ${error.message ?? error}`); } diff --git a/package-lock.json b/package-lock.json index cce74e7..03b4ca0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "vitest": "^3.2.4" }, "engines": { - "node": ">=22.19.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" } }, "node_modules/@babel/generator": { diff --git a/package.json b/package.json index fb2c9d5..ca87706 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "vitest": "^3.2.4" }, "engines": { - "node": ">=22.19.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 new file mode 100644 index 0000000..c3f7c27 --- /dev/null +++ b/test-integration/cjs-project/.node-version @@ -0,0 +1 @@ +v18.20.8 diff --git a/test-integration/cjs-project/main.js b/test-integration/cjs-project/main.js new file mode 100644 index 0000000..4f8080d --- /dev/null +++ b/test-integration/cjs-project/main.js @@ -0,0 +1,34 @@ +const { DockerClient } = require('@docker/node-sdk'); +const fs = require('fs'); +const os = require('os'); + +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(os.tmpdir() + '/test.tar'); + await docker.containerExport(ctr, out); + + docker.close(); + } catch (error) { + console.error(`Error: ${error.message ?? 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/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..8bd7044 --- /dev/null +++ b/test-integration/esm-project/main.ts @@ -0,0 +1,28 @@ +import { DockerClient } from '@docker/node-sdk'; +import { createWriteStream } from 'node:fs'; +import { tmpdir } from 'node:os'; + +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(tmpdir() + '/test.tar'); + await docker.containerExport(ctr, out); + + docker.close(); +} catch (error: any) { + console.error(`Error: ${error?.message ?? 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 3621d28..2577a47 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -13,7 +13,7 @@ export default defineConfig({ sourcemap: true, unbundle: false, treeshake: false, - target: 'es2022', + target: ['es2022', 'node18'], platform: 'node', tsconfig: './tsconfig.json', nodeProtocol: true,