From d57aea76a7034395c46d818466d604b7e794da99 Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Fri, 25 Feb 2022 13:04:07 -0800 Subject: [PATCH] Clean-up error when starting next with non-existent dir --- packages/next/lib/get-project-dir.ts | 34 ++++++++++++------ test/integration/cli/test/index.test.js | 46 +++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 11 deletions(-) diff --git a/packages/next/lib/get-project-dir.ts b/packages/next/lib/get-project-dir.ts index 4e7cc2670e8e130..24b4c32070ab396 100644 --- a/packages/next/lib/get-project-dir.ts +++ b/packages/next/lib/get-project-dir.ts @@ -3,17 +3,29 @@ import path from 'path' import * as Log from '../build/output/log' export function getProjectDir(dir?: string) { - const resolvedDir = path.resolve(dir || '.') - const realDir = fs.realpathSync.native(resolvedDir) + try { + const resolvedDir = path.resolve(dir || '.') + const realDir = fs.realpathSync.native(resolvedDir) - if ( - resolvedDir !== realDir && - resolvedDir.toLowerCase() === realDir.toLowerCase() - ) { - Log.warn( - `Invalid casing detected for project dir, received ${resolvedDir} actual path ${realDir}, see more info here https://nextjs.org/docs/messages/invalid-project-dir-casing` - ) - } + if ( + resolvedDir !== realDir && + resolvedDir.toLowerCase() === realDir.toLowerCase() + ) { + Log.warn( + `Invalid casing detected for project dir, received ${resolvedDir} actual path ${realDir}, see more info here https://nextjs.org/docs/messages/invalid-project-dir-casing` + ) + } - return realDir + return realDir + } catch (err: any) { + if (err.code === 'ENOENT') { + Log.error( + `Invalid project directory provided, no such directory: ${path.resolve( + dir || '.' + )}` + ) + process.exit(1) + } + throw err + } } diff --git a/test/integration/cli/test/index.test.js b/test/integration/cli/test/index.test.js index e4ff3f49099c4af..bf7e39e892eadee 100644 --- a/test/integration/cli/test/index.test.js +++ b/test/integration/cli/test/index.test.js @@ -48,7 +48,17 @@ describe('CLI Usage', () => { new RegExp(`Next\\.js v${pkg.version.replace(/\./g, '\\.')}`) ) }) + + test('invalid directory', async () => { + const output = await runNextCommand(['non-existent'], { + stderr: true, + }) + expect(output.stderr).toContain( + 'Invalid project directory provided, no such directory' + ) + }) }) + describe('build', () => { test('--help', async () => { const help = await runNextCommand(['build', '--help'], { @@ -109,6 +119,15 @@ describe('CLI Usage', () => { expect(code).toBe(expectedExitCode) expect(signal).toBe(expectedExitSignal) }) + + test('invalid directory', async () => { + const output = await runNextCommand(['build', 'non-existent'], { + stderr: true, + }) + expect(output.stderr).toContain( + 'Invalid project directory provided, no such directory' + ) + }) }) describe('dev', () => { @@ -253,6 +272,15 @@ describe('CLI Usage', () => { expect(code).toBe(expectedExitCode) expect(signal).toBe(expectedExitSignal) }) + + test('invalid directory', async () => { + const output = await runNextCommand(['dev', 'non-existent'], { + stderr: true, + }) + expect(output.stderr).toContain( + 'Invalid project directory provided, no such directory' + ) + }) }) describe('start', () => { @@ -337,6 +365,15 @@ describe('CLI Usage', () => { expect(code).toBe(expectedExitCode) expect(signal).toBe(expectedExitSignal) }) + + test('invalid directory', async () => { + const output = await runNextCommand(['start', 'non-existent'], { + stderr: true, + }) + expect(output.stderr).toContain( + 'Invalid project directory provided, no such directory' + ) + }) }) describe('export', () => { @@ -366,6 +403,15 @@ describe('CLI Usage', () => { }) expect(stderr).not.toContain('UnhandledPromiseRejectionWarning') }) + + test('invalid directory', async () => { + const output = await runNextCommand(['export', 'non-existent'], { + stderr: true, + }) + expect(output.stderr).toContain( + 'Invalid project directory provided, no such directory' + ) + }) }) describe('telemetry', () => {