UNPKG

@nx/nuxt

Version:

The Nuxt plugin for Nx contains executors and generators for managing Nuxt applications and libraries within an Nx workspace. It provides: - Integration with libraries such as Vitest, Playwright, Cypress, and Storybook. - Generators for applications, l

152 lines (151 loc) 5.89 kB
"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; }); } }