[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:
Houssein Djirdeh 2022-07-19 16:58:13 -04:00 committed by GitHub
parent 5ea3077021
commit 81c3cd682b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 100 additions and 9 deletions

View file

@ -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 = {

View file

@ -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 = [
{

View file

@ -0,0 +1,4 @@
{
"extends": "next",
"root": true
}

View file

@ -0,0 +1,10 @@
export default class Bar {
render() {
return (
<div>
<h1>Hello title</h1>
<img src="img" />
</div>
)
}
}

View file

@ -0,0 +1,10 @@
export default class Foo {
render() {
return (
<div>
<h1>Hello title</h1>
<link href="/example.css" rel="stylesheet" />
</div>
)
}
}

View 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>
)
}

View file

@ -0,0 +1,7 @@
const Custom = () => (
<div>
<script src="https://example.com" />
</div>
)
export default Custom

View file

@ -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,