@nx/nuxt
Version:
152 lines (151 loc) • 5.89 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.addLinting = addLinting;
const eslint_1 = require("@nx/eslint");
const path_1 = require("nx/src/utils/path");
const devkit_1 = require("@nx/devkit");
const eslint_file_1 = require("@nx/eslint/src/generators/utils/eslint-file");
const versions_1 = require("./versions");
const flat_config_1 = require("@nx/eslint/src/utils/flat-config");
async function addLinting(host, options) {
const tasks = [];
if (options.linter === 'eslint') {
const lintTask = await (0, eslint_1.lintProjectGenerator)(host, {
linter: options.linter,
project: options.projectName,
tsConfigPaths: [(0, path_1.joinPathFragments)(options.projectRoot, 'tsconfig.json')],
unitTestRunner: options.unitTestRunner,
skipFormat: true,
rootProject: options.rootProject,
addPlugin: true,
});
tasks.push(lintTask);
const isFlatConfig = (0, flat_config_1.useFlatConfig)(host);
// Version-aware dependencies:
// - Flat config (v4+): use @nuxt/eslint-config ^1.10.0 with createConfigForNuxt
// - Legacy (.eslintrc.json): use @nuxt/eslint-config ~0.5.6 with extends
const devDependencies = {
'@nuxt/eslint-config': isFlatConfig
? versions_1.nuxtEslintConfigVersion
: versions_1.nuxtEslintConfigLegacyVersion,
};
if ((0, eslint_file_1.isEslintConfigSupported)(host, options.projectRoot)) {
if (isFlatConfig) {
// For flat config: Generate eslint.config.mjs using createConfigForNuxt
generateNuxtFlatEslintConfig(host, options.projectRoot);
}
else {
// For legacy: Use extends with the old @nuxt/eslint-config
editEslintConfigFiles(host, options.projectRoot);
const addExtendsTask = (0, eslint_file_1.addExtendsToLintConfig)(host, options.projectRoot, ['@nuxt/eslint-config'], true);
tasks.push(addExtendsTask);
(0, eslint_file_1.addIgnoresToLintConfig)(host, options.projectRoot, [
'.nuxt/**',
'.output/**',
'node_modules',
]);
}
}
const installTask = (0, devkit_1.addDependenciesToPackageJson)(host, {}, devDependencies);
tasks.push(installTask);
}
return (0, devkit_1.runTasksInSerial)(...tasks);
}
/**
* Generates a flat ESLint config for Nuxt using createConfigForNuxt from @nuxt/eslint-config/flat.
* This is the recommended approach for Nuxt v4+ and ESLint flat config.
*/
function generateNuxtFlatEslintConfig(tree, projectRoot) {
const eslintFile = (0, eslint_file_1.findEslintFile)(tree, projectRoot);
if (!eslintFile)
return;
const configPath = (0, path_1.joinPathFragments)(projectRoot, eslintFile);
const isMjs = eslintFile.endsWith('.mjs');
const isCjs = eslintFile.endsWith('.cjs');
// Determine the relative path to root config
const depth = projectRoot.split('/').filter(Boolean).length;
const rootConfigRelativePath = depth > 0 ? '../'.repeat(depth) : './';
let configContent;
if (isCjs) {
// CJS flat config
configContent = `const { createConfigForNuxt } = require('@nuxt/eslint-config/flat');
${projectRoot !== '.'
? `const baseConfig = require('${rootConfigRelativePath}eslint.config.cjs');\n`
: ''}
module.exports = createConfigForNuxt({
features: {
typescript: true,
},
})${projectRoot !== '.' ? `\n .prepend(...baseConfig)` : ''}
.append(
{
files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx', '**/*.vue'],
rules: {},
},
{
ignores: ['.nuxt/**', '.output/**', 'node_modules'],
}
);
`;
}
else {
// ESM flat config (default)
configContent = `import { createConfigForNuxt } from '@nuxt/eslint-config/flat';
${projectRoot !== '.'
? `import baseConfig from '${rootConfigRelativePath}eslint.config.${isMjs ? 'mjs' : 'js'}';\n`
: ''}
export default createConfigForNuxt({
features: {
typescript: true,
},
})${projectRoot !== '.' ? `\n .prepend(...baseConfig)` : ''}
.append(
{
files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx', '**/*.vue'],
rules: {},
},
{
ignores: ['.nuxt/**', '.output/**', 'node_modules'],
}
);
`;
}
tree.write(configPath, configContent);
}
function editEslintConfigFiles(tree, projectRoot) {
const hasVueFiles = (o) => o.files &&
(Array.isArray(o.files)
? o.files.some((f) => f.endsWith('*.vue'))
: o.files.endsWith('*.vue'));
const addVueFiles = (o) => {
if (!o.files) {
o.files = ['*.vue'];
}
else if (Array.isArray(o.files)) {
o.files.push('*.vue');
}
else {
o.files = [o.files, '*.vue'];
}
};
if ((0, eslint_file_1.lintConfigHasOverride)(tree, projectRoot, (o) => o.parserOptions && !hasVueFiles(o), true)) {
(0, eslint_file_1.updateOverrideInLintConfig)(tree, projectRoot, (o) => !!o.parserOptions, (o) => {
addVueFiles(o);
return o;
});
}
else {
(0, eslint_file_1.replaceOverridesInLintConfig)(tree, projectRoot, [
{
files: ['*.ts', '*.tsx', '*.js', '*.jsx', '*.vue'],
rules: {},
},
]);
}
if ((0, eslint_file_1.lintConfigHasOverride)(tree, '', (o) => o.rules?.['@nx/enforce-module-boundaries'] && !hasVueFiles(o), true)) {
(0, eslint_file_1.updateOverrideInLintConfig)(tree, '', (o) => !!o.rules?.['@nx/enforce-module-boundaries'], (o) => {
addVueFiles(o);
return o;
});
}
}