@qodalis/cli-curl 0.0.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/README.md +18 -0
- package/esm2022/lib/cli-curl.module.mjs +19 -0
- package/esm2022/lib/processors/cli-curl-command-processor.mjs +178 -0
- package/esm2022/lib/version.mjs +3 -0
- package/esm2022/public-api.mjs +6 -0
- package/esm2022/qodalis-cli-curl.mjs +5 -0
- package/fesm2022/qodalis-cli-curl.mjs +207 -0
- package/fesm2022/qodalis-cli-curl.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/cli-curl.module.d.ts +6 -0
- package/lib/processors/cli-curl-command-processor.d.ts +19 -0
- package/lib/version.d.ts +1 -0
- package/package.json +44 -0
- package/public-api.d.ts +2 -0
- package/umd/index.js +217 -0
package/README.md
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Cli extension
|
|
2
|
+
|
|
3
|
+
The `@qodalis/cli-curl` package is a CLI extension designed to execute HTTP requests on your server. Supports GET, POST, PUT, DELETE, headers, and body data.
|
|
4
|
+
|
|
5
|
+
# Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
packages add @qodalis/cli-curl
|
|
9
|
+
packages add curl #short version
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
# Usage
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
curl post https://api.example.com/users -d='{"name":"John"}' -H="Content-Type: application/json"
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
This command downloads and registers the extension for use within the CLI environment.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { resolveCommandProcessorProvider } from '@qodalis/angular-cli';
|
|
3
|
+
import { CliCurlCommandProcessor } from './processors/cli-curl-command-processor';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class CliCurlModule {
|
|
6
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliCurlModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
7
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: CliCurlModule }); }
|
|
8
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliCurlModule, providers: [resolveCommandProcessorProvider(CliCurlCommandProcessor)] }); }
|
|
9
|
+
}
|
|
10
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliCurlModule, decorators: [{
|
|
11
|
+
type: NgModule,
|
|
12
|
+
args: [{
|
|
13
|
+
declarations: [],
|
|
14
|
+
imports: [],
|
|
15
|
+
exports: [],
|
|
16
|
+
providers: [resolveCommandProcessorProvider(CliCurlCommandProcessor)],
|
|
17
|
+
}]
|
|
18
|
+
}] });
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWN1cmwubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY3VybC9zcmMvbGliL2NsaS1jdXJsLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOztBQVFsRixNQUFNLE9BQU8sYUFBYTsrR0FBYixhQUFhO2dIQUFiLGFBQWE7Z0hBQWIsYUFBYSxhQUZYLENBQUMsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsQ0FBQzs7NEZBRTVELGFBQWE7a0JBTnpCLFFBQVE7bUJBQUM7b0JBQ04sWUFBWSxFQUFFLEVBQUU7b0JBQ2hCLE9BQU8sRUFBRSxFQUFFO29CQUNYLE9BQU8sRUFBRSxFQUFFO29CQUNYLFNBQVMsRUFBRSxDQUFDLCtCQUErQixDQUFDLHVCQUF1QixDQUFDLENBQUM7aUJBQ3hFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHJlc29sdmVDb21tYW5kUHJvY2Vzc29yUHJvdmlkZXIgfSBmcm9tICdAcW9kYWxpcy9hbmd1bGFyLWNsaSc7XG5pbXBvcnQgeyBDbGlDdXJsQ29tbWFuZFByb2Nlc3NvciB9IGZyb20gJy4vcHJvY2Vzc29ycy9jbGktY3VybC1jb21tYW5kLXByb2Nlc3Nvcic7XG5cbkBOZ01vZHVsZSh7XG4gICAgZGVjbGFyYXRpb25zOiBbXSxcbiAgICBpbXBvcnRzOiBbXSxcbiAgICBleHBvcnRzOiBbXSxcbiAgICBwcm92aWRlcnM6IFtyZXNvbHZlQ29tbWFuZFByb2Nlc3NvclByb3ZpZGVyKENsaUN1cmxDb21tYW5kUHJvY2Vzc29yKV0sXG59KVxuZXhwb3J0IGNsYXNzIENsaUN1cmxNb2R1bGUge31cbiJdfQ==
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { DefaultLibraryAuthor, } from '@qodalis/cli-core';
|
|
3
|
+
import { LIBRARY_VERSION } from '../version';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class CliCurlCommandProcessor {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.command = 'curl';
|
|
8
|
+
this.description = 'A command-line tool to execute HTTP requests on your server. Supports GET, POST, PUT, DELETE, headers, and body data.';
|
|
9
|
+
this.author = DefaultLibraryAuthor;
|
|
10
|
+
this.version = LIBRARY_VERSION;
|
|
11
|
+
this.processors = [];
|
|
12
|
+
this.metadata = {
|
|
13
|
+
icon: '🌐',
|
|
14
|
+
};
|
|
15
|
+
this.registerSubProcessors();
|
|
16
|
+
}
|
|
17
|
+
async processCommand(command, context) {
|
|
18
|
+
context.executor.showHelp(command, context);
|
|
19
|
+
}
|
|
20
|
+
writeDescription(context) {
|
|
21
|
+
context.writer.writeln(this.description);
|
|
22
|
+
context.writer.writeln();
|
|
23
|
+
context.writer.writeln('Usage:');
|
|
24
|
+
context.writer.writeln(' curl <method> <url> [options]');
|
|
25
|
+
context.writer.writeln();
|
|
26
|
+
context.writer.writeln('Options:');
|
|
27
|
+
context.writer.writeln(' -H, --header Add custom headers (e.g., -H="Authorization: Bearer <token>")');
|
|
28
|
+
context.writer.writeln(' -d, --data Add request body');
|
|
29
|
+
context.writer.writeln(' --verbose Print detailed response');
|
|
30
|
+
context.writer.writeln();
|
|
31
|
+
context.writer.writeln('Examples:');
|
|
32
|
+
context.writer.writeln(' curl get https://api.example.com/users');
|
|
33
|
+
context.writer.writeln(' curl post https://api.example.com/users -d=\'{"name":"John"}\' -H="Content-Type: application/json"');
|
|
34
|
+
context.writer.writeln();
|
|
35
|
+
context.writer.writeWarning('Note: The server must allow CORS for this tool to work.');
|
|
36
|
+
}
|
|
37
|
+
async initialize(context) { }
|
|
38
|
+
registerSubProcessors() {
|
|
39
|
+
this.processors = [
|
|
40
|
+
{
|
|
41
|
+
command: 'get',
|
|
42
|
+
description: 'Perform an HTTP GET request',
|
|
43
|
+
valueRequired: true,
|
|
44
|
+
parameters: [
|
|
45
|
+
{
|
|
46
|
+
name: 'header',
|
|
47
|
+
aliases: ['H'],
|
|
48
|
+
type: 'array',
|
|
49
|
+
description: 'Add custom headers. Accept multiple headers.',
|
|
50
|
+
required: false,
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
processCommand: async (command, context) => {
|
|
54
|
+
await this.executeRequest('GET', command, context);
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
command: 'post',
|
|
59
|
+
description: 'Perform an HTTP POST request',
|
|
60
|
+
valueRequired: true,
|
|
61
|
+
parameters: [
|
|
62
|
+
{
|
|
63
|
+
name: 'header',
|
|
64
|
+
aliases: ['H'],
|
|
65
|
+
type: 'array',
|
|
66
|
+
description: 'Add custom headers',
|
|
67
|
+
required: false,
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: 'data',
|
|
71
|
+
aliases: ['d'],
|
|
72
|
+
type: 'string',
|
|
73
|
+
description: 'Request body',
|
|
74
|
+
required: false,
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
processCommand: async (command, context) => {
|
|
78
|
+
await this.executeRequest('POST', command, context);
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
command: 'put',
|
|
83
|
+
description: 'Perform an HTTP PUT request',
|
|
84
|
+
valueRequired: true,
|
|
85
|
+
parameters: [
|
|
86
|
+
{
|
|
87
|
+
name: 'header',
|
|
88
|
+
aliases: ['H'],
|
|
89
|
+
type: 'array',
|
|
90
|
+
description: 'Add custom headers',
|
|
91
|
+
required: false,
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: 'data',
|
|
95
|
+
aliases: ['d'],
|
|
96
|
+
type: 'string',
|
|
97
|
+
description: 'Request body',
|
|
98
|
+
required: false,
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
processCommand: async (command, context) => {
|
|
102
|
+
await this.executeRequest('PUT', command, context);
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
command: 'delete',
|
|
107
|
+
description: 'Perform an HTTP DELETE request',
|
|
108
|
+
valueRequired: true,
|
|
109
|
+
parameters: [
|
|
110
|
+
{
|
|
111
|
+
name: 'header',
|
|
112
|
+
aliases: ['H'],
|
|
113
|
+
type: 'array',
|
|
114
|
+
description: 'Add custom headers',
|
|
115
|
+
required: false,
|
|
116
|
+
},
|
|
117
|
+
],
|
|
118
|
+
processCommand: async (command, context) => {
|
|
119
|
+
await this.executeRequest('DELETE', command, context);
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
];
|
|
123
|
+
}
|
|
124
|
+
async executeRequest(method, command, context) {
|
|
125
|
+
const url = command.value;
|
|
126
|
+
const headers = command.args['header'] || command.args['H'] || [];
|
|
127
|
+
const data = command.args['data'] || command.args['d'];
|
|
128
|
+
const verbose = !!command.args['verbose'];
|
|
129
|
+
if (!url) {
|
|
130
|
+
context.writer.writeError('URL is required.');
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
// Prepare headers
|
|
134
|
+
const headersObject = headers.reduce((acc, header) => {
|
|
135
|
+
const [key, value] = header.split(':').map((str) => str.trim());
|
|
136
|
+
if (key && value)
|
|
137
|
+
acc[key] = value;
|
|
138
|
+
return acc;
|
|
139
|
+
}, {});
|
|
140
|
+
// Prepare request options
|
|
141
|
+
const options = {
|
|
142
|
+
method,
|
|
143
|
+
headers: headersObject,
|
|
144
|
+
body: data ? JSON.stringify(JSON.parse(data)) : undefined,
|
|
145
|
+
};
|
|
146
|
+
try {
|
|
147
|
+
const response = await fetch(url, options);
|
|
148
|
+
const text = await response.text();
|
|
149
|
+
context.writer.writeSuccess('Request successful:');
|
|
150
|
+
if (verbose) {
|
|
151
|
+
context.writer.writeln(`Status: ${response.status}`);
|
|
152
|
+
context.writer.writeln(`Headers: ${JSON.stringify(response.headers, null, 2)}`);
|
|
153
|
+
}
|
|
154
|
+
context.writer.writeln(text);
|
|
155
|
+
context.process.output(text);
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
context.writer.writeError(`Request failed: ${error}`);
|
|
159
|
+
context.process.exit(-1);
|
|
160
|
+
}
|
|
161
|
+
finally {
|
|
162
|
+
context.writer.writeln();
|
|
163
|
+
context.writer.writeInfo('Equivalent curl command:');
|
|
164
|
+
context.writer.writeln(this.generateCurlCommand(url, method, headers, data));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
generateCurlCommand(url, method, headers, data) {
|
|
168
|
+
const headerString = headers.map((h) => `-H "${h}"`).join(' ');
|
|
169
|
+
const dataString = data ? `-d '${data}'` : '';
|
|
170
|
+
return `curl -X ${method} ${headerString} ${dataString} "${url}"`;
|
|
171
|
+
}
|
|
172
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliCurlCommandProcessor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
173
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliCurlCommandProcessor }); }
|
|
174
|
+
}
|
|
175
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliCurlCommandProcessor, decorators: [{
|
|
176
|
+
type: Injectable
|
|
177
|
+
}], ctorParameters: function () { return []; } });
|
|
178
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWN1cmwtY29tbWFuZC1wcm9jZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jdXJsL3NyYy9saWIvcHJvY2Vzc29ycy9jbGktY3VybC1jb21tYW5kLXByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFHSCxvQkFBb0IsR0FHdkIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sWUFBWSxDQUFDOztBQUc3QyxNQUFNLE9BQU8sdUJBQXVCO0lBZ0JoQztRQWZBLFlBQU8sR0FBRyxNQUFNLENBQUM7UUFFakIsZ0JBQVcsR0FDUCx1SEFBdUgsQ0FBQztRQUU1SCxXQUFNLEdBQUcsb0JBQW9CLENBQUM7UUFFOUIsWUFBTyxHQUFHLGVBQWUsQ0FBQztRQUUxQixlQUFVLEdBQXdDLEVBQUUsQ0FBQztRQUVyRCxhQUFRLEdBQXNDO1lBQzFDLElBQUksRUFBRSxJQUFJO1NBQ2IsQ0FBQztRQUdFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxLQUFLLENBQUMsY0FBYyxDQUNoQixPQUEwQixFQUMxQixPQUE2QjtRQUU3QixPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELGdCQUFnQixDQUFDLE9BQTZCO1FBQzFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFZLENBQUMsQ0FBQztRQUMxQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3pCLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGlDQUFp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QUFVLEtBQUssR0FBRyxHQUFHLENBQUM7SUFDdEUsQ0FBQzsrR0FqTlEsdUJBQXVCO21IQUF2Qix1QkFBdUI7OzRGQUF2Qix1QkFBdUI7a0JBRG5DLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENsaVByb2Nlc3NDb21tYW5kLFxuICAgIENsaVByb2Nlc3Nvck1ldGFkYXRhLFxuICAgIERlZmF1bHRMaWJyYXJ5QXV0aG9yLFxuICAgIElDbGlDb21tYW5kUHJvY2Vzc29yLFxuICAgIElDbGlFeGVjdXRpb25Db250ZXh0LFxufSBmcm9tICdAcW9kYWxpcy9jbGktY29yZSc7XG5pbXBvcnQgeyBMSUJSQVJZX1ZFUlNJT04gfSBmcm9tICcuLi92ZXJzaW9uJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENsaUN1cmxDb21tYW5kUHJvY2Vzc29yIGltcGxlbWVudHMgSUNsaUNvbW1hbmRQcm9jZXNzb3Ige1xuICAgIGNvbW1hbmQgPSAnY3VybCc7XG5cbiAgICBkZXNjcmlwdGlvbiA9XG4gICAgICAgICdBIGNvbW1hbmQtbGluZSB0b29sIHRvIGV4ZWN1dGUgSFRUUCByZXF1ZXN0cyBvbiB5b3VyIHNlcnZlci4gU3VwcG9ydHMgR0VULCBQT1NULCBQVVQsIERFTEVURSwgaGVhZGVycywgYW5kIGJvZHkgZGF0YS4nO1xuXG4gICAgYXV0aG9yID0gRGVmYXVsdExpYnJhcnlBdXRob3I7XG5cbiAgICB2ZXJzaW9uID0gTElCUkFSWV9WRVJTSU9OO1xuXG4gICAgcHJvY2Vzc29ycz86IElDbGlDb21tYW5kUHJvY2Vzc29yW10gfCB1bmRlZmluZWQgPSBbXTtcblxuICAgIG1ldGFkYXRhPzogQ2xpUHJvY2Vzc29yTWV0YWRhdGEgfCB1bmRlZmluZWQgPSB7XG4gICAgICAgIGljb246ICfwn4yQJyxcbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJTdWJQcm9jZXNzb3JzKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgcHJvY2Vzc0NvbW1hbmQoXG4gICAgICAgIGNvbW1hbmQ6IENsaVByb2Nlc3NDb21tYW5kLFxuICAgICAgICBjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCxcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29udGV4dC5leGVjdXRvci5zaG93SGVscChjb21tYW5kLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICB3cml0ZURlc2NyaXB0aW9uKGNvbnRleHQ6IElDbGlFeGVjdXRpb25Db250ZXh0KTogdm9pZCB7XG4gICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlbG4odGhpcy5kZXNjcmlwdGlvbiEpO1xuICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKCk7XG4gICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlbG4oJ1VzYWdlOicpO1xuICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKCcgIGN1cmwgPG1ldGhvZD4gPHVybD4gW29wdGlvbnNdJyk7XG4gICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlbG4oKTtcbiAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbignT3B0aW9uczonKTtcbiAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICcgIC1ILCAtLWhlYWRlciAgICAgQWRkIGN1c3RvbSBoZWFkZXJzIChlLmcuLCAtSD1cIkF1dGhvcml6YXRpb246IEJlYXJlciA8dG9rZW4+XCIpJyxcbiAgICAgICAgKTtcbiAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbignICAtZCwgLS1kYXRhICAgICAgIEFkZCByZXF1ZXN0IGJvZHknKTtcbiAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbignICAtLXZlcmJvc2UgICAgUHJpbnQgZGV0YWlsZWQgcmVzcG9uc2UnKTtcbiAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbigpO1xuICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKCdFeGFtcGxlczonKTtcbiAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbignICBjdXJsIGdldCBodHRwczovL2FwaS5leGFtcGxlLmNvbS91c2VycycpO1xuICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgJyAgY3VybCBwb3N0IGh0dHBzOi8vYXBpLmV4YW1wbGUuY29tL3VzZXJzIC1kPVxcJ3tcIm5hbWVcIjpcIkpvaG5cIn1cXCcgLUg9XCJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cIicsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlbG4oKTtcblxuICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZVdhcm5pbmcoXG4gICAgICAgICAgICAnTm90ZTogVGhlIHNlcnZlciBtdXN0IGFsbG93IENPUlMgZm9yIHRoaXMgdG9vbCB0byB3b3JrLicsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdGlhbGl6ZShjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge31cblxuICAgIHByaXZhdGUgcmVnaXN0ZXJTdWJQcm9jZXNzb3JzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnByb2Nlc3NvcnMgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tbWFuZDogJ2dldCcsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdQZXJmb3JtIGFuIEhUVFAgR0VUIHJlcXVlc3QnLFxuICAgICAgICAgICAgICAgIHZhbHVlUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnaGVhZGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsnSCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBZGQgY3VzdG9tIGhlYWRlcnMuIEFjY2VwdCBtdWx0aXBsZSBoZWFkZXJzLicsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWFuZDogYXN5bmMgKGNvbW1hbmQsIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRlUmVxdWVzdCgnR0VUJywgY29tbWFuZCwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tbWFuZDogJ3Bvc3QnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnUGVyZm9ybSBhbiBIVFRQIFBPU1QgcmVxdWVzdCcsXG4gICAgICAgICAgICAgICAgdmFsdWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdoZWFkZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNlczogWydIJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdBZGQgY3VzdG9tIGhlYWRlcnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZGF0YScsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc2VzOiBbJ2QnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdSZXF1ZXN0IGJvZHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0NvbW1hbmQ6IGFzeW5jIChjb21tYW5kLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZVJlcXVlc3QoJ1BPU1QnLCBjb21tYW5kLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAncHV0JyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1BlcmZvcm0gYW4gSFRUUCBQVVQgcmVxdWVzdCcsXG4gICAgICAgICAgICAgICAgdmFsdWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdoZWFkZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNlczogWydIJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdBZGQgY3VzdG9tIGhlYWRlcnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZGF0YScsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc2VzOiBbJ2QnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdSZXF1ZXN0IGJvZHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0NvbW1hbmQ6IGFzeW5jIChjb21tYW5kLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZVJlcXVlc3QoJ1BVVCcsIGNvbW1hbmQsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICdkZWxldGUnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnUGVyZm9ybSBhbiBIVFRQIERFTEVURSByZXF1ZXN0JyxcbiAgICAgICAgICAgICAgICB2YWx1ZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2hlYWRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc2VzOiBbJ0gnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0FkZCBjdXN0b20gaGVhZGVycycsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWFuZDogYXN5bmMgKGNvbW1hbmQsIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRlUmVxdWVzdCgnREVMRVRFJywgY29tbWFuZCwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBleGVjdXRlUmVxdWVzdChcbiAgICAgICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgICAgIGNvbW1hbmQ6IENsaVByb2Nlc3NDb21tYW5kLFxuICAgICAgICBjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCxcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgdXJsID0gY29tbWFuZC52YWx1ZTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IGNvbW1hbmQuYXJnc1snaGVhZGVyJ10gfHwgY29tbWFuZC5hcmdzWydIJ10gfHwgW107XG4gICAgICAgIGNvbnN0IGRhdGEgPSBjb21tYW5kLmFyZ3NbJ2RhdGEnXSB8fCBjb21tYW5kLmFyZ3NbJ2QnXTtcbiAgICAgICAgY29uc3QgdmVyYm9zZSA9ICEhY29tbWFuZC5hcmdzWyd2ZXJib3NlJ107XG5cbiAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlRXJyb3IoJ1VSTCBpcyByZXF1aXJlZC4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByZXBhcmUgaGVhZGVyc1xuICAgICAgICBjb25zdCBoZWFkZXJzT2JqZWN0ID0gaGVhZGVycy5yZWR1Y2UoXG4gICAgICAgICAgICAoYWNjOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBoZWFkZXI6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGhlYWRlci5zcGxpdCgnOicpLm1hcCgoc3RyKSA9PiBzdHIudHJpbSgpKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ICYmIHZhbHVlKSBhY2Nba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge30sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUHJlcGFyZSByZXF1ZXN0IG9wdGlvbnNcbiAgICAgICAgY29uc3Qgb3B0aW9uczogUmVxdWVzdEluaXQgPSB7XG4gICAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzT2JqZWN0LFxuICAgICAgICAgICAgYm9keTogZGF0YSA/IEpTT04uc3RyaW5naWZ5KEpTT04ucGFyc2UoZGF0YSkpIDogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgb3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuXG4gICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZVN1Y2Nlc3MoJ1JlcXVlc3Qgc3VjY2Vzc2Z1bDonKTtcbiAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbihgU3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICBgSGVhZGVyczogJHtKU09OLnN0cmluZ2lmeShyZXNwb25zZS5oZWFkZXJzLCBudWxsLCAyKX1gLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKHRleHQpO1xuXG4gICAgICAgICAgICBjb250ZXh0LnByb2Nlc3Mub3V0cHV0KHRleHQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVFcnJvcihgUmVxdWVzdCBmYWlsZWQ6ICR7ZXJyb3J9YCk7XG4gICAgICAgICAgICBjb250ZXh0LnByb2Nlc3MuZXhpdCgtMSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKCk7XG4gICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZUluZm8oJ0VxdWl2YWxlbnQgY3VybCBjb21tYW5kOicpO1xuICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlQ3VybENvbW1hbmQodXJsLCBtZXRob2QsIGhlYWRlcnMsIGRhdGEpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVDdXJsQ29tbWFuZChcbiAgICAgICAgdXJsOiBzdHJpbmcsXG4gICAgICAgIG1ldGhvZDogc3RyaW5nLFxuICAgICAgICBoZWFkZXJzOiBzdHJpbmdbXSxcbiAgICAgICAgZGF0YT86IHN0cmluZyxcbiAgICApOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBoZWFkZXJTdHJpbmcgPSBoZWFkZXJzLm1hcCgoaCkgPT4gYC1IIFwiJHtofVwiYCkuam9pbignICcpO1xuICAgICAgICBjb25zdCBkYXRhU3RyaW5nID0gZGF0YSA/IGAtZCAnJHtkYXRhfSdgIDogJyc7XG4gICAgICAgIHJldHVybiBgY3VybCAtWCAke21ldGhvZH0gJHtoZWFkZXJTdHJpbmd9ICR7ZGF0YVN0cmluZ30gXCIke3VybH1cImA7XG4gICAgfVxufVxuIl19
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
// Automatically generated during build
|
|
2
|
+
export const LIBRARY_VERSION = '0.0.1';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2N1cmwvc3JjL2xpYi92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLHVDQUF1QztBQUN2QyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vLyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBkdXJpbmcgYnVpbGRcbmV4cG9ydCBjb25zdCBMSUJSQVJZX1ZFUlNJT04gPSAnMC4wLjEnO1xuICAiXX0=
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Public API Surface of string
|
|
3
|
+
*/
|
|
4
|
+
export * from './lib/cli-curl.module';
|
|
5
|
+
export * from './lib/processors/cli-curl-command-processor';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2N1cmwvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLHVCQUF1QixDQUFDO0FBRXRDLGNBQWMsNkNBQTZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIHN0cmluZ1xuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL2NsaS1jdXJsLm1vZHVsZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL3Byb2Nlc3NvcnMvY2xpLWN1cmwtY29tbWFuZC1wcm9jZXNzb3InO1xuIl19
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicW9kYWxpcy1jbGktY3VybC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2N1cmwvc3JjL3FvZGFsaXMtY2xpLWN1cmwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Injectable, NgModule } from '@angular/core';
|
|
3
|
+
import { resolveCommandProcessorProvider } from '@qodalis/angular-cli';
|
|
4
|
+
import { DefaultLibraryAuthor } from '@qodalis/cli-core';
|
|
5
|
+
|
|
6
|
+
// Automatically generated during build
|
|
7
|
+
const LIBRARY_VERSION = '0.0.1';
|
|
8
|
+
|
|
9
|
+
class CliCurlCommandProcessor {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.command = 'curl';
|
|
12
|
+
this.description = 'A command-line tool to execute HTTP requests on your server. Supports GET, POST, PUT, DELETE, headers, and body data.';
|
|
13
|
+
this.author = DefaultLibraryAuthor;
|
|
14
|
+
this.version = LIBRARY_VERSION;
|
|
15
|
+
this.processors = [];
|
|
16
|
+
this.metadata = {
|
|
17
|
+
icon: '🌐',
|
|
18
|
+
};
|
|
19
|
+
this.registerSubProcessors();
|
|
20
|
+
}
|
|
21
|
+
async processCommand(command, context) {
|
|
22
|
+
context.executor.showHelp(command, context);
|
|
23
|
+
}
|
|
24
|
+
writeDescription(context) {
|
|
25
|
+
context.writer.writeln(this.description);
|
|
26
|
+
context.writer.writeln();
|
|
27
|
+
context.writer.writeln('Usage:');
|
|
28
|
+
context.writer.writeln(' curl <method> <url> [options]');
|
|
29
|
+
context.writer.writeln();
|
|
30
|
+
context.writer.writeln('Options:');
|
|
31
|
+
context.writer.writeln(' -H, --header Add custom headers (e.g., -H="Authorization: Bearer <token>")');
|
|
32
|
+
context.writer.writeln(' -d, --data Add request body');
|
|
33
|
+
context.writer.writeln(' --verbose Print detailed response');
|
|
34
|
+
context.writer.writeln();
|
|
35
|
+
context.writer.writeln('Examples:');
|
|
36
|
+
context.writer.writeln(' curl get https://api.example.com/users');
|
|
37
|
+
context.writer.writeln(' curl post https://api.example.com/users -d=\'{"name":"John"}\' -H="Content-Type: application/json"');
|
|
38
|
+
context.writer.writeln();
|
|
39
|
+
context.writer.writeWarning('Note: The server must allow CORS for this tool to work.');
|
|
40
|
+
}
|
|
41
|
+
async initialize(context) { }
|
|
42
|
+
registerSubProcessors() {
|
|
43
|
+
this.processors = [
|
|
44
|
+
{
|
|
45
|
+
command: 'get',
|
|
46
|
+
description: 'Perform an HTTP GET request',
|
|
47
|
+
valueRequired: true,
|
|
48
|
+
parameters: [
|
|
49
|
+
{
|
|
50
|
+
name: 'header',
|
|
51
|
+
aliases: ['H'],
|
|
52
|
+
type: 'array',
|
|
53
|
+
description: 'Add custom headers. Accept multiple headers.',
|
|
54
|
+
required: false,
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
processCommand: async (command, context) => {
|
|
58
|
+
await this.executeRequest('GET', command, context);
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
command: 'post',
|
|
63
|
+
description: 'Perform an HTTP POST request',
|
|
64
|
+
valueRequired: true,
|
|
65
|
+
parameters: [
|
|
66
|
+
{
|
|
67
|
+
name: 'header',
|
|
68
|
+
aliases: ['H'],
|
|
69
|
+
type: 'array',
|
|
70
|
+
description: 'Add custom headers',
|
|
71
|
+
required: false,
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: 'data',
|
|
75
|
+
aliases: ['d'],
|
|
76
|
+
type: 'string',
|
|
77
|
+
description: 'Request body',
|
|
78
|
+
required: false,
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
processCommand: async (command, context) => {
|
|
82
|
+
await this.executeRequest('POST', command, context);
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
command: 'put',
|
|
87
|
+
description: 'Perform an HTTP PUT request',
|
|
88
|
+
valueRequired: true,
|
|
89
|
+
parameters: [
|
|
90
|
+
{
|
|
91
|
+
name: 'header',
|
|
92
|
+
aliases: ['H'],
|
|
93
|
+
type: 'array',
|
|
94
|
+
description: 'Add custom headers',
|
|
95
|
+
required: false,
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
name: 'data',
|
|
99
|
+
aliases: ['d'],
|
|
100
|
+
type: 'string',
|
|
101
|
+
description: 'Request body',
|
|
102
|
+
required: false,
|
|
103
|
+
},
|
|
104
|
+
],
|
|
105
|
+
processCommand: async (command, context) => {
|
|
106
|
+
await this.executeRequest('PUT', command, context);
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
command: 'delete',
|
|
111
|
+
description: 'Perform an HTTP DELETE request',
|
|
112
|
+
valueRequired: true,
|
|
113
|
+
parameters: [
|
|
114
|
+
{
|
|
115
|
+
name: 'header',
|
|
116
|
+
aliases: ['H'],
|
|
117
|
+
type: 'array',
|
|
118
|
+
description: 'Add custom headers',
|
|
119
|
+
required: false,
|
|
120
|
+
},
|
|
121
|
+
],
|
|
122
|
+
processCommand: async (command, context) => {
|
|
123
|
+
await this.executeRequest('DELETE', command, context);
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
];
|
|
127
|
+
}
|
|
128
|
+
async executeRequest(method, command, context) {
|
|
129
|
+
const url = command.value;
|
|
130
|
+
const headers = command.args['header'] || command.args['H'] || [];
|
|
131
|
+
const data = command.args['data'] || command.args['d'];
|
|
132
|
+
const verbose = !!command.args['verbose'];
|
|
133
|
+
if (!url) {
|
|
134
|
+
context.writer.writeError('URL is required.');
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
// Prepare headers
|
|
138
|
+
const headersObject = headers.reduce((acc, header) => {
|
|
139
|
+
const [key, value] = header.split(':').map((str) => str.trim());
|
|
140
|
+
if (key && value)
|
|
141
|
+
acc[key] = value;
|
|
142
|
+
return acc;
|
|
143
|
+
}, {});
|
|
144
|
+
// Prepare request options
|
|
145
|
+
const options = {
|
|
146
|
+
method,
|
|
147
|
+
headers: headersObject,
|
|
148
|
+
body: data ? JSON.stringify(JSON.parse(data)) : undefined,
|
|
149
|
+
};
|
|
150
|
+
try {
|
|
151
|
+
const response = await fetch(url, options);
|
|
152
|
+
const text = await response.text();
|
|
153
|
+
context.writer.writeSuccess('Request successful:');
|
|
154
|
+
if (verbose) {
|
|
155
|
+
context.writer.writeln(`Status: ${response.status}`);
|
|
156
|
+
context.writer.writeln(`Headers: ${JSON.stringify(response.headers, null, 2)}`);
|
|
157
|
+
}
|
|
158
|
+
context.writer.writeln(text);
|
|
159
|
+
context.process.output(text);
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
context.writer.writeError(`Request failed: ${error}`);
|
|
163
|
+
context.process.exit(-1);
|
|
164
|
+
}
|
|
165
|
+
finally {
|
|
166
|
+
context.writer.writeln();
|
|
167
|
+
context.writer.writeInfo('Equivalent curl command:');
|
|
168
|
+
context.writer.writeln(this.generateCurlCommand(url, method, headers, data));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
generateCurlCommand(url, method, headers, data) {
|
|
172
|
+
const headerString = headers.map((h) => `-H "${h}"`).join(' ');
|
|
173
|
+
const dataString = data ? `-d '${data}'` : '';
|
|
174
|
+
return `curl -X ${method} ${headerString} ${dataString} "${url}"`;
|
|
175
|
+
}
|
|
176
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliCurlCommandProcessor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
177
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliCurlCommandProcessor }); }
|
|
178
|
+
}
|
|
179
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliCurlCommandProcessor, decorators: [{
|
|
180
|
+
type: Injectable
|
|
181
|
+
}], ctorParameters: function () { return []; } });
|
|
182
|
+
|
|
183
|
+
class CliCurlModule {
|
|
184
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliCurlModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
185
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: CliCurlModule }); }
|
|
186
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliCurlModule, providers: [resolveCommandProcessorProvider(CliCurlCommandProcessor)] }); }
|
|
187
|
+
}
|
|
188
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliCurlModule, decorators: [{
|
|
189
|
+
type: NgModule,
|
|
190
|
+
args: [{
|
|
191
|
+
declarations: [],
|
|
192
|
+
imports: [],
|
|
193
|
+
exports: [],
|
|
194
|
+
providers: [resolveCommandProcessorProvider(CliCurlCommandProcessor)],
|
|
195
|
+
}]
|
|
196
|
+
}] });
|
|
197
|
+
|
|
198
|
+
/*
|
|
199
|
+
* Public API Surface of string
|
|
200
|
+
*/
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Generated bundle index. Do not edit.
|
|
204
|
+
*/
|
|
205
|
+
|
|
206
|
+
export { CliCurlCommandProcessor, CliCurlModule };
|
|
207
|
+
//# sourceMappingURL=qodalis-cli-curl.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qodalis-cli-curl.mjs","sources":["../../../projects/curl/src/lib/version.ts","../../../projects/curl/src/lib/processors/cli-curl-command-processor.ts","../../../projects/curl/src/lib/cli-curl.module.ts","../../../projects/curl/src/public-api.ts","../../../projects/curl/src/qodalis-cli-curl.ts"],"sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '0.0.1';\n ","import { Injectable } from '@angular/core';\nimport {\n CliProcessCommand,\n CliProcessorMetadata,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\n\n@Injectable()\nexport class CliCurlCommandProcessor implements ICliCommandProcessor {\n command = 'curl';\n\n description =\n 'A command-line tool to execute HTTP requests on your server. Supports GET, POST, PUT, DELETE, headers, and body data.';\n\n author = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n processors?: ICliCommandProcessor[] | undefined = [];\n\n metadata?: CliProcessorMetadata | undefined = {\n icon: '🌐',\n };\n\n constructor() {\n this.registerSubProcessors();\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n context.executor.showHelp(command, context);\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln(this.description!);\n context.writer.writeln();\n context.writer.writeln('Usage:');\n context.writer.writeln(' curl <method> <url> [options]');\n context.writer.writeln();\n context.writer.writeln('Options:');\n context.writer.writeln(\n ' -H, --header Add custom headers (e.g., -H=\"Authorization: Bearer <token>\")',\n );\n context.writer.writeln(' -d, --data Add request body');\n context.writer.writeln(' --verbose Print detailed response');\n context.writer.writeln();\n context.writer.writeln('Examples:');\n context.writer.writeln(' curl get https://api.example.com/users');\n context.writer.writeln(\n ' curl post https://api.example.com/users -d=\\'{\"name\":\"John\"}\\' -H=\"Content-Type: application/json\"',\n );\n context.writer.writeln();\n\n context.writer.writeWarning(\n 'Note: The server must allow CORS for this tool to work.',\n );\n }\n\n async initialize(context: ICliExecutionContext): Promise<void> {}\n\n private registerSubProcessors(): void {\n this.processors = [\n {\n command: 'get',\n description: 'Perform an HTTP GET request',\n valueRequired: true,\n parameters: [\n {\n name: 'header',\n aliases: ['H'],\n type: 'array',\n description:\n 'Add custom headers. Accept multiple headers.',\n required: false,\n },\n ],\n processCommand: async (command, context) => {\n await this.executeRequest('GET', command, context);\n },\n },\n {\n command: 'post',\n description: 'Perform an HTTP POST request',\n valueRequired: true,\n parameters: [\n {\n name: 'header',\n aliases: ['H'],\n type: 'array',\n description: 'Add custom headers',\n required: false,\n },\n {\n name: 'data',\n aliases: ['d'],\n type: 'string',\n description: 'Request body',\n required: false,\n },\n ],\n processCommand: async (command, context) => {\n await this.executeRequest('POST', command, context);\n },\n },\n {\n command: 'put',\n description: 'Perform an HTTP PUT request',\n valueRequired: true,\n parameters: [\n {\n name: 'header',\n aliases: ['H'],\n type: 'array',\n description: 'Add custom headers',\n required: false,\n },\n {\n name: 'data',\n aliases: ['d'],\n type: 'string',\n description: 'Request body',\n required: false,\n },\n ],\n processCommand: async (command, context) => {\n await this.executeRequest('PUT', command, context);\n },\n },\n {\n command: 'delete',\n description: 'Perform an HTTP DELETE request',\n valueRequired: true,\n parameters: [\n {\n name: 'header',\n aliases: ['H'],\n type: 'array',\n description: 'Add custom headers',\n required: false,\n },\n ],\n processCommand: async (command, context) => {\n await this.executeRequest('DELETE', command, context);\n },\n },\n ];\n }\n\n private async executeRequest(\n method: string,\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const url = command.value;\n const headers = command.args['header'] || command.args['H'] || [];\n const data = command.args['data'] || command.args['d'];\n const verbose = !!command.args['verbose'];\n\n if (!url) {\n context.writer.writeError('URL is required.');\n return;\n }\n\n // Prepare headers\n const headersObject = headers.reduce(\n (acc: Record<string, string>, header: string) => {\n const [key, value] = header.split(':').map((str) => str.trim());\n if (key && value) acc[key] = value;\n return acc;\n },\n {},\n );\n\n // Prepare request options\n const options: RequestInit = {\n method,\n headers: headersObject,\n body: data ? JSON.stringify(JSON.parse(data)) : undefined,\n };\n\n try {\n const response = await fetch(url, options);\n const text = await response.text();\n\n context.writer.writeSuccess('Request successful:');\n if (verbose) {\n context.writer.writeln(`Status: ${response.status}`);\n context.writer.writeln(\n `Headers: ${JSON.stringify(response.headers, null, 2)}`,\n );\n }\n context.writer.writeln(text);\n\n context.process.output(text);\n } catch (error) {\n context.writer.writeError(`Request failed: ${error}`);\n context.process.exit(-1);\n } finally {\n context.writer.writeln();\n context.writer.writeInfo('Equivalent curl command:');\n context.writer.writeln(\n this.generateCurlCommand(url, method, headers, data),\n );\n }\n }\n\n private generateCurlCommand(\n url: string,\n method: string,\n headers: string[],\n data?: string,\n ): string {\n const headerString = headers.map((h) => `-H \"${h}\"`).join(' ');\n const dataString = data ? `-d '${data}'` : '';\n return `curl -X ${method} ${headerString} ${dataString} \"${url}\"`;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { resolveCommandProcessorProvider } from '@qodalis/angular-cli';\nimport { CliCurlCommandProcessor } from './processors/cli-curl-command-processor';\n\n@NgModule({\n declarations: [],\n imports: [],\n exports: [],\n providers: [resolveCommandProcessorProvider(CliCurlCommandProcessor)],\n})\nexport class CliCurlModule {}\n","/*\n * Public API Surface of string\n */\n\nexport * from './lib/cli-curl.module';\n\nexport * from './lib/processors/cli-curl-command-processor';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
export declare class CliCurlModule {
|
|
3
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CliCurlModule, never>;
|
|
4
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<CliCurlModule, never, never, never>;
|
|
5
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<CliCurlModule>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { CliProcessCommand, CliProcessorMetadata, ICliCommandProcessor, ICliExecutionContext } from '@qodalis/cli-core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class CliCurlCommandProcessor implements ICliCommandProcessor {
|
|
4
|
+
command: string;
|
|
5
|
+
description: string;
|
|
6
|
+
author: import("@qodalis/cli-core").ICliCommandAuthor;
|
|
7
|
+
version: string;
|
|
8
|
+
processors?: ICliCommandProcessor[] | undefined;
|
|
9
|
+
metadata?: CliProcessorMetadata | undefined;
|
|
10
|
+
constructor();
|
|
11
|
+
processCommand(command: CliProcessCommand, context: ICliExecutionContext): Promise<void>;
|
|
12
|
+
writeDescription(context: ICliExecutionContext): void;
|
|
13
|
+
initialize(context: ICliExecutionContext): Promise<void>;
|
|
14
|
+
private registerSubProcessors;
|
|
15
|
+
private executeRequest;
|
|
16
|
+
private generateCurlCommand;
|
|
17
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CliCurlCommandProcessor, never>;
|
|
18
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<CliCurlCommandProcessor>;
|
|
19
|
+
}
|
package/lib/version.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const LIBRARY_VERSION = "0.0.1";
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@qodalis/cli-curl",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Provide utility functions for the library curl",
|
|
5
|
+
"author": "Nicolae Lupei, Qodalis Solutions",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/qodalis-solutions/angular-web-cli"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://qodalis.com",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"angular",
|
|
14
|
+
"cli",
|
|
15
|
+
"qodalis",
|
|
16
|
+
"terminal",
|
|
17
|
+
"curl"
|
|
18
|
+
],
|
|
19
|
+
"umd": "./umd/index.js",
|
|
20
|
+
"unpkg": "./umd/index.js",
|
|
21
|
+
"peerDependencies": {
|
|
22
|
+
"@angular/common": "^16.2.0",
|
|
23
|
+
"@angular/core": "^16.2.0"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"tslib": "^2.3.0",
|
|
27
|
+
"@qodalis/cli-core": "^0.0.11",
|
|
28
|
+
"@qodalis/angular-cli": "^1.0.26"
|
|
29
|
+
},
|
|
30
|
+
"sideEffects": false,
|
|
31
|
+
"module": "fesm2022/qodalis-cli-curl.mjs",
|
|
32
|
+
"typings": "index.d.ts",
|
|
33
|
+
"exports": {
|
|
34
|
+
"./package.json": {
|
|
35
|
+
"default": "./package.json"
|
|
36
|
+
},
|
|
37
|
+
".": {
|
|
38
|
+
"types": "./index.d.ts",
|
|
39
|
+
"esm2022": "./esm2022/qodalis-cli-curl.mjs",
|
|
40
|
+
"esm": "./esm2022/qodalis-cli-curl.mjs",
|
|
41
|
+
"default": "./fesm2022/qodalis-cli-curl.mjs"
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
package/public-api.d.ts
ADDED
package/umd/index.js
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
(function (global, factory) {
|
|
2
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('@qodalis/cli-core'), require('@angular/core')) :
|
|
3
|
+
typeof define === 'function' && define.amd ? define(['@qodalis/cli-core', '@angular/core'], factory) :
|
|
4
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.cliCore, global.ngCore));
|
|
5
|
+
})(this, (function (cliCore, core) { 'use strict';
|
|
6
|
+
|
|
7
|
+
/******************************************************************************
|
|
8
|
+
Copyright (c) Microsoft Corporation.
|
|
9
|
+
|
|
10
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
11
|
+
purpose with or without fee is hereby granted.
|
|
12
|
+
|
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
14
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
15
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
16
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
17
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
18
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
19
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
20
|
+
***************************************************************************** */
|
|
21
|
+
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
function __decorate(decorators, target, key, desc) {
|
|
25
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
26
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
27
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
28
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
32
|
+
var e = new Error(message);
|
|
33
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
// Automatically generated during build
|
|
37
|
+
const LIBRARY_VERSION = '0.0.1';
|
|
38
|
+
|
|
39
|
+
let CliCurlCommandProcessor = class CliCurlCommandProcessor {
|
|
40
|
+
constructor() {
|
|
41
|
+
this.command = 'curl';
|
|
42
|
+
this.description = 'A command-line tool to execute HTTP requests on your server. Supports GET, POST, PUT, DELETE, headers, and body data.';
|
|
43
|
+
this.author = cliCore.DefaultLibraryAuthor;
|
|
44
|
+
this.version = LIBRARY_VERSION;
|
|
45
|
+
this.processors = [];
|
|
46
|
+
this.metadata = {
|
|
47
|
+
icon: '🌐',
|
|
48
|
+
};
|
|
49
|
+
this.registerSubProcessors();
|
|
50
|
+
}
|
|
51
|
+
async processCommand(command, context) {
|
|
52
|
+
context.executor.showHelp(command, context);
|
|
53
|
+
}
|
|
54
|
+
writeDescription(context) {
|
|
55
|
+
context.writer.writeln(this.description);
|
|
56
|
+
context.writer.writeln();
|
|
57
|
+
context.writer.writeln('Usage:');
|
|
58
|
+
context.writer.writeln(' curl <method> <url> [options]');
|
|
59
|
+
context.writer.writeln();
|
|
60
|
+
context.writer.writeln('Options:');
|
|
61
|
+
context.writer.writeln(' -H, --header Add custom headers (e.g., -H="Authorization: Bearer <token>")');
|
|
62
|
+
context.writer.writeln(' -d, --data Add request body');
|
|
63
|
+
context.writer.writeln(' --verbose Print detailed response');
|
|
64
|
+
context.writer.writeln();
|
|
65
|
+
context.writer.writeln('Examples:');
|
|
66
|
+
context.writer.writeln(' curl get https://api.example.com/users');
|
|
67
|
+
context.writer.writeln(' curl post https://api.example.com/users -d=\'{"name":"John"}\' -H="Content-Type: application/json"');
|
|
68
|
+
context.writer.writeln();
|
|
69
|
+
context.writer.writeWarning('Note: The server must allow CORS for this tool to work.');
|
|
70
|
+
}
|
|
71
|
+
async initialize(context) { }
|
|
72
|
+
registerSubProcessors() {
|
|
73
|
+
this.processors = [
|
|
74
|
+
{
|
|
75
|
+
command: 'get',
|
|
76
|
+
description: 'Perform an HTTP GET request',
|
|
77
|
+
valueRequired: true,
|
|
78
|
+
parameters: [
|
|
79
|
+
{
|
|
80
|
+
name: 'header',
|
|
81
|
+
aliases: ['H'],
|
|
82
|
+
type: 'array',
|
|
83
|
+
description: 'Add custom headers. Accept multiple headers.',
|
|
84
|
+
required: false,
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
processCommand: async (command, context) => {
|
|
88
|
+
await this.executeRequest('GET', command, context);
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
command: 'post',
|
|
93
|
+
description: 'Perform an HTTP POST request',
|
|
94
|
+
valueRequired: true,
|
|
95
|
+
parameters: [
|
|
96
|
+
{
|
|
97
|
+
name: 'header',
|
|
98
|
+
aliases: ['H'],
|
|
99
|
+
type: 'array',
|
|
100
|
+
description: 'Add custom headers',
|
|
101
|
+
required: false,
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: 'data',
|
|
105
|
+
aliases: ['d'],
|
|
106
|
+
type: 'string',
|
|
107
|
+
description: 'Request body',
|
|
108
|
+
required: false,
|
|
109
|
+
},
|
|
110
|
+
],
|
|
111
|
+
processCommand: async (command, context) => {
|
|
112
|
+
await this.executeRequest('POST', command, context);
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
command: 'put',
|
|
117
|
+
description: 'Perform an HTTP PUT request',
|
|
118
|
+
valueRequired: true,
|
|
119
|
+
parameters: [
|
|
120
|
+
{
|
|
121
|
+
name: 'header',
|
|
122
|
+
aliases: ['H'],
|
|
123
|
+
type: 'array',
|
|
124
|
+
description: 'Add custom headers',
|
|
125
|
+
required: false,
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
name: 'data',
|
|
129
|
+
aliases: ['d'],
|
|
130
|
+
type: 'string',
|
|
131
|
+
description: 'Request body',
|
|
132
|
+
required: false,
|
|
133
|
+
},
|
|
134
|
+
],
|
|
135
|
+
processCommand: async (command, context) => {
|
|
136
|
+
await this.executeRequest('PUT', command, context);
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
command: 'delete',
|
|
141
|
+
description: 'Perform an HTTP DELETE request',
|
|
142
|
+
valueRequired: true,
|
|
143
|
+
parameters: [
|
|
144
|
+
{
|
|
145
|
+
name: 'header',
|
|
146
|
+
aliases: ['H'],
|
|
147
|
+
type: 'array',
|
|
148
|
+
description: 'Add custom headers',
|
|
149
|
+
required: false,
|
|
150
|
+
},
|
|
151
|
+
],
|
|
152
|
+
processCommand: async (command, context) => {
|
|
153
|
+
await this.executeRequest('DELETE', command, context);
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
];
|
|
157
|
+
}
|
|
158
|
+
async executeRequest(method, command, context) {
|
|
159
|
+
const url = command.value;
|
|
160
|
+
const headers = command.args['header'] || command.args['H'] || [];
|
|
161
|
+
const data = command.args['data'] || command.args['d'];
|
|
162
|
+
const verbose = !!command.args['verbose'];
|
|
163
|
+
if (!url) {
|
|
164
|
+
context.writer.writeError('URL is required.');
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
// Prepare headers
|
|
168
|
+
const headersObject = headers.reduce((acc, header) => {
|
|
169
|
+
const [key, value] = header.split(':').map((str) => str.trim());
|
|
170
|
+
if (key && value)
|
|
171
|
+
acc[key] = value;
|
|
172
|
+
return acc;
|
|
173
|
+
}, {});
|
|
174
|
+
// Prepare request options
|
|
175
|
+
const options = {
|
|
176
|
+
method,
|
|
177
|
+
headers: headersObject,
|
|
178
|
+
body: data ? JSON.stringify(JSON.parse(data)) : undefined,
|
|
179
|
+
};
|
|
180
|
+
try {
|
|
181
|
+
const response = await fetch(url, options);
|
|
182
|
+
const text = await response.text();
|
|
183
|
+
context.writer.writeSuccess('Request successful:');
|
|
184
|
+
if (verbose) {
|
|
185
|
+
context.writer.writeln(`Status: ${response.status}`);
|
|
186
|
+
context.writer.writeln(`Headers: ${JSON.stringify(response.headers, null, 2)}`);
|
|
187
|
+
}
|
|
188
|
+
context.writer.writeln(text);
|
|
189
|
+
context.process.output(text);
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
context.writer.writeError(`Request failed: ${error}`);
|
|
193
|
+
context.process.exit(-1);
|
|
194
|
+
}
|
|
195
|
+
finally {
|
|
196
|
+
context.writer.writeln();
|
|
197
|
+
context.writer.writeInfo('Equivalent curl command:');
|
|
198
|
+
context.writer.writeln(this.generateCurlCommand(url, method, headers, data));
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
generateCurlCommand(url, method, headers, data) {
|
|
202
|
+
const headerString = headers.map((h) => `-H "${h}"`).join(' ');
|
|
203
|
+
const dataString = data ? `-d '${data}'` : '';
|
|
204
|
+
return `curl -X ${method} ${headerString} ${dataString} "${url}"`;
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
CliCurlCommandProcessor = __decorate([
|
|
208
|
+
core.Injectable()
|
|
209
|
+
], CliCurlCommandProcessor);
|
|
210
|
+
|
|
211
|
+
const module = {
|
|
212
|
+
name: '@qodalis/cli-curl',
|
|
213
|
+
processors: [new CliCurlCommandProcessor()],
|
|
214
|
+
};
|
|
215
|
+
cliCore.bootUmdModule(module);
|
|
216
|
+
|
|
217
|
+
}));
|