inital commit

This commit is contained in:
2026-01-01 15:25:19 +05:30
commit f0ae49465a
36361 changed files with 4894111 additions and 0 deletions

View File

@@ -0,0 +1,71 @@
import { bold, cyan, gray, red, yellow } from '../picocolors';
import path from 'path';
// eslint-disable-next-line no-shadow
export var MessageSeverity = /*#__PURE__*/ function(MessageSeverity) {
MessageSeverity[MessageSeverity["Warning"] = 1] = "Warning";
MessageSeverity[MessageSeverity["Error"] = 2] = "Error";
return MessageSeverity;
}({});
function pluginCount(messages) {
let nextPluginWarningCount = 0;
let nextPluginErrorCount = 0;
for(let i = 0; i < messages.length; i++){
const { severity, ruleId } = messages[i];
if (ruleId == null ? void 0 : ruleId.includes('@next/next')) {
if (severity === 1) {
nextPluginWarningCount += 1;
} else {
nextPluginErrorCount += 1;
}
}
}
return {
nextPluginErrorCount,
nextPluginWarningCount
};
}
function formatMessage(dir, messages, filePath) {
let fileName = path.posix.normalize(path.relative(dir, filePath).replace(/\\/g, '/'));
if (!fileName.startsWith('.')) {
fileName = './' + fileName;
}
let output = '\n' + cyan(fileName);
for(let i = 0; i < messages.length; i++){
const { message, severity, line, column, ruleId } = messages[i];
output = output + '\n';
if (line && column) {
output = output + yellow(line.toString()) + ':' + yellow(column.toString()) + ' ';
}
if (severity === 1) {
output += yellow(bold('Warning')) + ': ';
} else {
output += red(bold('Error')) + ': ';
}
output += message;
if (ruleId) {
output += ' ' + gray(bold(ruleId));
}
}
return output;
}
export async function formatResults(baseDir, results, format) {
let totalNextPluginErrorCount = 0;
let totalNextPluginWarningCount = 0;
let resultsWithMessages = results.filter(({ messages })=>messages == null ? void 0 : messages.length);
// Track number of Next.js plugin errors and warnings
resultsWithMessages.forEach(({ messages })=>{
const res = pluginCount(messages);
totalNextPluginErrorCount += res.nextPluginErrorCount;
totalNextPluginWarningCount += res.nextPluginWarningCount;
});
// Use user defined formatter or Next.js's built-in custom formatter
const output = format ? await format(resultsWithMessages) : resultsWithMessages.map(({ messages, filePath })=>formatMessage(baseDir, messages, filePath)).join('\n');
return {
output: output,
outputWithMessages: resultsWithMessages.length > 0 ? output + `\n\n${cyan('info')} - Need to disable some ESLint rules? Learn more here: https://nextjs.org/docs/app/api-reference/config/eslint#disabling-rules` : '',
totalNextPluginErrorCount,
totalNextPluginWarningCount
};
}
//# sourceMappingURL=customFormatter.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,34 @@
import findUp from 'next/dist/compiled/find-up';
export const getESLintStrictValue = async (cwd)=>{
const tsConfigLocation = await findUp('tsconfig.json', {
cwd
});
const hasTSConfig = tsConfigLocation !== undefined;
return {
title: 'Strict',
recommended: true,
config: {
extends: hasTSConfig ? [
'next/core-web-vitals',
'next/typescript'
] : 'next/core-web-vitals'
}
};
};
export const getESLintPromptValues = async (cwd)=>{
return [
await getESLintStrictValue(cwd),
{
title: 'Base',
config: {
extends: 'next'
}
},
{
title: 'Cancel',
config: null
}
];
};
//# sourceMappingURL=getESLintPromptValues.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/lib/eslint/getESLintPromptValues.ts"],"sourcesContent":["import findUp from 'next/dist/compiled/find-up'\n\nexport const getESLintStrictValue = async (cwd: string) => {\n const tsConfigLocation = await findUp('tsconfig.json', { cwd })\n const hasTSConfig = tsConfigLocation !== undefined\n\n return {\n title: 'Strict',\n recommended: true,\n config: {\n extends: hasTSConfig\n ? ['next/core-web-vitals', 'next/typescript']\n : 'next/core-web-vitals',\n },\n }\n}\n\nexport const getESLintPromptValues = async (cwd: string) => {\n return [\n await getESLintStrictValue(cwd),\n {\n title: 'Base',\n config: {\n extends: 'next',\n },\n },\n {\n title: 'Cancel',\n config: null,\n },\n ]\n}\n"],"names":["findUp","getESLintStrictValue","cwd","tsConfigLocation","hasTSConfig","undefined","title","recommended","config","extends","getESLintPromptValues"],"mappings":"AAAA,OAAOA,YAAY,6BAA4B;AAE/C,OAAO,MAAMC,uBAAuB,OAAOC;IACzC,MAAMC,mBAAmB,MAAMH,OAAO,iBAAiB;QAAEE;IAAI;IAC7D,MAAME,cAAcD,qBAAqBE;IAEzC,OAAO;QACLC,OAAO;QACPC,aAAa;QACbC,QAAQ;YACNC,SAASL,cACL;gBAAC;gBAAwB;aAAkB,GAC3C;QACN;IACF;AACF,EAAC;AAED,OAAO,MAAMM,wBAAwB,OAAOR;IAC1C,OAAO;QACL,MAAMD,qBAAqBC;QAC3B;YACEI,OAAO;YACPE,QAAQ;gBACNC,SAAS;YACX;QACF;QACA;YACEH,OAAO;YACPE,QAAQ;QACV;KACD;AACH,EAAC"}

View File

@@ -0,0 +1,27 @@
import { promises as fs } from 'fs';
export async function hasEslintConfiguration(eslintrcFile, packageJsonConfig) {
const configObject = {
exists: false,
emptyEslintrc: false,
emptyPkgJsonConfig: false
};
if (eslintrcFile) {
const content = await fs.readFile(eslintrcFile, {
encoding: 'utf8'
}).then((txt)=>txt.trim().replace(/\n/g, ''), ()=>null);
if (content === '' || content === '{}' || content === '---' || content === 'module.exports = {}') {
configObject.emptyEslintrc = true;
} else {
configObject.exists = true;
}
} else if (packageJsonConfig == null ? void 0 : packageJsonConfig.eslintConfig) {
if (Object.keys(packageJsonConfig.eslintConfig).length) {
configObject.exists = true;
} else {
configObject.emptyPkgJsonConfig = true;
}
}
return configObject;
}
//# sourceMappingURL=hasEslintConfiguration.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/lib/eslint/hasEslintConfiguration.ts"],"sourcesContent":["import { promises as fs } from 'fs'\n\nexport type ConfigAvailable = {\n exists: boolean\n emptyEslintrc?: boolean\n emptyPkgJsonConfig?: boolean\n firstTimeSetup?: true\n}\n\nexport async function hasEslintConfiguration(\n eslintrcFile: string | null,\n packageJsonConfig: { eslintConfig: any } | null\n): Promise<ConfigAvailable> {\n const configObject = {\n exists: false,\n emptyEslintrc: false,\n emptyPkgJsonConfig: false,\n }\n\n if (eslintrcFile) {\n const content = await fs.readFile(eslintrcFile, { encoding: 'utf8' }).then(\n (txt) => txt.trim().replace(/\\n/g, ''),\n () => null\n )\n\n if (\n content === '' ||\n content === '{}' ||\n content === '---' ||\n content === 'module.exports = {}'\n ) {\n configObject.emptyEslintrc = true\n } else {\n configObject.exists = true\n }\n } else if (packageJsonConfig?.eslintConfig) {\n if (Object.keys(packageJsonConfig.eslintConfig).length) {\n configObject.exists = true\n } else {\n configObject.emptyPkgJsonConfig = true\n }\n }\n return configObject\n}\n"],"names":["promises","fs","hasEslintConfiguration","eslintrcFile","packageJsonConfig","configObject","exists","emptyEslintrc","emptyPkgJsonConfig","content","readFile","encoding","then","txt","trim","replace","eslintConfig","Object","keys","length"],"mappings":"AAAA,SAASA,YAAYC,EAAE,QAAQ,KAAI;AASnC,OAAO,eAAeC,uBACpBC,YAA2B,EAC3BC,iBAA+C;IAE/C,MAAMC,eAAe;QACnBC,QAAQ;QACRC,eAAe;QACfC,oBAAoB;IACtB;IAEA,IAAIL,cAAc;QAChB,MAAMM,UAAU,MAAMR,GAAGS,QAAQ,CAACP,cAAc;YAAEQ,UAAU;QAAO,GAAGC,IAAI,CACxE,CAACC,MAAQA,IAAIC,IAAI,GAAGC,OAAO,CAAC,OAAO,KACnC,IAAM;QAGR,IACEN,YAAY,MACZA,YAAY,QACZA,YAAY,SACZA,YAAY,uBACZ;YACAJ,aAAaE,aAAa,GAAG;QAC/B,OAAO;YACLF,aAAaC,MAAM,GAAG;QACxB;IACF,OAAO,IAAIF,qCAAAA,kBAAmBY,YAAY,EAAE;QAC1C,IAAIC,OAAOC,IAAI,CAACd,kBAAkBY,YAAY,EAAEG,MAAM,EAAE;YACtDd,aAAaC,MAAM,GAAG;QACxB,OAAO;YACLD,aAAaG,kBAAkB,GAAG;QACpC;IACF;IACA,OAAOH;AACT"}

304
node_modules/next/dist/esm/lib/eslint/runLintCheck.js generated vendored Normal file
View File

@@ -0,0 +1,304 @@
import { promises as fs, existsSync } from 'fs';
import { bold, cyan, red, underline, yellow } from '../picocolors';
import path from 'path';
import findUp from 'next/dist/compiled/find-up';
import semver from 'next/dist/compiled/semver';
import * as CommentJson from 'next/dist/compiled/comment-json';
import { formatResults } from './customFormatter';
import { writeDefaultConfig } from './writeDefaultConfig';
import { hasEslintConfiguration } from './hasEslintConfiguration';
import { writeOutputFile } from './writeOutputFile';
import { findPagesDir } from '../find-pages-dir';
import { installDependencies } from '../install-dependencies';
import { hasNecessaryDependencies } from '../has-necessary-dependencies';
import * as Log from '../../build/output/log';
import isError, { getProperError } from '../is-error';
import { getPkgManager } from '../helpers/get-pkg-manager';
import { getESLintStrictValue, getESLintPromptValues } from './getESLintPromptValues';
// 0 is off, 1 is warn, 2 is error. See https://eslint.org/docs/user-guide/configuring/rules#configuring-rules
const VALID_SEVERITY = [
'off',
'warn',
'error'
];
function isValidSeverity(severity) {
return VALID_SEVERITY.includes(severity);
}
const requiredPackages = [
{
file: 'eslint',
pkg: 'eslint',
exportsRestrict: false
},
{
file: 'eslint-config-next',
pkg: 'eslint-config-next',
exportsRestrict: false
}
];
async function cliPrompt(cwd) {
console.log(bold(`${cyan('?')} How would you like to configure ESLint? https://nextjs.org/docs/app/api-reference/config/eslint`));
try {
const cliSelect = (await Promise.resolve(require('next/dist/compiled/cli-select'))).default;
const { value } = await cliSelect({
values: await getESLintPromptValues(cwd),
valueRenderer: ({ title, recommended }, selected)=>{
const name = selected ? bold(underline(cyan(title))) : title;
return name + (recommended ? bold(yellow(' (recommended)')) : '');
},
selected: cyan(' '),
unselected: ' '
});
return {
config: (value == null ? void 0 : value.config) ?? null
};
} catch {
return {
config: null
};
}
}
async function lint(baseDir, lintDirs, eslintrcFile, pkgJsonPath, { lintDuringBuild = false, eslintOptions = null, reportErrorsOnly = false, maxWarnings = -1, formatter = null, outputFile = null }) {
try {
var _mod_CLIEngine, _ESLint_getErrorResults;
// Load ESLint after we're sure it exists:
const deps = await hasNecessaryDependencies(baseDir, requiredPackages);
const packageManager = getPkgManager(baseDir);
if (deps.missing.some((dep)=>dep.pkg === 'eslint')) {
Log.error(`ESLint must be installed${lintDuringBuild ? ' in order to run during builds:' : ':'} ${bold(cyan((packageManager === 'yarn' ? 'yarn add --dev' : packageManager === 'pnpm' ? 'pnpm install --save-dev' : 'npm install --save-dev') + ' eslint'))}`);
return null;
}
const mod = await Promise.resolve(require(deps.resolved.get('eslint')));
// If V9 config was found, use flat config, or else use legacy.
const useFlatConfig = eslintrcFile ? path.basename(eslintrcFile).startsWith('eslint.config.') : false;
let ESLint;
// loadESLint is >= 8.57.0
// PR https://github.com/eslint/eslint/pull/18098
// Release https://github.com/eslint/eslint/releases/tag/v8.57.0
if ('loadESLint' in mod) {
// By default, configType is `flat`. If `useFlatConfig` is false, the return value is `LegacyESLint`.
// https://github.com/eslint/eslint/blob/1def4cdfab1f067c5089df8b36242cdf912b0eb6/lib/types/index.d.ts#L1609-L1613
ESLint = await mod.loadESLint({
useFlatConfig
});
} else {
// eslint < 8.57.0, use legacy ESLint
ESLint = mod.ESLint;
}
let eslintVersion = (ESLint == null ? void 0 : ESLint.version) ?? ((_mod_CLIEngine = mod.CLIEngine) == null ? void 0 : _mod_CLIEngine.version);
if (!eslintVersion || semver.lt(eslintVersion, '7.0.0')) {
return `${red('error')} - Your project has an older version of ESLint installed${eslintVersion ? ' (' + eslintVersion + ')' : ''}. Please upgrade to ESLint version 7 or above`;
}
let options = {
useEslintrc: true,
baseConfig: {},
errorOnUnmatchedPattern: false,
extensions: [
'.js',
'.jsx',
'.ts',
'.tsx'
],
cache: true,
...eslintOptions
};
if (semver.gte(eslintVersion, '9.0.0') && useFlatConfig) {
for (const option of [
'useEslintrc',
'extensions',
'ignorePath',
'reportUnusedDisableDirectives',
'resolvePluginsRelativeTo',
'rulePaths',
'inlineConfig',
'maxWarnings'
]){
if (option in options) {
delete options[option];
}
}
}
let eslint = new ESLint(options);
let nextEslintPluginIsEnabled = false;
const nextRulesEnabled = new Map();
for (const configFile of [
eslintrcFile,
pkgJsonPath
]){
if (!configFile) continue;
const completeConfig = await eslint.calculateConfigForFile(configFile);
if (!completeConfig) continue;
const plugins = completeConfig.plugins;
const hasNextPlugin = // in ESLint < 9, `plugins` value is string[]
Array.isArray(plugins) ? plugins.includes('@next/next') : '@next/next' in plugins;
if (hasNextPlugin) {
nextEslintPluginIsEnabled = true;
for (const [name, [severity]] of Object.entries(completeConfig.rules)){
if (!name.startsWith('@next/next/')) {
continue;
}
if (typeof severity === 'number' && severity >= 0 && severity < VALID_SEVERITY.length) {
nextRulesEnabled.set(name, VALID_SEVERITY[severity]);
} else if (typeof severity === 'string' && isValidSeverity(severity)) {
nextRulesEnabled.set(name, severity);
}
}
break;
}
}
const pagesDir = findPagesDir(baseDir).pagesDir;
const pagesDirRules = pagesDir ? [
'@next/next/no-html-link-for-pages'
] : [];
if (nextEslintPluginIsEnabled) {
let updatedPagesDir = false;
for (const rule of pagesDirRules){
var _options_baseConfig_rules, _options_baseConfig_rules1;
if (!((_options_baseConfig_rules = options.baseConfig.rules) == null ? void 0 : _options_baseConfig_rules[rule]) && !((_options_baseConfig_rules1 = options.baseConfig.rules) == null ? void 0 : _options_baseConfig_rules1[rule.replace('@next/next', '@next/babel-plugin-next')])) {
if (!options.baseConfig.rules) {
options.baseConfig.rules = {};
}
options.baseConfig.rules[rule] = [
1,
pagesDir
];
updatedPagesDir = true;
}
}
if (updatedPagesDir) {
eslint = new ESLint(options);
}
} else {
Log.warn('');
Log.warn('The Next.js plugin was not detected in your ESLint configuration. See https://nextjs.org/docs/app/api-reference/config/eslint#migrating-existing-config');
}
const lintStart = process.hrtime();
let results = await eslint.lintFiles(lintDirs);
let selectedFormatter = null;
if (options.fix) await ESLint.outputFixes(results);
if (reportErrorsOnly) results = await ESLint.getErrorResults(results) // Only return errors if --quiet flag is used
;
if (formatter) selectedFormatter = await eslint.loadFormatter(formatter);
const formattedResult = await formatResults(baseDir, results, selectedFormatter == null ? void 0 : selectedFormatter.format);
const lintEnd = process.hrtime(lintStart);
const totalWarnings = results.reduce((sum, file)=>sum + file.warningCount, 0);
if (outputFile) await writeOutputFile(outputFile, formattedResult.output);
return {
output: formattedResult.outputWithMessages,
isError: ((_ESLint_getErrorResults = ESLint.getErrorResults(results)) == null ? void 0 : _ESLint_getErrorResults.length) > 0 || maxWarnings >= 0 && totalWarnings > maxWarnings,
eventInfo: {
durationInSeconds: lintEnd[0],
eslintVersion: eslintVersion,
lintedFilesCount: results.length,
lintFix: !!options.fix,
nextEslintPluginVersion: nextEslintPluginIsEnabled && deps.resolved.has('eslint-config-next') ? require(path.join(path.dirname(deps.resolved.get('eslint-config-next')), 'package.json')).version : null,
nextEslintPluginErrorsCount: formattedResult.totalNextPluginErrorCount,
nextEslintPluginWarningsCount: formattedResult.totalNextPluginWarningCount,
nextRulesEnabled: Object.fromEntries(nextRulesEnabled)
}
};
} catch (err) {
if (lintDuringBuild) {
Log.error(`ESLint: ${isError(err) && err.message ? err.message.replace(/\n/g, ' ') : err}`);
return null;
} else {
throw getProperError(err);
}
}
}
export async function runLintCheck(baseDir, lintDirs, opts) {
const { lintDuringBuild = false, eslintOptions = null, reportErrorsOnly = false, maxWarnings = -1, formatter = null, outputFile = null, strict = false } = opts;
try {
// Find user's .eslintrc file
// See: https://eslint.org/docs/user-guide/configuring/configuration-files#configuration-file-formats
const eslintrcFile = await findUp([
// eslint v9
'eslint.config.js',
'eslint.config.mjs',
'eslint.config.cjs',
// TS extensions require to install a separate package `jiti`.
// https://eslint.org/docs/latest/use/configure/configuration-files#typescript-configuration-files
'eslint.config.ts',
'eslint.config.mts',
'eslint.config.cts',
// eslint <= v8
'.eslintrc.js',
'.eslintrc.cjs',
'.eslintrc.yaml',
'.eslintrc.yml',
'.eslintrc.json',
'.eslintrc'
], {
cwd: baseDir
}) ?? null;
const pkgJsonPath = await findUp('package.json', {
cwd: baseDir
}) ?? null;
let packageJsonConfig = null;
if (pkgJsonPath) {
const pkgJsonContent = await fs.readFile(pkgJsonPath, {
encoding: 'utf8'
});
packageJsonConfig = CommentJson.parse(pkgJsonContent);
}
const config = await hasEslintConfiguration(eslintrcFile, packageJsonConfig);
let deps;
if (config.exists) {
// Run if ESLint config exists
return await lint(baseDir, lintDirs, eslintrcFile, pkgJsonPath, {
lintDuringBuild,
eslintOptions,
reportErrorsOnly,
maxWarnings,
formatter,
outputFile
});
} else {
// Display warning if no ESLint configuration is present inside
// config file during "next build", no warning is shown when
// no eslintrc file is present
if (lintDuringBuild) {
if (config.emptyPkgJsonConfig || config.emptyEslintrc) {
Log.warn(`No ESLint configuration detected. Run ${bold(cyan('next lint'))} to begin setup`);
}
return null;
} else {
// Ask user what config they would like to start with for first time "next lint" setup
const { config: selectedConfig } = strict ? await getESLintStrictValue(baseDir) : await cliPrompt(baseDir);
if (selectedConfig == null) {
// Show a warning if no option is selected in prompt
Log.warn('If you set up ESLint yourself, we recommend adding the Next.js ESLint plugin. See https://nextjs.org/docs/app/api-reference/config/eslint#migrating-existing-config');
return null;
} else {
// Check if necessary deps installed, and install any that are missing
deps = await hasNecessaryDependencies(baseDir, requiredPackages);
if (deps.missing.length > 0) {
deps.missing.forEach((dep)=>{
if (dep.pkg === 'eslint') {
// pin to v9 to avoid breaking changes
dep.pkg = 'eslint@^9';
}
});
await installDependencies(baseDir, deps.missing, true);
}
// Write default ESLint config.
// Check for /pages and src/pages is to make sure this happens in Next.js folder
if ([
'app',
'src/app',
'pages',
'src/pages'
].some((dir)=>existsSync(path.join(baseDir, dir)))) {
await writeDefaultConfig(baseDir, config, selectedConfig, eslintrcFile, pkgJsonPath, packageJsonConfig);
}
}
Log.ready(`ESLint has successfully been configured. Run ${bold(cyan('next lint'))} again to view warnings and errors.`);
return null;
}
}
} catch (err) {
throw err;
}
}
//# sourceMappingURL=runLintCheck.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,31 @@
import { promises as fs } from 'fs';
import { bold, green } from '../picocolors';
import os from 'os';
import path from 'path';
import * as CommentJson from 'next/dist/compiled/comment-json';
import * as Log from '../../build/output/log';
export async function writeDefaultConfig(baseDir, { exists, emptyEslintrc, emptyPkgJsonConfig }, selectedConfig, eslintrcFile, pkgJsonPath, packageJsonConfig) {
if (!exists && emptyEslintrc && eslintrcFile) {
const ext = path.extname(eslintrcFile);
let newFileContent;
if (ext === '.yaml' || ext === '.yml') {
newFileContent = "extends: 'next'";
} else {
newFileContent = CommentJson.stringify(selectedConfig, null, 2);
if (ext === '.js') {
newFileContent = 'module.exports = ' + newFileContent;
}
}
await fs.writeFile(eslintrcFile, newFileContent + os.EOL);
Log.info(`We detected an empty ESLint configuration file (${bold(path.basename(eslintrcFile))}) and updated it for you!`);
} else if (!exists && emptyPkgJsonConfig && packageJsonConfig) {
packageJsonConfig.eslintConfig = selectedConfig;
if (pkgJsonPath) await fs.writeFile(pkgJsonPath, CommentJson.stringify(packageJsonConfig, null, 2) + os.EOL);
Log.info(`We detected an empty ${bold('eslintConfig')} field in package.json and updated it for you!`);
} else if (!exists) {
await fs.writeFile(path.join(baseDir, '.eslintrc.json'), CommentJson.stringify(selectedConfig, null, 2) + os.EOL);
console.log(green(`We created the ${bold('.eslintrc.json')} file for you and included your selected configuration.`));
}
}
//# sourceMappingURL=writeDefaultConfig.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/lib/eslint/writeDefaultConfig.ts"],"sourcesContent":["import { promises as fs } from 'fs'\nimport { bold, green } from '../picocolors'\nimport os from 'os'\nimport path from 'path'\nimport * as CommentJson from 'next/dist/compiled/comment-json'\nimport type { ConfigAvailable } from './hasEslintConfiguration'\n\nimport * as Log from '../../build/output/log'\n\nexport async function writeDefaultConfig(\n baseDir: string,\n { exists, emptyEslintrc, emptyPkgJsonConfig }: ConfigAvailable,\n selectedConfig: any,\n eslintrcFile: string | null,\n pkgJsonPath: string | null,\n packageJsonConfig: { eslintConfig: any } | null\n) {\n if (!exists && emptyEslintrc && eslintrcFile) {\n const ext = path.extname(eslintrcFile)\n\n let newFileContent\n if (ext === '.yaml' || ext === '.yml') {\n newFileContent = \"extends: 'next'\"\n } else {\n newFileContent = CommentJson.stringify(selectedConfig, null, 2)\n\n if (ext === '.js') {\n newFileContent = 'module.exports = ' + newFileContent\n }\n }\n\n await fs.writeFile(eslintrcFile, newFileContent + os.EOL)\n\n Log.info(\n `We detected an empty ESLint configuration file (${bold(\n path.basename(eslintrcFile)\n )}) and updated it for you!`\n )\n } else if (!exists && emptyPkgJsonConfig && packageJsonConfig) {\n packageJsonConfig.eslintConfig = selectedConfig\n\n if (pkgJsonPath)\n await fs.writeFile(\n pkgJsonPath,\n CommentJson.stringify(packageJsonConfig, null, 2) + os.EOL\n )\n\n Log.info(\n `We detected an empty ${bold(\n 'eslintConfig'\n )} field in package.json and updated it for you!`\n )\n } else if (!exists) {\n await fs.writeFile(\n path.join(baseDir, '.eslintrc.json'),\n CommentJson.stringify(selectedConfig, null, 2) + os.EOL\n )\n\n console.log(\n green(\n `We created the ${bold(\n '.eslintrc.json'\n )} file for you and included your selected configuration.`\n )\n )\n }\n}\n"],"names":["promises","fs","bold","green","os","path","CommentJson","Log","writeDefaultConfig","baseDir","exists","emptyEslintrc","emptyPkgJsonConfig","selectedConfig","eslintrcFile","pkgJsonPath","packageJsonConfig","ext","extname","newFileContent","stringify","writeFile","EOL","info","basename","eslintConfig","join","console","log"],"mappings":"AAAA,SAASA,YAAYC,EAAE,QAAQ,KAAI;AACnC,SAASC,IAAI,EAAEC,KAAK,QAAQ,gBAAe;AAC3C,OAAOC,QAAQ,KAAI;AACnB,OAAOC,UAAU,OAAM;AACvB,YAAYC,iBAAiB,kCAAiC;AAG9D,YAAYC,SAAS,yBAAwB;AAE7C,OAAO,eAAeC,mBACpBC,OAAe,EACf,EAAEC,MAAM,EAAEC,aAAa,EAAEC,kBAAkB,EAAmB,EAC9DC,cAAmB,EACnBC,YAA2B,EAC3BC,WAA0B,EAC1BC,iBAA+C;IAE/C,IAAI,CAACN,UAAUC,iBAAiBG,cAAc;QAC5C,MAAMG,MAAMZ,KAAKa,OAAO,CAACJ;QAEzB,IAAIK;QACJ,IAAIF,QAAQ,WAAWA,QAAQ,QAAQ;YACrCE,iBAAiB;QACnB,OAAO;YACLA,iBAAiBb,YAAYc,SAAS,CAACP,gBAAgB,MAAM;YAE7D,IAAII,QAAQ,OAAO;gBACjBE,iBAAiB,sBAAsBA;YACzC;QACF;QAEA,MAAMlB,GAAGoB,SAAS,CAACP,cAAcK,iBAAiBf,GAAGkB,GAAG;QAExDf,IAAIgB,IAAI,CACN,CAAC,gDAAgD,EAAErB,KACjDG,KAAKmB,QAAQ,CAACV,eACd,yBAAyB,CAAC;IAEhC,OAAO,IAAI,CAACJ,UAAUE,sBAAsBI,mBAAmB;QAC7DA,kBAAkBS,YAAY,GAAGZ;QAEjC,IAAIE,aACF,MAAMd,GAAGoB,SAAS,CAChBN,aACAT,YAAYc,SAAS,CAACJ,mBAAmB,MAAM,KAAKZ,GAAGkB,GAAG;QAG9Df,IAAIgB,IAAI,CACN,CAAC,qBAAqB,EAAErB,KACtB,gBACA,8CAA8C,CAAC;IAErD,OAAO,IAAI,CAACQ,QAAQ;QAClB,MAAMT,GAAGoB,SAAS,CAChBhB,KAAKqB,IAAI,CAACjB,SAAS,mBACnBH,YAAYc,SAAS,CAACP,gBAAgB,MAAM,KAAKT,GAAGkB,GAAG;QAGzDK,QAAQC,GAAG,CACTzB,MACE,CAAC,eAAe,EAAED,KAChB,kBACA,uDAAuD,CAAC;IAGhE;AACF"}

View File

@@ -0,0 +1,36 @@
import { promises as fs } from 'fs';
import path from 'path';
import * as Log from '../../build/output/log';
import isError from '../../lib/is-error';
/**
* Check if a given file path is a directory or not.
* Returns `true` if the path is a directory.
*/ function isDirectory(/** The path to a file to check. */ filePath) {
return fs.stat(filePath).then((stat)=>stat.isDirectory()).catch((error)=>{
if (isError(error) && (error.code === 'ENOENT' || error.code === 'ENOTDIR')) {
return false;
}
throw error;
});
}
/**
* Create a file with eslint output data
*/ export async function writeOutputFile(/** The name file that needs to be created */ outputFile, /** The data that needs to be inserted into the file */ outputData) {
const filePath = path.resolve(process.cwd(), outputFile);
if (await isDirectory(filePath)) {
Log.error(`Cannot write to output file path, it is a directory: ${filePath}`);
} else {
try {
await fs.mkdir(path.dirname(filePath), {
recursive: true
});
await fs.writeFile(filePath, outputData);
Log.info(`The output file has been created: ${filePath}`);
} catch (err) {
Log.error(`There was a problem writing the output file: ${filePath}`);
console.error(err);
}
}
}
//# sourceMappingURL=writeOutputFile.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/lib/eslint/writeOutputFile.ts"],"sourcesContent":["import { promises as fs } from 'fs'\nimport path from 'path'\nimport * as Log from '../../build/output/log'\nimport isError from '../../lib/is-error'\n\n/**\n * Check if a given file path is a directory or not.\n * Returns `true` if the path is a directory.\n */\nfunction isDirectory(\n /** The path to a file to check. */\n filePath: string\n): Promise<boolean> {\n return fs\n .stat(filePath)\n .then((stat) => stat.isDirectory())\n .catch((error) => {\n if (\n isError(error) &&\n (error.code === 'ENOENT' || error.code === 'ENOTDIR')\n ) {\n return false\n }\n throw error\n })\n}\n/**\n * Create a file with eslint output data\n */\nexport async function writeOutputFile(\n /** The name file that needs to be created */\n outputFile: string,\n /** The data that needs to be inserted into the file */\n outputData: string\n): Promise<void> {\n const filePath = path.resolve(process.cwd(), outputFile)\n\n if (await isDirectory(filePath)) {\n Log.error(\n `Cannot write to output file path, it is a directory: ${filePath}`\n )\n } else {\n try {\n await fs.mkdir(path.dirname(filePath), { recursive: true })\n await fs.writeFile(filePath, outputData)\n Log.info(`The output file has been created: ${filePath}`)\n } catch (err) {\n Log.error(`There was a problem writing the output file: ${filePath}`)\n console.error(err)\n }\n }\n}\n"],"names":["promises","fs","path","Log","isError","isDirectory","filePath","stat","then","catch","error","code","writeOutputFile","outputFile","outputData","resolve","process","cwd","mkdir","dirname","recursive","writeFile","info","err","console"],"mappings":"AAAA,SAASA,YAAYC,EAAE,QAAQ,KAAI;AACnC,OAAOC,UAAU,OAAM;AACvB,YAAYC,SAAS,yBAAwB;AAC7C,OAAOC,aAAa,qBAAoB;AAExC;;;CAGC,GACD,SAASC,YACP,kCAAkC,GAClCC,QAAgB;IAEhB,OAAOL,GACJM,IAAI,CAACD,UACLE,IAAI,CAAC,CAACD,OAASA,KAAKF,WAAW,IAC/BI,KAAK,CAAC,CAACC;QACN,IACEN,QAAQM,UACPA,CAAAA,MAAMC,IAAI,KAAK,YAAYD,MAAMC,IAAI,KAAK,SAAQ,GACnD;YACA,OAAO;QACT;QACA,MAAMD;IACR;AACJ;AACA;;CAEC,GACD,OAAO,eAAeE,gBACpB,2CAA2C,GAC3CC,UAAkB,EAClB,qDAAqD,GACrDC,UAAkB;IAElB,MAAMR,WAAWJ,KAAKa,OAAO,CAACC,QAAQC,GAAG,IAAIJ;IAE7C,IAAI,MAAMR,YAAYC,WAAW;QAC/BH,IAAIO,KAAK,CACP,CAAC,qDAAqD,EAAEJ,UAAU;IAEtE,OAAO;QACL,IAAI;YACF,MAAML,GAAGiB,KAAK,CAAChB,KAAKiB,OAAO,CAACb,WAAW;gBAAEc,WAAW;YAAK;YACzD,MAAMnB,GAAGoB,SAAS,CAACf,UAAUQ;YAC7BX,IAAImB,IAAI,CAAC,CAAC,kCAAkC,EAAEhB,UAAU;QAC1D,EAAE,OAAOiB,KAAK;YACZpB,IAAIO,KAAK,CAAC,CAAC,6CAA6C,EAAEJ,UAAU;YACpEkB,QAAQd,KAAK,CAACa;QAChB;IACF;AACF"}