@typespec/openapi3
Version:
TypeSpec library for emitting OpenAPI 3.0 and OpenAPI 3.1 from the TypeSpec REST protocol binding and converting OpenAPI3 to TypeSpec
71 lines • 2.69 kB
JavaScript
import { parseArgs } from "util";
import { convertAction } from "./actions/convert/convert-file.js";
import { createCliHost } from "./utils.js";
export async function main() {
const cliArgs = parseCliArgs();
const host = createCliHost();
return convertAction(host, cliArgs);
}
const cliUsage = `tsp-openapi3 <path/to/openapi3/file> --output-dir <path/to/output/directory> [--namespace <namespace>]`;
function parseCliArgs() {
const options = parseArgs({
args: process.argv.slice(2),
options: {
help: {
type: "boolean",
},
"output-dir": {
type: "string",
},
namespace: {
type: "string",
},
},
allowPositionals: true,
});
// Show help first
if (options.values.help) {
displayHelp();
process.exit(0);
}
const diagnostics = [];
if (!options.values["output-dir"]) {
diagnostics.push("Missing required argument: --output-dir");
}
if (!options.positionals.length) {
diagnostics.push("Missing required positional argument: <path>");
}
else if (options.positionals.length !== 1) {
diagnostics.push(`Incorrect number of positional arguments provided for path: got ${options.positionals.length}, need 1`);
}
if (diagnostics.length > 0) {
// eslint-disable-next-line no-console
console.log(cliUsage);
// eslint-disable-next-line no-console
console.log(`\n${diagnostics.join("\n")}`);
process.exit(1);
}
return {
"output-dir": options.values["output-dir"],
path: options.positionals[0],
namespace: options.values.namespace,
};
}
function displayHelp() {
// eslint-disable-next-line no-console
const log = console.log;
log(cliUsage);
log(`\nConvert OpenAPI3 to TypeSpec`);
log(`\nPositionals:`);
log(padArgumentUsage("path", "The path to the OpenAPI3 file in JSON or YAML format.", "[string] [required]"));
log(`\nOptions:`);
log(padArgumentUsage("--help", "Show help.", "[boolean]"));
log(padArgumentUsage("--output-dir", "The output directory for generated TypeSpec files. Will be created if it does not exist.", "[string] [required]"));
log(padArgumentUsage("--namespace", "The namespace name to use instead of generating from the OpenAPI title.", "[string]"));
}
function padArgumentUsage(name, description, type) {
// Assume 80 col width
// 14 for name, 20 for type, leaves 40 (with spacing) for description
return ` ${name.padEnd(14)} ${description.padEnd(40)} ${type.padStart(20)}`;
}
//# sourceMappingURL=cli.js.map