diff --git a/.eslintrc.json b/.eslintrc.json index ba2a82b..b46613b 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -2,7 +2,7 @@ "env": { "node": true, "es2021": true, - "jest/globals": true + "jest": true }, "extends": [ "eslint:recommended", diff --git a/__tests__/buildx.test.ts b/__tests__/buildx.test.ts deleted file mode 100644 index 4e7395b..0000000 --- a/__tests__/buildx.test.ts +++ /dev/null @@ -1,74 +0,0 @@ -import {describe, expect, it, jest, test} from '@jest/globals'; -import * as fs from 'fs'; -import * as path from 'path'; -import * as semver from 'semver'; -import * as exec from '@actions/exec'; -import * as buildx from '../src/buildx'; -import * as context from '../src/context'; - -const tmpNameSync = path.join('/tmp/.docker-bake-jest', '.tmpname-jest').split(path.sep).join(path.posix.sep); -const metadata = `{ - "containerimage.config.digest": "sha256:059b68a595b22564a1cbc167af369349fdc2ecc1f7bc092c2235cbf601a795fd", - "containerimage.digest": "sha256:b09b9482c72371486bb2c1d2c2a2633ed1d0b8389e12c8d52b9e052725c0c83c" -}`; - -jest.spyOn(context, 'tmpDir').mockImplementation((): string => { - const tmpDir = path.join('/tmp/.docker-bake-jest').split(path.sep).join(path.posix.sep); - if (!fs.existsSync(tmpDir)) { - fs.mkdirSync(tmpDir, {recursive: true}); - } - return tmpDir; -}); - -jest.spyOn(context, 'tmpNameSync').mockImplementation((): string => { - return tmpNameSync; -}); - -describe('getMetadata', () => { - it('matches', async () => { - const metadataFile = await buildx.getMetadataFile(); - await fs.writeFileSync(metadataFile, metadata); - const expected = await buildx.getMetadata(); - expect(expected).toEqual(metadata); - }); -}); - -describe('isAvailable', () => { - const execSpy = jest.spyOn(exec, 'getExecOutput'); - buildx.isAvailable(); - - // eslint-disable-next-line jest/no-standalone-expect - expect(execSpy).toHaveBeenCalledWith(`docker`, ['buildx'], { - silent: true, - ignoreReturnCode: true - }); -}); - -describe('isAvailable standalone', () => { - const execSpy = jest.spyOn(exec, 'getExecOutput'); - buildx.isAvailable(true); - - // eslint-disable-next-line jest/no-standalone-expect - expect(execSpy).toHaveBeenCalledWith(`buildx`, [], { - silent: true, - ignoreReturnCode: true - }); -}); - -describe('getVersion', () => { - it('valid', async () => { - const version = await buildx.getVersion(); - expect(semver.valid(version)).not.toBeNull(); - }, 100000); -}); - -describe('parseVersion', () => { - test.each([ - ['github.com/docker/buildx 0.4.1+azure bda4882a65349ca359216b135896bddc1d92461c', '0.4.1'], - ['github.com/docker/buildx v0.4.1 bda4882a65349ca359216b135896bddc1d92461c', '0.4.1'], - ['github.com/docker/buildx v0.4.2 fb7b670b764764dc4716df3eba07ffdae4cc47b2', '0.4.2'], - ['github.com/docker/buildx f117971 f11797113e5a9b86bd976329c5dbb8a8bfdfadfa', 'f117971'] - ])('given %p', async (stdout, expected) => { - expect(buildx.parseVersion(stdout)).toEqual(expected); - }); -}); diff --git a/__tests__/context.test.ts b/__tests__/context.test.ts index d18b19e..8177f29 100644 --- a/__tests__/context.test.ts +++ b/__tests__/context.test.ts @@ -1,151 +1,118 @@ -import {describe, expect, it} from '@jest/globals'; -import * as context from '../src/context'; - -describe('getInputList', () => { - it('single line correctly', async () => { - await setInput('foo', 'bar'); - const res = context.getInputList('foo'); - expect(res).toEqual(['bar']); - }); - - it('multiline correctly', async () => { - setInput('foo', 'bar\nbaz'); - const res = context.getInputList('foo'); - expect(res).toEqual(['bar', 'baz']); - }); - - it('empty lines correctly', async () => { - setInput('foo', 'bar\n\nbaz'); - const res = context.getInputList('foo'); - expect(res).toEqual(['bar', 'baz']); - }); - - it('comma correctly', async () => { - setInput('foo', 'bar,baz'); - const res = context.getInputList('foo'); - expect(res).toEqual(['bar', 'baz']); - }); - - it('empty result correctly', async () => { - setInput('foo', 'bar,baz,'); - const res = context.getInputList('foo'); - expect(res).toEqual(['bar', 'baz']); - }); - - it('different new lines correctly', async () => { - setInput('foo', 'bar\r\nbaz'); - const res = context.getInputList('foo'); - expect(res).toEqual(['bar', 'baz']); - }); - - it('different new lines and comma correctly', async () => { - setInput('foo', 'bar\r\nbaz,bat'); - const res = context.getInputList('foo'); - expect(res).toEqual(['bar', 'baz', 'bat']); - }); +import {beforeEach, describe, expect, jest, test} from '@jest/globals'; +import * as fs from 'fs'; +import * as path from 'path'; +import {Buildx} from '@docker/actions-toolkit/lib/buildx/buildx'; +import {Context} from '@docker/actions-toolkit/lib/context'; +import {Docker} from '@docker/actions-toolkit/lib/docker'; +import {Toolkit} from '@docker/actions-toolkit/lib/toolkit'; - it('multiline and ignoring comma correctly', async () => { - setInput('cache-from', 'user/app:cache\ntype=local,src=path/to/dir'); - const res = context.getInputList('cache-from', true); - expect(res).toEqual(['user/app:cache', 'type=local,src=path/to/dir']); - }); - - it('different new lines and ignoring comma correctly', async () => { - setInput('cache-from', 'user/app:cache\r\ntype=local,src=path/to/dir'); - const res = context.getInputList('cache-from', true); - expect(res).toEqual(['user/app:cache', 'type=local,src=path/to/dir']); - }); - - it('multiline values', async () => { - setInput( - 'secrets', - `GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789 -"MYSECRET=aaaaaaaa -bbbbbbb -ccccccccc" -FOO=bar` - ); - const res = context.getInputList('secrets', true); - expect(res).toEqual([ - 'GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789', - `MYSECRET=aaaaaaaa -bbbbbbb -ccccccccc`, - 'FOO=bar' - ]); - }); - - it('multiline values with empty lines', async () => { - setInput( - 'secrets', - `GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789 -"MYSECRET=aaaaaaaa -bbbbbbb -ccccccccc" -FOO=bar -"EMPTYLINE=aaaa - -bbbb -ccc"` - ); - const res = context.getInputList('secrets', true); - expect(res).toEqual([ - 'GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789', - `MYSECRET=aaaaaaaa -bbbbbbb -ccccccccc`, - 'FOO=bar', - `EMPTYLINE=aaaa - -bbbb -ccc` - ]); - }); +import * as context from '../src/context'; - it('multiline values without quotes', async () => { - setInput( - 'secrets', - `GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789 -MYSECRET=aaaaaaaa -bbbbbbb -ccccccccc -FOO=bar` - ); - const res = context.getInputList('secrets', true); - expect(res).toEqual(['GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789', 'MYSECRET=aaaaaaaa', 'bbbbbbb', 'ccccccccc', 'FOO=bar']); - }); +const tmpDir = path.join('/tmp', '.docker-bake-action-jest'); +const tmpName = path.join(tmpDir, '.tmpname-jest'); - it('multiline values escape quotes', async () => { - setInput( - 'secrets', - `GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789 -"MYSECRET=aaaaaaaa -bbbb""bbb -ccccccccc" -FOO=bar` - ); - const res = context.getInputList('secrets', true); - expect(res).toEqual([ - 'GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789', - `MYSECRET=aaaaaaaa -bbbb"bbb -ccccccccc`, - 'FOO=bar' - ]); - }); +jest.spyOn(Context, 'tmpDir').mockImplementation((): string => { + if (!fs.existsSync(tmpDir)) { + fs.mkdirSync(tmpDir, {recursive: true}); + } + return tmpDir; }); -describe('asyncForEach', () => { - it('executes async tasks sequentially', async () => { - const testValues = [1, 2, 3, 4, 5]; - const results: number[] = []; +jest.spyOn(Context, 'tmpName').mockImplementation((): string => { + return tmpName; +}); - await context.asyncForEach(testValues, async value => { - results.push(value); - }); +jest.spyOn(Docker, 'isAvailable').mockImplementation(async (): Promise => { + return true; +}); - expect(results).toEqual(testValues); +describe('getArgs', () => { + beforeEach(() => { + process.env = Object.keys(process.env).reduce((object, key) => { + if (!key.startsWith('INPUT_')) { + object[key] = process.env[key]; + } + return object; + }, {}); }); + + // prettier-ignore + test.each([ + [ + 0, + '0.4.1', + new Map([ + ['load', 'false'], + ['no-cache', 'false'], + ['push', 'false'], + ['pull', 'false'], + ]), + [ + 'bake', + ] + ], + [ + 1, + '0.8.2', + new Map([ + ['load', 'false'], + ['no-cache', 'false'], + ['push', 'false'], + ['pull', 'false'] + ]), + [ + 'bake', + '--metadata-file', path.join(tmpDir, 'metadata-file') + ] + ], + [ + 2, + '0.8.2', + new Map([ + ['targets', 'webapp\nvalidate'], + ['load', 'false'], + ['no-cache', 'false'], + ['push', 'false'], + ['pull', 'false'] + ]), + [ + 'bake', + '--metadata-file', path.join(tmpDir, 'metadata-file'), + 'webapp', 'validate' + ] + ], + [ + 3, + '0.8.2', + new Map([ + ['set', '*.cache-from=type=gha\n*.cache-to=type=gha'], + ['load', 'false'], + ['no-cache', 'false'], + ['push', 'false'], + ['pull', 'false'] + ]), + [ + 'bake', + '--set', '*.cache-from=type=gha', + '--set', '*.cache-to=type=gha', + '--metadata-file', path.join(tmpDir, 'metadata-file') + ] + ], + ])( + '[%d] given %p with %p as inputs, returns %p', + async (num: number, buildxVersion: string, inputs: Map, expected: Array) => { + inputs.forEach((value: string, name: string) => { + setInput(name, value); + }); + const toolkit = new Toolkit(); + jest.spyOn(Buildx.prototype, 'version').mockImplementation(async (): Promise => { + return buildxVersion; + }); + const inp = await context.getInputs(); + const res = await context.getArgs(inp, toolkit); + expect(res).toEqual(expected); + } + ); }); // See: https://github.com/actions/toolkit/blob/a1b068ec31a042ff1e10a522d8fdf0b8869d53ca/packages/core/src/core.ts#L89 diff --git a/__tests__/docker.test.ts b/__tests__/docker.test.ts deleted file mode 100644 index d1b7075..0000000 --- a/__tests__/docker.test.ts +++ /dev/null @@ -1,16 +0,0 @@ -import {describe, expect, it, jest} from '@jest/globals'; -import * as docker from '../src/docker'; -import * as exec from '@actions/exec'; - -describe('isAvailable', () => { - it('cli', () => { - const execSpy = jest.spyOn(exec, 'getExecOutput'); - docker.isAvailable(); - - // eslint-disable-next-line jest/no-standalone-expect - expect(execSpy).toHaveBeenCalledWith(`docker`, undefined, { - silent: true, - ignoreReturnCode: true - }); - }); -}); diff --git a/dev.Dockerfile b/dev.Dockerfile index 43b44a1..6886484 100644 --- a/dev.Dockerfile +++ b/dev.Dockerfile @@ -18,14 +18,14 @@ COPY --from=deps /vendor / FROM deps AS vendor-validate RUN --mount=type=bind,target=.,rw <&2 'ERROR: Vendor result differs. Please vendor your package with "docker buildx bake vendor-update"' - git status --porcelain -- yarn.lock - exit 1 -fi + set -e + git add -A + cp -rf /vendor/* . + if [ -n "$(git status --porcelain -- yarn.lock)" ]; then + echo >&2 'ERROR: Vendor result differs. Please vendor your package with "docker buildx bake vendor-update"' + git status --porcelain -- yarn.lock + exit 1 + fi EOT FROM deps AS build @@ -38,14 +38,14 @@ COPY --from=build /out / FROM build AS build-validate RUN --mount=type=bind,target=.,rw <&2 'ERROR: Build result differs. Please build first with "docker buildx bake build"' - git status --porcelain -- dist - exit 1 -fi + set -e + git add -A + cp -rf /out/* . + if [ -n "$(git status --porcelain -- dist)" ]; then + echo >&2 'ERROR: Build result differs. Please build first with "docker buildx bake build"' + git status --porcelain -- dist + exit 1 + fi EOT FROM deps AS format @@ -66,8 +66,6 @@ FROM docker:${DOCKER_VERSION} as docker FROM docker/buildx-bin:${BUILDX_VERSION} as buildx FROM deps AS test -ENV RUNNER_TEMP=/tmp/github_runner -ENV RUNNER_TOOL_CACHE=/tmp/github_tool_cache RUN --mount=type=bind,target=.,rw \ --mount=type=cache,target=/src/node_modules \ --mount=type=bind,from=docker,source=/usr/local/bin/docker,target=/usr/bin/docker \ diff --git a/jest.config.ts b/jest.config.ts index 7ff4e46..bd6e423 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -1,7 +1,22 @@ +import fs from 'fs'; +import os from 'os'; +import path from 'path'; + +const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'docker-bake-action-')); + +process.env = Object.assign({}, process.env, { + TEMP: tmpDir, + GITHUB_REPOSITORY: 'docker/bake-action', + RUNNER_TEMP: path.join(tmpDir, 'runner-temp'), + RUNNER_TOOL_CACHE: path.join(tmpDir, 'runner-tool-cache') +}) as { + [key: string]: string; +}; + module.exports = { clearMocks: true, + testEnvironment: 'node', moduleFileExtensions: ['js', 'ts'], - setupFiles: ['dotenv/config'], testMatch: ['**/*.test.ts'], transform: { '^.+\\.ts$': 'ts-jest' @@ -9,5 +24,7 @@ module.exports = { moduleNameMapper: { '^csv-parse/sync': '/node_modules/csv-parse/dist/cjs/sync.cjs' }, + collectCoverageFrom: ['src/**/{!(main.ts),}.ts'], + coveragePathIgnorePatterns: ['lib/', 'node_modules/', '__mocks__/', '__tests__/'], verbose: true }; diff --git a/package.json b/package.json index 8a160af..1514507 100644 --- a/package.json +++ b/package.json @@ -29,20 +29,13 @@ "license": "Apache-2.0", "dependencies": { "@actions/core": "^1.10.0", - "@actions/exec": "^1.1.1", - "csv-parse": "^5.3.3", - "semver": "^7.3.7", - "tmp": "^0.2.1" + "@docker/actions-toolkit": "^0.1.0-beta.14" }, "devDependencies": { - "@types/csv-parse": "^1.2.2", "@types/node": "^16.11.26", - "@types/semver": "^7.3.9", - "@types/tmp": "^0.2.3", "@typescript-eslint/eslint-plugin": "^5.14.0", "@typescript-eslint/parser": "^5.14.0", "@vercel/ncc": "^0.33.3", - "dotenv": "^16.0.0", "eslint": "^8.11.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-jest": "^26.1.1", diff --git a/src/buildx.ts b/src/buildx.ts deleted file mode 100644 index 64ddd1d..0000000 --- a/src/buildx.ts +++ /dev/null @@ -1,75 +0,0 @@ -import fs from 'fs'; -import path from 'path'; -import * as semver from 'semver'; -import * as exec from '@actions/exec'; - -import * as context from './context'; - -export async function getMetadataFile(): Promise { - return path.join(context.tmpDir(), 'metadata-file').split(path.sep).join(path.posix.sep); -} - -export async function getMetadata(): Promise { - const metadataFile = await getMetadataFile(); - if (!fs.existsSync(metadataFile)) { - return undefined; - } - const content = fs.readFileSync(metadataFile, {encoding: 'utf-8'}).trim(); - if (content === 'null') { - return undefined; - } - return content; -} - -export async function isAvailable(standalone?: boolean): Promise { - const cmd = getCommand([], standalone); - return await exec - .getExecOutput(cmd.command, cmd.args, { - ignoreReturnCode: true, - silent: true - }) - .then(res => { - if (res.stderr.length > 0 && res.exitCode != 0) { - return false; - } - return res.exitCode == 0; - }) - // eslint-disable-next-line @typescript-eslint/no-unused-vars - .catch(error => { - return false; - }); -} - -export async function getVersion(standalone?: boolean): Promise { - const cmd = getCommand(['version'], standalone); - return await exec - .getExecOutput(cmd.command, cmd.args, { - ignoreReturnCode: true, - silent: true - }) - .then(res => { - if (res.stderr.length > 0 && res.exitCode != 0) { - throw new Error(res.stderr.trim()); - } - return parseVersion(res.stdout.trim()); - }); -} - -export function parseVersion(stdout: string): string { - const matches = /\sv?([0-9a-f]{7}|[0-9.]+)/.exec(stdout); - if (!matches) { - throw new Error(`Cannot parse buildx version`); - } - return matches[1]; -} - -export function satisfies(version: string, range: string): boolean { - return semver.satisfies(version, range) || /^[0-9a-f]{7}$/.exec(version) !== null; -} - -export function getCommand(args: Array, standalone?: boolean) { - return { - command: standalone ? 'buildx' : 'docker', - args: standalone ? args : ['buildx', ...args] - }; -} diff --git a/src/context.ts b/src/context.ts index 0710c63..6797019 100644 --- a/src/context.ts +++ b/src/context.ts @@ -1,12 +1,6 @@ -import * as fs from 'fs'; -import * as os from 'os'; -import * as path from 'path'; -import * as tmp from 'tmp'; -import * as buildx from './buildx'; import * as core from '@actions/core'; -import {parse} from 'csv-parse/sync'; - -let _tmpDir: string; +import {Toolkit} from '@docker/actions-toolkit/lib/toolkit'; +import {Util} from '@docker/actions-toolkit/lib/util'; export interface Inputs { builder: string; @@ -21,54 +15,43 @@ export interface Inputs { source: string; } -export function tmpDir(): string { - if (!_tmpDir) { - _tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'docker-build-push-')).split(path.sep).join(path.posix.sep); - } - return _tmpDir; -} - -export function tmpNameSync(options?: tmp.TmpNameOptions): string { - return tmp.tmpNameSync(options); -} - export async function getInputs(): Promise { return { builder: core.getInput('builder'), - files: getInputList('files'), + files: Util.getInputList('files'), workdir: core.getInput('workdir') || '.', - targets: getInputList('targets'), + targets: Util.getInputList('targets'), noCache: core.getBooleanInput('no-cache'), pull: core.getBooleanInput('pull'), load: core.getBooleanInput('load'), push: core.getBooleanInput('push'), - set: getInputList('set', true), + set: Util.getInputList('set', {ignoreComma: true}), source: core.getInput('source') }; } -export async function getArgs(inputs: Inputs, buildxVersion: string): Promise> { +export async function getArgs(inputs: Inputs, toolkit: Toolkit): Promise> { // prettier-ignore return [ - ...await getBakeArgs(inputs, buildxVersion), + ...await getBakeArgs(inputs, toolkit), ...await getCommonArgs(inputs), ...inputs.targets ]; } -async function getBakeArgs(inputs: Inputs, buildxVersion: string): Promise> { +async function getBakeArgs(inputs: Inputs, toolkit: Toolkit): Promise> { const args: Array = ['bake']; if (inputs.source) { args.push(inputs.source); } - await asyncForEach(inputs.files, async file => { + await Util.asyncForEach(inputs.files, async file => { args.push('--file', file); }); - await asyncForEach(inputs.set, async set => { + await Util.asyncForEach(inputs.set, async set => { args.push('--set', set); }); - if (buildx.satisfies(buildxVersion, '>=0.6.0')) { - args.push('--metadata-file', await buildx.getMetadataFile()); + if (await toolkit.buildx.versionSatisfies('>=0.6.0')) { + args.push('--metadata-file', toolkit.buildx.inputs.getBuildMetadataFilePath()); } return args; } @@ -92,37 +75,3 @@ async function getCommonArgs(inputs: Inputs): Promise> { } return args; } - -export function getInputList(name: string, ignoreComma?: boolean): string[] { - const res: Array = []; - - const items = core.getInput(name); - if (items == '') { - return res; - } - - const records = parse(items, { - columns: false, - relaxColumnCount: true, - skipEmptyLines: true - }); - - for (const record of records as Array) { - if (record.length == 1) { - res.push(record[0]); - continue; - } else if (!ignoreComma) { - res.push(...record); - continue; - } - res.push(record.join(',')); - } - - return res.filter(item => item).map(pat => pat.trim()); -} - -export const asyncForEach = async (array, callback) => { - for (let index = 0; index < array.length; index++) { - await callback(array[index], index, array); - } -}; diff --git a/src/docker.ts b/src/docker.ts deleted file mode 100644 index 46497b2..0000000 --- a/src/docker.ts +++ /dev/null @@ -1,19 +0,0 @@ -import * as exec from '@actions/exec'; - -export async function isAvailable(): Promise { - return await exec - .getExecOutput('docker', undefined, { - ignoreReturnCode: true, - silent: true - }) - .then(res => { - if (res.stderr.length > 0 && res.exitCode != 0) { - return false; - } - return res.exitCode == 0; - }) - // eslint-disable-next-line @typescript-eslint/no-unused-vars - .catch(error => { - return false; - }); -} diff --git a/src/main.ts b/src/main.ts index 9ed0f10..4f39ad1 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,87 +1,72 @@ import * as fs from 'fs'; -import * as buildx from './buildx'; +import * as core from '@actions/core'; +import * as actionsToolkit from '@docker/actions-toolkit'; +import {Context} from '@docker/actions-toolkit/lib/context'; +import {Docker} from '@docker/actions-toolkit/lib/docker'; +import {Exec} from '@docker/actions-toolkit/lib/exec'; +import {Toolkit} from '@docker/actions-toolkit/lib/toolkit'; + import * as context from './context'; -import * as docker from './docker'; import * as stateHelper from './state-helper'; -import * as core from '@actions/core'; -import * as exec from '@actions/exec'; -async function run(): Promise { - try { +actionsToolkit.run( + // main + async () => { const inputs: context.Inputs = await context.getInputs(); + const toolkit = new Toolkit(); - // standalone if docker cli not available - const standalone = !(await docker.isAvailable()); - - core.startGroup(`Docker info`); - if (standalone) { - core.info(`Docker info skipped in standalone mode`); - } else { - await exec.exec('docker', ['version'], { - failOnStdErr: false - }); - await exec.exec('docker', ['info'], { - failOnStdErr: false - }); - } - core.endGroup(); + await core.group(`Docker info`, async () => { + try { + await Docker.printVersion(); + await Docker.printInfo(); + } catch (e) { + core.info(e.message); + } + }); - if (!(await buildx.isAvailable(standalone))) { + if (!(await toolkit.buildx.isAvailable())) { core.setFailed(`Docker buildx is required. See https://github.com/docker/setup-buildx-action to set up buildx.`); return; } - stateHelper.setTmpDir(context.tmpDir()); - const buildxVersion = await buildx.getVersion(standalone); + stateHelper.setTmpDir(Context.tmpDir()); + await core.group(`Buildx version`, async () => { - const versionCmd = buildx.getCommand(['version'], standalone); - await exec.exec(versionCmd.command, versionCmd.args, { - failOnStdErr: false - }); + await toolkit.buildx.printVersion(); }); - const args: string[] = await context.getArgs(inputs, buildxVersion); - const buildCmd = buildx.getCommand(args, standalone); + const args: string[] = await context.getArgs(inputs, toolkit); + const buildCmd = await toolkit.buildx.getCommand(args); - core.startGroup(`Bake definition`); - await exec.exec(buildCmd.command, [...buildCmd.args, '--print'], { - cwd: inputs.workdir + await core.group(`Bake definition`, async () => { + await Exec.exec(buildCmd.command, [...buildCmd.args, '--print'], { + cwd: inputs.workdir + }); }); - core.endGroup(); - await exec - .getExecOutput(buildCmd.command, buildCmd.args, { - cwd: inputs.workdir, - ignoreReturnCode: true - }) - .then(res => { - if (res.stderr.length > 0 && res.exitCode != 0) { - throw new Error(`buildx bake failed with: ${res.stderr.match(/(.*)\s*$/)?.[0]?.trim() ?? 'unknown error'}`); - } - }); + await Exec.getExecOutput(buildCmd.command, buildCmd.args, { + cwd: inputs.workdir, + ignoreReturnCode: true + }).then(res => { + if (res.stderr.length > 0 && res.exitCode != 0) { + throw new Error(`buildx bake failed with: ${res.stderr.match(/(.*)\s*$/)?.[0]?.trim() ?? 'unknown error'}`); + } + }); - const metadata = await buildx.getMetadata(); + const metadata = await toolkit.buildx.inputs.resolveBuildMetadata(); if (metadata) { - await core.group(`Metadata output`, async () => { + await core.group(`Metadata`, async () => { core.info(metadata); core.setOutput('metadata', metadata); }); } - } catch (error) { - core.setFailed(error.message); - } -} - -async function cleanup(): Promise { - if (stateHelper.tmpDir.length > 0) { - core.startGroup(`Removing temp folder ${stateHelper.tmpDir}`); - fs.rmdirSync(stateHelper.tmpDir, {recursive: true}); - core.endGroup(); + }, + // post + async () => { + if (stateHelper.tmpDir.length > 0) { + await core.group(`Removing temp folder ${stateHelper.tmpDir}`, async () => { + fs.rmSync(stateHelper.tmpDir, {recursive: true}); + }); + } } -} - -if (!stateHelper.IsPost) { - run(); -} else { - cleanup(); -} +); diff --git a/src/state-helper.ts b/src/state-helper.ts index b04c859..01c11be 100644 --- a/src/state-helper.ts +++ b/src/state-helper.ts @@ -1,12 +1,7 @@ import * as core from '@actions/core'; -export const IsPost = !!process.env['STATE_isPost']; export const tmpDir = process.env['STATE_tmpDir'] || ''; export function setTmpDir(tmpDir: string) { core.saveState('tmpDir', tmpDir); } - -if (!IsPost) { - core.saveState('isPost', 'true'); -} diff --git a/tsconfig.json b/tsconfig.json index 7339491..9720dc0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,19 +1,22 @@ { "compilerOptions": { + "esModuleInterop": true, "target": "es6", "module": "commonjs", + "strict": true, "newLine": "lf", "outDir": "./lib", "rootDir": "./src", - "esModuleInterop": true, "forceConsistentCasingInFileNames": true, - "strict": true, "noImplicitAny": false, + "resolveJsonModule": true, "useUnknownInCatchVariables": false, }, "exclude": [ + "./__mocks__/**/*", + "./__tests__/**/*", + "./lib/**/*", "node_modules", - "**/*.test.ts", "jest.config.ts" ] } diff --git a/yarn.lock b/yarn.lock index 239eb07..a936c33 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,7 +2,7 @@ # yarn lockfile v1 -"@actions/core@^1.10.0": +"@actions/core@^1.10.0", "@actions/core@^1.2.6": version "1.10.0" resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.10.0.tgz#44551c3c71163949a2f06e94d9ca2157a0cfac4f" integrity sha512-2aZDDa3zrrZbP5ZYg159sNoLRb61nQ7awl5pSvIq5Qpj81vwDzdMRKzkWJGJuwVvWpvZKx7vspJALyvaaIQyug== @@ -10,13 +10,23 @@ "@actions/http-client" "^2.0.1" uuid "^8.3.2" -"@actions/exec@^1.1.1": +"@actions/exec@^1.0.0", "@actions/exec@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@actions/exec/-/exec-1.1.1.tgz#2e43f28c54022537172819a7cf886c844221a611" integrity sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w== dependencies: "@actions/io" "^1.0.1" +"@actions/github@^5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@actions/github/-/github-5.1.1.tgz#40b9b9e1323a5efcf4ff7dadd33d8ea51651bbcb" + integrity sha512-Nk59rMDoJaV+mHCOJPXuvB1zIbomlKS0dmSIqPGxd0enAXBnOfn4VWF+CGtRCwXZG9Epa54tZA7VIRlJDS8A6g== + dependencies: + "@actions/http-client" "^2.0.1" + "@octokit/core" "^3.6.0" + "@octokit/plugin-paginate-rest" "^2.17.0" + "@octokit/plugin-rest-endpoint-methods" "^5.13.0" + "@actions/http-client@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-2.0.1.tgz#873f4ca98fe32f6839462a6f046332677322f99c" @@ -29,6 +39,23 @@ resolved "https://registry.yarnpkg.com/@actions/io/-/io-1.0.2.tgz#2f614b6e69ce14d191180451eb38e6576a6e6b27" integrity sha512-J8KuFqVPr3p6U8W93DOXlXW6zFvrQAJANdS+vw0YhusLIq+bszW8zmK2Fh1C2kDPX8FMvwIl1OUcFgvJoXLbAg== +"@actions/io@^1.1.1", "@actions/io@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@actions/io/-/io-1.1.2.tgz#766ac09674a289ce0f1550ffe0a6eac9261a8ea9" + integrity sha512-d+RwPlMp+2qmBfeLYPLXuSRykDIFEwdTA0MMxzS9kh4kvP1ftrc/9fzy6pX6qAjthdXruHQ6/6kjT/DNo5ALuw== + +"@actions/tool-cache@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@actions/tool-cache/-/tool-cache-2.0.1.tgz#8a649b9c07838d9d750c9864814e66a7660ab720" + integrity sha512-iPU+mNwrbA8jodY8eyo/0S/QqCKDajiR8OxWTnSk/SnYg0sj8Hp4QcUEVC1YFpHWXtrfbQrE13Jz4k4HXJQKcA== + dependencies: + "@actions/core" "^1.2.6" + "@actions/exec" "^1.0.0" + "@actions/http-client" "^2.0.1" + "@actions/io" "^1.1.1" + semver "^6.1.0" + uuid "^3.3.2" + "@ampproject/remapping@^2.1.0": version "2.1.2" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34" @@ -536,6 +563,22 @@ dependencies: "@cspotcode/source-map-consumer" "0.8.0" +"@docker/actions-toolkit@^0.1.0-beta.14": + version "0.1.0-beta.14" + resolved "https://registry.yarnpkg.com/@docker/actions-toolkit/-/actions-toolkit-0.1.0-beta.14.tgz#82fa8a6b9802a7f770fde3ddcef1cf591739a80b" + integrity sha512-N+aqiO0E2ygoaBORN8fx4K7j/CzJ2nCSgOewtDm0gdzrch8qZmTU14e3oNAbZlP8Q34Lk45KKefm5wDfLipRqg== + dependencies: + "@actions/core" "^1.10.0" + "@actions/exec" "^1.1.1" + "@actions/github" "^5.1.1" + "@actions/http-client" "^2.0.1" + "@actions/io" "^1.1.2" + "@actions/tool-cache" "^2.0.1" + csv-parse "^5.3.5" + jwt-decode "^3.1.2" + semver "^7.3.8" + tmp "^0.2.1" + "@eslint/eslintrc@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.2.1.tgz#8b5e1c49f4077235516bc9ec7d41378c0f69b8c6" @@ -789,6 +832,92 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@octokit/auth-token@^2.4.4": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.5.0.tgz#27c37ea26c205f28443402477ffd261311f21e36" + integrity sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g== + dependencies: + "@octokit/types" "^6.0.3" + +"@octokit/core@^3.6.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.6.0.tgz#3376cb9f3008d9b3d110370d90e0a1fcd5fe6085" + integrity sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q== + dependencies: + "@octokit/auth-token" "^2.4.4" + "@octokit/graphql" "^4.5.8" + "@octokit/request" "^5.6.3" + "@octokit/request-error" "^2.0.5" + "@octokit/types" "^6.0.3" + before-after-hook "^2.2.0" + universal-user-agent "^6.0.0" + +"@octokit/endpoint@^6.0.1": + version "6.0.12" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.12.tgz#3b4d47a4b0e79b1027fb8d75d4221928b2d05658" + integrity sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA== + dependencies: + "@octokit/types" "^6.0.3" + is-plain-object "^5.0.0" + universal-user-agent "^6.0.0" + +"@octokit/graphql@^4.5.8": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.8.0.tgz#664d9b11c0e12112cbf78e10f49a05959aa22cc3" + integrity sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg== + dependencies: + "@octokit/request" "^5.6.0" + "@octokit/types" "^6.0.3" + universal-user-agent "^6.0.0" + +"@octokit/openapi-types@^12.11.0": + version "12.11.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-12.11.0.tgz#da5638d64f2b919bca89ce6602d059f1b52d3ef0" + integrity sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ== + +"@octokit/plugin-paginate-rest@^2.17.0": + version "2.21.3" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz#7f12532797775640dbb8224da577da7dc210c87e" + integrity sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw== + dependencies: + "@octokit/types" "^6.40.0" + +"@octokit/plugin-rest-endpoint-methods@^5.13.0": + version "5.16.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz#7ee8bf586df97dd6868cf68f641354e908c25342" + integrity sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw== + dependencies: + "@octokit/types" "^6.39.0" + deprecation "^2.3.1" + +"@octokit/request-error@^2.0.5", "@octokit/request-error@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.1.0.tgz#9e150357831bfc788d13a4fd4b1913d60c74d677" + integrity sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg== + dependencies: + "@octokit/types" "^6.0.3" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^5.6.0", "@octokit/request@^5.6.3": + version "5.6.3" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.6.3.tgz#19a022515a5bba965ac06c9d1334514eb50c48b0" + integrity sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A== + dependencies: + "@octokit/endpoint" "^6.0.1" + "@octokit/request-error" "^2.1.0" + "@octokit/types" "^6.16.1" + is-plain-object "^5.0.0" + node-fetch "^2.6.7" + universal-user-agent "^6.0.0" + +"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.39.0", "@octokit/types@^6.40.0": + version "6.41.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.41.0.tgz#e58ef78d78596d2fb7df9c6259802464b5f84a04" + integrity sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg== + dependencies: + "@octokit/openapi-types" "^12.11.0" + "@sinonjs/commons@^1.7.0": version "1.8.3" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" @@ -872,13 +1001,6 @@ dependencies: "@babel/types" "^7.3.0" -"@types/csv-parse@^1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/csv-parse/-/csv-parse-1.2.2.tgz#713486235759d615dc8e6a6a979170ada76701d5" - integrity sha512-k33tLtRKTQxf7hQfMlkWoS2TQYsnpk1ibZN+rzbuCkeBs8m23nHTeDTF1wb/e7/MSLdtgCzqu3oM1I101kd6yw== - dependencies: - csv-parse "*" - "@types/graceful-fs@^4.1.2": version "4.1.5" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" @@ -925,21 +1047,11 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.4.tgz#5d9b63132df54d8909fce1c3f8ca260fdd693e17" integrity sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA== -"@types/semver@^7.3.9": - version "7.3.9" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.9.tgz#152c6c20a7688c30b967ec1841d31ace569863fc" - integrity sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ== - "@types/stack-utils@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw== -"@types/tmp@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.3.tgz#908bfb113419fd6a42273674c00994d40902c165" - integrity sha512-dDZH/tXzwjutnuk4UacGgFRwV+JSLaXL1ikvidfJprkb7L9Nx1njcRHHmi3Dsvt7pgqqTEeucQuOrWHPFgzVHA== - "@types/yargs-parser@*": version "20.2.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9" @@ -1229,6 +1341,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +before-after-hook@^2.2.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" + integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1445,10 +1562,10 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" -csv-parse@*, csv-parse@^5.3.3: - version "5.3.3" - resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.3.3.tgz#3b75d2279e2edb550cbc54c65b25cbbf3d0033ad" - integrity sha512-kEWkAPleNEdhFNkHQpFHu9RYPogsFj3dx6bCxL847fsiLgidzWg0z/O0B1kVWMJUc5ky64zGp18LX2T3DQrOfw== +csv-parse@^5.3.5: + version "5.3.5" + resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.3.5.tgz#9924bbba9f7056122f06b7af18edc1a7f022ce99" + integrity sha512-8O5KTIRtwmtD3+EVfW6BCgbwZqJbhTYsQZry12F1TP5RUp0sD9tp1UnCWic3n0mLOhzeocYaCZNYxOGSg3dmmQ== data-urls@^2.0.0: version "2.0.0" @@ -1503,6 +1620,11 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= +deprecation@^2.0.0, deprecation@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -1539,11 +1661,6 @@ domexception@^2.0.1: dependencies: webidl-conversions "^5.0.0" -dotenv@^16.0.0: - version "16.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.0.tgz#c619001253be89ebb638d027b609c75c26e47411" - integrity sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q== - electron-to-chromium@^1.3.723: version "1.3.763" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.763.tgz#93f6f02506d099941f557b9db9ba50b30215bf15" @@ -2094,6 +2211,11 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + is-potential-custom-element-name@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" @@ -2644,6 +2766,11 @@ json5@2.x, json5@^2.1.2: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +jwt-decode@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59" + integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== + kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -2775,6 +2902,13 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +node-fetch@^2.6.7: + version "2.6.9" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" + integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== + dependencies: + whatwg-url "^5.0.0" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -2807,7 +2941,7 @@ nwsapi@^2.2.0: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== -once@^1.3.0: +once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -3069,18 +3203,25 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" -semver@7.x, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7: +semver@7.x, semver@^7.3.2, semver@^7.3.5: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.3.8: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -3300,6 +3441,11 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + ts-jest@^27.1.2: version "27.1.3" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.1.3.tgz#1f723e7e74027c4da92c0ffbd73287e8af2b2957" @@ -3391,6 +3537,11 @@ typescript@^4.4.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.2.tgz#fe12d2727b708f4eef40f51598b3398baa9611d4" integrity sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg== +universal-user-agent@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" + integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== + universalify@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -3403,6 +3554,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" @@ -3448,6 +3604,11 @@ walker@^1.0.7: dependencies: makeerror "1.0.x" +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + webidl-conversions@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" @@ -3470,6 +3631,14 @@ whatwg-mimetype@^2.3.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + whatwg-url@^8.0.0, whatwg-url@^8.5.0: version "8.7.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77"