@nx/eslint 0.0.0-pr-30715-a5f5e3b → 0.0.0-pr-31222-862e973

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/migrations.json +98 -119
  4. package/package.json +7 -6
  5. package/src/executors/lint/utility/eslint-utils.js +0 -6
  6. package/src/generators/convert-to-flat-config/converters/json-converter.d.ts +1 -1
  7. package/src/generators/convert-to-flat-config/converters/json-converter.js +18 -10
  8. package/src/generators/convert-to-flat-config/generator.js +17 -18
  9. package/src/generators/convert-to-flat-config/schema.d.ts +0 -2
  10. package/src/generators/convert-to-inferred/convert-to-inferred.js +1 -2
  11. package/src/generators/init/global-eslint-config.d.ts +1 -1
  12. package/src/generators/init/global-eslint-config.js +6 -17
  13. package/src/generators/init/init-migration.d.ts +1 -1
  14. package/src/generators/init/init-migration.js +13 -18
  15. package/src/generators/init/init.d.ts +0 -1
  16. package/src/generators/init/init.js +6 -31
  17. package/src/generators/lint-project/lint-project.d.ts +0 -1
  18. package/src/generators/lint-project/lint-project.js +15 -37
  19. package/src/generators/lint-project/setup-root-eslint.d.ts +0 -1
  20. package/src/generators/lint-project/setup-root-eslint.js +1 -2
  21. package/src/generators/utils/eslint-file.d.ts +2 -3
  22. package/src/generators/utils/eslint-file.js +28 -160
  23. package/src/generators/utils/flat-config/ast-utils.d.ts +4 -12
  24. package/src/generators/utils/flat-config/ast-utils.js +63 -412
  25. package/src/generators/utils/linter.d.ts +0 -3
  26. package/src/generators/utils/linter.js +2 -2
  27. package/src/generators/workspace-rule/files/__name__.spec.ts__tmpl__ +2 -11
  28. package/src/generators/workspace-rule/workspace-rule.d.ts +2 -2
  29. package/src/generators/workspace-rule/workspace-rule.js +3 -11
  30. package/src/generators/workspace-rules-project/workspace-rules-project.js +1 -4
  31. package/src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages.d.ts +2 -0
  32. package/src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages.js +9 -0
  33. package/src/migrations/update-16-8-0-add-ignored-files/update-16-8-0-add-ignored-files.d.ts +2 -0
  34. package/src/migrations/update-16-8-0-add-ignored-files/update-16-8-0-add-ignored-files.js +44 -0
  35. package/src/migrations/update-17-0-0-rename-to-eslint/update-17-0-0-rename-to-eslint.d.ts +2 -0
  36. package/src/migrations/update-17-0-0-rename-to-eslint/update-17-0-0-rename-to-eslint.js +47 -0
  37. package/src/migrations/update-17-1-0/update-typescript-eslint.d.ts +2 -0
  38. package/src/migrations/update-17-1-0/update-typescript-eslint.js +74 -0
  39. package/src/migrations/update-17-2-0/simplify-eslint-patterns.d.ts +2 -0
  40. package/src/migrations/update-17-2-0/simplify-eslint-patterns.js +46 -0
  41. package/src/migrations/update-17-2-9/move-options-to-target-defaults.d.ts +2 -0
  42. package/src/migrations/update-17-2-9/move-options-to-target-defaults.js +107 -0
  43. package/src/plugins/plugin.js +10 -21
  44. package/src/utils/config-file.d.ts +1 -3
  45. package/src/utils/config-file.js +2 -5
  46. package/src/utils/flat-config.d.ts +0 -1
  47. package/src/utils/flat-config.js +3 -9
  48. package/src/utils/version-utils.d.ts +0 -1
  49. package/src/utils/version-utils.js +9 -13
  50. package/src/utils/versions.d.ts +2 -3
  51. package/src/utils/versions.js +3 -4
  52. package/src/migrations/update-20-2-0/update-typescript-eslint-v8-13-0.d.ts +0 -2
  53. package/src/migrations/update-20-2-0/update-typescript-eslint-v8-13-0.js +0 -23
  54. package/src/migrations/update-20-3-0/add-file-extensions-to-overrides.d.ts +0 -2
  55. package/src/migrations/update-20-3-0/add-file-extensions-to-overrides.js +0 -49
@@ -1,6 +1,3 @@
1
- /**
2
- * @deprecated Use LinterType instead. It will be removed in Nx v22.
3
- */
4
1
  export declare enum Linter {
5
2
  EsLint = "eslint",
6
3
  None = "none"
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Linter = void 0;
4
- /**
5
- * @deprecated Use LinterType instead. It will be removed in Nx v22.
4
+ /*
5
+ * @deprecated Use LinterType instead
6
6
  */
7
7
  var Linter;
8
8
  (function (Linter) {
@@ -1,19 +1,10 @@
1
- <% if (flatConfig) { %>import { RuleTester } from '@typescript-eslint/rule-tester';
2
- import type { RuleTesterConfig } from '@typescript-eslint/rule-tester';
3
- import { rule, RULE_NAME } from './<%= name %>';
4
-
5
- const ruleTester = new RuleTester({
6
- languageOptions: {
7
- parser: require('@typescript-eslint/parser'),
8
- },
9
- } as RuleTesterConfig);
10
- <% } else { %>import { TSESLint } from '@typescript-eslint/utils';
1
+ import { TSESLint } from '@typescript-eslint/utils';
11
2
  import { rule, RULE_NAME } from './<%= name %>';
12
3
 
13
4
  const ruleTester = new TSESLint.RuleTester({
14
5
  parser: require.resolve('@typescript-eslint/parser'),
15
6
  });
16
- <% } %>
7
+
17
8
  ruleTester.run(RULE_NAME, rule, {
18
9
  valid: [`const example = true;`],
19
10
  invalid: [],
@@ -1,6 +1,6 @@
1
- import { GeneratorCallback, Tree } from '@nx/devkit';
1
+ import { Tree } from '@nx/devkit';
2
2
  export interface LintWorkspaceRuleGeneratorOptions {
3
3
  name: string;
4
4
  directory: string;
5
5
  }
6
- export declare function lintWorkspaceRuleGenerator(tree: Tree, options: LintWorkspaceRuleGeneratorOptions): Promise<GeneratorCallback>;
6
+ export declare function lintWorkspaceRuleGenerator(tree: Tree, options: LintWorkspaceRuleGeneratorOptions): Promise<import("@nx/devkit").GeneratorCallback>;
@@ -7,27 +7,19 @@ const path_1 = require("path");
7
7
  const ts = require("typescript");
8
8
  const workspace_lint_rules_1 = require("../../utils/workspace-lint-rules");
9
9
  const workspace_rules_project_1 = require("../workspace-rules-project/workspace-rules-project");
10
- const flat_config_1 = require("../../utils/flat-config");
11
- const versions_1 = require("../../utils/versions");
12
10
  async function lintWorkspaceRuleGenerator(tree, options) {
13
- const tasks = [];
14
- const flatConfig = (0, flat_config_1.useFlatConfig)(tree);
15
11
  const nxJson = (0, devkit_1.readNxJson)(tree);
16
12
  // Ensure that the workspace rules project has been created
17
- tasks.push(await (0, workspace_rules_project_1.lintWorkspaceRulesProjectGenerator)(tree, {
13
+ const projectGeneratorCallback = await (0, workspace_rules_project_1.lintWorkspaceRulesProjectGenerator)(tree, {
18
14
  skipFormat: true,
19
15
  addPlugin: process.env.NX_ADD_PLUGINS !== 'false' &&
20
16
  nxJson.useInferencePlugins !== false,
21
- }));
22
- if (flatConfig) {
23
- tasks.push((0, devkit_1.addDependenciesToPackageJson)(tree, {}, { '@typescript-eslint/rule-tester': versions_1.eslint9__typescriptESLintVersion }));
24
- }
17
+ });
25
18
  const ruleDir = (0, devkit_1.joinPathFragments)(workspace_lint_rules_1.workspaceLintPluginDir, options.directory ?? '');
26
19
  // Generate the required files for the new rule
27
20
  (0, devkit_1.generateFiles)(tree, (0, path_1.join)(__dirname, 'files'), ruleDir, {
28
21
  tmpl: '',
29
22
  name: options.name,
30
- flatConfig,
31
23
  });
32
24
  const nameCamelCase = (0, string_utils_1.camelize)(options.name);
33
25
  /**
@@ -81,5 +73,5 @@ async function lintWorkspaceRuleGenerator(tree, options) {
81
73
  "@nx/workspace-${options.name}": "error"
82
74
  }
83
75
  `);
84
- return (0, devkit_1.runTasksInSerial)(...tasks);
76
+ return projectGeneratorCallback;
85
77
  }
@@ -5,7 +5,6 @@ exports.lintWorkspaceRulesProjectGenerator = lintWorkspaceRulesProjectGenerator;
5
5
  const devkit_1 = require("@nx/devkit");
6
6
  const js_1 = require("@nx/js");
7
7
  const add_swc_dependencies_1 = require("@nx/js/src/utils/swc/add-swc-dependencies");
8
- const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup");
9
8
  const path_1 = require("path");
10
9
  const versions_1 = require("../../utils/versions");
11
10
  const workspace_lint_rules_1 = require("../../utils/workspace-lint-rules");
@@ -48,13 +47,11 @@ async function lintWorkspaceRulesProjectGenerator(tree, options = {}) {
48
47
  supportTsx: false,
49
48
  skipSerializers: true,
50
49
  setupFile: 'none',
51
- compiler: (0, ts_solution_setup_1.isUsingTsSolutionSetup)(tree) ? 'swc' : 'tsc',
50
+ compiler: 'tsc',
52
51
  skipFormat: true,
53
- testEnvironment: 'node',
54
52
  }));
55
53
  (0, devkit_1.updateJson)(tree, (0, path_1.join)(workspace_lint_rules_1.workspaceLintPluginDir, 'tsconfig.spec.json'), (json) => {
56
54
  delete json.compilerOptions?.module;
57
- delete json.compilerOptions?.moduleResolution;
58
55
  if (json.include) {
59
56
  json.include = json.include.map((v) => {
60
57
  if (v.startsWith('src/**')) {
@@ -0,0 +1,2 @@
1
+ import { Tree } from '@nx/devkit';
2
+ export default function replacePackage(tree: Tree): Promise<void>;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = replacePackage;
4
+ const devkit_1 = require("@nx/devkit");
5
+ const replace_package_1 = require("@nx/devkit/src/utils/replace-package");
6
+ async function replacePackage(tree) {
7
+ await (0, replace_package_1.replaceNrwlPackageWithNxPackage)(tree, '@nrwl/linter', '@nx/linter');
8
+ await (0, devkit_1.formatFiles)(tree);
9
+ }
@@ -0,0 +1,2 @@
1
+ import { Tree } from '@nx/devkit';
2
+ export default function update(tree: Tree): void;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = update;
4
+ const devkit_1 = require("@nx/devkit");
5
+ const executor_options_utils_1 = require("@nx/devkit/src/generators/executor-options-utils");
6
+ const eslint_file_1 = require("../../generators/utils/eslint-file");
7
+ // Add `ignoredFiles` pattern to projects using vite, esbuild, and rollup.
8
+ // This is needed because the @nx/dependency-checks lint rule will complain
9
+ // about dependencies used in build config files, even though they are not
10
+ // production dependencies.
11
+ function update(tree) {
12
+ const projects = (0, devkit_1.getProjects)(tree);
13
+ const addIgnorePattern = (ignorePattern) => (_options, projectName) => {
14
+ const project = projects.get(projectName);
15
+ if (!(0, eslint_file_1.findEslintFile)(tree, project.root) ||
16
+ !(0, eslint_file_1.isEslintConfigSupported)(tree)) {
17
+ return;
18
+ }
19
+ if ((0, eslint_file_1.lintConfigHasOverride)(tree, project.root, (o) => Array.isArray(o.files)
20
+ ? o.files.some((f) => f.match(/\.json$/))
21
+ : !!o.files?.match(/\.json$/), true)) {
22
+ (0, eslint_file_1.updateOverrideInLintConfig)(tree, project.root, (o) => !!o.rules?.['@nx/dependency-checks'], (o) => {
23
+ const value = o.rules['@nx/dependency-checks'];
24
+ let ruleSeverity;
25
+ let ruleOptions;
26
+ if (Array.isArray(value)) {
27
+ ruleSeverity = value[0];
28
+ ruleOptions = value[1];
29
+ }
30
+ else {
31
+ ruleSeverity = value;
32
+ ruleOptions = {};
33
+ }
34
+ ruleOptions.ignoredFiles = [ignorePattern];
35
+ o.rules['@nx/dependency-checks'] = [ruleSeverity, ruleOptions];
36
+ return o;
37
+ });
38
+ }
39
+ };
40
+ (0, executor_options_utils_1.forEachExecutorOptions)(tree, '@nx/vite:build', addIgnorePattern('{projectRoot}/vite.config.{js,ts,mjs,mts}'));
41
+ (0, executor_options_utils_1.forEachExecutorOptions)(tree, '@nx/vite:test', addIgnorePattern('{projectRoot}/vite.config.{js,ts,mjs,mts}'));
42
+ (0, executor_options_utils_1.forEachExecutorOptions)(tree, '@nx/esbuild:esbuild', addIgnorePattern('{projectRoot}/esbuild.config.{js,ts,mjs,mts}'));
43
+ (0, executor_options_utils_1.forEachExecutorOptions)(tree, '@nx/rollup:rollup', addIgnorePattern('{projectRoot}/rollup.config.{js,ts,mjs,mts}'));
44
+ }
@@ -0,0 +1,2 @@
1
+ import { Tree } from '@nx/devkit';
2
+ export default function replacePackage(tree: Tree): Promise<void>;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = replacePackage;
4
+ const devkit_1 = require("@nx/devkit");
5
+ const replace_package_1 = require("@nx/devkit/src/utils/replace-package");
6
+ async function replacePackage(tree) {
7
+ await (0, replace_package_1.replaceNrwlPackageWithNxPackage)(tree, '@nx/linter', '@nx/eslint');
8
+ // executor name change from :eslint to :lint
9
+ updateNxJsonExecutor(tree);
10
+ updateProjectExecutor(tree);
11
+ await (0, devkit_1.formatFiles)(tree);
12
+ }
13
+ function updateNxJsonExecutor(tree) {
14
+ if (!tree.exists('nx.json')) {
15
+ return;
16
+ }
17
+ const nxJson = (0, devkit_1.readNxJson)(tree);
18
+ let needsUpdate = false;
19
+ for (const [targetName, targetConfig] of Object.entries(nxJson.targetDefaults ?? {})) {
20
+ // this will be in a broken state after the package is globally renamed
21
+ if (targetConfig.executor !== '@nx/eslint:eslint') {
22
+ continue;
23
+ }
24
+ needsUpdate = true;
25
+ nxJson.targetDefaults[targetName].executor = '@nx/eslint:lint';
26
+ }
27
+ if (needsUpdate) {
28
+ (0, devkit_1.updateNxJson)(tree, nxJson);
29
+ }
30
+ }
31
+ function updateProjectExecutor(tree) {
32
+ const projects = (0, devkit_1.getProjects)(tree);
33
+ for (const [projectName, projectConfiguration] of projects) {
34
+ let needsUpdate = false;
35
+ for (const [targetName, targetConfig] of Object.entries(projectConfiguration.targets ?? {})) {
36
+ // this will be in a broken state after the package is globally renamed
37
+ if (targetConfig.executor !== '@nx/eslint:eslint') {
38
+ continue;
39
+ }
40
+ needsUpdate = true;
41
+ projectConfiguration.targets[targetName].executor = '@nx/eslint:lint';
42
+ }
43
+ if (needsUpdate) {
44
+ (0, devkit_1.updateProjectConfiguration)(tree, projectName, projectConfiguration);
45
+ }
46
+ }
47
+ }
@@ -0,0 +1,2 @@
1
+ import { Tree } from '@nx/devkit';
2
+ export default function update(tree: Tree): Promise<void>;
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = update;
4
+ const devkit_1 = require("@nx/devkit");
5
+ const versions_1 = require("../../utils/versions");
6
+ const path_1 = require("path");
7
+ const typescript_1 = require("typescript");
8
+ function updateJestConfig(tree) {
9
+ const jestConfigPath = 'tools/eslint-rules/jest.config.ts';
10
+ if (tree.exists(jestConfigPath)) {
11
+ const { removePropertyFromJestConfig } = (0, devkit_1.ensurePackage)('@nx/jest', versions_1.nxVersion);
12
+ removePropertyFromJestConfig(tree, jestConfigPath, [
13
+ 'moduleNameMapper',
14
+ '@eslint/eslintrc',
15
+ ]);
16
+ }
17
+ }
18
+ function updateTsConfigs(tree) {
19
+ const tsConfigPath = 'tools/eslint-rules/tsconfig.json';
20
+ if (tree.exists(tsConfigPath)) {
21
+ (0, devkit_1.updateJson)(tree, tsConfigPath, (tsConfig) => {
22
+ tsConfig.compilerOptions ??= {};
23
+ tsConfig.compilerOptions.moduleResolution = 'node16';
24
+ tsConfig.compilerOptions.module = 'node16';
25
+ return tsConfig;
26
+ });
27
+ }
28
+ const tsConfigSpec = 'tools/eslint-rules/tsconfig.spec.json';
29
+ if (tree.exists(tsConfigSpec)) {
30
+ (0, devkit_1.updateJson)(tree, tsConfigSpec, (tsConfigSpec) => {
31
+ delete tsConfigSpec.compilerOptions?.module;
32
+ delete tsConfigSpec.compilerOptions?.moduleResolution;
33
+ return tsConfigSpec;
34
+ });
35
+ }
36
+ }
37
+ function updateRecommended(tree) {
38
+ (0, devkit_1.visitNotIgnoredFiles)(tree, 'tools/eslint-rules', (path) => {
39
+ if ((0, path_1.extname)(path) !== '.ts') {
40
+ return;
41
+ }
42
+ const contents = tree.read(path, 'utf-8');
43
+ const sourceFile = (0, typescript_1.createSourceFile)(path, contents, typescript_1.ScriptTarget.ESNext, true);
44
+ const changes = [];
45
+ const visit = (node) => {
46
+ if ((0, typescript_1.isPropertyAssignment)(node) &&
47
+ (0, typescript_1.isIdentifier)(node.name) &&
48
+ node.name.text === 'recommended' &&
49
+ (0, typescript_1.isStringLiteral)(node.initializer)) {
50
+ changes.push({
51
+ type: devkit_1.ChangeType.Delete,
52
+ start: node.initializer.getStart(sourceFile),
53
+ length: node.initializer.getWidth(sourceFile),
54
+ });
55
+ changes.push({
56
+ type: devkit_1.ChangeType.Insert,
57
+ index: node.initializer.getStart(sourceFile),
58
+ text: "'recommended'",
59
+ });
60
+ }
61
+ else {
62
+ (0, typescript_1.forEachChild)(node, visit);
63
+ }
64
+ };
65
+ (0, typescript_1.forEachChild)(sourceFile, visit);
66
+ tree.write(path, (0, devkit_1.applyChangesToString)(contents, changes));
67
+ });
68
+ }
69
+ async function update(tree) {
70
+ updateJestConfig(tree);
71
+ updateTsConfigs(tree);
72
+ updateRecommended(tree);
73
+ await (0, devkit_1.formatFiles)(tree);
74
+ }
@@ -0,0 +1,2 @@
1
+ import { Tree } from '@nx/devkit';
2
+ export default function update(tree: Tree): Promise<void>;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = update;
4
+ const devkit_1 = require("@nx/devkit");
5
+ async function update(tree) {
6
+ const projects = (0, devkit_1.getProjects)(tree);
7
+ for (const [projectName, projectConfiguration] of projects) {
8
+ let needsUpdate = false;
9
+ for (const [targetName, targetConfig] of Object.entries(projectConfiguration.targets ?? {})) {
10
+ if (targetConfig.executor !== '@nx/eslint:lint') {
11
+ continue;
12
+ }
13
+ needsUpdate = true;
14
+ if (projectConfiguration.targets[targetName].options?.lintFilePatterns) {
15
+ const rootPattern = getLintRoot(projectConfiguration);
16
+ const nonRootPatterns = projectConfiguration.targets[targetName].options.lintFilePatterns.filter((p) => !p.startsWith(rootPattern) && !p.startsWith('{projectRoot}'));
17
+ if (nonRootPatterns.length === 0 &&
18
+ rootPattern === projectConfiguration.root) {
19
+ // delete the lintFilePatterns option if it's the only option and matches the root of the project
20
+ delete projectConfiguration.targets[targetName].options
21
+ .lintFilePatterns;
22
+ if (Object.keys(projectConfiguration.targets[targetName].options)
23
+ .length === 0) {
24
+ delete projectConfiguration.targets[targetName].options;
25
+ }
26
+ }
27
+ else {
28
+ projectConfiguration.targets[targetName].options.lintFilePatterns = [
29
+ rootPattern,
30
+ ...nonRootPatterns,
31
+ ];
32
+ }
33
+ }
34
+ }
35
+ if (needsUpdate) {
36
+ (0, devkit_1.updateProjectConfiguration)(tree, projectName, projectConfiguration);
37
+ }
38
+ }
39
+ await (0, devkit_1.formatFiles)(tree);
40
+ }
41
+ function getLintRoot({ root, sourceRoot }) {
42
+ if (root === '' || root === '.') {
43
+ return sourceRoot || './src';
44
+ }
45
+ return root;
46
+ }
@@ -0,0 +1,2 @@
1
+ import { Tree } from '@nx/devkit';
2
+ export default function update(tree: Tree): Promise<void>;
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = update;
4
+ const devkit_1 = require("@nx/devkit");
5
+ const executor_options_utils_1 = require("@nx/devkit/src/generators/executor-options-utils");
6
+ const eslint_file_1 = require("../../generators/utils/eslint-file");
7
+ const project_configuration_utils_1 = require("nx/src/project-graph/utils/project-configuration-utils");
8
+ async function update(tree) {
9
+ const nxJson = (0, devkit_1.readNxJson)(tree);
10
+ // Don't override anything if there are already target defaults for eslint
11
+ if (nxJson.targetDefaults?.['@nx/eslint:lint']) {
12
+ return;
13
+ }
14
+ nxJson.targetDefaults ??= {};
15
+ const graph = await (0, devkit_1.createProjectGraphAsync)();
16
+ const lintTargets = new Set();
17
+ (0, executor_options_utils_1.forEachExecutorOptionsInGraph)(graph, '@nx/eslint:lint', (value, proj, targetName) => {
18
+ lintTargets.add(targetName);
19
+ });
20
+ // Workspace does not use eslint?
21
+ if (lintTargets.size === 0) {
22
+ return;
23
+ }
24
+ const lintDefaults = (nxJson.targetDefaults['@nx/eslint:lint'] = {});
25
+ // All eslint targets have the same name
26
+ if (lintTargets.size === 1) {
27
+ const targetName = Array.from(lintTargets)[0];
28
+ if (nxJson.targetDefaults[targetName]) {
29
+ Object.assign(lintDefaults, nxJson.targetDefaults[targetName]);
30
+ }
31
+ }
32
+ lintDefaults.cache ??= true;
33
+ if (!lintDefaults.inputs) {
34
+ const eslintConfig = (0, eslint_file_1.findEslintFile)(tree);
35
+ lintDefaults.inputs = [
36
+ 'default',
37
+ ...(eslintConfig ? [`{workspaceRoot}/${eslintConfig}`] : []),
38
+ '{workspaceRoot}/tools/eslint-rules/**/*',
39
+ ];
40
+ }
41
+ // Cleanup old target defaults
42
+ const projects = graph.nodes;
43
+ const projectMap = (0, devkit_1.getProjects)(tree);
44
+ for (const [targetDefaultKey, targetDefault] of Object.entries(nxJson.targetDefaults)) {
45
+ if (!isTargetDefaultUsed(targetDefault, nxJson.targetDefaults, projects, projectMap)) {
46
+ delete nxJson.targetDefaults[targetDefaultKey];
47
+ }
48
+ }
49
+ let addOutputs = false;
50
+ (0, executor_options_utils_1.forEachExecutorOptions)(tree, '@nx/eslint:lint', (options, proj, targetName, configuration) => {
51
+ const projConfig = projectMap.get(proj);
52
+ // modify lint file patterns
53
+ if (options.lintFilePatterns) {
54
+ const projectRootRegex = new RegExp(`^${projConfig.root}/`);
55
+ projConfig.targets[targetName].options.lintFilePatterns =
56
+ options.lintFilePatterns
57
+ .filter((filePattern) => filePattern !== '{projectRoot}' &&
58
+ filePattern !== projConfig.root)
59
+ .map((filePattern) => filePattern.replace(projectRootRegex, '{projectRoot}/'));
60
+ // remove lintFilePatterns if empty
61
+ if (projConfig.targets[targetName].options.lintFilePatterns.length === 0) {
62
+ delete projConfig.targets[targetName].options.lintFilePatterns;
63
+ }
64
+ }
65
+ // remove inputs if they are not bringing any new inputs
66
+ if (projConfig.targets[targetName].inputs &&
67
+ projConfig.targets[targetName].inputs.every((i) => lintDefaults.inputs.includes(i))) {
68
+ delete projConfig.targets[targetName].inputs;
69
+ }
70
+ // remove obsolete eslint config definition, unless it's a custom one
71
+ const projectEslintConfig = (0, eslint_file_1.findEslintFile)(tree, projConfig.root);
72
+ if (options.eslintConfig === `${projConfig.root}/${projectEslintConfig}` ||
73
+ options.eslintConfig === `{projectRoot}/${projectEslintConfig}`) {
74
+ delete projConfig.targets[targetName].options.eslintConfig;
75
+ }
76
+ // remove options if empty
77
+ if (Object.keys(projConfig.targets[targetName]?.options ?? {}).length === 0) {
78
+ delete projConfig.targets[targetName].options;
79
+ }
80
+ // track output
81
+ if (options.outputFile) {
82
+ addOutputs = true;
83
+ }
84
+ if (projConfig.targets[targetName].outputs?.length === 1 &&
85
+ projConfig.targets[targetName].outputs[0] === '{options.outputFile}') {
86
+ delete projConfig.targets[targetName].outputs;
87
+ }
88
+ (0, devkit_1.updateProjectConfiguration)(tree, proj, projConfig);
89
+ });
90
+ if (addOutputs) {
91
+ lintDefaults.outputs = ['{options.outputFile}'];
92
+ }
93
+ (0, devkit_1.updateNxJson)(tree, nxJson);
94
+ await (0, devkit_1.formatFiles)(tree);
95
+ }
96
+ function isTargetDefaultUsed(targetDefault, targetDefaults, projects, projectMap) {
97
+ for (const p of Object.values(projects)) {
98
+ for (const targetName in p.data?.targets ?? {}) {
99
+ if ((0, project_configuration_utils_1.readTargetDefaultsForTarget)(targetName, targetDefaults,
100
+ // It might seem like we should use the graph here too but we don't want to pass an executor which was processed in the graph
101
+ projectMap.get(p.name)?.targets?.[targetName]?.executor) === targetDefault) {
102
+ return true;
103
+ }
104
+ }
105
+ }
106
+ return false;
107
+ }
@@ -13,18 +13,7 @@ const semver_1 = require("semver");
13
13
  const config_file_1 = require("../utils/config-file");
14
14
  const resolve_eslint_class_1 = require("../utils/resolve-eslint-class");
15
15
  const pmc = (0, devkit_1.getPackageManagerCommand)();
16
- const DEFAULT_EXTENSIONS = [
17
- 'ts',
18
- 'cts',
19
- 'mts',
20
- 'tsx',
21
- 'js',
22
- 'cjs',
23
- 'mjs',
24
- 'jsx',
25
- 'html',
26
- 'vue',
27
- ];
16
+ const DEFAULT_EXTENSIONS = ['ts', 'tsx', 'js', 'jsx', 'html', 'vue'];
28
17
  const PROJECT_CONFIG_FILENAMES = ['project.json', 'package.json'];
29
18
  const ESLINT_CONFIG_GLOB_V1 = (0, globs_1.combineGlobPatterns)(config_file_1.ESLINT_CONFIG_FILENAMES.map((f) => `**/${f}`));
30
19
  const ESLINT_CONFIG_GLOB_V2 = (0, globs_1.combineGlobPatterns)([
@@ -107,7 +96,7 @@ const internalCreateNodes = async (configFilePath, options, context, projectsCac
107
96
  projects,
108
97
  };
109
98
  };
110
- const internalCreateNodesV2 = async (configFilePath, options, context, projectRootsByEslintRoots, lintableFilesPerProjectRoot, projectsCache, hashByRoot) => {
99
+ const internalCreateNodesV2 = async (configFilePath, options, context, eslintConfigFiles, projectRootsByEslintRoots, lintableFilesPerProjectRoot, projectsCache) => {
111
100
  const configDir = (0, posix_1.dirname)(configFilePath);
112
101
  const ESLint = await (0, resolve_eslint_class_1.resolveESLintClass)({
113
102
  useFlatConfigOverrideVal: (0, config_file_1.isFlatConfig)(configFilePath),
@@ -115,7 +104,12 @@ const internalCreateNodesV2 = async (configFilePath, options, context, projectRo
115
104
  const eslintVersion = ESLint.version;
116
105
  const projects = {};
117
106
  await Promise.all(projectRootsByEslintRoots.get(configDir).map(async (projectRoot) => {
118
- const hash = hashByRoot.get(projectRoot);
107
+ const parentConfigs = eslintConfigFiles.filter((eslintConfig) => isSubDir(projectRoot, (0, posix_1.dirname)(eslintConfig)));
108
+ const hash = await (0, calculate_hash_for_create_nodes_1.calculateHashForCreateNodes)(projectRoot, options, {
109
+ configFiles: eslintConfigFiles,
110
+ nxJsonConfiguration: context.nxJsonConfiguration,
111
+ workspaceRoot: context.workspaceRoot,
112
+ }, [...parentConfigs, (0, posix_1.join)(projectRoot, '.eslintignore')]);
119
113
  if (projectsCache[hash]) {
120
114
  // We can reuse the projects in the cache.
121
115
  Object.assign(projects, projectsCache[hash]);
@@ -160,13 +154,8 @@ exports.createNodesV2 = [
160
154
  const targetsCache = readTargetsCache(cachePath);
161
155
  const { eslintConfigFiles, projectRoots, projectRootsByEslintRoots } = splitConfigFiles(configFiles);
162
156
  const lintableFilesPerProjectRoot = await collectLintableFilesByProjectRoot(projectRoots, options, context);
163
- const hashes = await (0, calculate_hash_for_create_nodes_1.calculateHashesForCreateNodes)(projectRoots, options, context, projectRoots.map((root) => {
164
- const parentConfigs = eslintConfigFiles.filter((eslintConfig) => isSubDir(root, (0, posix_1.dirname)(eslintConfig)));
165
- return [...parentConfigs, (0, posix_1.join)(root, '.eslintignore')];
166
- }));
167
- const hashByRoot = new Map(projectRoots.map((r, i) => [r, hashes[i]]));
168
157
  try {
169
- return await (0, devkit_1.createNodesFromFiles)((configFile, options, context) => internalCreateNodesV2(configFile, options, context, projectRootsByEslintRoots, lintableFilesPerProjectRoot, targetsCache, hashByRoot), eslintConfigFiles, options, context);
158
+ return await (0, devkit_1.createNodesFromFiles)((configFile, options, context) => internalCreateNodesV2(configFile, options, context, eslintConfigFiles, projectRootsByEslintRoots, lintableFilesPerProjectRoot, targetsCache), eslintConfigFiles, options, context);
170
159
  }
171
160
  finally {
172
161
  writeTargetsToCache(cachePath, targetsCache);
@@ -241,7 +230,7 @@ function getRootForDirectory(directory, roots) {
241
230
  function getProjectUsingESLintConfig(configFilePath, projectRoot, eslintVersion, options, context) {
242
231
  const rootEslintConfig = [
243
232
  config_file_1.baseEsLintConfigFile,
244
- ...config_file_1.BASE_ESLINT_CONFIG_FILENAMES,
233
+ config_file_1.baseEsLintFlatConfigFile,
245
234
  ...config_file_1.ESLINT_CONFIG_FILENAMES,
246
235
  ].find((f) => (0, node_fs_1.existsSync)((0, posix_1.join)(context.workspaceRoot, f)));
247
236
  // Add a lint target for each child project without an eslint config, with the root level config as an input
@@ -1,10 +1,8 @@
1
1
  export declare const ESLINT_FLAT_CONFIG_FILENAMES: string[];
2
2
  export declare const ESLINT_OLD_CONFIG_FILENAMES: string[];
3
3
  export declare const ESLINT_CONFIG_FILENAMES: string[];
4
- export declare const BASE_ESLINT_CONFIG_FILENAMES: string[];
5
4
  export declare const baseEsLintConfigFile = ".eslintrc.base.json";
6
- export declare const baseEsLintFlatConfigFile = "eslint.base.config.mjs";
7
- export declare const legacyBaseEsLintFlatConfigFile = "eslint.base.config.js";
5
+ export declare const baseEsLintFlatConfigFile = "eslint.base.config.js";
8
6
  export declare function isFlatConfig(configFilePath: string): boolean;
9
7
  export declare function findFlatConfigFile(directory: string, workspaceRoot: string): string | null;
10
8
  export declare function findOldConfigFile(filePathOrDirectory: string, workspaceRoot: string): string | null;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.legacyBaseEsLintFlatConfigFile = exports.baseEsLintFlatConfigFile = exports.baseEsLintConfigFile = exports.BASE_ESLINT_CONFIG_FILENAMES = exports.ESLINT_CONFIG_FILENAMES = exports.ESLINT_OLD_CONFIG_FILENAMES = exports.ESLINT_FLAT_CONFIG_FILENAMES = void 0;
3
+ exports.baseEsLintFlatConfigFile = exports.baseEsLintConfigFile = exports.ESLINT_CONFIG_FILENAMES = exports.ESLINT_OLD_CONFIG_FILENAMES = exports.ESLINT_FLAT_CONFIG_FILENAMES = void 0;
4
4
  exports.isFlatConfig = isFlatConfig;
5
5
  exports.findFlatConfigFile = findFlatConfigFile;
6
6
  exports.findOldConfigFile = findOldConfigFile;
@@ -20,11 +20,8 @@ exports.ESLINT_CONFIG_FILENAMES = [
20
20
  ...exports.ESLINT_OLD_CONFIG_FILENAMES,
21
21
  ...exports.ESLINT_FLAT_CONFIG_FILENAMES,
22
22
  ];
23
- exports.BASE_ESLINT_CONFIG_FILENAMES = flat_config_1.baseEslintConfigFilenames;
24
23
  exports.baseEsLintConfigFile = '.eslintrc.base.json';
25
- exports.baseEsLintFlatConfigFile = 'eslint.base.config.mjs';
26
- // Make sure we can handle previous file extension as well for migrations or custom generators.
27
- exports.legacyBaseEsLintFlatConfigFile = 'eslint.base.config.js';
24
+ exports.baseEsLintFlatConfigFile = 'eslint.base.config.js';
28
25
  function isFlatConfig(configFilePath) {
29
26
  const configFileName = (0, path_1.basename)(configFilePath);
30
27
  return exports.ESLINT_FLAT_CONFIG_FILENAMES.includes(configFileName);
@@ -1,5 +1,4 @@
1
1
  import { Tree } from '@nx/devkit';
2
2
  export declare const eslintFlatConfigFilenames: string[];
3
- export declare const baseEslintConfigFilenames: string[];
4
3
  export declare function getRootESLintFlatConfigFilename(tree: Tree): string;
5
4
  export declare function useFlatConfig(tree?: Tree): boolean;
@@ -1,19 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.baseEslintConfigFilenames = exports.eslintFlatConfigFilenames = void 0;
3
+ exports.eslintFlatConfigFilenames = void 0;
4
4
  exports.getRootESLintFlatConfigFilename = getRootESLintFlatConfigFilename;
5
5
  exports.useFlatConfig = useFlatConfig;
6
6
  const semver_1 = require("semver");
7
+ // todo: add support for eslint.config.mjs,
7
8
  exports.eslintFlatConfigFilenames = [
8
- 'eslint.config.cjs',
9
9
  'eslint.config.js',
10
- 'eslint.config.mjs',
11
- ];
12
- exports.baseEslintConfigFilenames = [
13
- 'eslint.base.js',
14
- 'eslint.base.config.cjs',
15
- 'eslint.base.config.js',
16
- 'eslint.base.config.mjs',
10
+ 'eslint.config.cjs',
17
11
  ];
18
12
  function getRootESLintFlatConfigFilename(tree) {
19
13
  for (const file of exports.eslintFlatConfigFilenames) {
@@ -1,3 +1,2 @@
1
1
  import { type Tree } from '@nx/devkit';
2
- export declare function getInstalledPackageVersion(pkgName: string, tree?: Tree): string | null;
3
2
  export declare function getInstalledEslintVersion(tree?: Tree): string | null;