@frostup/swr-request-generator
Version:
A tool for generating TypeScript code and interface from swagger by using SWR and axios as client.
89 lines (74 loc) • 2.63 kB
text/typescript
import * as fs from "fs";
import { DefinitionsResolver } from "./resolvers/DefinitionsResolver";
import * as path from "path";
import { PathResolver } from "./resolvers/PathResolver";
import axios from "axios";
import { map } from "lodash";
import { ERROR_MESSAGES, FILE_TIP, LOG_MESSAGE } from "./constants";
import { Spec } from "@openapi-integration/openapi-schema";
import program from "commander";
import { convertJsonToString, prettifyCode } from "./utils/formatters";
import { ICodegenConfig } from "./types";
program.option("-a, --authorization <value>", "authorization header value").parse(process.argv);
const codegenConfigPath = path.resolve("ts-codegen.config.json");
const getCodegenConfig = (): ICodegenConfig =>
fs.existsSync(codegenConfigPath)
? require(codegenConfigPath)
: {
output: ".output",
fileHeaders: [],
clients: [],
};
const { output = ".output", fileHeaders, timeout, data, clients, fileName } = getCodegenConfig();
const codegen = (schema: Spec | string) => {
if (typeof schema === "string") {
console.error(ERROR_MESSAGES.INVALID_JSON_FILE_ERROR);
return;
}
if (!fs.existsSync(output)) {
fs.mkdirSync(output);
}
const fileStr =
(fileHeaders ? fileHeaders.join("\n") : "") +
"\n\n" +
FILE_TIP +
[
...PathResolver.of(schema.paths).resolve().toRequest(),
...DefinitionsResolver.of(schema.components).scanDefinitions().toDeclarations(),
].join("\n\n");
fs.writeFileSync(path.resolve(output, `./${fileName || "request"}.ts`), prettifyCode(fileStr), "utf-8");
};
(data || []).map((file: string) => {
console.log("reading swagger schema from local file...\n");
const schemaStr = fs.readFileSync(file, "utf8");
const schema = convertJsonToString(schemaStr);
if (schema) {
console.log(LOG_MESSAGE.GENERATING + "\n");
codegen(schema);
console.log(LOG_MESSAGE.SUCCESSFUL + "\n");
}
});
if (clients) {
const options = program.opts();
const instance = axios.create({
timeout: timeout || 10 * 1000,
headers: options.authorization
? {
Authorization: options.authorization,
}
: undefined,
});
map(clients, (client, index) => {
console.log(`getting swagger schema from client ${index + 1}...\n`);
instance
.get(client)
.then((response) => {
console.log(LOG_MESSAGE.GENERATING + "\n");
codegen(response.data);
console.log(LOG_MESSAGE.SUCCESSFUL + "\n");
})
.catch((error) => {
console.error(`${error.code}: ${ERROR_MESSAGES.FETCH_CLIENT_FAILED_ERROR}`);
});
});
}