-
Notifications
You must be signed in to change notification settings - Fork 27k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
removes eslint flag, adds lint cli command, includes eslint in create…
… next app templates, and documentation
- Loading branch information
1 parent
f29dfe2
commit ee29a91
Showing
31 changed files
with
467 additions
and
191 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
--- | ||
description: Next.js supports ESLint by default. You can get started with ESLint in Next.js here. | ||
--- | ||
|
||
# ESLint | ||
|
||
Next.js provides an integrated [ESLint](https://eslint.org/) experience out of the box. To get started, run `next lint`: | ||
|
||
```bash | ||
next lint | ||
``` | ||
|
||
If you don't already have ESLint configured in your application, you will be guided through the installation of any required packages. | ||
|
||
```bash | ||
next lint | ||
|
||
# You'll see instructions like these: | ||
# | ||
# Please install eslint and eslint-config-next by running: | ||
# | ||
# yarn add --dev eslint eslint-config-next | ||
# | ||
# ... | ||
``` | ||
|
||
If no ESLint configuration is present, Next.js will create an `.eslintrc` file in the root of your project and automatically configure it with the base configuration: | ||
|
||
``` | ||
{ | ||
"extends": "next" | ||
} | ||
``` | ||
|
||
Now you can run `next lint` every time you want to run ESLint to catch | ||
|
||
> The default base configuration (`"extends": "next"`) can be updated at any time and will only be included if no ESLint configuration is present. | ||
We recommend using an appropriate [integration](https://eslint.org/docs/user-guide/integrations#editors) to view warnings and errors directly in your code editor during development. | ||
|
||
## Linting During Builds | ||
|
||
Once ESLint has been set up, it will automatically run during every build (`next build`). Errors will fail the build while warnings will not. | ||
|
||
If you do not want ESLint to run as a build step, it can be disabled using the `--no-lint` flag: | ||
|
||
```bash | ||
next build --no-lint | ||
``` | ||
|
||
This is not recommended unless you have configured ESLint to run in a separate part of your workflow (for example, in CI or a pre-commit hook). | ||
|
||
## Linting Custom Directories | ||
|
||
By default, Next.js will only run ESLint for all files in the `pages/` directory. However, you can specify other custom directories to run by using the `--dir` flag in `next lint`: | ||
|
||
```bash | ||
next lint --dir components --dir lib | ||
``` | ||
|
||
## ESLint Plugin | ||
|
||
Next.js provides an ESLint plugin, [`eslint-plugin-next`](https://www.npmjs.com/package/@next/eslint-plugin-next), that makes it easier to catch common issues and problems in a Next.js application. The full set of rules can be found in the [package repository](https://github.com/vercel/next.js/tree/master/packages/eslint-plugin-next/lib/rules). | ||
|
||
## Base Configuration | ||
|
||
The Next.js base ESLint configuration is automatically generated when `next lint` is run for the first time: | ||
|
||
``` | ||
{ | ||
"extends": "next" | ||
} | ||
``` | ||
|
||
This configuration extends recommended rule sets from [`eslint-plugin-react`](https://www.npmjs.com/package/eslint-plugin-react), [`eslint-plugin-react-hooks`](https://www.npmjs.com/package/eslint-plugin-react-hooks), and [`eslint-plugin-next`](https://www.npmjs.com/package/@next/eslint-plugin-next). You can see the full details of the shareable configuration in the [`eslint-config-next`](https://www.npmjs.com/package/eslint-config-next) package. | ||
|
||
If you would like to modify any rules provided by the supported plugins (`react`, `react-hooks`, `next`), you can directly modify them using the `rules` property: | ||
|
||
``` | ||
{ | ||
"extends": "next", | ||
"rules": { | ||
"react/no-unescaped-entities": "off", | ||
"@next/next/no-page-custom-font": "error", | ||
} | ||
} | ||
``` | ||
|
||
> **Note**: If you need to also include a separate, custom ESLint configuration, it is highly recommended that `eslint-config-next` is extended last after other configurations. For example: | ||
> | ||
> ``` | ||
> { | ||
> "extends": ["eslint:recommended", "next"] | ||
> } | ||
> ``` | ||
> | ||
> The `next` configuration already handles setting default values for the `parser`, `plugins` and `settings` properties. | ||
> There is no need to manually re-declare any of these properties unless you need a different configuration for your use case. | ||
> If you include any other shareable configurations, you will need to make sure that these properties are not overwritten or modified. | ||
### Core Web Vitals | ||
|
||
A stricter `next/core-web-vitals` entrypoint can also be specified in `.eslintrc`: | ||
|
||
``` | ||
{ | ||
"extends": ["next", "next/core-web-vitals"] | ||
} | ||
``` | ||
|
||
This does not include any additional rules not already provided by the base `eslint-config-next` configuration, but will error on a number of important rules in `eslint-plugin-next` instead of provide a warning if they are likely to affect [Core Web Vitals](https://web.dev/vitals/). | ||
|
||
> Both `next` and `next/core-web-vitals` entry points are automatically included for new applications built with [Create Next App](/docs/api-reference/create-next-app.md). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
{ | ||
"extends": ["next", "next/core-web-vitals"] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction | ||
|
||
export default (req, res) => { | ||
export default function handler(req, res) { | ||
res.status(200).json({ name: 'John Doe' }) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
{ | ||
"extends": ["next", "next/core-web-vitals"] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
module.exports = { | ||
eslint: true, | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
module.exports = { | ||
extends: ['.'].map(require.resolve), | ||
rules: { | ||
'@next/next/no-sync-scripts': 2, | ||
'@next/next/no-html-link-for-pages': 2, | ||
'@next/next/no-img-element': 2, | ||
}, | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
#!/usr/bin/env node | ||
import { existsSync } from 'fs' | ||
import arg from 'next/dist/compiled/arg/index.js' | ||
import { resolve, join } from 'path' | ||
import { cliCommand } from '../bin/next' | ||
import { runLintCheck } from '../lib/eslint/runLintCheck' | ||
import { printAndExit } from '../server/lib/utils' | ||
|
||
const nextLint: cliCommand = (argv) => { | ||
const validArgs: arg.Spec = { | ||
// Types | ||
'--help': Boolean, | ||
'--dir': [String], | ||
|
||
// Aliases | ||
'-h': '--help', | ||
'-d': '--dir', | ||
} | ||
|
||
let args: arg.Result<arg.Spec> | ||
try { | ||
args = arg(validArgs, { argv }) | ||
} catch (error) { | ||
if (error.code === 'ARG_UNKNOWN_OPTION') { | ||
return printAndExit(error.message, 1) | ||
} | ||
throw error | ||
} | ||
if (args['--help']) { | ||
printAndExit( | ||
` | ||
Description | ||
Run ESLint on every file in specified directories. | ||
If not configured, ESLint will be set up for the first time. | ||
Usage | ||
$ next lint <baseDir> [options] | ||
<baseDir> represents the directory of the Next.js application. | ||
If no directory is provided, the current directory will be used. | ||
Options | ||
-h - list this help | ||
-d - set directory, or directories, to run ESLint (defaults to only 'pages') | ||
`, | ||
0 | ||
) | ||
} | ||
|
||
const baseDir = resolve(args._[0] || '.') | ||
|
||
// Check if the provided directory exists | ||
if (!existsSync(baseDir)) { | ||
printAndExit(`> No such directory exists as the project root: ${baseDir}`) | ||
} | ||
|
||
const dirs: string[] = args['--dir'] | ||
const lintDirs = dirs | ||
? dirs.reduce((res: string[], d: string) => { | ||
const currDir = join(baseDir, d) | ||
if (!existsSync(currDir)) return res | ||
res.push(currDir) | ||
return res | ||
}, []) | ||
: null | ||
|
||
runLintCheck(baseDir, lintDirs) | ||
.then((results) => { | ||
if (results) console.log(results) | ||
}) | ||
.catch((err) => { | ||
printAndExit(err.message) | ||
}) | ||
} | ||
|
||
export { nextLint } |
Oops, something went wrong.