From be4c881eea4a25406465eb3f986a44c62544a056 Mon Sep 17 00:00:00 2001 From: CrazyMax Date: Thu, 6 Jul 2023 09:21:45 +0200 Subject: [PATCH] buildx: cache binary to hosted tool cache and GHA cache backend Signed-off-by: CrazyMax --- __tests__/buildx/install.test.ts | 18 +- package.json | 1 + src/buildx/install.ts | 186 +++++++++++----- yarn.lock | 354 ++++++++++++++++++++++++++++++- 4 files changed, 499 insertions(+), 60 deletions(-) diff --git a/__tests__/buildx/install.test.ts b/__tests__/buildx/install.test.ts index cc491539..9a7fc941 100644 --- a/__tests__/buildx/install.test.ts +++ b/__tests__/buildx/install.test.ts @@ -36,10 +36,10 @@ afterEach(function () { describe('download', () => { // prettier-ignore test.each([ - ['v0.9.1', false], - ['latest', false], + ['v0.9.0', false], + ['v0.10.4', false], ['v0.9.1', true], - ['latest', true] + ['v0.10.5', true] ])( 'acquires %p of buildx (standalone: %p)', async (version, standalone) => { const install = new Install({standalone: standalone}); @@ -56,6 +56,18 @@ describe('download', () => { 100000 ); + // prettier-ignore + test.each([ + // following versions are already cached to htc from previous test cases + ['v0.9.1'], + ['v0.10.5'], + ])( + 'acquires %p of buildx with cache', async (version) => { + const install = new Install({standalone: false}); + const toolPath = await install.download(version); + expect(fs.existsSync(toolPath)).toBe(true); + }); + // TODO: add tests for arm // prettier-ignore test.each([ diff --git a/package.json b/package.json index 95e85a8e..a5d4e2f4 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "registry": "https://registry.npmjs.org/" }, "dependencies": { + "@actions/cache": "^3.2.1", "@actions/core": "^1.10.0", "@actions/exec": "^1.1.1", "@actions/github": "^5.1.1", diff --git a/src/buildx/install.ts b/src/buildx/install.ts index 9279327f..e2f33ced 100644 --- a/src/buildx/install.ts +++ b/src/buildx/install.ts @@ -20,6 +20,7 @@ import path from 'path'; import * as core from '@actions/core'; import * as httpm from '@actions/http-client'; import * as tc from '@actions/tool-cache'; +import * as cache from '@actions/cache'; import * as semver from 'semver'; import * as util from 'util'; @@ -42,25 +43,45 @@ export class Install { this._standalone = opts?.standalone; } + /* + * Download buildx binary from GitHub release + * @param version semver version + * @returns path to the buildx binary + */ public async download(version: string): Promise { const release: GitHubRelease = await Install.getRelease(version); const fversion = release.tag_name.replace(/^v+|v+$/g, ''); core.debug(`Install.download version: ${fversion}`); - let toolPath: string; - toolPath = tc.find('buildx', fversion, this.platform()); - if (!toolPath) { - const c = semver.clean(fversion) || ''; - if (!semver.valid(c)) { - throw new Error(`Invalid Buildx version "${fversion}".`); - } - toolPath = await this.fetchBinary(fversion); + const c = semver.clean(fversion) || ''; + if (!semver.valid(c)) { + throw new Error(`Invalid Buildx version "${fversion}".`); + } + + const installCache = new InstallCache('buildx-dl-bin', fversion); + + const cacheFoundPath = await installCache.find(); + if (cacheFoundPath) { + core.info(`Buildx binary found in ${cacheFoundPath}`); + return cacheFoundPath; } - core.debug(`Install.download toolPath: ${toolPath}`); - return toolPath; + const downloadURL = util.format('https://github.com/docker/buildx/releases/download/v%s/%s', fversion, this.filename(fversion)); + core.info(`Downloading ${downloadURL}`); + + const htcDownloadPath = await tc.downloadTool(downloadURL); + core.debug(`Install.download htcDownloadPath: ${htcDownloadPath}`); + + const cacheSavePath = await installCache.save(htcDownloadPath); + core.info(`Cached to ${cacheSavePath}`); + return cacheSavePath; } + /* + * Build buildx binary from source + * @param gitContext git repo context + * @returns path to the buildx binary + */ public async build(gitContext: string): Promise { // eslint-disable-next-line prefer-const let [repo, ref] = gitContext.split('#'); @@ -77,35 +98,42 @@ export class Install { } core.debug(`Install.build: tool version spec ${vspec}`); - let toolPath: string; - toolPath = tc.find('buildx', vspec); - if (!toolPath) { - const outputDir = path.join(Context.tmpDir(), 'build-cache'); - const buildCmd = await this.buildCommand(gitContext, outputDir); - toolPath = await Exec.getExecOutput(buildCmd.command, buildCmd.args, { - ignoreReturnCode: true - }).then(res => { - if (res.stderr.length > 0 && res.exitCode != 0) { - throw new Error(`build failed with: ${res.stderr.match(/(.*)\s*$/)?.[0]?.trim() ?? 'unknown error'}`); - } - return tc.cacheFile(`${outputDir}/buildx`, os.platform() == 'win32' ? 'docker-buildx.exe' : 'docker-buildx', 'buildx', vspec, this.platform()); - }); - } - - return toolPath; + const installCache = new InstallCache('buildx-build-bin', vspec); + + const cacheFoundPath = await installCache.find(); + if (cacheFoundPath) { + core.info(`Buildx binary found in ${cacheFoundPath}`); + return cacheFoundPath; + } + + const outputDir = path.join(Context.tmpDir(), 'buildx-build-cache'); + const buildCmd = await this.buildCommand(gitContext, outputDir); + + const buildBinPath = await Exec.getExecOutput(buildCmd.command, buildCmd.args, { + ignoreReturnCode: true + }).then(res => { + if (res.stderr.length > 0 && res.exitCode != 0) { + throw new Error(`build failed with: ${res.stderr.match(/(.*)\s*$/)?.[0]?.trim() ?? 'unknown error'}`); + } + return `${outputDir}/buildx`; + }); + + const cacheSavePath = await installCache.save(buildBinPath); + core.info(`Cached to ${cacheSavePath}`); + return cacheSavePath; } - public async installStandalone(toolPath: string, dest?: string): Promise { + public async installStandalone(binPath: string, dest?: string): Promise { core.info('Standalone mode'); dest = dest || Context.tmpDir(); - const toolBinPath = path.join(toolPath, os.platform() == 'win32' ? 'docker-buildx.exe' : 'docker-buildx'); - const binDir = path.join(dest, 'bin'); + + const binDir = path.join(dest, 'buildx-bin-standalone'); if (!fs.existsSync(binDir)) { fs.mkdirSync(binDir, {recursive: true}); } - const filename: string = os.platform() == 'win32' ? 'buildx.exe' : 'buildx'; - const buildxPath: string = path.join(binDir, filename); - fs.copyFileSync(toolBinPath, buildxPath); + const binName: string = os.platform() == 'win32' ? 'buildx.exe' : 'buildx'; + const buildxPath: string = path.join(binDir, binName); + fs.copyFileSync(binPath, buildxPath); core.info('Fixing perms'); fs.chmodSync(buildxPath, '0755'); @@ -117,17 +145,17 @@ export class Install { return buildxPath; } - public async installPlugin(toolPath: string, dest?: string): Promise { + public async installPlugin(binPath: string, dest?: string): Promise { core.info('Docker plugin mode'); dest = dest || Docker.configDir; - const toolBinPath = path.join(toolPath, os.platform() == 'win32' ? 'docker-buildx.exe' : 'docker-buildx'); + const pluginsDir: string = path.join(dest, 'cli-plugins'); if (!fs.existsSync(pluginsDir)) { fs.mkdirSync(pluginsDir, {recursive: true}); } - const filename: string = os.platform() == 'win32' ? 'docker-buildx.exe' : 'docker-buildx'; - const pluginPath: string = path.join(pluginsDir, filename); - fs.copyFileSync(toolBinPath, pluginPath); + const binName: string = os.platform() == 'win32' ? 'docker-buildx.exe' : 'docker-buildx'; + const pluginPath: string = path.join(pluginsDir, binName); + fs.copyFileSync(binPath, pluginPath); core.info('Fixing perms'); fs.chmodSync(pluginPath, '0755'); @@ -173,21 +201,6 @@ export class Install { return standalone; } - private async fetchBinary(version: string): Promise { - const targetFile: string = os.platform() == 'win32' ? 'docker-buildx.exe' : 'docker-buildx'; - const downloadURL = util.format('https://github.com/docker/buildx/releases/download/v%s/%s', version, this.filename(version)); - core.info(`Downloading ${downloadURL}`); - const downloadPath = await tc.downloadTool(downloadURL); - core.debug(`Install.fetchBinary downloadPath: ${downloadPath}`); - return await tc.cacheFile(downloadPath, targetFile, 'buildx', version, this.platform()); - } - - private platform(): string { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const arm_version = (process.config.variables as any).arm_version; - return `${os.platform()}-${os.arch()}${arm_version ? 'v' + arm_version : ''}`; - } - private filename(version: string): string { let arch: string; switch (os.arch()) { @@ -231,3 +244,72 @@ export class Install { return releases[version]; } } + +class InstallCache { + private readonly htcName: string; + private readonly htcVersion: string; + private readonly ghaCacheKey: string; + private readonly cacheDir: string; + private readonly cacheFile: string; + private readonly cachePath: string; + + constructor(htcName: string, htcVersion: string) { + this.htcName = htcName; + this.htcVersion = htcVersion; + this.ghaCacheKey = util.format('%s-%s-%s', this.htcName, this.htcVersion, this.platform()); + this.cacheDir = path.join(Buildx.configDir, '.bin', htcVersion, this.platform()); + this.cacheFile = os.platform() == 'win32' ? 'docker-buildx.exe' : 'docker-buildx'; + this.cachePath = path.join(this.cacheDir, this.cacheFile); + if (!fs.existsSync(this.cacheDir)) { + fs.mkdirSync(this.cacheDir, {recursive: true}); + } + } + + public async save(file: string): Promise { + core.debug(`InstallCache.save ${file}`); + const cachePath = this.copyToCache(file); + + const htcPath = await tc.cacheDir(this.cacheDir, this.htcName, this.htcVersion, this.platform()); + core.debug(`InstallCache.save cached to hosted tool cache ${htcPath}`); + + if (cache.isFeatureAvailable()) { + core.debug(`InstallCache.save caching ${this.ghaCacheKey} to GitHub Actions cache`); + await cache.saveCache([this.cacheDir], this.ghaCacheKey); + } + + return cachePath; + } + + public async find(): Promise { + let htcPath = tc.find(this.htcName, this.htcVersion, this.platform()); + if (htcPath) { + core.info(`Restored from hosted tool cache ${htcPath}`); + return this.copyToCache(`${htcPath}/${this.cacheFile}`); + } + + if (cache.isFeatureAvailable()) { + core.debug(`GitHub Actions cache feature available`); + if (await cache.restoreCache([this.cacheFile], this.ghaCacheKey)) { + core.info(`Restored ${this.ghaCacheKey} from GitHub Actions cache`); + htcPath = await tc.cacheDir(this.cacheDir, this.htcName, this.htcVersion, this.platform()); + core.info(`Restored to hosted tool cache ${htcPath}`); + return this.copyToCache(`${htcPath}/${this.cacheFile}`); + } + } + + return ''; + } + + private copyToCache(file: string): string { + core.debug(`Copying ${file} to ${this.cachePath}`); + fs.copyFileSync(file, this.cachePath); + fs.chmodSync(this.cachePath, '0755'); + return this.cachePath; + } + + private platform(): string { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const arm_version = (process.config.variables as any).arm_version; + return `${os.platform()}-${os.arch()}${arm_version ? 'v' + arm_version : ''}`; + } +} diff --git a/yarn.lock b/yarn.lock index 79968816..7f4ebf33 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,6 +5,24 @@ __metadata: version: 6 cacheKey: 8 +"@actions/cache@npm:^3.2.1": + version: 3.2.1 + resolution: "@actions/cache@npm:3.2.1" + dependencies: + "@actions/core": ^1.10.0 + "@actions/exec": ^1.0.1 + "@actions/glob": ^0.1.0 + "@actions/http-client": ^2.0.1 + "@actions/io": ^1.0.1 + "@azure/abort-controller": ^1.1.0 + "@azure/ms-rest-js": ^2.6.0 + "@azure/storage-blob": ^12.13.0 + semver: ^6.1.0 + uuid: ^3.3.3 + checksum: ff06f82cc0cfcbd1180e93db13ac066d7d08895ce8d696c83c6d16718ddc2fda538f77a8d2f899236db5b00dc97b30c9afe58ac206dde813541349b84fe840ff + languageName: node + linkType: hard + "@actions/core@npm:^1.10.0, @actions/core@npm:^1.2.6": version: 1.10.0 resolution: "@actions/core@npm:1.10.0" @@ -15,7 +33,7 @@ __metadata: languageName: node linkType: hard -"@actions/exec@npm:^1.0.0, @actions/exec@npm:^1.1.1": +"@actions/exec@npm:^1.0.0, @actions/exec@npm:^1.0.1, @actions/exec@npm:^1.1.1": version: 1.1.1 resolution: "@actions/exec@npm:1.1.1" dependencies: @@ -36,6 +54,16 @@ __metadata: languageName: node linkType: hard +"@actions/glob@npm:^0.1.0": + version: 0.1.2 + resolution: "@actions/glob@npm:0.1.2" + dependencies: + "@actions/core": ^1.2.6 + minimatch: ^3.0.4 + checksum: 655532d35a47ccf4240d3c682f5e9591b61f07c8e382bedcf6fb4ace5b67b6cdf3043004d93d8b6e6342fb33a2e97eba3e76c8b5cc9b8ea1b89bf6857803f19a + languageName: node + linkType: hard + "@actions/http-client@npm:^2.0.1": version: 2.1.0 resolution: "@actions/http-client@npm:2.1.0" @@ -85,6 +113,130 @@ __metadata: languageName: node linkType: hard +"@azure/abort-controller@npm:^1.0.0, @azure/abort-controller@npm:^1.1.0": + version: 1.1.0 + resolution: "@azure/abort-controller@npm:1.1.0" + dependencies: + tslib: ^2.2.0 + checksum: 0f45e504d4aea799486867179afe7589255f6c111951279958e9d0aa5faebb2c96b8f88e3e3c958ce07b02bcba0b0cddb1bbec94705f573a48ecdb93eec1a92a + languageName: node + linkType: hard + +"@azure/core-auth@npm:^1.1.4, @azure/core-auth@npm:^1.3.0": + version: 1.4.0 + resolution: "@azure/core-auth@npm:1.4.0" + dependencies: + "@azure/abort-controller": ^1.0.0 + tslib: ^2.2.0 + checksum: 1c76c296fe911ad39fc780b033c25a92c41c5a15f011b816d42c13584f627a4dd153dfb4334900ec93eb5b006e14bdda37e8412a7697c5a9636a0abaccffad39 + languageName: node + linkType: hard + +"@azure/core-http@npm:^3.0.0": + version: 3.0.2 + resolution: "@azure/core-http@npm:3.0.2" + dependencies: + "@azure/abort-controller": ^1.0.0 + "@azure/core-auth": ^1.3.0 + "@azure/core-tracing": 1.0.0-preview.13 + "@azure/core-util": ^1.1.1 + "@azure/logger": ^1.0.0 + "@types/node-fetch": ^2.5.0 + "@types/tunnel": ^0.0.3 + form-data: ^4.0.0 + node-fetch: ^2.6.7 + process: ^0.11.10 + tslib: ^2.2.0 + tunnel: ^0.0.6 + uuid: ^8.3.0 + xml2js: ^0.5.0 + checksum: 01b5a75e09533476dbb69c672dcd00d48298cf81db5015cd261c510c5be377176db8e3dc4809e6952459bfbe214f52f8a1ed84a116ac31b8a7388b2025098f66 + languageName: node + linkType: hard + +"@azure/core-lro@npm:^2.2.0": + version: 2.5.3 + resolution: "@azure/core-lro@npm:2.5.3" + dependencies: + "@azure/abort-controller": ^1.0.0 + "@azure/core-util": ^1.2.0 + "@azure/logger": ^1.0.0 + tslib: ^2.2.0 + checksum: 443ae1884a6bc9edfeee1e62463b218a020f1be987ef755c13d5afe39803bbceb8ca9174bd516e1db9bc3f3762f71168167ea0ee9873c66e3d86a6667d5a0457 + languageName: node + linkType: hard + +"@azure/core-paging@npm:^1.1.1": + version: 1.5.0 + resolution: "@azure/core-paging@npm:1.5.0" + dependencies: + tslib: ^2.2.0 + checksum: 156230f0fdf757a0353a2aac6d012d385ed88f8ab5bccf00eee27d8d75843e681674b2d10ed43309669f9cb93bf8d9d000232896593b6fcf399fa391442a59c5 + languageName: node + linkType: hard + +"@azure/core-tracing@npm:1.0.0-preview.13": + version: 1.0.0-preview.13 + resolution: "@azure/core-tracing@npm:1.0.0-preview.13" + dependencies: + "@opentelemetry/api": ^1.0.1 + tslib: ^2.2.0 + checksum: bc3ea8dce1fc6bb6e4cb2e82ec0c361b3e6f6e18e162f352eb347e6991c6461ebc249f5d1b36402cc0d295e2a6bcbaa68014445d7f4293c0792a698c430f145e + languageName: node + linkType: hard + +"@azure/core-util@npm:^1.1.1, @azure/core-util@npm:^1.2.0": + version: 1.3.2 + resolution: "@azure/core-util@npm:1.3.2" + dependencies: + "@azure/abort-controller": ^1.0.0 + tslib: ^2.2.0 + checksum: c26053a209ed99c5b31ec54bd456155a7e602fda0b680ba326063ee42427efe60042124fbf22701397647e822bee252f77fec449e8f8100c406b8ca7168c8359 + languageName: node + linkType: hard + +"@azure/logger@npm:^1.0.0": + version: 1.0.4 + resolution: "@azure/logger@npm:1.0.4" + dependencies: + tslib: ^2.2.0 + checksum: 2c243d4c667bbc5cd3e60d4473d0f1169fcef2498a02138398af15547fe1b2870197bcb4c487327451488e4d71dee05244771d51328f03611e193b99fb9aa9af + languageName: node + linkType: hard + +"@azure/ms-rest-js@npm:^2.6.0": + version: 2.6.6 + resolution: "@azure/ms-rest-js@npm:2.6.6" + dependencies: + "@azure/core-auth": ^1.1.4 + abort-controller: ^3.0.0 + form-data: ^2.5.0 + node-fetch: ^2.6.7 + tough-cookie: ^3.0.1 + tslib: ^1.10.0 + tunnel: 0.0.6 + uuid: ^8.3.2 + xml2js: ^0.5.0 + checksum: bd85d2df8da800c96c062a9ce26e98f72ee6fa61c9e010ec45fc3f63f9276a2668737a73dd2e19729dcfb81f22eedc7919262cc24ae5581ab4f4b526a5fcb6c1 + languageName: node + linkType: hard + +"@azure/storage-blob@npm:^12.13.0": + version: 12.14.0 + resolution: "@azure/storage-blob@npm:12.14.0" + dependencies: + "@azure/abort-controller": ^1.0.0 + "@azure/core-http": ^3.0.0 + "@azure/core-lro": ^2.2.0 + "@azure/core-paging": ^1.1.1 + "@azure/core-tracing": 1.0.0-preview.13 + "@azure/logger": ^1.0.0 + events: ^3.0.0 + tslib: ^2.2.0 + checksum: d087afd09a68342f7dcc655bf8861ffbcf84caddbfeee9ad226491a5b890fe0721a51d7221d0fc514b205a50ac153982803d89958640d2237a431b5f6b47dd6c + languageName: node + linkType: hard + "@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.14.5": version: 7.14.5 resolution: "@babel/code-frame@npm:7.14.5" @@ -804,6 +956,7 @@ __metadata: version: 0.0.0-use.local resolution: "@docker/actions-toolkit@workspace:." dependencies: + "@actions/cache": ^3.2.1 "@actions/core": ^1.10.0 "@actions/exec": ^1.1.1 "@actions/github": ^5.1.1 @@ -1512,6 +1665,13 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/api@npm:^1.0.1": + version: 1.4.1 + resolution: "@opentelemetry/api@npm:1.4.1" + checksum: e783c40d1a518abf9c4c5d65223237c1392cd9a6c53ac6e2c3ef0c05ff7266e3dfc4fd9874316dae0dcb7a97950878deb513bcbadfaad653d48f0215f2a0911b + languageName: node + linkType: hard + "@sinclair/typebox@npm:^0.25.16": version: 0.25.24 resolution: "@sinclair/typebox@npm:0.25.24" @@ -1677,6 +1837,16 @@ __metadata: languageName: node linkType: hard +"@types/node-fetch@npm:^2.5.0": + version: 2.6.4 + resolution: "@types/node-fetch@npm:2.6.4" + dependencies: + "@types/node": "*" + form-data: ^3.0.0 + checksum: f3e1d881bb42269e676ecaf49f0e096ab345e22823a2b2d071d60619414817fe02df48a31a8d05adb23054028a2a65521bdb3906ceb763ab6d3339c8d8775058 + languageName: node + linkType: hard + "@types/node@npm:*": version: 15.12.4 resolution: "@types/node@npm:15.12.4" @@ -1733,6 +1903,15 @@ __metadata: languageName: node linkType: hard +"@types/tunnel@npm:^0.0.3": + version: 0.0.3 + resolution: "@types/tunnel@npm:0.0.3" + dependencies: + "@types/node": "*" + checksum: 53e23a1f9fb14a491c00425b2a4fc443817564d77be5e1b95fcbeb6d009551b62ea82ffc3e5ca0c6b9f6b186824ca6ec46e7450c1bcd6674a46d1325f0116e24 + languageName: node + linkType: hard + "@types/yargs-parser@npm:*": version: 20.2.0 resolution: "@types/yargs-parser@npm:20.2.0" @@ -1938,6 +2117,15 @@ __metadata: languageName: node linkType: hard +"abort-controller@npm:^3.0.0": + version: 3.0.0 + resolution: "abort-controller@npm:3.0.0" + dependencies: + event-target-shim: ^5.0.0 + checksum: 170bdba9b47b7e65906a28c8ce4f38a7a369d78e2271706f020849c1bfe0ee2067d4261df8bbb66eb84f79208fd5b710df759d64191db58cfba7ce8ef9c54b75 + languageName: node + linkType: hard + "acorn-jsx@npm:^5.3.2": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" @@ -2182,6 +2370,13 @@ __metadata: languageName: node linkType: hard +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be + languageName: node + linkType: hard + "available-typed-arrays@npm:^1.0.5": version: 1.0.5 resolution: "available-typed-arrays@npm:1.0.5" @@ -2575,6 +2770,15 @@ __metadata: languageName: node linkType: hard +"combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: ~1.0.0 + checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c + languageName: node + linkType: hard + "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -2770,6 +2974,13 @@ __metadata: languageName: node linkType: hard +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 + languageName: node + linkType: hard + "delegates@npm:^1.0.0": version: 1.0.0 resolution: "delegates@npm:1.0.0" @@ -3266,6 +3477,20 @@ __metadata: languageName: node linkType: hard +"event-target-shim@npm:^5.0.0": + version: 5.0.1 + resolution: "event-target-shim@npm:5.0.1" + checksum: 1ffe3bb22a6d51bdeb6bf6f7cf97d2ff4a74b017ad12284cc9e6a279e727dc30a5de6bb613e5596ff4dc3e517841339ad09a7eec44266eccb1aa201a30448166 + languageName: node + linkType: hard + +"events@npm:^3.0.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: f6f487ad2198aa41d878fa31452f1a3c00958f46e9019286ff4787c84aac329332ab45c9cdc8c445928fc6d7ded294b9e005a7fce9426488518017831b272780 + languageName: node + linkType: hard + "execa@npm:^5.0.0": version: 5.1.1 resolution: "execa@npm:5.1.1" @@ -3439,6 +3664,39 @@ __metadata: languageName: node linkType: hard +"form-data@npm:^2.5.0": + version: 2.5.1 + resolution: "form-data@npm:2.5.1" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.6 + mime-types: ^2.1.12 + checksum: 5134ada56cc246b293a1ac7678dba6830000603a3979cf83ff7b2f21f2e3725202237cfb89e32bcb38a1d35727efbd3c3a22e65b42321e8ade8eec01ce755d08 + languageName: node + linkType: hard + +"form-data@npm:^3.0.0": + version: 3.0.1 + resolution: "form-data@npm:3.0.1" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.8 + mime-types: ^2.1.12 + checksum: b019e8d35c8afc14a2bd8a7a92fa4f525a4726b6d5a9740e8d2623c30e308fbb58dc8469f90415a856698933c8479b01646a9dff33c87cc4e76d72aedbbf860d + languageName: node + linkType: hard + +"form-data@npm:^4.0.0": + version: 4.0.0 + resolution: "form-data@npm:4.0.0" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.8 + mime-types: ^2.1.12 + checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c + languageName: node + linkType: hard + "fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" @@ -3952,6 +4210,13 @@ __metadata: languageName: node linkType: hard +"ip-regex@npm:^2.1.0": + version: 2.1.0 + resolution: "ip-regex@npm:2.1.0" + checksum: 331d95052aa53ce245745ea0fc3a6a1e2e3c8d6da65fa8ea52bf73768c1b22a9ac50629d1d2b08c04e7b3ac4c21b536693c149ce2c2615ee4796030e5b3e3cba + languageName: node + linkType: hard + "ip@npm:^2.0.0": version: 2.0.0 resolution: "ip@npm:2.0.0" @@ -5002,6 +5267,22 @@ __metadata: languageName: node linkType: hard +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: 1.52.0 + checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 + languageName: node + linkType: hard + "mimic-fn@npm:^2.1.0": version: 2.1.0 resolution: "mimic-fn@npm:2.1.0" @@ -5614,6 +5895,13 @@ __metadata: languageName: node linkType: hard +"process@npm:^0.11.10": + version: 0.11.10 + resolution: "process@npm:0.11.10" + checksum: bfcce49814f7d172a6e6a14d5fa3ac92cc3d0c3b9feb1279774708a719e19acd673995226351a082a9ae99978254e320ccda4240ddc474ba31a76c79491ca7c3 + languageName: node + linkType: hard + "promise-inflight@npm:^1.0.1": version: 1.0.1 resolution: "promise-inflight@npm:1.0.1" @@ -5641,6 +5929,13 @@ __metadata: languageName: node linkType: hard +"psl@npm:^1.1.28": + version: 1.9.0 + resolution: "psl@npm:1.9.0" + checksum: 20c4277f640c93d393130673f392618e9a8044c6c7bf61c53917a0fddb4952790f5f362c6c730a9c32b124813e173733f9895add8d26f566ed0ea0654b2e711d + languageName: node + linkType: hard + "punycode@npm:^2.1.0": version: 2.1.1 resolution: "punycode@npm:2.1.1" @@ -5648,6 +5943,13 @@ __metadata: languageName: node linkType: hard +"punycode@npm:^2.1.1": + version: 2.3.0 + resolution: "punycode@npm:2.3.0" + checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200 + languageName: node + linkType: hard + "pure-rand@npm:^6.0.0": version: 6.0.1 resolution: "pure-rand@npm:6.0.1" @@ -5904,6 +6206,13 @@ __metadata: languageName: node linkType: hard +"sax@npm:>=0.6.0": + version: 1.2.4 + resolution: "sax@npm:1.2.4" + checksum: d3df7d32b897a2c2f28e941f732c71ba90e27c24f62ee918bd4d9a8cfb3553f2f81e5493c7f0be94a11c1911b643a9108f231dd6f60df3fa9586b5d2e3e9e1fe + languageName: node + linkType: hard + "semver@npm:7.x, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3": version: 7.5.3 resolution: "semver@npm:7.5.3" @@ -6313,6 +6622,17 @@ __metadata: languageName: node linkType: hard +"tough-cookie@npm:^3.0.1": + version: 3.0.1 + resolution: "tough-cookie@npm:3.0.1" + dependencies: + ip-regex: ^2.1.0 + psl: ^1.1.28 + punycode: ^2.1.1 + checksum: 796f6239bce5674a1267b19f41972a2602a2a23715817237b5922b0dc2343512512eea7d41d29210a4ec545f8ef32173bbbf01277dd8ec3ae3841b19cbe69f67 + languageName: node + linkType: hard + "tr46@npm:~0.0.3": version: 0.0.3 resolution: "tr46@npm:0.0.3" @@ -6410,13 +6730,20 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^1.8.1": +"tslib@npm:^1.10.0, tslib@npm:^1.8.1": version: 1.14.1 resolution: "tslib@npm:1.14.1" checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd languageName: node linkType: hard +"tslib@npm:^2.2.0": + version: 2.6.0 + resolution: "tslib@npm:2.6.0" + checksum: c01066038f950016a18106ddeca4649b4d76caa76ec5a31e2a26e10586a59fceb4ee45e96719bf6c715648e7c14085a81fee5c62f7e9ebee68e77a5396e5538f + languageName: node + linkType: hard + "tsutils@npm:^3.21.0": version: 3.21.0 resolution: "tsutils@npm:3.21.0" @@ -6428,7 +6755,7 @@ __metadata: languageName: node linkType: hard -"tunnel@npm:^0.0.6": +"tunnel@npm:0.0.6, tunnel@npm:^0.0.6": version: 0.0.6 resolution: "tunnel@npm:0.0.6" checksum: c362948df9ad34b649b5585e54ce2838fa583aa3037091aaed66793c65b423a264e5229f0d7e9a95513a795ac2bd4cb72cda7e89a74313f182c1e9ae0b0994fa @@ -6579,7 +6906,7 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^3.3.2": +"uuid@npm:^3.3.2, uuid@npm:^3.3.3": version: 3.4.0 resolution: "uuid@npm:3.4.0" bin: @@ -6588,7 +6915,7 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^8.3.2": +"uuid@npm:^8.3.0, uuid@npm:^8.3.2": version: 8.3.2 resolution: "uuid@npm:8.3.2" bin: @@ -6740,6 +7067,23 @@ __metadata: languageName: node linkType: hard +"xml2js@npm:^0.5.0": + version: 0.5.0 + resolution: "xml2js@npm:0.5.0" + dependencies: + sax: ">=0.6.0" + xmlbuilder: ~11.0.0 + checksum: 1aa71d62e5bc2d89138e3929b9ea46459157727759cbc62ef99484b778641c0cd21fb637696c052d901a22f82d092a3e740a16b4ce218e81ac59b933535124ea + languageName: node + linkType: hard + +"xmlbuilder@npm:~11.0.0": + version: 11.0.1 + resolution: "xmlbuilder@npm:11.0.1" + checksum: 7152695e16f1a9976658215abab27e55d08b1b97bca901d58b048d2b6e106b5af31efccbdecf9b07af37c8377d8e7e821b494af10b3a68b0ff4ae60331b415b0 + languageName: node + linkType: hard + "y18n@npm:^5.0.5": version: 5.0.8 resolution: "y18n@npm:5.0.8"