From be5990dc346864e29f27bde9d2cff0016a3c31be Mon Sep 17 00:00:00 2001 From: Vitaly Baev Date: Sat, 12 Jun 2021 00:57:18 +0300 Subject: [PATCH 1/2] fix: don't create .eslintrc if package.json contains eslintConfig --- .../next/lib/eslint/writeDefaultConfig.ts | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/next/lib/eslint/writeDefaultConfig.ts b/packages/next/lib/eslint/writeDefaultConfig.ts index 96a244d217670..8b8acb54d38d8 100644 --- a/packages/next/lib/eslint/writeDefaultConfig.ts +++ b/packages/next/lib/eslint/writeDefaultConfig.ts @@ -49,25 +49,25 @@ export async function writeDefaultConfig( ) ) } - } else if ( - packageJsonConfig?.eslintConfig && - Object.entries(packageJsonConfig?.eslintConfig).length === 0 - ) { - packageJsonConfig.eslintConfig = defaultConfig + } else if (packageJsonConfig?.eslintConfig) { + // Creates .eslintrc only if package.json's eslintConfig field is empty + if (Object.entries(packageJsonConfig?.eslintConfig).length === 0) { + packageJsonConfig.eslintConfig = defaultConfig - if (pkgJsonPath) - await fs.writeFile( - pkgJsonPath, - CommentJson.stringify(packageJsonConfig, null, 2) + os.EOL - ) + if (pkgJsonPath) + await fs.writeFile( + pkgJsonPath, + CommentJson.stringify(packageJsonConfig, null, 2) + os.EOL + ) - console.log( - chalk.green( - `We detected an empty ${chalk.bold( - 'eslintConfig' - )} field in package.json and updated it for you to include the base Next.js ESLint configuration.` + console.log( + chalk.green( + `We detected an empty ${chalk.bold( + 'eslintConfig' + )} field in package.json and updated it for you to include the base Next.js ESLint configuration.` + ) ) - ) + } } else { await fs.writeFile( '.eslintrc', From 5d4d814fe4e1d42dfe2b95358bda39e0e5cae906 Mon Sep 17 00:00:00 2001 From: Vitaly Baev Date: Mon, 14 Jun 2021 18:41:54 +0300 Subject: [PATCH 2/2] tests: added integration tests for next lint --- .../config-in-package-json/package.json | 6 +++ .../config-in-package-json/pages/index.js | 9 ++++ test/integration/eslint/test/index.test.js | 41 +++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 test/integration/eslint/config-in-package-json/package.json create mode 100644 test/integration/eslint/config-in-package-json/pages/index.js diff --git a/test/integration/eslint/config-in-package-json/package.json b/test/integration/eslint/config-in-package-json/package.json new file mode 100644 index 0000000000000..49b10275676d4 --- /dev/null +++ b/test/integration/eslint/config-in-package-json/package.json @@ -0,0 +1,6 @@ +{ + "eslintConfig": { + "extends": "next", + "root": true + } +} diff --git a/test/integration/eslint/config-in-package-json/pages/index.js b/test/integration/eslint/config-in-package-json/pages/index.js new file mode 100644 index 0000000000000..6181acb3d2c35 --- /dev/null +++ b/test/integration/eslint/config-in-package-json/pages/index.js @@ -0,0 +1,9 @@ +export default class Test { + render() { + return ( +
+

Hello title

+
+ ) + } +} diff --git a/test/integration/eslint/test/index.test.js b/test/integration/eslint/test/index.test.js index b76640277f67a..42448f0038799 100644 --- a/test/integration/eslint/test/index.test.js +++ b/test/integration/eslint/test/index.test.js @@ -1,4 +1,6 @@ +import fs from 'fs-extra' import { join } from 'path' +import findUp from 'next/dist/compiled/find-up' import { nextBuild, nextLint } from 'next-test-utils' import { writeFile, readFile } from 'fs-extra' @@ -8,6 +10,7 @@ const dirFirstTimeSetup = join(__dirname, '../first-time-setup') const dirCustomConfig = join(__dirname, '../custom-config') const dirIgnoreDuringBuilds = join(__dirname, '../ignore-during-builds') const dirCustomDirectories = join(__dirname, '../custom-directories') +const dirConfigInPackageJson = join(__dirname, '../config-in-package-json') describe('ESLint', () => { describe('Next Build', () => { @@ -113,5 +116,43 @@ describe('ESLint', () => { const output = stdout + stderr expect(output).toContain('No ESLint warnings or errors') }) + + test("don't create .eslintrc file if package.json has eslintConfig field", async () => { + const eslintrcFile = + (await findUp( + [ + '.eslintrc.js', + '.eslintrc.yaml', + '.eslintrc.yml', + '.eslintrc.json', + '.eslintrc', + ], + { + cwd: '.', + } + )) ?? null + + try { + // If we found a .eslintrc file, it's probably config from root Next.js directory. Rename it during the test + if (eslintrcFile) { + await fs.move(eslintrcFile, `${eslintrcFile}.original`) + } + + const { stdout, stderr } = await nextLint(dirConfigInPackageJson, [], { + stdout: true, + stderr: true, + }) + + const output = stdout + stderr + expect(output).not.toContain( + 'We created the .eslintrc file for you and included the base Next.js ESLint configuration' + ) + } finally { + // Restore original .eslintrc file + if (eslintrcFile) { + await fs.move(`${eslintrcFile}.original`, eslintrcFile) + } + } + }) }) })