diff --git a/src/lib/add-to-context-extractor/typegen.ts b/src/lib/add-to-context-extractor/typegen.ts index 8a7885d90..a382ba051 100644 --- a/src/lib/add-to-context-extractor/typegen.ts +++ b/src/lib/add-to-context-extractor/typegen.ts @@ -1,4 +1,5 @@ import { codeBlock } from 'common-tags' +import { Either, isLeft, right } from 'fp-ts/lib/Either' import * as fs from 'fs-jetpack' import { hardWriteFile } from '../fs' import * as Layout from '../layout' @@ -20,16 +21,18 @@ export const NEXUS_DEFAULT_RUNTIME_CONTEXT_TYPEGEN_PATH = fs.path( */ export async function generateContextExtractionArtifacts( layout: Layout.Layout -): Promise { +): Promise> { log.trace('starting context type extraction') - const program = createTSProgram(layout, { withCache: true }) + const errProgram = createTSProgram(layout, { withCache: true }) + if (isLeft(errProgram)) return errProgram + const program = errProgram.right const contextTypes = extractContextTypes(program.getProgram()) await writeContextTypeGenFile(contextTypes) log.trace('finished context type extraction', { contextTypes }) - return contextTypes + return right(contextTypes) } /** diff --git a/src/lib/build/build.ts b/src/lib/build/build.ts index 96ca14e53..a289eaf4d 100644 --- a/src/lib/build/build.ts +++ b/src/lib/build/build.ts @@ -1,3 +1,4 @@ +import { rightOrThrow } from '@nexus/logger/dist/utils' import { stripIndent } from 'common-tags' import * as FS from 'fs-jetpack' import * as Path from 'path' @@ -85,7 +86,7 @@ export async function buildNexusApp(settings: BuildSettings) { log.info('building typescript program') - const tsBuilder = createTSProgram(layout, { withCache: true }) + const tsBuilder = rightOrThrow(createTSProgram(layout, { withCache: true })) log.info('compiling a production build') diff --git a/src/lib/reflection/typegen.ts b/src/lib/reflection/typegen.ts index 7d0fe4aab..f42681769 100644 --- a/src/lib/reflection/typegen.ts +++ b/src/lib/reflection/typegen.ts @@ -1,3 +1,4 @@ +import { rightOrThrow } from '@nexus/logger/dist/utils' import * as NexusSchema from '@nexus/schema' import * as Schema from '../../runtime/schema' import { generateContextExtractionArtifacts } from '../add-to-context-extractor' @@ -30,5 +31,10 @@ export async function writeArtifacts(params: TypegenParams) { // Generate the context typegen file const contextExtractorTypegenPromise = generateContextExtractionArtifacts(params.layout) - await Promise.all([nexusSchemaTypegenPromise, contextExtractorTypegenPromise]) + const [_, contextExtractorTypegen] = await Promise.all([ + nexusSchemaTypegenPromise, + contextExtractorTypegenPromise, + ]) + + rightOrThrow(contextExtractorTypegen) } diff --git a/src/lib/tsc.ts b/src/lib/tsc.ts index 21a47c380..47bbd26cf 100644 --- a/src/lib/tsc.ts +++ b/src/lib/tsc.ts @@ -1,3 +1,4 @@ +import { Either, left, right } from 'fp-ts/lib/Either' import * as fs from 'fs-jetpack' import { addHook } from 'pirates' import * as ts from 'typescript' @@ -16,7 +17,7 @@ interface ProgramOptions { export function createTSProgram( layout: Layout, options?: ProgramOptions -): ts.EmitAndSemanticDiagnosticsBuilderProgram { +): Either { // Incremental option cannot be set when `noEmit: true` const compilerCacheOptions = options?.withCache && !layout.tsConfig.content.options.noEmit @@ -47,17 +48,13 @@ export function createTSProgram( (error) => error.code === SOURCE_ROOT_MUST_CONTAIN_ALL_SOURCE_FILES_ERROR_CODE ) if (maybeSourceRootMustContainAllSourceFilesError) { - log.fatal( + const message = 'Your app is invalid\n\n' + - ts.formatDiagnosticsWithColorAndContext( - [maybeSourceRootMustContainAllSourceFilesError], - diagnosticHost - ) - ) - process.exit(1) + ts.formatDiagnosticsWithColorAndContext([maybeSourceRootMustContainAllSourceFilesError], diagnosticHost) + return left(Error(message)) } - return builder + return right(builder) } export function deleteTSIncrementalFile(layout: Layout) {