UNPKG

11.3 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../../../lib/eslint/runLintCheck.ts"],"names":["lint","deps","baseDir","lintDirs","eslintrcFile","pkgJsonPath","eslintOptions","reportErrorsOnly","mod","resolved","get","ESLint","eslintVersion","version","CLIEngine","semver","lt","chalk","red","options","useEslintrc","baseConfig","extensions","eslint","nextEslintPluginIsEnabled","pagesDirRules","configFile","completeConfig","calculateConfigForFile","plugins","includes","pagesDir","updatedPagesDir","rule","rules","replace","lintStart","process","hrtime","results","lintFiles","fix","outputFixes","getErrorResults","formattedResult","lintEnd","output","isError","length","eventInfo","durationInSeconds","lintedFilesCount","lintFix","nextEslintPluginVersion","require","path","join","dirname","nextEslintPluginErrorsCount","totalNextPluginErrorCount","nextEslintPluginWarningsCount","totalNextPluginWarningCount","runLintCheck","lintDuringBuild","cwd","packageJsonConfig","pkgJsonContent","fs","readFile","encoding","CommentJson","parse","eslintConfig","Log","warn","bold","cyan","err"],"mappings":"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","sourcesContent":["import { promises as fs } from 'fs'\nimport chalk from 'chalk'\nimport path from 'path'\n\nimport findUp from 'next/dist/compiled/find-up'\nimport semver from 'next/dist/compiled/semver'\nimport * as CommentJson from 'next/dist/compiled/comment-json'\n\nimport { formatResults } from './customFormatter'\nimport { writeDefaultConfig } from './writeDefaultConfig'\nimport { existsSync, findPagesDir } from '../find-pages-dir'\nimport {\n hasNecessaryDependencies,\n NecessaryDependencies,\n} from '../has-necessary-dependencies'\n\nimport * as Log from '../../build/output/log'\nimport { EventLintCheckCompleted } from '../../telemetry/events/build'\n\ntype Config = {\n plugins: string[]\n rules: { [key: string]: Array<number | string> }\n}\n\nasync function lint(\n deps: NecessaryDependencies,\n baseDir: string,\n lintDirs: string[],\n eslintrcFile: string | null,\n pkgJsonPath: string | null,\n eslintOptions: any = null,\n reportErrorsOnly: boolean = false\n): Promise<\n | string\n | null\n | {\n output: string | null\n isError: boolean\n eventInfo: EventLintCheckCompleted\n }\n> {\n // Load ESLint after we're sure it exists:\n const mod = await import(deps.resolved.get('eslint')!)\n\n const { ESLint } = mod\n let eslintVersion = ESLint?.version\n\n if (!ESLint) {\n eslintVersion = mod?.CLIEngine?.version\n\n if (!eslintVersion || semver.lt(eslintVersion, '7.0.0')) {\n return `${chalk.red(\n 'error'\n )} - Your project has an older version of ESLint installed${\n eslintVersion ? ' (' + eslintVersion + ')' : ''\n }. Please upgrade to ESLint version 7 or later`\n }\n\n return `${chalk.red(\n 'error'\n )} - ESLint class not found. Please upgrade to ESLint version 7 or later`\n }\n let options: any = {\n useEslintrc: true,\n baseConfig: {},\n extensions: ['.js', '.jsx', '.ts', '.tsx'],\n ...eslintOptions,\n }\n let eslint = new ESLint(options)\n\n let nextEslintPluginIsEnabled = false\n const pagesDirRules = ['@next/next/no-html-link-for-pages']\n\n for (const configFile of [eslintrcFile, pkgJsonPath]) {\n if (!configFile) continue\n\n const completeConfig: Config = await eslint.calculateConfigForFile(\n configFile\n )\n\n if (completeConfig.plugins?.includes('@next/next')) {\n nextEslintPluginIsEnabled = true\n break\n }\n }\n\n const pagesDir = findPagesDir(baseDir)\n\n if (nextEslintPluginIsEnabled) {\n let updatedPagesDir = false\n\n for (const rule of pagesDirRules) {\n if (\n !options.baseConfig!.rules?.[rule] &&\n !options.baseConfig!.rules?.[\n rule.replace('@next/next', '@next/babel-plugin-next')\n ]\n ) {\n if (!options.baseConfig!.rules) {\n options.baseConfig!.rules = {}\n }\n options.baseConfig!.rules[rule] = [1, pagesDir]\n updatedPagesDir = true\n }\n }\n\n if (updatedPagesDir) {\n eslint = new ESLint(options)\n }\n }\n const lintStart = process.hrtime()\n\n let results = await eslint.lintFiles(lintDirs)\n if (options.fix) await ESLint.outputFixes(results)\n if (reportErrorsOnly) results = await ESLint.getErrorResults(results) // Only return errors if --quiet flag is used\n\n const formattedResult = formatResults(baseDir, results)\n const lintEnd = process.hrtime(lintStart)\n\n return {\n output: formattedResult.output,\n isError: ESLint.getErrorResults(results)?.length > 0,\n eventInfo: {\n durationInSeconds: lintEnd[0],\n eslintVersion: eslintVersion,\n lintedFilesCount: results.length,\n lintFix: !!options.fix,\n nextEslintPluginVersion: nextEslintPluginIsEnabled\n ? require(path.join(\n path.dirname(deps.resolved.get('eslint-config-next')!),\n 'package.json'\n )).version\n : null,\n nextEslintPluginErrorsCount: formattedResult.totalNextPluginErrorCount,\n nextEslintPluginWarningsCount:\n formattedResult.totalNextPluginWarningCount,\n },\n }\n}\n\nexport async function runLintCheck(\n baseDir: string,\n lintDirs: string[],\n lintDuringBuild: boolean = false,\n eslintOptions: any = null,\n reportErrorsOnly: boolean = false\n): ReturnType<typeof lint> {\n try {\n // Find user's .eslintrc file\n const eslintrcFile =\n (await findUp(\n [\n '.eslintrc.js',\n '.eslintrc.yaml',\n '.eslintrc.yml',\n '.eslintrc.json',\n '.eslintrc',\n ],\n {\n cwd: baseDir,\n }\n )) ?? null\n\n const pkgJsonPath = (await findUp('package.json', { cwd: baseDir })) ?? null\n let packageJsonConfig = null\n if (pkgJsonPath) {\n const pkgJsonContent = await fs.readFile(pkgJsonPath, {\n encoding: 'utf8',\n })\n packageJsonConfig = CommentJson.parse(pkgJsonContent)\n }\n\n // Warning displayed if no ESLint configuration is present during build\n if (lintDuringBuild && !eslintrcFile && !packageJsonConfig.eslintConfig) {\n Log.warn(\n `No ESLint configuration detected. Run ${chalk.bold.cyan(\n 'next lint'\n )} to begin setup`\n )\n return null\n }\n\n // Ensure ESLint and necessary plugins and configs are installed:\n const deps: NecessaryDependencies = await hasNecessaryDependencies(\n baseDir,\n false,\n true,\n lintDuringBuild\n )\n\n // Write default ESLint config if none is present\n // Check for /pages and src/pages is to make sure this happens in Next.js folder\n if (\n existsSync(path.join(baseDir, 'pages')) ||\n existsSync(path.join(baseDir, 'src/pages'))\n ) {\n await writeDefaultConfig(eslintrcFile, pkgJsonPath, packageJsonConfig)\n }\n\n // Run ESLint\n return await lint(\n deps,\n baseDir,\n lintDirs,\n eslintrcFile,\n pkgJsonPath,\n eslintOptions,\n reportErrorsOnly\n )\n } catch (err) {\n throw err\n }\n}\n"]}
\No newline at end of file