Merge pull request #602 from crazy-max/esm

switch to ESM and update config/test wiring
This commit is contained in:
CrazyMax
2026-03-03 14:38:00 +01:00
committed by GitHub
25 changed files with 1658 additions and 3989 deletions

View File

@@ -6,6 +6,5 @@
"singleQuote": true, "singleQuote": true,
"trailingComma": "none", "trailingComma": "none",
"bracketSpacing": false, "bracketSpacing": false,
"arrowParens": "avoid", "arrowParens": "avoid"
"parser": "typescript"
} }

View File

@@ -1,223 +0,0 @@
import {jest} from '@jest/globals';
export const context = {
repo: {
owner: 'docker',
repo: 'actions-toolkit'
},
ref: 'refs/heads/master',
runId: 123,
payload: {
after: '860c1904a1ce19322e91ac35af1ab07466440c37',
base_ref: null,
before: '5f3331d7f7044c18ca9f12c77d961c4d7cf3276a',
commits: [
{
author: {
email: 'crazy-max@users.noreply.github.com',
name: 'CrazyMax',
username: 'crazy-max'
},
committer: {
email: 'crazy-max@users.noreply.github.com',
name: 'CrazyMax',
username: 'crazy-max'
},
distinct: true,
id: '860c1904a1ce19322e91ac35af1ab07466440c37',
message: 'hello dev',
timestamp: '2022-04-19T11:27:24+02:00',
tree_id: 'd2c60af597e863787d2d27f569e30495b0b92820',
url: 'https://github.com/docker/test-docker-action/commit/860c1904a1ce19322e91ac35af1ab07466440c37'
}
],
compare: 'https://github.com/docker/test-docker-action/compare/5f3331d7f704...860c1904a1ce',
created: false,
deleted: false,
forced: false,
head_commit: {
author: {
email: 'crazy-max@users.noreply.github.com',
name: 'CrazyMax',
username: 'crazy-max'
},
committer: {
email: 'crazy-max@users.noreply.github.com',
name: 'CrazyMax',
username: 'crazy-max'
},
distinct: true,
id: '860c1904a1ce19322e91ac35af1ab07466440c37',
message: 'hello dev',
timestamp: '2022-04-19T11:27:24+02:00',
tree_id: 'd2c60af597e863787d2d27f569e30495b0b92820',
url: 'https://github.com/docker/test-docker-action/commit/860c1904a1ce19322e91ac35af1ab07466440c37'
},
organization: {
avatar_url: 'https://avatars.githubusercontent.com/u/5429470?v=4',
description: 'Docker helps developers bring their ideas to life by conquering the complexity of app development.',
events_url: 'https://api.github.com/orgs/docker/events',
hooks_url: 'https://api.github.com/orgs/docker/hooks',
id: 5429470,
issues_url: 'https://api.github.com/orgs/docker/issues',
login: 'docker',
members_url: 'https://api.github.com/orgs/docker/members{/member}',
node_id: 'MDEyOk9yZ2FuaXphdGlvbjU0Mjk0NzA=',
public_members_url: 'https://api.github.com/orgs/docker/public_members{/member}',
repos_url: 'https://api.github.com/orgs/docker/repos',
url: 'https://api.github.com/orgs/docker'
},
pusher: {
email: 'github@crazymax.dev',
name: 'crazy-max'
},
ref: 'refs/heads/dev',
repository: {
allow_forking: true,
archive_url: 'https://api.github.com/repos/docker/test-docker-action/{archive_format}{/ref}',
archived: false,
assignees_url: 'https://api.github.com/repos/docker/test-docker-action/assignees{/user}',
blobs_url: 'https://api.github.com/repos/docker/test-docker-action/git/blobs{/sha}',
branches_url: 'https://api.github.com/repos/docker/test-docker-action/branches{/branch}',
clone_url: 'https://github.com/docker/test-docker-action.git',
collaborators_url: 'https://api.github.com/repos/docker/test-docker-action/collaborators{/collaborator}',
comments_url: 'https://api.github.com/repos/docker/test-docker-action/comments{/number}',
commits_url: 'https://api.github.com/repos/docker/test-docker-action/commits{/sha}',
compare_url: 'https://api.github.com/repos/docker/test-docker-action/compare/{base}...{head}',
contents_url: 'https://api.github.com/repos/docker/test-docker-action/contents/{+path}',
contributors_url: 'https://api.github.com/repos/docker/test-docker-action/contributors',
created_at: 1596792180,
default_branch: 'master',
deployments_url: 'https://api.github.com/repos/docker/test-docker-action/deployments',
description: 'Test "Docker" Actions',
disabled: false,
downloads_url: 'https://api.github.com/repos/docker/test-docker-action/downloads',
events_url: 'https://api.github.com/repos/docker/test-docker-action/events',
fork: false,
forks: 1,
forks_count: 1,
forks_url: 'https://api.github.com/repos/docker/test-docker-action/forks',
full_name: 'docker/test-docker-action',
git_commits_url: 'https://api.github.com/repos/docker/test-docker-action/git/commits{/sha}',
git_refs_url: 'https://api.github.com/repos/docker/test-docker-action/git/refs{/sha}',
git_tags_url: 'https://api.github.com/repos/docker/test-docker-action/git/tags{/sha}',
git_url: 'git://github.com/docker/test-docker-action.git',
has_downloads: true,
has_issues: true,
has_pages: false,
has_projects: true,
has_wiki: true,
homepage: '',
hooks_url: 'https://api.github.com/repos/docker/test-docker-action/hooks',
html_url: 'https://github.com/docker/test-docker-action',
id: 285789493,
is_template: false,
issue_comment_url: 'https://api.github.com/repos/docker/test-docker-action/issues/comments{/number}',
issue_events_url: 'https://api.github.com/repos/docker/test-docker-action/issues/events{/number}',
issues_url: 'https://api.github.com/repos/docker/test-docker-action/issues{/number}',
keys_url: 'https://api.github.com/repos/docker/test-docker-action/keys{/key_id}',
labels_url: 'https://api.github.com/repos/docker/test-docker-action/labels{/name}',
language: 'JavaScript',
languages_url: 'https://api.github.com/repos/docker/test-docker-action/languages',
license: {
key: 'mit',
name: 'MIT License',
node_id: 'MDc6TGljZW5zZTEz',
spdx_id: 'MIT',
url: 'https://api.github.com/licenses/mit'
},
master_branch: 'master',
merges_url: 'https://api.github.com/repos/docker/test-docker-action/merges',
milestones_url: 'https://api.github.com/repos/docker/test-docker-action/milestones{/number}',
mirror_url: null,
name: 'test-docker-action',
node_id: 'MDEwOlJlcG9zaXRvcnkyODU3ODk0OTM=',
notifications_url: 'https://api.github.com/repos/docker/test-docker-action/notifications{?since,all,participating}',
open_issues: 6,
open_issues_count: 6,
organization: 'docker',
owner: {
avatar_url: 'https://avatars.githubusercontent.com/u/5429470?v=4',
email: 'info@docker.com',
events_url: 'https://api.github.com/users/docker/events{/privacy}',
followers_url: 'https://api.github.com/users/docker/followers',
following_url: 'https://api.github.com/users/docker/following{/other_user}',
gists_url: 'https://api.github.com/users/docker/gists{/gist_id}',
gravatar_id: '',
html_url: 'https://github.com/docker',
id: 5429470,
login: 'docker',
name: 'docker',
node_id: 'MDEyOk9yZ2FuaXphdGlvbjU0Mjk0NzA=',
organizations_url: 'https://api.github.com/users/docker/orgs',
received_events_url: 'https://api.github.com/users/docker/received_events',
repos_url: 'https://api.github.com/users/docker/repos',
site_admin: false,
starred_url: 'https://api.github.com/users/docker/starred{/owner}{/repo}',
subscriptions_url: 'https://api.github.com/users/docker/subscriptions',
type: 'Organization',
url: 'https://api.github.com/users/docker'
},
private: true,
pulls_url: 'https://api.github.com/repos/docker/test-docker-action/pulls{/number}',
pushed_at: 1650360446,
releases_url: 'https://api.github.com/repos/docker/test-docker-action/releases{/id}',
size: 796,
ssh_url: 'git@github.com:docker/test-docker-action.git',
stargazers: 0,
stargazers_count: 0,
stargazers_url: 'https://api.github.com/repos/docker/test-docker-action/stargazers',
statuses_url: 'https://api.github.com/repos/docker/test-docker-action/statuses/{sha}',
subscribers_url: 'https://api.github.com/repos/docker/test-docker-action/subscribers',
subscription_url: 'https://api.github.com/repos/docker/test-docker-action/subscription',
svn_url: 'https://github.com/docker/test-docker-action',
tags_url: 'https://api.github.com/repos/docker/test-docker-action/tags',
teams_url: 'https://api.github.com/repos/docker/test-docker-action/teams',
topics: [],
trees_url: 'https://api.github.com/repos/docker/test-docker-action/git/trees{/sha}',
updated_at: '2022-04-19T09:05:09Z',
url: 'https://github.com/docker/test-docker-action',
visibility: 'private',
watchers: 0,
watchers_count: 0
},
sender: {
avatar_url: 'https://avatars.githubusercontent.com/u/1951866?v=4',
events_url: 'https://api.github.com/users/crazy-max/events{/privacy}',
followers_url: 'https://api.github.com/users/crazy-max/followers',
following_url: 'https://api.github.com/users/crazy-max/following{/other_user}',
gists_url: 'https://api.github.com/users/crazy-max/gists{/gist_id}',
gravatar_id: '',
html_url: 'https://github.com/crazy-max',
id: 1951866,
login: 'crazy-max',
node_id: 'MDQ6VXNlcjE5NTE4NjY=',
organizations_url: 'https://api.github.com/users/crazy-max/orgs',
received_events_url: 'https://api.github.com/users/crazy-max/received_events',
repos_url: 'https://api.github.com/users/crazy-max/repos',
site_admin: false,
starred_url: 'https://api.github.com/users/crazy-max/starred{/owner}{/repo}',
subscriptions_url: 'https://api.github.com/users/crazy-max/subscriptions',
type: 'User',
url: 'https://api.github.com/users/crazy-max'
}
}
};
export const getOctokit = jest.fn(() => ({
rest: {
repos: {
getCommit: jest.fn(() =>
Promise.resolve({
data: {
commit: {
committer: {
date: '2024-11-13T13:42:28Z'
}
}
}
})
)
}
}
}));

View File

@@ -1,23 +1,12 @@
import {afterEach, beforeEach, describe, expect, test, it, jest} from '@jest/globals'; import {beforeEach, describe, expect, test, it, vi} from 'vitest';
import * as dotenv from 'dotenv'; import {Context} from '@actions/github/lib/context.js';
import * as fs from 'fs'; import {Git} from '@docker/actions-toolkit/lib/git.js';
import * as path from 'path'; import {Toolkit} from '@docker/actions-toolkit/lib/toolkit.js';
import {Context} from '@actions/github/lib/context';
import {Git} from '@docker/actions-toolkit/lib/git';
import {GitHub} from '@docker/actions-toolkit/lib/github';
import {Toolkit} from '@docker/actions-toolkit/lib/toolkit';
import {ContextSource, getContext, getInputs, Inputs} from '../src/context'; import * as context from '../src/context.js';
const toolkit = new Toolkit({githubToken: 'fake-github-token'}); const toolkit = new Toolkit({githubToken: 'fake-github-token'});
beforeEach(() => {
jest.clearAllMocks();
jest.spyOn(GitHub, 'context', 'get').mockImplementation((): Context => {
return new Context();
});
});
describe('getInputs', () => { describe('getInputs', () => {
beforeEach(() => { beforeEach(() => {
process.env = Object.keys(process.env).reduce((object, key) => { process.env = Object.keys(process.env).reduce((object, key) => {
@@ -29,14 +18,14 @@ describe('getInputs', () => {
}); });
// prettier-ignore // prettier-ignore
test.each([ const cases: [number, Map<string, string>, context.Inputs][] = [
[ [
0, 0,
new Map<string, string>([ new Map<string, string>([
['images', 'moby/buildkit\nghcr.io/moby/mbuildkit'], ['images', 'moby/buildkit\nghcr.io/moby/mbuildkit'],
]), ]),
{ {
context: ContextSource.workflow, context: context.ContextSource.workflow,
bakeTarget: 'docker-metadata-action', bakeTarget: 'docker-metadata-action',
flavor: [], flavor: [],
githubToken: '', githubToken: '',
@@ -47,7 +36,7 @@ describe('getInputs', () => {
sepTags: '\n', sepTags: '\n',
sepAnnotations: '\n', sepAnnotations: '\n',
tags: [], tags: [],
} as Inputs }
], ],
[ [
1, 1,
@@ -59,7 +48,7 @@ describe('getInputs', () => {
['sep-annotations', ','] ['sep-annotations', ',']
]), ]),
{ {
context: ContextSource.workflow, context: context.ContextSource.workflow,
bakeTarget: 'metadata', bakeTarget: 'metadata',
flavor: [], flavor: [],
githubToken: '', githubToken: '',
@@ -70,7 +59,7 @@ describe('getInputs', () => {
sepTags: ',', sepTags: ',',
sepAnnotations: ',', sepAnnotations: ',',
tags: [], tags: [],
} as Inputs }
], ],
[ [
2, 2,
@@ -78,7 +67,7 @@ describe('getInputs', () => {
['images', 'moby/buildkit\n#comment\nghcr.io/moby/mbuildkit'], ['images', 'moby/buildkit\n#comment\nghcr.io/moby/mbuildkit'],
]), ]),
{ {
context: ContextSource.workflow, context: context.ContextSource.workflow,
bakeTarget: 'docker-metadata-action', bakeTarget: 'docker-metadata-action',
flavor: [], flavor: [],
githubToken: '', githubToken: '',
@@ -89,53 +78,39 @@ describe('getInputs', () => {
sepTags: '\n', sepTags: '\n',
sepAnnotations: '\n', sepAnnotations: '\n',
tags: [], tags: [],
} as Inputs }
], ],
])( ];
'[%d] given %p as inputs, returns %p', test.each(cases)('[%d] given %o as inputs, returns %o', async (num: number, inputs: Map<string, string>, expected: context.Inputs) => {
async (num: number, inputs: Map<string, string>, expected: Inputs) => { inputs.forEach((value: string, name: string) => {
inputs.forEach((value: string, name: string) => { setInput(name, value);
setInput(name, value); });
}); const res = await context.getInputs();
expect(await getInputs()).toEqual(expected); expect(res).toEqual(expected);
} });
);
}); });
describe('getContext', () => { describe('getContext', () => {
const originalEnv = process.env;
beforeEach(() => {
jest.resetModules();
process.env = {
...originalEnv,
...dotenv.parse(fs.readFileSync(path.join(__dirname, 'fixtures/event_create_branch.env')))
};
});
afterEach(() => {
process.env = originalEnv;
});
it('workflow', async () => { it('workflow', async () => {
const context = await getContext(ContextSource.workflow, toolkit); const ctx = await context.getContext(context.ContextSource.workflow, toolkit);
expect(context.ref).toEqual('refs/heads/dev'); expect(ctx.ref).toEqual('refs/heads/dev');
expect(context.sha).toEqual('5f3331d7f7044c18ca9f12c77d961c4d7cf3276a'); expect(ctx.sha).toEqual('5f3331d7f7044c18ca9f12c77d961c4d7cf3276a');
expect(context.commitDate).toEqual(new Date('2024-11-13T13:42:28.000Z')); expect(ctx.commitDate).toEqual(new Date('2024-11-13T13:42:28.000Z'));
}); });
it('git', async () => { it('git', async () => {
jest.spyOn(Git, 'context').mockImplementation((): Promise<Context> => { vi.spyOn(Git, 'context').mockImplementation((): Promise<Context> => {
return Promise.resolve({ return Promise.resolve({
ref: 'refs/heads/git-test', ref: 'refs/heads/git-test',
sha: 'git-test-sha' sha: 'git-test-sha'
} as Context); } as Context);
}); });
jest.spyOn(Git, 'commitDate').mockImplementation(async (): Promise<Date> => { vi.spyOn(Git, 'commitDate').mockImplementation(async (): Promise<Date> => {
return new Date('2023-01-01T13:42:28.000Z'); return new Date('2023-01-01T13:42:28.000Z');
}); });
const context = await getContext(ContextSource.git, toolkit); const ctx = await context.getContext(context.ContextSource.git, toolkit);
expect(context.ref).toEqual('refs/heads/git-test'); expect(ctx.ref).toEqual('refs/heads/git-test');
expect(context.sha).toEqual('git-test-sha'); expect(ctx.sha).toEqual('git-test-sha');
expect(context.commitDate).toEqual(new Date('2023-01-01T13:42:28.000Z')); expect(ctx.commitDate).toEqual(new Date('2023-01-01T13:42:28.000Z'));
}); });
}); });

View File

@@ -1,6 +1,6 @@
import {describe, expect, test} from '@jest/globals'; import {describe, expect, test} from 'vitest';
import {Flavor, Transform} from '../src/flavor'; import {Flavor, Transform} from '../src/flavor.js';
describe('transform', () => { describe('transform', () => {
// prettier-ignore // prettier-ignore
@@ -175,7 +175,7 @@ describe('transform', () => {
if (!invalid) { if (!invalid) {
console.error(err); console.error(err);
} }
// eslint-disable-next-line jest/no-conditional-expect // eslint-disable-next-line vitest/no-conditional-expect
expect(true).toBe(invalid); expect(true).toBe(invalid);
} }
}); });

View File

@@ -1,6 +1,6 @@
import {describe, expect, test} from '@jest/globals'; import {describe, expect, test} from 'vitest';
import {Transform, Image} from '../src/image'; import {Transform, Image} from '../src/image.js';
describe('transform', () => { describe('transform', () => {
// prettier-ignore // prettier-ignore
@@ -95,7 +95,7 @@ describe('transform', () => {
if (!invalid) { if (!invalid) {
console.error(err); console.error(err);
} }
// eslint-disable-next-line jest/no-conditional-expect // eslint-disable-next-line vitest/no-conditional-expect
expect(true).toBe(invalid); expect(true).toBe(invalid);
} }
}); });

View File

@@ -1,39 +1,45 @@
import {beforeEach, describe, expect, jest, test} from '@jest/globals'; import {beforeEach, describe, expect, test, vi} from 'vitest';
import * as fs from 'fs'; import * as fs from 'fs';
import * as path from 'path'; import * as path from 'path';
import * as dotenv from 'dotenv'; import * as dotenv from 'dotenv';
import {Context} from '@actions/github/lib/context'; import {Context} from '@actions/github/lib/context.js';
import {GitHub} from '@docker/actions-toolkit/lib/github'; import {GitHub} from '@docker/actions-toolkit/lib/github.js';
import {Toolkit} from '@docker/actions-toolkit/lib/toolkit'; import {Toolkit} from '@docker/actions-toolkit/lib/toolkit.js';
import {GitHubRepo} from '@docker/actions-toolkit/lib/types/github'; import {GitHubRepo} from '@docker/actions-toolkit/lib/types/github.js';
import {ContextSource, getContext, getInputs, Inputs} from '../src/context'; import {ContextSource, getContext, getInputs, Inputs} from '../src/context.js';
import {Meta, Version} from '../src/meta'; import {Meta, Version} from '../src/meta.js';
import repoFixture from './fixtures/repo.json'; import repoFixture from './fixtures/repo.json' with {type: 'json'};
jest.spyOn(GitHub.prototype, 'repoData').mockImplementation((): Promise<GitHubRepo> => { vi.spyOn(GitHub.prototype, 'repoData').mockImplementation((): Promise<GitHubRepo> => {
return <Promise<GitHubRepo>>(repoFixture as unknown); return <Promise<GitHubRepo>>(repoFixture as unknown);
}); });
jest.spyOn(global.Date.prototype, 'toISOString').mockImplementation(() => { vi.spyOn(global.Date.prototype, 'toISOString').mockImplementation(() => {
return '2020-01-10T00:30:00.000Z'; return '2020-01-10T00:30:00.000Z';
}); });
jest.mock('moment-timezone', () => { vi.mock('moment-timezone', async () => {
return () => (jest.requireActual('moment-timezone') as typeof import('moment-timezone'))('2020-01-10T00:30:00.000Z'); const actual = await vi.importActual<unknown>('moment-timezone');
const actualModule = actual as {default?: (input?: string | Date) => unknown};
const momentTimezone = (typeof actual === 'function' ? actual : actualModule.default) as (input?: string | Date) => unknown;
return {
__esModule: true,
default: () => momentTimezone('2020-01-10T00:30:00.000Z')
};
}); });
beforeEach(() => { beforeEach(() => {
jest.clearAllMocks(); vi.clearAllMocks();
Object.keys(process.env).forEach(function (key) { Object.keys(process.env).forEach(function (key) {
if (key !== 'GITHUB_TOKEN' && key.startsWith('GITHUB_')) { if (key !== 'GITHUB_TOKEN' && key.startsWith('GITHUB_')) {
delete process.env[key]; delete process.env[key];
} }
}); });
jest.spyOn(GitHub, 'context', 'get').mockImplementation((): Context => { vi.spyOn(GitHub, 'context', 'get').mockImplementation((): Context => {
//@ts-expect-error partial info //@ts-expect-error partial info
return { return {
...new Context(), ...new Context(),
@@ -53,7 +59,7 @@ describe('isRawStatement', () => {
['{{ raw }}', true], ['{{ raw }}', true],
['{{ raw}}', true], ['{{ raw}}', true],
['{{raw}}', true], ['{{raw}}', true],
])('given %p pattern', async (pattern: string, expected: boolean) => { ])('given %o pattern', async (pattern: string, expected: boolean) => {
expect(Meta.isRawStatement(pattern)).toEqual(expected); expect(Meta.isRawStatement(pattern)).toEqual(expected);
}); });
}); });
@@ -79,7 +85,7 @@ const tagsLabelsTest = async (name: string, envFile: string, inputs: Inputs, exV
describe('null', () => { describe('null', () => {
// prettier-ignore // prettier-ignore
// eslint-disable-next-line jest/expect-expect // eslint-disable-next-line vitest/expect-expect
test.each([ test.each([
[ [
'null01', 'null01',
@@ -133,12 +139,12 @@ describe('null', () => {
], ],
undefined undefined
], ],
])('given %p with %p event', tagsLabelsTest); ])('given %o with %o event', tagsLabelsTest);
}); });
describe('push', () => { describe('push', () => {
// prettier-ignore // prettier-ignore
// eslint-disable-next-line jest/expect-expect // eslint-disable-next-line vitest/expect-expect
test.each([ test.each([
[ [
'push01', 'push01',
@@ -856,12 +862,12 @@ describe('push', () => {
], ],
undefined undefined
] ]
])('given %p with %p event', tagsLabelsTest); ])('given %o with %o event', tagsLabelsTest);
}); });
describe('tag', () => { describe('tag', () => {
// prettier-ignore // prettier-ignore
// eslint-disable-next-line jest/expect-expect // eslint-disable-next-line vitest/expect-expect
test.each([ test.each([
[ [
'tag01', 'tag01',
@@ -2035,12 +2041,12 @@ describe('tag', () => {
], ],
undefined undefined
] ]
])('given %p with %p event', tagsLabelsTest); ])('given %o with %o event', tagsLabelsTest);
}); });
describe('latest', () => { describe('latest', () => {
// prettier-ignore // prettier-ignore
// eslint-disable-next-line jest/expect-expect // eslint-disable-next-line vitest/expect-expect
test.each([ test.each([
[ [
'latest01', 'latest01',
@@ -2377,12 +2383,12 @@ describe('latest', () => {
], ],
undefined undefined
] ]
])('given %p with %p event', tagsLabelsTest); ])('given %o with %o event', tagsLabelsTest);
}); });
describe('pr', () => { describe('pr', () => {
// prettier-ignore // prettier-ignore
// eslint-disable-next-line jest/expect-expect // eslint-disable-next-line vitest/expect-expect
test.each([ test.each([
[ [
'pr01', 'pr01',
@@ -2765,7 +2771,7 @@ describe('pr', () => {
], ],
undefined undefined
], ],
])('given %p with %p event', tagsLabelsTest); ])('given %o with %o event', tagsLabelsTest);
}); });
describe('pr-head-sha', () => { describe('pr-head-sha', () => {
@@ -3140,7 +3146,7 @@ describe('pr-head-sha', () => {
"org.opencontainers.image.version=src-2020-01-10T00-30-00Z", "org.opencontainers.image.version=src-2020-01-10T00-30-00Z",
] ]
], ],
])('given %p with %p event', async (name: string, envFile: string, inputs: Inputs, exVersion: Version, exTags: Array<string>, exLabelsAnnotations: Array<string>) => { ])('given %o with %o event', async (name: string, envFile: string, inputs: Inputs, exVersion: Version, exTags: Array<string>, exLabelsAnnotations: Array<string>) => {
process.env = dotenv.parse(fs.readFileSync(path.join(__dirname, 'fixtures', envFile))); process.env = dotenv.parse(fs.readFileSync(path.join(__dirname, 'fixtures', envFile)));
process.env.DOCKER_METADATA_PR_HEAD_SHA = 'true'; process.env.DOCKER_METADATA_PR_HEAD_SHA = 'true';
@@ -3164,7 +3170,7 @@ describe('pr-head-sha', () => {
describe('schedule', () => { describe('schedule', () => {
// prettier-ignore // prettier-ignore
// eslint-disable-next-line jest/expect-expect // eslint-disable-next-line vitest/expect-expect
test.each([ test.each([
[ [
'schedule01', 'schedule01',
@@ -3423,12 +3429,12 @@ describe('schedule', () => {
], ],
undefined undefined
], ],
])('given %p with %p event', tagsLabelsTest); ])('given %o with %o event', tagsLabelsTest);
}); });
describe('release', () => { describe('release', () => {
// prettier-ignore // prettier-ignore
// eslint-disable-next-line jest/expect-expect // eslint-disable-next-line vitest/expect-expect
test.each([ test.each([
[ [
'release01', 'release01',
@@ -3525,12 +3531,12 @@ describe('release', () => {
], ],
undefined undefined
] ]
])('given %s with %p event', tagsLabelsTest); ])('given %o with %o event', tagsLabelsTest);
}); });
describe('raw', () => { describe('raw', () => {
// prettier-ignore // prettier-ignore
// eslint-disable-next-line jest/expect-expect // eslint-disable-next-line vitest/expect-expect
test.each([ test.each([
[ [
'raw01', 'raw01',
@@ -3905,7 +3911,7 @@ describe('raw', () => {
], ],
undefined undefined
], ],
])('given %p wth %p event', tagsLabelsTest); ])('given %o with %o event', tagsLabelsTest);
}); });
describe('json', () => { describe('json', () => {
@@ -4259,7 +4265,7 @@ describe('json', () => {
] ]
} }
] ]
])('given %p with %p event', async (name: string, envFile: string, inputs: Inputs, exJSON: unknown) => { ])('given %o with %o event', async (name: string, envFile: string, inputs: Inputs, exJSON: unknown) => {
process.env = dotenv.parse(fs.readFileSync(path.join(__dirname, 'fixtures', envFile))); process.env = dotenv.parse(fs.readFileSync(path.join(__dirname, 'fixtures', envFile)));
const toolkit = new Toolkit(); const toolkit = new Toolkit();
@@ -4774,7 +4780,7 @@ describe('bakeFile', () => {
} }
} }
] ]
])('given %p with %p event', async (name: string, envFile: string, inputs: Inputs, exBakeTags: unknown, exBakeLabels: unknown, exBakeAnnotations: unknown) => { ])('given %o with %o event', async (name: string, envFile: string, inputs: Inputs, exBakeTags: unknown, exBakeLabels: unknown, exBakeAnnotations: unknown) => {
process.env = dotenv.parse(fs.readFileSync(path.join(__dirname, 'fixtures', envFile))); process.env = dotenv.parse(fs.readFileSync(path.join(__dirname, 'fixtures', envFile)));
const toolkit = new Toolkit(); const toolkit = new Toolkit();
@@ -4837,7 +4843,7 @@ describe('bakeFileTagsLabels', () => {
} }
} }
] ]
])('given %p with %p event', async (name: string, envFile: string, inputs: Inputs, exBakeDefinition: unknown) => { ])('given %o with %o event', async (name: string, envFile: string, inputs: Inputs, exBakeDefinition: unknown) => {
process.env = dotenv.parse(fs.readFileSync(path.join(__dirname, 'fixtures', envFile))); process.env = dotenv.parse(fs.readFileSync(path.join(__dirname, 'fixtures', envFile)));
const toolkit = new Toolkit(); const toolkit = new Toolkit();
@@ -4882,7 +4888,7 @@ describe('sepTags', () => {
} as Inputs, } as Inputs,
"user/app:dev,user/app:my,user/app:custom,user/app:tags" "user/app:dev,user/app:my,user/app:custom,user/app:tags"
] ]
])('given %p with %p event', async (name: string, envFile: string, inputs: Inputs, expTags: string) => { ])('given %o with %o event', async (name: string, envFile: string, inputs: Inputs, expTags: string) => {
process.env = dotenv.parse(fs.readFileSync(path.join(__dirname, 'fixtures', envFile))); process.env = dotenv.parse(fs.readFileSync(path.join(__dirname, 'fixtures', envFile)));
const toolkit = new Toolkit(); const toolkit = new Toolkit();

259
__tests__/setup.unit.ts Normal file
View File

@@ -0,0 +1,259 @@
import fs from 'node:fs';
import {createRequire} from 'node:module';
import os from 'node:os';
import path from 'node:path';
import {vi} from 'vitest';
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'docker-metadata-action-'));
process.env = Object.assign({}, process.env, {
TEMP: tmpDir,
GITHUB_REPOSITORY: 'docker/metadata-action',
RUNNER_TEMP: path.join(tmpDir, 'runner-temp'),
RUNNER_TOOL_CACHE: path.join(tmpDir, 'runner-tool-cache')
});
const require = createRequire(import.meta.url);
type RequireCacheEntry = NonNullable<(typeof require.cache)[string]>;
const githubMock = {
context: {
repo: {
owner: 'docker',
repo: 'actions-toolkit'
},
ref: 'refs/heads/dev',
sha: '5f3331d7f7044c18ca9f12c77d961c4d7cf3276a',
runId: 2188748038,
runNumber: 15,
payload: {
after: '860c1904a1ce19322e91ac35af1ab07466440c37',
base_ref: null,
before: '5f3331d7f7044c18ca9f12c77d961c4d7cf3276a',
commits: [
{
author: {
email: 'crazy-max@users.noreply.github.com',
name: 'CrazyMax',
username: 'crazy-max'
},
committer: {
email: 'crazy-max@users.noreply.github.com',
name: 'CrazyMax',
username: 'crazy-max'
},
distinct: true,
id: '860c1904a1ce19322e91ac35af1ab07466440c37',
message: 'hello dev',
timestamp: '2022-04-19T11:27:24+02:00',
tree_id: 'd2c60af597e863787d2d27f569e30495b0b92820',
url: 'https://github.com/docker/test-docker-action/commit/860c1904a1ce19322e91ac35af1ab07466440c37'
}
],
compare: 'https://github.com/docker/test-docker-action/compare/5f3331d7f704...860c1904a1ce',
created: false,
deleted: false,
forced: false,
head_commit: {
author: {
email: 'crazy-max@users.noreply.github.com',
name: 'CrazyMax',
username: 'crazy-max'
},
committer: {
email: 'crazy-max@users.noreply.github.com',
name: 'CrazyMax',
username: 'crazy-max'
},
distinct: true,
id: '860c1904a1ce19322e91ac35af1ab07466440c37',
message: 'hello dev',
timestamp: '2022-04-19T11:27:24+02:00',
tree_id: 'd2c60af597e863787d2d27f569e30495b0b92820',
url: 'https://github.com/docker/test-docker-action/commit/860c1904a1ce19322e91ac35af1ab07466440c37'
},
organization: {
avatar_url: 'https://avatars.githubusercontent.com/u/5429470?v=4',
description: 'Docker helps developers bring their ideas to life by conquering the complexity of app development.',
events_url: 'https://api.github.com/orgs/docker/events',
hooks_url: 'https://api.github.com/orgs/docker/hooks',
id: 5429470,
issues_url: 'https://api.github.com/orgs/docker/issues',
login: 'docker',
members_url: 'https://api.github.com/orgs/docker/members{/member}',
node_id: 'MDEyOk9yZ2FuaXphdGlvbjU0Mjk0NzA=',
public_members_url: 'https://api.github.com/orgs/docker/public_members{/member}',
repos_url: 'https://api.github.com/orgs/docker/repos',
url: 'https://api.github.com/orgs/docker'
},
pusher: {
email: 'github@crazymax.dev',
name: 'crazy-max'
},
ref: 'refs/heads/dev',
repository: {
allow_forking: true,
archive_url: 'https://api.github.com/repos/docker/test-docker-action/{archive_format}{/ref}',
archived: false,
assignees_url: 'https://api.github.com/repos/docker/test-docker-action/assignees{/user}',
blobs_url: 'https://api.github.com/repos/docker/test-docker-action/git/blobs{/sha}',
branches_url: 'https://api.github.com/repos/docker/test-docker-action/branches{/branch}',
clone_url: 'https://github.com/docker/test-docker-action.git',
collaborators_url: 'https://api.github.com/repos/docker/test-docker-action/collaborators{/collaborator}',
comments_url: 'https://api.github.com/repos/docker/test-docker-action/comments{/number}',
commits_url: 'https://api.github.com/repos/docker/test-docker-action/commits{/sha}',
compare_url: 'https://api.github.com/repos/docker/test-docker-action/compare/{base}...{head}',
contents_url: 'https://api.github.com/repos/docker/test-docker-action/contents/{+path}',
contributors_url: 'https://api.github.com/repos/docker/test-docker-action/contributors',
created_at: 1596792180,
default_branch: 'master',
deployments_url: 'https://api.github.com/repos/docker/test-docker-action/deployments',
description: 'Test "Docker" Actions',
disabled: false,
downloads_url: 'https://api.github.com/repos/docker/test-docker-action/downloads',
events_url: 'https://api.github.com/repos/docker/test-docker-action/events',
fork: false,
forks: 1,
forks_count: 1,
forks_url: 'https://api.github.com/repos/docker/test-docker-action/forks',
full_name: 'docker/test-docker-action',
git_commits_url: 'https://api.github.com/repos/docker/test-docker-action/git/commits{/sha}',
git_refs_url: 'https://api.github.com/repos/docker/test-docker-action/git/refs{/sha}',
git_tags_url: 'https://api.github.com/repos/docker/test-docker-action/git/tags{/sha}',
git_url: 'git://github.com/docker/test-docker-action.git',
has_downloads: true,
has_issues: true,
has_pages: false,
has_projects: true,
has_wiki: true,
homepage: '',
hooks_url: 'https://api.github.com/repos/docker/test-docker-action/hooks',
html_url: 'https://github.com/docker/test-docker-action',
id: 285789493,
is_template: false,
issue_comment_url: 'https://api.github.com/repos/docker/test-docker-action/issues/comments{/number}',
issue_events_url: 'https://api.github.com/repos/docker/test-docker-action/issues/events{/number}',
issues_url: 'https://api.github.com/repos/docker/test-docker-action/issues{/number}',
keys_url: 'https://api.github.com/repos/docker/test-docker-action/keys{/key_id}',
labels_url: 'https://api.github.com/repos/docker/test-docker-action/labels{/name}',
language: 'JavaScript',
languages_url: 'https://api.github.com/repos/docker/test-docker-action/languages',
license: {
key: 'mit',
name: 'MIT License',
node_id: 'MDc6TGljZW5zZTEz',
spdx_id: 'MIT',
url: 'https://api.github.com/licenses/mit'
},
master_branch: 'master',
merges_url: 'https://api.github.com/repos/docker/test-docker-action/merges',
milestones_url: 'https://api.github.com/repos/docker/test-docker-action/milestones{/number}',
mirror_url: null,
name: 'test-docker-action',
node_id: 'MDEwOlJlcG9zaXRvcnkyODU3ODk0OTM=',
notifications_url: 'https://api.github.com/repos/docker/test-docker-action/notifications{?since,all,participating}',
open_issues: 6,
open_issues_count: 6,
organization: 'docker',
owner: {
avatar_url: 'https://avatars.githubusercontent.com/u/5429470?v=4',
email: 'info@docker.com',
events_url: 'https://api.github.com/users/docker/events{/privacy}',
followers_url: 'https://api.github.com/users/docker/followers',
following_url: 'https://api.github.com/users/docker/following{/other_user}',
gists_url: 'https://api.github.com/users/docker/gists{/gist_id}',
gravatar_id: '',
html_url: 'https://github.com/docker',
id: 5429470,
login: 'docker',
name: 'docker',
node_id: 'MDEyOk9yZ2FuaXphdGlvbjU0Mjk0NzA=',
organizations_url: 'https://api.github.com/users/docker/orgs',
received_events_url: 'https://api.github.com/users/docker/received_events',
repos_url: 'https://api.github.com/users/docker/repos',
site_admin: false,
starred_url: 'https://api.github.com/users/docker/starred{/owner}{/repo}',
subscriptions_url: 'https://api.github.com/users/docker/subscriptions',
type: 'Organization',
url: 'https://api.github.com/users/docker'
},
private: true,
pulls_url: 'https://api.github.com/repos/docker/test-docker-action/pulls{/number}',
pushed_at: 1650360446,
releases_url: 'https://api.github.com/repos/docker/test-docker-action/releases{/id}',
size: 796,
ssh_url: 'git@github.com:docker/test-docker-action.git',
stargazers: 0,
stargazers_count: 0,
stargazers_url: 'https://api.github.com/repos/docker/test-docker-action/stargazers',
statuses_url: 'https://api.github.com/repos/docker/test-docker-action/statuses/{sha}',
subscribers_url: 'https://api.github.com/repos/docker/test-docker-action/subscribers',
subscription_url: 'https://api.github.com/repos/docker/test-docker-action/subscription',
svn_url: 'https://github.com/docker/test-docker-action',
tags_url: 'https://api.github.com/repos/docker/test-docker-action/tags',
teams_url: 'https://api.github.com/repos/docker/test-docker-action/teams',
topics: [],
trees_url: 'https://api.github.com/repos/docker/test-docker-action/git/trees{/sha}',
updated_at: '2022-04-19T09:05:09Z',
url: 'https://github.com/docker/test-docker-action',
visibility: 'private',
watchers: 0,
watchers_count: 0
},
sender: {
avatar_url: 'https://avatars.githubusercontent.com/u/1951866?v=4',
events_url: 'https://api.github.com/users/crazy-max/events{/privacy}',
followers_url: 'https://api.github.com/users/crazy-max/followers',
following_url: 'https://api.github.com/users/crazy-max/following{/other_user}',
gists_url: 'https://api.github.com/users/crazy-max/gists{/gist_id}',
gravatar_id: '',
html_url: 'https://github.com/crazy-max',
id: 1951866,
login: 'crazy-max',
node_id: 'MDQ6VXNlcjE5NTE4NjY=',
organizations_url: 'https://api.github.com/users/crazy-max/orgs',
received_events_url: 'https://api.github.com/users/crazy-max/received_events',
repos_url: 'https://api.github.com/users/crazy-max/repos',
site_admin: false,
starred_url: 'https://api.github.com/users/crazy-max/starred{/owner}{/repo}',
subscriptions_url: 'https://api.github.com/users/crazy-max/subscriptions',
type: 'User',
url: 'https://api.github.com/users/crazy-max'
}
}
},
getOctokit: () => ({
rest: {
repos: {
getCommit: async () => ({
data: {
commit: {
committer: {
date: '2024-11-13T13:42:28Z'
}
}
}
})
}
}
})
};
vi.mock('@actions/github', () => githubMock);
for (const mod of ['@actions/github', '@docker/actions-toolkit/node_modules/@actions/github']) {
try {
const resolved = require.resolve(mod);
vi.doMock(resolved, () => githubMock);
require.cache[resolved] = {
id: resolved,
filename: resolved,
loaded: true,
exports: githubMock,
children: [],
paths: []
} as RequireCacheEntry;
} catch {
// Ignore unresolved optional paths; vi.mock handles module-level mocking.
}
}

View File

@@ -1,6 +1,6 @@
import {describe, expect, test} from '@jest/globals'; import {describe, expect, test} from 'vitest';
import {Transform, Parse, Tag, Type, RefEvent, ShaFormat, DefaultPriorities} from '../src/tag'; import {Transform, Parse, Tag, Type, RefEvent, ShaFormat, DefaultPriorities} from '../src/tag.js';
describe('transform', () => { describe('transform', () => {
// prettier-ignore // prettier-ignore
@@ -107,7 +107,7 @@ describe('transform', () => {
if (!invalid) { if (!invalid) {
console.error(err); console.error(err);
} }
// eslint-disable-next-line jest/no-conditional-expect // eslint-disable-next-line vitest/no-conditional-expect
expect(true).toBe(invalid); expect(true).toBe(invalid);
} }
}); });
@@ -461,7 +461,7 @@ describe('parse', () => {
if (!invalid) { if (!invalid) {
console.error(err); console.error(err);
} }
// eslint-disable-next-line jest/no-conditional-expect // eslint-disable-next-line vitest/no-conditional-expect
expect(true).toBe(invalid); expect(true).toBe(invalid);
} }
}); });

View File

@@ -3,10 +3,11 @@
ARG NODE_VERSION=20 ARG NODE_VERSION=20
FROM node:${NODE_VERSION}-alpine AS base FROM node:${NODE_VERSION}-alpine AS base
RUN apk add --no-cache cpio findutils git RUN apk add --no-cache cpio findutils git rsync
WORKDIR /src WORKDIR /src
RUN --mount=type=bind,target=.,rw \ RUN --mount=type=bind,target=.,rw \
--mount=type=cache,target=/src/.yarn/cache <<EOT --mount=type=cache,target=/src/.yarn/cache <<EOT
set -e
corepack enable corepack enable
yarn --version yarn --version
yarn config set --home enableTelemetry 0 yarn config set --home enableTelemetry 0
@@ -34,18 +35,27 @@ RUN --mount=type=bind,target=.,rw <<EOT
EOT EOT
FROM deps AS build FROM deps AS build
RUN --mount=type=bind,target=.,rw \ RUN --mount=target=/context \
--mount=type=cache,target=/src/.yarn/cache \ --mount=type=cache,target=/src/.yarn/cache \
--mount=type=cache,target=/src/node_modules \ --mount=type=cache,target=/src/node_modules <<EOT
yarn run build && mkdir /out && cp -Rf dist /out/ set -e
rsync -a /context/. .
rm -rf dist
yarn run build
mkdir /out
cp -r dist /out
EOT
FROM scratch AS build-update FROM scratch AS build-update
COPY --from=build /out / COPY --from=build /out /
FROM build AS build-validate FROM build AS build-validate
RUN --mount=type=bind,target=.,rw <<EOT RUN --mount=target=/context \
--mount=target=.,type=tmpfs <<EOT
set -e set -e
rsync -a /context/. .
git add -A git add -A
rm -rf dist
cp -rf /out/* . cp -rf /out/* .
if [ -n "$(git status --porcelain -- dist)" ]; then if [ -n "$(git status --porcelain -- dist)" ]; then
echo >&2 'ERROR: Build result differs. Please build first with "docker buildx bake build"' echo >&2 'ERROR: Build result differs. Please build first with "docker buildx bake build"'
@@ -58,8 +68,7 @@ FROM deps AS format
RUN --mount=type=bind,target=.,rw \ RUN --mount=type=bind,target=.,rw \
--mount=type=cache,target=/src/.yarn/cache \ --mount=type=cache,target=/src/.yarn/cache \
--mount=type=cache,target=/src/node_modules \ --mount=type=cache,target=/src/node_modules \
yarn run format \ yarn run format && mkdir /out && find . -name '*.ts' -not -path './node_modules/*' -not -path './.yarn/*' | cpio -pdm /out
&& mkdir /out && find . -name '*.ts' -not -path './node_modules/*' -not -path './.yarn/*' | cpio -pdm /out
FROM scratch AS format-update FROM scratch AS format-update
COPY --from=format /out / COPY --from=format /out /
@@ -74,7 +83,7 @@ FROM deps AS test
RUN --mount=type=bind,target=.,rw \ RUN --mount=type=bind,target=.,rw \
--mount=type=cache,target=/src/.yarn/cache \ --mount=type=cache,target=/src/.yarn/cache \
--mount=type=cache,target=/src/node_modules \ --mount=type=cache,target=/src/node_modules \
yarn run test --coverage --coverageDirectory=/tmp/coverage yarn run test --coverage --coverage.reportsDirectory=/tmp/coverage
FROM scratch AS test-coverage FROM scratch AS test-coverage
COPY --from=test /tmp/coverage / COPY --from=test /tmp/coverage /

9
dist/606.index.js generated vendored
View File

@@ -1,7 +1,6 @@
"use strict"; export const id = 606;
exports.id = 606; export const ids = [606];
exports.ids = [606]; export const modules = {
exports.modules = {
/***/ 606: /***/ 606:
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
@@ -296,5 +295,5 @@ const pMapSkip = Symbol('skip');
/***/ }) /***/ })
}; };
;
//# sourceMappingURL=606.index.js.map //# sourceMappingURL=606.index.js.map

2
dist/606.index.js.map generated vendored

File diff suppressed because one or more lines are too long

63
dist/index.js generated vendored

File diff suppressed because one or more lines are too long

2
dist/index.js.map generated vendored

File diff suppressed because one or more lines are too long

3
dist/package.json generated vendored Normal file
View File

@@ -0,0 +1,3 @@
{
"type": "module"
}

View File

@@ -1,58 +0,0 @@
/* eslint-disable @typescript-eslint/no-require-imports */
const {defineConfig, globalIgnores} = require('eslint/config');
const {fixupConfigRules, fixupPluginRules} = require('@eslint/compat');
const typescriptEslint = require('@typescript-eslint/eslint-plugin');
const jestPlugin = require('eslint-plugin-jest');
const prettier = require('eslint-plugin-prettier');
const globals = require('globals');
const tsParser = require('@typescript-eslint/parser');
const js = require('@eslint/js');
const {FlatCompat} = require('@eslint/eslintrc');
// __dirname and __filename exist natively in CommonJS
const compat = new FlatCompat({
baseDirectory: __dirname,
recommendedConfig: js.configs.recommended,
allConfig: js.configs.all
});
module.exports = defineConfig([
globalIgnores(['dist/**/*', 'coverage/**/*', 'node_modules/**/*']),
{
// prettier-ignore
extends: fixupConfigRules(
compat.extends(
'eslint:recommended',
'plugin:@typescript-eslint/eslint-recommended',
'plugin:@typescript-eslint/recommended',
'plugin:jest/recommended',
'plugin:prettier/recommended'
)
),
plugins: {
'@typescript-eslint': fixupPluginRules(typescriptEslint),
jest: fixupPluginRules(jestPlugin),
prettier: fixupPluginRules(prettier)
},
languageOptions: {
globals: {
...globals.node,
...globals.jest
},
parser: tsParser,
ecmaVersion: 'latest',
sourceType: 'module'
},
rules: {
'@typescript-eslint/no-require-imports': [
'error',
{
allowAsImport: true
}
]
}
}
]);

52
eslint.config.mjs Normal file
View File

@@ -0,0 +1,52 @@
import {defineConfig} from 'eslint/config';
import js from '@eslint/js';
import tseslint from '@typescript-eslint/eslint-plugin';
import vitest from '@vitest/eslint-plugin';
import globals from 'globals';
import eslintConfigPrettier from 'eslint-config-prettier/flat';
import eslintPluginPrettier from 'eslint-plugin-prettier';
export default defineConfig([
{
ignores: ['.yarn/**/*', 'coverage/**/*', 'dist/**/*']
},
js.configs.recommended,
...tseslint.configs['flat/recommended'],
eslintConfigPrettier,
{
languageOptions: {
globals: {
...globals.node
}
}
},
{
files: ['__tests__/**'],
...vitest.configs.recommended,
languageOptions: {
globals: {
...globals.node,
...vitest.environments.env.globals
}
},
rules: {
...vitest.configs.recommended.rules,
'vitest/no-conditional-expect': 'error',
'vitest/no-disabled-tests': 0
}
},
{
plugins: {
prettier: eslintPluginPrettier
},
rules: {
'prettier/prettier': 'error',
'@typescript-eslint/no-require-imports': [
'error',
{
allowAsImport: true
}
]
}
}
]);

View File

@@ -1,30 +0,0 @@
/* eslint-disable @typescript-eslint/no-require-imports */
const fs = require('fs');
const os = require('os');
const path = require('path');
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'docker-metadata-action-'));
process.env = Object.assign({}, process.env, {
TEMP: tmpDir,
GITHUB_REPOSITORY: 'docker/metadata-action',
RUNNER_TEMP: path.join(tmpDir, 'runner-temp'),
RUNNER_TOOL_CACHE: path.join(tmpDir, 'runner-tool-cache')
});
module.exports = {
clearMocks: true,
testEnvironment: 'node',
moduleFileExtensions: ['js', 'ts'],
setupFiles: ['dotenv/config'],
testMatch: ['**/*.test.ts'],
transform: {
'^.+\\.ts$': 'ts-jest'
},
moduleNameMapper: {
'^csv-parse/sync': '<rootDir>/node_modules/csv-parse/dist/cjs/sync.cjs'
},
collectCoverageFrom: ['src/**/{!(main.ts),}.ts'],
coveragePathIgnorePatterns: ['lib/', 'node_modules/', '__mocks__/', '__tests__/'],
verbose: true
};

View File

@@ -1,16 +1,13 @@
{ {
"name": "docker-metadata-action", "name": "docker-metadata-action",
"description": "GitHub Action to extract metadata (tags, labels) for Docker", "description": "GitHub Action to extract metadata (tags, labels) for Docker",
"type": "module",
"main": "src/main.ts", "main": "src/main.ts",
"scripts": { "scripts": {
"build": "ncc build --source-map --minify --license licenses.txt", "build": "ncc build --source-map --minify --license licenses.txt",
"lint": "yarn run prettier && yarn run eslint", "lint": "eslint --max-warnings=0 .",
"format": "yarn run prettier:fix && yarn run eslint:fix", "format": "eslint --fix .",
"eslint": "eslint --max-warnings=0 .", "test": "vitest run"
"eslint:fix": "eslint --fix .",
"prettier": "prettier --check \"./**/*.ts\"",
"prettier:fix": "prettier --write \"./**/*.ts\"",
"test": "jest"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@@ -38,22 +35,21 @@
"semver": "^7.7.3" "semver": "^7.7.3"
}, },
"devDependencies": { "devDependencies": {
"@eslint/compat": "^2.0.0", "@eslint/js": "^9.39.3",
"@eslint/eslintrc": "^3.3.3", "@types/node": "^20.19.35",
"@eslint/js": "^9.39.2", "@types/semver": "^7.7.1",
"@types/node": "^20.19.27", "@typescript-eslint/eslint-plugin": "^8.56.1",
"@typescript-eslint/eslint-plugin": "^8.50.0", "@typescript-eslint/parser": "^8.56.1",
"@typescript-eslint/parser": "^8.50.0",
"@vercel/ncc": "^0.38.4", "@vercel/ncc": "^0.38.4",
"dotenv": "^17.2.3", "@vitest/coverage-v8": "^4.0.18",
"eslint": "^9.39.2", "@vitest/eslint-plugin": "^1.6.9",
"dotenv": "^17.3.1",
"eslint": "^9.39.3",
"eslint-config-prettier": "^10.1.8", "eslint-config-prettier": "^10.1.8",
"eslint-plugin-jest": "^29.5.0", "eslint-plugin-prettier": "^5.5.5",
"eslint-plugin-prettier": "^5.5.4", "globals": "^17.3.0",
"jest": "^30.2.0", "prettier": "^3.8.1",
"prettier": "^3.7.4", "typescript": "^5.9.3",
"ts-jest": "^29.4.6", "vitest": "^4.0.18"
"ts-node": "^10.9.2",
"typescript": "^5.9.3"
} }
} }

View File

@@ -1,9 +1,10 @@
import * as core from '@actions/core'; import * as core from '@actions/core';
import {Context as GithubContext} from '@actions/github/lib/context';
import {Util} from '@docker/actions-toolkit/lib/util'; import {Context as GithubContext} from '@actions/github/lib/context.js';
import {Git} from '@docker/actions-toolkit/lib/git'; import {Util} from '@docker/actions-toolkit/lib/util.js';
import {GitHub} from '@docker/actions-toolkit/lib/github'; import {Git} from '@docker/actions-toolkit/lib/git.js';
import {Toolkit} from '@docker/actions-toolkit/lib/toolkit'; import {GitHub} from '@docker/actions-toolkit/lib/github.js';
import {Toolkit} from '@docker/actions-toolkit/lib/toolkit.js';
export interface Context extends GithubContext { export interface Context extends GithubContext {
commitDate: Date; commitDate: Date;

View File

@@ -1,11 +1,11 @@
import * as fs from 'fs'; import * as fs from 'fs';
import * as core from '@actions/core'; import * as core from '@actions/core';
import * as actionsToolkit from '@docker/actions-toolkit'; import * as actionsToolkit from '@docker/actions-toolkit';
import {Toolkit} from '@docker/actions-toolkit/lib/toolkit'; import {Toolkit} from '@docker/actions-toolkit/lib/toolkit.js';
import {Util} from '@docker/actions-toolkit/lib/util'; import {Util} from '@docker/actions-toolkit/lib/util.js';
import {getContext, getInputs, Inputs} from './context'; import {getContext, getInputs, Inputs} from './context.js';
import {Meta, Version} from './meta'; import {Meta, Version} from './meta.js';
actionsToolkit.run( actionsToolkit.run(
// main // main

View File

@@ -5,13 +5,13 @@ import moment from 'moment-timezone';
import * as pep440 from '@renovate/pep440'; import * as pep440 from '@renovate/pep440';
import * as semver from 'semver'; import * as semver from 'semver';
import * as core from '@actions/core'; import * as core from '@actions/core';
import {Context as ToolkitContext} from '@docker/actions-toolkit/lib/context'; import {Context as ToolkitContext} from '@docker/actions-toolkit/lib/context.js';
import {GitHubRepo} from '@docker/actions-toolkit/lib/types/github'; import {GitHubRepo} from '@docker/actions-toolkit/lib/types/github.js';
import {Inputs, Context} from './context'; import {Inputs, Context} from './context.js';
import * as icl from './image'; import * as icl from './image.js';
import * as tcl from './tag'; import * as tcl from './tag.js';
import * as fcl from './flavor'; import * as fcl from './flavor.js';
const defaultShortShaLength = 7; const defaultShortShaLength = 7;

View File

@@ -1,9 +1,8 @@
{ {
"compilerOptions": { "compilerOptions": {
"module": "nodenext",
"moduleResolution": "nodenext",
"esModuleInterop": true, "esModuleInterop": true,
"target": "es6",
"module": "commonjs",
"strict": true,
"newLine": "lf", "newLine": "lf",
"outDir": "./lib", "outDir": "./lib",
"rootDir": "./src", "rootDir": "./src",
@@ -12,11 +11,7 @@
"resolveJsonModule": true, "resolveJsonModule": true,
"useUnknownInCatchVariables": false, "useUnknownInCatchVariables": false,
}, },
"exclude": [ "include": [
"./__mocks__/**/*", "src/**/*.ts"
"./__tests__/**/*",
"./lib/**/*",
"node_modules",
"jest.config.ts"
] ]
} }

16
vitest.config.ts Normal file
View File

@@ -0,0 +1,16 @@
import {defineConfig} from 'vitest/config';
export default defineConfig({
test: {
clearMocks: true,
environment: 'node',
setupFiles: ['./__tests__/setup.unit.ts'],
include: ['**/*.test.ts'],
coverage: {
provider: 'v8',
reporter: ['clover'],
include: ['src/**/*.ts'],
exclude: ['src/**/main.ts']
}
}
});

4635
yarn.lock

File diff suppressed because it is too large Load Diff