From faa5b5bf222ec4e9baf6c4e2b98c844748c8d7f4 Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Wed, 28 Jan 2026 10:34:04 +0100 Subject: [PATCH 1/5] switch to ESM and update config/test wiring Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- ...sProcessor.js => testResultsProcessor.cjs} | 0 eslint.config.js => eslint.config.cjs | 4 +-- jest.config.js => jest.config.cjs | 13 ++++++-- jest.config.itg.js => jest.config.itg.cjs | 13 ++++++-- package.json | 7 ++-- src/buildkit/buildkit.ts | 10 +++--- src/buildkit/config.ts | 2 +- src/buildkit/git.ts | 2 +- src/buildx/bake.ts | 14 ++++---- src/buildx/build.ts | 14 ++++---- src/buildx/builder.ts | 6 ++-- src/buildx/buildx.ts | 18 +++++------ src/buildx/history.ts | 14 ++++---- src/buildx/imagetools.ts | 12 +++---- src/buildx/install.ts | 20 ++++++------ src/compose/compose.ts | 4 +-- src/compose/install.ts | 12 +++---- src/context.ts | 2 +- src/cosign/cosign.ts | 4 +-- src/cosign/install.ts | 20 ++++++------ src/docker/assets.ts | 2 +- src/docker/docker.ts | 10 +++--- src/docker/install.ts | 20 ++++++------ src/dockerhub.ts | 2 +- src/git.ts | 6 ++-- src/github.ts | 4 +-- src/index.ts | 2 +- src/oci/oci.ts | 14 ++++---- src/regclient/install.ts | 10 +++--- src/regclient/regctl.ts | 4 +-- src/sigstore/sigstore.ts | 14 ++++---- src/toolkit.ts | 32 +++++++++---------- src/types/buildkit/client.ts | 4 +-- src/types/buildkit/control.ts | 8 ++--- src/types/buildx/buildx.ts | 2 +- src/types/buildx/imagetools.ts | 6 ++-- src/types/compose/compose.ts | 2 +- src/types/cosign/cosign.ts | 2 +- src/types/github.ts | 4 +-- src/types/oci/config.ts | 4 +-- src/types/oci/descriptor.ts | 4 +-- src/types/oci/index.ts | 4 +-- src/types/oci/manifest.ts | 4 +-- src/types/oci/oci.ts | 8 ++--- src/types/regclient/regclient.ts | 2 +- src/types/sigstore/sigstore.ts | 4 +-- src/types/undock/undock.ts | 2 +- src/undock/install.ts | 10 +++--- src/undock/undock.ts | 2 +- tsconfig.json | 5 +-- 50 files changed, 202 insertions(+), 186 deletions(-) rename __tests__/{testResultsProcessor.js => testResultsProcessor.cjs} (100%) rename eslint.config.js => eslint.config.cjs (93%) rename jest.config.js => jest.config.cjs (90%) rename jest.config.itg.js => jest.config.itg.cjs (85%) diff --git a/__tests__/testResultsProcessor.js b/__tests__/testResultsProcessor.cjs similarity index 100% rename from __tests__/testResultsProcessor.js rename to __tests__/testResultsProcessor.cjs diff --git a/eslint.config.js b/eslint.config.cjs similarity index 93% rename from eslint.config.js rename to eslint.config.cjs index dfaf93e..fe8611b 100644 --- a/eslint.config.js +++ b/eslint.config.cjs @@ -62,7 +62,7 @@ module.exports = defineConfig([ }, parser: tsParser, ecmaVersion: 2023, - sourceType: 'commonjs' + sourceType: 'module' }, rules: { @@ -75,7 +75,7 @@ module.exports = defineConfig([ 'import/no-unresolved': [ 'error', { - ignore: ['csv-parse/sync', '@octokit/openapi-types'] + ignore: ['\\.js$', 'csv-parse/sync', '@octokit/openapi-types', '@octokit/core', '@octokit/plugin-rest-endpoint-methods'] } ], 'jest/no-disabled-tests': 0 diff --git a/jest.config.js b/jest.config.cjs similarity index 90% rename from jest.config.js rename to jest.config.cjs index 2a4a458..019056b 100644 --- a/jest.config.js +++ b/jest.config.cjs @@ -38,13 +38,20 @@ module.exports = { setupFiles: ['dotenv/config'], testMatch: ['**/*.test.ts'], transform: { - '^.+\\.ts$': 'ts-jest' + '^.+\\.ts$': [ + 'ts-jest', + { + useESM: true + } + ] }, moduleNameMapper: { - '^csv-parse/sync': '/node_modules/csv-parse/dist/cjs/sync.cjs' + '^csv-parse/sync': '/node_modules/csv-parse/dist/cjs/sync.cjs', + '^(\\.{1,2}/.*)\\.js$': '$1' }, + extensionsToTreatAsEsm: ['.ts'], collectCoverageFrom: ['src/**/{!(index.ts),}.ts'], coveragePathIgnorePatterns: ['lib/', 'node_modules/', '__mocks__/', '__tests__/'], - testResultsProcessor: '/__tests__/testResultsProcessor.js', + testResultsProcessor: '/__tests__/testResultsProcessor.cjs', verbose: true }; diff --git a/jest.config.itg.js b/jest.config.itg.cjs similarity index 85% rename from jest.config.itg.js rename to jest.config.itg.cjs index a05e702..18c8ab3 100644 --- a/jest.config.itg.js +++ b/jest.config.itg.cjs @@ -21,11 +21,18 @@ module.exports = { testMatch: ['**/*.test.itg.ts'], testTimeout: 1800000, // 30 minutes transform: { - '^.+\\.ts$': 'ts-jest' + '^.+\\.ts$': [ + 'ts-jest', + { + useESM: true + } + ] }, moduleNameMapper: { - '^csv-parse/sync': '/node_modules/csv-parse/dist/cjs/sync.cjs' + '^csv-parse/sync': '/node_modules/csv-parse/dist/cjs/sync.cjs', + '^(\\.{1,2}/.*)\\.js$': '$1' }, - testResultsProcessor: '/__tests__/testResultsProcessor.js', + extensionsToTreatAsEsm: ['.ts'], + testResultsProcessor: '/__tests__/testResultsProcessor.cjs', verbose: false }; diff --git a/package.json b/package.json index 107ee74..bfd231f 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "name": "@docker/actions-toolkit", "version": "0.0.0+unknown", "description": "Toolkit for Docker (GitHub) Actions", + "type": "module", "scripts": { "build": "tsc", "lint": "yarn run prettier && yarn run eslint", @@ -12,9 +13,9 @@ "prettier:fix": "prettier --write \"./**/*.ts\"", "test": "jest", "test:coverage": "jest --coverage", - "test:itg": "jest -c jest.config.itg.js --runInBand", - "test:itg-list": "jest -c jest.config.itg.js --listTests", - "test:itg-coverage": "jest -c jest.config.itg.js --coverage --runInBand" + "test:itg": "jest -c jest.config.itg.cjs --runInBand", + "test:itg-list": "jest -c jest.config.itg.cjs --listTests", + "test:itg-coverage": "jest -c jest.config.itg.cjs --coverage --runInBand" }, "repository": { "type": "git", diff --git a/src/buildkit/buildkit.ts b/src/buildkit/buildkit.ts index ee90ab4..dbf80ae 100644 --- a/src/buildkit/buildkit.ts +++ b/src/buildkit/buildkit.ts @@ -17,12 +17,12 @@ import * as core from '@actions/core'; import * as semver from 'semver'; -import {Buildx} from '../buildx/buildx'; -import {Builder} from '../buildx/builder'; -import {Docker} from '../docker/docker'; -import {Config} from './config'; +import {Buildx} from '../buildx/buildx.js'; +import {Builder} from '../buildx/builder.js'; +import {Docker} from '../docker/docker.js'; +import {Config} from './config.js'; -import {BuilderInfo, NodeInfo} from '../types/buildx/builder'; +import {BuilderInfo, NodeInfo} from '../types/buildx/builder.js'; export interface BuildKitOpts { buildx?: Buildx; diff --git a/src/buildkit/config.ts b/src/buildkit/config.ts index 9563b4c..bd9fa7b 100644 --- a/src/buildkit/config.ts +++ b/src/buildkit/config.ts @@ -16,7 +16,7 @@ import fs from 'fs'; -import {Context} from '../context'; +import {Context} from '../context.js'; export class Config { public resolveFromString(s: string): string { diff --git a/src/buildkit/git.ts b/src/buildkit/git.ts index 2415b59..cb9d68d 100644 --- a/src/buildkit/git.ts +++ b/src/buildkit/git.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {GitRef, GitURL, GitURLFragment, URLUserInfo} from '../types/buildkit/git'; +import {GitRef, GitURL, GitURLFragment, URLUserInfo} from '../types/buildkit/git.js'; export class Git { private static protoRegexp = new RegExp('^[a-zA-Z0-9]+://'); diff --git a/src/buildx/bake.ts b/src/buildx/bake.ts index db0dfd0..7730f9e 100644 --- a/src/buildx/bake.ts +++ b/src/buildx/bake.ts @@ -18,15 +18,15 @@ import fs from 'fs'; import path from 'path'; import {parse} from 'csv-parse/sync'; -import {Buildx} from './buildx'; -import {Context} from '../context'; -import {Exec} from '../exec'; -import {Util} from '../util'; +import {Buildx} from './buildx.js'; +import {Context} from '../context.js'; +import {Exec} from '../exec.js'; +import {Util} from '../util.js'; import {ExecOptions} from '@actions/exec'; -import {AttestEntry, BakeDefinition, CacheEntry, ExportEntry, SecretEntry, SSHEntry} from '../types/buildx/bake'; -import {BuildMetadata} from '../types/buildx/build'; -import {VertexWarning} from '../types/buildkit/client'; +import {AttestEntry, BakeDefinition, CacheEntry, ExportEntry, SecretEntry, SSHEntry} from '../types/buildx/bake.js'; +import {BuildMetadata} from '../types/buildx/build.js'; +import {VertexWarning} from '../types/buildkit/client.js'; export interface BakeOpts { buildx?: Buildx; diff --git a/src/buildx/build.ts b/src/buildx/build.ts index cd385e8..5cf3e91 100644 --- a/src/buildx/build.ts +++ b/src/buildx/build.ts @@ -19,14 +19,14 @@ import path from 'path'; import * as core from '@actions/core'; import {parse} from 'csv-parse/sync'; -import {Buildx} from './buildx'; -import {Context} from '../context'; -import {GitHub} from '../github'; -import {Util} from '../util'; +import {Buildx} from './buildx.js'; +import {Context} from '../context.js'; +import {GitHub} from '../github.js'; +import {Util} from '../util.js'; -import {BuildMetadata} from '../types/buildx/build'; -import {VertexWarning} from '../types/buildkit/client'; -import {ProvenancePredicate} from '../types/intoto/slsa_provenance/v0.2/provenance'; +import {BuildMetadata} from '../types/buildx/build.js'; +import {VertexWarning} from '../types/buildkit/client.js'; +import {ProvenancePredicate} from '../types/intoto/slsa_provenance/v0.2/provenance.js'; export interface BuildOpts { buildx?: Buildx; diff --git a/src/buildx/builder.ts b/src/buildx/builder.ts index 2e54e8e..8f902a1 100644 --- a/src/buildx/builder.ts +++ b/src/buildx/builder.ts @@ -16,10 +16,10 @@ import * as core from '@actions/core'; -import {Buildx} from './buildx'; -import {Exec} from '../exec'; +import {Buildx} from './buildx.js'; +import {Exec} from '../exec.js'; -import {BuilderInfo, Device, GCPolicy, NodeInfo} from '../types/buildx/builder'; +import {BuilderInfo, Device, GCPolicy, NodeInfo} from '../types/buildx/builder.js'; export interface BuilderOpts { buildx?: Buildx; diff --git a/src/buildx/buildx.ts b/src/buildx/buildx.ts index ef5f41c..2b26a1b 100644 --- a/src/buildx/buildx.ts +++ b/src/buildx/buildx.ts @@ -19,16 +19,16 @@ import path from 'path'; import * as core from '@actions/core'; import * as semver from 'semver'; -import {Git} from '../buildkit/git'; -import {Docker} from '../docker/docker'; -import {GitHub} from '../github'; -import {Exec} from '../exec'; -import {Util} from '../util'; +import {Git} from '../buildkit/git.js'; +import {Docker} from '../docker/docker.js'; +import {GitHub} from '../github.js'; +import {Exec} from '../exec.js'; +import {Util} from '../util.js'; -import {VertexWarning} from '../types/buildkit/client'; -import {GitURL} from '../types/buildkit/git'; -import {Cert, LocalRefsOpts, LocalRefsResponse, LocalState} from '../types/buildx/buildx'; -import {GitHubAnnotation} from '../types/github'; +import {VertexWarning} from '../types/buildkit/client.js'; +import {GitURL} from '../types/buildkit/git.js'; +import {Cert, LocalRefsOpts, LocalRefsResponse, LocalState} from '../types/buildx/buildx.js'; +import {GitHubAnnotation} from '../types/github.js'; export interface BuildxOpts { standalone?: boolean; diff --git a/src/buildx/history.ts b/src/buildx/history.ts index 02abde6..c8067ff 100644 --- a/src/buildx/history.ts +++ b/src/buildx/history.ts @@ -21,14 +21,14 @@ import path from 'path'; import {Readable, Writable} from 'stream'; import * as core from '@actions/core'; -import {Buildx} from './buildx'; -import {Context} from '../context'; -import {Docker} from '../docker/docker'; -import {Exec} from '../exec'; -import {GitHub} from '../github'; -import {Util} from '../util'; +import {Buildx} from './buildx.js'; +import {Context} from '../context.js'; +import {Docker} from '../docker/docker.js'; +import {Exec} from '../exec.js'; +import {GitHub} from '../github.js'; +import {Util} from '../util.js'; -import {ExportOpts, ExportResponse, InspectOpts, InspectResponse, Summaries} from '../types/buildx/history'; +import {ExportOpts, ExportResponse, InspectOpts, InspectResponse, Summaries} from '../types/buildx/history.js'; export interface HistoryOpts { buildx?: Buildx; diff --git a/src/buildx/imagetools.ts b/src/buildx/imagetools.ts index dfaac46..ca35acd 100644 --- a/src/buildx/imagetools.ts +++ b/src/buildx/imagetools.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import {Buildx} from './buildx'; -import {Exec} from '../exec'; +import {Buildx} from './buildx.js'; +import {Exec} from '../exec.js'; -import {Manifest as ImageToolsManifest} from '../types/buildx/imagetools'; -import {Image} from '../types/oci/config'; -import {Descriptor, Platform} from '../types/oci/descriptor'; -import {Digest} from '../types/oci/digest'; +import {Manifest as ImageToolsManifest} from '../types/buildx/imagetools.js'; +import {Image} from '../types/oci/config.js'; +import {Descriptor, Platform} from '../types/oci/descriptor.js'; +import {Digest} from '../types/oci/digest.js'; export interface ImageToolsOpts { buildx?: Buildx; diff --git a/src/buildx/install.ts b/src/buildx/install.ts index 2fc61f8..293b152 100644 --- a/src/buildx/install.ts +++ b/src/buildx/install.ts @@ -22,17 +22,17 @@ import * as tc from '@actions/tool-cache'; import * as semver from 'semver'; import * as util from 'util'; -import {Buildx} from './buildx'; -import {Cache} from '../cache'; -import {Context} from '../context'; -import {Exec} from '../exec'; -import {Docker} from '../docker/docker'; -import {Git} from '../git'; -import {GitHub} from '../github'; -import {Util} from '../util'; +import {Buildx} from './buildx.js'; +import {Cache} from '../cache.js'; +import {Context} from '../context.js'; +import {Exec} from '../exec.js'; +import {Docker} from '../docker/docker.js'; +import {Git} from '../git.js'; +import {GitHub} from '../github.js'; +import {Util} from '../util.js'; -import {DownloadVersion} from '../types/buildx/buildx'; -import {GitHubRelease} from '../types/github'; +import {DownloadVersion} from '../types/buildx/buildx.js'; +import {GitHubRelease} from '../types/github.js'; export interface InstallOpts { standalone?: boolean; diff --git a/src/compose/compose.ts b/src/compose/compose.ts index 5548b70..7b3327d 100644 --- a/src/compose/compose.ts +++ b/src/compose/compose.ts @@ -16,8 +16,8 @@ import * as core from '@actions/core'; -import {Docker} from '../docker/docker'; -import {Exec} from '../exec'; +import {Docker} from '../docker/docker.js'; +import {Exec} from '../exec.js'; export interface ComposeOpts { standalone?: boolean; diff --git a/src/compose/install.ts b/src/compose/install.ts index 1034982..de0456e 100644 --- a/src/compose/install.ts +++ b/src/compose/install.ts @@ -22,13 +22,13 @@ import * as tc from '@actions/tool-cache'; import * as semver from 'semver'; import * as util from 'util'; -import {Cache} from '../cache'; -import {Context} from '../context'; -import {Docker} from '../docker/docker'; -import {GitHub} from '../github'; +import {Cache} from '../cache.js'; +import {Context} from '../context.js'; +import {Docker} from '../docker/docker.js'; +import {GitHub} from '../github.js'; -import {DownloadVersion} from '../types/compose/compose'; -import {GitHubRelease} from '../types/github'; +import {DownloadVersion} from '../types/compose/compose.js'; +import {GitHubRelease} from '../types/github.js'; export interface InstallOpts { standalone?: boolean; diff --git a/src/context.ts b/src/context.ts index 502bb3e..0e6c040 100644 --- a/src/context.ts +++ b/src/context.ts @@ -20,7 +20,7 @@ import path from 'path'; import * as tmp from 'tmp'; import * as github from '@actions/github'; -import {GitHub} from './github'; +import {GitHub} from './github.js'; export class Context { private static readonly _tmpDir = fs.mkdtempSync(path.join(Context.ensureDirExists(process.env.RUNNER_TEMP || os.tmpdir()), 'docker-actions-toolkit-')); diff --git a/src/cosign/cosign.ts b/src/cosign/cosign.ts index f280caf..1b83cd0 100644 --- a/src/cosign/cosign.ts +++ b/src/cosign/cosign.ts @@ -17,9 +17,9 @@ import * as core from '@actions/core'; import {BUNDLE_V03_MEDIA_TYPE, SerializedBundle} from '@sigstore/bundle'; -import {Exec} from '../exec'; +import {Exec} from '../exec.js'; import * as semver from 'semver'; -import {MEDIATYPE_EMPTY_JSON_V1} from '../types/oci/mediatype'; +import {MEDIATYPE_EMPTY_JSON_V1} from '../types/oci/mediatype.js'; export interface CosignOpts { binPath?: string; diff --git a/src/cosign/install.ts b/src/cosign/install.ts index 4a512e2..56a0152 100644 --- a/src/cosign/install.ts +++ b/src/cosign/install.ts @@ -25,17 +25,17 @@ import {toSignedEntity, toTrustMaterial, Verifier} from '@sigstore/verify'; import * as semver from 'semver'; import * as util from 'util'; -import {Buildx} from '../buildx/buildx'; -import {Cache} from '../cache'; -import {Context} from '../context'; -import {Exec} from '../exec'; -import {Git} from '../git'; -import {GitHub} from '../github'; -import {Util} from '../util'; +import {Buildx} from '../buildx/buildx.js'; +import {Cache} from '../cache.js'; +import {Context} from '../context.js'; +import {Exec} from '../exec.js'; +import {Git} from '../git.js'; +import {GitHub} from '../github.js'; +import {Util} from '../util.js'; -import {DownloadVersion} from '../types/cosign/cosign'; -import {GitHubRelease} from '../types/github'; -import {dockerfileContent} from './dockerfile'; +import {DownloadVersion} from '../types/cosign/cosign.js'; +import {GitHubRelease} from '../types/github.js'; +import {dockerfileContent} from './dockerfile.js'; export interface DownloadOpts { version: string; diff --git a/src/docker/assets.ts b/src/docker/assets.ts index 89b7c26..abbd721 100644 --- a/src/docker/assets.ts +++ b/src/docker/assets.ts @@ -15,7 +15,7 @@ */ import fs from 'fs'; -import {Context} from '../context'; +import {Context} from '../context.js'; export const setupDockerWinPs1 = (): string => { return get('docker-setup-win.ps1', setupDockerWinPs1Data); diff --git a/src/docker/docker.ts b/src/docker/docker.ts index 7bb978e..f7fac24 100644 --- a/src/docker/docker.ts +++ b/src/docker/docker.ts @@ -21,12 +21,12 @@ import * as core from '@actions/core'; import {ExecOptions, ExecOutput} from '@actions/exec'; import * as io from '@actions/io'; -import {Context} from '../context'; -import {Cache} from '../cache'; -import {Exec} from '../exec'; -import {Util} from '../util'; +import {Context} from '../context.js'; +import {Cache} from '../cache.js'; +import {Exec} from '../exec.js'; +import {Util} from '../util.js'; -import {ConfigFile, ContextInfo} from '../types/docker/docker'; +import {ConfigFile, ContextInfo} from '../types/docker/docker.js'; export class Docker { static get configDir(): string { diff --git a/src/docker/install.ts b/src/docker/install.ts index a199678..5fcdb83 100644 --- a/src/docker/install.ts +++ b/src/docker/install.ts @@ -25,18 +25,18 @@ import * as core from '@actions/core'; import * as io from '@actions/io'; import * as tc from '@actions/tool-cache'; -import {Context} from '../context'; -import {Docker} from './docker'; -import {Exec} from '../exec'; -import {GitHub} from '../github'; -import {Regctl} from '../regclient/regctl'; -import {Undock} from '../undock/undock'; -import {Util} from '../util'; +import {Context} from '../context.js'; +import {Docker} from './docker.js'; +import {Exec} from '../exec.js'; +import {GitHub} from '../github.js'; +import {Regctl} from '../regclient/regctl.js'; +import {Undock} from '../undock/undock.js'; +import {Util} from '../util.js'; -import {limaYamlData, dockerServiceLogsPs1, setupDockerWinPs1} from './assets'; +import {limaYamlData, dockerServiceLogsPs1, setupDockerWinPs1} from './assets.js'; -import {GitHubRelease} from '../types/github'; -import {Image} from '../types/oci/config'; +import {GitHubRelease} from '../types/github.js'; +import {Image} from '../types/oci/config.js'; export interface InstallSourceImage { type: 'image'; diff --git a/src/dockerhub.ts b/src/dockerhub.ts index 3bf1d59..6bf8b43 100644 --- a/src/dockerhub.ts +++ b/src/dockerhub.ts @@ -18,7 +18,7 @@ import * as core from '@actions/core'; import * as httpm from '@actions/http-client'; import {HttpCodes} from '@actions/http-client'; -import {RepositoryRequest, RepositoryResponse, RepositoryTagsRequest, RepositoryTagsResponse, TokenRequest, TokenResponse, UpdateRepoDescriptionRequest} from './types/dockerhub'; +import {RepositoryRequest, RepositoryResponse, RepositoryTagsRequest, RepositoryTagsResponse, TokenRequest, TokenResponse, UpdateRepoDescriptionRequest} from './types/dockerhub.js'; export interface DockerHubOpts { credentials: TokenRequest; diff --git a/src/git.ts b/src/git.ts index c43af4d..879727f 100644 --- a/src/git.ts +++ b/src/git.ts @@ -18,11 +18,11 @@ import * as core from '@actions/core'; import {Octokit} from '@octokit/core'; import {restEndpointMethods} from '@octokit/plugin-rest-endpoint-methods'; -import {Exec} from './exec'; -import {GitHub} from './github'; +import {Exec} from './exec.js'; +import {GitHub} from './github.js'; import {Context} from '@actions/github/lib/context'; -import {Context as GitContext} from './types/git'; +import {Context as GitContext} from './types/git.js'; export class Git { public static async context(): Promise { diff --git a/src/github.ts b/src/github.ts index c5a335c..3d31fda 100644 --- a/src/github.ts +++ b/src/github.ts @@ -36,9 +36,9 @@ import {TransferProgressEvent} from '@azure/core-rest-pipeline'; import {BlobClient, BlobHTTPHeaders} from '@azure/storage-blob'; import {jwtDecode, JwtPayload} from 'jwt-decode'; -import {Util} from './util'; +import {Util} from './util.js'; -import {BuildSummaryOpts, GitHubActionsRuntimeToken, GitHubActionsRuntimeTokenAC, GitHubContentOpts, GitHubRelease, GitHubRepo, UploadArtifactOpts, UploadArtifactResponse} from './types/github'; +import {BuildSummaryOpts, GitHubActionsRuntimeToken, GitHubActionsRuntimeTokenAC, GitHubContentOpts, GitHubRelease, GitHubRepo, UploadArtifactOpts, UploadArtifactResponse} from './types/github.js'; export interface GitHubOpts { token?: string; diff --git a/src/index.ts b/src/index.ts index 9c23eac..e58f646 100644 --- a/src/index.ts +++ b/src/index.ts @@ -16,7 +16,7 @@ import * as core from '@actions/core'; -import {Cache} from './cache'; +import {Cache} from './cache.js'; const isPost = !!process.env['STATE_isPost']; if (!isPost) { diff --git a/src/oci/oci.ts b/src/oci/oci.ts index da888b4..c1dff3a 100644 --- a/src/oci/oci.ts +++ b/src/oci/oci.ts @@ -20,13 +20,13 @@ import * as path from 'path'; import {Readable} from 'stream'; import * as tar from 'tar-stream'; -import {Archive, LoadArchiveOpts} from '../types/oci/oci'; -import {Index} from '../types/oci'; -import {Platform} from '../types/oci/descriptor'; -import {Manifest} from '../types/oci/manifest'; -import {Image} from '../types/oci/config'; -import {IMAGE_BLOBS_DIR_V1, IMAGE_INDEX_FILE_V1, IMAGE_LAYOUT_FILE_V1, ImageLayout} from '../types/oci/layout'; -import {MEDIATYPE_IMAGE_INDEX_V1, MEDIATYPE_IMAGE_MANIFEST_V1} from '../types/oci/mediatype'; +import {Archive, LoadArchiveOpts} from '../types/oci/oci.js'; +import {Index} from '../types/oci/index.js'; +import {Platform} from '../types/oci/descriptor.js'; +import {Manifest} from '../types/oci/manifest.js'; +import {Image} from '../types/oci/config.js'; +import {IMAGE_BLOBS_DIR_V1, IMAGE_INDEX_FILE_V1, IMAGE_LAYOUT_FILE_V1, ImageLayout} from '../types/oci/layout.js'; +import {MEDIATYPE_IMAGE_INDEX_V1, MEDIATYPE_IMAGE_MANIFEST_V1} from '../types/oci/mediatype.js'; export class OCI { public static defaultPlatform(): Platform { diff --git a/src/regclient/install.ts b/src/regclient/install.ts index 5c14aaf..9edb407 100644 --- a/src/regclient/install.ts +++ b/src/regclient/install.ts @@ -22,12 +22,12 @@ import * as tc from '@actions/tool-cache'; import * as semver from 'semver'; import * as util from 'util'; -import {Cache} from '../cache'; -import {Context} from '../context'; -import {GitHub} from '../github'; +import {Cache} from '../cache.js'; +import {Context} from '../context.js'; +import {GitHub} from '../github.js'; -import {GitHubRelease} from '../types/github'; -import {DownloadVersion} from '../types/regclient/regclient'; +import {GitHubRelease} from '../types/github.js'; +import {DownloadVersion} from '../types/regclient/regclient.js'; export interface InstallOpts { githubToken?: string; diff --git a/src/regclient/regctl.ts b/src/regclient/regctl.ts index b784d9d..868cab8 100644 --- a/src/regclient/regctl.ts +++ b/src/regclient/regctl.ts @@ -17,9 +17,9 @@ import * as core from '@actions/core'; import * as semver from 'semver'; -import {Exec} from '../exec'; +import {Exec} from '../exec.js'; -import {Manifest} from '../types/oci/manifest'; +import {Manifest} from '../types/oci/manifest.js'; export interface RegctlOpts { binPath?: string; diff --git a/src/sigstore/sigstore.ts b/src/sigstore/sigstore.ts index 8b8ad0e..6fa8966 100644 --- a/src/sigstore/sigstore.ts +++ b/src/sigstore/sigstore.ts @@ -22,13 +22,13 @@ import * as core from '@actions/core'; import {bundleFromJSON, bundleToJSON} from '@sigstore/bundle'; import {Artifact, Bundle, CIContextProvider, DSSEBundleBuilder, FulcioSigner, RekorWitness, TSAWitness, Witness} from '@sigstore/sign'; -import {Context} from '../context'; -import {Cosign} from '../cosign/cosign'; -import {Exec} from '../exec'; -import {GitHub} from '../github'; -import {ImageTools} from '../buildx/imagetools'; +import {Context} from '../context.js'; +import {Cosign} from '../cosign/cosign.js'; +import {Exec} from '../exec.js'; +import {GitHub} from '../github.js'; +import {ImageTools} from '../buildx/imagetools.js'; -import {MEDIATYPE_PAYLOAD as INTOTO_MEDIATYPE_PAYLOAD, Subject} from '../types/intoto/intoto'; +import {MEDIATYPE_PAYLOAD as INTOTO_MEDIATYPE_PAYLOAD, Subject} from '../types/intoto/intoto.js'; import { Endpoints, FULCIO_URL, @@ -44,7 +44,7 @@ import { VerifySignedArtifactsResult, VerifySignedManifestsOpts, VerifySignedManifestsResult -} from '../types/sigstore/sigstore'; +} from '../types/sigstore/sigstore.js'; export interface SigstoreOpts { cosign?: Cosign; diff --git a/src/toolkit.ts b/src/toolkit.ts index 1994276..1563ce0 100644 --- a/src/toolkit.ts +++ b/src/toolkit.ts @@ -14,22 +14,22 @@ * limitations under the License. */ -import {GitHub} from './github'; -import {Buildx} from './buildx/buildx'; -import {Build as BuildxBuild} from './buildx/build'; -import {Bake as BuildxBake} from './buildx/bake'; -import {Install as BuildxInstall} from './buildx/install'; -import {Builder} from './buildx/builder'; -import {BuildKit} from './buildkit/buildkit'; -import {Compose} from './compose/compose'; -import {Install as ComposeInstall} from './compose/install'; -import {Cosign} from './cosign/cosign'; -import {Install as CosignInstall} from './cosign/install'; -import {Regctl} from './regclient/regctl'; -import {Install as RegctlInstall} from './regclient/install'; -import {Undock} from './undock/undock'; -import {Install as UndockInstall} from './undock/install'; -import {Sigstore} from './sigstore/sigstore'; +import {GitHub} from './github.js'; +import {Buildx} from './buildx/buildx.js'; +import {Build as BuildxBuild} from './buildx/build.js'; +import {Bake as BuildxBake} from './buildx/bake.js'; +import {Install as BuildxInstall} from './buildx/install.js'; +import {Builder} from './buildx/builder.js'; +import {BuildKit} from './buildkit/buildkit.js'; +import {Compose} from './compose/compose.js'; +import {Install as ComposeInstall} from './compose/install.js'; +import {Cosign} from './cosign/cosign.js'; +import {Install as CosignInstall} from './cosign/install.js'; +import {Regctl} from './regclient/regctl.js'; +import {Install as RegctlInstall} from './regclient/install.js'; +import {Undock} from './undock/undock.js'; +import {Install as UndockInstall} from './undock/install.js'; +import {Sigstore} from './sigstore/sigstore.js'; export interface ToolkitOpts { /** diff --git a/src/types/buildkit/client.ts b/src/types/buildkit/client.ts index 0a91342..a14f445 100644 --- a/src/types/buildkit/client.ts +++ b/src/types/buildkit/client.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import {Digest} from '../oci/digest'; -import {ProgressGroup, Range, SourceInfo} from './ops'; +import {Digest} from '../oci/digest.js'; +import {ProgressGroup, Range, SourceInfo} from './ops.js'; // https://github.com/moby/buildkit/blob/v0.14.0/client/graph.go#L10-L19 export interface Vertex { diff --git a/src/types/buildkit/control.ts b/src/types/buildkit/control.ts index 3d3f157..0d7f975 100644 --- a/src/types/buildkit/control.ts +++ b/src/types/buildkit/control.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import {Descriptor} from '../oci/descriptor'; -import {Digest} from '../oci/digest'; -import {ProgressGroup, Range, SourceInfo} from './ops'; -import {RpcStatus} from './rpc'; +import {Descriptor} from '../oci/descriptor.js'; +import {Digest} from '../oci/digest.js'; +import {ProgressGroup, Range, SourceInfo} from './ops.js'; +import {RpcStatus} from './rpc.js'; // https://github.com/moby/buildkit/blob/v0.14.0/api/services/control/control.pb.go#L1504-L1525 export interface BuildHistoryRecord { diff --git a/src/types/buildx/buildx.ts b/src/types/buildx/buildx.ts index 10ede92..0047a19 100644 --- a/src/types/buildx/buildx.ts +++ b/src/types/buildx/buildx.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {GitHubContentOpts} from '../github'; +import {GitHubContentOpts} from '../github.js'; export interface Cert { cacert?: string; diff --git a/src/types/buildx/imagetools.ts b/src/types/buildx/imagetools.ts index 4594c7f..ce2007f 100644 --- a/src/types/buildx/imagetools.ts +++ b/src/types/buildx/imagetools.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import {Versioned} from '../oci/versioned'; -import {Descriptor} from '../oci/descriptor'; -import {Digest} from '../oci/digest'; +import {Versioned} from '../oci/versioned.js'; +import {Descriptor} from '../oci/descriptor.js'; +import {Digest} from '../oci/digest.js'; // https://github.com/docker/buildx/blob/62857022a08552bee5cad0c3044a9a3b185f0b32/util/imagetools/printers.go#L109-L123 export interface Manifest extends Versioned { diff --git a/src/types/compose/compose.ts b/src/types/compose/compose.ts index 4e69ea9..8bb536d 100644 --- a/src/types/compose/compose.ts +++ b/src/types/compose/compose.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {GitHubContentOpts} from '../github'; +import {GitHubContentOpts} from '../github.js'; export interface DownloadVersion { key: string; diff --git a/src/types/cosign/cosign.ts b/src/types/cosign/cosign.ts index 4aca14b..cda1036 100644 --- a/src/types/cosign/cosign.ts +++ b/src/types/cosign/cosign.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {GitHubContentOpts} from '../github'; +import {GitHubContentOpts} from '../github.js'; export interface DownloadVersion { version: string; diff --git a/src/types/github.ts b/src/types/github.ts index 8fc4bbe..33b4fcf 100644 --- a/src/types/github.ts +++ b/src/types/github.ts @@ -18,8 +18,8 @@ import {AnnotationProperties} from '@actions/core'; import {components as OctoOpenApiTypes} from '@octokit/openapi-types'; import {JwtPayload} from 'jwt-decode'; -import {BakeDefinition} from './buildx/bake'; -import {ExportResponse} from './buildx/history'; +import {BakeDefinition} from './buildx/bake.js'; +import {ExportResponse} from './buildx/history.js'; export interface GitHubRelease { id: number; diff --git a/src/types/oci/config.ts b/src/types/oci/config.ts index b9f0d1c..eec0502 100644 --- a/src/types/oci/config.ts +++ b/src/types/oci/config.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import {Digest} from './digest'; -import {Platform} from './descriptor'; +import {Digest} from './digest.js'; +import {Platform} from './descriptor.js'; export interface ImageConfig { User?: string; diff --git a/src/types/oci/descriptor.ts b/src/types/oci/descriptor.ts index e2de5f8..65b6796 100644 --- a/src/types/oci/descriptor.ts +++ b/src/types/oci/descriptor.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import {Digest} from './digest'; +import {Digest} from './digest.js'; -import {MEDIATYPE_EMPTY_JSON_V1} from './mediatype'; +import {MEDIATYPE_EMPTY_JSON_V1} from './mediatype.js'; export interface Descriptor { mediaType: string; diff --git a/src/types/oci/index.ts b/src/types/oci/index.ts index 480aab5..2dcf054 100644 --- a/src/types/oci/index.ts +++ b/src/types/oci/index.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import {Versioned} from './versioned'; -import {Descriptor} from './descriptor'; +import {Versioned} from './versioned.js'; +import {Descriptor} from './descriptor.js'; export interface Index extends Versioned { mediaType?: string; diff --git a/src/types/oci/manifest.ts b/src/types/oci/manifest.ts index 14e28a6..d774162 100644 --- a/src/types/oci/manifest.ts +++ b/src/types/oci/manifest.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import {Descriptor} from './descriptor'; -import {Versioned} from './versioned'; +import {Descriptor} from './descriptor.js'; +import {Versioned} from './versioned.js'; export interface Manifest extends Versioned { mediaType?: string; diff --git a/src/types/oci/oci.ts b/src/types/oci/oci.ts index 0b36a71..e0483e2 100644 --- a/src/types/oci/oci.ts +++ b/src/types/oci/oci.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import {Index} from './index'; -import {ImageLayout} from './layout'; -import {Manifest} from './manifest'; -import {Image} from './config'; +import {Index} from './index.js'; +import {ImageLayout} from './layout.js'; +import {Manifest} from './manifest.js'; +import {Image} from './config.js'; export interface LoadArchiveOpts { file: string; diff --git a/src/types/regclient/regclient.ts b/src/types/regclient/regclient.ts index 4aca14b..cda1036 100644 --- a/src/types/regclient/regclient.ts +++ b/src/types/regclient/regclient.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {GitHubContentOpts} from '../github'; +import {GitHubContentOpts} from '../github.js'; export interface DownloadVersion { version: string; diff --git a/src/types/sigstore/sigstore.ts b/src/types/sigstore/sigstore.ts index b08e1ff..d6a2d70 100644 --- a/src/types/sigstore/sigstore.ts +++ b/src/types/sigstore/sigstore.ts @@ -16,8 +16,8 @@ import type {SerializedBundle} from '@sigstore/bundle'; -import {Subject} from '../intoto/intoto'; -import {Platform} from '../oci/descriptor'; +import {Subject} from '../intoto/intoto.js'; +import {Platform} from '../oci/descriptor.js'; export const FULCIO_URL = 'https://fulcio.sigstore.dev'; export const REKOR_URL = 'https://rekor.sigstore.dev'; diff --git a/src/types/undock/undock.ts b/src/types/undock/undock.ts index 21374ca..745ca28 100644 --- a/src/types/undock/undock.ts +++ b/src/types/undock/undock.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {GitHubContentOpts} from '../github'; +import {GitHubContentOpts} from '../github.js'; export interface DownloadVersion { version: string; diff --git a/src/undock/install.ts b/src/undock/install.ts index 2b19003..887a254 100644 --- a/src/undock/install.ts +++ b/src/undock/install.ts @@ -22,12 +22,12 @@ import * as tc from '@actions/tool-cache'; import * as semver from 'semver'; import * as util from 'util'; -import {Cache} from '../cache'; -import {Context} from '../context'; -import {GitHub} from '../github'; +import {Cache} from '../cache.js'; +import {Context} from '../context.js'; +import {GitHub} from '../github.js'; -import {GitHubRelease} from '../types/github'; -import {DownloadVersion} from '../types/undock/undock'; +import {GitHubRelease} from '../types/github.js'; +import {DownloadVersion} from '../types/undock/undock.js'; export interface InstallOpts { githubToken?: string; diff --git a/src/undock/undock.ts b/src/undock/undock.ts index f75b320..a93017b 100644 --- a/src/undock/undock.ts +++ b/src/undock/undock.ts @@ -17,7 +17,7 @@ import * as core from '@actions/core'; import * as semver from 'semver'; -import {Exec} from '../exec'; +import {Exec} from '../exec.js'; export interface UndockOpts { binPath?: string; diff --git a/tsconfig.json b/tsconfig.json index 9dd4a98..88dabea 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,8 +1,8 @@ { "compilerOptions": { + "module": "es2020", + "moduleResolution": "bundler", "esModuleInterop": true, - "target": "es6", - "module": "node16", "isolatedModules": true, "strict": true, "declaration": true, @@ -14,6 +14,7 @@ "noImplicitAny": false, "resolveJsonModule": true, "useUnknownInCatchVariables": false, + "skipLibCheck": true, }, "exclude": [ "./__mocks__/**/*", From 8a49a6ea9cc420d2f502aa1f3b3c4b344897df3e Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Wed, 28 Jan 2026 10:52:08 +0100 Subject: [PATCH 2/5] remove the mapper entry for csv-parse in jest config Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- jest.config.cjs | 1 - jest.config.itg.cjs | 1 - 2 files changed, 2 deletions(-) diff --git a/jest.config.cjs b/jest.config.cjs index 019056b..6104c12 100644 --- a/jest.config.cjs +++ b/jest.config.cjs @@ -46,7 +46,6 @@ module.exports = { ] }, moduleNameMapper: { - '^csv-parse/sync': '/node_modules/csv-parse/dist/cjs/sync.cjs', '^(\\.{1,2}/.*)\\.js$': '$1' }, extensionsToTreatAsEsm: ['.ts'], diff --git a/jest.config.itg.cjs b/jest.config.itg.cjs index 18c8ab3..477478f 100644 --- a/jest.config.itg.cjs +++ b/jest.config.itg.cjs @@ -29,7 +29,6 @@ module.exports = { ] }, moduleNameMapper: { - '^csv-parse/sync': '/node_modules/csv-parse/dist/cjs/sync.cjs', '^(\\.{1,2}/.*)\\.js$': '$1' }, extensionsToTreatAsEsm: ['.ts'], From 3f7be6d97d121ef2bdaf3e9135a3082a1c285c20 Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Wed, 28 Jan 2026 11:52:41 +0100 Subject: [PATCH 3/5] add ESM-safe os test helpers and tsconfig for tests Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- __tests__/.helpers/os.ts | 30 +++++++++++++++++++++++++++++ __tests__/buildx/install.test.ts | 9 +++++---- __tests__/compose/install.test.ts | 9 +++++---- __tests__/cosign/install.test.ts | 9 +++++---- __tests__/docker/docker.test.ts | 5 +++-- __tests__/docker/install.test.ts | 7 ++++--- __tests__/oci/oci.test.ts | 9 +++++---- __tests__/regclient/install.test.ts | 9 +++++---- __tests__/undock/install.test.ts | 9 +++++---- jest.config.cjs | 3 ++- jest.config.itg.cjs | 3 ++- tsconfig.test.json | 15 +++++++++++++++ 12 files changed, 86 insertions(+), 31 deletions(-) create mode 100644 __tests__/.helpers/os.ts create mode 100644 tsconfig.test.json diff --git a/__tests__/.helpers/os.ts b/__tests__/.helpers/os.ts new file mode 100644 index 0000000..0f2f770 --- /dev/null +++ b/__tests__/.helpers/os.ts @@ -0,0 +1,30 @@ +/** + * Copyright 2025 actions-toolkit authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {jest} from '@jest/globals'; +import os from 'os'; + +export const mockPlatform = (platform: NodeJS.Platform) => { + return jest.spyOn(os, 'platform').mockImplementation(() => platform); +}; + +export const mockArch = (arch: string) => { + return jest.spyOn(os, 'arch').mockImplementation(() => arch); +}; + +export const mockHomedir = (dir: string) => { + return jest.spyOn(os, 'homedir').mockImplementation(() => dir); +}; diff --git a/__tests__/buildx/install.test.ts b/__tests__/buildx/install.test.ts index 9defe18..fcfa311 100644 --- a/__tests__/buildx/install.test.ts +++ b/__tests__/buildx/install.test.ts @@ -14,12 +14,13 @@ * limitations under the License. */ -import {describe, expect, it, jest, test, afterEach} from '@jest/globals'; +import {describe, expect, it, test, afterEach} from '@jest/globals'; import fs from 'fs'; import os from 'os'; import path from 'path'; import * as rimraf from 'rimraf'; -import osm = require('os'); + +import {mockArch, mockPlatform} from '../.helpers/os'; import {Install} from '../../src/buildx/install'; @@ -85,8 +86,8 @@ describe('download', () => { ['linux', 's390x'], ])( 'acquires buildx for %s/%s', async (os, arch) => { - jest.spyOn(osm, 'platform').mockImplementation(() => os as NodeJS.Platform); - jest.spyOn(osm, 'arch').mockImplementation(() => arch); + mockPlatform(os as NodeJS.Platform); + mockArch(arch); const install = new Install(); const buildxBin = await install.download('latest'); expect(fs.existsSync(buildxBin)).toBe(true); diff --git a/__tests__/compose/install.test.ts b/__tests__/compose/install.test.ts index c87ea0c..b50da2c 100644 --- a/__tests__/compose/install.test.ts +++ b/__tests__/compose/install.test.ts @@ -14,12 +14,13 @@ * limitations under the License. */ -import {describe, expect, it, jest, test, afterEach} from '@jest/globals'; +import {describe, expect, it, test, afterEach} from '@jest/globals'; import fs from 'fs'; import os from 'os'; import path from 'path'; import * as rimraf from 'rimraf'; -import osm = require('os'); + +import {mockArch, mockPlatform} from '../.helpers/os'; import {Install} from '../../src/compose/install'; @@ -85,8 +86,8 @@ describe('download', () => { ['linux', 's390x'], ])( 'acquires compose for %s/%s', async (os, arch) => { - jest.spyOn(osm, 'platform').mockImplementation(() => os as NodeJS.Platform); - jest.spyOn(osm, 'arch').mockImplementation(() => arch); + mockPlatform(os as NodeJS.Platform); + mockArch(arch); const install = new Install(); const composeBin = await install.download('latest'); expect(fs.existsSync(composeBin)).toBe(true); diff --git a/__tests__/cosign/install.test.ts b/__tests__/cosign/install.test.ts index f77fe10..4a97fc8 100644 --- a/__tests__/cosign/install.test.ts +++ b/__tests__/cosign/install.test.ts @@ -14,12 +14,13 @@ * limitations under the License. */ -import {describe, expect, it, jest, test, afterEach} from '@jest/globals'; +import {describe, expect, it, test, afterEach} from '@jest/globals'; import fs from 'fs'; import os from 'os'; import path from 'path'; import * as rimraf from 'rimraf'; -import osm = require('os'); + +import {mockArch, mockPlatform} from '../.helpers/os'; import {Install} from '../../src/cosign/install'; @@ -80,8 +81,8 @@ describe('download', () => { ['linux', 'arm64'] ])( 'acquires undock for %s/%s', async (os, arch) => { - jest.spyOn(osm, 'platform').mockImplementation(() => os as NodeJS.Platform); - jest.spyOn(osm, 'arch').mockImplementation(() => arch); + mockPlatform(os as NodeJS.Platform); + mockArch(arch); const install = new Install(); const cosignBin = await install.download({ version: 'latest' diff --git a/__tests__/docker/docker.test.ts b/__tests__/docker/docker.test.ts index c0bd65a..483c52a 100644 --- a/__tests__/docker/docker.test.ts +++ b/__tests__/docker/docker.test.ts @@ -19,9 +19,10 @@ import fs from 'fs'; import os from 'os'; import path from 'path'; import * as io from '@actions/io'; -import osm = require('os'); import * as rimraf from 'rimraf'; +import {mockHomedir} from '../.helpers/os'; + import {Docker} from '../../src/docker/docker'; import {ConfigFile} from '../../src/types/docker/docker'; @@ -47,7 +48,7 @@ describe('configDir', () => { }); it('returns default', async () => { process.env.DOCKER_CONFIG = ''; - jest.spyOn(osm, 'homedir').mockImplementation(() => path.join('/tmp', 'home')); + mockHomedir(path.join('/tmp', 'home')); expect(Docker.configDir).toEqual(path.join('/tmp', 'home', '.docker')); }); it('returns from env', async () => { diff --git a/__tests__/docker/install.test.ts b/__tests__/docker/install.test.ts index 7b1d1ce..aebec66 100644 --- a/__tests__/docker/install.test.ts +++ b/__tests__/docker/install.test.ts @@ -19,7 +19,8 @@ import fs from 'fs'; import os from 'os'; import path from 'path'; import * as rimraf from 'rimraf'; -import osm = require('os'); + +import {mockArch, mockPlatform} from '../.helpers/os'; import {Install, InstallSourceArchive, InstallSourceImage} from '../../src/docker/install'; @@ -60,8 +61,8 @@ describe('download', () => { [image('27.3.1'), 'win32'], ])( 'acquires %p of docker (%s)', async (source, platformOS) => { - jest.spyOn(osm, 'platform').mockImplementation(() => platformOS as NodeJS.Platform); - jest.spyOn(osm, 'arch').mockImplementation(() => 'x64'); + mockPlatform(platformOS as NodeJS.Platform); + mockArch('x64'); const install = new Install({ source: source, runDir: tmpDir diff --git a/__tests__/oci/oci.test.ts b/__tests__/oci/oci.test.ts index 684f88f..0125ee7 100644 --- a/__tests__/oci/oci.test.ts +++ b/__tests__/oci/oci.test.ts @@ -14,12 +14,13 @@ * limitations under the License. */ -import {afterEach, describe, expect, jest, test} from '@jest/globals'; +import {afterEach, describe, expect, test} from '@jest/globals'; import fs from 'fs'; import os from 'os'; import path from 'path'; import * as rimraf from 'rimraf'; -import osm = require('os'); + +import {mockArch, mockPlatform} from '../.helpers/os'; import {OCI} from '../../src/oci/oci'; @@ -44,8 +45,8 @@ describe('defaultPlatform', () => { ['linux', 'ppc64', {architecture: 'ppc64le', os: 'linux'}], ['linux', 's390x', {architecture: 's390x', os: 'linux'}] ])('default platform for %s/%s', async (os: string, arch: string, expected: Platform) => { - jest.spyOn(osm, 'platform').mockImplementation(() => os as NodeJS.Platform); - jest.spyOn(osm, 'arch').mockImplementation(() => arch); + mockPlatform(os as NodeJS.Platform); + mockArch(arch); const res = OCI.defaultPlatform(); expect(res).toEqual(expected); }); diff --git a/__tests__/regclient/install.test.ts b/__tests__/regclient/install.test.ts index 132fd7a..90733a8 100644 --- a/__tests__/regclient/install.test.ts +++ b/__tests__/regclient/install.test.ts @@ -14,12 +14,13 @@ * limitations under the License. */ -import {describe, expect, it, jest, test, afterEach} from '@jest/globals'; +import {describe, expect, it, test, afterEach} from '@jest/globals'; import fs from 'fs'; import os from 'os'; import path from 'path'; import * as rimraf from 'rimraf'; -import osm = require('os'); + +import {mockArch, mockPlatform} from '../.helpers/os'; import {Install} from '../../src/regclient/install'; @@ -75,8 +76,8 @@ describe('download', () => { ['linux', 's390x'], ])( 'acquires regclient for %s/%s', async (os, arch) => { - jest.spyOn(osm, 'platform').mockImplementation(() => os as NodeJS.Platform); - jest.spyOn(osm, 'arch').mockImplementation(() => arch); + mockPlatform(os as NodeJS.Platform); + mockArch(arch); const install = new Install(); const regclientBin = await install.download('latest'); expect(fs.existsSync(regclientBin)).toBe(true); diff --git a/__tests__/undock/install.test.ts b/__tests__/undock/install.test.ts index fe604cf..3d07580 100644 --- a/__tests__/undock/install.test.ts +++ b/__tests__/undock/install.test.ts @@ -14,12 +14,13 @@ * limitations under the License. */ -import {describe, expect, it, jest, test, afterEach} from '@jest/globals'; +import {describe, expect, it, test, afterEach} from '@jest/globals'; import fs from 'fs'; import os from 'os'; import path from 'path'; import * as rimraf from 'rimraf'; -import osm = require('os'); + +import {mockArch, mockPlatform} from '../.helpers/os'; import {Install} from '../../src/undock/install'; @@ -80,8 +81,8 @@ describe('download', () => { ['linux', 's390x'], ])( 'acquires undock for %s/%s', async (os, arch) => { - jest.spyOn(osm, 'platform').mockImplementation(() => os as NodeJS.Platform); - jest.spyOn(osm, 'arch').mockImplementation(() => arch); + mockPlatform(os as NodeJS.Platform); + mockArch(arch); const install = new Install(); const undockBin = await install.download('latest'); expect(fs.existsSync(undockBin)).toBe(true); diff --git a/jest.config.cjs b/jest.config.cjs index 6104c12..374a9f0 100644 --- a/jest.config.cjs +++ b/jest.config.cjs @@ -41,7 +41,8 @@ module.exports = { '^.+\\.ts$': [ 'ts-jest', { - useESM: true + useESM: true, + tsconfig: '/tsconfig.test.json' } ] }, diff --git a/jest.config.itg.cjs b/jest.config.itg.cjs index 477478f..8754752 100644 --- a/jest.config.itg.cjs +++ b/jest.config.itg.cjs @@ -24,7 +24,8 @@ module.exports = { '^.+\\.ts$': [ 'ts-jest', { - useESM: true + useESM: true, + tsconfig: '/tsconfig.test.json' } ] }, diff --git a/tsconfig.test.json b/tsconfig.test.json new file mode 100644 index 0000000..d78b1e5 --- /dev/null +++ b/tsconfig.test.json @@ -0,0 +1,15 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "rootDir": ".", + "noEmit": true + }, + "include": [ + "src/**/*.ts", + "__tests__/**/*.ts" + ], + "exclude": [ + "lib", + "node_modules" + ] +} From 9348f81855b06da42c1abd815274e83805ed324b Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Wed, 28 Jan 2026 12:08:36 +0100 Subject: [PATCH 4/5] git: drop types/git and inline GitHub context type Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- src/git.ts | 6 +++--- src/github.ts | 6 ++---- src/types/git.ts | 19 ------------------- 3 files changed, 5 insertions(+), 26 deletions(-) delete mode 100644 src/types/git.ts diff --git a/src/git.ts b/src/git.ts index 879727f..b69f50b 100644 --- a/src/git.ts +++ b/src/git.ts @@ -15,18 +15,18 @@ */ import * as core from '@actions/core'; +import * as github from '@actions/github'; import {Octokit} from '@octokit/core'; import {restEndpointMethods} from '@octokit/plugin-rest-endpoint-methods'; import {Exec} from './exec.js'; import {GitHub} from './github.js'; -import {Context} from '@actions/github/lib/context'; -import {Context as GitContext} from './types/git.js'; +export type GitContext = typeof github.context; export class Git { public static async context(): Promise { - const ctx = new Context(); + const ctx = {...github.context} as GitContext; ctx.ref = await Git.ref(); ctx.sha = await Git.fullCommit(); return ctx; diff --git a/src/github.ts b/src/github.ts index 3d31fda..de943f7 100644 --- a/src/github.ts +++ b/src/github.ts @@ -29,8 +29,6 @@ import {InvalidResponseError, NetworkError} from '@actions/artifact'; import * as core from '@actions/core'; import {SummaryTableCell} from '@actions/core/lib/summary'; import * as github from '@actions/github'; -import {GitHub as Octokit} from '@actions/github/lib/utils'; -import {Context} from '@actions/github/lib/context'; import * as httpm from '@actions/http-client'; import {TransferProgressEvent} from '@azure/core-rest-pipeline'; import {BlobClient, BlobHTTPHeaders} from '@azure/storage-blob'; @@ -46,7 +44,7 @@ export interface GitHubOpts { export class GitHub { private readonly githubToken?: string; - public readonly octokit: InstanceType; + public readonly octokit: ReturnType; constructor(opts?: GitHubOpts) { this.githubToken = opts?.token || process.env.GITHUB_TOKEN; @@ -87,7 +85,7 @@ export class GitHub { return >JSON.parse(dt); } - static get context(): Context { + static get context(): typeof github.context { return github.context; } diff --git a/src/types/git.ts b/src/types/git.ts deleted file mode 100644 index 47cd3d0..0000000 --- a/src/types/git.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright 2023 actions-toolkit authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import {Context as GitHubContext} from '@actions/github/lib/context'; - -export type Context = GitHubContext; From 2617546094a4a2d7889a36f635c139a1a5210f70 Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Wed, 28 Jan 2026 12:16:30 +0100 Subject: [PATCH 5/5] github: derive summary table types from core API Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- src/github.ts | 3 +-- src/types/github.ts | 4 ++++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/github.ts b/src/github.ts index de943f7..403f254 100644 --- a/src/github.ts +++ b/src/github.ts @@ -27,7 +27,6 @@ import {getBackendIdsFromToken} from '@actions/artifact/lib/internal/shared/util import {getExpiration} from '@actions/artifact/lib/internal/upload/retention'; import {InvalidResponseError, NetworkError} from '@actions/artifact'; import * as core from '@actions/core'; -import {SummaryTableCell} from '@actions/core/lib/summary'; import * as github from '@actions/github'; import * as httpm from '@actions/http-client'; import {TransferProgressEvent} from '@azure/core-rest-pipeline'; @@ -36,7 +35,7 @@ import {jwtDecode, JwtPayload} from 'jwt-decode'; import {Util} from './util.js'; -import {BuildSummaryOpts, GitHubActionsRuntimeToken, GitHubActionsRuntimeTokenAC, GitHubContentOpts, GitHubRelease, GitHubRepo, UploadArtifactOpts, UploadArtifactResponse} from './types/github.js'; +import {BuildSummaryOpts, GitHubActionsRuntimeToken, GitHubActionsRuntimeTokenAC, GitHubContentOpts, GitHubRelease, GitHubRepo, SummaryTableCell, UploadArtifactOpts, UploadArtifactResponse} from './types/github.js'; export interface GitHubOpts { token?: string; diff --git a/src/types/github.ts b/src/types/github.ts index 33b4fcf..af184ef 100644 --- a/src/types/github.ts +++ b/src/types/github.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import * as core from '@actions/core'; import {AnnotationProperties} from '@actions/core'; import {components as OctoOpenApiTypes} from '@octokit/openapi-types'; import {JwtPayload} from 'jwt-decode'; @@ -21,6 +22,9 @@ import {JwtPayload} from 'jwt-decode'; import {BakeDefinition} from './buildx/bake.js'; import {ExportResponse} from './buildx/history.js'; +export type SummaryTableRow = Parameters[0][number]; +export type SummaryTableCell = Exclude; + export interface GitHubRelease { id: number; tag_name: string;