From 00f1c1273161712ba649d437f2111b084c520d4d Mon Sep 17 00:00:00 2001 From: Flavian DESVERNE Date: Thu, 14 Mar 2019 15:34:36 +0100 Subject: [PATCH] Prettify scaffolded files by yoga scaffold command --- packages/create-yoga/src/scaffold.ts | 2 +- packages/yoga/package.json | 2 +- .../yoga/src/cli/commands/scaffold/index.ts | 48 ++++++++++++++++--- packages/yoga/src/yogaDefaults.ts | 16 ++++++- 4 files changed, 57 insertions(+), 11 deletions(-) diff --git a/packages/create-yoga/src/scaffold.ts b/packages/create-yoga/src/scaffold.ts index 373f7a6..4540e0d 100644 --- a/packages/create-yoga/src/scaffold.ts +++ b/packages/create-yoga/src/scaffold.ts @@ -384,7 +384,7 @@ function computeISDL( } } -export function format( +function format( code: string, options: prettier.Options = {}, parser: prettier.BuiltInParserName = 'typescript', diff --git a/packages/yoga/package.json b/packages/yoga/package.json index 7d2c61a..3faae7b 100644 --- a/packages/yoga/package.json +++ b/packages/yoga/package.json @@ -27,6 +27,7 @@ "nexus": "0.10.0", "nexus-prisma": "0.3.3", "pluralize": "^7.0.0", + "prettier": "^1.16.4", "pretty-error": "2.2.0-rc.1", "ts-node": "^8.0.2", "yargs": "^12.0.5" @@ -39,7 +40,6 @@ "@types/node": "10.12.29", "@types/pluralize": "0.0.29", "@types/yargs": "12.0.9", - "prettier": "1.16.4", "tslint-config-prettier": "1.17.0", "tslint-config-standard": "8.0.1", "typescript": "3.3.3333" diff --git a/packages/yoga/src/cli/commands/scaffold/index.ts b/packages/yoga/src/cli/commands/scaffold/index.ts index 39db44d..d884fd0 100644 --- a/packages/yoga/src/cli/commands/scaffold/index.ts +++ b/packages/yoga/src/cli/commands/scaffold/index.ts @@ -3,6 +3,7 @@ import * as inquirer from 'inquirer' import yaml from 'js-yaml' import * as path from 'path' import pluralize from 'pluralize' +import * as prettier from 'prettier' import { findPrismaConfigFile, importYogaConfig } from '../../../config' import { Config } from '../../../types' import { spawnAsync } from '../../spawnAsync' @@ -16,7 +17,7 @@ export default async () => { message: 'Input the name of your type', type: 'input', validate(input: string) { - if (input === undefined || input.length === 0) { + if (!input || input.length === 0) { return 'Type name should be at least one character' } @@ -103,7 +104,12 @@ Before we continue, please do the following steps: if (allStepsDone) { await runPrismaDeploy() - const filePath = scaffoldType(yogaConfig, typeName, hasDb, crudOperations) + const filePath = await scaffoldType( + yogaConfig, + typeName, + hasDb, + crudOperations, + ) const relativePath = path.relative(projectDir, filePath) console.log(` @@ -121,10 +127,11 @@ A few more optional steps: process.exit(0) } - scaffoldType(yogaConfig, typeName, hasDb, null) + const filePath = await scaffoldType(yogaConfig, typeName, hasDb, null) + const relativePath = path.relative(projectDir, filePath) console.log(`\ -Scaffolded new file at ./src/graphql/${typeName}.ts +Scaffolded new file at ${relativePath} Next steps: @@ -133,12 +140,12 @@ Next steps: `) } -function scaffoldType( +async function scaffoldType( config: Config, typeName: string, hasDb: boolean, crudOperations: string[] | null, -): string { +): Promise { const typePath = path.join(config.resolversPath, `${typeName}.ts`) if (fs.existsSync(typePath)) { @@ -148,9 +155,10 @@ function scaffoldType( const content = hasDb ? scaffoldTypeWithDb(typeName, crudOperations) : scaffoldTypeWithoutDb(typeName) + const prettierOptions = await resolvePrettierOptions(process.cwd()) try { - fs.writeFileSync(typePath, content) + fs.writeFileSync(typePath, format(content, prettierOptions)) } catch (e) { console.error(e) } @@ -339,3 +347,29 @@ async function runCommand(command: string) { return childProcess } + +async function resolvePrettierOptions(path: string): Promise { + const options = (await prettier.resolveConfig(path)) || {} + + return options +} + +function format( + code: string, + options: prettier.Options = {}, + parser: prettier.BuiltInParserName = 'typescript', +) { + try { + return prettier.format(code, { + ...options, + parser, + }) + } catch (e) { + console.log( + `There is a syntax error in generated code, unformatted code printed, error: ${JSON.stringify( + e, + )}`, + ) + return code + } +} diff --git a/packages/yoga/src/yogaDefaults.ts b/packages/yoga/src/yogaDefaults.ts index 44f224b..88c589c 100644 --- a/packages/yoga/src/yogaDefaults.ts +++ b/packages/yoga/src/yogaDefaults.ts @@ -192,7 +192,13 @@ export function client( if (input === undefined) { const clientPath = requiredPath( join(projectDir, datamodelInfo.clientPath), - buildError(projectDir, datamodelInfo.clientPath, 'prisma.client'), + `${buildError( + projectDir, + datamodelInfo.clientPath, + 'prisma.client', + )}. Try running ${chalk.yellow( + 'prisma deploy', + )} to generate the needed files.`, ) return importFile(clientPath, 'prisma', true) @@ -213,7 +219,13 @@ export function datamodelInfo( return importFile( requiredPath( datamodelInfoPath, - buildError(projectDir, datamodelInfoPath, 'prisma.datamodelInfoPath'), + `${buildError( + projectDir, + datamodelInfoPath, + 'prisma.datamodelInfoPath', + )}. Try running ${chalk.yellow( + 'prisma deploy', + )} to generate the needed files.`, ), 'default', )