From a921395477742a5f4f9fc33e483472cf48de3663 Mon Sep 17 00:00:00 2001 From: Yiming Cao Date: Thu, 20 Oct 2022 22:11:50 +0800 Subject: [PATCH 1/2] chore: prettify CLI, make sure exit code is correct and errors are dumped properly --- packages/schema/src/cli/index.ts | 39 ++++++++++++------- packages/schema/src/generator/index.ts | 18 ++++----- packages/schema/src/generator/prisma/index.ts | 12 ++++-- packages/schema/src/utils/exec-utils.ts | 5 +++ 4 files changed, 46 insertions(+), 28 deletions(-) create mode 100644 packages/schema/src/utils/exec-utils.ts diff --git a/packages/schema/src/cli/index.ts b/packages/schema/src/cli/index.ts index 3a5bf6356..5f60ca404 100644 --- a/packages/schema/src/cli/index.ts +++ b/packages/schema/src/cli/index.ts @@ -3,9 +3,10 @@ import { Model } from '../language-server/generated/ast'; import { ZModelLanguageMetaData } from '../language-server/generated/module'; import { createZModelServices } from '../language-server/zmodel-module'; import { extractAstNode } from './cli-util'; -import { Context } from '../generator/types'; +import { Context, GeneratorError } from '../generator/types'; import { ZenStackGenerator } from '../generator'; import { GENERATED_CODE_PATH } from '../generator/constants'; +import colors from 'colors'; export const generateAction = async ( fileName: string, @@ -21,7 +22,14 @@ export const generateAction = async ( generatedCodeDir: GENERATED_CODE_PATH, }; - await new ZenStackGenerator().generate(context); + try { + await new ZenStackGenerator().generate(context); + } catch (err) { + if (err instanceof GeneratorError) { + console.error(colors.red(err.message)); + process.exit(-1); + } + } }; export type GenerateOptions = { @@ -29,25 +37,26 @@ export type GenerateOptions = { }; export default function (): void { - const program = new Command(); + const program = new Command('zenstack'); - program - // eslint-disable-next-line @typescript-eslint/no-var-requires - .version(require('../../package.json').version); + program.version( + require('../../package.json').version, + '-v --version', + 'display CLI version' + ); + + program.description( + `${colors.bold.blue( + 'ζ' + )} ZenStack simplifies fullstack development by generating backend services and Typescript clients from a data model.\n\nDocumentation: https://zenstack.dev/doc.` + ); const fileExtensions = ZModelLanguageMetaData.fileExtensions.join(', '); program .command('generate') - .argument( - '', - `source file (possible file extensions: ${fileExtensions})` - ) - .option( - '-d, --destination ', - 'destination directory of generating' - ) + .argument('', `source file (with extension ${fileExtensions})`) .description( - 'generates JavaScript code that prints "Hello, {name}!" for each greeting in a source file' + 'generates RESTful API and Typescript client for your data model' ) .action(generateAction); diff --git a/packages/schema/src/generator/index.ts b/packages/schema/src/generator/index.ts index 6af644a8d..9a753c8ec 100644 --- a/packages/schema/src/generator/index.ts +++ b/packages/schema/src/generator/index.ts @@ -1,4 +1,4 @@ -import { Context } from './types'; +import { Context, GeneratorError } from './types'; import * as fs from 'fs'; import colors from 'colors'; import PrismaGenerator from './prisma'; @@ -6,7 +6,7 @@ import ServiceGenerator from './service'; import ReactHooksGenerator from './react-hooks'; import NextAuthGenerator from './next-auth'; import path from 'path'; -import { execSync } from 'child_process'; +import { execSync } from '../utils/exec-utils'; export class ZenStackGenerator { async generate(context: Context) { @@ -38,7 +38,9 @@ export class ZenStackGenerator { generators.push(new NextAuthGenerator()); } catch { console.warn( - 'Next-auth module is not installed, skipping generating adapter.' + colors.yellow( + 'Next-auth module is not installed, skipping generating adapter.' + ) ); } @@ -71,16 +73,12 @@ export class ZenStackGenerator { `npx tsc -p "${path.join( context.generatedCodeDir, 'tsconfig.json' - )}"`, - { encoding: 'utf-8', stdio: 'inherit' } + )}"` ); } catch { - console.error( - colors.red( - 'Something went wrong, generated runtime code failed to compile...' - ) + throw new GeneratorError( + 'Something went wrong, generated runtime code failed to compile...\nPlease check errors above.' ); - return; } console.log(colors.blue(' ✔️ Typescript source files transpiled')); diff --git a/packages/schema/src/generator/prisma/index.ts b/packages/schema/src/generator/prisma/index.ts index fe2254677..aeb4e9611 100644 --- a/packages/schema/src/generator/prisma/index.ts +++ b/packages/schema/src/generator/prisma/index.ts @@ -1,6 +1,6 @@ import colors from 'colors'; -import { Context, Generator } from '../types'; -import { execSync } from 'child_process'; +import { Context, Generator, GeneratorError } from '../types'; +import { execSync } from '../../utils/exec-utils'; import PrismaSchemaGenerator from './schema-generator'; import QueryGuardGenerator from './query-gard-generator'; @@ -21,6 +21,12 @@ export default class PrismaGenerator implements Generator { } async generatePrismaClient(schemaFile: string) { - execSync(`npx prisma generate --schema "${schemaFile}"`); + try { + execSync(`npx prisma generate --schema "${schemaFile}"`); + } catch { + throw new GeneratorError( + `Failed to generate client code with Prisma. Check errors above for clues.\nThis normally shouldn't happen. Please file an issue at: http://go.zenstack.dev/bug.` + ); + } } } diff --git a/packages/schema/src/utils/exec-utils.ts b/packages/schema/src/utils/exec-utils.ts new file mode 100644 index 000000000..8351f5842 --- /dev/null +++ b/packages/schema/src/utils/exec-utils.ts @@ -0,0 +1,5 @@ +import { execSync as _exec } from 'child_process'; + +export function execSync(cmd: string) { + _exec(cmd, { encoding: 'utf-8', stdio: 'inherit' }); +} From a7ae6416895bf34aeced66ff79eed18f595ff56c Mon Sep 17 00:00:00 2001 From: Yiming Cao Date: Thu, 20 Oct 2022 22:12:57 +0800 Subject: [PATCH 2/2] bump version --- packages/schema/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/schema/package.json b/packages/schema/package.json index 09fda82d7..43f728abf 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -2,7 +2,7 @@ "name": "zenstack", "displayName": "ZenStack CLI and Language Tools", "description": "ZenStack CLI and Language Tools", - "version": "0.1.42", + "version": "0.1.43", "engines": { "vscode": "^1.56.0" },