curltrim 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +96 -0
- package/dist/src/assertions.d.ts +6 -0
- package/dist/src/assertions.js +176 -0
- package/dist/src/assertions.js.map +1 -0
- package/dist/src/candidates.d.ts +3 -0
- package/dist/src/candidates.js +74 -0
- package/dist/src/candidates.js.map +1 -0
- package/dist/src/cli.d.ts +4 -0
- package/dist/src/cli.js +168 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/config.d.ts +5 -0
- package/dist/src/config.js +87 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/curl-parser.d.ts +2 -0
- package/dist/src/curl-parser.js +110 -0
- package/dist/src/curl-parser.js.map +1 -0
- package/dist/src/index.d.ts +10 -0
- package/dist/src/index.js +11 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/inspect.d.ts +2 -0
- package/dist/src/inspect.js +29 -0
- package/dist/src/inspect.js.map +1 -0
- package/dist/src/interactive.d.ts +56 -0
- package/dist/src/interactive.js +181 -0
- package/dist/src/interactive.js.map +1 -0
- package/dist/src/json-output.d.ts +3 -0
- package/dist/src/json-output.js +27 -0
- package/dist/src/json-output.js.map +1 -0
- package/dist/src/minimizer.d.ts +10 -0
- package/dist/src/minimizer.js +61 -0
- package/dist/src/minimizer.js.map +1 -0
- package/dist/src/render-curl.d.ts +2 -0
- package/dist/src/render-curl.js +53 -0
- package/dist/src/render-curl.js.map +1 -0
- package/dist/src/replayer.d.ts +2 -0
- package/dist/src/replayer.js +82 -0
- package/dist/src/replayer.js.map +1 -0
- package/dist/src/request-rendering.d.ts +6 -0
- package/dist/src/request-rendering.js +31 -0
- package/dist/src/request-rendering.js.map +1 -0
- package/dist/src/terminal.d.ts +19 -0
- package/dist/src/terminal.js +187 -0
- package/dist/src/terminal.js.map +1 -0
- package/dist/src/types.d.ts +121 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { renderCookieHeader, renderRequestUrl, renderUrlEncodedBody } from "./request-rendering.js";
|
|
2
|
+
export async function replayRequest(request, delayMs) {
|
|
3
|
+
if (delayMs > 0) {
|
|
4
|
+
await sleep(delayMs);
|
|
5
|
+
}
|
|
6
|
+
const allowBody = canSendBody(request.method);
|
|
7
|
+
const body = allowBody ? renderBody(request) : undefined;
|
|
8
|
+
const response = await fetch(renderRequestUrl(request), {
|
|
9
|
+
method: request.method,
|
|
10
|
+
redirect: request.followRedirects ? "follow" : "manual",
|
|
11
|
+
headers: renderHeaders(request),
|
|
12
|
+
...(body === undefined ? {} : { body })
|
|
13
|
+
});
|
|
14
|
+
return {
|
|
15
|
+
status: response.status,
|
|
16
|
+
headers: renderResponseHeaders(response.headers),
|
|
17
|
+
bodyText: await response.text()
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function renderHeaders(request) {
|
|
21
|
+
const headers = new Headers(request.headers);
|
|
22
|
+
headers.delete("cookie");
|
|
23
|
+
if (request.bodyType === "form" &&
|
|
24
|
+
headers.get("content-type")?.toLowerCase().includes("multipart/form-data")) {
|
|
25
|
+
headers.delete("content-type");
|
|
26
|
+
}
|
|
27
|
+
const cookieHeader = renderCookieHeader(request.cookies);
|
|
28
|
+
if (cookieHeader) {
|
|
29
|
+
headers.set("Cookie", cookieHeader);
|
|
30
|
+
}
|
|
31
|
+
return headers;
|
|
32
|
+
}
|
|
33
|
+
function canSendBody(method) {
|
|
34
|
+
const normalizedMethod = method.toUpperCase();
|
|
35
|
+
return normalizedMethod !== "GET" && normalizedMethod !== "HEAD";
|
|
36
|
+
}
|
|
37
|
+
function renderBody(request) {
|
|
38
|
+
if (request.bodyType === "none" || request.body === undefined) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
if (request.bodyType === "json") {
|
|
42
|
+
return JSON.stringify(request.body);
|
|
43
|
+
}
|
|
44
|
+
if (request.bodyType === "form" || request.bodyType === "urlencoded") {
|
|
45
|
+
return request.bodyType === "form"
|
|
46
|
+
? renderFormData(request.body)
|
|
47
|
+
: renderUrlEncodedBody(request.body);
|
|
48
|
+
}
|
|
49
|
+
return String(request.body);
|
|
50
|
+
}
|
|
51
|
+
function renderFormData(body) {
|
|
52
|
+
const formData = new FormData();
|
|
53
|
+
if (body !== null && typeof body === "object" && !Array.isArray(body)) {
|
|
54
|
+
for (const [key, value] of Object.entries(body)) {
|
|
55
|
+
appendFormValue(formData, key, value);
|
|
56
|
+
}
|
|
57
|
+
return formData;
|
|
58
|
+
}
|
|
59
|
+
formData.append("value", String(body));
|
|
60
|
+
return formData;
|
|
61
|
+
}
|
|
62
|
+
function appendFormValue(formData, key, value) {
|
|
63
|
+
if (Array.isArray(value)) {
|
|
64
|
+
for (const item of value) {
|
|
65
|
+
formData.append(key, String(item));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
formData.append(key, String(value));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function renderResponseHeaders(headers) {
|
|
73
|
+
const result = {};
|
|
74
|
+
headers.forEach((value, key) => {
|
|
75
|
+
result[key] = value;
|
|
76
|
+
});
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
function sleep(delayMs) {
|
|
80
|
+
return new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=replayer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replayer.js","sourceRoot":"","sources":["../../src/replayer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { RequestModel } from "./types.js";
|
|
2
|
+
type RequestUrlInput = Pick<RequestModel, "url" | "query">;
|
|
3
|
+
export declare function renderRequestUrl(request: RequestUrlInput): string;
|
|
4
|
+
export declare function renderCookieHeader(cookies: RequestModel["cookies"]): string | undefined;
|
|
5
|
+
export declare function renderUrlEncodedBody(body: unknown): string;
|
|
6
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export function renderRequestUrl(request) {
|
|
2
|
+
const url = new URL(request.url);
|
|
3
|
+
for (const [key, value] of Object.entries(request.query)) {
|
|
4
|
+
appendParamValue(url.searchParams, key, value);
|
|
5
|
+
}
|
|
6
|
+
return url.toString();
|
|
7
|
+
}
|
|
8
|
+
export function renderCookieHeader(cookies) {
|
|
9
|
+
const pairs = Object.entries(cookies).map(([key, value]) => `${key}=${value}`);
|
|
10
|
+
return pairs.length > 0 ? pairs.join("; ") : undefined;
|
|
11
|
+
}
|
|
12
|
+
export function renderUrlEncodedBody(body) {
|
|
13
|
+
const params = new URLSearchParams();
|
|
14
|
+
if (body !== null && typeof body === "object" && !Array.isArray(body)) {
|
|
15
|
+
for (const [key, value] of Object.entries(body)) {
|
|
16
|
+
appendParamValue(params, key, value);
|
|
17
|
+
}
|
|
18
|
+
return params.toString();
|
|
19
|
+
}
|
|
20
|
+
return new URLSearchParams(String(body)).toString();
|
|
21
|
+
}
|
|
22
|
+
function appendParamValue(params, key, value) {
|
|
23
|
+
if (Array.isArray(value)) {
|
|
24
|
+
for (const item of value) {
|
|
25
|
+
params.append(key, String(item));
|
|
26
|
+
}
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
params.append(key, String(value));
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=request-rendering.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-rendering.js","sourceRoot":"","sources":["../../src/request-rendering.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,gBAAgB,CAAC,OAAwB;IACvD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEjC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,gBAAgB,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAgC;IACjE,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;IAC/E,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAa;IAChD,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IAErC,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACtE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAED,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAuB,EAAE,GAAW,EAAE,KAAc;IAC5E,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACnC,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { InspectSummary, MinimizeProgressEvent, TrimResult } from "./types.js";
|
|
2
|
+
export interface RenderOptions {
|
|
3
|
+
plain: boolean;
|
|
4
|
+
}
|
|
5
|
+
export interface ProgressRenderer {
|
|
6
|
+
update(message: string): void;
|
|
7
|
+
succeed(message: string): void;
|
|
8
|
+
fail(message: string): void;
|
|
9
|
+
stop(): void;
|
|
10
|
+
}
|
|
11
|
+
export declare const ASCII_SPINNER: {
|
|
12
|
+
interval: number;
|
|
13
|
+
frames: string[];
|
|
14
|
+
};
|
|
15
|
+
export declare function renderBanner(options: RenderOptions): string;
|
|
16
|
+
export declare function renderReport(result: TrimResult, options: RenderOptions): string;
|
|
17
|
+
export declare function renderInspectReport(summary: InspectSummary, options: RenderOptions): string;
|
|
18
|
+
export declare function createProgressRenderer(options: RenderOptions): ProgressRenderer;
|
|
19
|
+
export declare function formatProgressEvent(event: MinimizeProgressEvent): string;
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import boxen from "boxen";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import figlet from "figlet";
|
|
4
|
+
import ora from "ora";
|
|
5
|
+
export const ASCII_SPINNER = {
|
|
6
|
+
interval: 80,
|
|
7
|
+
frames: ["[= ]", "[== ]", "[=== ]", "[ ===]", "[ ==]", "[ =]"]
|
|
8
|
+
};
|
|
9
|
+
const TAGLINE = "Trim curl requests to the minimum replay that still works.";
|
|
10
|
+
export function renderBanner(options) {
|
|
11
|
+
if (options.plain) {
|
|
12
|
+
return "curltrim\n";
|
|
13
|
+
}
|
|
14
|
+
const title = figlet.textSync("curltrim", { font: "Small" });
|
|
15
|
+
return `${chalk.cyan(title)}\n${chalk.gray(TAGLINE)}\n`;
|
|
16
|
+
}
|
|
17
|
+
export function renderReport(result, options) {
|
|
18
|
+
const output = options.plain
|
|
19
|
+
? renderPlainReport(result, options)
|
|
20
|
+
: renderColorReport(result, options);
|
|
21
|
+
return output.endsWith("\n") ? output : `${output}\n`;
|
|
22
|
+
}
|
|
23
|
+
export function renderInspectReport(summary, options) {
|
|
24
|
+
const output = options.plain
|
|
25
|
+
? renderPlainInspectReport(summary, options)
|
|
26
|
+
: renderColorInspectReport(summary, options);
|
|
27
|
+
return output.endsWith("\n") ? output : `${output}\n`;
|
|
28
|
+
}
|
|
29
|
+
export function createProgressRenderer(options) {
|
|
30
|
+
if (options.plain || process.stderr.isTTY !== true) {
|
|
31
|
+
return noopProgressRenderer;
|
|
32
|
+
}
|
|
33
|
+
const spinner = ora({
|
|
34
|
+
color: "cyan",
|
|
35
|
+
spinner: ASCII_SPINNER,
|
|
36
|
+
stream: process.stderr
|
|
37
|
+
});
|
|
38
|
+
let started = false;
|
|
39
|
+
return {
|
|
40
|
+
update(message) {
|
|
41
|
+
if (!started) {
|
|
42
|
+
spinner.start(message);
|
|
43
|
+
started = true;
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
spinner.text = message;
|
|
47
|
+
},
|
|
48
|
+
succeed(message) {
|
|
49
|
+
if (!started) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
spinner.stopAndPersist({ symbol: chalk.green("OK"), text: message });
|
|
53
|
+
started = false;
|
|
54
|
+
},
|
|
55
|
+
fail(message) {
|
|
56
|
+
if (!started) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
spinner.stopAndPersist({ symbol: chalk.red("ERR"), text: message });
|
|
60
|
+
started = false;
|
|
61
|
+
},
|
|
62
|
+
stop() {
|
|
63
|
+
if (!started) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
spinner.stop();
|
|
67
|
+
started = false;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
export function formatProgressEvent(event) {
|
|
72
|
+
if (event.type === "original:start") {
|
|
73
|
+
return "Replaying original request";
|
|
74
|
+
}
|
|
75
|
+
if (event.type === "original:success") {
|
|
76
|
+
return "Original replay matched";
|
|
77
|
+
}
|
|
78
|
+
if (event.type === "original:failure") {
|
|
79
|
+
return `Original replay failed: ${event.error}`;
|
|
80
|
+
}
|
|
81
|
+
if (event.type === "candidate:start") {
|
|
82
|
+
return `Testing ${event.index}/${event.total}: remove ${event.label}`;
|
|
83
|
+
}
|
|
84
|
+
if (event.type === "candidate:removed") {
|
|
85
|
+
return `Removed ${event.index}/${event.total}: ${event.label}`;
|
|
86
|
+
}
|
|
87
|
+
return `Kept ${event.index}/${event.total}: ${event.label} (${event.error})`;
|
|
88
|
+
}
|
|
89
|
+
function renderPlainReport(result, options) {
|
|
90
|
+
return [
|
|
91
|
+
renderBanner(options).trimEnd(),
|
|
92
|
+
renderPlainSection("Replay", renderReplay(result)),
|
|
93
|
+
renderPlainSection("Removed", renderItems(result.removed, options)),
|
|
94
|
+
renderPlainSection("Kept", renderItems(result.kept, options)),
|
|
95
|
+
renderPlainSection("Final curl", result.finalCurl)
|
|
96
|
+
].join("\n\n");
|
|
97
|
+
}
|
|
98
|
+
function renderColorReport(result, options) {
|
|
99
|
+
return [
|
|
100
|
+
renderBanner(options).trimEnd(),
|
|
101
|
+
renderBox("Replay", renderReplay(result), "cyan"),
|
|
102
|
+
renderBox("Removed", renderItems(result.removed, options), "green"),
|
|
103
|
+
renderBox("Kept", renderItems(result.kept, options), "yellow"),
|
|
104
|
+
renderBox("Final curl", result.finalCurl, "magenta")
|
|
105
|
+
].join("\n\n");
|
|
106
|
+
}
|
|
107
|
+
function renderPlainInspectReport(summary, options) {
|
|
108
|
+
return [
|
|
109
|
+
renderBanner(options).trimEnd(),
|
|
110
|
+
renderPlainSection("Inspect", renderInspectDetails(summary)),
|
|
111
|
+
renderPlainSection("Parameters", renderInspectParameters(summary)),
|
|
112
|
+
renderPlainSection("Plan", renderInspectPlan(summary))
|
|
113
|
+
].join("\n\n");
|
|
114
|
+
}
|
|
115
|
+
function renderColorInspectReport(summary, options) {
|
|
116
|
+
return [
|
|
117
|
+
renderBanner(options).trimEnd(),
|
|
118
|
+
renderBox("Inspect", renderInspectDetails(summary), "cyan"),
|
|
119
|
+
renderBox("Parameters", renderInspectParameters(summary), "green"),
|
|
120
|
+
renderBox("Plan", renderInspectPlan(summary), "magenta")
|
|
121
|
+
].join("\n\n");
|
|
122
|
+
}
|
|
123
|
+
function renderInspectDetails(summary) {
|
|
124
|
+
return [
|
|
125
|
+
`Method: ${summary.method}`,
|
|
126
|
+
`URL: ${summary.url}`,
|
|
127
|
+
`Follow redirects: ${summary.followRedirects ? "yes" : "no"}`
|
|
128
|
+
].join("\n");
|
|
129
|
+
}
|
|
130
|
+
function renderInspectParameters(summary) {
|
|
131
|
+
return [
|
|
132
|
+
`Headers: ${renderFieldSummary(summary.headers)}`,
|
|
133
|
+
`Cookies: ${renderFieldSummary(summary.cookies)}`,
|
|
134
|
+
`Query: ${renderFieldSummary(summary.query)}`,
|
|
135
|
+
`Body: ${renderBodySummary(summary)}`
|
|
136
|
+
].join("\n");
|
|
137
|
+
}
|
|
138
|
+
function renderInspectPlan(summary) {
|
|
139
|
+
return [
|
|
140
|
+
`Targets: ${summary.targets.join(",")}`,
|
|
141
|
+
`Candidates: ${summary.candidateCount}`,
|
|
142
|
+
`Estimated replays: ${summary.estimatedReplayCount}`
|
|
143
|
+
].join("\n");
|
|
144
|
+
}
|
|
145
|
+
function renderFieldSummary(field) {
|
|
146
|
+
return field.keys.length === 0 ? `${field.count}` : `${field.count} (${field.keys.join(", ")})`;
|
|
147
|
+
}
|
|
148
|
+
function renderBodySummary(summary) {
|
|
149
|
+
return summary.body.keys.length === 0
|
|
150
|
+
? summary.body.type
|
|
151
|
+
: `${summary.body.type}: ${summary.body.candidateCount} (${summary.body.keys.join(", ")})`;
|
|
152
|
+
}
|
|
153
|
+
function renderPlainSection(title, body) {
|
|
154
|
+
return `== ${title} ==\n${body}`;
|
|
155
|
+
}
|
|
156
|
+
function renderBox(title, body, borderColor) {
|
|
157
|
+
return boxen(body, {
|
|
158
|
+
title: chalk.bold(title),
|
|
159
|
+
borderColor,
|
|
160
|
+
padding: { left: 1, right: 1 },
|
|
161
|
+
borderStyle: "round"
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
function renderReplay(result) {
|
|
165
|
+
return `Original replay: ${result.originalOk ? "ok" : "failed"}`;
|
|
166
|
+
}
|
|
167
|
+
function renderItems(items, options) {
|
|
168
|
+
if (items.length === 0) {
|
|
169
|
+
return "(none)";
|
|
170
|
+
}
|
|
171
|
+
return items.map((item) => renderItem(item, options)).join("\n");
|
|
172
|
+
}
|
|
173
|
+
function renderItem(item, options) {
|
|
174
|
+
const error = item.error === undefined ? "" : ` (${item.error})`;
|
|
175
|
+
const label = `${item.label}${error}`;
|
|
176
|
+
if (options.plain) {
|
|
177
|
+
return `- ${label}`;
|
|
178
|
+
}
|
|
179
|
+
return item.ok ? `- ${chalk.green(label)}` : `- ${chalk.yellow(label)}`;
|
|
180
|
+
}
|
|
181
|
+
const noopProgressRenderer = {
|
|
182
|
+
update() { },
|
|
183
|
+
succeed() { },
|
|
184
|
+
fail() { },
|
|
185
|
+
stop() { }
|
|
186
|
+
};
|
|
187
|
+
//# sourceMappingURL=terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,GAAG,MAAM,KAAK,CAAC;AActB,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,QAAQ,EAAE,EAAE;IACZ,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;CACrE,CAAC;AAEF,MAAM,OAAO,GAAG,4DAA4D,CAAC;AAE7E,MAAM,UAAU,YAAY,CAAC,OAAsB;IACjD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7D,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAkB,EAAE,OAAsB;IACrE,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK;QAC1B,CAAC,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC;QACpC,CAAC,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEvC,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAuB,EAAE,OAAsB;IACjF,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK;QAC1B,CAAC,CAAC,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC;QAC5C,CAAC,CAAC,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE/C,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAsB;IAC3D,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QACnD,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC;QAClB,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,aAAa;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IACH,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,OAAO;QACL,MAAM,CAAC,OAAO;YACZ,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACvB,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO;YACT,CAAC;YAED,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC;QACzB,CAAC;QACD,OAAO,CAAC,OAAO;YACb,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YAED,OAAO,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACrE,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,OAAO;YACV,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YAED,OAAO,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACpE,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;QACD,IAAI;YACF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YAED,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAA4B;IAC9D,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACpC,OAAO,4BAA4B,CAAC;IACtC,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QACtC,OAAO,yBAAyB,CAAC;IACnC,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QACtC,OAAO,2BAA2B,KAAK,CAAC,KAAK,EAAE,CAAC;IAClD,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QACrC,OAAO,WAAW,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,KAAK,EAAE,CAAC;IACxE,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;QACvC,OAAO,WAAW,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;IACjE,CAAC;IAED,OAAO,QAAQ,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,GAAG,CAAC;AAC/E,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAkB,EAAE,OAAsB;IACnE,OAAO;QACL,YAAY,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;QAC/B,kBAAkB,CAAC,QAAQ,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;QAClD,kBAAkB,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACnE,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7D,kBAAkB,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC;KACnD,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAkB,EAAE,OAAsB;IACnE,OAAO;QACL,YAAY,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;QAC/B,SAAS,CAAC,QAAQ,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QACjD,SAAS,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QACnE,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC;QAC9D,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC;KACrD,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,wBAAwB,CAAC,OAAuB,EAAE,OAAsB;IAC/E,OAAO;QACL,YAAY,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;QAC/B,kBAAkB,CAAC,SAAS,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC5D,kBAAkB,CAAC,YAAY,EAAE,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAClE,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC;KACvD,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,wBAAwB,CAAC,OAAuB,EAAE,OAAsB;IAC/E,OAAO;QACL,YAAY,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;QAC/B,SAAS,CAAC,SAAS,EAAE,oBAAoB,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAC3D,SAAS,CAAC,YAAY,EAAE,uBAAuB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAClE,SAAS,CAAC,MAAM,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;KACzD,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAuB;IACnD,OAAO;QACL,WAAW,OAAO,CAAC,MAAM,EAAE;QAC3B,QAAQ,OAAO,CAAC,GAAG,EAAE;QACrB,qBAAqB,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;KAC9D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAuB;IACtD,OAAO;QACL,YAAY,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QACjD,YAAY,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QACjD,UAAU,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QAC7C,SAAS,iBAAiB,CAAC,OAAO,CAAC,EAAE;KACtC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAuB;IAChD,OAAO;QACL,YAAY,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QACvC,eAAe,OAAO,CAAC,cAAc,EAAE;QACvC,sBAAsB,OAAO,CAAC,oBAAoB,EAAE;KACrD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAwC;IAClE,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AAClG,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAuB;IAChD,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QACnC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI;QACnB,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AAC/F,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa,EAAE,IAAY;IACrD,OAAO,MAAM,KAAK,QAAQ,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,SAAS,CAChB,KAAa,EACb,IAAY,EACZ,WAAoD;IAEpD,OAAO,KAAK,CAAC,IAAI,EAAE;QACjB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QACxB,WAAW;QACX,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;QAC9B,WAAW,EAAE,OAAO;KACrB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,MAAkB;IACtC,OAAO,oBAAoB,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AACnE,CAAC;AAED,SAAS,WAAW,CAAC,KAAwB,EAAE,OAAsB;IACnE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,UAAU,CAAC,IAAqB,EAAE,OAAsB;IAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC;IACjE,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC;IAEtC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,KAAK,KAAK,EAAE,CAAC;IACtB,CAAC;IAED,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AAC1E,CAAC;AAED,MAAM,oBAAoB,GAAqB;IAC7C,MAAM,KAAI,CAAC;IACX,OAAO,KAAI,CAAC;IACZ,IAAI,KAAI,CAAC;IACT,IAAI,KAAI,CAAC;CACV,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
export type Target = "cookies" | "headers" | "query" | "body";
|
|
2
|
+
export type JsonExpectationOperator = "exists" | "=" | "!=" | ">" | ">=" | "<" | "<=" | "contains" | "matches";
|
|
3
|
+
export interface JsonExpectation {
|
|
4
|
+
path: string;
|
|
5
|
+
operator: JsonExpectationOperator;
|
|
6
|
+
expected?: string;
|
|
7
|
+
}
|
|
8
|
+
export type JsonValue = null | boolean | number | string | JsonValue[] | {
|
|
9
|
+
[key: string]: JsonValue;
|
|
10
|
+
};
|
|
11
|
+
export type RequestBody = {
|
|
12
|
+
bodyType: "none";
|
|
13
|
+
body: undefined;
|
|
14
|
+
} | {
|
|
15
|
+
bodyType: "json";
|
|
16
|
+
body: JsonValue;
|
|
17
|
+
} | {
|
|
18
|
+
bodyType: "form";
|
|
19
|
+
body: Record<string, unknown>;
|
|
20
|
+
} | {
|
|
21
|
+
bodyType: "urlencoded";
|
|
22
|
+
body: Record<string, unknown>;
|
|
23
|
+
} | {
|
|
24
|
+
bodyType: "raw";
|
|
25
|
+
body: string;
|
|
26
|
+
};
|
|
27
|
+
interface RequestModelBase {
|
|
28
|
+
method: string;
|
|
29
|
+
url: string;
|
|
30
|
+
followRedirects: boolean;
|
|
31
|
+
headers: Record<string, string>;
|
|
32
|
+
cookies: Record<string, string>;
|
|
33
|
+
query: Record<string, string | string[]>;
|
|
34
|
+
}
|
|
35
|
+
export type RequestModel = RequestModelBase & RequestBody;
|
|
36
|
+
export interface Candidate {
|
|
37
|
+
target: Target;
|
|
38
|
+
key: string;
|
|
39
|
+
label: string;
|
|
40
|
+
}
|
|
41
|
+
export interface AssertionConfig {
|
|
42
|
+
status?: string;
|
|
43
|
+
text: string[];
|
|
44
|
+
regex: string[];
|
|
45
|
+
json: string[];
|
|
46
|
+
}
|
|
47
|
+
export interface CliConfig {
|
|
48
|
+
curlCommand: string;
|
|
49
|
+
targets: Target[];
|
|
50
|
+
assertions: AssertionConfig;
|
|
51
|
+
delayMs: number;
|
|
52
|
+
plain: boolean;
|
|
53
|
+
inspect: boolean;
|
|
54
|
+
json: boolean;
|
|
55
|
+
}
|
|
56
|
+
export interface ReplayResponse {
|
|
57
|
+
status: number;
|
|
58
|
+
headers: Record<string, string>;
|
|
59
|
+
bodyText: string;
|
|
60
|
+
}
|
|
61
|
+
export interface CandidateResult extends Candidate {
|
|
62
|
+
ok: boolean;
|
|
63
|
+
error?: string;
|
|
64
|
+
}
|
|
65
|
+
export type MinimizeProgressEvent = {
|
|
66
|
+
type: "original:start";
|
|
67
|
+
label: string;
|
|
68
|
+
} | {
|
|
69
|
+
type: "original:success";
|
|
70
|
+
label: string;
|
|
71
|
+
} | {
|
|
72
|
+
type: "original:failure";
|
|
73
|
+
label: string;
|
|
74
|
+
error: string;
|
|
75
|
+
} | {
|
|
76
|
+
type: "candidate:start";
|
|
77
|
+
index: number;
|
|
78
|
+
total: number;
|
|
79
|
+
label: string;
|
|
80
|
+
} | {
|
|
81
|
+
type: "candidate:removed";
|
|
82
|
+
index: number;
|
|
83
|
+
total: number;
|
|
84
|
+
label: string;
|
|
85
|
+
} | {
|
|
86
|
+
type: "candidate:kept";
|
|
87
|
+
index: number;
|
|
88
|
+
total: number;
|
|
89
|
+
label: string;
|
|
90
|
+
error: string;
|
|
91
|
+
};
|
|
92
|
+
export interface TrimResult {
|
|
93
|
+
originalOk: boolean;
|
|
94
|
+
removed: CandidateResult[];
|
|
95
|
+
kept: CandidateResult[];
|
|
96
|
+
finalRequest: RequestModel;
|
|
97
|
+
finalCurl: string;
|
|
98
|
+
}
|
|
99
|
+
export interface InspectFieldSummary {
|
|
100
|
+
count: number;
|
|
101
|
+
keys: string[];
|
|
102
|
+
}
|
|
103
|
+
export interface InspectBodySummary {
|
|
104
|
+
type: RequestModel["bodyType"];
|
|
105
|
+
candidateCount: number;
|
|
106
|
+
keys: string[];
|
|
107
|
+
}
|
|
108
|
+
export interface InspectSummary {
|
|
109
|
+
method: string;
|
|
110
|
+
url: string;
|
|
111
|
+
followRedirects: boolean;
|
|
112
|
+
headers: InspectFieldSummary;
|
|
113
|
+
cookies: InspectFieldSummary;
|
|
114
|
+
query: InspectFieldSummary;
|
|
115
|
+
body: InspectBodySummary;
|
|
116
|
+
targets: Target[];
|
|
117
|
+
assertions: AssertionConfig;
|
|
118
|
+
candidateCount: number;
|
|
119
|
+
estimatedReplayCount: number;
|
|
120
|
+
}
|
|
121
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "curltrim",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Trim curl requests to the minimum parameters needed for a successful replay.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"curltrim": "./dist/src/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"engines": {
|
|
14
|
+
"node": ">=20.19",
|
|
15
|
+
"pnpm": ">=10.33.0 <11"
|
|
16
|
+
},
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@inquirer/prompts": "^8.5.2",
|
|
19
|
+
"boxen": "^8.0.1",
|
|
20
|
+
"chalk": "^5.6.2",
|
|
21
|
+
"commander": "^14.0.3",
|
|
22
|
+
"curlconverter": "^4.12.0",
|
|
23
|
+
"figlet": "^1.11.0",
|
|
24
|
+
"jsonpath-plus": "^10.4.0",
|
|
25
|
+
"ora": "^9.4.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/node": "^20.19.0",
|
|
29
|
+
"typescript": "^6.0.3",
|
|
30
|
+
"vitest": "^4.1.9"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
|
|
34
|
+
"build": "pnpm run clean && tsc -p tsconfig.json",
|
|
35
|
+
"typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json --noEmit",
|
|
36
|
+
"test": "vitest run",
|
|
37
|
+
"test:watch": "vitest",
|
|
38
|
+
"verify": "pnpm run typecheck && pnpm test && pnpm run build"
|
|
39
|
+
}
|
|
40
|
+
}
|