rsnext/packages/next/lib/eslint/writeDefaultConfig.ts

65 lines
1.5 KiB
TypeScript
Raw Normal View History

Adds ESLint with default rule-set (#23702) This PR re-includes ESLint with some notable changes, namely a guided setup similar to how TypeScript is instantiated in a Next.js application. To add ESLint to a project, developers will have to create an `.eslintrc` file in the root of their project or add an empty `eslintConfig` object to their `package.json` file. ```js touch .eslintrc ``` Then running `next build` will show instructions to install the required packages needed: <img width="862" alt="Screen Shot 2021-04-19 at 7 38 27 PM" src="https://user-images.githubusercontent.com/12476932/115316182-dfd51b00-a146-11eb-830c-90bad20ed151.png"> Once installed and `next build` is run again, `.eslintrc` will be automatically configured to include the default config: ```json { "extends": "next" } ``` In addition to this change: - The feature is now under the experimental flag and requires opt-in. After testing and feedback, it will be switched to the top-level namespace and turned on by default. - A new ESLint shareable configuration package is included that can be extended in any application with `{ extends: 'next' }` - This default config 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) - All rules in [`eslint-plugin-next`](https://www.npmjs.com/package/@next/eslint-plugin-next) have been modified to include actionable links that show more information to help resolve each issue
2021-04-30 13:09:07 +02:00
import { promises as fs } from 'fs'
import chalk from 'chalk'
import os from 'os'
import path from 'path'
import * as CommentJson from 'next/dist/compiled/comment-json'
export async function writeDefaultConfig(
eslintrcFile: string | null,
pkgJsonPath: string | null
) {
const defaultConfig = {
extends: 'next',
}
if (eslintrcFile) {
const ext = path.extname(eslintrcFile)
let fileContent
if (ext === '.yaml' || ext === '.yml') {
fileContent = "extends: 'next'"
} else {
fileContent = CommentJson.stringify(defaultConfig, null, 2)
if (ext === '.js') {
fileContent = 'module.exports = ' + fileContent
}
}
await fs.writeFile(eslintrcFile, fileContent + os.EOL)
console.log(
'\n' +
chalk.green(
`We detected ESLint in your project and updated the ${chalk.bold(
path.basename(eslintrcFile)
)} file for you.`
) +
'\n'
)
} else if (pkgJsonPath) {
const pkgJsonContent = await fs.readFile(pkgJsonPath, {
encoding: 'utf8',
})
let packageJsonConfig = CommentJson.parse(pkgJsonContent)
packageJsonConfig.eslintConfig = defaultConfig
await fs.writeFile(
pkgJsonPath,
CommentJson.stringify(packageJsonConfig, null, 2) + os.EOL
)
console.log(
'\n' +
chalk.green(
`We detected ESLint in your project and updated the ${chalk.bold(
'eslintConfig'
)} field for you in package.json...`
) +
'\n'
)
}
}