@qodalis/cli-wget 2.0.0-beta.1

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/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@qodalis/cli-wget",
3
+ "version": "2.0.0-beta.1",
4
+ "description": "Download files from any HTTP/HTTPS URL",
5
+ "author": "Qodalis Solutions",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/qodalis-solutions/web-cli"
10
+ },
11
+ "homepage": "https://qodalis.com",
12
+ "keywords": [
13
+ "cli",
14
+ "qodalis",
15
+ "terminal",
16
+ "wget"
17
+ ],
18
+ "umd": "./umd/index.js",
19
+ "unpkg": "./umd/index.js",
20
+ "dependencies": {
21
+ "@qodalis/cli-core": "2.0.0-beta.1"
22
+ },
23
+ "sideEffects": false,
24
+ "main": "./public-api.js",
25
+ "module": "./public-api.mjs",
26
+ "types": "./public-api.d.ts",
27
+ "exports": {
28
+ ".": {
29
+ "types": "./public-api.d.ts",
30
+ "import": "./public-api.mjs",
31
+ "require": "./public-api.js"
32
+ }
33
+ }
34
+ }
@@ -0,0 +1,29 @@
1
+ import * as _qodalis_cli_core from '@qodalis/cli-core';
2
+ import { ICliCommandProcessor, ICliCommandParameterDescriptor, CliProcessCommand, ICliExecutionContext, ICliModule } from '@qodalis/cli-core';
3
+
4
+ declare class CliWgetCommandCommandProcessor implements ICliCommandProcessor {
5
+ command: string;
6
+ description: string;
7
+ author: _qodalis_cli_core.ICliCommandAuthor;
8
+ version: string;
9
+ acceptsRawInput: boolean;
10
+ valueRequired: boolean;
11
+ metadata: {
12
+ icon: string;
13
+ };
14
+ parameters: ICliCommandParameterDescriptor[];
15
+ processors: ICliCommandProcessor[];
16
+ processCommand(command: CliProcessCommand, context: ICliExecutionContext): Promise<void>;
17
+ writeDescription(context: ICliExecutionContext): void;
18
+ private _getFileTransferService;
19
+ private _filenameFromUrl;
20
+ private _uint8ArrayToBase64;
21
+ private _formatBytes;
22
+ }
23
+
24
+ declare const LIBRARY_VERSION = "2.0.0-beta.1";
25
+ declare const API_VERSION = 2;
26
+
27
+ declare const wgetModule: ICliModule;
28
+
29
+ export { API_VERSION, CliWgetCommandCommandProcessor, LIBRARY_VERSION, wgetModule };
@@ -0,0 +1,29 @@
1
+ import * as _qodalis_cli_core from '@qodalis/cli-core';
2
+ import { ICliCommandProcessor, ICliCommandParameterDescriptor, CliProcessCommand, ICliExecutionContext, ICliModule } from '@qodalis/cli-core';
3
+
4
+ declare class CliWgetCommandCommandProcessor implements ICliCommandProcessor {
5
+ command: string;
6
+ description: string;
7
+ author: _qodalis_cli_core.ICliCommandAuthor;
8
+ version: string;
9
+ acceptsRawInput: boolean;
10
+ valueRequired: boolean;
11
+ metadata: {
12
+ icon: string;
13
+ };
14
+ parameters: ICliCommandParameterDescriptor[];
15
+ processors: ICliCommandProcessor[];
16
+ processCommand(command: CliProcessCommand, context: ICliExecutionContext): Promise<void>;
17
+ writeDescription(context: ICliExecutionContext): void;
18
+ private _getFileTransferService;
19
+ private _filenameFromUrl;
20
+ private _uint8ArrayToBase64;
21
+ private _formatBytes;
22
+ }
23
+
24
+ declare const LIBRARY_VERSION = "2.0.0-beta.1";
25
+ declare const API_VERSION = 2;
26
+
27
+ declare const wgetModule: ICliModule;
28
+
29
+ export { API_VERSION, CliWgetCommandCommandProcessor, LIBRARY_VERSION, wgetModule };
package/public-api.js ADDED
@@ -0,0 +1,228 @@
1
+ 'use strict';
2
+
3
+ var cliCore = require('@qodalis/cli-core');
4
+
5
+ // src/lib/processors/cli-wget-command-processor.ts
6
+
7
+ // src/lib/version.ts
8
+ var LIBRARY_VERSION = "2.0.0-beta.1";
9
+ var API_VERSION = 2;
10
+
11
+ // src/lib/processors/cli-wget-command-processor.ts
12
+ var CliWgetCommandCommandProcessor = class {
13
+ constructor() {
14
+ this.command = "wget";
15
+ this.description = "Download files from any HTTP/HTTPS URL";
16
+ this.author = cliCore.DefaultLibraryAuthor;
17
+ this.version = LIBRARY_VERSION;
18
+ this.acceptsRawInput = true;
19
+ this.valueRequired = true;
20
+ this.metadata = {
21
+ icon: "\u2B07"
22
+ };
23
+ this.parameters = [
24
+ {
25
+ name: "output",
26
+ aliases: ["o"],
27
+ type: "string",
28
+ description: "Output filename (default: derived from URL)",
29
+ required: false
30
+ },
31
+ {
32
+ name: "header",
33
+ aliases: ["H"],
34
+ type: "array",
35
+ description: "Custom HTTP header (can be repeated)",
36
+ required: false
37
+ },
38
+ {
39
+ name: "no-progress",
40
+ type: "boolean",
41
+ description: "Suppress progress bar",
42
+ required: false
43
+ },
44
+ {
45
+ name: "save",
46
+ type: "boolean",
47
+ description: "Save to browser downloads instead of virtual filesystem",
48
+ required: false
49
+ }
50
+ ];
51
+ this.processors = [];
52
+ }
53
+ async processCommand(command, context) {
54
+ const url = command.value?.trim();
55
+ if (!url) {
56
+ context.writer.writeError('Usage: wget <url> [-o filename] [--header "Name: Value"]');
57
+ context.process.exit(1);
58
+ return;
59
+ }
60
+ let parsedUrl;
61
+ try {
62
+ parsedUrl = new URL(url);
63
+ } catch {
64
+ context.writer.writeError(`Invalid URL: ${url}`);
65
+ context.process.exit(1);
66
+ return;
67
+ }
68
+ const outputName = command.args["output"] || command.args["o"] || this._filenameFromUrl(parsedUrl);
69
+ const headers = {};
70
+ const rawHeaders = command.args["header"] || command.args["H"];
71
+ if (rawHeaders) {
72
+ const headerList = Array.isArray(rawHeaders) ? rawHeaders : [rawHeaders];
73
+ for (const h of headerList) {
74
+ const colonIdx = h.indexOf(":");
75
+ if (colonIdx > 0) {
76
+ headers[h.slice(0, colonIdx).trim()] = h.slice(colonIdx + 1).trim();
77
+ }
78
+ }
79
+ }
80
+ const showProgress = !command.args["no-progress"];
81
+ const saveToBrowser = !!command.args["save"];
82
+ const fileTransfer = this._getFileTransferService(context);
83
+ const abortController = new AbortController();
84
+ const abortSub = context.onAbort.subscribe(() => abortController.abort());
85
+ try {
86
+ if (showProgress) {
87
+ context.spinner?.show(`Connecting to ${parsedUrl.hostname}...`);
88
+ }
89
+ const response = await fetch(url, {
90
+ headers,
91
+ signal: abortController.signal
92
+ });
93
+ if (!response.ok) {
94
+ context.spinner?.hide();
95
+ context.writer.writeError(`HTTP ${response.status}: ${response.statusText}`);
96
+ context.process.exit(1);
97
+ return;
98
+ }
99
+ const contentLength = parseInt(response.headers.get("content-length") || "0", 10);
100
+ const contentType = response.headers.get("content-type") || "";
101
+ context.spinner?.hide();
102
+ if (showProgress && contentLength > 0) {
103
+ context.progressBar.show(`Downloading ${outputName}`);
104
+ } else if (showProgress) {
105
+ context.spinner?.show(`Downloading ${outputName}...`);
106
+ }
107
+ const reader = response.body?.getReader();
108
+ if (!reader) {
109
+ const text = await response.text();
110
+ if (saveToBrowser) {
111
+ fileTransfer.downloadToBrowser(outputName, text);
112
+ } else {
113
+ await fileTransfer.writeFile(outputName, text);
114
+ }
115
+ context.spinner?.hide();
116
+ context.writer.writeSuccess(`Saved: ${outputName}`);
117
+ return;
118
+ }
119
+ const chunks = [];
120
+ let receivedBytes = 0;
121
+ while (true) {
122
+ const { done, value } = await reader.read();
123
+ if (done) break;
124
+ chunks.push(value);
125
+ receivedBytes += value.length;
126
+ if (showProgress && contentLength > 0) {
127
+ const progress = receivedBytes / contentLength;
128
+ context.progressBar.update(progress);
129
+ context.progressBar.setText(
130
+ `${outputName} (${this._formatBytes(receivedBytes)}/${this._formatBytes(contentLength)})`
131
+ );
132
+ } else if (showProgress) {
133
+ context.spinner?.setText(`Downloading ${outputName}... ${this._formatBytes(receivedBytes)}`);
134
+ }
135
+ }
136
+ const combined = new Uint8Array(receivedBytes);
137
+ let offset = 0;
138
+ for (const chunk of chunks) {
139
+ combined.set(chunk, offset);
140
+ offset += chunk.length;
141
+ }
142
+ if (showProgress && contentLength > 0) {
143
+ context.progressBar.complete();
144
+ context.progressBar.hide();
145
+ } else {
146
+ context.spinner?.hide();
147
+ }
148
+ const isText = contentType.includes("text") || contentType.includes("json") || contentType.includes("xml");
149
+ if (saveToBrowser) {
150
+ const blob = new Blob([combined]);
151
+ fileTransfer.downloadToBrowser(outputName, blob);
152
+ } else if (isText) {
153
+ const text = new TextDecoder().decode(combined);
154
+ await fileTransfer.writeFile(outputName, text);
155
+ } else {
156
+ const base64 = this._uint8ArrayToBase64(combined);
157
+ const dataUri = `data:${contentType || "application/octet-stream"};base64,${base64}`;
158
+ await fileTransfer.writeFile(outputName, dataUri);
159
+ }
160
+ context.writer.writeSuccess(`Downloaded: ${outputName} (${this._formatBytes(receivedBytes)})`);
161
+ } catch (err) {
162
+ context.spinner?.hide();
163
+ context.progressBar.hide();
164
+ if (err.name === "AbortError") {
165
+ context.writer.writeWarning("Download cancelled.");
166
+ } else {
167
+ context.writer.writeError(`Download failed: ${err.message}`);
168
+ }
169
+ context.process.exit(1);
170
+ } finally {
171
+ abortSub.unsubscribe();
172
+ }
173
+ }
174
+ writeDescription(context) {
175
+ context.writer.writeln(this.description);
176
+ }
177
+ _getFileTransferService(context) {
178
+ try {
179
+ return context.services.get(cliCore.ICliFileTransferService_TOKEN);
180
+ } catch {
181
+ return new cliCore.BrowserFileTransferService();
182
+ }
183
+ }
184
+ _filenameFromUrl(url) {
185
+ const pathname = url.pathname;
186
+ const segments = pathname.split("/").filter(Boolean);
187
+ return segments.length > 0 ? segments[segments.length - 1] : "download";
188
+ }
189
+ _uint8ArrayToBase64(bytes) {
190
+ let binary = "";
191
+ for (let i = 0; i < bytes.length; i++) {
192
+ binary += String.fromCharCode(bytes[i]);
193
+ }
194
+ return btoa(binary);
195
+ }
196
+ _formatBytes(bytes) {
197
+ if (bytes < 1024) return `${bytes} B`;
198
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
199
+ if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
200
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;
201
+ }
202
+ };
203
+
204
+ // src/public-api.ts
205
+ var wgetModule = {
206
+ apiVersion: API_VERSION,
207
+ name: "@qodalis/cli-wget",
208
+ processors: [new CliWgetCommandCommandProcessor()],
209
+ translations: {
210
+ es: { "cli.wget.description": "Descargar archivos desde cualquier URL HTTP/HTTPS" },
211
+ fr: { "cli.wget.description": "T\xE9l\xE9charger des fichiers depuis une URL HTTP/HTTPS" },
212
+ de: { "cli.wget.description": "Dateien von beliebigen HTTP/HTTPS-URLs herunterladen" },
213
+ pt: { "cli.wget.description": "Baixar arquivos de qualquer URL HTTP/HTTPS" },
214
+ it: { "cli.wget.description": "Scaricare file da qualsiasi URL HTTP/HTTPS" },
215
+ ja: { "cli.wget.description": "HTTP/HTTPS URL\u304B\u3089\u30D5\u30A1\u30A4\u30EB\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9" },
216
+ ko: { "cli.wget.description": "HTTP/HTTPS URL\uC5D0\uC11C \uD30C\uC77C \uB2E4\uC6B4\uB85C\uB4DC" },
217
+ zh: { "cli.wget.description": "\u4ECE\u4EFB\u610F HTTP/HTTPS URL \u4E0B\u8F7D\u6587\u4EF6" },
218
+ ru: { "cli.wget.description": "\u0421\u043A\u0430\u0447\u0438\u0432\u0430\u043D\u0438\u0435 \u0444\u0430\u0439\u043B\u043E\u0432 \u043F\u043E HTTP/HTTPS" },
219
+ ro: { "cli.wget.description": "Descarc\u0103 fi\u0219iere de la orice URL HTTP/HTTPS" }
220
+ }
221
+ };
222
+
223
+ exports.API_VERSION = API_VERSION;
224
+ exports.CliWgetCommandCommandProcessor = CliWgetCommandCommandProcessor;
225
+ exports.LIBRARY_VERSION = LIBRARY_VERSION;
226
+ exports.wgetModule = wgetModule;
227
+ //# sourceMappingURL=public-api.js.map
228
+ //# sourceMappingURL=public-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../packages/plugins/wget/src/lib/version.ts","../../packages/plugins/wget/src/lib/processors/cli-wget-command-processor.ts","../../packages/plugins/wget/src/public-api.ts"],"names":["DefaultLibraryAuthor","ICliFileTransferService_TOKEN","BrowserFileTransferService"],"mappings":"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","file":"public-api.js","sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-beta.1';\nexport const API_VERSION = 2;\n ","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliCommandParameterDescriptor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n BrowserFileTransferService,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliWgetCommandCommandProcessor implements ICliCommandProcessor {\n command = 'wget';\n\n description = 'Download files from any HTTP/HTTPS URL';\n\n author = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n acceptsRawInput = true;\n\n valueRequired = true;\n\n metadata = {\n icon: '⬇',\n };\n\n parameters: ICliCommandParameterDescriptor[] = [\n {\n name: 'output',\n aliases: ['o'],\n type: 'string',\n description: 'Output filename (default: derived from URL)',\n required: false,\n },\n {\n name: 'header',\n aliases: ['H'],\n type: 'array',\n description: 'Custom HTTP header (can be repeated)',\n required: false,\n },\n {\n name: 'no-progress',\n type: 'boolean',\n description: 'Suppress progress bar',\n required: false,\n },\n {\n name: 'save',\n type: 'boolean',\n description: 'Save to browser downloads instead of virtual filesystem',\n required: false,\n },\n ];\n\n processors: ICliCommandProcessor[] = [];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const url = command.value?.trim();\n if (!url) {\n context.writer.writeError('Usage: wget <url> [-o filename] [--header \"Name: Value\"]');\n context.process.exit(1);\n return;\n }\n\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(url);\n } catch {\n context.writer.writeError(`Invalid URL: ${url}`);\n context.process.exit(1);\n return;\n }\n\n const outputName = command.args['output'] || command.args['o']\n || this._filenameFromUrl(parsedUrl);\n\n const headers: Record<string, string> = {};\n const rawHeaders = command.args['header'] || command.args['H'];\n if (rawHeaders) {\n const headerList = Array.isArray(rawHeaders) ? rawHeaders : [rawHeaders];\n for (const h of headerList) {\n const colonIdx = h.indexOf(':');\n if (colonIdx > 0) {\n headers[h.slice(0, colonIdx).trim()] = h.slice(colonIdx + 1).trim();\n }\n }\n }\n\n const showProgress = !command.args['no-progress'];\n const saveToBrowser = !!command.args['save'];\n\n const fileTransfer = this._getFileTransferService(context);\n\n const abortController = new AbortController();\n const abortSub = context.onAbort.subscribe(() => abortController.abort());\n\n try {\n if (showProgress) {\n context.spinner?.show(`Connecting to ${parsedUrl.hostname}...`);\n }\n\n const response = await fetch(url, {\n headers,\n signal: abortController.signal,\n });\n\n if (!response.ok) {\n context.spinner?.hide();\n context.writer.writeError(`HTTP ${response.status}: ${response.statusText}`);\n context.process.exit(1);\n return;\n }\n\n const contentLength = parseInt(response.headers.get('content-length') || '0', 10);\n const contentType = response.headers.get('content-type') || '';\n\n context.spinner?.hide();\n\n if (showProgress && contentLength > 0) {\n context.progressBar.show(`Downloading ${outputName}`);\n } else if (showProgress) {\n context.spinner?.show(`Downloading ${outputName}...`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n const text = await response.text();\n if (saveToBrowser) {\n fileTransfer.downloadToBrowser(outputName, text);\n } else {\n await fileTransfer.writeFile(outputName, text);\n }\n context.spinner?.hide();\n context.writer.writeSuccess(`Saved: ${outputName}`);\n return;\n }\n\n const chunks: Uint8Array[] = [];\n let receivedBytes = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n chunks.push(value);\n receivedBytes += value.length;\n\n if (showProgress && contentLength > 0) {\n const progress = receivedBytes / contentLength;\n context.progressBar.update(progress);\n context.progressBar.setText(\n `${outputName} (${this._formatBytes(receivedBytes)}/${this._formatBytes(contentLength)})`,\n );\n } else if (showProgress) {\n context.spinner?.setText(`Downloading ${outputName}... ${this._formatBytes(receivedBytes)}`);\n }\n }\n\n const combined = new Uint8Array(receivedBytes);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n if (showProgress && contentLength > 0) {\n context.progressBar.complete();\n context.progressBar.hide();\n } else {\n context.spinner?.hide();\n }\n\n const isText = contentType.includes('text') || contentType.includes('json') || contentType.includes('xml');\n\n if (saveToBrowser) {\n const blob = new Blob([combined]);\n fileTransfer.downloadToBrowser(outputName, blob);\n } else if (isText) {\n const text = new TextDecoder().decode(combined);\n await fileTransfer.writeFile(outputName, text);\n } else {\n // Binary file — encode as base64 and save to virtual filesystem\n const base64 = this._uint8ArrayToBase64(combined);\n const dataUri = `data:${contentType || 'application/octet-stream'};base64,${base64}`;\n await fileTransfer.writeFile(outputName, dataUri);\n }\n\n context.writer.writeSuccess(`Downloaded: ${outputName} (${this._formatBytes(receivedBytes)})`);\n } catch (err: any) {\n context.spinner?.hide();\n context.progressBar.hide();\n\n if (err.name === 'AbortError') {\n context.writer.writeWarning('Download cancelled.');\n } else {\n context.writer.writeError(`Download failed: ${err.message}`);\n }\n context.process.exit(1);\n } finally {\n abortSub.unsubscribe();\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln(this.description!);\n }\n\n private _getFileTransferService(context: ICliExecutionContext): ICliFileTransferService {\n try {\n return context.services.get<ICliFileTransferService>(ICliFileTransferService_TOKEN);\n } catch {\n return new BrowserFileTransferService();\n }\n }\n\n private _filenameFromUrl(url: URL): string {\n const pathname = url.pathname;\n const segments = pathname.split('/').filter(Boolean);\n return segments.length > 0 ? segments[segments.length - 1] : 'download';\n }\n\n private _uint8ArrayToBase64(bytes: Uint8Array): string {\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n }\n\n private _formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n }\n}\n","/*\n * Public API Surface of wget\n */\n\nexport * from './lib/processors/cli-wget-command-processor';\nexport * from './lib/version';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliWgetCommandCommandProcessor } from './lib/processors/cli-wget-command-processor';\nimport { API_VERSION } from './lib/version';\n\nexport const wgetModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-wget',\n processors: [new CliWgetCommandCommandProcessor()],\n translations: {\n es: { 'cli.wget.description': 'Descargar archivos desde cualquier URL HTTP/HTTPS' },\n fr: { 'cli.wget.description': 'Télécharger des fichiers depuis une URL HTTP/HTTPS' },\n de: { 'cli.wget.description': 'Dateien von beliebigen HTTP/HTTPS-URLs herunterladen' },\n pt: { 'cli.wget.description': 'Baixar arquivos de qualquer URL HTTP/HTTPS' },\n it: { 'cli.wget.description': 'Scaricare file da qualsiasi URL HTTP/HTTPS' },\n ja: { 'cli.wget.description': 'HTTP/HTTPS URLからファイルをダウンロード' },\n ko: { 'cli.wget.description': 'HTTP/HTTPS URL에서 파일 다운로드' },\n zh: { 'cli.wget.description': '从任意 HTTP/HTTPS URL 下载文件' },\n ru: { 'cli.wget.description': 'Скачивание файлов по HTTP/HTTPS' },\n ro: { 'cli.wget.description': 'Descarcă fișiere de la orice URL HTTP/HTTPS' },\n },\n};\n"]}
package/public-api.mjs ADDED
@@ -0,0 +1,223 @@
1
+ import { DefaultLibraryAuthor, ICliFileTransferService_TOKEN, BrowserFileTransferService } from '@qodalis/cli-core';
2
+
3
+ // src/lib/processors/cli-wget-command-processor.ts
4
+
5
+ // src/lib/version.ts
6
+ var LIBRARY_VERSION = "2.0.0-beta.1";
7
+ var API_VERSION = 2;
8
+
9
+ // src/lib/processors/cli-wget-command-processor.ts
10
+ var CliWgetCommandCommandProcessor = class {
11
+ constructor() {
12
+ this.command = "wget";
13
+ this.description = "Download files from any HTTP/HTTPS URL";
14
+ this.author = DefaultLibraryAuthor;
15
+ this.version = LIBRARY_VERSION;
16
+ this.acceptsRawInput = true;
17
+ this.valueRequired = true;
18
+ this.metadata = {
19
+ icon: "\u2B07"
20
+ };
21
+ this.parameters = [
22
+ {
23
+ name: "output",
24
+ aliases: ["o"],
25
+ type: "string",
26
+ description: "Output filename (default: derived from URL)",
27
+ required: false
28
+ },
29
+ {
30
+ name: "header",
31
+ aliases: ["H"],
32
+ type: "array",
33
+ description: "Custom HTTP header (can be repeated)",
34
+ required: false
35
+ },
36
+ {
37
+ name: "no-progress",
38
+ type: "boolean",
39
+ description: "Suppress progress bar",
40
+ required: false
41
+ },
42
+ {
43
+ name: "save",
44
+ type: "boolean",
45
+ description: "Save to browser downloads instead of virtual filesystem",
46
+ required: false
47
+ }
48
+ ];
49
+ this.processors = [];
50
+ }
51
+ async processCommand(command, context) {
52
+ const url = command.value?.trim();
53
+ if (!url) {
54
+ context.writer.writeError('Usage: wget <url> [-o filename] [--header "Name: Value"]');
55
+ context.process.exit(1);
56
+ return;
57
+ }
58
+ let parsedUrl;
59
+ try {
60
+ parsedUrl = new URL(url);
61
+ } catch {
62
+ context.writer.writeError(`Invalid URL: ${url}`);
63
+ context.process.exit(1);
64
+ return;
65
+ }
66
+ const outputName = command.args["output"] || command.args["o"] || this._filenameFromUrl(parsedUrl);
67
+ const headers = {};
68
+ const rawHeaders = command.args["header"] || command.args["H"];
69
+ if (rawHeaders) {
70
+ const headerList = Array.isArray(rawHeaders) ? rawHeaders : [rawHeaders];
71
+ for (const h of headerList) {
72
+ const colonIdx = h.indexOf(":");
73
+ if (colonIdx > 0) {
74
+ headers[h.slice(0, colonIdx).trim()] = h.slice(colonIdx + 1).trim();
75
+ }
76
+ }
77
+ }
78
+ const showProgress = !command.args["no-progress"];
79
+ const saveToBrowser = !!command.args["save"];
80
+ const fileTransfer = this._getFileTransferService(context);
81
+ const abortController = new AbortController();
82
+ const abortSub = context.onAbort.subscribe(() => abortController.abort());
83
+ try {
84
+ if (showProgress) {
85
+ context.spinner?.show(`Connecting to ${parsedUrl.hostname}...`);
86
+ }
87
+ const response = await fetch(url, {
88
+ headers,
89
+ signal: abortController.signal
90
+ });
91
+ if (!response.ok) {
92
+ context.spinner?.hide();
93
+ context.writer.writeError(`HTTP ${response.status}: ${response.statusText}`);
94
+ context.process.exit(1);
95
+ return;
96
+ }
97
+ const contentLength = parseInt(response.headers.get("content-length") || "0", 10);
98
+ const contentType = response.headers.get("content-type") || "";
99
+ context.spinner?.hide();
100
+ if (showProgress && contentLength > 0) {
101
+ context.progressBar.show(`Downloading ${outputName}`);
102
+ } else if (showProgress) {
103
+ context.spinner?.show(`Downloading ${outputName}...`);
104
+ }
105
+ const reader = response.body?.getReader();
106
+ if (!reader) {
107
+ const text = await response.text();
108
+ if (saveToBrowser) {
109
+ fileTransfer.downloadToBrowser(outputName, text);
110
+ } else {
111
+ await fileTransfer.writeFile(outputName, text);
112
+ }
113
+ context.spinner?.hide();
114
+ context.writer.writeSuccess(`Saved: ${outputName}`);
115
+ return;
116
+ }
117
+ const chunks = [];
118
+ let receivedBytes = 0;
119
+ while (true) {
120
+ const { done, value } = await reader.read();
121
+ if (done) break;
122
+ chunks.push(value);
123
+ receivedBytes += value.length;
124
+ if (showProgress && contentLength > 0) {
125
+ const progress = receivedBytes / contentLength;
126
+ context.progressBar.update(progress);
127
+ context.progressBar.setText(
128
+ `${outputName} (${this._formatBytes(receivedBytes)}/${this._formatBytes(contentLength)})`
129
+ );
130
+ } else if (showProgress) {
131
+ context.spinner?.setText(`Downloading ${outputName}... ${this._formatBytes(receivedBytes)}`);
132
+ }
133
+ }
134
+ const combined = new Uint8Array(receivedBytes);
135
+ let offset = 0;
136
+ for (const chunk of chunks) {
137
+ combined.set(chunk, offset);
138
+ offset += chunk.length;
139
+ }
140
+ if (showProgress && contentLength > 0) {
141
+ context.progressBar.complete();
142
+ context.progressBar.hide();
143
+ } else {
144
+ context.spinner?.hide();
145
+ }
146
+ const isText = contentType.includes("text") || contentType.includes("json") || contentType.includes("xml");
147
+ if (saveToBrowser) {
148
+ const blob = new Blob([combined]);
149
+ fileTransfer.downloadToBrowser(outputName, blob);
150
+ } else if (isText) {
151
+ const text = new TextDecoder().decode(combined);
152
+ await fileTransfer.writeFile(outputName, text);
153
+ } else {
154
+ const base64 = this._uint8ArrayToBase64(combined);
155
+ const dataUri = `data:${contentType || "application/octet-stream"};base64,${base64}`;
156
+ await fileTransfer.writeFile(outputName, dataUri);
157
+ }
158
+ context.writer.writeSuccess(`Downloaded: ${outputName} (${this._formatBytes(receivedBytes)})`);
159
+ } catch (err) {
160
+ context.spinner?.hide();
161
+ context.progressBar.hide();
162
+ if (err.name === "AbortError") {
163
+ context.writer.writeWarning("Download cancelled.");
164
+ } else {
165
+ context.writer.writeError(`Download failed: ${err.message}`);
166
+ }
167
+ context.process.exit(1);
168
+ } finally {
169
+ abortSub.unsubscribe();
170
+ }
171
+ }
172
+ writeDescription(context) {
173
+ context.writer.writeln(this.description);
174
+ }
175
+ _getFileTransferService(context) {
176
+ try {
177
+ return context.services.get(ICliFileTransferService_TOKEN);
178
+ } catch {
179
+ return new BrowserFileTransferService();
180
+ }
181
+ }
182
+ _filenameFromUrl(url) {
183
+ const pathname = url.pathname;
184
+ const segments = pathname.split("/").filter(Boolean);
185
+ return segments.length > 0 ? segments[segments.length - 1] : "download";
186
+ }
187
+ _uint8ArrayToBase64(bytes) {
188
+ let binary = "";
189
+ for (let i = 0; i < bytes.length; i++) {
190
+ binary += String.fromCharCode(bytes[i]);
191
+ }
192
+ return btoa(binary);
193
+ }
194
+ _formatBytes(bytes) {
195
+ if (bytes < 1024) return `${bytes} B`;
196
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
197
+ if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
198
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;
199
+ }
200
+ };
201
+
202
+ // src/public-api.ts
203
+ var wgetModule = {
204
+ apiVersion: API_VERSION,
205
+ name: "@qodalis/cli-wget",
206
+ processors: [new CliWgetCommandCommandProcessor()],
207
+ translations: {
208
+ es: { "cli.wget.description": "Descargar archivos desde cualquier URL HTTP/HTTPS" },
209
+ fr: { "cli.wget.description": "T\xE9l\xE9charger des fichiers depuis une URL HTTP/HTTPS" },
210
+ de: { "cli.wget.description": "Dateien von beliebigen HTTP/HTTPS-URLs herunterladen" },
211
+ pt: { "cli.wget.description": "Baixar arquivos de qualquer URL HTTP/HTTPS" },
212
+ it: { "cli.wget.description": "Scaricare file da qualsiasi URL HTTP/HTTPS" },
213
+ ja: { "cli.wget.description": "HTTP/HTTPS URL\u304B\u3089\u30D5\u30A1\u30A4\u30EB\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9" },
214
+ ko: { "cli.wget.description": "HTTP/HTTPS URL\uC5D0\uC11C \uD30C\uC77C \uB2E4\uC6B4\uB85C\uB4DC" },
215
+ zh: { "cli.wget.description": "\u4ECE\u4EFB\u610F HTTP/HTTPS URL \u4E0B\u8F7D\u6587\u4EF6" },
216
+ ru: { "cli.wget.description": "\u0421\u043A\u0430\u0447\u0438\u0432\u0430\u043D\u0438\u0435 \u0444\u0430\u0439\u043B\u043E\u0432 \u043F\u043E HTTP/HTTPS" },
217
+ ro: { "cli.wget.description": "Descarc\u0103 fi\u0219iere de la orice URL HTTP/HTTPS" }
218
+ }
219
+ };
220
+
221
+ export { API_VERSION, CliWgetCommandCommandProcessor, LIBRARY_VERSION, wgetModule };
222
+ //# sourceMappingURL=public-api.mjs.map
223
+ //# sourceMappingURL=public-api.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../packages/plugins/wget/src/lib/version.ts","../../packages/plugins/wget/src/lib/processors/cli-wget-command-processor.ts","../../packages/plugins/wget/src/public-api.ts"],"names":[],"mappings":";;;;;AAEO,IAAM,eAAA,GAAkB;AACxB,IAAM,WAAA,GAAc;;;ACSpB,IAAM,iCAAN,MAAqE;AAAA,EAArE,WAAA,GAAA;AACH,IAAA,IAAA,CAAA,OAAA,GAAU,MAAA;AAEV,IAAA,IAAA,CAAA,WAAA,GAAc,wCAAA;AAEd,IAAA,IAAA,CAAA,MAAA,GAAS,oBAAA;AAET,IAAA,IAAA,CAAA,OAAA,GAAU,eAAA;AAEV,IAAA,IAAA,CAAA,eAAA,GAAkB,IAAA;AAElB,IAAA,IAAA,CAAA,aAAA,GAAgB,IAAA;AAEhB,IAAA,IAAA,CAAA,QAAA,GAAW;AAAA,MACP,IAAA,EAAM;AAAA,KACV;AAEA,IAAA,IAAA,CAAA,UAAA,GAA+C;AAAA,MAC3C;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS,CAAC,GAAG,CAAA;AAAA,QACb,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,6CAAA;AAAA,QACb,QAAA,EAAU;AAAA,OACd;AAAA,MACA;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS,CAAC,GAAG,CAAA;AAAA,QACb,IAAA,EAAM,OAAA;AAAA,QACN,WAAA,EAAa,sCAAA;AAAA,QACb,QAAA,EAAU;AAAA,OACd;AAAA,MACA;AAAA,QACI,IAAA,EAAM,aAAA;AAAA,QACN,IAAA,EAAM,SAAA;AAAA,QACN,WAAA,EAAa,uBAAA;AAAA,QACb,QAAA,EAAU;AAAA,OACd;AAAA,MACA;AAAA,QACI,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM,SAAA;AAAA,QACN,WAAA,EAAa,yDAAA;AAAA,QACb,QAAA,EAAU;AAAA;AACd,KACJ;AAEA,IAAA,IAAA,CAAA,UAAA,GAAqC,EAAC;AAAA,EAAA;AAAA,EAEtC,MAAM,cAAA,CACF,OAAA,EACA,OAAA,EACa;AACb,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAK;AAChC,IAAA,IAAI,CAAC,GAAA,EAAK;AACN,MAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,0DAA0D,CAAA;AACpF,MAAA,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAC,CAAA;AACtB,MAAA;AAAA,IACJ;AAEA,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI;AACA,MAAA,SAAA,GAAY,IAAI,IAAI,GAAG,CAAA;AAAA,IAC3B,CAAA,CAAA,MAAQ;AACJ,MAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,CAAA,aAAA,EAAgB,GAAG,CAAA,CAAE,CAAA;AAC/C,MAAA,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAC,CAAA;AACtB,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,IAAK,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,IACtD,IAAA,CAAK,gBAAA,CAAiB,SAAS,CAAA;AAEtC,IAAA,MAAM,UAAkC,EAAC;AACzC,IAAA,MAAM,aAAa,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,IAAK,OAAA,CAAQ,KAAK,GAAG,CAAA;AAC7D,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,GAAI,UAAA,GAAa,CAAC,UAAU,CAAA;AACvE,MAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AACxB,QAAA,MAAM,QAAA,GAAW,CAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAC9B,QAAA,IAAI,WAAW,CAAA,EAAG;AACd,UAAA,OAAA,CAAQ,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,CAAE,IAAA,EAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,QAAA,GAAW,CAAC,EAAE,IAAA,EAAK;AAAA,QACtE;AAAA,MACJ;AAAA,IACJ;AAEA,IAAA,MAAM,YAAA,GAAe,CAAC,OAAA,CAAQ,IAAA,CAAK,aAAa,CAAA;AAChD,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAC,OAAA,CAAQ,KAAK,MAAM,CAAA;AAE3C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,uBAAA,CAAwB,OAAO,CAAA;AAEzD,IAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAC5C,IAAA,MAAM,WAAW,OAAA,CAAQ,OAAA,CAAQ,UAAU,MAAM,eAAA,CAAgB,OAAO,CAAA;AAExE,IAAA,IAAI;AACA,MAAA,IAAI,YAAA,EAAc;AACd,QAAA,OAAA,CAAQ,OAAA,EAAS,IAAA,CAAK,CAAA,cAAA,EAAiB,SAAA,CAAU,QAAQ,CAAA,GAAA,CAAK,CAAA;AAAA,MAClE;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAC9B,OAAA;AAAA,QACA,QAAQ,eAAA,CAAgB;AAAA,OAC3B,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AACd,QAAA,OAAA,CAAQ,SAAS,IAAA,EAAK;AACtB,QAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAC3E,QAAA,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAC,CAAA;AACtB,QAAA;AAAA,MACJ;AAEA,MAAA,MAAM,aAAA,GAAgB,SAAS,QAAA,CAAS,OAAA,CAAQ,IAAI,gBAAgB,CAAA,IAAK,KAAK,EAAE,CAAA;AAChF,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,EAAA;AAE5D,MAAA,OAAA,CAAQ,SAAS,IAAA,EAAK;AAEtB,MAAA,IAAI,YAAA,IAAgB,gBAAgB,CAAA,EAAG;AACnC,QAAA,OAAA,CAAQ,WAAA,CAAY,IAAA,CAAK,CAAA,YAAA,EAAe,UAAU,CAAA,CAAE,CAAA;AAAA,MACxD,WAAW,YAAA,EAAc;AACrB,QAAA,OAAA,CAAQ,OAAA,EAAS,IAAA,CAAK,CAAA,YAAA,EAAe,UAAU,CAAA,GAAA,CAAK,CAAA;AAAA,MACxD;AAEA,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,SAAA,EAAU;AACxC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACT,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,QAAA,IAAI,aAAA,EAAe;AACf,UAAA,YAAA,CAAa,iBAAA,CAAkB,YAAY,IAAI,CAAA;AAAA,QACnD,CAAA,MAAO;AACH,UAAA,MAAM,YAAA,CAAa,SAAA,CAAU,UAAA,EAAY,IAAI,CAAA;AAAA,QACjD;AACA,QAAA,OAAA,CAAQ,SAAS,IAAA,EAAK;AACtB,QAAA,OAAA,CAAQ,MAAA,CAAO,YAAA,CAAa,CAAA,OAAA,EAAU,UAAU,CAAA,CAAE,CAAA;AAClD,QAAA;AAAA,MACJ;AAEA,MAAA,MAAM,SAAuB,EAAC;AAC9B,MAAA,IAAI,aAAA,GAAgB,CAAA;AAEpB,MAAA,OAAO,IAAA,EAAM;AACT,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,QAAA,IAAI,IAAA,EAAM;AAEV,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,QAAA,aAAA,IAAiB,KAAA,CAAM,MAAA;AAEvB,QAAA,IAAI,YAAA,IAAgB,gBAAgB,CAAA,EAAG;AACnC,UAAA,MAAM,WAAW,aAAA,GAAgB,aAAA;AACjC,UAAA,OAAA,CAAQ,WAAA,CAAY,OAAO,QAAQ,CAAA;AACnC,UAAA,OAAA,CAAQ,WAAA,CAAY,OAAA;AAAA,YAChB,CAAA,EAAG,UAAU,CAAA,EAAA,EAAK,IAAA,CAAK,YAAA,CAAa,aAAa,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,YAAA,CAAa,aAAa,CAAC,CAAA,CAAA;AAAA,WAC1F;AAAA,QACJ,WAAW,YAAA,EAAc;AACrB,UAAA,OAAA,CAAQ,OAAA,EAAS,QAAQ,CAAA,YAAA,EAAe,UAAU,OAAO,IAAA,CAAK,YAAA,CAAa,aAAa,CAAC,CAAA,CAAE,CAAA;AAAA,QAC/F;AAAA,MACJ;AAEA,MAAA,MAAM,QAAA,GAAW,IAAI,UAAA,CAAW,aAAa,CAAA;AAC7C,MAAA,IAAI,MAAA,GAAS,CAAA;AACb,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,QAAA,QAAA,CAAS,GAAA,CAAI,OAAO,MAAM,CAAA;AAC1B,QAAA,MAAA,IAAU,KAAA,CAAM,MAAA;AAAA,MACpB;AAEA,MAAA,IAAI,YAAA,IAAgB,gBAAgB,CAAA,EAAG;AACnC,QAAA,OAAA,CAAQ,YAAY,QAAA,EAAS;AAC7B,QAAA,OAAA,CAAQ,YAAY,IAAA,EAAK;AAAA,MAC7B,CAAA,MAAO;AACH,QAAA,OAAA,CAAQ,SAAS,IAAA,EAAK;AAAA,MAC1B;AAEA,MAAA,MAAM,MAAA,GAAS,WAAA,CAAY,QAAA,CAAS,MAAM,CAAA,IAAK,WAAA,CAAY,QAAA,CAAS,MAAM,CAAA,IAAK,WAAA,CAAY,QAAA,CAAS,KAAK,CAAA;AAEzG,MAAA,IAAI,aAAA,EAAe;AACf,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,QAAQ,CAAC,CAAA;AAChC,QAAA,YAAA,CAAa,iBAAA,CAAkB,YAAY,IAAI,CAAA;AAAA,MACnD,WAAW,MAAA,EAAQ;AACf,QAAA,MAAM,IAAA,GAAO,IAAI,WAAA,EAAY,CAAE,OAAO,QAAQ,CAAA;AAC9C,QAAA,MAAM,YAAA,CAAa,SAAA,CAAU,UAAA,EAAY,IAAI,CAAA;AAAA,MACjD,CAAA,MAAO;AAEH,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,mBAAA,CAAoB,QAAQ,CAAA;AAChD,QAAA,MAAM,OAAA,GAAU,CAAA,KAAA,EAAQ,WAAA,IAAe,0BAA0B,WAAW,MAAM,CAAA,CAAA;AAClF,QAAA,MAAM,YAAA,CAAa,SAAA,CAAU,UAAA,EAAY,OAAO,CAAA;AAAA,MACpD;AAEA,MAAA,OAAA,CAAQ,MAAA,CAAO,aAAa,CAAA,YAAA,EAAe,UAAU,KAAK,IAAA,CAAK,YAAA,CAAa,aAAa,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IACjG,SAAS,GAAA,EAAU;AACf,MAAA,OAAA,CAAQ,SAAS,IAAA,EAAK;AACtB,MAAA,OAAA,CAAQ,YAAY,IAAA,EAAK;AAEzB,MAAA,IAAI,GAAA,CAAI,SAAS,YAAA,EAAc;AAC3B,QAAA,OAAA,CAAQ,MAAA,CAAO,aAAa,qBAAqB,CAAA;AAAA,MACrD,CAAA,MAAO;AACH,QAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,CAAA,iBAAA,EAAoB,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AAAA,MAC/D;AACA,MAAA,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAC1B,CAAA,SAAE;AACE,MAAA,QAAA,CAAS,WAAA,EAAY;AAAA,IACzB;AAAA,EACJ;AAAA,EAEA,iBAAiB,OAAA,EAAqC;AAClD,IAAA,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,WAAY,CAAA;AAAA,EAC5C;AAAA,EAEQ,wBAAwB,OAAA,EAAwD;AACpF,IAAA,IAAI;AACA,MAAA,OAAO,OAAA,CAAQ,QAAA,CAAS,GAAA,CAA6B,6BAA6B,CAAA;AAAA,IACtF,CAAA,CAAA,MAAQ;AACJ,MAAA,OAAO,IAAI,0BAAA,EAA2B;AAAA,IAC1C;AAAA,EACJ;AAAA,EAEQ,iBAAiB,GAAA,EAAkB;AACvC,IAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AACrB,IAAA,MAAM,WAAW,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AACnD,IAAA,OAAO,SAAS,MAAA,GAAS,CAAA,GAAI,SAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,GAAI,UAAA;AAAA,EACjE;AAAA,EAEQ,oBAAoB,KAAA,EAA2B;AACnD,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACnC,MAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IAC1C;AACA,IAAA,OAAO,KAAK,MAAM,CAAA;AAAA,EACtB;AAAA,EAEQ,aAAa,KAAA,EAAuB;AACxC,IAAA,IAAI,KAAA,GAAQ,IAAA,EAAM,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA;AACjC,IAAA,IAAI,KAAA,GAAQ,OAAO,IAAA,EAAM,OAAO,IAAI,KAAA,GAAQ,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC5D,IAAA,IAAI,KAAA,GAAQ,IAAA,GAAO,IAAA,GAAO,IAAA,EAAM,OAAO,CAAA,EAAA,CAAI,KAAA,IAAS,IAAA,GAAO,IAAA,CAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC5E,IAAA,OAAO,IAAI,KAAA,IAAS,IAAA,GAAO,OAAO,IAAA,CAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAAA,EACvD;AACJ;;;ACvOO,IAAM,UAAA,GAAyB;AAAA,EAClC,UAAA,EAAY,WAAA;AAAA,EACZ,IAAA,EAAM,mBAAA;AAAA,EACN,UAAA,EAAY,CAAC,IAAI,8BAAA,EAAgC,CAAA;AAAA,EACjD,YAAA,EAAc;AAAA,IACV,EAAA,EAAI,EAAE,sBAAA,EAAwB,mDAAA,EAAoD;AAAA,IAClF,EAAA,EAAI,EAAE,sBAAA,EAAwB,0DAAA,EAAqD;AAAA,IACnF,EAAA,EAAI,EAAE,sBAAA,EAAwB,sDAAA,EAAuD;AAAA,IACrF,EAAA,EAAI,EAAE,sBAAA,EAAwB,4CAAA,EAA6C;AAAA,IAC3E,EAAA,EAAI,EAAE,sBAAA,EAAwB,4CAAA,EAA6C;AAAA,IAC3E,EAAA,EAAI,EAAE,sBAAA,EAAwB,8FAAA,EAA8B;AAAA,IAC5D,EAAA,EAAI,EAAE,sBAAA,EAAwB,kEAAA,EAA2B;AAAA,IACzD,EAAA,EAAI,EAAE,sBAAA,EAAwB,4DAAA,EAA0B;AAAA,IACxD,EAAA,EAAI,EAAE,sBAAA,EAAwB,2HAAA,EAAkC;AAAA,IAChE,EAAA,EAAI,EAAE,sBAAA,EAAwB,uDAAA;AAA8C;AAEpF","file":"public-api.mjs","sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-beta.1';\nexport const API_VERSION = 2;\n ","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliCommandParameterDescriptor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n BrowserFileTransferService,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\n\nexport class CliWgetCommandCommandProcessor implements ICliCommandProcessor {\n command = 'wget';\n\n description = 'Download files from any HTTP/HTTPS URL';\n\n author = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n acceptsRawInput = true;\n\n valueRequired = true;\n\n metadata = {\n icon: '⬇',\n };\n\n parameters: ICliCommandParameterDescriptor[] = [\n {\n name: 'output',\n aliases: ['o'],\n type: 'string',\n description: 'Output filename (default: derived from URL)',\n required: false,\n },\n {\n name: 'header',\n aliases: ['H'],\n type: 'array',\n description: 'Custom HTTP header (can be repeated)',\n required: false,\n },\n {\n name: 'no-progress',\n type: 'boolean',\n description: 'Suppress progress bar',\n required: false,\n },\n {\n name: 'save',\n type: 'boolean',\n description: 'Save to browser downloads instead of virtual filesystem',\n required: false,\n },\n ];\n\n processors: ICliCommandProcessor[] = [];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const url = command.value?.trim();\n if (!url) {\n context.writer.writeError('Usage: wget <url> [-o filename] [--header \"Name: Value\"]');\n context.process.exit(1);\n return;\n }\n\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(url);\n } catch {\n context.writer.writeError(`Invalid URL: ${url}`);\n context.process.exit(1);\n return;\n }\n\n const outputName = command.args['output'] || command.args['o']\n || this._filenameFromUrl(parsedUrl);\n\n const headers: Record<string, string> = {};\n const rawHeaders = command.args['header'] || command.args['H'];\n if (rawHeaders) {\n const headerList = Array.isArray(rawHeaders) ? rawHeaders : [rawHeaders];\n for (const h of headerList) {\n const colonIdx = h.indexOf(':');\n if (colonIdx > 0) {\n headers[h.slice(0, colonIdx).trim()] = h.slice(colonIdx + 1).trim();\n }\n }\n }\n\n const showProgress = !command.args['no-progress'];\n const saveToBrowser = !!command.args['save'];\n\n const fileTransfer = this._getFileTransferService(context);\n\n const abortController = new AbortController();\n const abortSub = context.onAbort.subscribe(() => abortController.abort());\n\n try {\n if (showProgress) {\n context.spinner?.show(`Connecting to ${parsedUrl.hostname}...`);\n }\n\n const response = await fetch(url, {\n headers,\n signal: abortController.signal,\n });\n\n if (!response.ok) {\n context.spinner?.hide();\n context.writer.writeError(`HTTP ${response.status}: ${response.statusText}`);\n context.process.exit(1);\n return;\n }\n\n const contentLength = parseInt(response.headers.get('content-length') || '0', 10);\n const contentType = response.headers.get('content-type') || '';\n\n context.spinner?.hide();\n\n if (showProgress && contentLength > 0) {\n context.progressBar.show(`Downloading ${outputName}`);\n } else if (showProgress) {\n context.spinner?.show(`Downloading ${outputName}...`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n const text = await response.text();\n if (saveToBrowser) {\n fileTransfer.downloadToBrowser(outputName, text);\n } else {\n await fileTransfer.writeFile(outputName, text);\n }\n context.spinner?.hide();\n context.writer.writeSuccess(`Saved: ${outputName}`);\n return;\n }\n\n const chunks: Uint8Array[] = [];\n let receivedBytes = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n chunks.push(value);\n receivedBytes += value.length;\n\n if (showProgress && contentLength > 0) {\n const progress = receivedBytes / contentLength;\n context.progressBar.update(progress);\n context.progressBar.setText(\n `${outputName} (${this._formatBytes(receivedBytes)}/${this._formatBytes(contentLength)})`,\n );\n } else if (showProgress) {\n context.spinner?.setText(`Downloading ${outputName}... ${this._formatBytes(receivedBytes)}`);\n }\n }\n\n const combined = new Uint8Array(receivedBytes);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n if (showProgress && contentLength > 0) {\n context.progressBar.complete();\n context.progressBar.hide();\n } else {\n context.spinner?.hide();\n }\n\n const isText = contentType.includes('text') || contentType.includes('json') || contentType.includes('xml');\n\n if (saveToBrowser) {\n const blob = new Blob([combined]);\n fileTransfer.downloadToBrowser(outputName, blob);\n } else if (isText) {\n const text = new TextDecoder().decode(combined);\n await fileTransfer.writeFile(outputName, text);\n } else {\n // Binary file — encode as base64 and save to virtual filesystem\n const base64 = this._uint8ArrayToBase64(combined);\n const dataUri = `data:${contentType || 'application/octet-stream'};base64,${base64}`;\n await fileTransfer.writeFile(outputName, dataUri);\n }\n\n context.writer.writeSuccess(`Downloaded: ${outputName} (${this._formatBytes(receivedBytes)})`);\n } catch (err: any) {\n context.spinner?.hide();\n context.progressBar.hide();\n\n if (err.name === 'AbortError') {\n context.writer.writeWarning('Download cancelled.');\n } else {\n context.writer.writeError(`Download failed: ${err.message}`);\n }\n context.process.exit(1);\n } finally {\n abortSub.unsubscribe();\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln(this.description!);\n }\n\n private _getFileTransferService(context: ICliExecutionContext): ICliFileTransferService {\n try {\n return context.services.get<ICliFileTransferService>(ICliFileTransferService_TOKEN);\n } catch {\n return new BrowserFileTransferService();\n }\n }\n\n private _filenameFromUrl(url: URL): string {\n const pathname = url.pathname;\n const segments = pathname.split('/').filter(Boolean);\n return segments.length > 0 ? segments[segments.length - 1] : 'download';\n }\n\n private _uint8ArrayToBase64(bytes: Uint8Array): string {\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n }\n\n private _formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n }\n}\n","/*\n * Public API Surface of wget\n */\n\nexport * from './lib/processors/cli-wget-command-processor';\nexport * from './lib/version';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliWgetCommandCommandProcessor } from './lib/processors/cli-wget-command-processor';\nimport { API_VERSION } from './lib/version';\n\nexport const wgetModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-wget',\n processors: [new CliWgetCommandCommandProcessor()],\n translations: {\n es: { 'cli.wget.description': 'Descargar archivos desde cualquier URL HTTP/HTTPS' },\n fr: { 'cli.wget.description': 'Télécharger des fichiers depuis une URL HTTP/HTTPS' },\n de: { 'cli.wget.description': 'Dateien von beliebigen HTTP/HTTPS-URLs herunterladen' },\n pt: { 'cli.wget.description': 'Baixar arquivos de qualquer URL HTTP/HTTPS' },\n it: { 'cli.wget.description': 'Scaricare file da qualsiasi URL HTTP/HTTPS' },\n ja: { 'cli.wget.description': 'HTTP/HTTPS URLからファイルをダウンロード' },\n ko: { 'cli.wget.description': 'HTTP/HTTPS URL에서 파일 다운로드' },\n zh: { 'cli.wget.description': '从任意 HTTP/HTTPS URL 下载文件' },\n ru: { 'cli.wget.description': 'Скачивание файлов по HTTP/HTTPS' },\n ro: { 'cli.wget.description': 'Descarcă fișiere de la orice URL HTTP/HTTPS' },\n },\n};\n"]}