From 879e4cb45abf34f42de3a272130a5a03945cf081 Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Tue, 15 Oct 2024 21:16:39 -0400 Subject: [PATCH] fix error UX Signed-off-by: aramissennyeydd --- .../package/schema/openapi/generate/client.ts | 16 +++++++++++++--- .../package/schema/openapi/generate/index.ts | 17 ++++++++++++++--- .../package/schema/openapi/generate/server.ts | 19 ++++++++++++++++--- .../commands/repo/schema/openapi/verify.ts | 12 ++++++------ .../repo-tools/src/lib/openapi/helpers.ts | 10 ++++++++++ 5 files changed, 59 insertions(+), 15 deletions(-) diff --git a/packages/repo-tools/src/commands/package/schema/openapi/generate/client.ts b/packages/repo-tools/src/commands/package/schema/openapi/generate/client.ts index 66f750bfc3..742f303f51 100644 --- a/packages/repo-tools/src/commands/package/schema/openapi/generate/client.ts +++ b/packages/repo-tools/src/commands/package/schema/openapi/generate/client.ts @@ -103,7 +103,10 @@ async function generate( export async function command( outputPackage: string, clientAdditionalProperties?: string, - abortSignal?: AbortController, + { + abortSignal, + isWatch = false, + }: { abortSignal?: AbortController; isWatch?: boolean } = {}, ): Promise { try { await generate(outputPackage, clientAdditionalProperties, abortSignal); @@ -115,7 +118,14 @@ export async function command( console.debug('Server generation aborted.'); return; } - console.log(chalk.red(`Client generation failed:`)); - console.log(err); + if (isWatch) { + console.log(chalk.red(`Client generation failed:`)); + console.group(); + console.log(chalk.red(err.message)); + console.groupEnd(); + } else { + console.log(chalk.red(`Client generation failed.`)); + console.log(chalk.red(err.message)); + } } } diff --git a/packages/repo-tools/src/commands/package/schema/openapi/generate/index.ts b/packages/repo-tools/src/commands/package/schema/openapi/generate/index.ts index e8a7eb7249..1c9fd586fb 100644 --- a/packages/repo-tools/src/commands/package/schema/openapi/generate/index.ts +++ b/packages/repo-tools/src/commands/package/schema/openapi/generate/index.ts @@ -18,7 +18,10 @@ import { OptionValues } from 'commander'; import { command as generateClient } from './client'; import { command as generateServer } from './server'; import chokidar from 'chokidar'; -import { getPathToCurrentOpenApiSpec } from '../../../../../lib/openapi/helpers'; +import { + getPathToCurrentOpenApiSpec, + loadAndValidateOpenApiYaml, +} from '../../../../../lib/openapi/helpers'; import { debounce } from 'lodash'; import { block } from '../../../../../lib/runner'; @@ -31,18 +34,24 @@ export async function command(opts: OptionValues) { } const sharedCommand = async (abortSignal?: AbortController) => { + const resolvedOpenapiPath = await getPathToCurrentOpenApiSpec(); + await loadAndValidateOpenApiYaml(resolvedOpenapiPath); const promises = []; + const options = { + isWatch: opts.watch, + abortSignal, + }; if (opts.clientPackage) { promises.push( generateClient( opts.clientPackage, opts.clientAdditionalProperties, - abortSignal, + options, ), ); } if (opts.server) { - promises.push(generateServer(abortSignal)); + promises.push(generateServer(options)); } await Promise.all(promises); }; @@ -75,6 +84,8 @@ export async function command(opts: OptionValues) { 'Watching for changes in OpenAPI spec. Press Ctrl+C to stop.', ); }); + + debouncedCommand(); await block(); } catch (err) { console.error(chalk.red('Error: ', err)); diff --git a/packages/repo-tools/src/commands/package/schema/openapi/generate/server.ts b/packages/repo-tools/src/commands/package/schema/openapi/generate/server.ts index 662efe4347..1ef6fd10d2 100644 --- a/packages/repo-tools/src/commands/package/schema/openapi/generate/server.ts +++ b/packages/repo-tools/src/commands/package/schema/openapi/generate/server.ts @@ -61,7 +61,13 @@ export const createOpenApiRouter = async ( } } -export async function command(abortSignal?: AbortController): Promise { +export async function command({ + abortSignal, + isWatch = false, +}: { + abortSignal?: AbortController; + isWatch?: boolean; +}): Promise { try { await generate(abortSignal); console.log(chalk.green('Generated server files.')); @@ -70,7 +76,14 @@ export async function command(abortSignal?: AbortController): Promise { console.debug('Server generation aborted.'); return; } - console.log(chalk.red(`OpenAPI server stub generation failed.`)); - console.log(err.message); + if (isWatch) { + console.log(chalk.red(`Server generation failed:`)); + console.group(); + console.log(chalk.red(err.message)); + console.groupEnd(); + } else { + console.log(chalk.red(err.message)); + console.log(chalk.red(`OpenAPI server stub generation failed.`)); + } } } diff --git a/packages/repo-tools/src/commands/repo/schema/openapi/verify.ts b/packages/repo-tools/src/commands/repo/schema/openapi/verify.ts index 23e07d1230..35dd3e1702 100644 --- a/packages/repo-tools/src/commands/repo/schema/openapi/verify.ts +++ b/packages/repo-tools/src/commands/repo/schema/openapi/verify.ts @@ -15,12 +15,10 @@ */ import fs from 'fs-extra'; -import YAML from 'js-yaml'; -import { isEqual, cloneDeep } from 'lodash'; +import { isEqual } from 'lodash'; import { join } from 'path'; import chalk from 'chalk'; import { relative as relativePath, resolve as resolvePath } from 'path'; -import Parser from '@apidevtools/swagger-parser'; import { runner } from '../../../../lib/runner'; import { paths as cliPaths } from '../../../../lib/paths'; import { @@ -28,7 +26,10 @@ import { TS_SCHEMA_PATH, YAML_SCHEMA_PATH, } from '../../../../lib/openapi/constants'; -import { getPathToOpenApiSpec } from '../../../../lib/openapi/helpers'; +import { + getPathToOpenApiSpec, + loadAndValidateOpenApiYaml, +} from '../../../../lib/openapi/helpers'; async function verify(directoryPath: string) { let openapiPath = ''; @@ -38,8 +39,7 @@ async function verify(directoryPath: string) { // Unable to find spec at path. return; } - const yaml = YAML.load(await fs.readFile(openapiPath, 'utf8')); - await Parser.validate(cloneDeep(yaml) as any); + const yaml = await loadAndValidateOpenApiYaml(openapiPath); const schemaPath = join(directoryPath, TS_SCHEMA_PATH); if (!(await fs.pathExists(schemaPath))) { diff --git a/packages/repo-tools/src/lib/openapi/helpers.ts b/packages/repo-tools/src/lib/openapi/helpers.ts index f7e684a407..2359a1bbb0 100644 --- a/packages/repo-tools/src/lib/openapi/helpers.ts +++ b/packages/repo-tools/src/lib/openapi/helpers.ts @@ -18,6 +18,10 @@ import { pathExists } from 'fs-extra'; import { paths } from '../paths'; import { YAML_SCHEMA_PATH } from './constants'; import { resolve } from 'path'; +import YAML from 'js-yaml'; +import { cloneDeep } from 'lodash'; +import Parser from '@apidevtools/swagger-parser'; +import fs from 'fs-extra'; export const getPathToFile = async (directory: string, filename: string) => { return resolve(directory, filename); @@ -41,3 +45,9 @@ export const getPathToOpenApiSpec = async (directory: string) => { export const getPathToCurrentOpenApiSpec = async () => { return await assertExists(await getRelativePathToFile(YAML_SCHEMA_PATH)); }; + +export async function loadAndValidateOpenApiYaml(path: string) { + const yaml = YAML.load(await fs.readFile(path, 'utf8')); + await Parser.validate(cloneDeep(yaml) as any); + return yaml; +}