321 lines
7.3 KiB
TypeScript
321 lines
7.3 KiB
TypeScript
import * as curlconverter from "../src/index.js";
|
|
import { Word } from "../src/shell/Word.js";
|
|
import { parse } from "../src/parse.js";
|
|
|
|
import fs from "fs";
|
|
import path from "path";
|
|
import { fileURLToPath } from "url";
|
|
|
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
export const fixturesDir = path.resolve(__dirname, "../../test/fixtures");
|
|
|
|
function stringifyWords(o: any): any {
|
|
if (o instanceof Word) {
|
|
return o.toString();
|
|
}
|
|
if (Array.isArray(o)) {
|
|
return o.map((oo) => stringifyWords(oo));
|
|
}
|
|
if (o && o.toString() == "[object Object]") {
|
|
return Object.fromEntries(
|
|
Object.entries(o).map((oo) => [
|
|
stringifyWords(oo[0]),
|
|
stringifyWords(oo[1]),
|
|
]),
|
|
);
|
|
}
|
|
return o;
|
|
}
|
|
// Special case that returns the parsed argument object
|
|
function toParser(curl: string | string[]): string {
|
|
const parserOutput = parse(curl);
|
|
const code = JSON.stringify(stringifyWords(parserOutput), null, 2);
|
|
return code + "\n";
|
|
}
|
|
|
|
// TODO: move this (or something like this) to index.js?
|
|
const converters = {
|
|
ansible: {
|
|
name: "Ansible",
|
|
extension: ".yml",
|
|
converter: curlconverter.toAnsible,
|
|
},
|
|
c: {
|
|
name: "C",
|
|
extension: ".c",
|
|
converter: curlconverter.toC,
|
|
},
|
|
cfml: {
|
|
name: "ColdFusion",
|
|
extension: ".cfm",
|
|
converter: curlconverter.toCFML,
|
|
},
|
|
clojure: {
|
|
name: "Clojure",
|
|
extension: ".clj",
|
|
converter: curlconverter.toClojure,
|
|
},
|
|
csharp: {
|
|
name: "C#",
|
|
extension: ".cs",
|
|
converter: curlconverter.toCSharp,
|
|
},
|
|
dart: {
|
|
name: "Dart",
|
|
extension: ".dart",
|
|
converter: curlconverter.toDart,
|
|
},
|
|
elixir: {
|
|
name: "Elixir",
|
|
extension: ".ex",
|
|
converter: curlconverter.toElixir,
|
|
},
|
|
go: {
|
|
name: "Go",
|
|
extension: ".go",
|
|
converter: curlconverter.toGo,
|
|
},
|
|
har: {
|
|
name: "HAR",
|
|
extension: ".json",
|
|
converter: curlconverter.toHarString,
|
|
},
|
|
http: {
|
|
name: "HTTP",
|
|
extension: ".txt",
|
|
converter: curlconverter.toHTTP,
|
|
},
|
|
httpie: {
|
|
name: "HTTPie",
|
|
extension: ".sh",
|
|
converter: curlconverter.toHttpie,
|
|
},
|
|
java: {
|
|
name: "Java + HttpClient",
|
|
extension: ".java",
|
|
converter: curlconverter.toJava,
|
|
},
|
|
"java-httpurlconnection": {
|
|
name: "Java + HttpUrlConnection",
|
|
extension: ".java",
|
|
converter: curlconverter.toJavaHttpUrlConnection,
|
|
},
|
|
"java-jsoup": {
|
|
name: "Java + jsoup",
|
|
extension: ".java",
|
|
converter: curlconverter.toJavaJsoup,
|
|
},
|
|
"java-okhttp": {
|
|
name: "Java + OkHttp",
|
|
extension: ".java",
|
|
converter: curlconverter.toJavaOkHttp,
|
|
},
|
|
javascript: {
|
|
name: "JavaScript",
|
|
extension: ".js",
|
|
converter: curlconverter.toJavaScript,
|
|
},
|
|
"javascript-jquery": {
|
|
name: "JavaScript + jQuery",
|
|
extension: ".js",
|
|
converter: curlconverter.toJavaScriptJquery,
|
|
},
|
|
"javascript-xhr": {
|
|
name: "JavaScript + XHR",
|
|
extension: ".js",
|
|
converter: curlconverter.toJavaScriptXHR,
|
|
},
|
|
json: {
|
|
name: "Json",
|
|
extension: ".json",
|
|
converter: curlconverter.toJsonString,
|
|
},
|
|
julia: {
|
|
name: "Julia",
|
|
extension: ".jl",
|
|
converter: curlconverter.toJulia,
|
|
},
|
|
kotlin: {
|
|
name: "Kotlin",
|
|
extension: ".kt",
|
|
converter: curlconverter.toKotlin,
|
|
},
|
|
lua: {
|
|
name: "Lua",
|
|
extension: ".lua",
|
|
converter: curlconverter.toLua,
|
|
},
|
|
matlab: {
|
|
name: "MATLAB",
|
|
extension: ".m",
|
|
converter: curlconverter.toMATLAB,
|
|
},
|
|
node: {
|
|
name: "Node",
|
|
extension: ".js",
|
|
converter: curlconverter.toNode,
|
|
},
|
|
"node-axios": {
|
|
name: "Node + Axios",
|
|
extension: ".js",
|
|
converter: curlconverter.toNodeAxios,
|
|
},
|
|
"node-got": {
|
|
name: "Node + Got",
|
|
extension: ".js",
|
|
converter: curlconverter.toNodeGot,
|
|
},
|
|
"node-http": {
|
|
name: "Node + http",
|
|
extension: ".js",
|
|
converter: curlconverter.toNodeHttp,
|
|
},
|
|
"node-ky": {
|
|
name: "Node + Ky",
|
|
extension: ".js",
|
|
converter: curlconverter.toNodeKy,
|
|
},
|
|
"node-request": {
|
|
name: "Node + request",
|
|
extension: ".js",
|
|
converter: curlconverter.toNodeRequest,
|
|
},
|
|
"node-superagent": {
|
|
name: "Node + SuperAgent",
|
|
extension: ".js",
|
|
converter: curlconverter.toNodeSuperAgent,
|
|
},
|
|
objectivec: {
|
|
name: "Objective-C",
|
|
extension: ".m",
|
|
converter: curlconverter.toObjectiveC,
|
|
},
|
|
ocaml: {
|
|
name: "OCaml",
|
|
extension: ".ml",
|
|
converter: curlconverter.toOCaml,
|
|
},
|
|
perl: {
|
|
name: "Perl",
|
|
extension: ".pl",
|
|
converter: curlconverter.toPerl,
|
|
},
|
|
php: {
|
|
name: "PHP",
|
|
extension: ".php",
|
|
converter: curlconverter.toPhp,
|
|
},
|
|
"php-guzzle": {
|
|
name: "PHP + Guzzle",
|
|
extension: ".php",
|
|
converter: curlconverter.toPhpGuzzle,
|
|
},
|
|
powershell: {
|
|
name: "PowerShell",
|
|
extension: ".ps1",
|
|
converter: curlconverter.toPowershellRestMethod,
|
|
},
|
|
python: {
|
|
name: "Python",
|
|
extension: ".py",
|
|
converter: curlconverter.toPython,
|
|
},
|
|
r: {
|
|
name: "R",
|
|
extension: ".r",
|
|
converter: curlconverter.toR,
|
|
},
|
|
"r-httr2": {
|
|
name: "R + httr2",
|
|
extension: ".r",
|
|
converter: curlconverter.toRHttr2,
|
|
},
|
|
ruby: {
|
|
name: "Ruby",
|
|
extension: ".rb",
|
|
converter: curlconverter.toRuby,
|
|
},
|
|
"ruby-httparty": {
|
|
name: "Ruby HTTParty",
|
|
extension: ".rb",
|
|
converter: curlconverter.toRubyHttparty,
|
|
},
|
|
rust: {
|
|
name: "Rust",
|
|
extension: ".rs",
|
|
converter: curlconverter.toRust,
|
|
},
|
|
swift: {
|
|
name: "Swift",
|
|
extension: ".swift",
|
|
converter: curlconverter.toSwift,
|
|
},
|
|
wget: {
|
|
name: "Wget",
|
|
extension: ".sh",
|
|
converter: curlconverter.toWget,
|
|
},
|
|
parser: {
|
|
name: "Parser",
|
|
extension: ".json",
|
|
converter: toParser,
|
|
},
|
|
} as const;
|
|
type Converter = keyof typeof converters;
|
|
|
|
// Check that we have at least one test for every generator
|
|
// https://github.com/curlconverter/curlconverter/pull/299
|
|
const testedConverters = Object.entries(converters).map(
|
|
(c) => c[1].converter.name,
|
|
);
|
|
const untestedConverters = ["toPhpRequests"];
|
|
const notConverterExports = ["Word"];
|
|
|
|
const availableConverters = Object.entries(curlconverter)
|
|
.map((c) => c[1].name)
|
|
.filter((n) => n !== "CCError");
|
|
const missing = availableConverters.filter(
|
|
(c) =>
|
|
!testedConverters.includes(c) &&
|
|
!untestedConverters.includes(c) &&
|
|
!notConverterExports.includes(c) &&
|
|
!c.endsWith("Warn"),
|
|
);
|
|
const extra = testedConverters.filter(
|
|
(c) => !availableConverters.includes(c) && c !== "toParser",
|
|
);
|
|
if (missing.length) {
|
|
console.error("these converters are not tested: " + missing.join(", "));
|
|
}
|
|
if (extra.length) {
|
|
console.error(
|
|
"these non-existant converters are being tested: " + extra.join(", "),
|
|
);
|
|
}
|
|
for (const [converterName, converter] of Object.entries(converters)) {
|
|
const testDir = path.resolve(fixturesDir, converterName);
|
|
if (fs.existsSync(testDir)) {
|
|
const dirContents = fs.readdirSync(testDir);
|
|
if (!dirContents.length) {
|
|
console.error(testDir + " doesn't contain any files");
|
|
} else if (
|
|
!dirContents.filter((f) => f.endsWith(converter.extension)).length
|
|
) {
|
|
// TODO: early stopping
|
|
console.error(
|
|
testDir +
|
|
" doesn't have any files ending with '" +
|
|
converter.extension +
|
|
"'",
|
|
);
|
|
}
|
|
} else {
|
|
console.error(
|
|
converterName + " doesn't have a corresponding directory in fixtures/",
|
|
);
|
|
}
|
|
}
|
|
|
|
export { converters };
|
|
export type { Converter };
|