Skip to content

Commit 9962fa5

Browse files
authored
Turbopack: delete .next folder before throwing due to "pages/app directory must be in the same folder" (#84553)
### What? I expect an empty .next folder after an error, so it should delete it before doing the check, so that an error doesn't result in a stale .next folder
1 parent 29010ff commit 9962fa5

File tree

2 files changed

+29
-29
lines changed

2 files changed

+29
-29
lines changed

packages/next/src/build/index.ts

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1016,6 +1016,34 @@ export default async function build(
10161016
NextBuildContext.originalRewrites = config._originalRewrites
10171017
NextBuildContext.originalRedirects = config._originalRedirects
10181018

1019+
const distDirCreated = await nextBuildSpan
1020+
.traceChild('create-dist-dir')
1021+
.traceAsyncFn(async () => {
1022+
try {
1023+
await fs.mkdir(distDir, { recursive: true })
1024+
return true
1025+
} catch (err) {
1026+
if (isError(err) && err.code === 'EPERM') {
1027+
return false
1028+
}
1029+
throw err
1030+
}
1031+
})
1032+
1033+
if (!distDirCreated || !(await isWriteable(distDir))) {
1034+
throw new Error(
1035+
'> Build directory is not writeable. https://nextjs.org/docs/messages/build-dir-not-writeable'
1036+
)
1037+
}
1038+
1039+
if (config.cleanDistDir && !isGenerateMode) {
1040+
await nextBuildSpan
1041+
.traceChild('clean')
1042+
.traceAsyncFn(() =>
1043+
recursiveDeleteSyncWithAsyncRetries(distDir, /^(cache|dev)/)
1044+
)
1045+
}
1046+
10191047
const cacheDir = getCacheDir(distDir)
10201048

10211049
const telemetry = new Telemetry({ distDir })
@@ -1102,34 +1130,6 @@ export default async function build(
11021130
cacheDir,
11031131
}
11041132

1105-
const distDirCreated = await nextBuildSpan
1106-
.traceChild('create-dist-dir')
1107-
.traceAsyncFn(async () => {
1108-
try {
1109-
await fs.mkdir(distDir, { recursive: true })
1110-
return true
1111-
} catch (err) {
1112-
if (isError(err) && err.code === 'EPERM') {
1113-
return false
1114-
}
1115-
throw err
1116-
}
1117-
})
1118-
1119-
if (!distDirCreated || !(await isWriteable(distDir))) {
1120-
throw new Error(
1121-
'> Build directory is not writeable. https://nextjs.org/docs/messages/build-dir-not-writeable'
1122-
)
1123-
}
1124-
1125-
if (config.cleanDistDir && !isGenerateMode) {
1126-
await nextBuildSpan
1127-
.traceChild('clean')
1128-
.traceAsyncFn(() =>
1129-
recursiveDeleteSyncWithAsyncRetries(distDir, /^(cache|dev)/)
1130-
)
1131-
}
1132-
11331133
if (appDir && 'exportPathMap' in config) {
11341134
Log.error(
11351135
'The "exportPathMap" configuration cannot be used with the "app" directory. Please use generateStaticParams() instead.'

packages/next/src/lib/recursive-delete.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ export async function recursiveDeleteSyncWithAsyncRetries(
7474
dir: string,
7575
/** Exclude based on relative file path */
7676
exclude?: RegExp,
77-
/** Ensures that parameter dir exists, this is not passed recursively */
77+
/** Relative path to the directory being deleted, used for exclude */
7878
previousPath: string = ''
7979
): Promise<void> {
8080
let result

0 commit comments

Comments
 (0)