From a42b0d930fc205fa68cb25789989691da4508dd6 Mon Sep 17 00:00:00 2001 From: Remie Bolte Date: Sat, 20 Apr 2024 08:58:10 +0200 Subject: [PATCH] feat: add build command --- package.json | 2 + src/commands/build.ts | 109 +++++++++++ src/{applications => helpers}/amps.ts | 0 src/helpers/docker.ts | 31 ++++ src/index.ts | 5 + yarn.lock | 256 +++++++++++++++++++++++++- 6 files changed, 397 insertions(+), 6 deletions(-) create mode 100644 src/commands/build.ts rename src/{applications => helpers}/amps.ts (100%) create mode 100644 src/helpers/docker.ts diff --git a/package.json b/package.json index a4ba282..4f547e5 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "@rollup/plugin-json": "6.1.0", "@rollup/plugin-node-resolve": "15.2.3", "@rollup/plugin-terser": "0.4.4", + "@types/dockerode": "3.3.28", "@types/js-yaml": "4", "@types/node": "18.16.0", "@types/pg": "8", @@ -66,6 +67,7 @@ "chokidar": "3.6.0", "commander": "12.0.0", "docker-compose": "0.24.8", + "dockerode": "4.0.2", "exit-hook": "4.0.0", "fast-xml-parser": "4.3.6", "js-yaml": "4.1.0", diff --git a/src/commands/build.ts b/src/commands/build.ts new file mode 100644 index 0000000..fe83950 --- /dev/null +++ b/src/commands/build.ts @@ -0,0 +1,109 @@ +#!/usr/bin/env node + +import { watch } from 'chokidar'; +import { Option, program } from 'commander'; +import { asyncExitHook, gracefulExit } from 'exit-hook'; +import { resolve } from 'path'; +import { cwd } from 'process'; + +import { AMPS } from '../helpers/amps'; +import { Docker } from '../helpers/docker'; +import { getApplicationByName } from '../helpers/getApplication'; +import { isRecursiveBuild } from '../helpers/isRecursiveBuild'; +import { showRecursiveBuildWarning } from '../helpers/showRecursiveBuildWarning'; + +(async () => { + const options = program + .name('dcdx build') + .description('Build & install the Atlassian Data Center plugin from the current directory.\nYou can add Maven build arguments after the command options.') + .usage('[options] [...maven_arguments]') + .addOption(new Option('-w, --watch ', 'Additional list of glob patterns used to watch for file changes')) + .addOption(new Option('-P, --activate-profiles ', 'Comma-delimited list of profiles to activate')) + .addOption(new Option('-o, --outputDirectory ', 'Output directory where QuickReload will look for generated JAR files').default('target')) + .allowUnknownOption(true) + .parse(process.argv) + .opts(); + + if (!AMPS.isAtlassianPlugin()) { + console.log('Unable to find an Atlassian Plugin project in the current directory 🤔'); + gracefulExit(); + } + + const application = AMPS.getApplication(); + if (!application) { + console.log('The Atlassian Plugin project does not contain an AMPS configuration, unable to detect product 😰'); + gracefulExit(); + process.exit(); + } + + const Application = getApplicationByName(application); + if (!Application) { + console.log('The Atlassian Plugin project does not contain an AMPS configuration, unable to detect product 😰'); + process.exit(); + } + + const mavenOpts = program.args.slice(); + if (options.activateProfiles) { + mavenOpts.push(...[ '-P', options.activateProfiles ]); + } + + console.log(`Looking for running instances of ${application}`); + const containerIds = await Docker.getRunningContainerIds(application); + if (containerIds.length > 1) { + console.log(`There are multple running instance of ${application}, unable to determine which one to use`); + gracefulExit(0); + return; + } + + const containerId = containerIds[0]; + if (!containerId) { + console.log(`Could not find running instance of ${application}, please make sure they are running first!`); + gracefulExit(0); + return; + } + + console.log('Watching filesystem for changes to source files (QuickReload)'); + let lastBuildCompleted = new Date().getTime(); + const patterns = Array.isArray(options.watch) ? options.watch : [ options.watch ]; + const quickReload = watch([ '**/*', ...patterns ], { + cwd: cwd(), + usePolling: true, + interval: 2 * 1000, + binaryInterval: 2 * 1000, + awaitWriteFinish: true, + persistent: true, + atomic: true + }); + + asyncExitHook(async () => { + console.log(`Stopping filesystem watcher... ⏳`); + await quickReload.close(); + console.log(`Successfully stopped all running processes 💪`); + }, { wait: 30 * 1000 }); + + quickReload.on('change', async (path) => { + if (path.startsWith(options.outputDirectory) && path.toLowerCase().endsWith('.jar')) { + console.log('Found updated JAR file, uploading them to QuickReload'); + await Docker.copy(resolve(path), `${containerId}:/opt/quickreload/`) + .then(() => console.log('Finished uploading JAR file to QuickReload')) + .catch(err => console.log('Failed to upload JAR file to QuickReload', err)); + lastBuildCompleted = new Date().getTime(); + } else if (!path.startsWith(options.outputDirectory)) { + if (isRecursiveBuild(lastBuildCompleted)) { + showRecursiveBuildWarning(options.outputDirectory); + } else { + console.log('Detected file change, rebuilding Atlasian Plugin for QuickReload'); + await AMPS.build(mavenOpts).catch(() => Promise.resolve()); + } + } + }); + + await AMPS.build(mavenOpts).catch(() => Promise.resolve()); + lastBuildCompleted = new Date().getTime(); +})(); + +process.on('SIGINT', () => { + console.log(`Received term signal, trying to stop gracefully 💪`); + gracefulExit(); +}); + diff --git a/src/applications/amps.ts b/src/helpers/amps.ts similarity index 100% rename from src/applications/amps.ts rename to src/helpers/amps.ts diff --git a/src/helpers/docker.ts b/src/helpers/docker.ts new file mode 100644 index 0000000..84a3ceb --- /dev/null +++ b/src/helpers/docker.ts @@ -0,0 +1,31 @@ +import { spawn } from 'child_process'; +import Dockerode from 'dockerode'; +import { cwd } from 'process'; + +import { SupportedApplications } from '../types/SupportedApplications'; + +const docker = new Dockerode(); + +export class Docker { + + public static async getRunningContainerIds(application: SupportedApplications) { + const containers = await docker.listContainers({ filters: { + status: [ 'running' ], + label: [ `com.docker.compose.service=${application}` ] + }}); + return containers.map(item => item.Id); + } + + public static async copy(sourcePath: string, destinationPath:string) { + return new Promise((resolve, reject) => { + const docker = spawn( + 'docker', + [ 'cp', sourcePath, destinationPath ], + { cwd: cwd(), stdio: 'inherit' } + ); + docker.on('error', reject) + docker.on('exit', (code) => (code === 0) ? resolve() : reject(new Error(`Docker exited with code ${code}`))); + }); + } + +} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 1edbc65..c49e809 100644 --- a/src/index.ts +++ b/src/index.ts @@ -10,6 +10,11 @@ program .version(version) .showHelpAfterError(true); +// ------------------------------------------------------------------------------------------ Build + +program + .command('build', 'Build & install the Atlassian Data Center plugin from the current directory', { executableFile: './commands/build.js' }); + // ------------------------------------------------------------------------------------------ Start program diff --git a/yarn.lock b/yarn.lock index 9648ccc..0987d91 100644 --- a/yarn.lock +++ b/yarn.lock @@ -238,6 +238,13 @@ __metadata: languageName: node linkType: hard +"@balena/dockerignore@npm:^1.0.2": + version: 1.0.2 + resolution: "@balena/dockerignore@npm:1.0.2" + checksum: 10c0/0bcb067e86f6734ab943ce4ce9a7c8611f2e983a70bccebf9d2309db57695c09dded7faf5be49c929c4c9e9a9174ae55fc625626de0fb9958823c37423d12f4e + languageName: node + linkType: hard + "@colors/colors@npm:1.5.0": version: 1.5.0 resolution: "@colors/colors@npm:1.5.0" @@ -1173,6 +1180,27 @@ __metadata: languageName: node linkType: hard +"@types/docker-modem@npm:*": + version: 3.0.6 + resolution: "@types/docker-modem@npm:3.0.6" + dependencies: + "@types/node": "npm:*" + "@types/ssh2": "npm:*" + checksum: 10c0/d3ffd273148bc883ff9b1a972b1f84c1add6d9a197d2f4fc9774db4c814f39c2e51cc649385b55d781c790c16fb0bf9c1f4c62499bd0f372a4b920190919445d + languageName: node + linkType: hard + +"@types/dockerode@npm:3.3.28": + version: 3.3.28 + resolution: "@types/dockerode@npm:3.3.28" + dependencies: + "@types/docker-modem": "npm:*" + "@types/node": "npm:*" + "@types/ssh2": "npm:*" + checksum: 10c0/ce43da3cd269e11e999366aa9019a067d97dc012d7c460b560dfe75d4ccacc618077f2dfc5f34da2c915d4d86ed883d00d3bb741fd8440ef4ca1136afbc29b9f + languageName: node + linkType: hard + "@types/estree@npm:*, @types/estree@npm:1.0.5, @types/estree@npm:^1.0.0": version: 1.0.5 resolution: "@types/estree@npm:1.0.5" @@ -1217,6 +1245,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^18.11.18": + version: 18.19.31 + resolution: "@types/node@npm:18.19.31" + dependencies: + undici-types: "npm:~5.26.4" + checksum: 10c0/bfebae8389220c0188492c82eaf328f4ba15e6e9b4abee33d6bf36d3b13f188c2f53eb695d427feb882fff09834f467405e2ed9be6aeb6ad4705509822d2ea08 + languageName: node + linkType: hard + "@types/normalize-package-data@npm:^2.4.3": version: 2.4.4 resolution: "@types/normalize-package-data@npm:2.4.4" @@ -1259,6 +1296,15 @@ __metadata: languageName: node linkType: hard +"@types/ssh2@npm:*": + version: 1.15.0 + resolution: "@types/ssh2@npm:1.15.0" + dependencies: + "@types/node": "npm:^18.11.18" + checksum: 10c0/055c271845847867c365b0c002e59536608e400864aea4f54ebc72e8588b92dbc4b6572e3095092dba0d86d49898e2180a389810269d119f897972ebbddb4a7f + languageName: node + linkType: hard + "@types/validator@npm:^13.7.17": version: 13.11.9 resolution: "@types/validator@npm:13.11.9" @@ -1644,6 +1690,15 @@ __metadata: languageName: node linkType: hard +"asn1@npm:^0.2.6": + version: 0.2.6 + resolution: "asn1@npm:0.2.6" + dependencies: + safer-buffer: "npm:~2.1.0" + checksum: 10c0/00c8a06c37e548762306bcb1488388d2f76c74c36f70c803f0c081a01d3bdf26090fc088cd812afc5e56a6d49e33765d451a5f8a68ab9c2b087eba65d2e980e0 + languageName: node + linkType: hard + "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -1685,6 +1740,15 @@ __metadata: languageName: node linkType: hard +"bcrypt-pbkdf@npm:^1.0.2": + version: 1.0.2 + resolution: "bcrypt-pbkdf@npm:1.0.2" + dependencies: + tweetnacl: "npm:^0.14.3" + checksum: 10c0/ddfe85230b32df25aeebfdccfbc61d3bc493ace49c884c9c68575de1f5dcf733a5d7de9def3b0f318b786616b8d85bad50a28b1da1750c43e0012c93badcc148 + languageName: node + linkType: hard + "before-after-hook@npm:^3.0.2": version: 3.0.2 resolution: "before-after-hook@npm:3.0.2" @@ -1711,6 +1775,17 @@ __metadata: languageName: node linkType: hard +"bl@npm:^4.0.3": + version: 4.1.0 + resolution: "bl@npm:4.1.0" + dependencies: + buffer: "npm:^5.5.0" + inherits: "npm:^2.0.4" + readable-stream: "npm:^3.4.0" + checksum: 10c0/02847e1d2cb089c9dc6958add42e3cdeaf07d13f575973963335ac0fdece563a50ac770ac4c8fa06492d2dd276f6cc3b7f08c7cd9c7a7ad0f8d388b2a28def5f + languageName: node + linkType: hard + "bl@npm:^6.0.11": version: 6.0.12 resolution: "bl@npm:6.0.12" @@ -1772,6 +1847,16 @@ __metadata: languageName: node linkType: hard +"buffer@npm:^5.5.0": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.1.13" + checksum: 10c0/27cac81cff434ed2876058d72e7c4789d11ff1120ef32c9de48f59eab58179b66710c488987d295ae89a228f835fc66d088652dffeb8e3ba8659f80eb091d55e + languageName: node + linkType: hard + "buffer@npm:^6.0.3": version: 6.0.3 resolution: "buffer@npm:6.0.3" @@ -1782,6 +1867,13 @@ __metadata: languageName: node linkType: hard +"buildcheck@npm:~0.0.6": + version: 0.0.6 + resolution: "buildcheck@npm:0.0.6" + checksum: 10c0/8cbdb89f41bc484b8325f4828db4135b206a0dffb641eb6cdb2b7022483c45dd0e5aac6d820c9a67bdd2caab3a02c76d7ceec7bd9ec494b5a2270d2806b01a76 + languageName: node + linkType: hard + "builtin-modules@npm:^3.3.0": version: 3.3.0 resolution: "builtin-modules@npm:3.3.0" @@ -1892,6 +1984,13 @@ __metadata: languageName: node linkType: hard +"chownr@npm:^1.1.1": + version: 1.1.4 + resolution: "chownr@npm:1.1.4" + checksum: 10c0/ed57952a84cc0c802af900cf7136de643d3aba2eecb59d29344bc2f3f9bf703a301b9d84cdc71f82c3ffc9ccde831b0d92f5b45f91727d6c9da62f23aef9d9db + languageName: node + linkType: hard + "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -2205,6 +2304,17 @@ __metadata: languageName: node linkType: hard +"cpu-features@npm:~0.0.9": + version: 0.0.9 + resolution: "cpu-features@npm:0.0.9" + dependencies: + buildcheck: "npm:~0.0.6" + nan: "npm:^2.17.0" + node-gyp: "npm:latest" + checksum: 10c0/e12aa8b791d2db6572d23553c2eb14dfe90c80fa69c788fcf8f2a5dc373b7ac1c99dd04292677751746cafe51a67d62eb09fd9f88502e37830fe602c7e582ca8 + languageName: node + linkType: hard + "cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" @@ -2276,6 +2386,7 @@ __metadata: "@rollup/plugin-json": "npm:6.1.0" "@rollup/plugin-node-resolve": "npm:15.2.3" "@rollup/plugin-terser": "npm:0.4.4" + "@types/dockerode": "npm:3.3.28" "@types/js-yaml": "npm:4" "@types/node": "npm:18.16.0" "@types/pg": "npm:8" @@ -2287,6 +2398,7 @@ __metadata: chokidar: "npm:3.6.0" commander: "npm:12.0.0" docker-compose: "npm:0.24.8" + dockerode: "npm:4.0.2" eslint: "npm:9.0.0" eslint-plugin-simple-import-sort: "npm:12.0.0" exit-hook: "npm:4.0.0" @@ -2420,6 +2532,29 @@ __metadata: languageName: node linkType: hard +"docker-modem@npm:^5.0.3": + version: 5.0.3 + resolution: "docker-modem@npm:5.0.3" + dependencies: + debug: "npm:^4.1.1" + readable-stream: "npm:^3.5.0" + split-ca: "npm:^1.0.1" + ssh2: "npm:^1.15.0" + checksum: 10c0/86d18b1b1e92954f4f5632b82453588670c11265a60d982c57bfcd737fe0362f4aa68176edae6d3c3f92c17a59bcfe8840fc741c06baea55e2003a78d7d16045 + languageName: node + linkType: hard + +"dockerode@npm:4.0.2": + version: 4.0.2 + resolution: "dockerode@npm:4.0.2" + dependencies: + "@balena/dockerignore": "npm:^1.0.2" + docker-modem: "npm:^5.0.3" + tar-fs: "npm:~2.0.1" + checksum: 10c0/69ece79408aca8523726fcec9d9c168b9a987b60b7143502583cc0b731dd2abf8b69b9d7d71c20d2bddcc508ebb477d82849d0bd368df260fedd8d62de5c5937 + languageName: node + linkType: hard + "dot-prop@npm:^5.1.0": version: 5.3.0 resolution: "dot-prop@npm:5.3.0" @@ -2491,6 +2626,15 @@ __metadata: languageName: node linkType: hard +"end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" + dependencies: + once: "npm:^1.4.0" + checksum: 10c0/870b423afb2d54bb8d243c63e07c170409d41e20b47eeef0727547aea5740bd6717aca45597a9f2745525667a6b804c1e7bede41f856818faee5806dd9ff3975 + languageName: node + linkType: hard + "env-ci@npm:^11.0.0": version: 11.0.0 resolution: "env-ci@npm:11.0.0" @@ -3025,6 +3169,13 @@ __metadata: languageName: node linkType: hard +"fs-constants@npm:^1.0.0": + version: 1.0.0 + resolution: "fs-constants@npm:1.0.0" + checksum: 10c0/a0cde99085f0872f4d244e83e03a46aa387b74f5a5af750896c6b05e9077fac00e9932fdf5aef84f2f16634cd473c63037d7a512576da7d5c2b9163d1909f3a8 + languageName: node + linkType: hard + "fs-extra@npm:^11.0.0": version: 11.2.0 resolution: "fs-extra@npm:11.2.0" @@ -3477,7 +3628,7 @@ __metadata: languageName: node linkType: hard -"ieee754@npm:^1.2.1": +"ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": version: 1.2.1 resolution: "ieee754@npm:1.2.1" checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb @@ -3579,7 +3730,7 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:^2.0.1, inherits@npm:^2.0.4, inherits@npm:~2.0.3": +"inherits@npm:2, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 @@ -4743,6 +4894,13 @@ __metadata: languageName: node linkType: hard +"mkdirp-classic@npm:^0.5.2": + version: 0.5.3 + resolution: "mkdirp-classic@npm:0.5.3" + checksum: 10c0/95371d831d196960ddc3833cc6907e6b8f67ac5501a6582f47dfae5eb0f092e9f8ce88e0d83afcae95d6e2b61a01741ba03714eeafb6f7a6e9dcc158ac85b168 + languageName: node + linkType: hard + "mkdirp@npm:^1.0.3": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" @@ -4825,6 +4983,15 @@ __metadata: languageName: node linkType: hard +"nan@npm:^2.17.0, nan@npm:^2.18.0": + version: 2.19.0 + resolution: "nan@npm:2.19.0" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/b8d05d75f92ee9d94affa50d0aa41b6c698254c848529452d7ab67c2e0d160a83f563bfe2cbd53e077944eceb48c757f83c93634c7c9ff404c9ec1ed4e5ced1a + languageName: node + linkType: hard + "native-duplexpair@npm:^1.0.0": version: 1.0.0 resolution: "native-duplexpair@npm:1.0.0" @@ -5201,7 +5368,7 @@ __metadata: languageName: node linkType: hard -"once@npm:^1.3.0": +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": version: 1.4.0 resolution: "once@npm:1.4.0" dependencies: @@ -5810,6 +5977,16 @@ __metadata: languageName: node linkType: hard +"pump@npm:^3.0.0": + version: 3.0.0 + resolution: "pump@npm:3.0.0" + dependencies: + end-of-stream: "npm:^1.1.0" + once: "npm:^1.3.1" + checksum: 10c0/bbdeda4f747cdf47db97428f3a135728669e56a0ae5f354a9ac5b74556556f5446a46f720a8f14ca2ece5be9b4d5d23c346db02b555f46739934cc6c093a5478 + languageName: node + linkType: hard + "punycode@npm:^2.1.0": version: 2.3.1 resolution: "punycode@npm:2.3.1" @@ -5944,6 +6121,17 @@ __metadata: languageName: node linkType: hard +"readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: "npm:^2.0.3" + string_decoder: "npm:^1.1.1" + util-deprecate: "npm:^1.0.1" + checksum: 10c0/e37be5c79c376fdd088a45fa31ea2e423e5d48854be7a22a58869b4e84d25047b193f6acb54f1012331e1bcd667ffb569c01b99d36b0bd59658fb33f513511b7 + languageName: node + linkType: hard + "readable-stream@npm:^4.2.0": version: 4.5.2 resolution: "readable-stream@npm:4.5.2" @@ -6177,7 +6365,7 @@ __metadata: languageName: node linkType: hard -"safer-buffer@npm:>= 2.1.2 < 3.0.0": +"safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:~2.1.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 @@ -6555,6 +6743,13 @@ __metadata: languageName: node linkType: hard +"split-ca@npm:^1.0.1": + version: 1.0.1 + resolution: "split-ca@npm:1.0.1" + checksum: 10c0/f339170b84c6b4706fcf4c60cc84acb36574c0447566bd713301a8d9b4feff7f4627efc8c334bec24944a3e2f35bc596bd58c673c9980d6bfe3137aae1116ba7 + languageName: node + linkType: hard + "split2@npm:^4.0.0, split2@npm:^4.1.0": version: 4.2.0 resolution: "split2@npm:4.2.0" @@ -6585,6 +6780,23 @@ __metadata: languageName: node linkType: hard +"ssh2@npm:^1.15.0": + version: 1.15.0 + resolution: "ssh2@npm:1.15.0" + dependencies: + asn1: "npm:^0.2.6" + bcrypt-pbkdf: "npm:^1.0.2" + cpu-features: "npm:~0.0.9" + nan: "npm:^2.18.0" + dependenciesMeta: + cpu-features: + optional: true + nan: + optional: true + checksum: 10c0/7c76888fbfa1c15660cf51086a6e5699b3c1caad516e29adb1d2a00fc1ef6b48946ca7ec811b4bb50456984967c4346115c7ddd3dbf981a1193bd1f40fa4529a + languageName: node + linkType: hard + "ssri@npm:^10.0.0, ssri@npm:^10.0.5": version: 10.0.5 resolution: "ssri@npm:10.0.5" @@ -6667,7 +6879,7 @@ __metadata: languageName: node linkType: hard -"string_decoder@npm:^1.3.0": +"string_decoder@npm:^1.1.1, string_decoder@npm:^1.3.0": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" dependencies: @@ -6790,6 +7002,31 @@ __metadata: languageName: node linkType: hard +"tar-fs@npm:~2.0.1": + version: 2.0.1 + resolution: "tar-fs@npm:2.0.1" + dependencies: + chownr: "npm:^1.1.1" + mkdirp-classic: "npm:^0.5.2" + pump: "npm:^3.0.0" + tar-stream: "npm:^2.0.0" + checksum: 10c0/0128e888b61c7c4e8e7997d66ceccc3c79d73c01e87cfcc3d9f6b8555b0c88b8d67d91ff167f00b067f726dde497b2d1fb2bba0cfcb3ccb95ae413cb86c715bc + languageName: node + linkType: hard + +"tar-stream@npm:^2.0.0": + version: 2.2.0 + resolution: "tar-stream@npm:2.2.0" + dependencies: + bl: "npm:^4.0.3" + end-of-stream: "npm:^1.4.1" + fs-constants: "npm:^1.0.0" + inherits: "npm:^2.0.3" + readable-stream: "npm:^3.1.1" + checksum: 10c0/2f4c910b3ee7196502e1ff015a7ba321ec6ea837667220d7bcb8d0852d51cb04b87f7ae471008a6fb8f5b1a1b5078f62f3a82d30c706f20ada1238ac797e7692 + languageName: node + linkType: hard + "tar@npm:^6.1.11, tar@npm:^6.1.2, tar@npm:^6.2.1": version: 6.2.1 resolution: "tar@npm:6.2.1" @@ -6991,6 +7228,13 @@ __metadata: languageName: node linkType: hard +"tweetnacl@npm:^0.14.3": + version: 0.14.5 + resolution: "tweetnacl@npm:0.14.5" + checksum: 10c0/4612772653512c7bc19e61923fbf42903f5e0389ec76a4a1f17195859d114671ea4aa3b734c2029ce7e1fa7e5cc8b80580f67b071ecf0b46b5636d030a0102a2 + languageName: node + linkType: hard + "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0" @@ -7229,7 +7473,7 @@ __metadata: languageName: node linkType: hard -"util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": +"util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942