diff --git a/build/bundle-tools.ts b/build/bundle-tools.ts index d5a9d1849..9f6ed592a 100644 --- a/build/bundle-tools.ts +++ b/build/bundle-tools.ts @@ -6,73 +6,11 @@ /* eslint-disable no-restricted-syntax */ /* eslint-disable no-console */ +import * as fs from 'fs'; +import * as path from 'path'; import { exit } from 'process'; -import { Archive } from './archive'; -import { DownloadUtil } from './download'; - -import hasha = require('hasha'); -import mkdirp = require('mkdirp'); -import path = require('path'); -import fs = require('fs-extra'); -import configData = require('../src/tools.json'); - -export interface PlatformData { - url: string; - sha256sum: string; - dlFileName: string; - cmdFileName: string; - filePrefix: string; -} - -export async function isDownloadRequired(filePath: string, sha256: string): Promise { - let result = true; - if (fs.existsSync(filePath)) { - const fileSha256 = await hasha.fromFile(filePath, { algorithm: 'sha256' }); - result = fileSha256 !== sha256; - } - return result; -} - -async function extractTool(toolsFolder: string, platform: PlatformData, currentFile: string): Promise { - let toolLocation = toolsFolder; - if (process.env.REMOTE_CONTAINERS === undefined) { - toolLocation = path.join(toolsFolder, platform.cmdFileName); - } - console.log(`Extracting ${currentFile} to ${toolLocation}`); - if (!currentFile.endsWith('.exe') && currentFile.includes('.')) { - await Archive.extract(currentFile, toolsFolder, platform.cmdFileName, platform.filePrefix); - } else { - fs.copyFileSync(currentFile, toolLocation); - } -} - -export async function downloadFileAndCreateSha256( - toolsCacheFolder: string, - toolsFolder: string, - platform: PlatformData, -): Promise { - mkdirp.sync(toolsCacheFolder); - mkdirp.sync(toolsFolder); - const currentFile = path.join(toolsCacheFolder, platform.dlFileName); - if (await isDownloadRequired(currentFile, platform.sha256sum)) { - console.log(`Downloading ${platform.url} to ${currentFile}`); - await DownloadUtil.downloadFile(platform.url, currentFile, (current) => - console.log(`${current}%`), - ); - const currentSHA256 = await hasha.fromFile(currentFile, { algorithm: 'sha256' }); - if (currentSHA256 === platform.sha256sum) { - console.log(`Download of ${currentFile} has finished and SHA256 is correct`); - } else { - throw Error(`${currentFile} is downloaded and SHA256 is not correct`); - } - if (process.env.REMOTE_CONTAINERS === 'true') { - await extractTool(toolsFolder, platform, currentFile); - } - } else { - console.log('Previously downloaded archive SHA256 is correct'); - } - if (process.env.REMOTE_CONTAINERS === undefined) await extractTool(toolsFolder, platform, currentFile); -} +import { downloadFileAndCreateSha256 } from '../src/downloadUtil/downloadBinaries'; +import * as configData from '../src/tools.json'; async function bundleTools(): Promise { if (process.env.REMOTE_CONTAINERS === 'true') { diff --git a/build/verify-tools.ts b/build/verify-tools.ts index bf0934998..de86f5b4c 100644 --- a/build/verify-tools.ts +++ b/build/verify-tools.ts @@ -10,13 +10,13 @@ /* eslint-disable @typescript-eslint/no-misused-promises */ import { exit } from 'shelljs'; +import { DownloadUtil } from '../src/downloadUtil/download'; import hasha = require('hasha'); import mkdirp = require('mkdirp'); import fs = require('fs-extra'); import path = require('path'); import cp = require('child_process'); import os = require('os'); -import { DownloadUtil } from './download'; import configData = require('../src/tools.json'); /** diff --git a/package-lock.json b/package-lock.json index 5f69ef0f3..dfb22e564 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-openshift-connector", - "version": "1.4.0", + "version": "1.5.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode-openshift-connector", - "version": "1.4.0", + "version": "1.5.0", "license": "MIT", "dependencies": { "@kubernetes/client-node": "^0.16.1", @@ -20,6 +20,8 @@ "git-url-parse": "^13.1.0", "gitlab": "10.0.1", "globby": "^10.0.1", + "got": "^11.8.5", + "hasha": "^5.2.2", "i18next": "^21.8.11", "immutable": "^4.0.0", "install": "^0.13.0", @@ -34,8 +36,10 @@ "semver": "^7.3.5", "stacktrace-parser": "^0.1.10", "string-format": "^2.0.0", + "targz": "^1.0.1", "tmp": "^0.2.1", "tree-kill": "^1.2.2", + "unzip-stream": "^0.3.1", "validator": "^13.7.0", "vscode-kubernetes-tools-api": "^1.3.0", "vscode-welcome-view": "^0.0.4", @@ -66,7 +70,6 @@ "@types/mkdirp": "^1.0.2", "@types/mocha": "^9.0.0", "@types/node": "^16.11.12", - "@types/pify": "^5.0.1", "@types/proxyquire": "^1.3.28", "@types/react": "^17.0.37", "@types/react-copy-to-clipboard": "^5.0.4", @@ -78,8 +81,10 @@ "@types/sinon": "^10.0.6", "@types/sinon-chai": "^3.2.6", "@types/string-format": "^2.0.0", + "@types/tar-fs": "^2.0.1", "@types/targz": "^1.0.1", "@types/tmp": "0.2.2", + "@types/unzip-stream": "^0.3.1", "@types/validator": "^13.7.0", "@types/vscode": "1.64.0", "@typescript-eslint/eslint-plugin": "^5.6.0", @@ -106,9 +111,7 @@ "express": "^4.17.2", "file-loader": "^6.2.0", "glob": "^7.2.0", - "got": "^11.8.5", "handlebars": "^4.7.7", - "hasha": "5.2.2", "istanbul": "^0.4.5", "leasot": "^12.0.0", "mocha": "^9.1.3", @@ -116,7 +119,6 @@ "node-sass": "^8.0.0", "npm-check-updates": "^16.6.3", "npm-run-all": "^4.1.5", - "pify": "^5.0.0", "prettier": "^2.5.1", "pretty-bytes": "^5.6.0", "proxyquire": "^2.1.3", @@ -140,11 +142,9 @@ "source-map-support": "^0.5.21", "style-loader": "^3.3.1", "survey-react-ui": "^1.9.89", - "targz": "^1.0.1", "ts-loader": "^9.2.6", "tslint": "^5.20.1", "typescript": "^4.5.2", - "unzip-stream": "^0.3.1", "utf-8-validate": "^5.0.7", "vscode-extension-tester": "^5.2.0" }, @@ -6267,12 +6267,6 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, - "node_modules/@types/pify": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/pify/-/pify-5.0.1.tgz", - "integrity": "sha512-UYcJBAqWLyg+eITXGIu9DR7RXJFvSupz+Hf+RqJYHzDJedvDMTsB1JmDV6Qfna2g62VIxUKvoWqTxGHy6U/bLA==", - "dev": true - }, "node_modules/@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", @@ -6559,6 +6553,15 @@ "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", "dev": true }, + "node_modules/@types/unzip-stream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@types/unzip-stream/-/unzip-stream-0.3.1.tgz", + "integrity": "sha512-RlE3qaqvu4XaMwxkG/zR1gIunCbqXvNrmZ4BCG7OiQ8QUactFUPxm0TTrOCRJZQfPW3T6XBH7PcHQiiqkdcijw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/validator": { "version": "13.7.14", "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.14.tgz", @@ -8052,7 +8055,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", - "dev": true, "dependencies": { "buffers": "~0.1.1", "chainsaw": "~0.1.0" @@ -8079,7 +8081,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "dev": true, "dependencies": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" @@ -8347,7 +8348,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, "dependencies": { "buffer-alloc-unsafe": "^1.1.0", "buffer-fill": "^1.0.0" @@ -8356,8 +8356,7 @@ "node_modules/buffer-alloc-unsafe": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" }, "node_modules/buffer-crc32": { "version": "0.2.13", @@ -8371,8 +8370,7 @@ "node_modules/buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", - "dev": true + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" }, "node_modules/buffer-from": { "version": "1.1.2", @@ -8384,7 +8382,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", - "dev": true, "engines": { "node": ">=0.2.0" } @@ -8654,7 +8651,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", - "dev": true, "dependencies": { "traverse": ">=0.3.0 <0.4" }, @@ -9522,8 +9518,7 @@ "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cosmiconfig": { "version": "7.1.0", @@ -11427,8 +11422,7 @@ "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "node_modules/fs-extra": { "version": "10.1.0", @@ -12090,7 +12084,6 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, "dependencies": { "is-stream": "^2.0.0", "type-fest": "^0.8.0" @@ -13062,8 +13055,7 @@ "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/isexe": { "version": "2.0.0", @@ -14558,7 +14550,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -17329,18 +17320,6 @@ "node": ">=0.10" } }, - "node_modules/pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -17729,8 +17708,7 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/progress": { "version": "2.0.3", @@ -17850,7 +17828,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", - "dev": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -18622,7 +18599,6 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -18636,8 +18612,7 @@ "node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/readdirp": { "version": "3.6.0", @@ -20171,7 +20146,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -20179,8 +20153,7 @@ "node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/string-format": { "version": "2.0.0", @@ -20421,7 +20394,6 @@ "version": "1.16.3", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", - "dev": true, "dependencies": { "chownr": "^1.0.1", "mkdirp": "^0.5.1", @@ -20432,14 +20404,12 @@ "node_modules/tar-fs/node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "node_modules/tar-fs/node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, "dependencies": { "minimist": "^1.2.6" }, @@ -20451,7 +20421,6 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dev": true, "dependencies": { "bl": "^1.0.0", "buffer-alloc": "^1.2.0", @@ -20474,7 +20443,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/targz/-/targz-1.0.1.tgz", "integrity": "sha512-6q4tP9U55mZnRuMTBqnqc3nwYQY3kv+QthCFZuMk+Tn1qYUnMPmL/JZ/mzgXINzFpSqfU+242IFmFU9VPvqaQw==", - "dev": true, "dependencies": { "tar-fs": "^1.8.1" } @@ -20631,8 +20599,7 @@ "node_modules/to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" }, "node_modules/to-fast-properties": { "version": "2.0.0", @@ -20690,7 +20657,6 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", - "dev": true, "engines": { "node": "*" } @@ -21245,7 +21211,6 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, "engines": { "node": ">=8" } @@ -21456,7 +21421,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/unzip-stream/-/unzip-stream-0.3.1.tgz", "integrity": "sha512-RzaGXLNt+CW+T41h1zl6pGz3EaeVhYlK+rdAap+7DxW5kqsqePO8kRtWPaCiVqdhZc86EctSPVYNix30YOMzmw==", - "dev": true, "dependencies": { "binary": "^0.3.0", "mkdirp": "^0.5.1" @@ -21466,7 +21430,6 @@ "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, "dependencies": { "minimist": "^1.2.6" }, @@ -21594,8 +21557,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/util/node_modules/inherits": { "version": "2.0.3", @@ -22392,7 +22354,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, "engines": { "node": ">=0.4" } @@ -25849,12 +25810,6 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, - "@types/pify": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/pify/-/pify-5.0.1.tgz", - "integrity": "sha512-UYcJBAqWLyg+eITXGIu9DR7RXJFvSupz+Hf+RqJYHzDJedvDMTsB1JmDV6Qfna2g62VIxUKvoWqTxGHy6U/bLA==", - "dev": true - }, "@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", @@ -26140,6 +26095,15 @@ "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", "dev": true }, + "@types/unzip-stream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@types/unzip-stream/-/unzip-stream-0.3.1.tgz", + "integrity": "sha512-RlE3qaqvu4XaMwxkG/zR1gIunCbqXvNrmZ4BCG7OiQ8QUactFUPxm0TTrOCRJZQfPW3T6XBH7PcHQiiqkdcijw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/validator": { "version": "13.7.14", "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.14.tgz", @@ -27319,7 +27283,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", - "dev": true, "requires": { "buffers": "~0.1.1", "chainsaw": "~0.1.0" @@ -27340,7 +27303,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "dev": true, "requires": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" @@ -27521,7 +27483,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, "requires": { "buffer-alloc-unsafe": "^1.1.0", "buffer-fill": "^1.0.0" @@ -27530,8 +27491,7 @@ "buffer-alloc-unsafe": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" }, "buffer-crc32": { "version": "0.2.13", @@ -27542,8 +27502,7 @@ "buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", - "dev": true + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" }, "buffer-from": { "version": "1.1.2", @@ -27554,8 +27513,7 @@ "buffers": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", - "dev": true + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==" }, "bufferutil": { "version": "4.0.7", @@ -27756,7 +27714,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", - "dev": true, "requires": { "traverse": ">=0.3.0 <0.4" } @@ -28413,8 +28370,7 @@ "core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "cosmiconfig": { "version": "7.1.0", @@ -29855,8 +29811,7 @@ "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "fs-extra": { "version": "10.1.0", @@ -30350,7 +30305,6 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, "requires": { "is-stream": "^2.0.0", "type-fest": "^0.8.0" @@ -31027,8 +30981,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "isexe": { "version": "2.0.0", @@ -32207,8 +32160,7 @@ "minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, "minimist-options": { "version": "4.1.0", @@ -34307,12 +34259,6 @@ "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", "dev": true }, - "pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true - }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -34599,8 +34545,7 @@ "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "progress": { "version": "2.0.3", @@ -34706,7 +34651,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -35296,7 +35240,6 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -35310,8 +35253,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" } } }, @@ -36458,7 +36400,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" }, @@ -36466,8 +36407,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" } } }, @@ -36651,7 +36591,6 @@ "version": "1.16.3", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", - "dev": true, "requires": { "chownr": "^1.0.1", "mkdirp": "^0.5.1", @@ -36662,14 +36601,12 @@ "chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, "requires": { "minimist": "^1.2.6" } @@ -36680,7 +36617,6 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dev": true, "requires": { "bl": "^1.0.0", "buffer-alloc": "^1.2.0", @@ -36695,7 +36631,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/targz/-/targz-1.0.1.tgz", "integrity": "sha512-6q4tP9U55mZnRuMTBqnqc3nwYQY3kv+QthCFZuMk+Tn1qYUnMPmL/JZ/mzgXINzFpSqfU+242IFmFU9VPvqaQw==", - "dev": true, "requires": { "tar-fs": "^1.8.1" } @@ -36816,8 +36751,7 @@ "to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" }, "to-fast-properties": { "version": "2.0.0", @@ -36862,8 +36796,7 @@ "traverse": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", - "dev": true + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==" }, "tree-kill": { "version": "1.2.2", @@ -37286,8 +37219,7 @@ "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" }, "type-is": { "version": "1.6.18", @@ -37457,7 +37389,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/unzip-stream/-/unzip-stream-0.3.1.tgz", "integrity": "sha512-RzaGXLNt+CW+T41h1zl6pGz3EaeVhYlK+rdAap+7DxW5kqsqePO8kRtWPaCiVqdhZc86EctSPVYNix30YOMzmw==", - "dev": true, "requires": { "binary": "^0.3.0", "mkdirp": "^0.5.1" @@ -37467,7 +37398,6 @@ "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, "requires": { "minimist": "^1.2.6" } @@ -37571,8 +37501,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "utils-merge": { "version": "1.0.1", @@ -38183,8 +38112,7 @@ "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { "version": "5.0.8", diff --git a/package.json b/package.json index ed4f4f246..02d7d8df3 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,11 @@ "vscode-kubernetes-tools-api": "^1.3.0", "vscode-welcome-view": "^0.0.4", "wait-port": "^0.2.9", - "yaml": "^2.2.2" + "yaml": "^2.2.2", + "targz": "^1.0.1", + "hasha": "^5.2.2", + "unzip-stream": "^0.3.1", + "got": "^11.8.5" }, "devDependencies": { "@devfile/api": "^2.2.0-alpha-1666195451", @@ -128,7 +132,6 @@ "@types/mkdirp": "^1.0.2", "@types/mocha": "^9.0.0", "@types/node": "^16.11.12", - "@types/pify": "^5.0.1", "@types/proxyquire": "^1.3.28", "@types/react": "^17.0.37", "@types/react-copy-to-clipboard": "^5.0.4", @@ -140,8 +143,10 @@ "@types/sinon": "^10.0.6", "@types/sinon-chai": "^3.2.6", "@types/string-format": "^2.0.0", + "@types/tar-fs": "^2.0.1", "@types/targz": "^1.0.1", "@types/tmp": "0.2.2", + "@types/unzip-stream": "^0.3.1", "@types/validator": "^13.7.0", "@types/vscode": "1.64.0", "@typescript-eslint/eslint-plugin": "^5.6.0", @@ -168,9 +173,7 @@ "express": "^4.17.2", "file-loader": "^6.2.0", "glob": "^7.2.0", - "got": "^11.8.5", "handlebars": "^4.7.7", - "hasha": "5.2.2", "istanbul": "^0.4.5", "leasot": "^12.0.0", "mocha": "^9.1.3", @@ -178,7 +181,6 @@ "node-sass": "^8.0.0", "npm-check-updates": "^16.6.3", "npm-run-all": "^4.1.5", - "pify": "^5.0.0", "prettier": "^2.5.1", "pretty-bytes": "^5.6.0", "proxyquire": "^2.1.3", @@ -202,11 +204,9 @@ "source-map-support": "^0.5.21", "style-loader": "^3.3.1", "survey-react-ui": "^1.9.89", - "targz": "^1.0.1", "ts-loader": "^9.2.6", "tslint": "^5.20.1", "typescript": "^4.5.2", - "unzip-stream": "^0.3.1", "utf-8-validate": "^5.0.7", "vscode-extension-tester": "^5.2.0" }, diff --git a/build/archive.ts b/src/downloadUtil/archive.ts similarity index 91% rename from build/archive.ts rename to src/downloadUtil/archive.ts index ecd040660..2de62bfbe 100644 --- a/build/archive.ts +++ b/src/downloadUtil/archive.ts @@ -4,13 +4,13 @@ *-----------------------------------------------------------------------------------------------*/ import * as fs from 'fs'; +import * as path from 'path'; +import type { Headers } from 'tar-fs'; +import * as targz from 'targz'; +import * as unzipm from 'unzip-stream'; +import { promisify } from 'util'; import * as zlib from 'zlib'; -import targz = require('targz'); -import unzipm = require('unzip-stream'); -import pify = require('pify'); -import path = require('path'); - export class Archive { static extract( zipFile: string, @@ -54,11 +54,11 @@ export class Archive { fileName: string, prefix: string, ): Promise { - return pify(targz.decompress)({ + return promisify(targz.decompress)({ src: zipFile, dest: extractTo, tar: { - map: (header: { name: string }): { name: string } => { + map: (header: Headers): Headers => { const result = header; if (prefix && header.name.startsWith(prefix)) { result.name = header.name.substring(prefix.length); diff --git a/build/download.ts b/src/downloadUtil/download.ts similarity index 72% rename from build/download.ts rename to src/downloadUtil/download.ts index 1b1028739..86f80abf2 100644 --- a/build/download.ts +++ b/src/downloadUtil/download.ts @@ -3,16 +3,15 @@ * Licensed under the MIT License. See LICENSE file in the project root for license information. *-----------------------------------------------------------------------------------------------*/ -/* eslint-disable @typescript-eslint/no-var-requires */ -/* eslint-disable no-unused-expressions */ import * as fs from 'fs-extra'; +import type { Got } from 'got/dist/source'; +import { fromEvent } from 'rxjs'; +import { throttleTime } from 'rxjs/operators'; +import { promisify } from 'util'; -const { promisify } = require('util'); -const { fromEvent } = require('rxjs'); -const { throttleTime } = require('rxjs/operators'); -const pipeline = promisify(require('stream').pipeline); -// eslint-disable-next-line import/no-extraneous-dependencies -const got = require('got'); +// need to use `require`, since we replace these imports in the unit tests +import got = require('got'); +import stream = require('stream'); export class DownloadUtil { static async downloadFile( @@ -21,7 +20,7 @@ export class DownloadUtil { progressCb?: (current: number, increment: number) => void, throttle = 250, ): Promise { - const dls = got.stream(fromUrl); + const dls = (got as unknown as Got).stream(fromUrl); if (progressCb) { let previous = 0; // Process progress event from 'got' @@ -38,6 +37,6 @@ export class DownloadUtil { }); } // Pipe url to file - await pipeline(dls, fs.createWriteStream(toFile)); + await promisify(stream.pipeline)(dls, fs.createWriteStream(toFile)); } } diff --git a/src/downloadUtil/downloadBinaries.ts b/src/downloadUtil/downloadBinaries.ts new file mode 100644 index 000000000..3a275acd2 --- /dev/null +++ b/src/downloadUtil/downloadBinaries.ts @@ -0,0 +1,71 @@ +/*----------------------------------------------------------------------------------------------- + * Copyright (c) Red Hat, Inc. All rights reserved. + * Licensed under the MIT License. See LICENSE file in the project root for license information. + *-----------------------------------------------------------------------------------------------*/ + +/* eslint-disable no-console */ + +import * as fs from 'fs-extra'; +import * as mkdirp from 'mkdirp'; +import * as path from 'path'; +import { Archive } from './archive'; +import { DownloadUtil } from './download'; +import hasha = require('hasha'); + +export interface PlatformData { + url: string; + sha256sum: string; + dlFileName: string; + cmdFileName: string; + filePrefix: string; +} + +export async function isDownloadRequired(filePath: string, sha256: string): Promise { + let result = true; + if (fs.existsSync(filePath)) { + const fileSha256 = await hasha.fromFile(filePath, { algorithm: 'sha256' }); + result = fileSha256 !== sha256; + } + return result; +} + +async function extractTool(toolsFolder: string, platform: PlatformData, currentFile: string): Promise { + let toolLocation = toolsFolder; + if (process.env.REMOTE_CONTAINERS === undefined) { + toolLocation = path.join(toolsFolder, platform.cmdFileName); + } + console.log(`Extracting ${currentFile} to ${toolLocation}`); + if (!currentFile.endsWith('.exe') && currentFile.includes('.')) { + await Archive.extract(currentFile, toolsFolder, platform.cmdFileName, platform.filePrefix); + } else { + fs.copyFileSync(currentFile, toolLocation); + } +} + +export async function downloadFileAndCreateSha256( + toolsCacheFolder: string, + toolsFolder: string, + platform: PlatformData, +): Promise { + mkdirp.sync(toolsCacheFolder); + mkdirp.sync(toolsFolder); + const currentFile = path.join(toolsCacheFolder, platform.dlFileName); + if (await isDownloadRequired(currentFile, platform.sha256sum)) { + console.log(`Downloading ${platform.url} to ${currentFile}`); + await DownloadUtil.downloadFile(platform.url, currentFile, (current) => + console.log(`${current}%`), + ); + const currentSHA256 = await hasha.fromFile(currentFile, { algorithm: 'sha256' }); + if (currentSHA256 === platform.sha256sum) { + console.log(`Download of ${currentFile} has finished and SHA256 is correct`); + } else { + throw Error(`${currentFile} is downloaded and SHA256 is not correct`); + } + if (process.env.REMOTE_CONTAINERS === 'true') { + await extractTool(toolsFolder, platform, currentFile); + } + } else { + console.log('Previously downloaded archive SHA256 is correct'); + } + if (process.env.REMOTE_CONTAINERS === undefined) await extractTool(toolsFolder, platform, currentFile); +} diff --git a/src/installToolsInRemote.ts b/src/installToolsInRemote.ts index d3d11cd7e..85b5d5671 100644 --- a/src/installToolsInRemote.ts +++ b/src/installToolsInRemote.ts @@ -7,7 +7,7 @@ import * as os from 'os'; import * as path from 'path'; import * as shell from 'shelljs'; -import { downloadFileAndCreateSha256 } from '../build/bundle-tools'; +import { downloadFileAndCreateSha256 } from './downloadUtil/downloadBinaries'; import configData = require('./tools.json'); import fs = require('fs-extra'); diff --git a/test/integration/index.ts b/test/integration/index.ts index 84abf8b8a..f4edcaf57 100644 --- a/test/integration/index.ts +++ b/test/integration/index.ts @@ -4,7 +4,7 @@ *-----------------------------------------------------------------------------------------------*/ /* tslint:disable no-require-imports */ import * as fs from 'fs'; -import * as glob from 'glob'; +import { glob } from 'glob'; import * as paths from 'path'; import { CoverageRunner, TestRunnerOptions } from '../coverage'; diff --git a/test/unit/index.ts b/test/unit/index.ts index a42b6074d..8e38fe563 100644 --- a/test/unit/index.ts +++ b/test/unit/index.ts @@ -4,7 +4,7 @@ *-----------------------------------------------------------------------------------------------*/ /* tslint:disable no-require-imports */ import * as fs from 'fs'; -import * as glob from 'glob'; +import { glob } from 'glob'; import * as paths from 'path'; import { CoverageRunner, TestRunnerOptions } from '../coverage'; diff --git a/test/unit/util/archive.test.ts b/test/unit/util/archive.test.ts index 9a1d5c50b..2b6b102f3 100644 --- a/test/unit/util/archive.test.ts +++ b/test/unit/util/archive.test.ts @@ -4,9 +4,9 @@ *-----------------------------------------------------------------------------------------------*/ import * as chai from 'chai'; -import * as sinonChai from 'sinon-chai'; import * as sinon from 'sinon'; -import { Archive } from '../../../build/archive'; +import * as sinonChai from 'sinon-chai'; +import { Archive } from '../../../src/downloadUtil/archive'; import targz = require('targz'); import fs = require('fs-extra'); diff --git a/test/unit/util/download.test.ts b/test/unit/util/download.test.ts index 6764ce6b9..51dfc3f30 100644 --- a/test/unit/util/download.test.ts +++ b/test/unit/util/download.test.ts @@ -4,10 +4,11 @@ *-----------------------------------------------------------------------------------------------*/ import * as chai from 'chai'; -import * as sinonChai from 'sinon-chai'; -import * as sinon from 'sinon'; -import * as path from 'path'; import { EventEmitter } from 'events'; +import * as path from 'path'; +import * as sinon from 'sinon'; +import * as sinonChai from 'sinon-chai'; +import type { DownloadUtil as DownloadUtilType } from '../../../src/downloadUtil/download'; import { wait } from '../../../src/util/async'; import pq = require('proxyquire'); @@ -17,7 +18,7 @@ const {expect} = chai; chai.use(sinonChai); suite('Download Util', () => { - let progressMock; + let progressMock: typeof DownloadUtilType; const sandbox: sinon.SinonSandbox = sinon.createSandbox(); let requestEmitter: any; let streamEmitter: EventEmitter; @@ -26,7 +27,7 @@ suite('Download Util', () => { requestEmitter = new EventEmitter(); streamEmitter = new EventEmitter(); requestEmitter.pipe = (): any => streamEmitter; - progressMock = pq('../../../build/download', { + progressMock = pq('../../../src/downloadUtil/download', { got: { stream: (): any => requestEmitter }, @@ -41,7 +42,7 @@ suite('Download Util', () => { cb(null); } } - }).DownloadUtil; + }).DownloadUtil as typeof DownloadUtilType; }); teardown(() => { diff --git a/test/vsix-test/index.ts b/test/vsix-test/index.ts index a78eb8cf7..f8e25f6fc 100644 --- a/test/vsix-test/index.ts +++ b/test/vsix-test/index.ts @@ -4,7 +4,7 @@ *-----------------------------------------------------------------------------------------------*/ /* tslint:disable no-require-imports */ -import * as glob from 'glob'; +import { glob } from 'glob'; import * as paths from 'path'; import Mocha = require('mocha');