UNPKG

@nestia/sdk

Version:

Nestia SDK and Swagger generator

104 lines (96 loc) 3.1 kB
import ts from "typescript"; import { INestiaConfig } from "../../INestiaConfig"; import { NestiaSdkApplication } from "../../NestiaSdkApplication"; import { NestiaConfigLoader } from "./NestiaConfigLoader"; export namespace NestiaSdkCommand { export const sdk = () => main({ title: "SDK library", generate: (app) => app.sdk(), validate: (config) => !!config.output, solution: "configure INestiaConfig.output property.", }); export const swagger = () => main({ title: "Swagger Document", generate: (app) => app.swagger(), validate: (config) => !!config.swagger?.output, solution: "configure INestiaConfig.swagger property.", }); export const e2e = () => main({ title: "E2E Functions", generate: (app) => app.e2e(), validate: (config) => !!config.e2e, solution: [ "configure two properties:", "", " - INestiaConfig.output", " - INestiaConfig.e2e", ].join("\n"), }); export const all = () => main({ title: "everything", generate: (app) => app.all(), validate: () => true, solution: [ "configure at laest one property of below:", "", " - INestiaConfig.output", " - INestiaConfig.swagger.output", ].join("\n"), }); const main = async (props: { title: string; solution: string; generate: (app: NestiaSdkApplication) => Promise<void>; validate: (config: INestiaConfig) => boolean; }) => { // LOAD CONFIG INFO const command: ts.ParsedCommandLine = await NestiaConfigLoader.compilerOptions( getFileArgument({ type: "project", extension: "json", }) ?? "tsconfig.json", ); const configurations: INestiaConfig[] = await NestiaConfigLoader.configurations( getFileArgument({ type: "config", extension: "ts", }) ?? "nestia.config.ts", command.raw.compilerOptions, ); // GENERATE if ( configurations.length > 1 && configurations.some(props.validate) === false ) throw new Error( `Every configurations are invalid to generate ${props.title}, ${props.solution}`, ); for (const config of configurations) { if (configurations.length > 1 && props.validate(config) === false) continue; const app: NestiaSdkApplication = new NestiaSdkApplication(config); await props.generate(app); } }; const getFileArgument = (props: { type: string; extension: string; }): string | null => { const argv: string[] = process.argv.slice(3); if (argv.length === 0) return null; const index: number = argv.findIndex((str) => str === `--${props.type}`); if (index === -1) return null; else if (argv.length === 1) throw new Error(`${props.type} file must be provided`); const file: string = argv[index + 1]; if (file.endsWith(props.extension) === false) throw new Error(`${props.type} file must be ${props.extension} file`); return file; }; }