From 70547ebe4ba4a1a50f1b55f71fea68f22fc02570 Mon Sep 17 00:00:00 2001 From: Michael Nahkies Date: Sun, 2 Jun 2024 13:48:04 +0100 Subject: [PATCH] fix: decouple validator from readline --- packages/openapi-code-generator/src/cli.ts | 11 ++++++++++- .../openapi-code-generator/src/core/cli-utils.ts | 2 +- .../src/core/openapi-validator.ts | 16 +++++++--------- packages/openapi-code-generator/src/index.ts | 3 +-- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/packages/openapi-code-generator/src/cli.ts b/packages/openapi-code-generator/src/cli.ts index a42e65448..da6a36e96 100644 --- a/packages/openapi-code-generator/src/cli.ts +++ b/packages/openapi-code-generator/src/cli.ts @@ -7,9 +7,11 @@ import { InvalidArgumentError, Option, } from "@commander-js/extra-typings" +import {promptContinue} from "./core/cli-utils" import {NodeFsAdaptor} from "./core/file-system/node-fs-adaptor" import {OperationGroupStrategy} from "./core/input" import {logger} from "./core/logger" +import {OpenapiValidator} from "./core/openapi-validator" import {generate} from "./index" import {templates} from "./templates" import {TypescriptFormatter} from "./typescript/common/typescript-formatter" @@ -133,7 +135,14 @@ const config = program.opts() async function main() { const fsAdaptor = new NodeFsAdaptor() const formatter = await TypescriptFormatter.createNodeFormatter() - await generate(config, fsAdaptor, formatter) + const validator = await OpenapiValidator.create(async (filename: string) => { + await promptContinue( + `Found errors validating '${filename}', continue?`, + "yes", + ) + }) + + await generate(config, fsAdaptor, formatter, validator) } main() diff --git a/packages/openapi-code-generator/src/core/cli-utils.ts b/packages/openapi-code-generator/src/core/cli-utils.ts index e67a82722..af16855df 100644 --- a/packages/openapi-code-generator/src/core/cli-utils.ts +++ b/packages/openapi-code-generator/src/core/cli-utils.ts @@ -13,7 +13,7 @@ export async function promptContinue( throw new Error("user aborted") } -export async function prompt( +async function prompt( question: string, defaultValue?: string, ): Promise { diff --git a/packages/openapi-code-generator/src/core/openapi-validator.ts b/packages/openapi-code-generator/src/core/openapi-validator.ts index baafff719..012ca025a 100644 --- a/packages/openapi-code-generator/src/core/openapi-validator.ts +++ b/packages/openapi-code-generator/src/core/openapi-validator.ts @@ -1,5 +1,3 @@ -import {promptContinue} from "./cli-utils" - import {logger} from "./logger" import {ErrorObject} from "ajv" @@ -17,6 +15,7 @@ export class OpenapiValidator { private constructor( private readonly validate3_1: ValidateFunction, private readonly validate3_0: ValidateFunction, + private readonly onValidationFailed: (filename: string) => Promise, ) {} private validationFunction(version: string): ValidateFunction { @@ -73,21 +72,19 @@ export class OpenapiValidator { } logger.warn("") - - await promptContinue( - `Found errors validating '${filename}', continue?`, - "yes", - ) + await this.onValidationFailed(filename) } } - static async create(): Promise { + static async create( + onValidationFailed: (filename: string) => Promise = async () => {}, + ): Promise { const skipValidationLoadSpecificationError: ValidateFunction = () => { return true } try { - return new OpenapiValidator(validate3_1, validate3_0) + return new OpenapiValidator(validate3_1, validate3_0, onValidationFailed) } catch (err) { logger.warn( "Skipping validation as failed to load schema specification", @@ -96,6 +93,7 @@ export class OpenapiValidator { return new OpenapiValidator( skipValidationLoadSpecificationError, skipValidationLoadSpecificationError, + onValidationFailed, ) } } diff --git a/packages/openapi-code-generator/src/index.ts b/packages/openapi-code-generator/src/index.ts index 261618719..449ae3acd 100644 --- a/packages/openapi-code-generator/src/index.ts +++ b/packages/openapi-code-generator/src/index.ts @@ -32,6 +32,7 @@ export async function generate( config: Config, fsAdaptor: IFsAdaptor, formatter: TypescriptFormatter, + validator: OpenapiValidator, ) { logger.time("program starting") logger.info(`running on input file '${config.input}'`) @@ -42,8 +43,6 @@ export async function generate( fsAdaptor, ) - const validator = await OpenapiValidator.create() - const genericLoader = new GenericLoader(fsAdaptor) const loader = await OpenapiLoader.create(