2021-09-22 23:29:27 +02:00
import fs from 'fs'
import path from 'path'
2022-02-26 16:05:26 +01:00
import { commands } from '../bin/next'
2021-09-22 23:29:27 +02:00
import * as Log from '../build/output/log'
2022-02-26 16:05:26 +01:00
import { detectTypo } from './detect-typo'
2021-09-22 23:29:27 +02:00
export function getProjectDir ( dir? : string ) {
2022-02-25 23:08:08 +01:00
try {
const resolvedDir = path . resolve ( dir || '.' )
const realDir = fs . realpathSync . native ( resolvedDir )
2021-09-22 23:29:27 +02:00
2022-02-25 23:08:08 +01:00
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 `
)
}
2021-09-22 23:29:27 +02:00
2022-02-25 23:08:08 +01:00
return realDir
} catch ( err : any ) {
if ( err . code === 'ENOENT' ) {
2022-02-26 16:05:26 +01:00
if ( typeof dir === 'string' ) {
const detectedTypo = detectTypo ( dir , Object . keys ( commands ) )
if ( detectedTypo ) {
Log . error (
` "next ${ dir } " does not exist. Did you mean "next ${ detectedTypo } "? `
)
process . exit ( 1 )
}
}
2022-02-25 23:08:08 +01:00
Log . error (
` Invalid project directory provided, no such directory: ${ path . resolve (
dir || '.'
) } `
)
process . exit ( 1 )
}
throw err
}
2021-09-22 23:29:27 +02:00
}