未验证 提交 a21a8fcc 编写于 作者: J JJ Kasper 提交者: GitHub

Add error for invalid distDir value (#10177)

* Add error for invalid distDir value

* Add check for null/undefined distDir
Co-authored-by: NJoe Haddad <timer150@gmail.com>
上级 eb38d223
......@@ -83,10 +83,26 @@ function assignDefaults(userConfig: { [key: string]: any }) {
experimentalWarning()
}
if (key === 'distDir' && userConfig[key] === 'public') {
throw new Error(
`The 'public' directory is reserved in Next.js and can not be set as the 'distDir'. https://err.sh/zeit/next.js/can-not-output-to-public`
)
if (key === 'distDir') {
if (typeof userConfig[key] !== 'string') {
userConfig[key] = defaultConfig.distDir
}
const userDistDir = userConfig[key].trim()
// don't allow public as the distDir as this is a reserved folder for
// public files
if (userDistDir === 'public') {
throw new Error(
`The 'public' directory is reserved in Next.js and can not be set as the 'distDir'. https://err.sh/zeit/next.js/can-not-output-to-public`
)
}
// make sure distDir isn't an empty string which can result the provided
// directory being deleted in development mode
if (userDistDir.length === 0) {
throw new Error(
`Invalid distDir provided, distDir can not be an empty string. Please remove this config or set it to undefined`
)
}
}
const maybeObject = userConfig[key]
......
/* eslint-env jest */
/* global jasmine */
import fs from 'fs-extra'
import { join } from 'path'
import { existsSync } from 'fs'
import { BUILD_ID_FILE } from 'next/constants'
import {
nextServer,
nextStart,
nextBuild,
startApp,
stopApp,
findPort,
killApp,
renderViaHTTP,
} from 'next-test-utils'
jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000 * 60 * 2
const appDir = join(__dirname, '../')
const nextConfig = join(appDir, 'next.config.js')
let appPort
let server
let app
jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000 * 60 * 5
describe('Production Usage', () => {
beforeAll(async () => {
await nextBuild(appDir)
app = nextServer({
dir: join(__dirname, '../'),
dev: false,
quiet: true,
describe('With basic usage', () => {
beforeAll(async () => {
await nextBuild(appDir)
appPort = await findPort()
app = await nextStart(appDir, appPort)
})
afterAll(() => killApp(app))
server = await startApp(app)
appPort = server.address().port
})
afterAll(() => stopApp(server))
describe('With basic usage', () => {
it('should render the page', async () => {
const html = await renderViaHTTP(appPort, '/')
expect(html).toMatch(/Hello World/)
})
})
describe('File locations', () => {
it('should build the app within the given `dist` directory', () => {
it('should build the app within the given `dist` directory', async () => {
expect(
existsSync(join(__dirname, `/../dist/${BUILD_ID_FILE}`))
await fs.exists(join(__dirname, `/../dist/${BUILD_ID_FILE}`))
).toBeTruthy()
})
it('should not build the app within the default `.next` directory', () => {
it('should not build the app within the default `.next` directory', async () => {
expect(
existsSync(join(__dirname, `/../.next/${BUILD_ID_FILE}`))
await fs.exists(join(__dirname, `/../.next/${BUILD_ID_FILE}`))
).toBeFalsy()
})
})
it('should throw error with invalid distDir', async () => {
const origNextConfig = await fs.readFile(nextConfig, 'utf8')
await fs.writeFile(nextConfig, `module.exports = { distDir: '' }`)
const { stderr } = await nextBuild(appDir, [], { stderr: true })
await fs.writeFile(nextConfig, origNextConfig)
expect(stderr).toContain(
'Invalid distDir provided, distDir can not be an empty string. Please remove this config or set it to undefined'
)
})
it('should handle null/undefined distDir', async () => {
const origNextConfig = await fs.readFile(nextConfig, 'utf8')
await fs.writeFile(nextConfig, `module.exports = { distDir: null }`)
const { stderr } = await nextBuild(appDir, [], { stderr: true })
await fs.writeFile(nextConfig, origNextConfig)
expect(stderr.length).toBe(0)
})
})
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册