[ESLint] Make src/
a default linting directory (#38810)
Fixes #38533 by including `src/` as a default linting directory where all files within are linted ## Bug - [X] Related issues linked using `fixes #number` - [X] Integration tests added - [ ] Errors have helpful link attached, see `contributing.md`
This commit is contained in:
parent
5ea3077021
commit
81c3cd682b
8 changed files with 100 additions and 9 deletions
|
@ -126,7 +126,7 @@ If you're using `eslint-plugin-next` in a project where Next.js isn't installed
|
|||
|
||||
## Linting Custom Directories and Files
|
||||
|
||||
By default, Next.js will run ESLint for all files in the `pages/`, `components/`, and `lib/` directories. However, you can specify which directories using the `dirs` option in the `eslint` config in `next.config.js` for production builds:
|
||||
By default, Next.js will run ESLint for all files in the `pages/`, `components/`, `lib/`, and `src/` directories. However, you can specify which directories using the `dirs` option in the `eslint` config in `next.config.js` for production builds:
|
||||
|
||||
```js
|
||||
module.exports = {
|
||||
|
|
|
@ -57,14 +57,7 @@ export const NON_STANDARD_NODE_ENV = `You are using a non-standard "NODE_ENV" va
|
|||
|
||||
export const SSG_FALLBACK_EXPORT_ERROR = `Pages with \`fallback\` enabled in \`getStaticPaths\` can not be exported. See more info here: https://nextjs.org/docs/messages/ssg-fallback-true-export`
|
||||
|
||||
export const ESLINT_DEFAULT_DIRS = [
|
||||
'pages',
|
||||
'components',
|
||||
'lib',
|
||||
'src/pages',
|
||||
'src/components',
|
||||
'src/lib',
|
||||
]
|
||||
export const ESLINT_DEFAULT_DIRS = ['pages', 'components', 'lib', 'src']
|
||||
|
||||
export const ESLINT_PROMPT_VALUES = [
|
||||
{
|
||||
|
|
4
test/integration/eslint/base-directories/.eslintrc
Normal file
4
test/integration/eslint/base-directories/.eslintrc
Normal file
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"extends": "next",
|
||||
"root": true
|
||||
}
|
10
test/integration/eslint/base-directories/components/bar.js
Normal file
10
test/integration/eslint/base-directories/components/bar.js
Normal file
|
@ -0,0 +1,10 @@
|
|||
export default class Bar {
|
||||
render() {
|
||||
return (
|
||||
<div>
|
||||
<h1>Hello title</h1>
|
||||
<img src="img" />
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
10
test/integration/eslint/base-directories/lib/foo.js
Normal file
10
test/integration/eslint/base-directories/lib/foo.js
Normal file
|
@ -0,0 +1,10 @@
|
|||
export default class Foo {
|
||||
render() {
|
||||
return (
|
||||
<div>
|
||||
<h1>Hello title</h1>
|
||||
<link href="/example.css" rel="stylesheet" />
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
14
test/integration/eslint/base-directories/pages/_document.js
Normal file
14
test/integration/eslint/base-directories/pages/_document.js
Normal file
|
@ -0,0 +1,14 @@
|
|||
import { Html, Main, NextScript } from 'next/document'
|
||||
import Head from 'next/head'
|
||||
|
||||
export default function Document() {
|
||||
return (
|
||||
<Html>
|
||||
<Head />
|
||||
<body>
|
||||
<Main />
|
||||
<NextScript />
|
||||
</body>
|
||||
</Html>
|
||||
)
|
||||
}
|
7
test/integration/eslint/base-directories/src/index.js
Normal file
7
test/integration/eslint/base-directories/src/index.js
Normal file
|
@ -0,0 +1,7 @@
|
|||
const Custom = () => (
|
||||
<div>
|
||||
<script src="https://example.com" />
|
||||
</div>
|
||||
)
|
||||
|
||||
export default Custom
|
|
@ -19,6 +19,7 @@ const dirPluginCoreWebVitalsConfig = join(
|
|||
'../plugin-core-web-vitals-config'
|
||||
)
|
||||
const dirIgnoreDuringBuilds = join(__dirname, '../ignore-during-builds')
|
||||
const dirBaseDirectories = join(__dirname, '../base-directories')
|
||||
const dirCustomDirectories = join(__dirname, '../custom-directories')
|
||||
const dirConfigInPackageJson = join(__dirname, '../config-in-package-json')
|
||||
const dirInvalidOlderEslintVersion = join(
|
||||
|
@ -79,6 +80,33 @@ describe('ESLint', () => {
|
|||
)
|
||||
})
|
||||
|
||||
test('base directories are linted by default during builds', async () => {
|
||||
const { stdout, stderr } = await nextBuild(dirBaseDirectories, [], {
|
||||
stdout: true,
|
||||
stderr: true,
|
||||
})
|
||||
|
||||
const output = stdout + stderr
|
||||
|
||||
expect(output).toContain('Failed to compile')
|
||||
expect(output).toContain(
|
||||
'Error: `next/head` should not be imported in `pages/_document.js`. Use `<Head />` from `next/document` instead'
|
||||
)
|
||||
expect(output).toContain(
|
||||
'Warning: Do not use `<img>` element. Use `<Image />` from `next/image` instead'
|
||||
)
|
||||
expect(output).toContain('Warning: Do not include stylesheets manually')
|
||||
expect(output).toContain(
|
||||
'Warning: Synchronous scripts should not be used'
|
||||
)
|
||||
|
||||
// Files in pages, components, lib, and src directories are linted
|
||||
expect(output).toContain('pages/_document.js')
|
||||
expect(output).toContain('components/bar.js')
|
||||
expect(output).toContain('lib/foo.js')
|
||||
expect(output).toContain('src/index.js')
|
||||
})
|
||||
|
||||
test('custom directories', async () => {
|
||||
const { stdout, stderr } = await nextBuild(dirCustomDirectories, [], {
|
||||
stdout: true,
|
||||
|
@ -287,6 +315,31 @@ describe('ESLint', () => {
|
|||
)
|
||||
})
|
||||
|
||||
test('base directories are linted by default', async () => {
|
||||
const { stdout, stderr } = await nextLint(dirBaseDirectories, [], {
|
||||
stdout: true,
|
||||
stderr: true,
|
||||
})
|
||||
|
||||
const output = stdout + stderr
|
||||
expect(output).toContain(
|
||||
'Error: `next/head` should not be imported in `pages/_document.js`. Use `<Head />` from `next/document` instead'
|
||||
)
|
||||
expect(output).toContain(
|
||||
'Warning: Do not use `<img>` element. Use `<Image />` from `next/image` instead'
|
||||
)
|
||||
expect(output).toContain('Warning: Do not include stylesheets manually')
|
||||
expect(output).toContain(
|
||||
'Warning: Synchronous scripts should not be used'
|
||||
)
|
||||
|
||||
// Files in pages, components, lib, and src directories are linted
|
||||
expect(output).toContain('pages/_document.js')
|
||||
expect(output).toContain('components/bar.js')
|
||||
expect(output).toContain('lib/foo.js')
|
||||
expect(output).toContain('src/index.js')
|
||||
})
|
||||
|
||||
test('shows warnings and errors with next/core-web-vitals config', async () => {
|
||||
const { stdout, stderr } = await nextLint(dirWebVitalsConfig, [], {
|
||||
stdout: true,
|
||||
|
|
Loading…
Reference in a new issue