@nx/eslint 22.6.0 → 22.6.2

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nx/eslint",
3
- "version": "22.6.0",
3
+ "version": "22.6.2",
4
4
  "private": false,
5
5
  "description": "The ESLint plugin for Nx contains executors, generators and utilities used for linting JavaScript/TypeScript projects within an Nx workspace.",
6
6
  "repository": {
@@ -35,14 +35,14 @@
35
35
  "eslint": "^8.0.0 || ^9.0.0 || ^10.0.0"
36
36
  },
37
37
  "dependencies": {
38
- "@nx/devkit": "22.6.0",
39
- "@nx/js": "22.6.0",
38
+ "@nx/devkit": "22.6.2",
39
+ "@nx/js": "22.6.2",
40
40
  "semver": "^7.6.3",
41
41
  "tslib": "^2.3.0",
42
42
  "typescript": "~5.9.2"
43
43
  },
44
44
  "devDependencies": {
45
- "nx": "22.6.0"
45
+ "nx": "22.6.2"
46
46
  },
47
47
  "peerDependenciesMeta": {
48
48
  "@zkochan/js-yaml": {
@@ -1 +1 @@
1
- {"version":3,"file":"json-converter.d.ts","sourceRoot":"","sources":["../../../../../../../packages/eslint/src/generators/convert-to-flat-config/converters/json-converter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAS,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAchC;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,UAAU,EACzB,WAAW,EAAE,MAAM,EAAE,EACrB,MAAM,EAAE,KAAK,GAAG,KAAK,GACpB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAuLjE"}
1
+ {"version":3,"file":"json-converter.d.ts","sourceRoot":"","sources":["../../../../../../../packages/eslint/src/generators/convert-to-flat-config/converters/json-converter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAS,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAehC;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,UAAU,EACzB,WAAW,EAAE,MAAM,EAAE,EACrB,MAAM,EAAE,KAAK,GAAG,KAAK,GACpB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CA8OjE"}
@@ -68,6 +68,47 @@ function convertEslintJsonToFlatConfig(tree, root, config, ignorePaths, format)
68
68
  }
69
69
  if (config.overrides) {
70
70
  config.overrides.forEach((override) => {
71
+ if (override.extends) {
72
+ const extendsArr = Array.isArray(override.extends)
73
+ ? override.extends
74
+ : [override.extends];
75
+ const mapped = extendsArr.map((e) => ({
76
+ original: e,
77
+ flatConfig: mapNxPluginToFlatConfig(e),
78
+ }));
79
+ const nxExtends = mapped.filter((m) => m.flatConfig);
80
+ const nonNxExtends = mapped
81
+ .filter((m) => !m.flatConfig)
82
+ .map((m) => m.original);
83
+ if (nxExtends.length > 0) {
84
+ const nxVar = importsMap.get('@nx/eslint-plugin') ?? 'nx';
85
+ importsMap.set('@nx/eslint-plugin', nxVar);
86
+ nxExtends.forEach((ext) => {
87
+ exportElements.push((0, ast_utils_1.generateFlatPredefinedConfig)(ext.flatConfig, nxVar, true));
88
+ });
89
+ // Build remaining override without Nx extends
90
+ const remainingOverride = { ...override };
91
+ if (nonNxExtends.length > 0) {
92
+ remainingOverride.extends = nonNxExtends;
93
+ }
94
+ else {
95
+ delete remainingOverride.extends;
96
+ }
97
+ // Emit remaining override if it has content beyond files and empty rules
98
+ const { files: _files, rules: remainingRules, ...remainingRest } = remainingOverride;
99
+ const hasNonEmptyRules = remainingRules && Object.keys(remainingRules).length > 0;
100
+ if (Object.keys(remainingRest).length > 0 || hasNonEmptyRules) {
101
+ if (remainingOverride.env ||
102
+ remainingOverride.extends ||
103
+ remainingOverride.plugins ||
104
+ remainingOverride.parser) {
105
+ isFlatCompatNeeded = true;
106
+ }
107
+ exportElements.push((0, ast_utils_1.generateFlatOverride)(remainingOverride, format));
108
+ }
109
+ return;
110
+ }
111
+ }
71
112
  if (override.env ||
72
113
  override.extends ||
73
114
  override.plugins ||
@@ -138,7 +179,16 @@ function addExtends(importsMap, configBlocks, config, format) {
138
179
  if (pluginExtends.length) {
139
180
  const eslintPluginExtends = pluginExtends.filter((imp) => imp.startsWith('eslint:'));
140
181
  pluginExtends.forEach((imp) => {
141
- if (!imp.startsWith('eslint:')) {
182
+ if (imp.startsWith('eslint:')) {
183
+ return;
184
+ }
185
+ const nxFlatConfig = mapNxPluginToFlatConfig(imp);
186
+ if (nxFlatConfig) {
187
+ const nxVar = importsMap.get('@nx/eslint-plugin') ?? 'nx';
188
+ importsMap.set('@nx/eslint-plugin', nxVar);
189
+ configBlocks.push((0, ast_utils_1.generateFlatPredefinedConfig)(nxFlatConfig, nxVar, true));
190
+ }
191
+ else {
142
192
  eslintrcConfigs.push(imp);
143
193
  }
144
194
  });
@@ -159,10 +209,22 @@ function addExtends(importsMap, configBlocks, config, format) {
159
209
  return { isFlatCompatNeeded, isESLintJSNeeded };
160
210
  }
161
211
  function addPlugins(importsMap, configBlocks, config) {
212
+ // Replace @nx plugin with flat/base predefined config to match fresh generation.
213
+ // flat/base registers the @nx plugin and ignores .nx directory.
214
+ // This runs before overrides are processed, so we set the import name here
215
+ // for Nx extends that may appear in overrides later.
216
+ if (config.plugins.includes('@nx')) {
217
+ importsMap.set('@nx/eslint-plugin', 'nx');
218
+ configBlocks.push((0, ast_utils_1.generateFlatPredefinedConfig)('flat/base', 'nx', true));
219
+ }
220
+ const remainingPlugins = config.plugins.filter((name) => name !== '@nx');
221
+ if (remainingPlugins.length === 0) {
222
+ return;
223
+ }
162
224
  const mappedPlugins = [];
163
- config.plugins.forEach((name) => {
225
+ remainingPlugins.forEach((name) => {
164
226
  const imp = (0, eslint_file_1.getPluginImport)(name);
165
- const varName = (0, devkit_1.names)(imp).propertyName;
227
+ const varName = importsMap.get(imp) ?? (0, devkit_1.names)(imp).propertyName;
166
228
  mappedPlugins.push({ name, varName, imp });
167
229
  });
168
230
  mappedPlugins.forEach(({ varName, imp }) => {
@@ -180,3 +242,18 @@ function addPlugins(importsMap, configBlocks, config) {
180
242
  ], false);
181
243
  configBlocks.push(pluginsAst);
182
244
  }
245
+ const nxPluginToFlatConfigMap = {
246
+ 'plugin:@nx/typescript': 'flat/typescript',
247
+ 'plugin:@nx/javascript': 'flat/javascript',
248
+ 'plugin:@nx/react': 'flat/react',
249
+ 'plugin:@nx/react-base': 'flat/react-base',
250
+ 'plugin:@nx/react-typescript': 'flat/react-typescript',
251
+ 'plugin:@nx/react-jsx': 'flat/react-jsx',
252
+ 'plugin:@nx/angular': 'flat/angular',
253
+ 'plugin:@nx/angular-template': 'flat/angular-template',
254
+ 'plugin:@nrwl/nx/typescript': 'flat/typescript',
255
+ 'plugin:@nrwl/nx/javascript': 'flat/javascript',
256
+ };
257
+ function mapNxPluginToFlatConfig(pluginExtend) {
258
+ return nxPluginToFlatConfigMap[pluginExtend];
259
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../../../../packages/eslint/src/generators/convert-to-flat-config/generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,iBAAiB,EAQjB,IAAI,EAGL,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,kCAAkC,EAAE,MAAM,UAAU,CAAC;AAa9D,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,kCAAkC,GAC1C,OAAO,CAAC,IAAI,GAAG,iBAAiB,CAAC,CA6CnC;AAED,eAAe,4BAA4B,CAAC"}
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../../../../packages/eslint/src/generators/convert-to-flat-config/generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,iBAAiB,EASjB,IAAI,EAGL,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,kCAAkC,EAAE,MAAM,UAAU,CAAC;AAc9D,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,kCAAkC,GAC1C,OAAO,CAAC,IAAI,GAAG,iBAAiB,CAAC,CA6CnC;AAED,eAAe,4BAA4B,CAAC"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.convertToFlatConfigGenerator = convertToFlatConfigGenerator;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const eslint_file_1 = require("../utils/eslint-file");
6
+ const plugin_1 = require("../utils/plugin");
6
7
  const path_1 = require("path");
7
8
  const versions_1 = require("../../utils/versions");
8
9
  const json_converter_1 = require("./converters/json-converter");
@@ -42,39 +43,47 @@ function convertRootToFlatConfig(tree, eslintFile, format) {
42
43
  }
43
44
  convertConfigToFlatConfig(tree, '', eslintFile.replace('.base.', '.'), `eslint.config.${format}`, format);
44
45
  }
46
+ const ESLINT_LINT_EXECUTOR = '@nx/eslint:lint';
47
+ function isEslintTarget(target) {
48
+ return (target.executor === ESLINT_LINT_EXECUTOR ||
49
+ target.command?.includes('eslint'));
50
+ }
45
51
  function convertProjectToFlatConfig(tree, project, projectConfig, nxJson, eslintIgnoreFiles, format) {
46
52
  const eslintFile = (0, eslint_file_1.findEslintFile)(tree, projectConfig.root);
47
- if (eslintFile && !eslintFile.endsWith('.js')) {
48
- if (projectConfig.targets) {
49
- const eslintTargets = Object.keys(projectConfig.targets || {}).filter((t) => projectConfig.targets[t].executor === '@nx/eslint:lint' ||
50
- projectConfig.targets[t].command?.includes('eslint'));
51
- let ignorePath;
52
- for (const target of eslintTargets) {
53
- // remove any obsolete `eslintConfig` options pointing to the old config file
54
- if (projectConfig.targets[target].options?.eslintConfig) {
55
- delete projectConfig.targets[target].options.eslintConfig;
56
- }
57
- if (projectConfig.targets[target].options?.ignorePath) {
58
- ignorePath = projectConfig.targets[target].options.ignorePath;
59
- delete projectConfig.targets[target].options.ignorePath;
60
- }
61
- (0, devkit_1.updateProjectConfiguration)(tree, project, projectConfig);
62
- }
63
- const nxHasEsLintTargets = Object.keys(nxJson.targetDefaults || {}).some((t) => (t === '@nx/eslint:lint' ||
64
- nxJson.targetDefaults[t].executor === '@nx/eslint:lint' ||
65
- nxJson.targetDefaults[t].command?.includes('eslint')) &&
66
- projectConfig.targets?.[t]);
67
- const nxHasEsLintPlugin = (nxJson.plugins || []).some((p) => typeof p === 'string'
68
- ? p === '@nx/eslint/plugin'
69
- : p.plugin === '@nx/eslint/plugin');
70
- if (nxHasEsLintTargets || nxHasEsLintPlugin || eslintTargets.length > 0) {
71
- convertConfigToFlatConfig(tree, projectConfig.root, eslintFile, `eslint.config.${format}`, format, ignorePath);
72
- eslintIgnoreFiles.add(`${projectConfig.root}/.eslintignore`);
73
- if (ignorePath) {
74
- eslintIgnoreFiles.add(ignorePath);
75
- }
76
- }
53
+ if (!eslintFile || eslintFile.endsWith('.js')) {
54
+ return;
55
+ }
56
+ // Clean up obsolete target options and detect explicit ESLint targets
57
+ let ignorePath;
58
+ const eslintTargets = projectConfig.targets
59
+ ? Object.keys(projectConfig.targets).filter((t) => isEslintTarget(projectConfig.targets[t]))
60
+ : [];
61
+ for (const target of eslintTargets) {
62
+ if (projectConfig.targets[target].options?.eslintConfig) {
63
+ delete projectConfig.targets[target].options.eslintConfig;
77
64
  }
65
+ if (projectConfig.targets[target].options?.ignorePath) {
66
+ ignorePath = projectConfig.targets[target].options.ignorePath;
67
+ delete projectConfig.targets[target].options.ignorePath;
68
+ }
69
+ }
70
+ if (eslintTargets.length > 0) {
71
+ (0, devkit_1.updateProjectConfiguration)(tree, project, projectConfig);
72
+ }
73
+ const hasEslintTargetDefaults = projectConfig.targets &&
74
+ Object.keys(nxJson.targetDefaults || {}).some((t) => (t === ESLINT_LINT_EXECUTOR ||
75
+ isEslintTarget(nxJson.targetDefaults[t])) &&
76
+ projectConfig.targets[t]);
77
+ if (eslintTargets.length === 0 &&
78
+ !hasEslintTargetDefaults &&
79
+ !(0, plugin_1.hasEslintPlugin)(tree)) {
80
+ devkit_1.logger.warn(`Skipping "${project}": found ${eslintFile} but no ESLint lint target detected. Convert manually if needed.`);
81
+ return;
82
+ }
83
+ convertConfigToFlatConfig(tree, projectConfig.root, eslintFile, `eslint.config.${format}`, format, ignorePath);
84
+ eslintIgnoreFiles.add(`${projectConfig.root}/.eslintignore`);
85
+ if (ignorePath) {
86
+ eslintIgnoreFiles.add(ignorePath);
78
87
  }
79
88
  }
80
89
  // update names of eslint files in nx.json
@@ -18,7 +18,13 @@ export declare function addExtendsToLintConfig(tree: Tree, root: string, plugin:
18
18
  name: string;
19
19
  needCompatFixup: boolean;
20
20
  }>, insertAtTheEnd?: boolean): GeneratorCallback;
21
- export declare function addPredefinedConfigToFlatLintConfig(tree: Tree, root: string, predefinedConfigName: string, moduleName?: string, moduleImportPath?: string, spread?: boolean, insertAtTheEnd?: boolean): void;
21
+ export declare function addPredefinedConfigToFlatLintConfig(tree: Tree, root: string, predefinedConfigName: string, options?: {
22
+ moduleName?: string;
23
+ moduleImportPath?: string;
24
+ spread?: boolean;
25
+ insertAtTheEnd?: boolean;
26
+ checkBaseConfig?: boolean;
27
+ }): void;
22
28
  export declare function addPluginsToLintConfig(tree: Tree, root: string, plugin: string | string[]): void;
23
29
  export declare function addIgnoresToLintConfig(tree: Tree, root: string, ignorePatterns: string[]): void;
24
30
  export declare function getPluginImport(pluginName: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"eslint-file.d.ts","sourceRoot":"","sources":["../../../../../../packages/eslint/src/generators/utils/eslint-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,iBAAiB,EAKtB,KAAK,IAAI,EAEV,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAuCrC,wBAAgB,cAAc,CAC5B,IAAI,EAAE,IAAI,EACV,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,GAAG,IAAI,CAmBf;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,SAAK,GAAG,OAAO,CAW7E;AAED,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,QA6CxB;AAsED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,CAc1E;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAC5D,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAE7D,QAiDF;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,OAAO,EACxE,MAAM,EAAE,CACN,QAAQ,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,KAChD,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,QA4C/C;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,OAAO,EACxE,eAAe,UAAQ,GACtB,OAAO,CAyCT;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,QA8BvD;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,EACZ,MAAM,EACF,MAAM,GACN;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,OAAO,CAAA;CAAE,GAC1C,KAAK,CAAC,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,OAAO,CAAA;CAAE,CAAC,EAC9D,cAAc,UAAQ,GACrB,iBAAiB,CA+GnB;AAED,wBAAgB,mCAAmC,CACjD,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,EACZ,oBAAoB,EAAE,MAAM,EAC5B,UAAU,SAAO,EACjB,gBAAgB,SAAsB,EACtC,MAAM,UAAO,EACb,cAAc,UAAO,GACpB,IAAI,CAqBN;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,QA+B1B;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EAAE,QAuCzB;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAY1D"}
1
+ {"version":3,"file":"eslint-file.d.ts","sourceRoot":"","sources":["../../../../../../packages/eslint/src/generators/utils/eslint-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,iBAAiB,EAKtB,KAAK,IAAI,EAEV,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAuCrC,wBAAgB,cAAc,CAC5B,IAAI,EAAE,IAAI,EACV,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,GAAG,IAAI,CAmBf;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,SAAK,GAAG,OAAO,CAW7E;AAED,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,QA6CxB;AAsED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,CAc1E;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAC5D,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAE7D,QAiDF;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,OAAO,EACxE,MAAM,EAAE,CACN,QAAQ,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,KAChD,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,QA4C/C;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,OAAO,EACxE,eAAe,UAAQ,GACtB,OAAO,CAyCT;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,QA8BvD;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,EACZ,MAAM,EACF,MAAM,GACN;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,OAAO,CAAA;CAAE,GAC1C,KAAK,CAAC,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,OAAO,CAAA;CAAE,CAAC,EAC9D,cAAc,UAAQ,GACrB,iBAAiB,CA+GnB;AAED,wBAAgB,mCAAmC,CACjD,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,EACZ,oBAAoB,EAAE,MAAM,EAC5B,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;CACtB,GACL,IAAI,CA6BN;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,QA+B1B;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EAAE,QAuCzB;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAY1D"}
@@ -375,7 +375,8 @@ function addExtendsToLintConfig(tree, root, plugin, insertAtTheEnd = false) {
375
375
  return () => { };
376
376
  }
377
377
  }
378
- function addPredefinedConfigToFlatLintConfig(tree, root, predefinedConfigName, moduleName = 'nx', moduleImportPath = '@nx/eslint-plugin', spread = true, insertAtTheEnd = true) {
378
+ function addPredefinedConfigToFlatLintConfig(tree, root, predefinedConfigName, options = {}) {
379
+ const { moduleName = 'nx', moduleImportPath = '@nx/eslint-plugin', spread = true, insertAtTheEnd = true, checkBaseConfig = false, } = options;
379
380
  if (!(0, flat_config_1.useFlatConfig)(tree))
380
381
  throw new Error('Predefined configs can only be used with flat configs');
381
382
  let fileName;
@@ -387,7 +388,7 @@ function addPredefinedConfigToFlatLintConfig(tree, root, predefinedConfigName, m
387
388
  }
388
389
  let content = tree.read(fileName, 'utf8');
389
390
  content = (0, ast_utils_1.addImportToFlatConfig)(content, moduleName, moduleImportPath);
390
- content = (0, ast_utils_1.addBlockToFlatConfigExport)(content, (0, ast_utils_1.generateFlatPredefinedConfig)(predefinedConfigName, moduleName, spread), { insertAtTheEnd });
391
+ content = (0, ast_utils_1.addBlockToFlatConfigExport)(content, (0, ast_utils_1.generateFlatPredefinedConfig)(predefinedConfigName, moduleName, spread), { insertAtTheEnd, checkBaseConfig });
391
392
  tree.write(fileName, content);
392
393
  }
393
394
  function addPluginsToLintConfig(tree, root, plugin) {
@@ -1 +1 @@
1
- {"version":3,"file":"ast-utils.d.ts","sourceRoot":"","sources":["../../../../../../../packages/eslint/src/generators/utils/flat-config/ast-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ast-utils.d.ts","sourceRoot":"","sources":["../../../../../../../packages/eslint/src/generators/utils/flat-config/ast-utils.ts"],"names":[],"mappings":"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"}
@@ -619,9 +619,25 @@ function addBlockToFlatConfigExportESM(content, config, source, printer, options
619
619
  if (!exportDefaultStatement)
620
620
  return content;
621
621
  const exportArrayLiteral = exportDefaultStatement.expression;
622
- const updatedArrayElements = options.insertAtTheEnd
623
- ? [...exportArrayLiteral.elements, config]
624
- : [config, ...exportArrayLiteral.elements];
622
+ let updatedArrayElements;
623
+ if (options.checkBaseConfig) {
624
+ const baseConfigIndex = exportArrayLiteral.elements.findIndex((el) => ts.isSpreadElement(el) &&
625
+ ts.isIdentifier(el.expression) &&
626
+ el.expression.text === 'baseConfig');
627
+ if (baseConfigIndex >= 0) {
628
+ const before = exportArrayLiteral.elements.slice(0, baseConfigIndex);
629
+ const after = exportArrayLiteral.elements.slice(baseConfigIndex);
630
+ updatedArrayElements = [...before, config, ...after];
631
+ }
632
+ else {
633
+ updatedArrayElements = [...exportArrayLiteral.elements, config];
634
+ }
635
+ }
636
+ else {
637
+ updatedArrayElements = options.insertAtTheEnd
638
+ ? [...exportArrayLiteral.elements, config]
639
+ : [config, ...exportArrayLiteral.elements];
640
+ }
625
641
  const updatedExportDefault = ts.factory.createExportAssignment(undefined, false, ts.factory.createArrayLiteralExpression(updatedArrayElements, true));
626
642
  // update the existing export default array
627
643
  const updatedStatements = source.statements.map((statement) => statement === exportDefaultStatement ? updatedExportDefault : statement);
@@ -650,6 +666,28 @@ function addBlockToFlatConfigExportCJS(content, config, source, printer, options
650
666
  printer
651
667
  .printNode(ts.EmitHint.Expression, config, source)
652
668
  .replaceAll(/\n/g, '\n ');
669
+ if (options.checkBaseConfig) {
670
+ const baseConfigElement = exportsArray.find((el) => ts.isSpreadElement(el) &&
671
+ ts.isIdentifier(el.expression) &&
672
+ el.expression.text === 'baseConfig');
673
+ if (baseConfigElement) {
674
+ // Match baseConfig's indentation for consistent formatting
675
+ const baseConfigStart = baseConfigElement.getStart();
676
+ const lineStart = content.lastIndexOf('\n', baseConfigStart) + 1;
677
+ const indentation = content.substring(lineStart, baseConfigStart);
678
+ const configText = printer
679
+ .printNode(ts.EmitHint.Expression, config, source)
680
+ .replaceAll(/\n/g, `\n${indentation}`);
681
+ return (0, devkit_1.applyChangesToString)(content, [
682
+ {
683
+ type: devkit_1.ChangeType.Insert,
684
+ index: baseConfigStart,
685
+ text: `${configText},\n${indentation}`,
686
+ },
687
+ ]);
688
+ }
689
+ // baseConfig not found — fall through to insertAtTheEnd behavior
690
+ }
653
691
  if (options.insertAtTheEnd) {
654
692
  const index = exportsArray.length > 0
655
693
  ? exportsArray.at(exportsArray.length - 1).end
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../../../packages/eslint/src/plugins/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,aAAa,EAMd,MAAM,YAAY,CAAC;AAqBpB,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAmHD,eAAO,MAAM,WAAW,EAAE,aAAa,CAAC,mBAAmB,CA8D1D,CAAC;AAEF,eAAO,MAAM,aAAa,oCAAc,CAAC"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../../../packages/eslint/src/plugins/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,aAAa,EAMd,MAAM,YAAY,CAAC;AAqBpB,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAmHD,eAAO,MAAM,WAAW,EAAE,aAAa,CAAC,mBAAmB,CAsE1D,CAAC;AAEF,eAAO,MAAM,aAAa,oCAAc,CAAC"}
@@ -112,8 +112,14 @@ exports.createNodes = [
112
112
  if (eslintConfigFiles.length === 0) {
113
113
  return [];
114
114
  }
115
+ // Determine flat vs legacy from root config, matching ESLint's own
116
+ // behavior (find-up from cwd). Nested .eslintrc.* files are irrelevant
117
+ // when a root flat config exists. Prefer flat config at root when both
118
+ // flat and legacy root configs coexist (e.g., mid-migration).
119
+ const rootConfigs = eslintConfigFiles.filter((f) => (0, posix_1.dirname)(f) === '.');
120
+ const rootConfig = rootConfigs.find(config_file_1.isFlatConfig) ?? rootConfigs[0];
115
121
  const ESLint = await (0, resolve_eslint_class_1.resolveESLintClass)({
116
- useFlatConfigOverrideVal: (0, config_file_1.isFlatConfig)(eslintConfigFiles[0]),
122
+ useFlatConfigOverrideVal: (0, config_file_1.isFlatConfig)(rootConfig ?? eslintConfigFiles[0]),
117
123
  });
118
124
  return await (0, devkit_1.createNodesFromFiles)((configFile, options, context) => internalCreateNodesV2(ESLint, configFile, options, context, projectRootsByEslintRoots, lintableFilesPerProjectRoot, targetsCache, hashByRoot), eslintConfigFiles, options, context);
119
125
  }