Skip to content

Commit a922baa

Browse files
committed
Adds downloader and extractor for qt
1 parent 6075372 commit a922baa

7 files changed

Lines changed: 83 additions & 74 deletions

File tree

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"author": "atulanand94@gmail.com",
1212
"license": "ISC",
1313
"devDependencies": {
14-
"@types/fs-extra": "^8.0.1",
14+
"@types/7zip-min": "^1.1.0",
1515
"@types/node-fetch": "^2.5.4",
1616
"@types/progress": "^2.0.3",
1717
"@typescript-eslint/eslint-plugin": "^2.19.0",
@@ -24,7 +24,7 @@
2424
},
2525
"dependencies": {
2626
"7zip-min": "^1.1.1",
27-
"fs-extra": "^8.1.0",
27+
"mkdirp": "^1.0.3",
2828
"node-fetch": "^2.6.0",
2929
"progress": "^2.0.3"
3030
}

src/downloader.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import fetch from 'node-fetch';
2+
import util from 'util';
3+
import fs from 'fs';
4+
import path from 'path';
5+
import stream from 'stream';
6+
import mkdirp from 'mkdirp';
7+
import Progress from 'progress';
8+
9+
const streamPipeline = util.promisify(stream.pipeline);
10+
11+
function progressBar(tokens: string, total: number): stream.PassThrough {
12+
const pt = new stream.PassThrough();
13+
const bar = new Progress(tokens, { total });
14+
pt.on('data', chunk => bar.tick(chunk.length));
15+
return pt;
16+
}
17+
18+
export async function download(link: string, outPath: string, options: DownloadOptions = {}): Promise<void> {
19+
const name = options.name || '';
20+
const response = await fetch(link);
21+
if (!response.ok) {
22+
throw new Error(`Error while downloading ${name}:${link}. ${response.statusText}`);
23+
}
24+
await mkdirp(path.dirname(outPath));
25+
const total = parseInt(`${response.headers.get('content-length')}`, 10);
26+
const totalInMb = (total / 1024 / 1024).toFixed(2);
27+
await streamPipeline(
28+
response.body,
29+
progressBar(`Downloading ${name} [:bar] :percent of ${totalInMb}MB :etas`, total),
30+
fs.createWriteStream(outPath),
31+
);
32+
}
33+
34+
type DownloadOptions = { name?: string };

src/extractor.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { unpack } from '7zip-min';
2+
import util from 'util';
3+
import fs from 'fs';
4+
5+
const unpack7z = util.promisify(unpack);
6+
const fsExist = util.promisify(fs.exists);
7+
8+
export async function extract(archivePath: string, outDir: string): Promise<void> {
9+
console.log(`Extracting ${archivePath} to ${outDir} ...`);
10+
if (!(await fsExist(archivePath))) {
11+
throw new Error(`Archive ${archivePath} doesnt exist!!`);
12+
}
13+
await unpack7z(archivePath, outDir);
14+
return;
15+
}

src/index.ts

Lines changed: 13 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,20 @@
1-
import fetch from 'node-fetch';
2-
import util from 'util';
3-
import fs from 'fs';
4-
import path from 'path';
5-
import stream from 'stream';
6-
import { mkdirp } from 'fs-extra';
7-
import Progress from 'progress';
1+
import { download } from './downloader';
2+
import { extract } from './extractor';
3+
import os from 'os';
4+
import metadata from './metadata.json';
85

9-
const streamPipeline = util.promisify(stream.pipeline);
10-
11-
function progressBar(tokens: string, total: number): stream.PassThrough {
12-
const pt = new stream.PassThrough();
13-
const bar = new Progress(tokens, { total });
14-
pt.on('pipe', () => {
15-
pt.on('data', chunk => bar.tick(chunk.length));
16-
});
17-
return pt;
18-
}
19-
20-
const macOsLink =
21-
'https://download.qt.io/online/qtsdkrepository/mac_x64/desktop/qt5_5130/qt.qt5.5130.clang_64/5.13.0-0-201906171525qtbase-MacOS-MacOS_10_13-Clang-MacOS-MacOS_10_13-X86_64.7z';
22-
23-
type DownloadOptions = {
24-
name?: string;
6+
type SupportedOs = 'linux' | 'win32' | 'darwin';
7+
const setupQt = async (): Promise<void> => {
8+
const currentOs = os.platform() as SupportedOs;
9+
const downloadLink = metadata[currentOs];
10+
const archivePath = './out/test/123/download.7zip';
11+
const extractDir = './out/test2/extracted';
12+
await download(downloadLink, archivePath, { name: 'Qt for Mac' });
13+
await extract(archivePath, extractDir);
2514
};
26-
async function downloadArchive(archiveLink: string, outPath: string, options: DownloadOptions = {}): Promise<void> {
27-
const name = options.name || '';
28-
const response = await fetch(archiveLink);
29-
if (!response.ok) {
30-
throw new Error(`Error while downloading ${name}:${archiveLink}. ${response.statusText}`);
31-
}
32-
await mkdirp(path.dirname(outPath));
33-
const total = parseInt(`${response.headers.get('content-length')}`, 10);
34-
const totalInMb = (total / 1024 / 1024).toFixed(2);
35-
await streamPipeline(
36-
response.body,
37-
progressBar(`Downloading ${name} [:bar] :percent of ${totalInMb}MB :etas`, total),
38-
fs.createWriteStream(outPath),
39-
);
40-
}
4115

4216
const main = async (): Promise<void> => {
43-
await downloadArchive(macOsLink, './out/download.7zip', { name: 'Qt for Mac' });
17+
await setupQt();
4418
};
4519

4620
main()

src/metadata.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"darwin": "https://download.qt.io/online/qtsdkrepository/mac_x64/desktop/qt5_5130/qt.qt5.5130.clang_64/5.13.0-0-201906171525qtbase-MacOS-MacOS_10_13-Clang-MacOS-MacOS_10_13-X86_64.7z",
3+
"win32": "https://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_5130/qt.qt5.5130.win64_msvc2017_64/5.13.0-0-201906171525qtbase-Windows-Windows_10-MSVC2017-Windows-Windows_10-X86_64.7z",
4+
"linux": "https://download.qt.io/online/qtsdkrepository/linux_x64/desktop/qt5_5130/qt.qt5.5130.gcc_64/5.13.0-0-201906171524qtbase-Linux-RHEL_7_6-GCC-Linux-RHEL_7_6-X86_64.7z"
5+
}

src/types.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
declare module 'mkdirp' {
2+
function mkdirp(path: string): Promise<void>;
3+
export = mkdirp;
4+
}

yarn.lock

Lines changed: 10 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,16 @@
3030
esutils "^2.0.2"
3131
js-tokens "^4.0.0"
3232

33+
"@types/7zip-min@^1.1.0":
34+
version "1.1.0"
35+
resolved "https://registry.yarnpkg.com/@types/7zip-min/-/7zip-min-1.1.0.tgz#9954faf91fd4169d0162e70f31006cc4185f2528"
36+
integrity sha512-Kx/KBRlEe1cC2nAHtU6NvdSoNN3N6bKY6V8D7YX8Wg0sS3ov/lDwBrNXMJJ0E3tVgroCEgumbajwR6W2sBTsNQ==
37+
3338
"@types/eslint-visitor-keys@^1.0.0":
3439
version "1.0.0"
3540
resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d"
3641
integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==
3742

38-
"@types/fs-extra@^8.0.1":
39-
version "8.0.1"
40-
resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-8.0.1.tgz#a2378d6e7e8afea1564e44aafa2e207dadf77686"
41-
integrity sha512-J00cVDALmi/hJOYsunyT52Hva5TnJeKP5yd1r+mH/ZU0mbYZflR0Z5kw5kITtKTRYMhm1JMClOFYdHnQszEvqw==
42-
dependencies:
43-
"@types/node" "*"
44-
4543
"@types/json-schema@^7.0.3":
4644
version "7.0.4"
4745
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339"
@@ -443,15 +441,6 @@ flatted@^2.0.0:
443441
resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08"
444442
integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==
445443

446-
fs-extra@^8.1.0:
447-
version "8.1.0"
448-
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
449-
integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
450-
dependencies:
451-
graceful-fs "^4.2.0"
452-
jsonfile "^4.0.0"
453-
universalify "^0.1.0"
454-
455444
fs.realpath@^1.0.0:
456445
version "1.0.0"
457446
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
@@ -493,11 +482,6 @@ globals@^12.1.0:
493482
dependencies:
494483
type-fest "^0.8.1"
495484

496-
graceful-fs@^4.1.6, graceful-fs@^4.2.0:
497-
version "4.2.3"
498-
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423"
499-
integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==
500-
501485
has-flag@^3.0.0:
502486
version "3.0.0"
503487
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
@@ -615,13 +599,6 @@ json-stable-stringify-without-jsonify@^1.0.1:
615599
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
616600
integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
617601

618-
jsonfile@^4.0.0:
619-
version "4.0.0"
620-
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
621-
integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
622-
optionalDependencies:
623-
graceful-fs "^4.1.6"
624-
625602
levn@^0.3.0, levn@~0.3.0:
626603
version "0.3.0"
627604
resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
@@ -659,6 +636,11 @@ mkdirp@^0.5.1:
659636
dependencies:
660637
minimist "0.0.8"
661638

639+
mkdirp@^1.0.3:
640+
version "1.0.3"
641+
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.3.tgz#4cf2e30ad45959dddea53ad97d518b6c8205e1ea"
642+
integrity sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==
643+
662644
ms@^2.1.1:
663645
version "2.1.2"
664646
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
@@ -949,11 +931,6 @@ typescript@^3.7.5:
949931
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.5.tgz#0692e21f65fd4108b9330238aac11dd2e177a1ae"
950932
integrity sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==
951933

952-
universalify@^0.1.0:
953-
version "0.1.2"
954-
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
955-
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
956-
957934
uri-js@^4.2.2:
958935
version "4.2.2"
959936
resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"

0 commit comments

Comments
 (0)