tor-dl 1.0.14 → 1.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/display.d.ts.map +1 -1
- package/dist/cli/display.js +68 -2
- package/dist/cli/display.js.map +1 -1
- package/dist/sources/yts.js +1 -1
- package/dist/sources/yts.js.map +1 -1
- package/package.json +34 -34
- package/src/cli/display.ts +59 -2
- package/src/sources/yts.ts +85 -85
- package/dist/cli/progress.d.ts +0 -15
- package/dist/cli/progress.d.ts.map +0 -1
- package/dist/cli/progress.js +0 -76
- package/dist/cli/progress.js.map +0 -1
- package/dist/src/cli/display.d.ts +0 -7
- package/dist/src/cli/display.d.ts.map +0 -1
- package/dist/src/cli/display.js +0 -59
- package/dist/src/cli/display.js.map +0 -1
- package/dist/src/cli/parser.d.ts +0 -5
- package/dist/src/cli/parser.d.ts.map +0 -1
- package/dist/src/cli/parser.js +0 -122
- package/dist/src/cli/parser.js.map +0 -1
- package/dist/src/cli/progress.d.ts +0 -15
- package/dist/src/cli/progress.d.ts.map +0 -1
- package/dist/src/cli/progress.js +0 -76
- package/dist/src/cli/progress.js.map +0 -1
- package/dist/src/commands/download.d.ts +0 -2
- package/dist/src/commands/download.d.ts.map +0 -1
- package/dist/src/commands/download.js +0 -70
- package/dist/src/commands/download.js.map +0 -1
- package/dist/src/commands/search.d.ts +0 -3
- package/dist/src/commands/search.d.ts.map +0 -1
- package/dist/src/commands/search.js +0 -46
- package/dist/src/commands/search.js.map +0 -1
- package/dist/src/commands/update.d.ts +0 -2
- package/dist/src/commands/update.d.ts.map +0 -1
- package/dist/src/commands/update.js +0 -32
- package/dist/src/commands/update.js.map +0 -1
- package/dist/src/download/engine.d.ts +0 -6
- package/dist/src/download/engine.d.ts.map +0 -1
- package/dist/src/download/engine.js +0 -163
- package/dist/src/download/engine.js.map +0 -1
- package/dist/src/filters/category.d.ts +0 -3
- package/dist/src/filters/category.d.ts.map +0 -1
- package/dist/src/filters/category.js +0 -24
- package/dist/src/filters/category.js.map +0 -1
- package/dist/src/filters/index.d.ts +0 -5
- package/dist/src/filters/index.d.ts.map +0 -1
- package/dist/src/filters/index.js +0 -13
- package/dist/src/filters/index.js.map +0 -1
- package/dist/src/filters/seeds.d.ts +0 -3
- package/dist/src/filters/seeds.d.ts.map +0 -1
- package/dist/src/filters/seeds.js +0 -7
- package/dist/src/filters/seeds.js.map +0 -1
- package/dist/src/filters/size.d.ts +0 -4
- package/dist/src/filters/size.d.ts.map +0 -1
- package/dist/src/filters/size.js +0 -36
- package/dist/src/filters/size.js.map +0 -1
- package/dist/src/filters/sort.d.ts +0 -5
- package/dist/src/filters/sort.d.ts.map +0 -1
- package/dist/src/filters/sort.js +0 -25
- package/dist/src/filters/sort.js.map +0 -1
- package/dist/src/index.d.ts +0 -11
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -30
- package/dist/src/index.js.map +0 -1
- package/dist/src/sources/1337x.d.ts +0 -11
- package/dist/src/sources/1337x.d.ts.map +0 -1
- package/dist/src/sources/1337x.js +0 -121
- package/dist/src/sources/1337x.js.map +0 -1
- package/dist/src/sources/eztv.d.ts +0 -11
- package/dist/src/sources/eztv.d.ts.map +0 -1
- package/dist/src/sources/eztv.js +0 -104
- package/dist/src/sources/eztv.js.map +0 -1
- package/dist/src/sources/httpClient.d.ts +0 -24
- package/dist/src/sources/httpClient.d.ts.map +0 -1
- package/dist/src/sources/httpClient.js +0 -42
- package/dist/src/sources/httpClient.js.map +0 -1
- package/dist/src/sources/limetorrent.d.ts +0 -11
- package/dist/src/sources/limetorrent.d.ts.map +0 -1
- package/dist/src/sources/limetorrent.js +0 -113
- package/dist/src/sources/limetorrent.js.map +0 -1
- package/dist/src/sources/nyaa.d.ts +0 -11
- package/dist/src/sources/nyaa.d.ts.map +0 -1
- package/dist/src/sources/nyaa.js +0 -119
- package/dist/src/sources/nyaa.js.map +0 -1
- package/dist/src/sources/rarbg.d.ts +0 -11
- package/dist/src/sources/rarbg.d.ts.map +0 -1
- package/dist/src/sources/rarbg.js +0 -122
- package/dist/src/sources/rarbg.js.map +0 -1
- package/dist/src/sources/registry.d.ts +0 -9
- package/dist/src/sources/registry.d.ts.map +0 -1
- package/dist/src/sources/registry.js +0 -70
- package/dist/src/sources/registry.js.map +0 -1
- package/dist/src/sources/solidtorrents.d.ts +0 -11
- package/dist/src/sources/solidtorrents.d.ts.map +0 -1
- package/dist/src/sources/solidtorrents.js +0 -105
- package/dist/src/sources/solidtorrents.js.map +0 -1
- package/dist/src/sources/thepiratebay.d.ts +0 -11
- package/dist/src/sources/thepiratebay.d.ts.map +0 -1
- package/dist/src/sources/thepiratebay.js +0 -67
- package/dist/src/sources/thepiratebay.js.map +0 -1
- package/dist/src/sources/torlock.d.ts +0 -11
- package/dist/src/sources/torlock.d.ts.map +0 -1
- package/dist/src/sources/torlock.js +0 -116
- package/dist/src/sources/torlock.js.map +0 -1
- package/dist/src/sources/torrentproject.d.ts +0 -11
- package/dist/src/sources/torrentproject.d.ts.map +0 -1
- package/dist/src/sources/torrentproject.js +0 -105
- package/dist/src/sources/torrentproject.js.map +0 -1
- package/dist/src/sources/torrentscsv.d.ts +0 -11
- package/dist/src/sources/torrentscsv.d.ts.map +0 -1
- package/dist/src/sources/torrentscsv.js +0 -62
- package/dist/src/sources/torrentscsv.js.map +0 -1
- package/dist/src/sources/yts.d.ts +0 -12
- package/dist/src/sources/yts.d.ts.map +0 -1
- package/dist/src/sources/yts.js +0 -88
- package/dist/src/sources/yts.js.map +0 -1
- package/dist/src/types.d.ts +0 -60
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/types.js +0 -3
- package/dist/src/types.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/cli/display.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/cli/display.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAiEzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,IAAI,CAmC7D;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAYhE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjD"}
|
package/dist/cli/display.js
CHANGED
|
@@ -10,6 +10,72 @@ exports.displaySuccess = displaySuccess;
|
|
|
10
10
|
exports.displayInfo = displayInfo;
|
|
11
11
|
const chalk_1 = __importDefault(require("chalk"));
|
|
12
12
|
chalk_1.default.level = 1;
|
|
13
|
+
function isWideChar(code) {
|
|
14
|
+
if (code > 0xFFFF)
|
|
15
|
+
return true;
|
|
16
|
+
if (code > 255)
|
|
17
|
+
return true;
|
|
18
|
+
if (code >= 0x1100 && code <= 0x115F)
|
|
19
|
+
return true;
|
|
20
|
+
if (code >= 0x2329 && code <= 0x232A)
|
|
21
|
+
return true;
|
|
22
|
+
if (code >= 0x2E80 && code <= 0x303E)
|
|
23
|
+
return true;
|
|
24
|
+
if (code >= 0x3040 && code <= 0xA4CF)
|
|
25
|
+
return true;
|
|
26
|
+
if (code >= 0xAC00 && code <= 0xD7A3)
|
|
27
|
+
return true;
|
|
28
|
+
if (code >= 0xF900 && code <= 0xFAFF)
|
|
29
|
+
return true;
|
|
30
|
+
if (code >= 0xFE10 && code <= 0xFE19)
|
|
31
|
+
return true;
|
|
32
|
+
if (code >= 0xFE30 && code <= 0xFE6F)
|
|
33
|
+
return true;
|
|
34
|
+
if (code >= 0xFF00 && code <= 0xFF60)
|
|
35
|
+
return true;
|
|
36
|
+
if (code >= 0xFFE0 && code <= 0xFFE6)
|
|
37
|
+
return true;
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
function displayWidth(str) {
|
|
41
|
+
let width = 0;
|
|
42
|
+
for (const char of str) {
|
|
43
|
+
const cp = char.codePointAt(0);
|
|
44
|
+
width += isWideChar(cp) ? 2 : 1;
|
|
45
|
+
}
|
|
46
|
+
return width;
|
|
47
|
+
}
|
|
48
|
+
function truncateWide(str, maxWidth) {
|
|
49
|
+
let width = 0;
|
|
50
|
+
let result = '';
|
|
51
|
+
for (const char of str) {
|
|
52
|
+
const cp = char.codePointAt(0);
|
|
53
|
+
const charWidth = isWideChar(cp) ? 2 : 1;
|
|
54
|
+
if (width + charWidth > maxWidth - 3)
|
|
55
|
+
break;
|
|
56
|
+
result += char;
|
|
57
|
+
width += charWidth;
|
|
58
|
+
}
|
|
59
|
+
return result + '...';
|
|
60
|
+
}
|
|
61
|
+
function padEndWide(str, targetWidth) {
|
|
62
|
+
const currentWidth = displayWidth(str);
|
|
63
|
+
const padding = targetWidth - currentWidth;
|
|
64
|
+
if (padding <= 0)
|
|
65
|
+
return str;
|
|
66
|
+
return str + ' '.repeat(padding);
|
|
67
|
+
}
|
|
68
|
+
function padEndWideExtra(str, targetWidth) {
|
|
69
|
+
const currentWidth = displayWidth(str);
|
|
70
|
+
const padding = targetWidth - currentWidth;
|
|
71
|
+
if (padding < 0) {
|
|
72
|
+
if ([...str].some(c => c.codePointAt(0) > 255)) {
|
|
73
|
+
return str + ' ';
|
|
74
|
+
}
|
|
75
|
+
return str;
|
|
76
|
+
}
|
|
77
|
+
return str + ' '.repeat(padding);
|
|
78
|
+
}
|
|
13
79
|
function makeClickable(url, text) {
|
|
14
80
|
return `\u001b]8;;${url}\u0007${text}\u001b]8;;\u0007`;
|
|
15
81
|
}
|
|
@@ -25,7 +91,7 @@ function displayResults(results) {
|
|
|
25
91
|
'├─────┼───┼──────────────────────────────────────────────────────────────────────────────────┼────────┼───────┼───────┼────────┤'
|
|
26
92
|
].join('\n'));
|
|
27
93
|
for (const r of results) {
|
|
28
|
-
const name = r.name
|
|
94
|
+
const name = displayWidth(r.name) > 80 ? truncateWide(r.name, 80) : r.name;
|
|
29
95
|
const size = r.size ? r.size.slice(0, 6).padEnd(6) : 'N/A ';
|
|
30
96
|
const seeds = r.seeds > 100 ? chalk_1.default.green(r.seeds.toString().padStart(5)) : r.seeds > 50 ? chalk_1.default.yellow(r.seeds.toString().padStart(5)) : r.seeds.toString().padStart(5);
|
|
31
97
|
const peers = r.peers > 50 ? chalk_1.default.cyan(r.peers.toString().padStart(5)) : r.peers.toString().padStart(5);
|
|
@@ -33,7 +99,7 @@ function displayResults(results) {
|
|
|
33
99
|
const num = chalk_1.default.cyan(r.num.toString().padStart(3));
|
|
34
100
|
const url = r.torrentUrl || r.magnet || '';
|
|
35
101
|
const pageUrl = r.url || '';
|
|
36
|
-
const clickableName = url ? makeClickable(url, name
|
|
102
|
+
const clickableName = url ? makeClickable(url, padEndWideExtra(name, 80)) : padEndWideExtra(name, 80);
|
|
37
103
|
const clickableLink = pageUrl ? makeClickable(pageUrl, chalk_1.default.green('✓')) : chalk_1.default.gray(' ');
|
|
38
104
|
out(`│ ${num} │ ${clickableLink} │ ${clickableName} │ ${size} │ ${seeds} │ ${peers} │ ${source} │`);
|
|
39
105
|
}
|
package/dist/cli/display.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/cli/display.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/cli/display.ts"],"names":[],"mappings":"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"}
|
package/dist/sources/yts.js
CHANGED
|
@@ -34,7 +34,7 @@ class YtsScraper {
|
|
|
34
34
|
seeds: movie.torrents?.[0]?.seeds || 0,
|
|
35
35
|
peers: movie.torrents?.[0]?.peers || 0,
|
|
36
36
|
source: 'YTS',
|
|
37
|
-
url: movie.
|
|
37
|
+
url: movie.url || '',
|
|
38
38
|
torrentUrl: movie.torrents?.[0]?.url || '',
|
|
39
39
|
magnet: movie.torrents?.[0]?.hash ? `magnet:?xt=urn:btih:${movie.torrents[0].hash}` : '',
|
|
40
40
|
hash: movie.torrents?.[0]?.hash
|
package/dist/sources/yts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yts.js","sourceRoot":"","sources":["../../src/sources/yts.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAG1B,6CAAmD;AAEnD,MAAa,UAAU;IAAvB;QACE,SAAI,GAAG,KAAK,CAAC;IA6Ef,CAAC;IA3EC,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,QAAiB;QAC3C,IAAI,QAAQ,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC;YAChD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,qDAAqD,kBAAkB,CAAC,KAAK,CAAC,WAAW,CAAC;YACtG,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,GAAG,EAAE;gBACpC,OAAO,EAAE,IAAA,uBAAU,GAAE;gBACrB,OAAO,EAAE,oBAAO;aACjB,CAAC,CAAC;YAEH,MAAM,OAAO,GAAoB,EAAE,CAAC;YAEpC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAClC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACrC,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,SAAS,CAAC;oBAC1D,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,GAAG,CAAC;oBACjD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;oBAC7C,OAAO,CAAC,IAAI,CAAC;wBACX,GAAG,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC;wBACvB,IAAI,EAAE,GAAG,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;wBACjD,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;wBAChC,SAAS,EAAE,SAAS;wBACpB,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;wBACtC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;wBACtC,MAAM,EAAE,KAAK;wBACb,GAAG,EAAE,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"yts.js","sourceRoot":"","sources":["../../src/sources/yts.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "tor-dl",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "CLI torrent search tool - search, open in browser, copy magnet links",
|
|
5
|
-
"main": "dist/index.js",
|
|
6
|
-
"bin": {
|
|
7
|
-
"tor-dl": "dist/bin/tor-dl.js"
|
|
8
|
-
},
|
|
9
|
-
"scripts": {
|
|
10
|
-
"build": "tsc && node scripts/build.js",
|
|
11
|
-
"start": "node dist/bin/tor-dl.js"
|
|
12
|
-
},
|
|
13
|
-
"dependencies": {
|
|
14
|
-
"axios": "^1.6.0",
|
|
15
|
-
"chalk": "^4.1.2",
|
|
16
|
-
"cheerio": "^1.0.0-rc.12",
|
|
17
|
-
"commander": "^11.1.0",
|
|
18
|
-
"ora": "^6.3.1"
|
|
19
|
-
},
|
|
20
|
-
"devDependencies": {
|
|
21
|
-
"@types/node": "^20.10.0",
|
|
22
|
-
"typescript": "^5.3.0"
|
|
23
|
-
},
|
|
24
|
-
"engines": {
|
|
25
|
-
"node": ">=18.0.0"
|
|
26
|
-
},
|
|
27
|
-
"keywords": ["tor-dl", "torrent", "downloader"],
|
|
28
|
-
"author": "Sedat ERGOZ",
|
|
29
|
-
"license": "ISC",
|
|
30
|
-
"repository": {
|
|
31
|
-
"type": "git",
|
|
32
|
-
"url": "git+https://github.com/eaeoz/tor-dl.git"
|
|
33
|
-
}
|
|
34
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "tor-dl",
|
|
3
|
+
"version": "1.0.15",
|
|
4
|
+
"description": "CLI torrent search tool - search, open in browser, copy magnet links",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"tor-dl": "dist/bin/tor-dl.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc && node scripts/build.js",
|
|
11
|
+
"start": "node dist/bin/tor-dl.js"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"axios": "^1.6.0",
|
|
15
|
+
"chalk": "^4.1.2",
|
|
16
|
+
"cheerio": "^1.0.0-rc.12",
|
|
17
|
+
"commander": "^11.1.0",
|
|
18
|
+
"ora": "^6.3.1"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@types/node": "^20.10.0",
|
|
22
|
+
"typescript": "^5.3.0"
|
|
23
|
+
},
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": ">=18.0.0"
|
|
26
|
+
},
|
|
27
|
+
"keywords": ["tor-dl", "torrent", "downloader"],
|
|
28
|
+
"author": "Sedat ERGOZ",
|
|
29
|
+
"license": "ISC",
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "git+https://github.com/eaeoz/tor-dl.git"
|
|
33
|
+
}
|
|
34
|
+
}
|
package/src/cli/display.ts
CHANGED
|
@@ -3,6 +3,63 @@ import { TorrentResult } from '../types';
|
|
|
3
3
|
|
|
4
4
|
(chalk as any).level = 1;
|
|
5
5
|
|
|
6
|
+
function isWideChar(code: number): boolean {
|
|
7
|
+
if (code > 0xFFFF) return true;
|
|
8
|
+
if (code > 255) return true;
|
|
9
|
+
if (code >= 0x1100 && code <= 0x115F) return true;
|
|
10
|
+
if (code >= 0x2329 && code <= 0x232A) return true;
|
|
11
|
+
if (code >= 0x2E80 && code <= 0x303E) return true;
|
|
12
|
+
if (code >= 0x3040 && code <= 0xA4CF) return true;
|
|
13
|
+
if (code >= 0xAC00 && code <= 0xD7A3) return true;
|
|
14
|
+
if (code >= 0xF900 && code <= 0xFAFF) return true;
|
|
15
|
+
if (code >= 0xFE10 && code <= 0xFE19) return true;
|
|
16
|
+
if (code >= 0xFE30 && code <= 0xFE6F) return true;
|
|
17
|
+
if (code >= 0xFF00 && code <= 0xFF60) return true;
|
|
18
|
+
if (code >= 0xFFE0 && code <= 0xFFE6) return true;
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function displayWidth(str: string): number {
|
|
23
|
+
let width = 0;
|
|
24
|
+
for (const char of str) {
|
|
25
|
+
const cp = char.codePointAt(0)!;
|
|
26
|
+
width += isWideChar(cp) ? 2 : 1;
|
|
27
|
+
}
|
|
28
|
+
return width;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function truncateWide(str: string, maxWidth: number): string {
|
|
32
|
+
let width = 0;
|
|
33
|
+
let result = '';
|
|
34
|
+
for (const char of str) {
|
|
35
|
+
const cp = char.codePointAt(0)!;
|
|
36
|
+
const charWidth = isWideChar(cp) ? 2 : 1;
|
|
37
|
+
if (width + charWidth > maxWidth - 3) break;
|
|
38
|
+
result += char;
|
|
39
|
+
width += charWidth;
|
|
40
|
+
}
|
|
41
|
+
return result + '...';
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function padEndWide(str: string, targetWidth: number): string {
|
|
45
|
+
const currentWidth = displayWidth(str);
|
|
46
|
+
const padding = targetWidth - currentWidth;
|
|
47
|
+
if (padding <= 0) return str;
|
|
48
|
+
return str + ' '.repeat(padding);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function padEndWideExtra(str: string, targetWidth: number): string {
|
|
52
|
+
const currentWidth = displayWidth(str);
|
|
53
|
+
const padding = targetWidth - currentWidth;
|
|
54
|
+
if (padding < 0) {
|
|
55
|
+
if ([...str].some(c => c.codePointAt(0)! > 255)) {
|
|
56
|
+
return str + ' ';
|
|
57
|
+
}
|
|
58
|
+
return str;
|
|
59
|
+
}
|
|
60
|
+
return str + ' '.repeat(padding);
|
|
61
|
+
}
|
|
62
|
+
|
|
6
63
|
function makeClickable(url: string, text: string): string {
|
|
7
64
|
return `\u001b]8;;${url}\u0007${text}\u001b]8;;\u0007`;
|
|
8
65
|
}
|
|
@@ -22,7 +79,7 @@ export function displayResults(results: TorrentResult[]): void {
|
|
|
22
79
|
].join('\n'));
|
|
23
80
|
|
|
24
81
|
for (const r of results) {
|
|
25
|
-
const name = r.name
|
|
82
|
+
const name = displayWidth(r.name) > 80 ? truncateWide(r.name, 80) : r.name;
|
|
26
83
|
const size = r.size ? r.size.slice(0, 6).padEnd(6) : 'N/A ';
|
|
27
84
|
const seeds = r.seeds > 100 ? chalk.green(r.seeds.toString().padStart(5)) : r.seeds > 50 ? chalk.yellow(r.seeds.toString().padStart(5)) : r.seeds.toString().padStart(5);
|
|
28
85
|
const peers = r.peers > 50 ? chalk.cyan(r.peers.toString().padStart(5)) : r.peers.toString().padStart(5);
|
|
@@ -32,7 +89,7 @@ export function displayResults(results: TorrentResult[]): void {
|
|
|
32
89
|
const url = r.torrentUrl || r.magnet || '';
|
|
33
90
|
const pageUrl = r.url || '';
|
|
34
91
|
|
|
35
|
-
const clickableName = url ? makeClickable(url, name
|
|
92
|
+
const clickableName = url ? makeClickable(url, padEndWideExtra(name, 80)) : padEndWideExtra(name, 80);
|
|
36
93
|
const clickableLink = pageUrl ? makeClickable(pageUrl, chalk.green('✓')) : chalk.gray(' ');
|
|
37
94
|
|
|
38
95
|
out(`│ ${num} │ ${clickableLink} │ ${clickableName} │ ${size} │ ${seeds} │ ${peers} │ ${source} │`);
|
package/src/sources/yts.ts
CHANGED
|
@@ -1,86 +1,86 @@
|
|
|
1
|
-
import axios from 'axios';
|
|
2
|
-
import * as cheerio from 'cheerio';
|
|
3
|
-
import { TorrentResult, SourceScraper } from '../types';
|
|
4
|
-
import { getHeaders, TIMEOUT } from './httpClient';
|
|
5
|
-
|
|
6
|
-
export class YtsScraper implements SourceScraper {
|
|
7
|
-
name = 'YTS';
|
|
8
|
-
|
|
9
|
-
async search(query: string, category?: string): Promise<TorrentResult[]> {
|
|
10
|
-
if (category && category.toLowerCase() === 'tv') {
|
|
11
|
-
return [];
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
try {
|
|
15
|
-
const url = `https://yts.lt/api/v2/list_movies.json?query_term=${encodeURIComponent(query)}&limit=50`;
|
|
16
|
-
const { data } = await axios.get(url, {
|
|
17
|
-
headers: getHeaders(),
|
|
18
|
-
timeout: TIMEOUT
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
const results: TorrentResult[] = [];
|
|
22
|
-
|
|
23
|
-
if (data.data && data.data.movies) {
|
|
24
|
-
for (const movie of data.data.movies) {
|
|
25
|
-
const quality = movie.torrents?.[0]?.quality || 'Unknown';
|
|
26
|
-
const sizeStr = movie.torrents?.[0]?.size || '0';
|
|
27
|
-
const sizeBytes = this.parseSizeStr(sizeStr);
|
|
28
|
-
results.push({
|
|
29
|
-
num: results.length + 1,
|
|
30
|
-
name: `${movie.title} (${movie.year}) ${quality}`,
|
|
31
|
-
size: this.formatSize(sizeBytes),
|
|
32
|
-
sizeBytes: sizeBytes,
|
|
33
|
-
seeds: movie.torrents?.[0]?.seeds || 0,
|
|
34
|
-
peers: movie.torrents?.[0]?.peers || 0,
|
|
35
|
-
source: 'YTS',
|
|
36
|
-
url: movie.
|
|
37
|
-
torrentUrl: movie.torrents?.[0]?.url || '',
|
|
38
|
-
magnet: movie.torrents?.[0]?.hash ? `magnet:?xt=urn:btih:${movie.torrents[0].hash}` : '',
|
|
39
|
-
hash: movie.torrents?.[0]?.hash
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
return results;
|
|
45
|
-
} catch (error: unknown) {
|
|
46
|
-
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
47
|
-
console.error(`YTS search error: ${message}`);
|
|
48
|
-
return [];
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
async getTorrentUrl(result: TorrentResult): Promise<string> {
|
|
53
|
-
return result.url;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
async getMagnet(result: TorrentResult): Promise<string> {
|
|
57
|
-
return result.magnet || '';
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
private parseSizeStr(sizeStr: string): number {
|
|
61
|
-
if (!sizeStr || typeof sizeStr !== 'string') return 0;
|
|
62
|
-
const match = sizeStr.match(/([\d.]+)\s*(GB|MB|KB|TB)/i);
|
|
63
|
-
if (!match) return 0;
|
|
64
|
-
const value = parseFloat(match[1]);
|
|
65
|
-
const unit = match[2].toUpperCase();
|
|
66
|
-
const multipliers: Record<string, number> = {
|
|
67
|
-
'KB': 1024,
|
|
68
|
-
'MB': 1024 ** 2,
|
|
69
|
-
'GB': 1024 ** 3,
|
|
70
|
-
'TB': 1024 ** 4
|
|
71
|
-
};
|
|
72
|
-
return value * (multipliers[unit] || 0);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
private formatSize(bytes: number): string {
|
|
76
|
-
if (typeof bytes !== 'number' || isNaN(bytes) || bytes === 0) {
|
|
77
|
-
return 'Unknown';
|
|
78
|
-
}
|
|
79
|
-
if (bytes < 1024) return (bytes / 1024).toFixed(2) + ' KB';
|
|
80
|
-
if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(2) + ' KB';
|
|
81
|
-
if (bytes < 1024 * 1024 * 1024) return (bytes / (1024 * 1024)).toFixed(2) + ' MB';
|
|
82
|
-
return (bytes / (1024 * 1024 * 1024)).toFixed(2) + ' GB';
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import * as cheerio from 'cheerio';
|
|
3
|
+
import { TorrentResult, SourceScraper } from '../types';
|
|
4
|
+
import { getHeaders, TIMEOUT } from './httpClient';
|
|
5
|
+
|
|
6
|
+
export class YtsScraper implements SourceScraper {
|
|
7
|
+
name = 'YTS';
|
|
8
|
+
|
|
9
|
+
async search(query: string, category?: string): Promise<TorrentResult[]> {
|
|
10
|
+
if (category && category.toLowerCase() === 'tv') {
|
|
11
|
+
return [];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
try {
|
|
15
|
+
const url = `https://yts.lt/api/v2/list_movies.json?query_term=${encodeURIComponent(query)}&limit=50`;
|
|
16
|
+
const { data } = await axios.get(url, {
|
|
17
|
+
headers: getHeaders(),
|
|
18
|
+
timeout: TIMEOUT
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
const results: TorrentResult[] = [];
|
|
22
|
+
|
|
23
|
+
if (data.data && data.data.movies) {
|
|
24
|
+
for (const movie of data.data.movies) {
|
|
25
|
+
const quality = movie.torrents?.[0]?.quality || 'Unknown';
|
|
26
|
+
const sizeStr = movie.torrents?.[0]?.size || '0';
|
|
27
|
+
const sizeBytes = this.parseSizeStr(sizeStr);
|
|
28
|
+
results.push({
|
|
29
|
+
num: results.length + 1,
|
|
30
|
+
name: `${movie.title} (${movie.year}) ${quality}`,
|
|
31
|
+
size: this.formatSize(sizeBytes),
|
|
32
|
+
sizeBytes: sizeBytes,
|
|
33
|
+
seeds: movie.torrents?.[0]?.seeds || 0,
|
|
34
|
+
peers: movie.torrents?.[0]?.peers || 0,
|
|
35
|
+
source: 'YTS',
|
|
36
|
+
url: movie.url || '',
|
|
37
|
+
torrentUrl: movie.torrents?.[0]?.url || '',
|
|
38
|
+
magnet: movie.torrents?.[0]?.hash ? `magnet:?xt=urn:btih:${movie.torrents[0].hash}` : '',
|
|
39
|
+
hash: movie.torrents?.[0]?.hash
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return results;
|
|
45
|
+
} catch (error: unknown) {
|
|
46
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
47
|
+
console.error(`YTS search error: ${message}`);
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async getTorrentUrl(result: TorrentResult): Promise<string> {
|
|
53
|
+
return result.url;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async getMagnet(result: TorrentResult): Promise<string> {
|
|
57
|
+
return result.magnet || '';
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
private parseSizeStr(sizeStr: string): number {
|
|
61
|
+
if (!sizeStr || typeof sizeStr !== 'string') return 0;
|
|
62
|
+
const match = sizeStr.match(/([\d.]+)\s*(GB|MB|KB|TB)/i);
|
|
63
|
+
if (!match) return 0;
|
|
64
|
+
const value = parseFloat(match[1]);
|
|
65
|
+
const unit = match[2].toUpperCase();
|
|
66
|
+
const multipliers: Record<string, number> = {
|
|
67
|
+
'KB': 1024,
|
|
68
|
+
'MB': 1024 ** 2,
|
|
69
|
+
'GB': 1024 ** 3,
|
|
70
|
+
'TB': 1024 ** 4
|
|
71
|
+
};
|
|
72
|
+
return value * (multipliers[unit] || 0);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
private formatSize(bytes: number): string {
|
|
76
|
+
if (typeof bytes !== 'number' || isNaN(bytes) || bytes === 0) {
|
|
77
|
+
return 'Unknown';
|
|
78
|
+
}
|
|
79
|
+
if (bytes < 1024) return (bytes / 1024).toFixed(2) + ' KB';
|
|
80
|
+
if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(2) + ' KB';
|
|
81
|
+
if (bytes < 1024 * 1024 * 1024) return (bytes / (1024 * 1024)).toFixed(2) + ' MB';
|
|
82
|
+
return (bytes / (1024 * 1024 * 1024)).toFixed(2) + ' GB';
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
86
|
export default new YtsScraper();
|
package/dist/cli/progress.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export declare class DownloadProgress {
|
|
2
|
-
private bar;
|
|
3
|
-
private startTime;
|
|
4
|
-
private totalBytes;
|
|
5
|
-
private downloadedBytes;
|
|
6
|
-
constructor();
|
|
7
|
-
start(total: number): void;
|
|
8
|
-
update(downloaded: number, total: number): void;
|
|
9
|
-
private calculateSpeed;
|
|
10
|
-
private calculateETA;
|
|
11
|
-
private formatBytes;
|
|
12
|
-
stop(): void;
|
|
13
|
-
getTotalDownloaded(): number;
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=progress.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/cli/progress.ts"],"names":[],"mappings":"AAGA,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,GAAG,CAAwB;IACnC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,eAAe,CAAa;;IAcpC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ1B,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAe/C,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,WAAW;IAOnB,IAAI,IAAI,IAAI;IAIZ,kBAAkB,IAAI,MAAM;CAG7B"}
|
package/dist/cli/progress.js
DELETED
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.DownloadProgress = void 0;
|
|
7
|
-
const cli_progress_1 = __importDefault(require("cli-progress"));
|
|
8
|
-
class DownloadProgress {
|
|
9
|
-
constructor() {
|
|
10
|
-
this.totalBytes = 0;
|
|
11
|
-
this.downloadedBytes = 0;
|
|
12
|
-
this.startTime = Date.now();
|
|
13
|
-
this.bar = new cli_progress_1.default.SingleBar({
|
|
14
|
-
format: '[{bar}] {percentage}% | {speed} | ETA: {eta} | {downloaded}',
|
|
15
|
-
barCompleteChar: '\u2588',
|
|
16
|
-
barIncompleteChar: '\u2591',
|
|
17
|
-
hideCursor: true,
|
|
18
|
-
fps: 10,
|
|
19
|
-
etaAsynchronous: true
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
start(total) {
|
|
23
|
-
this.totalBytes = total;
|
|
24
|
-
this.bar.start(total, 0, {
|
|
25
|
-
speed: '0 B/s',
|
|
26
|
-
downloaded: '0 MB'
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
update(downloaded, total) {
|
|
30
|
-
this.downloadedBytes = downloaded;
|
|
31
|
-
this.totalBytes = total || this.totalBytes;
|
|
32
|
-
const speed = this.calculateSpeed();
|
|
33
|
-
const eta = this.calculateETA();
|
|
34
|
-
const downloadedMB = (this.downloadedBytes / (1024 * 1024)).toFixed(2);
|
|
35
|
-
this.bar.update(this.downloadedBytes, {
|
|
36
|
-
speed,
|
|
37
|
-
downloaded: `${downloadedMB} MB`,
|
|
38
|
-
eta
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
calculateSpeed() {
|
|
42
|
-
const elapsed = (Date.now() - this.startTime) / 1000;
|
|
43
|
-
const bytesPerSecond = elapsed > 0 ? this.downloadedBytes / elapsed : 0;
|
|
44
|
-
return this.formatBytes(bytesPerSecond) + '/s';
|
|
45
|
-
}
|
|
46
|
-
calculateETA() {
|
|
47
|
-
const elapsed = (Date.now() - this.startTime) / 1000;
|
|
48
|
-
if (this.downloadedBytes === 0 || this.totalBytes === 0)
|
|
49
|
-
return 'N/A';
|
|
50
|
-
const speed = this.downloadedBytes / elapsed;
|
|
51
|
-
const remaining = this.totalBytes - this.downloadedBytes;
|
|
52
|
-
const seconds = remaining / speed;
|
|
53
|
-
if (seconds < 60)
|
|
54
|
-
return `${Math.round(seconds)}s`;
|
|
55
|
-
if (seconds < 3600)
|
|
56
|
-
return `${Math.floor(seconds / 60)}m ${Math.round(seconds % 60)}s`;
|
|
57
|
-
return `${Math.floor(seconds / 3600)}h ${Math.floor((seconds % 3600) / 60)}m`;
|
|
58
|
-
}
|
|
59
|
-
formatBytes(bytes) {
|
|
60
|
-
if (bytes < 1024)
|
|
61
|
-
return bytes + ' B';
|
|
62
|
-
if (bytes < 1024 * 1024)
|
|
63
|
-
return (bytes / 1024).toFixed(2) + ' KB';
|
|
64
|
-
if (bytes < 1024 * 1024 * 1024)
|
|
65
|
-
return (bytes / (1024 * 1024)).toFixed(2) + ' MB';
|
|
66
|
-
return (bytes / (1024 * 1024 * 1024)).toFixed(2) + ' GB';
|
|
67
|
-
}
|
|
68
|
-
stop() {
|
|
69
|
-
this.bar.stop();
|
|
70
|
-
}
|
|
71
|
-
getTotalDownloaded() {
|
|
72
|
-
return this.downloadedBytes;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
exports.DownloadProgress = DownloadProgress;
|
|
76
|
-
//# sourceMappingURL=progress.js.map
|
package/dist/cli/progress.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/cli/progress.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { TorrentResult } from '../types';
|
|
2
|
-
export declare function displayResults(results: TorrentResult[]): void;
|
|
3
|
-
export declare function displayResultDetails(result: TorrentResult): void;
|
|
4
|
-
export declare function displayError(message: string): void;
|
|
5
|
-
export declare function displaySuccess(message: string): void;
|
|
6
|
-
export declare function displayInfo(message: string): void;
|
|
7
|
-
//# sourceMappingURL=display.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../../src/cli/display.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,IAAI,CA6B7D;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAYhE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjD"}
|
package/dist/src/cli/display.js
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.displayResults = displayResults;
|
|
7
|
-
exports.displayResultDetails = displayResultDetails;
|
|
8
|
-
exports.displayError = displayError;
|
|
9
|
-
exports.displaySuccess = displaySuccess;
|
|
10
|
-
exports.displayInfo = displayInfo;
|
|
11
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
12
|
-
function displayResults(results) {
|
|
13
|
-
if (results.length === 0) {
|
|
14
|
-
console.log(chalk_1.default.yellow('No results found.'));
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
const out = (s) => process.stdout.write(s + '\n');
|
|
18
|
-
out('\n' + [
|
|
19
|
-
'┌─────┬────────────────────────────────────────┬────────┬───────┬───────┬────────┐',
|
|
20
|
-
'│ Num │ Name │ Size │ Seeds │ Leech │ Source │',
|
|
21
|
-
'├─────┼────────────────────────────────────────┼────────┼───────┼───────┼────────┤'
|
|
22
|
-
].join('\n'));
|
|
23
|
-
for (const r of results) {
|
|
24
|
-
const name = r.name.length > 38 ? r.name.substring(0, 35) + '...' : r.name;
|
|
25
|
-
const size = r.size ? r.size.slice(0, 6).padEnd(6) : 'N/A ';
|
|
26
|
-
const seeds = r.seeds.toString().padStart(5);
|
|
27
|
-
const peers = r.peers.toString().padStart(5);
|
|
28
|
-
const source = (r.source || 'unknown').slice(0, 6).padEnd(6);
|
|
29
|
-
const num = r.num.toString().padStart(3);
|
|
30
|
-
out(`│ ${num} │ ${name.padEnd(38)} │ ${size} │ ${seeds} │ ${peers} │ ${source} │`);
|
|
31
|
-
}
|
|
32
|
-
out('├─────┼────────────────────────────────────────┼────────┼───────┼───────┼────────┤');
|
|
33
|
-
out('└─────┴────────────────────────────────────────┴────────┴───────┴───────┴────────┘');
|
|
34
|
-
out('');
|
|
35
|
-
out('To download: tor-dl <number>');
|
|
36
|
-
}
|
|
37
|
-
function displayResultDetails(result) {
|
|
38
|
-
console.log(chalk_1.default.bold('\n--- Torrent Details ---'));
|
|
39
|
-
console.log(chalk_1.default.white('Name: ') + result.name);
|
|
40
|
-
console.log(chalk_1.default.white('Size: ') + result.size);
|
|
41
|
-
console.log(chalk_1.default.white('Seeds: ') + chalk_1.default.green(result.seeds.toString()));
|
|
42
|
-
console.log(chalk_1.default.white('Peers: ') + result.peers.toString());
|
|
43
|
-
console.log(chalk_1.default.white('Source: ') + result.source);
|
|
44
|
-
console.log(chalk_1.default.white('URL: ') + result.url);
|
|
45
|
-
if (result.magnet) {
|
|
46
|
-
console.log(chalk_1.default.white('Magnet: ') + chalk_1.default.cyan(result.magnet.substring(0, 60) + '...'));
|
|
47
|
-
}
|
|
48
|
-
console.log(chalk_1.default.bold('----------------------\n'));
|
|
49
|
-
}
|
|
50
|
-
function displayError(message) {
|
|
51
|
-
console.error(chalk_1.default.red('Error: ') + message);
|
|
52
|
-
}
|
|
53
|
-
function displaySuccess(message) {
|
|
54
|
-
console.log(chalk_1.default.green('✓ ') + message);
|
|
55
|
-
}
|
|
56
|
-
function displayInfo(message) {
|
|
57
|
-
console.log(chalk_1.default.blue('ℹ ') + message);
|
|
58
|
-
}
|
|
59
|
-
//# sourceMappingURL=display.js.map
|