@qodalis/cli-curl 2.0.0-beta.2 → 2.0.0-beta.20
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 +2 -2
- package/public-api.d.mts +5 -4
- package/public-api.d.ts +5 -4
- package/public-api.js +54 -11
- package/public-api.js.map +1 -1
- package/public-api.mjs +55 -12
- package/public-api.mjs.map +1 -1
- package/umd/index.global.js +299 -82
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qodalis/cli-curl",
|
|
3
|
-
"version": "2.0.0-beta.
|
|
3
|
+
"version": "2.0.0-beta.20",
|
|
4
4
|
"description": "@qodalis/cli extension for making HTTP requests via a curl-like interface.",
|
|
5
5
|
"author": "Nicolae Lupei, Qodalis Solutions",
|
|
6
6
|
"license": "MIT",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"umd": "./umd/index.global.js",
|
|
22
22
|
"unpkg": "./umd/index.global.js",
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@qodalis/cli-core": "2.0.0-beta.
|
|
24
|
+
"@qodalis/cli-core": "2.0.0-beta.20"
|
|
25
25
|
},
|
|
26
26
|
"sideEffects": false,
|
|
27
27
|
"main": "./public-api.js",
|
package/public-api.d.mts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { ICliCommandProcessor, CliProcessorMetadata, CliProcessCommand, ICliExecutionContext, ICliModule } from '@qodalis/cli-core';
|
|
1
|
+
import { ICliCommandProcessor, CliProcessorMetadata, ICliConfigurationOption, CliProcessCommand, ICliExecutionContext, ICliModule } from '@qodalis/cli-core';
|
|
3
2
|
|
|
4
3
|
interface CurlRequestOptions {
|
|
5
4
|
method: string;
|
|
@@ -29,10 +28,11 @@ declare function extractResponseHeaders(response: Response): Record<string, stri
|
|
|
29
28
|
declare class CliCurlCommandProcessor implements ICliCommandProcessor {
|
|
30
29
|
command: string;
|
|
31
30
|
description: string;
|
|
32
|
-
author:
|
|
31
|
+
author: any;
|
|
33
32
|
version: string;
|
|
34
33
|
valueRequired: boolean;
|
|
35
34
|
metadata?: CliProcessorMetadata;
|
|
35
|
+
configurationOptions?: ICliConfigurationOption[];
|
|
36
36
|
parameters: ({
|
|
37
37
|
name: string;
|
|
38
38
|
aliases: string[];
|
|
@@ -83,4 +83,5 @@ declare class CliCurlCommandProcessor implements ICliCommandProcessor {
|
|
|
83
83
|
|
|
84
84
|
declare const curlModule: ICliModule;
|
|
85
85
|
|
|
86
|
-
export { CliCurlCommandProcessor,
|
|
86
|
+
export { CliCurlCommandProcessor, buildCurlEquivalent, buildFetchOptions, curlModule, extractResponseHeaders, formatResponseBody, inferMethod, isJsonBody, parseHeaders, resolveBody, rewriteUrlToProxy };
|
|
87
|
+
export type { CurlRequestOptions, CurlResponse };
|
package/public-api.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { ICliCommandProcessor, CliProcessorMetadata, CliProcessCommand, ICliExecutionContext, ICliModule } from '@qodalis/cli-core';
|
|
1
|
+
import { ICliCommandProcessor, CliProcessorMetadata, ICliConfigurationOption, CliProcessCommand, ICliExecutionContext, ICliModule } from '@qodalis/cli-core';
|
|
3
2
|
|
|
4
3
|
interface CurlRequestOptions {
|
|
5
4
|
method: string;
|
|
@@ -29,10 +28,11 @@ declare function extractResponseHeaders(response: Response): Record<string, stri
|
|
|
29
28
|
declare class CliCurlCommandProcessor implements ICliCommandProcessor {
|
|
30
29
|
command: string;
|
|
31
30
|
description: string;
|
|
32
|
-
author:
|
|
31
|
+
author: any;
|
|
33
32
|
version: string;
|
|
34
33
|
valueRequired: boolean;
|
|
35
34
|
metadata?: CliProcessorMetadata;
|
|
35
|
+
configurationOptions?: ICliConfigurationOption[];
|
|
36
36
|
parameters: ({
|
|
37
37
|
name: string;
|
|
38
38
|
aliases: string[];
|
|
@@ -83,4 +83,5 @@ declare class CliCurlCommandProcessor implements ICliCommandProcessor {
|
|
|
83
83
|
|
|
84
84
|
declare const curlModule: ICliModule;
|
|
85
85
|
|
|
86
|
-
export { CliCurlCommandProcessor,
|
|
86
|
+
export { CliCurlCommandProcessor, buildCurlEquivalent, buildFetchOptions, curlModule, extractResponseHeaders, formatResponseBody, inferMethod, isJsonBody, parseHeaders, resolveBody, rewriteUrlToProxy };
|
|
87
|
+
export type { CurlRequestOptions, CurlResponse };
|
package/public-api.js
CHANGED
|
@@ -71,7 +71,7 @@ function formatResponseBody(body, pretty) {
|
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
73
|
function rewriteUrlToProxy(originalUrl) {
|
|
74
|
-
const match = originalUrl.match(/^(https?):\/\/([
|
|
74
|
+
const match = originalUrl.match(/^(https?):\/\/([^/]+)(\/.*)?$/i);
|
|
75
75
|
if (!match) {
|
|
76
76
|
throw new Error(`Invalid URL: ${originalUrl}`);
|
|
77
77
|
}
|
|
@@ -103,7 +103,7 @@ function extractResponseHeaders(response) {
|
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
// src/lib/version.ts
|
|
106
|
-
var LIBRARY_VERSION = "2.0.0-beta.
|
|
106
|
+
var LIBRARY_VERSION = "2.0.0-beta.20";
|
|
107
107
|
var API_VERSION = 2;
|
|
108
108
|
|
|
109
109
|
// src/lib/processors/cli-curl-command-processor.ts
|
|
@@ -119,6 +119,33 @@ var CliCurlCommandProcessor = class {
|
|
|
119
119
|
requiredCoreVersion: ">=2.0.0 <3.0.0",
|
|
120
120
|
requiredCliVersion: ">=2.0.0 <3.0.0"
|
|
121
121
|
};
|
|
122
|
+
this.configurationOptions = [
|
|
123
|
+
{
|
|
124
|
+
key: "defaultTimeout",
|
|
125
|
+
label: "Default Timeout",
|
|
126
|
+
description: "Default request timeout in milliseconds",
|
|
127
|
+
type: "number",
|
|
128
|
+
defaultValue: 3e4,
|
|
129
|
+
validator: (v) => ({
|
|
130
|
+
valid: typeof v === "number" && v >= 1e3 && v <= 3e5,
|
|
131
|
+
message: "Must be between 1000 and 300000 ms"
|
|
132
|
+
})
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
key: "prettyPrint",
|
|
136
|
+
label: "Pretty-Print JSON",
|
|
137
|
+
description: "Pretty-print JSON responses by default",
|
|
138
|
+
type: "boolean",
|
|
139
|
+
defaultValue: false
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
key: "verbose",
|
|
143
|
+
label: "Verbose Output",
|
|
144
|
+
description: "Show request/response headers by default",
|
|
145
|
+
type: "boolean",
|
|
146
|
+
defaultValue: false
|
|
147
|
+
}
|
|
148
|
+
];
|
|
122
149
|
this.parameters = [
|
|
123
150
|
{
|
|
124
151
|
name: "request",
|
|
@@ -190,22 +217,25 @@ var CliCurlCommandProcessor = class {
|
|
|
190
217
|
];
|
|
191
218
|
}
|
|
192
219
|
async processCommand(command, context) {
|
|
193
|
-
const url = command.value;
|
|
220
|
+
const url = cliCore.joinShellWords(command.value ?? "");
|
|
194
221
|
if (!url) {
|
|
195
222
|
context.writer.writeError("URL is required. Usage: curl <url> [options]");
|
|
196
223
|
context.process.exit(1);
|
|
197
224
|
return;
|
|
198
225
|
}
|
|
199
226
|
const args = command.args;
|
|
227
|
+
const cfgTimeout = cliCore.getPluginConfigValue(context, "curl", "defaultTimeout", 3e4);
|
|
228
|
+
const cfgPretty = cliCore.getPluginConfigValue(context, "curl", "prettyPrint", false);
|
|
229
|
+
const cfgVerbose = cliCore.getPluginConfigValue(context, "curl", "verbose", false);
|
|
200
230
|
const explicitMethod = args["request"] || args["X"];
|
|
201
231
|
const data = args["data"] || args["d"];
|
|
202
232
|
const dataRaw = args["data-raw"];
|
|
203
233
|
const hasBody = data != null || dataRaw != null;
|
|
204
|
-
const verbose = !!args["verbose"] || !!args["v"];
|
|
205
|
-
const pretty = !!args["pretty"];
|
|
234
|
+
const verbose = args["verbose"] != null || args["v"] != null ? !!args["verbose"] || !!args["v"] : cfgVerbose;
|
|
235
|
+
const pretty = args["pretty"] != null ? !!args["pretty"] : cfgPretty;
|
|
206
236
|
const silent = !!args["silent"] || !!args["s"];
|
|
207
237
|
const useProxy = !!args["proxy"];
|
|
208
|
-
const timeout = parseInt(args["timeout"] ||
|
|
238
|
+
const timeout = parseInt(args["timeout"] || String(cfgTimeout), 10);
|
|
209
239
|
const followRedirects = args["location"] !== false && args["L"] !== false;
|
|
210
240
|
let method;
|
|
211
241
|
try {
|
|
@@ -238,13 +268,22 @@ var CliCurlCommandProcessor = class {
|
|
|
238
268
|
}
|
|
239
269
|
context.writer.writeln();
|
|
240
270
|
}
|
|
241
|
-
const
|
|
242
|
-
const timeoutId = setTimeout(() =>
|
|
243
|
-
fetchOptions.signal =
|
|
271
|
+
const timeoutController = new AbortController();
|
|
272
|
+
const timeoutId = setTimeout(() => timeoutController.abort(), timeout);
|
|
273
|
+
fetchOptions.signal = timeoutController.signal;
|
|
244
274
|
const startTime = performance.now();
|
|
245
275
|
try {
|
|
246
|
-
const
|
|
276
|
+
const hostname = (() => {
|
|
277
|
+
try {
|
|
278
|
+
return new URL(url).hostname;
|
|
279
|
+
} catch {
|
|
280
|
+
return url;
|
|
281
|
+
}
|
|
282
|
+
})();
|
|
283
|
+
context.notifier.info(`${method} ${hostname}`);
|
|
284
|
+
const response = await context.http.fetch(requestUrl, fetchOptions);
|
|
247
285
|
const elapsed = Math.round(performance.now() - startTime);
|
|
286
|
+
context.notifier.info(`${method} ${hostname} \u2014 ${response.status}`);
|
|
248
287
|
const responseText = await response.text();
|
|
249
288
|
const responseHeaders = extractResponseHeaders(response);
|
|
250
289
|
const curlResponse = {
|
|
@@ -294,7 +333,11 @@ var CliCurlCommandProcessor = class {
|
|
|
294
333
|
context.process.output(curlResponse);
|
|
295
334
|
} catch (error) {
|
|
296
335
|
if (error.name === "AbortError") {
|
|
297
|
-
|
|
336
|
+
if (timeoutController.signal.aborted) {
|
|
337
|
+
context.writer.writeError(`Request timed out after ${timeout}ms`);
|
|
338
|
+
} else {
|
|
339
|
+
context.writer.writeWarning("Request cancelled.");
|
|
340
|
+
}
|
|
298
341
|
} else {
|
|
299
342
|
context.writer.writeError(`Request failed: ${error.message}`);
|
|
300
343
|
}
|
package/public-api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../packages/plugins/curl/src/lib/utilities/index.ts","../../packages/plugins/curl/src/lib/version.ts","../../packages/plugins/curl/src/lib/processors/cli-curl-command-processor.ts","../../packages/plugins/curl/src/public-api.ts"],"names":["DefaultLibraryAuthor","CliForegroundColor"],"mappings":";;;;;AAiBA,IAAM,aAAA,GAAgB,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,OAAA,EAAS,QAAA,EAAU,QAAQ,SAAS,CAAA;AAE1E,SAAS,WAAA,CAAY,gBAAyB,OAAA,EAA2B;AAC5E,EAAA,IAAI,cAAA,EAAgB;AAChB,IAAA,MAAM,KAAA,GAAQ,eAAe,WAAA,EAAY;AACzC,IAAA,IAAI,CAAC,aAAA,CAAc,QAAA,CAAS,KAAK,CAAA,EAAG;AAChC,MAAA,MAAM,IAAI,MAAM,CAAA,qBAAA,EAAwB,cAAc,oBAAoB,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACxG;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AACA,EAAA,OAAO,UAAU,MAAA,GAAS,KAAA;AAC9B;AAEO,SAAS,aAAa,UAAA,EAAmE;AAC5F,EAAA,IAAI,CAAC,UAAA,EAAY,OAAO,EAAC;AACzB,EAAA,MAAM,MAAM,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,GAAI,UAAA,GAAa,CAAC,UAAU,CAAA;AAChE,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,UAAU,GAAA,EAAK;AACtB,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AACrC,IAAA,IAAI,eAAe,EAAA,EAAI;AACvB,IAAA,MAAM,MAAM,MAAA,CAAO,SAAA,CAAU,CAAA,EAAG,UAAU,EAAE,IAAA,EAAK;AACjD,IAAA,MAAM,QAAQ,MAAA,CAAO,SAAA,CAAU,UAAA,GAAa,CAAC,EAAE,IAAA,EAAK;AACpD,IAAA,IAAI,GAAA,EAAK,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,EAC3B;AACA,EAAA,OAAO,MAAA;AACX;AAEO,SAAS,WAAA,CAAY,MAAe,OAAA,EAAsC;AAC7E,EAAA,IAAI,OAAA,IAAW,MAAM,OAAO,OAAA;AAC5B,EAAA,IAAI,IAAA,IAAQ,MAAM,OAAO,MAAA;AACzB,EAAA,IAAI;AACA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,EAC1C,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;AAEO,SAAS,WAAW,IAAA,EAAwB;AAC/C,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,EAAA,IAAI;AACA,IAAA,IAAA,CAAK,MAAM,IAAI,CAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACX,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,KAAA;AAAA,EACX;AACJ;AAEO,SAAS,kBAAkB,OAAA,EAA0C;AACxE,EAAA,MAAM,OAAA,GAAU,EAAE,GAAG,OAAA,CAAQ,OAAA,EAAQ;AAErC,EAAA,IAAI,OAAA,CAAQ,QAAQ,CAAC,OAAA,CAAQ,cAAc,CAAA,IAAK,UAAA,CAAW,OAAA,CAAQ,IAAI,CAAA,EAAG;AACtE,IAAA,OAAA,CAAQ,cAAc,CAAA,GAAI,kBAAA;AAAA,EAC9B;AAEA,EAAA,MAAM,IAAA,GAAoB;AAAA,IACtB,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB;AAAA,GACJ;AAEA,EAAA,IAAI,QAAQ,IAAA,IAAQ,OAAA,CAAQ,WAAW,KAAA,IAAS,OAAA,CAAQ,WAAW,MAAA,EAAQ;AACvE,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AAAA,EACxB;AAEA,EAAA,IAAI,CAAC,QAAQ,eAAA,EAAiB;AAC1B,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EACpB;AAEA,EAAA,OAAO,IAAA;AACX;AAEO,SAAS,kBAAA,CAAmB,MAAc,MAAA,EAAyB;AACtE,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,IAAI;AACA,IAAA,OAAO,KAAK,SAAA,CAAU,IAAA,CAAK,MAAM,IAAI,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,EACnD,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;AAEO,SAAS,kBAAkB,WAAA,EAA6B;AAC3D,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAA,CAAM,iCAAiC,CAAA;AACjE,EAAA,IAAI,CAAC,KAAA,EAAO;AACR,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,aAAA,EAAgB,WAAW,CAAA,CAAE,CAAA;AAAA,EACjD;AACA,EAAA,MAAM,MAAA,GAAS,MAAM,CAAC,CAAA;AACtB,EAAA,MAAM,MAAA,GAAS,MAAM,CAAC,CAAA;AACtB,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,IAAK,GAAA;AACzB,EAAA,OAAO,CAAA,gCAAA,EAAmC,MAAM,CAAA,CAAA,EAAI,MAAM,GAAG,IAAI,CAAA,CAAA;AACrE;AAEO,SAAS,mBAAA,CACZ,GAAA,EACA,MAAA,EACA,OAAA,EACA,IAAA,EACM;AACN,EAAA,MAAM,KAAA,GAAQ,CAAC,MAAM,CAAA;AACrB,EAAA,IAAI,WAAW,KAAA,EAAO;AAClB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,GAAA,EAAM,MAAM,CAAA,CAAE,CAAA;AAAA,EAC7B;AACA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAChD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,EACtC;AACA,EAAA,IAAI,IAAA,EAAM;AACN,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EAC7B;AACA,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAG,CAAA;AACrB,EAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AACzB;AAEO,SAAS,uBAAuB,QAAA,EAA4C;AAC/E,EAAA,MAAM,UAAkC,EAAC;AACzC,EAAA,QAAA,CAAS,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AACrC,IAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,KAAA;AAAA,EACnB,CAAC,CAAA;AACD,EAAA,OAAO,OAAA;AACX;;;ACnIO,IAAM,eAAA,GAAkB,cAAA;AACxB,IAAM,WAAA,GAAc,CAAA;;;ACkBpB,IAAM,0BAAN,MAA8D;AAAA,EAA9D,WAAA,GAAA;AACH,IAAA,IAAA,CAAA,OAAA,GAAU,MAAA;AAEV,IAAA,IAAA,CAAA,WAAA,GAAc,sHAAA;AAEd,IAAA,IAAA,CAAA,MAAA,GAASA,4BAAA;AAET,IAAA,IAAA,CAAA,OAAA,GAAU,eAAA;AAEV,IAAA,IAAA,CAAA,aAAA,GAAgB,IAAA;AAEhB,IAAA,IAAA,CAAA,QAAA,GAAkC;AAAA,MAC9B,IAAA,EAAM,WAAA;AAAA,MACN,mBAAA,EAAqB,gBAAA;AAAA,MACrB,kBAAA,EAAoB;AAAA,KACxB;AAEA,IAAA,IAAA,CAAA,UAAA,GAAa;AAAA,MACT;AAAA,QACI,IAAA,EAAM,SAAA;AAAA,QACN,OAAA,EAAS,CAAC,GAAG,CAAA;AAAA,QACb,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,4DAAA;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,mEAAA;AAAA,QACb,QAAA,EAAU;AAAA,OACd;AAAA,MACA;AAAA,QACI,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,CAAC,GAAG,CAAA;AAAA,QACb,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,uEAAA;AAAA,QACb,QAAA,EAAU;AAAA,OACd;AAAA,MACA;AAAA,QACI,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,8CAAA;AAAA,QACb,QAAA,EAAU;AAAA,OACd;AAAA,MACA;AAAA,QACI,IAAA,EAAM,SAAA;AAAA,QACN,OAAA,EAAS,CAAC,GAAG,CAAA;AAAA,QACb,IAAA,EAAM,SAAA;AAAA,QACN,WAAA,EAAa,0CAAA;AAAA,QACb,QAAA,EAAU;AAAA,OACd;AAAA,MACA;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,SAAA;AAAA,QACN,WAAA,EAAa,iCAAA;AAAA,QACb,QAAA,EAAU;AAAA,OACd;AAAA,MACA;AAAA,QACI,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,kDAAA;AAAA,QACb,QAAA,EAAU,KAAA;AAAA,QACV,YAAA,EAAc;AAAA,OAClB;AAAA,MACA;AAAA,QACI,IAAA,EAAM,UAAA;AAAA,QACN,OAAA,EAAS,CAAC,GAAG,CAAA;AAAA,QACb,IAAA,EAAM,SAAA;AAAA,QACN,WAAA,EAAa,kCAAA;AAAA,QACb,QAAA,EAAU;AAAA,OACd;AAAA,MACA;AAAA,QACI,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,SAAA;AAAA,QACN,WAAA,EAAa,yDAAA;AAAA,QACb,QAAA,EAAU;AAAA,OACd;AAAA,MACA;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS,CAAC,GAAG,CAAA;AAAA,QACb,IAAA,EAAM,SAAA;AAAA,QACN,WAAA,EAAa,4CAAA;AAAA,QACb,QAAA,EAAU;AAAA;AACd,KACJ;AAAA,EAAA;AAAA,EAEA,MAAM,cAAA,CACF,OAAA,EACA,OAAA,EACa;AACb,IAAA,MAAM,MAAM,OAAA,CAAQ,KAAA;AAEpB,IAAA,IAAI,CAAC,GAAA,EAAK;AACN,MAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,8CAA8C,CAAA;AACxE,MAAA,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAC,CAAA;AACtB,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,OAAO,OAAA,CAAQ,IAAA;AACrB,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,SAAS,CAAA,IAAK,KAAK,GAAG,CAAA;AAClD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAM,CAAA,IAAK,KAAK,GAAG,CAAA;AACrC,IAAA,MAAM,OAAA,GAAU,KAAK,UAAU,CAAA;AAC/B,IAAA,MAAM,OAAA,GAAU,IAAA,IAAQ,IAAA,IAAQ,OAAA,IAAW,IAAA;AAC3C,IAAA,MAAM,OAAA,GAAU,CAAC,CAAC,IAAA,CAAK,SAAS,CAAA,IAAK,CAAC,CAAC,IAAA,CAAK,GAAG,CAAA;AAC/C,IAAA,MAAM,MAAA,GAAS,CAAC,CAAC,IAAA,CAAK,QAAQ,CAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,CAAC,CAAC,IAAA,CAAK,QAAQ,CAAA,IAAK,CAAC,CAAC,IAAA,CAAK,GAAG,CAAA;AAC7C,IAAA,MAAM,QAAA,GAAW,CAAC,CAAC,IAAA,CAAK,OAAO,CAAA;AAC/B,IAAA,MAAM,UAAU,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA,IAAK,SAAS,EAAE,CAAA;AACvD,IAAA,MAAM,kBAAkB,IAAA,CAAK,UAAU,MAAM,KAAA,IAAS,IAAA,CAAK,GAAG,CAAA,KAAM,KAAA;AAEpE,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACA,MAAA,MAAA,GAAS,WAAA,CAAY,gBAAgB,OAAO,CAAA;AAAA,IAChD,SAAS,CAAA,EAAQ;AACb,MAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,CAAA,CAAE,OAAO,CAAA;AACnC,MAAA,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAC,CAAA;AACtB,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,UAAU,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA,IAAK,IAAA,CAAK,GAAG,CAAC,CAAA;AACxD,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,EAAM,OAAO,CAAA;AACtC,IAAA,MAAM,UAAA,GAAa,QAAA,GAAW,iBAAA,CAAkB,GAAG,CAAA,GAAI,GAAA;AAEvD,IAAA,MAAM,eAAe,iBAAA,CAAkB;AAAA,MACnC,MAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACH,CAAA;AAED,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,OAAA,CAAQ,MAAA,CAAO,OAAA;AAAA,QACX,CAAA,EAAA,EAAK,OAAA,CAAQ,MAAA,CAAO,WAAA,CAAY,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAIC,0BAAA,CAAmB,IAAI,CAAC,CAAA;AAAA,OAChF;AACA,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAChD,QAAA,OAAA,CAAQ,MAAA,CAAO,OAAA;AAAA,UACX,CAAA,EAAA,EAAK,OAAA,CAAQ,MAAA,CAAO,WAAA,CAAY,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,EAAIA,0BAAA,CAAmB,MAAM,CAAC,CAAA;AAAA,SAClF;AAAA,MACJ;AACA,MAAA,IAAI,IAAA,EAAM;AACN,QAAA,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,CAAA,QAAA,EAAW,IAAI,CAAA,CAAE,CAAA;AAAA,MAC5C;AACA,MAAA,OAAA,CAAQ,OAAO,OAAA,EAAQ;AAAA,IAC3B;AAEA,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,OAAO,CAAA;AAC9D,IAAA,YAAA,CAAa,SAAS,UAAA,CAAW,MAAA;AAEjC,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAElC,IAAA,IAAI;AACA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,UAAA,EAAY,YAAY,CAAA;AACrD,MAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,GAAA,KAAQ,SAAS,CAAA;AACxD,MAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,IAAA,EAAK;AACzC,MAAA,MAAM,eAAA,GAAkB,uBAAuB,QAAQ,CAAA;AAEvD,MAAA,MAAM,YAAA,GAA6B;AAAA,QAC/B,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,YAAY,QAAA,CAAS,UAAA;AAAA,QACrB,OAAA,EAAS,eAAA;AAAA,QACT,IAAA,EAAM,YAAA;AAAA,QACN,MAAA,EAAQ,OAAA;AAAA,QACR,KAAK,QAAA,CAAS,GAAA;AAAA,QACd,YAAY,QAAA,CAAS;AAAA,OACzB;AAEA,MAAA,IAAI,CAAC,MAAA,EAAQ;AACT,QAAA,MAAM,WAAA,GAAc,QAAA,CAAS,EAAA,GAAKA,0BAAA,CAAmB,QAAQA,0BAAA,CAAmB,GAAA;AAChF,QAAA,OAAA,CAAQ,MAAA,CAAO,OAAA;AAAA,UACX,QAAQ,MAAA,CAAO,WAAA;AAAA,YACX,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA,CAAA;AAAA,YAC9C;AAAA;AACJ,SACJ;AAAA,MACJ;AAEA,MAAA,IAAI,OAAA,EAAS;AACT,QAAA,OAAA,CAAQ,OAAO,OAAA,EAAQ;AACvB,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,EAAG;AACxD,UAAA,OAAA,CAAQ,MAAA,CAAO,OAAA;AAAA,YACX,CAAA,EAAA,EAAK,OAAA,CAAQ,MAAA,CAAO,WAAA,CAAY,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,EAAIA,0BAAA,CAAmB,MAAM,CAAC,CAAA;AAAA,WAClF;AAAA,QACJ;AACA,QAAA,OAAA,CAAQ,MAAA,CAAO,OAAA;AAAA,UACX,CAAA,EAAA,EAAK,QAAQ,MAAA,CAAO,WAAA,CAAY,SAAS,OAAO,CAAA,EAAA,CAAA,EAAMA,0BAAA,CAAmB,OAAO,CAAC,CAAA;AAAA,SACrF;AACA,QAAA,IAAI,SAAS,UAAA,EAAY;AACrB,UAAA,OAAA,CAAQ,MAAA,CAAO,OAAA;AAAA,YACX,CAAA,EAAA,EAAK,OAAA,CAAQ,MAAA,CAAO,WAAA,CAAY,CAAA,eAAA,EAAkB,SAAS,GAAG,CAAA,CAAA,EAAIA,0BAAA,CAAmB,IAAI,CAAC,CAAA;AAAA,WAC9F;AAAA,QACJ;AACA,QAAA,OAAA,CAAQ,OAAO,OAAA,EAAQ;AAAA,MAC3B;AAEA,MAAA,MAAM,aAAA,GAAgB,kBAAA,CAAmB,YAAA,EAAc,MAAM,CAAA;AAC7D,MAAA,IAAI,aAAA,EAAe;AACf,QAAA,OAAA,CAAQ,MAAA,CAAO,QAAQ,aAAa,CAAA;AAAA,MACxC;AAEA,MAAA,IAAI,OAAA,EAAS;AACT,QAAA,OAAA,CAAQ,OAAO,OAAA,EAAQ;AACvB,QAAA,OAAA,CAAQ,MAAA,CAAO,UAAU,0BAA0B,CAAA;AACnD,QAAA,OAAA,CAAQ,OAAO,OAAA,CAAQ,mBAAA,CAAoB,KAAK,MAAA,EAAQ,OAAA,EAAS,IAAI,CAAC,CAAA;AAAA,MAC1E;AAEA,MAAA,OAAA,CAAQ,OAAA,CAAQ,OAAO,YAAY,CAAA;AAAA,IACvC,SAAS,KAAA,EAAY;AACjB,MAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC7B,QAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,CAAA,wBAAA,EAA2B,OAAO,CAAA,EAAA,CAAI,CAAA;AAAA,MACpE,CAAA,MAAO;AACH,QAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,CAAA,gBAAA,EAAmB,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAChE;AACA,MAAA,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAC1B,CAAA,SAAE;AACE,MAAA,YAAA,CAAa,SAAS,CAAA;AAAA,IAC1B;AAAA,EACJ;AAAA,EAEA,iBAAiB,OAAA,EAAqC;AAClD,IAAA,MAAM,EAAE,QAAO,GAAI,OAAA;AAEnB,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,WAAY,CAAA;AAChC,IAAA,MAAA,CAAO,OAAA,EAAQ;AAEf,IAAA,MAAA,CAAO,QAAQ,MAAA,CAAO,WAAA,CAAY,QAAA,EAAUA,0BAAA,CAAmB,MAAM,CAAC,CAAA;AACtE,IAAA,MAAA,CAAO,QAAQ,CAAA,sBAAA,CAAwB,CAAA;AACvC,IAAA,MAAA,CAAO,OAAA,EAAQ;AAEf,IAAA,MAAA,CAAO,QAAQ,MAAA,CAAO,WAAA,CAAY,UAAA,EAAYA,0BAAA,CAAmB,MAAM,CAAC,CAAA;AACxE,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,MAAA,CAAO,WAAA,CAAY,0BAA0BA,0BAAA,CAAmB,IAAI,CAAC,CAAA,kDAAA,CAAoD,CAAA;AAC7I,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,MAAA,CAAO,WAAA,CAAY,yBAAyBA,0BAAA,CAAmB,IAAI,CAAC,CAAA,2BAAA,CAA6B,CAAA;AACrH,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,MAAA,CAAO,WAAA,CAAY,qBAAqBA,0BAAA,CAAmB,IAAI,CAAC,CAAA,wCAAA,CAA0C,CAAA;AAC9H,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,MAAA,CAAO,WAAA,CAAY,qBAAqBA,0BAAA,CAAmB,IAAI,CAAC,CAAA,0BAAA,CAA4B,CAAA;AAChH,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,MAAA,CAAO,WAAA,CAAY,iBAAiBA,0BAAA,CAAmB,IAAI,CAAC,CAAA,mCAAA,CAAqC,CAAA;AACrH,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,MAAA,CAAO,WAAA,CAAY,YAAYA,0BAAA,CAAmB,IAAI,CAAC,CAAA,2CAAA,CAA6C,CAAA;AACxH,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,MAAA,CAAO,WAAA,CAAY,kBAAkBA,0BAAA,CAAmB,IAAI,CAAC,CAAA,yCAAA,CAA2C,CAAA;AAC5H,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,MAAA,CAAO,WAAA,CAAY,kBAAkBA,0BAAA,CAAmB,IAAI,CAAC,CAAA,2CAAA,CAA6C,CAAA;AAC9H,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,MAAA,CAAO,WAAA,CAAY,WAAWA,0BAAA,CAAmB,IAAI,CAAC,CAAA,0CAAA,CAA4C,CAAA;AACtH,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,MAAA,CAAO,WAAA,CAAY,gBAAgBA,0BAAA,CAAmB,IAAI,CAAC,CAAA,6BAAA,CAA+B,CAAA;AAC9G,IAAA,MAAA,CAAO,OAAA,EAAQ;AAEf,IAAA,MAAA,CAAO,QAAQ,MAAA,CAAO,WAAA,CAAY,WAAA,EAAaA,0BAAA,CAAmB,MAAM,CAAC,CAAA;AACzE,IAAA,MAAA,CAAO,QAAQ,CAAA,oCAAA,CAAsC,CAAA;AACrD,IAAA,MAAA,CAAO,QAAQ,CAAA,qGAAA,CAAuG,CAAA;AACtH,IAAA,MAAA,CAAO,QAAQ,CAAA,gDAAA,CAAkD,CAAA;AACjE,IAAA,MAAA,CAAO,QAAQ,CAAA,6CAAA,CAA+C,CAAA;AAC9D,IAAA,MAAA,CAAO,QAAQ,CAAA,0DAAA,CAA4D,CAAA;AAC3E,IAAA,MAAA,CAAO,OAAA,EAAQ;AAEf,IAAA,MAAA,CAAO,aAAa,4FAA4F,CAAA;AAAA,EACpH;AAAA,EAEA,MAAM,WAAW,QAAA,EAA+C;AAAA,EAAC;AACrE;;;ACzQO,IAAM,UAAA,GAAyB;AAAA,EAClC,UAAA,EAAY,WAAA;AAAA,EACZ,IAAA,EAAM,mBAAA;AAAA,EACN,UAAA,EAAY,CAAC,IAAI,uBAAA,EAAyB,CAAA;AAAA,EAC1C,YAAA,EAAc;AAAA,IACV,EAAA,EAAI,EAAE,sBAAA,EAAwB,6CAAA,EAA8C;AAAA,IAC5E,EAAA,EAAI,EAAE,sBAAA,EAAwB,mDAAA,EAAiD;AAAA,IAC/E,EAAA,EAAI,EAAE,sBAAA,EAAwB,yCAAA,EAAuC;AAAA,IACrE,EAAA,EAAI,EAAE,sBAAA,EAAwB,4CAAA,EAAuC;AAAA,IACrE,EAAA,EAAI,EAAE,sBAAA,EAAwB,uCAAA,EAAwC;AAAA,IACtE,EAAA,EAAI,EAAE,sBAAA,EAAwB,gGAAA,EAAsB;AAAA,IACpD,EAAA,EAAI,EAAE,sBAAA,EAAwB,+DAAA,EAAmB;AAAA,IACjD,EAAA,EAAI,EAAE,sBAAA,EAAwB,kDAAA,EAAgB;AAAA,IAC9C,EAAA,EAAI,EAAE,sBAAA,EAAwB,wLAAA,EAAwC;AAAA,IACtE,EAAA,EAAI,EAAE,sBAAA,EAAwB,0CAAA;AAAsC;AAE5E","file":"public-api.js","sourcesContent":["export interface CurlRequestOptions {\n method: string;\n headers: Record<string, string>;\n body?: string;\n followRedirects: boolean;\n}\n\nexport interface CurlResponse {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: string;\n timing: number;\n url: string;\n redirected: boolean;\n}\n\nconst VALID_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'];\n\nexport function inferMethod(explicitMethod?: string, hasBody?: boolean): string {\n if (explicitMethod) {\n const upper = explicitMethod.toUpperCase();\n if (!VALID_METHODS.includes(upper)) {\n throw new Error(`Invalid HTTP method: ${explicitMethod}. Valid methods: ${VALID_METHODS.join(', ')}`);\n }\n return upper;\n }\n return hasBody ? 'POST' : 'GET';\n}\n\nexport function parseHeaders(headerArgs: string | string[] | undefined): Record<string, string> {\n if (!headerArgs) return {};\n const arr = Array.isArray(headerArgs) ? headerArgs : [headerArgs];\n const result: Record<string, string> = {};\n for (const header of arr) {\n const colonIndex = header.indexOf(':');\n if (colonIndex === -1) continue;\n const key = header.substring(0, colonIndex).trim();\n const value = header.substring(colonIndex + 1).trim();\n if (key) result[key] = value;\n }\n return result;\n}\n\nexport function resolveBody(data?: string, dataRaw?: string): string | undefined {\n if (dataRaw != null) return dataRaw;\n if (data == null) return undefined;\n try {\n return JSON.stringify(JSON.parse(data));\n } catch {\n return data;\n }\n}\n\nexport function isJsonBody(body?: string): boolean {\n if (!body) return false;\n try {\n JSON.parse(body);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function buildFetchOptions(options: CurlRequestOptions): RequestInit {\n const headers = { ...options.headers };\n\n if (options.body && !headers['Content-Type'] && isJsonBody(options.body)) {\n headers['Content-Type'] = 'application/json';\n }\n\n const init: RequestInit = {\n method: options.method,\n headers,\n };\n\n if (options.body && options.method !== 'GET' && options.method !== 'HEAD') {\n init.body = options.body;\n }\n\n if (!options.followRedirects) {\n init.redirect = 'manual';\n }\n\n return init;\n}\n\nexport function formatResponseBody(body: string, pretty: boolean): string {\n if (!pretty) return body;\n try {\n return JSON.stringify(JSON.parse(body), null, 2);\n } catch {\n return body;\n }\n}\n\nexport function rewriteUrlToProxy(originalUrl: string): string {\n const match = originalUrl.match(/^(https?):\\/\\/([^\\/]+)(\\/.*)?$/i);\n if (!match) {\n throw new Error(`Invalid URL: ${originalUrl}`);\n }\n const scheme = match[1];\n const domain = match[2];\n const path = match[3] || '/';\n return `https://proxy.qodalis.com/proxy/${scheme}/${domain}${path}`;\n}\n\nexport function buildCurlEquivalent(\n url: string,\n method: string,\n headers: Record<string, string>,\n body?: string,\n): string {\n const parts = ['curl'];\n if (method !== 'GET') {\n parts.push(`-X ${method}`);\n }\n for (const [key, value] of Object.entries(headers)) {\n parts.push(`-H '${key}: ${value}'`);\n }\n if (body) {\n parts.push(`-d '${body}'`);\n }\n parts.push(`'${url}'`);\n return parts.join(' ');\n}\n\nexport function extractResponseHeaders(response: Response): Record<string, string> {\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headers[key] = value;\n });\n return headers;\n}\n","\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-beta.2';\nexport const API_VERSION = 2;\n ","import {\n CliForegroundColor,\n CliProcessCommand,\n CliProcessorMetadata,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\nimport {\n CurlResponse,\n buildCurlEquivalent,\n buildFetchOptions,\n extractResponseHeaders,\n formatResponseBody,\n inferMethod,\n parseHeaders,\n resolveBody,\n rewriteUrlToProxy,\n} from '../utilities';\n\nexport class CliCurlCommandProcessor implements ICliCommandProcessor {\n command = 'curl';\n\n description = 'Make HTTP requests from the terminal. Supports all HTTP methods, custom headers, request bodies, timeouts, and more.';\n\n author = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n valueRequired = true;\n\n metadata?: CliProcessorMetadata = {\n icon: '🌐',\n requiredCoreVersion: '>=2.0.0 <3.0.0',\n requiredCliVersion: '>=2.0.0 <3.0.0',\n };\n\n parameters = [\n {\n name: 'request',\n aliases: ['X'],\n type: 'string' as const,\n description: 'HTTP method (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS)',\n required: false,\n },\n {\n name: 'header',\n aliases: ['H'],\n type: 'array' as const,\n description: 'Add header, e.g. -H \\'Content-Type: application/json\\' (repeatable)',\n required: false,\n },\n {\n name: 'data',\n aliases: ['d'],\n type: 'string' as const,\n description: 'Request body (auto-detects JSON, sets method to POST if -X not given)',\n required: false,\n },\n {\n name: 'data-raw',\n type: 'string' as const,\n description: 'Request body sent as-is without JSON parsing',\n required: false,\n },\n {\n name: 'verbose',\n aliases: ['v'],\n type: 'boolean' as const,\n description: 'Show request/response headers and timing',\n required: false,\n },\n {\n name: 'pretty',\n type: 'boolean' as const,\n description: 'Pretty-print JSON response body',\n required: false,\n },\n {\n name: 'timeout',\n type: 'number' as const,\n description: 'Request timeout in milliseconds (default: 30000)',\n required: false,\n defaultValue: '30000',\n },\n {\n name: 'location',\n aliases: ['L'],\n type: 'boolean' as const,\n description: 'Follow redirects (default: true)',\n required: false,\n },\n {\n name: 'proxy',\n type: 'boolean' as const,\n description: 'Route request through proxy.qodalis.com (bypasses CORS)',\n required: false,\n },\n {\n name: 'silent',\n aliases: ['s'],\n type: 'boolean' as const,\n description: 'Only output response body (no status line)',\n required: false,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const url = command.value;\n\n if (!url) {\n context.writer.writeError('URL is required. Usage: curl <url> [options]');\n context.process.exit(1);\n return;\n }\n\n const args = command.args;\n const explicitMethod = args['request'] || args['X'];\n const data = args['data'] || args['d'];\n const dataRaw = args['data-raw'];\n const hasBody = data != null || dataRaw != null;\n const verbose = !!args['verbose'] || !!args['v'];\n const pretty = !!args['pretty'];\n const silent = !!args['silent'] || !!args['s'];\n const useProxy = !!args['proxy'];\n const timeout = parseInt(args['timeout'] || '30000', 10);\n const followRedirects = args['location'] !== false && args['L'] !== false;\n\n let method: string;\n try {\n method = inferMethod(explicitMethod, hasBody);\n } catch (e: any) {\n context.writer.writeError(e.message);\n context.process.exit(1);\n return;\n }\n\n const headers = parseHeaders(args['header'] || args['H']);\n const body = resolveBody(data, dataRaw);\n const requestUrl = useProxy ? rewriteUrlToProxy(url) : url;\n\n const fetchOptions = buildFetchOptions({\n method,\n headers,\n body,\n followRedirects,\n });\n\n if (verbose) {\n context.writer.writeln(\n `> ${context.writer.wrapInColor(`${method} ${url}`, CliForegroundColor.Cyan)}`,\n );\n for (const [key, value] of Object.entries(headers)) {\n context.writer.writeln(\n `> ${context.writer.wrapInColor(`${key}: ${value}`, CliForegroundColor.Yellow)}`,\n );\n }\n if (body) {\n context.writer.writeln(`> Body: ${body}`);\n }\n context.writer.writeln();\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n fetchOptions.signal = controller.signal;\n\n const startTime = performance.now();\n\n try {\n const response = await fetch(requestUrl, fetchOptions);\n const elapsed = Math.round(performance.now() - startTime);\n const responseText = await response.text();\n const responseHeaders = extractResponseHeaders(response);\n\n const curlResponse: CurlResponse = {\n status: response.status,\n statusText: response.statusText,\n headers: responseHeaders,\n body: responseText,\n timing: elapsed,\n url: response.url,\n redirected: response.redirected,\n };\n\n if (!silent) {\n const statusColor = response.ok ? CliForegroundColor.Green : CliForegroundColor.Red;\n context.writer.writeln(\n context.writer.wrapInColor(\n `HTTP ${response.status} ${response.statusText}`,\n statusColor,\n ),\n );\n }\n\n if (verbose) {\n context.writer.writeln();\n for (const [key, value] of Object.entries(responseHeaders)) {\n context.writer.writeln(\n `< ${context.writer.wrapInColor(`${key}: ${value}`, CliForegroundColor.Yellow)}`,\n );\n }\n context.writer.writeln(\n `< ${context.writer.wrapInColor(`Time: ${elapsed}ms`, CliForegroundColor.Magenta)}`,\n );\n if (response.redirected) {\n context.writer.writeln(\n `< ${context.writer.wrapInColor(`Redirected to: ${response.url}`, CliForegroundColor.Cyan)}`,\n );\n }\n context.writer.writeln();\n }\n\n const formattedBody = formatResponseBody(responseText, pretty);\n if (formattedBody) {\n context.writer.writeln(formattedBody);\n }\n\n if (verbose) {\n context.writer.writeln();\n context.writer.writeInfo('Equivalent curl command:');\n context.writer.writeln(buildCurlEquivalent(url, method, headers, body));\n }\n\n context.process.output(curlResponse);\n } catch (error: any) {\n if (error.name === 'AbortError') {\n context.writer.writeError(`Request timed out after ${timeout}ms`);\n } else {\n context.writer.writeError(`Request failed: ${error.message}`);\n }\n context.process.exit(1);\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n const { writer } = context;\n\n writer.writeln(this.description!);\n writer.writeln();\n\n writer.writeln(writer.wrapInColor('Usage:', CliForegroundColor.Yellow));\n writer.writeln(` curl <url> [options]`);\n writer.writeln();\n\n writer.writeln(writer.wrapInColor('Options:', CliForegroundColor.Yellow));\n writer.writeln(` ${writer.wrapInColor('-X, --request <METHOD>', CliForegroundColor.Cyan)} HTTP method (default: GET, or POST if -d given)`);\n writer.writeln(` ${writer.wrapInColor('-H, --header <header>', CliForegroundColor.Cyan)} Add header (repeatable)`);\n writer.writeln(` ${writer.wrapInColor('-d, --data <body>', CliForegroundColor.Cyan)} Request body (auto-detects JSON)`);\n writer.writeln(` ${writer.wrapInColor('--data-raw <body>', CliForegroundColor.Cyan)} Request body as-is`);\n writer.writeln(` ${writer.wrapInColor('-v, --verbose', CliForegroundColor.Cyan)} Show headers and timing`);\n writer.writeln(` ${writer.wrapInColor('--pretty', CliForegroundColor.Cyan)} Pretty-print JSON response`);\n writer.writeln(` ${writer.wrapInColor('--timeout <ms>', CliForegroundColor.Cyan)} Timeout in ms (default: 30000)`);\n writer.writeln(` ${writer.wrapInColor('-L, --location', CliForegroundColor.Cyan)} Follow redirects (default: true)`);\n writer.writeln(` ${writer.wrapInColor('--proxy', CliForegroundColor.Cyan)} Route through CORS proxy`);\n writer.writeln(` ${writer.wrapInColor('-s, --silent', CliForegroundColor.Cyan)} Only output body`);\n writer.writeln();\n\n writer.writeln(writer.wrapInColor('Examples:', CliForegroundColor.Yellow));\n writer.writeln(` curl https://api.example.com/users`);\n writer.writeln(` curl https://api.example.com/users -X POST -d '{\"name\":\"John\"}' -H 'Content-Type: application/json'`);\n writer.writeln(` curl https://api.example.com/users -v --pretty`);\n writer.writeln(` curl https://api.example.com/status -X HEAD`);\n writer.writeln(` curl https://api.example.com/data --proxy --timeout 5000`);\n writer.writeln();\n\n writer.writeWarning('The server must allow CORS for this tool to work. Use --proxy to bypass CORS restrictions.');\n }\n\n async initialize(_context: ICliExecutionContext): Promise<void> {}\n}\n","/*\n * Public API Surface of curl\n */\n\nexport * from './lib/utilities';\nexport * from './lib/processors/cli-curl-command-processor';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliCurlCommandProcessor } from './lib/processors/cli-curl-command-processor';\nimport { API_VERSION } from './lib/version';\n\nexport const curlModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-curl',\n processors: [new CliCurlCommandProcessor()],\n translations: {\n es: { 'cli.curl.description': 'Realizar solicitudes HTTP desde la terminal' },\n fr: { 'cli.curl.description': 'Effectuer des requêtes HTTP depuis le terminal' },\n de: { 'cli.curl.description': 'HTTP-Anfragen vom Terminal ausführen' },\n pt: { 'cli.curl.description': 'Fazer requisições HTTP pelo terminal' },\n it: { 'cli.curl.description': 'Eseguire richieste HTTP dal terminale' },\n ja: { 'cli.curl.description': 'ターミナルからHTTPリクエストを実行' },\n ko: { 'cli.curl.description': '터미널에서 HTTP 요청 수행' },\n zh: { 'cli.curl.description': '从终端发送 HTTP 请求' },\n ru: { 'cli.curl.description': 'Выполнение HTTP-запросов из терминала' },\n ro: { 'cli.curl.description': 'Efectuează cereri HTTP din terminal' },\n },\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../packages/plugins/curl/src/lib/utilities/index.ts","../../packages/plugins/curl/src/lib/version.ts","../../packages/plugins/curl/src/lib/processors/cli-curl-command-processor.ts","../../packages/plugins/curl/src/public-api.ts"],"names":["DefaultLibraryAuthor","joinShellWords","getPluginConfigValue","CliForegroundColor"],"mappings":"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","file":"public-api.js","sourcesContent":["export interface CurlRequestOptions {\n method: string;\n headers: Record<string, string>;\n body?: string;\n followRedirects: boolean;\n}\n\nexport interface CurlResponse {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: string;\n timing: number;\n url: string;\n redirected: boolean;\n}\n\nconst VALID_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'];\n\nexport function inferMethod(explicitMethod?: string, hasBody?: boolean): string {\n if (explicitMethod) {\n const upper = explicitMethod.toUpperCase();\n if (!VALID_METHODS.includes(upper)) {\n throw new Error(`Invalid HTTP method: ${explicitMethod}. Valid methods: ${VALID_METHODS.join(', ')}`);\n }\n return upper;\n }\n return hasBody ? 'POST' : 'GET';\n}\n\nexport function parseHeaders(headerArgs: string | string[] | undefined): Record<string, string> {\n if (!headerArgs) return {};\n const arr = Array.isArray(headerArgs) ? headerArgs : [headerArgs];\n const result: Record<string, string> = {};\n for (const header of arr) {\n const colonIndex = header.indexOf(':');\n if (colonIndex === -1) continue;\n const key = header.substring(0, colonIndex).trim();\n const value = header.substring(colonIndex + 1).trim();\n if (key) result[key] = value;\n }\n return result;\n}\n\nexport function resolveBody(data?: string, dataRaw?: string): string | undefined {\n if (dataRaw != null) return dataRaw;\n if (data == null) return undefined;\n try {\n return JSON.stringify(JSON.parse(data));\n } catch {\n return data;\n }\n}\n\nexport function isJsonBody(body?: string): boolean {\n if (!body) return false;\n try {\n JSON.parse(body);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function buildFetchOptions(options: CurlRequestOptions): RequestInit {\n const headers = { ...options.headers };\n\n if (options.body && !headers['Content-Type'] && isJsonBody(options.body)) {\n headers['Content-Type'] = 'application/json';\n }\n\n const init: RequestInit = {\n method: options.method,\n headers,\n };\n\n if (options.body && options.method !== 'GET' && options.method !== 'HEAD') {\n init.body = options.body;\n }\n\n if (!options.followRedirects) {\n init.redirect = 'manual';\n }\n\n return init;\n}\n\nexport function formatResponseBody(body: string, pretty: boolean): string {\n if (!pretty) return body;\n try {\n return JSON.stringify(JSON.parse(body), null, 2);\n } catch {\n return body;\n }\n}\n\nexport function rewriteUrlToProxy(originalUrl: string): string {\n const match = originalUrl.match(/^(https?):\\/\\/([^/]+)(\\/.*)?$/i);\n if (!match) {\n throw new Error(`Invalid URL: ${originalUrl}`);\n }\n const scheme = match[1];\n const domain = match[2];\n const path = match[3] || '/';\n return `https://proxy.qodalis.com/proxy/${scheme}/${domain}${path}`;\n}\n\nexport function buildCurlEquivalent(\n url: string,\n method: string,\n headers: Record<string, string>,\n body?: string,\n): string {\n const parts = ['curl'];\n if (method !== 'GET') {\n parts.push(`-X ${method}`);\n }\n for (const [key, value] of Object.entries(headers)) {\n parts.push(`-H '${key}: ${value}'`);\n }\n if (body) {\n parts.push(`-d '${body}'`);\n }\n parts.push(`'${url}'`);\n return parts.join(' ');\n}\n\nexport function extractResponseHeaders(response: Response): Record<string, string> {\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headers[key] = value;\n });\n return headers;\n}\n","\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-beta.20';\nexport const API_VERSION = 2;\n ","import {\n CliForegroundColor,\n CliProcessCommand,\n CliProcessorMetadata,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliConfigurationOption,\n ICliExecutionContext,\n getPluginConfigValue,\n joinShellWords,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\nimport {\n CurlResponse,\n buildCurlEquivalent,\n buildFetchOptions,\n extractResponseHeaders,\n formatResponseBody,\n inferMethod,\n parseHeaders,\n resolveBody,\n rewriteUrlToProxy,\n} from '../utilities';\n\nexport class CliCurlCommandProcessor implements ICliCommandProcessor {\n command = 'curl';\n\n description = 'Make HTTP requests from the terminal. Supports all HTTP methods, custom headers, request bodies, timeouts, and more.';\n\n author = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n valueRequired = true;\n\n metadata?: CliProcessorMetadata = {\n icon: '🌐',\n requiredCoreVersion: '>=2.0.0 <3.0.0',\n requiredCliVersion: '>=2.0.0 <3.0.0',\n };\n\n configurationOptions?: ICliConfigurationOption[] = [\n {\n key: 'defaultTimeout',\n label: 'Default Timeout',\n description: 'Default request timeout in milliseconds',\n type: 'number',\n defaultValue: 30000,\n validator: (v) => ({\n valid: typeof v === 'number' && v >= 1000 && v <= 300000,\n message: 'Must be between 1000 and 300000 ms',\n }),\n },\n {\n key: 'prettyPrint',\n label: 'Pretty-Print JSON',\n description: 'Pretty-print JSON responses by default',\n type: 'boolean',\n defaultValue: false,\n },\n {\n key: 'verbose',\n label: 'Verbose Output',\n description: 'Show request/response headers by default',\n type: 'boolean',\n defaultValue: false,\n },\n ];\n\n parameters = [\n {\n name: 'request',\n aliases: ['X'],\n type: 'string' as const,\n description: 'HTTP method (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS)',\n required: false,\n },\n {\n name: 'header',\n aliases: ['H'],\n type: 'array' as const,\n description: 'Add header, e.g. -H \\'Content-Type: application/json\\' (repeatable)',\n required: false,\n },\n {\n name: 'data',\n aliases: ['d'],\n type: 'string' as const,\n description: 'Request body (auto-detects JSON, sets method to POST if -X not given)',\n required: false,\n },\n {\n name: 'data-raw',\n type: 'string' as const,\n description: 'Request body sent as-is without JSON parsing',\n required: false,\n },\n {\n name: 'verbose',\n aliases: ['v'],\n type: 'boolean' as const,\n description: 'Show request/response headers and timing',\n required: false,\n },\n {\n name: 'pretty',\n type: 'boolean' as const,\n description: 'Pretty-print JSON response body',\n required: false,\n },\n {\n name: 'timeout',\n type: 'number' as const,\n description: 'Request timeout in milliseconds (default: 30000)',\n required: false,\n defaultValue: '30000',\n },\n {\n name: 'location',\n aliases: ['L'],\n type: 'boolean' as const,\n description: 'Follow redirects (default: true)',\n required: false,\n },\n {\n name: 'proxy',\n type: 'boolean' as const,\n description: 'Route request through proxy.qodalis.com (bypasses CORS)',\n required: false,\n },\n {\n name: 'silent',\n aliases: ['s'],\n type: 'boolean' as const,\n description: 'Only output response body (no status line)',\n required: false,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const url = joinShellWords(command.value ?? '');\n\n if (!url) {\n context.writer.writeError('URL is required. Usage: curl <url> [options]');\n context.process.exit(1);\n return;\n }\n\n const args = command.args;\n const cfgTimeout = getPluginConfigValue(context, 'curl', 'defaultTimeout', 30000);\n const cfgPretty = getPluginConfigValue(context, 'curl', 'prettyPrint', false);\n const cfgVerbose = getPluginConfigValue(context, 'curl', 'verbose', false);\n\n const explicitMethod = args['request'] || args['X'];\n const data = args['data'] || args['d'];\n const dataRaw = args['data-raw'];\n const hasBody = data != null || dataRaw != null;\n const verbose = args['verbose'] != null || args['v'] != null ? (!!args['verbose'] || !!args['v']) : cfgVerbose;\n const pretty = args['pretty'] != null ? !!args['pretty'] : cfgPretty;\n const silent = !!args['silent'] || !!args['s'];\n const useProxy = !!args['proxy'];\n const timeout = parseInt(args['timeout'] || String(cfgTimeout), 10);\n const followRedirects = args['location'] !== false && args['L'] !== false;\n\n let method: string;\n try {\n method = inferMethod(explicitMethod, hasBody);\n } catch (e: any) {\n context.writer.writeError(e.message);\n context.process.exit(1);\n return;\n }\n\n const headers = parseHeaders(args['header'] || args['H']);\n const body = resolveBody(data, dataRaw);\n const requestUrl = useProxy ? rewriteUrlToProxy(url) : url;\n\n const fetchOptions = buildFetchOptions({\n method,\n headers,\n body,\n followRedirects,\n });\n\n if (verbose) {\n context.writer.writeln(\n `> ${context.writer.wrapInColor(`${method} ${url}`, CliForegroundColor.Cyan)}`,\n );\n for (const [key, value] of Object.entries(headers)) {\n context.writer.writeln(\n `> ${context.writer.wrapInColor(`${key}: ${value}`, CliForegroundColor.Yellow)}`,\n );\n }\n if (body) {\n context.writer.writeln(`> Body: ${body}`);\n }\n context.writer.writeln();\n }\n\n const timeoutController = new AbortController();\n const timeoutId = setTimeout(() => timeoutController.abort(), timeout);\n fetchOptions.signal = timeoutController.signal;\n\n const startTime = performance.now();\n\n try {\n const hostname = (() => { try { return new URL(url).hostname; } catch { return url; } })();\n context.notifier.info(`${method} ${hostname}`);\n const response = await context.http.fetch(requestUrl, fetchOptions);\n const elapsed = Math.round(performance.now() - startTime);\n context.notifier.info(`${method} ${hostname} — ${response.status}`);\n const responseText = await response.text();\n const responseHeaders = extractResponseHeaders(response);\n\n const curlResponse: CurlResponse = {\n status: response.status,\n statusText: response.statusText,\n headers: responseHeaders,\n body: responseText,\n timing: elapsed,\n url: response.url,\n redirected: response.redirected,\n };\n\n if (!silent) {\n const statusColor = response.ok ? CliForegroundColor.Green : CliForegroundColor.Red;\n context.writer.writeln(\n context.writer.wrapInColor(\n `HTTP ${response.status} ${response.statusText}`,\n statusColor,\n ),\n );\n }\n\n if (verbose) {\n context.writer.writeln();\n for (const [key, value] of Object.entries(responseHeaders)) {\n context.writer.writeln(\n `< ${context.writer.wrapInColor(`${key}: ${value}`, CliForegroundColor.Yellow)}`,\n );\n }\n context.writer.writeln(\n `< ${context.writer.wrapInColor(`Time: ${elapsed}ms`, CliForegroundColor.Magenta)}`,\n );\n if (response.redirected) {\n context.writer.writeln(\n `< ${context.writer.wrapInColor(`Redirected to: ${response.url}`, CliForegroundColor.Cyan)}`,\n );\n }\n context.writer.writeln();\n }\n\n const formattedBody = formatResponseBody(responseText, pretty);\n if (formattedBody) {\n context.writer.writeln(formattedBody);\n }\n\n if (verbose) {\n context.writer.writeln();\n context.writer.writeInfo('Equivalent curl command:');\n context.writer.writeln(buildCurlEquivalent(url, method, headers, body));\n }\n\n context.process.output(curlResponse);\n } catch (error: any) {\n if (error.name === 'AbortError') {\n if (timeoutController.signal.aborted) {\n context.writer.writeError(`Request timed out after ${timeout}ms`);\n } else {\n context.writer.writeWarning('Request cancelled.');\n }\n } else {\n context.writer.writeError(`Request failed: ${error.message}`);\n }\n context.process.exit(1);\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n const { writer } = context;\n\n writer.writeln(this.description!);\n writer.writeln();\n\n writer.writeln(writer.wrapInColor('Usage:', CliForegroundColor.Yellow));\n writer.writeln(` curl <url> [options]`);\n writer.writeln();\n\n writer.writeln(writer.wrapInColor('Options:', CliForegroundColor.Yellow));\n writer.writeln(` ${writer.wrapInColor('-X, --request <METHOD>', CliForegroundColor.Cyan)} HTTP method (default: GET, or POST if -d given)`);\n writer.writeln(` ${writer.wrapInColor('-H, --header <header>', CliForegroundColor.Cyan)} Add header (repeatable)`);\n writer.writeln(` ${writer.wrapInColor('-d, --data <body>', CliForegroundColor.Cyan)} Request body (auto-detects JSON)`);\n writer.writeln(` ${writer.wrapInColor('--data-raw <body>', CliForegroundColor.Cyan)} Request body as-is`);\n writer.writeln(` ${writer.wrapInColor('-v, --verbose', CliForegroundColor.Cyan)} Show headers and timing`);\n writer.writeln(` ${writer.wrapInColor('--pretty', CliForegroundColor.Cyan)} Pretty-print JSON response`);\n writer.writeln(` ${writer.wrapInColor('--timeout <ms>', CliForegroundColor.Cyan)} Timeout in ms (default: 30000)`);\n writer.writeln(` ${writer.wrapInColor('-L, --location', CliForegroundColor.Cyan)} Follow redirects (default: true)`);\n writer.writeln(` ${writer.wrapInColor('--proxy', CliForegroundColor.Cyan)} Route through CORS proxy`);\n writer.writeln(` ${writer.wrapInColor('-s, --silent', CliForegroundColor.Cyan)} Only output body`);\n writer.writeln();\n\n writer.writeln(writer.wrapInColor('Examples:', CliForegroundColor.Yellow));\n writer.writeln(` curl https://api.example.com/users`);\n writer.writeln(` curl https://api.example.com/users -X POST -d '{\"name\":\"John\"}' -H 'Content-Type: application/json'`);\n writer.writeln(` curl https://api.example.com/users -v --pretty`);\n writer.writeln(` curl https://api.example.com/status -X HEAD`);\n writer.writeln(` curl https://api.example.com/data --proxy --timeout 5000`);\n writer.writeln();\n\n writer.writeWarning('The server must allow CORS for this tool to work. Use --proxy to bypass CORS restrictions.');\n }\n\n async initialize(_context: ICliExecutionContext): Promise<void> {}\n}\n","/*\n * Public API Surface of curl\n */\n\nexport * from './lib/utilities';\nexport * from './lib/processors/cli-curl-command-processor';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliCurlCommandProcessor } from './lib/processors/cli-curl-command-processor';\nimport { API_VERSION } from './lib/version';\n\nexport const curlModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-curl',\n processors: [new CliCurlCommandProcessor()],\n translations: {\n es: { 'cli.curl.description': 'Realizar solicitudes HTTP desde la terminal' },\n fr: { 'cli.curl.description': 'Effectuer des requêtes HTTP depuis le terminal' },\n de: { 'cli.curl.description': 'HTTP-Anfragen vom Terminal ausführen' },\n pt: { 'cli.curl.description': 'Fazer requisições HTTP pelo terminal' },\n it: { 'cli.curl.description': 'Eseguire richieste HTTP dal terminale' },\n ja: { 'cli.curl.description': 'ターミナルからHTTPリクエストを実行' },\n ko: { 'cli.curl.description': '터미널에서 HTTP 요청 수행' },\n zh: { 'cli.curl.description': '从终端发送 HTTP 请求' },\n ru: { 'cli.curl.description': 'Выполнение HTTP-запросов из терминала' },\n ro: { 'cli.curl.description': 'Efectuează cereri HTTP din terminal' },\n },\n};\n"]}
|
package/public-api.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DefaultLibraryAuthor, CliForegroundColor } from '@qodalis/cli-core';
|
|
1
|
+
import { DefaultLibraryAuthor, joinShellWords, getPluginConfigValue, CliForegroundColor } from '@qodalis/cli-core';
|
|
2
2
|
|
|
3
3
|
// src/lib/utilities/index.ts
|
|
4
4
|
var VALID_METHODS = ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"];
|
|
@@ -69,7 +69,7 @@ function formatResponseBody(body, pretty) {
|
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
function rewriteUrlToProxy(originalUrl) {
|
|
72
|
-
const match = originalUrl.match(/^(https?):\/\/([
|
|
72
|
+
const match = originalUrl.match(/^(https?):\/\/([^/]+)(\/.*)?$/i);
|
|
73
73
|
if (!match) {
|
|
74
74
|
throw new Error(`Invalid URL: ${originalUrl}`);
|
|
75
75
|
}
|
|
@@ -101,7 +101,7 @@ function extractResponseHeaders(response) {
|
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
// src/lib/version.ts
|
|
104
|
-
var LIBRARY_VERSION = "2.0.0-beta.
|
|
104
|
+
var LIBRARY_VERSION = "2.0.0-beta.20";
|
|
105
105
|
var API_VERSION = 2;
|
|
106
106
|
|
|
107
107
|
// src/lib/processors/cli-curl-command-processor.ts
|
|
@@ -117,6 +117,33 @@ var CliCurlCommandProcessor = class {
|
|
|
117
117
|
requiredCoreVersion: ">=2.0.0 <3.0.0",
|
|
118
118
|
requiredCliVersion: ">=2.0.0 <3.0.0"
|
|
119
119
|
};
|
|
120
|
+
this.configurationOptions = [
|
|
121
|
+
{
|
|
122
|
+
key: "defaultTimeout",
|
|
123
|
+
label: "Default Timeout",
|
|
124
|
+
description: "Default request timeout in milliseconds",
|
|
125
|
+
type: "number",
|
|
126
|
+
defaultValue: 3e4,
|
|
127
|
+
validator: (v) => ({
|
|
128
|
+
valid: typeof v === "number" && v >= 1e3 && v <= 3e5,
|
|
129
|
+
message: "Must be between 1000 and 300000 ms"
|
|
130
|
+
})
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
key: "prettyPrint",
|
|
134
|
+
label: "Pretty-Print JSON",
|
|
135
|
+
description: "Pretty-print JSON responses by default",
|
|
136
|
+
type: "boolean",
|
|
137
|
+
defaultValue: false
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
key: "verbose",
|
|
141
|
+
label: "Verbose Output",
|
|
142
|
+
description: "Show request/response headers by default",
|
|
143
|
+
type: "boolean",
|
|
144
|
+
defaultValue: false
|
|
145
|
+
}
|
|
146
|
+
];
|
|
120
147
|
this.parameters = [
|
|
121
148
|
{
|
|
122
149
|
name: "request",
|
|
@@ -188,22 +215,25 @@ var CliCurlCommandProcessor = class {
|
|
|
188
215
|
];
|
|
189
216
|
}
|
|
190
217
|
async processCommand(command, context) {
|
|
191
|
-
const url = command.value;
|
|
218
|
+
const url = joinShellWords(command.value ?? "");
|
|
192
219
|
if (!url) {
|
|
193
220
|
context.writer.writeError("URL is required. Usage: curl <url> [options]");
|
|
194
221
|
context.process.exit(1);
|
|
195
222
|
return;
|
|
196
223
|
}
|
|
197
224
|
const args = command.args;
|
|
225
|
+
const cfgTimeout = getPluginConfigValue(context, "curl", "defaultTimeout", 3e4);
|
|
226
|
+
const cfgPretty = getPluginConfigValue(context, "curl", "prettyPrint", false);
|
|
227
|
+
const cfgVerbose = getPluginConfigValue(context, "curl", "verbose", false);
|
|
198
228
|
const explicitMethod = args["request"] || args["X"];
|
|
199
229
|
const data = args["data"] || args["d"];
|
|
200
230
|
const dataRaw = args["data-raw"];
|
|
201
231
|
const hasBody = data != null || dataRaw != null;
|
|
202
|
-
const verbose = !!args["verbose"] || !!args["v"];
|
|
203
|
-
const pretty = !!args["pretty"];
|
|
232
|
+
const verbose = args["verbose"] != null || args["v"] != null ? !!args["verbose"] || !!args["v"] : cfgVerbose;
|
|
233
|
+
const pretty = args["pretty"] != null ? !!args["pretty"] : cfgPretty;
|
|
204
234
|
const silent = !!args["silent"] || !!args["s"];
|
|
205
235
|
const useProxy = !!args["proxy"];
|
|
206
|
-
const timeout = parseInt(args["timeout"] ||
|
|
236
|
+
const timeout = parseInt(args["timeout"] || String(cfgTimeout), 10);
|
|
207
237
|
const followRedirects = args["location"] !== false && args["L"] !== false;
|
|
208
238
|
let method;
|
|
209
239
|
try {
|
|
@@ -236,13 +266,22 @@ var CliCurlCommandProcessor = class {
|
|
|
236
266
|
}
|
|
237
267
|
context.writer.writeln();
|
|
238
268
|
}
|
|
239
|
-
const
|
|
240
|
-
const timeoutId = setTimeout(() =>
|
|
241
|
-
fetchOptions.signal =
|
|
269
|
+
const timeoutController = new AbortController();
|
|
270
|
+
const timeoutId = setTimeout(() => timeoutController.abort(), timeout);
|
|
271
|
+
fetchOptions.signal = timeoutController.signal;
|
|
242
272
|
const startTime = performance.now();
|
|
243
273
|
try {
|
|
244
|
-
const
|
|
274
|
+
const hostname = (() => {
|
|
275
|
+
try {
|
|
276
|
+
return new URL(url).hostname;
|
|
277
|
+
} catch {
|
|
278
|
+
return url;
|
|
279
|
+
}
|
|
280
|
+
})();
|
|
281
|
+
context.notifier.info(`${method} ${hostname}`);
|
|
282
|
+
const response = await context.http.fetch(requestUrl, fetchOptions);
|
|
245
283
|
const elapsed = Math.round(performance.now() - startTime);
|
|
284
|
+
context.notifier.info(`${method} ${hostname} \u2014 ${response.status}`);
|
|
246
285
|
const responseText = await response.text();
|
|
247
286
|
const responseHeaders = extractResponseHeaders(response);
|
|
248
287
|
const curlResponse = {
|
|
@@ -292,7 +331,11 @@ var CliCurlCommandProcessor = class {
|
|
|
292
331
|
context.process.output(curlResponse);
|
|
293
332
|
} catch (error) {
|
|
294
333
|
if (error.name === "AbortError") {
|
|
295
|
-
|
|
334
|
+
if (timeoutController.signal.aborted) {
|
|
335
|
+
context.writer.writeError(`Request timed out after ${timeout}ms`);
|
|
336
|
+
} else {
|
|
337
|
+
context.writer.writeWarning("Request cancelled.");
|
|
338
|
+
}
|
|
296
339
|
} else {
|
|
297
340
|
context.writer.writeError(`Request failed: ${error.message}`);
|
|
298
341
|
}
|
package/public-api.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../packages/plugins/curl/src/lib/utilities/index.ts","../../packages/plugins/curl/src/lib/version.ts","../../packages/plugins/curl/src/lib/processors/cli-curl-command-processor.ts","../../packages/plugins/curl/src/public-api.ts"],"names":[],"mappings":"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","file":"public-api.mjs","sourcesContent":["export interface CurlRequestOptions {\n method: string;\n headers: Record<string, string>;\n body?: string;\n followRedirects: boolean;\n}\n\nexport interface CurlResponse {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: string;\n timing: number;\n url: string;\n redirected: boolean;\n}\n\nconst VALID_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'];\n\nexport function inferMethod(explicitMethod?: string, hasBody?: boolean): string {\n if (explicitMethod) {\n const upper = explicitMethod.toUpperCase();\n if (!VALID_METHODS.includes(upper)) {\n throw new Error(`Invalid HTTP method: ${explicitMethod}. Valid methods: ${VALID_METHODS.join(', ')}`);\n }\n return upper;\n }\n return hasBody ? 'POST' : 'GET';\n}\n\nexport function parseHeaders(headerArgs: string | string[] | undefined): Record<string, string> {\n if (!headerArgs) return {};\n const arr = Array.isArray(headerArgs) ? headerArgs : [headerArgs];\n const result: Record<string, string> = {};\n for (const header of arr) {\n const colonIndex = header.indexOf(':');\n if (colonIndex === -1) continue;\n const key = header.substring(0, colonIndex).trim();\n const value = header.substring(colonIndex + 1).trim();\n if (key) result[key] = value;\n }\n return result;\n}\n\nexport function resolveBody(data?: string, dataRaw?: string): string | undefined {\n if (dataRaw != null) return dataRaw;\n if (data == null) return undefined;\n try {\n return JSON.stringify(JSON.parse(data));\n } catch {\n return data;\n }\n}\n\nexport function isJsonBody(body?: string): boolean {\n if (!body) return false;\n try {\n JSON.parse(body);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function buildFetchOptions(options: CurlRequestOptions): RequestInit {\n const headers = { ...options.headers };\n\n if (options.body && !headers['Content-Type'] && isJsonBody(options.body)) {\n headers['Content-Type'] = 'application/json';\n }\n\n const init: RequestInit = {\n method: options.method,\n headers,\n };\n\n if (options.body && options.method !== 'GET' && options.method !== 'HEAD') {\n init.body = options.body;\n }\n\n if (!options.followRedirects) {\n init.redirect = 'manual';\n }\n\n return init;\n}\n\nexport function formatResponseBody(body: string, pretty: boolean): string {\n if (!pretty) return body;\n try {\n return JSON.stringify(JSON.parse(body), null, 2);\n } catch {\n return body;\n }\n}\n\nexport function rewriteUrlToProxy(originalUrl: string): string {\n const match = originalUrl.match(/^(https?):\\/\\/([^\\/]+)(\\/.*)?$/i);\n if (!match) {\n throw new Error(`Invalid URL: ${originalUrl}`);\n }\n const scheme = match[1];\n const domain = match[2];\n const path = match[3] || '/';\n return `https://proxy.qodalis.com/proxy/${scheme}/${domain}${path}`;\n}\n\nexport function buildCurlEquivalent(\n url: string,\n method: string,\n headers: Record<string, string>,\n body?: string,\n): string {\n const parts = ['curl'];\n if (method !== 'GET') {\n parts.push(`-X ${method}`);\n }\n for (const [key, value] of Object.entries(headers)) {\n parts.push(`-H '${key}: ${value}'`);\n }\n if (body) {\n parts.push(`-d '${body}'`);\n }\n parts.push(`'${url}'`);\n return parts.join(' ');\n}\n\nexport function extractResponseHeaders(response: Response): Record<string, string> {\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headers[key] = value;\n });\n return headers;\n}\n","\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-beta.2';\nexport const API_VERSION = 2;\n ","import {\n CliForegroundColor,\n CliProcessCommand,\n CliProcessorMetadata,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\nimport {\n CurlResponse,\n buildCurlEquivalent,\n buildFetchOptions,\n extractResponseHeaders,\n formatResponseBody,\n inferMethod,\n parseHeaders,\n resolveBody,\n rewriteUrlToProxy,\n} from '../utilities';\n\nexport class CliCurlCommandProcessor implements ICliCommandProcessor {\n command = 'curl';\n\n description = 'Make HTTP requests from the terminal. Supports all HTTP methods, custom headers, request bodies, timeouts, and more.';\n\n author = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n valueRequired = true;\n\n metadata?: CliProcessorMetadata = {\n icon: '🌐',\n requiredCoreVersion: '>=2.0.0 <3.0.0',\n requiredCliVersion: '>=2.0.0 <3.0.0',\n };\n\n parameters = [\n {\n name: 'request',\n aliases: ['X'],\n type: 'string' as const,\n description: 'HTTP method (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS)',\n required: false,\n },\n {\n name: 'header',\n aliases: ['H'],\n type: 'array' as const,\n description: 'Add header, e.g. -H \\'Content-Type: application/json\\' (repeatable)',\n required: false,\n },\n {\n name: 'data',\n aliases: ['d'],\n type: 'string' as const,\n description: 'Request body (auto-detects JSON, sets method to POST if -X not given)',\n required: false,\n },\n {\n name: 'data-raw',\n type: 'string' as const,\n description: 'Request body sent as-is without JSON parsing',\n required: false,\n },\n {\n name: 'verbose',\n aliases: ['v'],\n type: 'boolean' as const,\n description: 'Show request/response headers and timing',\n required: false,\n },\n {\n name: 'pretty',\n type: 'boolean' as const,\n description: 'Pretty-print JSON response body',\n required: false,\n },\n {\n name: 'timeout',\n type: 'number' as const,\n description: 'Request timeout in milliseconds (default: 30000)',\n required: false,\n defaultValue: '30000',\n },\n {\n name: 'location',\n aliases: ['L'],\n type: 'boolean' as const,\n description: 'Follow redirects (default: true)',\n required: false,\n },\n {\n name: 'proxy',\n type: 'boolean' as const,\n description: 'Route request through proxy.qodalis.com (bypasses CORS)',\n required: false,\n },\n {\n name: 'silent',\n aliases: ['s'],\n type: 'boolean' as const,\n description: 'Only output response body (no status line)',\n required: false,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const url = command.value;\n\n if (!url) {\n context.writer.writeError('URL is required. Usage: curl <url> [options]');\n context.process.exit(1);\n return;\n }\n\n const args = command.args;\n const explicitMethod = args['request'] || args['X'];\n const data = args['data'] || args['d'];\n const dataRaw = args['data-raw'];\n const hasBody = data != null || dataRaw != null;\n const verbose = !!args['verbose'] || !!args['v'];\n const pretty = !!args['pretty'];\n const silent = !!args['silent'] || !!args['s'];\n const useProxy = !!args['proxy'];\n const timeout = parseInt(args['timeout'] || '30000', 10);\n const followRedirects = args['location'] !== false && args['L'] !== false;\n\n let method: string;\n try {\n method = inferMethod(explicitMethod, hasBody);\n } catch (e: any) {\n context.writer.writeError(e.message);\n context.process.exit(1);\n return;\n }\n\n const headers = parseHeaders(args['header'] || args['H']);\n const body = resolveBody(data, dataRaw);\n const requestUrl = useProxy ? rewriteUrlToProxy(url) : url;\n\n const fetchOptions = buildFetchOptions({\n method,\n headers,\n body,\n followRedirects,\n });\n\n if (verbose) {\n context.writer.writeln(\n `> ${context.writer.wrapInColor(`${method} ${url}`, CliForegroundColor.Cyan)}`,\n );\n for (const [key, value] of Object.entries(headers)) {\n context.writer.writeln(\n `> ${context.writer.wrapInColor(`${key}: ${value}`, CliForegroundColor.Yellow)}`,\n );\n }\n if (body) {\n context.writer.writeln(`> Body: ${body}`);\n }\n context.writer.writeln();\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n fetchOptions.signal = controller.signal;\n\n const startTime = performance.now();\n\n try {\n const response = await fetch(requestUrl, fetchOptions);\n const elapsed = Math.round(performance.now() - startTime);\n const responseText = await response.text();\n const responseHeaders = extractResponseHeaders(response);\n\n const curlResponse: CurlResponse = {\n status: response.status,\n statusText: response.statusText,\n headers: responseHeaders,\n body: responseText,\n timing: elapsed,\n url: response.url,\n redirected: response.redirected,\n };\n\n if (!silent) {\n const statusColor = response.ok ? CliForegroundColor.Green : CliForegroundColor.Red;\n context.writer.writeln(\n context.writer.wrapInColor(\n `HTTP ${response.status} ${response.statusText}`,\n statusColor,\n ),\n );\n }\n\n if (verbose) {\n context.writer.writeln();\n for (const [key, value] of Object.entries(responseHeaders)) {\n context.writer.writeln(\n `< ${context.writer.wrapInColor(`${key}: ${value}`, CliForegroundColor.Yellow)}`,\n );\n }\n context.writer.writeln(\n `< ${context.writer.wrapInColor(`Time: ${elapsed}ms`, CliForegroundColor.Magenta)}`,\n );\n if (response.redirected) {\n context.writer.writeln(\n `< ${context.writer.wrapInColor(`Redirected to: ${response.url}`, CliForegroundColor.Cyan)}`,\n );\n }\n context.writer.writeln();\n }\n\n const formattedBody = formatResponseBody(responseText, pretty);\n if (formattedBody) {\n context.writer.writeln(formattedBody);\n }\n\n if (verbose) {\n context.writer.writeln();\n context.writer.writeInfo('Equivalent curl command:');\n context.writer.writeln(buildCurlEquivalent(url, method, headers, body));\n }\n\n context.process.output(curlResponse);\n } catch (error: any) {\n if (error.name === 'AbortError') {\n context.writer.writeError(`Request timed out after ${timeout}ms`);\n } else {\n context.writer.writeError(`Request failed: ${error.message}`);\n }\n context.process.exit(1);\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n const { writer } = context;\n\n writer.writeln(this.description!);\n writer.writeln();\n\n writer.writeln(writer.wrapInColor('Usage:', CliForegroundColor.Yellow));\n writer.writeln(` curl <url> [options]`);\n writer.writeln();\n\n writer.writeln(writer.wrapInColor('Options:', CliForegroundColor.Yellow));\n writer.writeln(` ${writer.wrapInColor('-X, --request <METHOD>', CliForegroundColor.Cyan)} HTTP method (default: GET, or POST if -d given)`);\n writer.writeln(` ${writer.wrapInColor('-H, --header <header>', CliForegroundColor.Cyan)} Add header (repeatable)`);\n writer.writeln(` ${writer.wrapInColor('-d, --data <body>', CliForegroundColor.Cyan)} Request body (auto-detects JSON)`);\n writer.writeln(` ${writer.wrapInColor('--data-raw <body>', CliForegroundColor.Cyan)} Request body as-is`);\n writer.writeln(` ${writer.wrapInColor('-v, --verbose', CliForegroundColor.Cyan)} Show headers and timing`);\n writer.writeln(` ${writer.wrapInColor('--pretty', CliForegroundColor.Cyan)} Pretty-print JSON response`);\n writer.writeln(` ${writer.wrapInColor('--timeout <ms>', CliForegroundColor.Cyan)} Timeout in ms (default: 30000)`);\n writer.writeln(` ${writer.wrapInColor('-L, --location', CliForegroundColor.Cyan)} Follow redirects (default: true)`);\n writer.writeln(` ${writer.wrapInColor('--proxy', CliForegroundColor.Cyan)} Route through CORS proxy`);\n writer.writeln(` ${writer.wrapInColor('-s, --silent', CliForegroundColor.Cyan)} Only output body`);\n writer.writeln();\n\n writer.writeln(writer.wrapInColor('Examples:', CliForegroundColor.Yellow));\n writer.writeln(` curl https://api.example.com/users`);\n writer.writeln(` curl https://api.example.com/users -X POST -d '{\"name\":\"John\"}' -H 'Content-Type: application/json'`);\n writer.writeln(` curl https://api.example.com/users -v --pretty`);\n writer.writeln(` curl https://api.example.com/status -X HEAD`);\n writer.writeln(` curl https://api.example.com/data --proxy --timeout 5000`);\n writer.writeln();\n\n writer.writeWarning('The server must allow CORS for this tool to work. Use --proxy to bypass CORS restrictions.');\n }\n\n async initialize(_context: ICliExecutionContext): Promise<void> {}\n}\n","/*\n * Public API Surface of curl\n */\n\nexport * from './lib/utilities';\nexport * from './lib/processors/cli-curl-command-processor';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliCurlCommandProcessor } from './lib/processors/cli-curl-command-processor';\nimport { API_VERSION } from './lib/version';\n\nexport const curlModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-curl',\n processors: [new CliCurlCommandProcessor()],\n translations: {\n es: { 'cli.curl.description': 'Realizar solicitudes HTTP desde la terminal' },\n fr: { 'cli.curl.description': 'Effectuer des requêtes HTTP depuis le terminal' },\n de: { 'cli.curl.description': 'HTTP-Anfragen vom Terminal ausführen' },\n pt: { 'cli.curl.description': 'Fazer requisições HTTP pelo terminal' },\n it: { 'cli.curl.description': 'Eseguire richieste HTTP dal terminale' },\n ja: { 'cli.curl.description': 'ターミナルからHTTPリクエストを実行' },\n ko: { 'cli.curl.description': '터미널에서 HTTP 요청 수행' },\n zh: { 'cli.curl.description': '从终端发送 HTTP 请求' },\n ru: { 'cli.curl.description': 'Выполнение HTTP-запросов из терминала' },\n ro: { 'cli.curl.description': 'Efectuează cereri HTTP din terminal' },\n },\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../packages/plugins/curl/src/lib/utilities/index.ts","../../packages/plugins/curl/src/lib/version.ts","../../packages/plugins/curl/src/lib/processors/cli-curl-command-processor.ts","../../packages/plugins/curl/src/public-api.ts"],"names":[],"mappings":";;;AAiBA,IAAM,aAAA,GAAgB,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,OAAA,EAAS,QAAA,EAAU,QAAQ,SAAS,CAAA;AAE1E,SAAS,WAAA,CAAY,gBAAyB,OAAA,EAA2B;AAC5E,EAAA,IAAI,cAAA,EAAgB;AAChB,IAAA,MAAM,KAAA,GAAQ,eAAe,WAAA,EAAY;AACzC,IAAA,IAAI,CAAC,aAAA,CAAc,QAAA,CAAS,KAAK,CAAA,EAAG;AAChC,MAAA,MAAM,IAAI,MAAM,CAAA,qBAAA,EAAwB,cAAc,oBAAoB,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACxG;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AACA,EAAA,OAAO,UAAU,MAAA,GAAS,KAAA;AAC9B;AAEO,SAAS,aAAa,UAAA,EAAmE;AAC5F,EAAA,IAAI,CAAC,UAAA,EAAY,OAAO,EAAC;AACzB,EAAA,MAAM,MAAM,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,GAAI,UAAA,GAAa,CAAC,UAAU,CAAA;AAChE,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,UAAU,GAAA,EAAK;AACtB,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AACrC,IAAA,IAAI,eAAe,EAAA,EAAI;AACvB,IAAA,MAAM,MAAM,MAAA,CAAO,SAAA,CAAU,CAAA,EAAG,UAAU,EAAE,IAAA,EAAK;AACjD,IAAA,MAAM,QAAQ,MAAA,CAAO,SAAA,CAAU,UAAA,GAAa,CAAC,EAAE,IAAA,EAAK;AACpD,IAAA,IAAI,GAAA,EAAK,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,EAC3B;AACA,EAAA,OAAO,MAAA;AACX;AAEO,SAAS,WAAA,CAAY,MAAe,OAAA,EAAsC;AAC7E,EAAA,IAAI,OAAA,IAAW,MAAM,OAAO,OAAA;AAC5B,EAAA,IAAI,IAAA,IAAQ,MAAM,OAAO,MAAA;AACzB,EAAA,IAAI;AACA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,EAC1C,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;AAEO,SAAS,WAAW,IAAA,EAAwB;AAC/C,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,EAAA,IAAI;AACA,IAAA,IAAA,CAAK,MAAM,IAAI,CAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACX,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,KAAA;AAAA,EACX;AACJ;AAEO,SAAS,kBAAkB,OAAA,EAA0C;AACxE,EAAA,MAAM,OAAA,GAAU,EAAE,GAAG,OAAA,CAAQ,OAAA,EAAQ;AAErC,EAAA,IAAI,OAAA,CAAQ,QAAQ,CAAC,OAAA,CAAQ,cAAc,CAAA,IAAK,UAAA,CAAW,OAAA,CAAQ,IAAI,CAAA,EAAG;AACtE,IAAA,OAAA,CAAQ,cAAc,CAAA,GAAI,kBAAA;AAAA,EAC9B;AAEA,EAAA,MAAM,IAAA,GAAoB;AAAA,IACtB,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB;AAAA,GACJ;AAEA,EAAA,IAAI,QAAQ,IAAA,IAAQ,OAAA,CAAQ,WAAW,KAAA,IAAS,OAAA,CAAQ,WAAW,MAAA,EAAQ;AACvE,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AAAA,EACxB;AAEA,EAAA,IAAI,CAAC,QAAQ,eAAA,EAAiB;AAC1B,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EACpB;AAEA,EAAA,OAAO,IAAA;AACX;AAEO,SAAS,kBAAA,CAAmB,MAAc,MAAA,EAAyB;AACtE,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,IAAI;AACA,IAAA,OAAO,KAAK,SAAA,CAAU,IAAA,CAAK,MAAM,IAAI,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,EACnD,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;AAEO,SAAS,kBAAkB,WAAA,EAA6B;AAC3D,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAA,CAAM,gCAAgC,CAAA;AAChE,EAAA,IAAI,CAAC,KAAA,EAAO;AACR,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,aAAA,EAAgB,WAAW,CAAA,CAAE,CAAA;AAAA,EACjD;AACA,EAAA,MAAM,MAAA,GAAS,MAAM,CAAC,CAAA;AACtB,EAAA,MAAM,MAAA,GAAS,MAAM,CAAC,CAAA;AACtB,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,IAAK,GAAA;AACzB,EAAA,OAAO,CAAA,gCAAA,EAAmC,MAAM,CAAA,CAAA,EAAI,MAAM,GAAG,IAAI,CAAA,CAAA;AACrE;AAEO,SAAS,mBAAA,CACZ,GAAA,EACA,MAAA,EACA,OAAA,EACA,IAAA,EACM;AACN,EAAA,MAAM,KAAA,GAAQ,CAAC,MAAM,CAAA;AACrB,EAAA,IAAI,WAAW,KAAA,EAAO;AAClB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,GAAA,EAAM,MAAM,CAAA,CAAE,CAAA;AAAA,EAC7B;AACA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAChD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,EACtC;AACA,EAAA,IAAI,IAAA,EAAM;AACN,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EAC7B;AACA,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAG,CAAA;AACrB,EAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AACzB;AAEO,SAAS,uBAAuB,QAAA,EAA4C;AAC/E,EAAA,MAAM,UAAkC,EAAC;AACzC,EAAA,QAAA,CAAS,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AACrC,IAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,KAAA;AAAA,EACnB,CAAC,CAAA;AACD,EAAA,OAAO,OAAA;AACX;;;ACnIO,IAAM,eAAA,GAAkB,eAAA;AACxB,IAAM,WAAA,GAAc,CAAA;;;ACqBpB,IAAM,0BAAN,MAA8D;AAAA,EAA9D,WAAA,GAAA;AACH,IAAA,IAAA,CAAA,OAAA,GAAU,MAAA;AAEV,IAAA,IAAA,CAAA,WAAA,GAAc,sHAAA;AAEd,IAAA,IAAA,CAAA,MAAA,GAAS,oBAAA;AAET,IAAA,IAAA,CAAA,OAAA,GAAU,eAAA;AAEV,IAAA,IAAA,CAAA,aAAA,GAAgB,IAAA;AAEhB,IAAA,IAAA,CAAA,QAAA,GAAkC;AAAA,MAC9B,IAAA,EAAM,WAAA;AAAA,MACN,mBAAA,EAAqB,gBAAA;AAAA,MACrB,kBAAA,EAAoB;AAAA,KACxB;AAEA,IAAA,IAAA,CAAA,oBAAA,GAAmD;AAAA,MAC/C;AAAA,QACI,GAAA,EAAK,gBAAA;AAAA,QACL,KAAA,EAAO,iBAAA;AAAA,QACP,WAAA,EAAa,yCAAA;AAAA,QACb,IAAA,EAAM,QAAA;AAAA,QACN,YAAA,EAAc,GAAA;AAAA,QACd,SAAA,EAAW,CAAC,CAAA,MAAO;AAAA,UACf,OAAO,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,IAAK,OAAQ,CAAA,IAAK,GAAA;AAAA,UAClD,OAAA,EAAS;AAAA,SACb;AAAA,OACJ;AAAA,MACA;AAAA,QACI,GAAA,EAAK,aAAA;AAAA,QACL,KAAA,EAAO,mBAAA;AAAA,QACP,WAAA,EAAa,wCAAA;AAAA,QACb,IAAA,EAAM,SAAA;AAAA,QACN,YAAA,EAAc;AAAA,OAClB;AAAA,MACA;AAAA,QACI,GAAA,EAAK,SAAA;AAAA,QACL,KAAA,EAAO,gBAAA;AAAA,QACP,WAAA,EAAa,0CAAA;AAAA,QACb,IAAA,EAAM,SAAA;AAAA,QACN,YAAA,EAAc;AAAA;AAClB,KACJ;AAEA,IAAA,IAAA,CAAA,UAAA,GAAa;AAAA,MACT;AAAA,QACI,IAAA,EAAM,SAAA;AAAA,QACN,OAAA,EAAS,CAAC,GAAG,CAAA;AAAA,QACb,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,4DAAA;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,mEAAA;AAAA,QACb,QAAA,EAAU;AAAA,OACd;AAAA,MACA;AAAA,QACI,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,CAAC,GAAG,CAAA;AAAA,QACb,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,uEAAA;AAAA,QACb,QAAA,EAAU;AAAA,OACd;AAAA,MACA;AAAA,QACI,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,8CAAA;AAAA,QACb,QAAA,EAAU;AAAA,OACd;AAAA,MACA;AAAA,QACI,IAAA,EAAM,SAAA;AAAA,QACN,OAAA,EAAS,CAAC,GAAG,CAAA;AAAA,QACb,IAAA,EAAM,SAAA;AAAA,QACN,WAAA,EAAa,0CAAA;AAAA,QACb,QAAA,EAAU;AAAA,OACd;AAAA,MACA;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,SAAA;AAAA,QACN,WAAA,EAAa,iCAAA;AAAA,QACb,QAAA,EAAU;AAAA,OACd;AAAA,MACA;AAAA,QACI,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,kDAAA;AAAA,QACb,QAAA,EAAU,KAAA;AAAA,QACV,YAAA,EAAc;AAAA,OAClB;AAAA,MACA;AAAA,QACI,IAAA,EAAM,UAAA;AAAA,QACN,OAAA,EAAS,CAAC,GAAG,CAAA;AAAA,QACb,IAAA,EAAM,SAAA;AAAA,QACN,WAAA,EAAa,kCAAA;AAAA,QACb,QAAA,EAAU;AAAA,OACd;AAAA,MACA;AAAA,QACI,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,SAAA;AAAA,QACN,WAAA,EAAa,yDAAA;AAAA,QACb,QAAA,EAAU;AAAA,OACd;AAAA,MACA;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS,CAAC,GAAG,CAAA;AAAA,QACb,IAAA,EAAM,SAAA;AAAA,QACN,WAAA,EAAa,4CAAA;AAAA,QACb,QAAA,EAAU;AAAA;AACd,KACJ;AAAA,EAAA;AAAA,EAEA,MAAM,cAAA,CACF,OAAA,EACA,OAAA,EACa;AACb,IAAA,MAAM,GAAA,GAAM,cAAA,CAAe,OAAA,CAAQ,KAAA,IAAS,EAAE,CAAA;AAE9C,IAAA,IAAI,CAAC,GAAA,EAAK;AACN,MAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,8CAA8C,CAAA;AACxE,MAAA,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAC,CAAA;AACtB,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,OAAO,OAAA,CAAQ,IAAA;AACrB,IAAA,MAAM,UAAA,GAAa,oBAAA,CAAqB,OAAA,EAAS,MAAA,EAAQ,kBAAkB,GAAK,CAAA;AAChF,IAAA,MAAM,SAAA,GAAY,oBAAA,CAAqB,OAAA,EAAS,MAAA,EAAQ,eAAe,KAAK,CAAA;AAC5E,IAAA,MAAM,UAAA,GAAa,oBAAA,CAAqB,OAAA,EAAS,MAAA,EAAQ,WAAW,KAAK,CAAA;AAEzE,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,SAAS,CAAA,IAAK,KAAK,GAAG,CAAA;AAClD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAM,CAAA,IAAK,KAAK,GAAG,CAAA;AACrC,IAAA,MAAM,OAAA,GAAU,KAAK,UAAU,CAAA;AAC/B,IAAA,MAAM,OAAA,GAAU,IAAA,IAAQ,IAAA,IAAQ,OAAA,IAAW,IAAA;AAC3C,IAAA,MAAM,UAAU,IAAA,CAAK,SAAS,KAAK,IAAA,IAAQ,IAAA,CAAK,GAAG,CAAA,IAAK,IAAA,GAAQ,CAAC,CAAC,KAAK,SAAS,CAAA,IAAK,CAAC,CAAC,IAAA,CAAK,GAAG,CAAA,GAAK,UAAA;AACpG,IAAA,MAAM,MAAA,GAAS,KAAK,QAAQ,CAAA,IAAK,OAAO,CAAC,CAAC,IAAA,CAAK,QAAQ,CAAA,GAAI,SAAA;AAC3D,IAAA,MAAM,MAAA,GAAS,CAAC,CAAC,IAAA,CAAK,QAAQ,CAAA,IAAK,CAAC,CAAC,IAAA,CAAK,GAAG,CAAA;AAC7C,IAAA,MAAM,QAAA,GAAW,CAAC,CAAC,IAAA,CAAK,OAAO,CAAA;AAC/B,IAAA,MAAM,OAAA,GAAU,SAAS,IAAA,CAAK,SAAS,KAAK,MAAA,CAAO,UAAU,GAAG,EAAE,CAAA;AAClE,IAAA,MAAM,kBAAkB,IAAA,CAAK,UAAU,MAAM,KAAA,IAAS,IAAA,CAAK,GAAG,CAAA,KAAM,KAAA;AAEpE,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACA,MAAA,MAAA,GAAS,WAAA,CAAY,gBAAgB,OAAO,CAAA;AAAA,IAChD,SAAS,CAAA,EAAQ;AACb,MAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,CAAA,CAAE,OAAO,CAAA;AACnC,MAAA,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAC,CAAA;AACtB,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,UAAU,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA,IAAK,IAAA,CAAK,GAAG,CAAC,CAAA;AACxD,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,EAAM,OAAO,CAAA;AACtC,IAAA,MAAM,UAAA,GAAa,QAAA,GAAW,iBAAA,CAAkB,GAAG,CAAA,GAAI,GAAA;AAEvD,IAAA,MAAM,eAAe,iBAAA,CAAkB;AAAA,MACnC,MAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACH,CAAA;AAED,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,OAAA,CAAQ,MAAA,CAAO,OAAA;AAAA,QACX,CAAA,EAAA,EAAK,OAAA,CAAQ,MAAA,CAAO,WAAA,CAAY,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,kBAAA,CAAmB,IAAI,CAAC,CAAA;AAAA,OAChF;AACA,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAChD,QAAA,OAAA,CAAQ,MAAA,CAAO,OAAA;AAAA,UACX,CAAA,EAAA,EAAK,OAAA,CAAQ,MAAA,CAAO,WAAA,CAAY,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,EAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA;AAAA,SAClF;AAAA,MACJ;AACA,MAAA,IAAI,IAAA,EAAM;AACN,QAAA,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,CAAA,QAAA,EAAW,IAAI,CAAA,CAAE,CAAA;AAAA,MAC5C;AACA,MAAA,OAAA,CAAQ,OAAO,OAAA,EAAQ;AAAA,IAC3B;AAEA,IAAA,MAAM,iBAAA,GAAoB,IAAI,eAAA,EAAgB;AAC9C,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,iBAAA,CAAkB,KAAA,IAAS,OAAO,CAAA;AACrE,IAAA,YAAA,CAAa,SAAS,iBAAA,CAAkB,MAAA;AAExC,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAElC,IAAA,IAAI;AACA,MAAA,MAAM,YAAY,MAAM;AAAE,QAAA,IAAI;AAAE,UAAA,OAAO,IAAI,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA;AAAA,QAAU,CAAA,CAAA,MAAQ;AAAE,UAAA,OAAO,GAAA;AAAA,QAAK;AAAA,MAAE,CAAA,GAAG;AACzF,MAAA,OAAA,CAAQ,SAAS,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE,CAAA;AAC7C,MAAA,MAAM,WAAW,MAAM,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,YAAY,YAAY,CAAA;AAClE,MAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,GAAA,KAAQ,SAAS,CAAA;AACxD,MAAA,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG,MAAM,IAAI,QAAQ,CAAA,QAAA,EAAM,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAClE,MAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,IAAA,EAAK;AACzC,MAAA,MAAM,eAAA,GAAkB,uBAAuB,QAAQ,CAAA;AAEvD,MAAA,MAAM,YAAA,GAA6B;AAAA,QAC/B,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,YAAY,QAAA,CAAS,UAAA;AAAA,QACrB,OAAA,EAAS,eAAA;AAAA,QACT,IAAA,EAAM,YAAA;AAAA,QACN,MAAA,EAAQ,OAAA;AAAA,QACR,KAAK,QAAA,CAAS,GAAA;AAAA,QACd,YAAY,QAAA,CAAS;AAAA,OACzB;AAEA,MAAA,IAAI,CAAC,MAAA,EAAQ;AACT,QAAA,MAAM,WAAA,GAAc,QAAA,CAAS,EAAA,GAAK,kBAAA,CAAmB,QAAQ,kBAAA,CAAmB,GAAA;AAChF,QAAA,OAAA,CAAQ,MAAA,CAAO,OAAA;AAAA,UACX,QAAQ,MAAA,CAAO,WAAA;AAAA,YACX,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA,CAAA;AAAA,YAC9C;AAAA;AACJ,SACJ;AAAA,MACJ;AAEA,MAAA,IAAI,OAAA,EAAS;AACT,QAAA,OAAA,CAAQ,OAAO,OAAA,EAAQ;AACvB,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,EAAG;AACxD,UAAA,OAAA,CAAQ,MAAA,CAAO,OAAA;AAAA,YACX,CAAA,EAAA,EAAK,OAAA,CAAQ,MAAA,CAAO,WAAA,CAAY,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,EAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA;AAAA,WAClF;AAAA,QACJ;AACA,QAAA,OAAA,CAAQ,MAAA,CAAO,OAAA;AAAA,UACX,CAAA,EAAA,EAAK,QAAQ,MAAA,CAAO,WAAA,CAAY,SAAS,OAAO,CAAA,EAAA,CAAA,EAAM,kBAAA,CAAmB,OAAO,CAAC,CAAA;AAAA,SACrF;AACA,QAAA,IAAI,SAAS,UAAA,EAAY;AACrB,UAAA,OAAA,CAAQ,MAAA,CAAO,OAAA;AAAA,YACX,CAAA,EAAA,EAAK,OAAA,CAAQ,MAAA,CAAO,WAAA,CAAY,CAAA,eAAA,EAAkB,SAAS,GAAG,CAAA,CAAA,EAAI,kBAAA,CAAmB,IAAI,CAAC,CAAA;AAAA,WAC9F;AAAA,QACJ;AACA,QAAA,OAAA,CAAQ,OAAO,OAAA,EAAQ;AAAA,MAC3B;AAEA,MAAA,MAAM,aAAA,GAAgB,kBAAA,CAAmB,YAAA,EAAc,MAAM,CAAA;AAC7D,MAAA,IAAI,aAAA,EAAe;AACf,QAAA,OAAA,CAAQ,MAAA,CAAO,QAAQ,aAAa,CAAA;AAAA,MACxC;AAEA,MAAA,IAAI,OAAA,EAAS;AACT,QAAA,OAAA,CAAQ,OAAO,OAAA,EAAQ;AACvB,QAAA,OAAA,CAAQ,MAAA,CAAO,UAAU,0BAA0B,CAAA;AACnD,QAAA,OAAA,CAAQ,OAAO,OAAA,CAAQ,mBAAA,CAAoB,KAAK,MAAA,EAAQ,OAAA,EAAS,IAAI,CAAC,CAAA;AAAA,MAC1E;AAEA,MAAA,OAAA,CAAQ,OAAA,CAAQ,OAAO,YAAY,CAAA;AAAA,IACvC,SAAS,KAAA,EAAY;AACjB,MAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC7B,QAAA,IAAI,iBAAA,CAAkB,OAAO,OAAA,EAAS;AAClC,UAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,CAAA,wBAAA,EAA2B,OAAO,CAAA,EAAA,CAAI,CAAA;AAAA,QACpE,CAAA,MAAO;AACH,UAAA,OAAA,CAAQ,MAAA,CAAO,aAAa,oBAAoB,CAAA;AAAA,QACpD;AAAA,MACJ,CAAA,MAAO;AACH,QAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,CAAA,gBAAA,EAAmB,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAChE;AACA,MAAA,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAC1B,CAAA,SAAE;AACE,MAAA,YAAA,CAAa,SAAS,CAAA;AAAA,IAC1B;AAAA,EACJ;AAAA,EAEA,iBAAiB,OAAA,EAAqC;AAClD,IAAA,MAAM,EAAE,QAAO,GAAI,OAAA;AAEnB,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,WAAY,CAAA;AAChC,IAAA,MAAA,CAAO,OAAA,EAAQ;AAEf,IAAA,MAAA,CAAO,QAAQ,MAAA,CAAO,WAAA,CAAY,QAAA,EAAU,kBAAA,CAAmB,MAAM,CAAC,CAAA;AACtE,IAAA,MAAA,CAAO,QAAQ,CAAA,sBAAA,CAAwB,CAAA;AACvC,IAAA,MAAA,CAAO,OAAA,EAAQ;AAEf,IAAA,MAAA,CAAO,QAAQ,MAAA,CAAO,WAAA,CAAY,UAAA,EAAY,kBAAA,CAAmB,MAAM,CAAC,CAAA;AACxE,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,MAAA,CAAO,WAAA,CAAY,0BAA0B,kBAAA,CAAmB,IAAI,CAAC,CAAA,kDAAA,CAAoD,CAAA;AAC7I,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,MAAA,CAAO,WAAA,CAAY,yBAAyB,kBAAA,CAAmB,IAAI,CAAC,CAAA,2BAAA,CAA6B,CAAA;AACrH,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,MAAA,CAAO,WAAA,CAAY,qBAAqB,kBAAA,CAAmB,IAAI,CAAC,CAAA,wCAAA,CAA0C,CAAA;AAC9H,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,MAAA,CAAO,WAAA,CAAY,qBAAqB,kBAAA,CAAmB,IAAI,CAAC,CAAA,0BAAA,CAA4B,CAAA;AAChH,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,MAAA,CAAO,WAAA,CAAY,iBAAiB,kBAAA,CAAmB,IAAI,CAAC,CAAA,mCAAA,CAAqC,CAAA;AACrH,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,MAAA,CAAO,WAAA,CAAY,YAAY,kBAAA,CAAmB,IAAI,CAAC,CAAA,2CAAA,CAA6C,CAAA;AACxH,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,MAAA,CAAO,WAAA,CAAY,kBAAkB,kBAAA,CAAmB,IAAI,CAAC,CAAA,yCAAA,CAA2C,CAAA;AAC5H,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,MAAA,CAAO,WAAA,CAAY,kBAAkB,kBAAA,CAAmB,IAAI,CAAC,CAAA,2CAAA,CAA6C,CAAA;AAC9H,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,MAAA,CAAO,WAAA,CAAY,WAAW,kBAAA,CAAmB,IAAI,CAAC,CAAA,0CAAA,CAA4C,CAAA;AACtH,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,MAAA,CAAO,WAAA,CAAY,gBAAgB,kBAAA,CAAmB,IAAI,CAAC,CAAA,6BAAA,CAA+B,CAAA;AAC9G,IAAA,MAAA,CAAO,OAAA,EAAQ;AAEf,IAAA,MAAA,CAAO,QAAQ,MAAA,CAAO,WAAA,CAAY,WAAA,EAAa,kBAAA,CAAmB,MAAM,CAAC,CAAA;AACzE,IAAA,MAAA,CAAO,QAAQ,CAAA,oCAAA,CAAsC,CAAA;AACrD,IAAA,MAAA,CAAO,QAAQ,CAAA,qGAAA,CAAuG,CAAA;AACtH,IAAA,MAAA,CAAO,QAAQ,CAAA,gDAAA,CAAkD,CAAA;AACjE,IAAA,MAAA,CAAO,QAAQ,CAAA,6CAAA,CAA+C,CAAA;AAC9D,IAAA,MAAA,CAAO,QAAQ,CAAA,0DAAA,CAA4D,CAAA;AAC3E,IAAA,MAAA,CAAO,OAAA,EAAQ;AAEf,IAAA,MAAA,CAAO,aAAa,4FAA4F,CAAA;AAAA,EACpH;AAAA,EAEA,MAAM,WAAW,QAAA,EAA+C;AAAA,EAAC;AACrE;;;ACnTO,IAAM,UAAA,GAAyB;AAAA,EAClC,UAAA,EAAY,WAAA;AAAA,EACZ,IAAA,EAAM,mBAAA;AAAA,EACN,UAAA,EAAY,CAAC,IAAI,uBAAA,EAAyB,CAAA;AAAA,EAC1C,YAAA,EAAc;AAAA,IACV,EAAA,EAAI,EAAE,sBAAA,EAAwB,6CAAA,EAA8C;AAAA,IAC5E,EAAA,EAAI,EAAE,sBAAA,EAAwB,mDAAA,EAAiD;AAAA,IAC/E,EAAA,EAAI,EAAE,sBAAA,EAAwB,yCAAA,EAAuC;AAAA,IACrE,EAAA,EAAI,EAAE,sBAAA,EAAwB,4CAAA,EAAuC;AAAA,IACrE,EAAA,EAAI,EAAE,sBAAA,EAAwB,uCAAA,EAAwC;AAAA,IACtE,EAAA,EAAI,EAAE,sBAAA,EAAwB,gGAAA,EAAsB;AAAA,IACpD,EAAA,EAAI,EAAE,sBAAA,EAAwB,+DAAA,EAAmB;AAAA,IACjD,EAAA,EAAI,EAAE,sBAAA,EAAwB,kDAAA,EAAgB;AAAA,IAC9C,EAAA,EAAI,EAAE,sBAAA,EAAwB,wLAAA,EAAwC;AAAA,IACtE,EAAA,EAAI,EAAE,sBAAA,EAAwB,0CAAA;AAAsC;AAE5E","file":"public-api.mjs","sourcesContent":["export interface CurlRequestOptions {\n method: string;\n headers: Record<string, string>;\n body?: string;\n followRedirects: boolean;\n}\n\nexport interface CurlResponse {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: string;\n timing: number;\n url: string;\n redirected: boolean;\n}\n\nconst VALID_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'];\n\nexport function inferMethod(explicitMethod?: string, hasBody?: boolean): string {\n if (explicitMethod) {\n const upper = explicitMethod.toUpperCase();\n if (!VALID_METHODS.includes(upper)) {\n throw new Error(`Invalid HTTP method: ${explicitMethod}. Valid methods: ${VALID_METHODS.join(', ')}`);\n }\n return upper;\n }\n return hasBody ? 'POST' : 'GET';\n}\n\nexport function parseHeaders(headerArgs: string | string[] | undefined): Record<string, string> {\n if (!headerArgs) return {};\n const arr = Array.isArray(headerArgs) ? headerArgs : [headerArgs];\n const result: Record<string, string> = {};\n for (const header of arr) {\n const colonIndex = header.indexOf(':');\n if (colonIndex === -1) continue;\n const key = header.substring(0, colonIndex).trim();\n const value = header.substring(colonIndex + 1).trim();\n if (key) result[key] = value;\n }\n return result;\n}\n\nexport function resolveBody(data?: string, dataRaw?: string): string | undefined {\n if (dataRaw != null) return dataRaw;\n if (data == null) return undefined;\n try {\n return JSON.stringify(JSON.parse(data));\n } catch {\n return data;\n }\n}\n\nexport function isJsonBody(body?: string): boolean {\n if (!body) return false;\n try {\n JSON.parse(body);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function buildFetchOptions(options: CurlRequestOptions): RequestInit {\n const headers = { ...options.headers };\n\n if (options.body && !headers['Content-Type'] && isJsonBody(options.body)) {\n headers['Content-Type'] = 'application/json';\n }\n\n const init: RequestInit = {\n method: options.method,\n headers,\n };\n\n if (options.body && options.method !== 'GET' && options.method !== 'HEAD') {\n init.body = options.body;\n }\n\n if (!options.followRedirects) {\n init.redirect = 'manual';\n }\n\n return init;\n}\n\nexport function formatResponseBody(body: string, pretty: boolean): string {\n if (!pretty) return body;\n try {\n return JSON.stringify(JSON.parse(body), null, 2);\n } catch {\n return body;\n }\n}\n\nexport function rewriteUrlToProxy(originalUrl: string): string {\n const match = originalUrl.match(/^(https?):\\/\\/([^/]+)(\\/.*)?$/i);\n if (!match) {\n throw new Error(`Invalid URL: ${originalUrl}`);\n }\n const scheme = match[1];\n const domain = match[2];\n const path = match[3] || '/';\n return `https://proxy.qodalis.com/proxy/${scheme}/${domain}${path}`;\n}\n\nexport function buildCurlEquivalent(\n url: string,\n method: string,\n headers: Record<string, string>,\n body?: string,\n): string {\n const parts = ['curl'];\n if (method !== 'GET') {\n parts.push(`-X ${method}`);\n }\n for (const [key, value] of Object.entries(headers)) {\n parts.push(`-H '${key}: ${value}'`);\n }\n if (body) {\n parts.push(`-d '${body}'`);\n }\n parts.push(`'${url}'`);\n return parts.join(' ');\n}\n\nexport function extractResponseHeaders(response: Response): Record<string, string> {\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headers[key] = value;\n });\n return headers;\n}\n","\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-beta.20';\nexport const API_VERSION = 2;\n ","import {\n CliForegroundColor,\n CliProcessCommand,\n CliProcessorMetadata,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliConfigurationOption,\n ICliExecutionContext,\n getPluginConfigValue,\n joinShellWords,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\nimport {\n CurlResponse,\n buildCurlEquivalent,\n buildFetchOptions,\n extractResponseHeaders,\n formatResponseBody,\n inferMethod,\n parseHeaders,\n resolveBody,\n rewriteUrlToProxy,\n} from '../utilities';\n\nexport class CliCurlCommandProcessor implements ICliCommandProcessor {\n command = 'curl';\n\n description = 'Make HTTP requests from the terminal. Supports all HTTP methods, custom headers, request bodies, timeouts, and more.';\n\n author = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n valueRequired = true;\n\n metadata?: CliProcessorMetadata = {\n icon: '🌐',\n requiredCoreVersion: '>=2.0.0 <3.0.0',\n requiredCliVersion: '>=2.0.0 <3.0.0',\n };\n\n configurationOptions?: ICliConfigurationOption[] = [\n {\n key: 'defaultTimeout',\n label: 'Default Timeout',\n description: 'Default request timeout in milliseconds',\n type: 'number',\n defaultValue: 30000,\n validator: (v) => ({\n valid: typeof v === 'number' && v >= 1000 && v <= 300000,\n message: 'Must be between 1000 and 300000 ms',\n }),\n },\n {\n key: 'prettyPrint',\n label: 'Pretty-Print JSON',\n description: 'Pretty-print JSON responses by default',\n type: 'boolean',\n defaultValue: false,\n },\n {\n key: 'verbose',\n label: 'Verbose Output',\n description: 'Show request/response headers by default',\n type: 'boolean',\n defaultValue: false,\n },\n ];\n\n parameters = [\n {\n name: 'request',\n aliases: ['X'],\n type: 'string' as const,\n description: 'HTTP method (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS)',\n required: false,\n },\n {\n name: 'header',\n aliases: ['H'],\n type: 'array' as const,\n description: 'Add header, e.g. -H \\'Content-Type: application/json\\' (repeatable)',\n required: false,\n },\n {\n name: 'data',\n aliases: ['d'],\n type: 'string' as const,\n description: 'Request body (auto-detects JSON, sets method to POST if -X not given)',\n required: false,\n },\n {\n name: 'data-raw',\n type: 'string' as const,\n description: 'Request body sent as-is without JSON parsing',\n required: false,\n },\n {\n name: 'verbose',\n aliases: ['v'],\n type: 'boolean' as const,\n description: 'Show request/response headers and timing',\n required: false,\n },\n {\n name: 'pretty',\n type: 'boolean' as const,\n description: 'Pretty-print JSON response body',\n required: false,\n },\n {\n name: 'timeout',\n type: 'number' as const,\n description: 'Request timeout in milliseconds (default: 30000)',\n required: false,\n defaultValue: '30000',\n },\n {\n name: 'location',\n aliases: ['L'],\n type: 'boolean' as const,\n description: 'Follow redirects (default: true)',\n required: false,\n },\n {\n name: 'proxy',\n type: 'boolean' as const,\n description: 'Route request through proxy.qodalis.com (bypasses CORS)',\n required: false,\n },\n {\n name: 'silent',\n aliases: ['s'],\n type: 'boolean' as const,\n description: 'Only output response body (no status line)',\n required: false,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const url = joinShellWords(command.value ?? '');\n\n if (!url) {\n context.writer.writeError('URL is required. Usage: curl <url> [options]');\n context.process.exit(1);\n return;\n }\n\n const args = command.args;\n const cfgTimeout = getPluginConfigValue(context, 'curl', 'defaultTimeout', 30000);\n const cfgPretty = getPluginConfigValue(context, 'curl', 'prettyPrint', false);\n const cfgVerbose = getPluginConfigValue(context, 'curl', 'verbose', false);\n\n const explicitMethod = args['request'] || args['X'];\n const data = args['data'] || args['d'];\n const dataRaw = args['data-raw'];\n const hasBody = data != null || dataRaw != null;\n const verbose = args['verbose'] != null || args['v'] != null ? (!!args['verbose'] || !!args['v']) : cfgVerbose;\n const pretty = args['pretty'] != null ? !!args['pretty'] : cfgPretty;\n const silent = !!args['silent'] || !!args['s'];\n const useProxy = !!args['proxy'];\n const timeout = parseInt(args['timeout'] || String(cfgTimeout), 10);\n const followRedirects = args['location'] !== false && args['L'] !== false;\n\n let method: string;\n try {\n method = inferMethod(explicitMethod, hasBody);\n } catch (e: any) {\n context.writer.writeError(e.message);\n context.process.exit(1);\n return;\n }\n\n const headers = parseHeaders(args['header'] || args['H']);\n const body = resolveBody(data, dataRaw);\n const requestUrl = useProxy ? rewriteUrlToProxy(url) : url;\n\n const fetchOptions = buildFetchOptions({\n method,\n headers,\n body,\n followRedirects,\n });\n\n if (verbose) {\n context.writer.writeln(\n `> ${context.writer.wrapInColor(`${method} ${url}`, CliForegroundColor.Cyan)}`,\n );\n for (const [key, value] of Object.entries(headers)) {\n context.writer.writeln(\n `> ${context.writer.wrapInColor(`${key}: ${value}`, CliForegroundColor.Yellow)}`,\n );\n }\n if (body) {\n context.writer.writeln(`> Body: ${body}`);\n }\n context.writer.writeln();\n }\n\n const timeoutController = new AbortController();\n const timeoutId = setTimeout(() => timeoutController.abort(), timeout);\n fetchOptions.signal = timeoutController.signal;\n\n const startTime = performance.now();\n\n try {\n const hostname = (() => { try { return new URL(url).hostname; } catch { return url; } })();\n context.notifier.info(`${method} ${hostname}`);\n const response = await context.http.fetch(requestUrl, fetchOptions);\n const elapsed = Math.round(performance.now() - startTime);\n context.notifier.info(`${method} ${hostname} — ${response.status}`);\n const responseText = await response.text();\n const responseHeaders = extractResponseHeaders(response);\n\n const curlResponse: CurlResponse = {\n status: response.status,\n statusText: response.statusText,\n headers: responseHeaders,\n body: responseText,\n timing: elapsed,\n url: response.url,\n redirected: response.redirected,\n };\n\n if (!silent) {\n const statusColor = response.ok ? CliForegroundColor.Green : CliForegroundColor.Red;\n context.writer.writeln(\n context.writer.wrapInColor(\n `HTTP ${response.status} ${response.statusText}`,\n statusColor,\n ),\n );\n }\n\n if (verbose) {\n context.writer.writeln();\n for (const [key, value] of Object.entries(responseHeaders)) {\n context.writer.writeln(\n `< ${context.writer.wrapInColor(`${key}: ${value}`, CliForegroundColor.Yellow)}`,\n );\n }\n context.writer.writeln(\n `< ${context.writer.wrapInColor(`Time: ${elapsed}ms`, CliForegroundColor.Magenta)}`,\n );\n if (response.redirected) {\n context.writer.writeln(\n `< ${context.writer.wrapInColor(`Redirected to: ${response.url}`, CliForegroundColor.Cyan)}`,\n );\n }\n context.writer.writeln();\n }\n\n const formattedBody = formatResponseBody(responseText, pretty);\n if (formattedBody) {\n context.writer.writeln(formattedBody);\n }\n\n if (verbose) {\n context.writer.writeln();\n context.writer.writeInfo('Equivalent curl command:');\n context.writer.writeln(buildCurlEquivalent(url, method, headers, body));\n }\n\n context.process.output(curlResponse);\n } catch (error: any) {\n if (error.name === 'AbortError') {\n if (timeoutController.signal.aborted) {\n context.writer.writeError(`Request timed out after ${timeout}ms`);\n } else {\n context.writer.writeWarning('Request cancelled.');\n }\n } else {\n context.writer.writeError(`Request failed: ${error.message}`);\n }\n context.process.exit(1);\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n const { writer } = context;\n\n writer.writeln(this.description!);\n writer.writeln();\n\n writer.writeln(writer.wrapInColor('Usage:', CliForegroundColor.Yellow));\n writer.writeln(` curl <url> [options]`);\n writer.writeln();\n\n writer.writeln(writer.wrapInColor('Options:', CliForegroundColor.Yellow));\n writer.writeln(` ${writer.wrapInColor('-X, --request <METHOD>', CliForegroundColor.Cyan)} HTTP method (default: GET, or POST if -d given)`);\n writer.writeln(` ${writer.wrapInColor('-H, --header <header>', CliForegroundColor.Cyan)} Add header (repeatable)`);\n writer.writeln(` ${writer.wrapInColor('-d, --data <body>', CliForegroundColor.Cyan)} Request body (auto-detects JSON)`);\n writer.writeln(` ${writer.wrapInColor('--data-raw <body>', CliForegroundColor.Cyan)} Request body as-is`);\n writer.writeln(` ${writer.wrapInColor('-v, --verbose', CliForegroundColor.Cyan)} Show headers and timing`);\n writer.writeln(` ${writer.wrapInColor('--pretty', CliForegroundColor.Cyan)} Pretty-print JSON response`);\n writer.writeln(` ${writer.wrapInColor('--timeout <ms>', CliForegroundColor.Cyan)} Timeout in ms (default: 30000)`);\n writer.writeln(` ${writer.wrapInColor('-L, --location', CliForegroundColor.Cyan)} Follow redirects (default: true)`);\n writer.writeln(` ${writer.wrapInColor('--proxy', CliForegroundColor.Cyan)} Route through CORS proxy`);\n writer.writeln(` ${writer.wrapInColor('-s, --silent', CliForegroundColor.Cyan)} Only output body`);\n writer.writeln();\n\n writer.writeln(writer.wrapInColor('Examples:', CliForegroundColor.Yellow));\n writer.writeln(` curl https://api.example.com/users`);\n writer.writeln(` curl https://api.example.com/users -X POST -d '{\"name\":\"John\"}' -H 'Content-Type: application/json'`);\n writer.writeln(` curl https://api.example.com/users -v --pretty`);\n writer.writeln(` curl https://api.example.com/status -X HEAD`);\n writer.writeln(` curl https://api.example.com/data --proxy --timeout 5000`);\n writer.writeln();\n\n writer.writeWarning('The server must allow CORS for this tool to work. Use --proxy to bypass CORS restrictions.');\n }\n\n async initialize(_context: ICliExecutionContext): Promise<void> {}\n}\n","/*\n * Public API Surface of curl\n */\n\nexport * from './lib/utilities';\nexport * from './lib/processors/cli-curl-command-processor';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliCurlCommandProcessor } from './lib/processors/cli-curl-command-processor';\nimport { API_VERSION } from './lib/version';\n\nexport const curlModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-curl',\n processors: [new CliCurlCommandProcessor()],\n translations: {\n es: { 'cli.curl.description': 'Realizar solicitudes HTTP desde la terminal' },\n fr: { 'cli.curl.description': 'Effectuer des requêtes HTTP depuis le terminal' },\n de: { 'cli.curl.description': 'HTTP-Anfragen vom Terminal ausführen' },\n pt: { 'cli.curl.description': 'Fazer requisições HTTP pelo terminal' },\n it: { 'cli.curl.description': 'Eseguire richieste HTTP dal terminale' },\n ja: { 'cli.curl.description': 'ターミナルからHTTPリクエストを実行' },\n ko: { 'cli.curl.description': '터미널에서 HTTP 요청 수행' },\n zh: { 'cli.curl.description': '从终端发送 HTTP 请求' },\n ru: { 'cli.curl.description': 'Выполнение HTTP-запросов из терминала' },\n ro: { 'cli.curl.description': 'Efectuează cereri HTTP din terminal' },\n },\n};\n"]}
|