@nx/eslint 17.0.5 → 17.0.6

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 +4 -9
  3. package/generators.json +0 -6
  4. package/migrations.json +0 -68
  5. package/package.json +8 -9
  6. package/src/executors/lint/hasher.js +1 -1
  7. package/src/executors/lint/lint.impl.js +33 -67
  8. package/src/executors/lint/schema.d.ts +0 -1
  9. package/src/executors/lint/schema.json +3 -7
  10. package/src/executors/lint/utility/eslint-utils.js +1 -5
  11. package/src/generators/convert-to-flat-config/converters/json-converter.d.ts +1 -6
  12. package/src/generators/convert-to-flat-config/converters/json-converter.js +33 -28
  13. package/src/generators/convert-to-flat-config/generator.js +17 -73
  14. package/src/generators/convert-to-flat-config/schema.json +1 -1
  15. package/src/generators/init/global-eslint-config.js +5 -9
  16. package/src/generators/init/init-migration.d.ts +1 -1
  17. package/src/generators/init/init-migration.js +14 -53
  18. package/src/generators/init/init.d.ts +5 -5
  19. package/src/generators/init/init.js +35 -63
  20. package/src/generators/lint-project/lint-project.d.ts +3 -9
  21. package/src/generators/lint-project/lint-project.js +40 -76
  22. package/src/generators/utils/eslint-file.d.ts +5 -2
  23. package/src/generators/utils/eslint-file.js +30 -37
  24. package/src/generators/utils/flat-config/ast-utils.d.ts +5 -4
  25. package/src/generators/utils/flat-config/ast-utils.js +38 -35
  26. package/src/generators/utils/flat-config/path-utils.d.ts +1 -2
  27. package/src/generators/utils/flat-config/path-utils.js +12 -9
  28. package/src/generators/workspace-rule/files/__name__.ts__tmpl__ +2 -2
  29. package/src/generators/workspace-rule/schema.json +1 -1
  30. package/src/generators/workspace-rule/workspace-rule.js +2 -7
  31. package/src/generators/workspace-rules-project/files/tsconfig.json__tmpl__ +1 -2
  32. package/src/generators/workspace-rules-project/schema.json +1 -1
  33. package/src/generators/workspace-rules-project/workspace-rules-project.d.ts +2 -3
  34. package/src/generators/workspace-rules-project/workspace-rules-project.js +9 -11
  35. package/src/migrations/update-15-0-0/add-eslint-inputs.js +2 -2
  36. package/src/migrations/update-15-7-1/add-eslint-ignore.js +2 -2
  37. package/src/utils/versions.d.ts +2 -2
  38. package/src/utils/versions.js +2 -2
  39. package/plugin.d.ts +0 -1
  40. package/plugin.js +0 -5
  41. package/src/generators/init/schema.json +0 -28
  42. package/src/generators/lint-project/setup-root-eslint.d.ts +0 -7
  43. package/src/generators/lint-project/setup-root-eslint.js +0 -33
  44. package/src/generators/utils/plugin.d.ts +0 -2
  45. package/src/generators/utils/plugin.js +0 -11
  46. package/src/migrations/update-17-1-0/update-typescript-eslint.d.ts +0 -2
  47. package/src/migrations/update-17-1-0/update-typescript-eslint.js +0 -74
  48. package/src/migrations/update-17-2-0/simplify-eslint-patterns.d.ts +0 -2
  49. package/src/migrations/update-17-2-0/simplify-eslint-patterns.js +0 -46
  50. package/src/migrations/update-17-2-9/move-options-to-target-defaults.d.ts +0 -2
  51. package/src/migrations/update-17-2-9/move-options-to-target-defaults.js +0 -107
  52. package/src/plugins/plugin.d.ts +0 -6
  53. package/src/plugins/plugin.js +0 -117
  54. package/src/utils/config-file.d.ts +0 -4
  55. package/src/utils/config-file.js +0 -18
@@ -1,20 +1,28 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getPluginImport = exports.addIgnoresToLintConfig = exports.addPluginsToLintConfig = exports.addExtendsToLintConfig = exports.replaceOverridesInLintConfig = exports.lintConfigHasOverride = exports.updateOverrideInLintConfig = exports.addOverrideToLintConfig = exports.updateRelativePathsInConfig = exports.isEslintConfigSupported = exports.findEslintFile = void 0;
3
+ exports.getPluginImport = exports.addIgnoresToLintConfig = exports.addPluginsToLintConfig = exports.addExtendsToLintConfig = exports.replaceOverridesInLintConfig = exports.lintConfigHasOverride = exports.updateOverrideInLintConfig = exports.addOverrideToLintConfig = exports.updateRelativePathsInConfig = exports.isEslintConfigSupported = exports.findEslintFile = exports.baseEsLintFlatConfigFile = exports.baseEsLintConfigFile = exports.eslintConfigFileWhitelist = void 0;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const flat_config_1 = require("../../utils/flat-config");
6
6
  const ast_utils_1 = require("./flat-config/ast-utils");
7
- const path_utils_1 = require("./flat-config/path-utils");
8
- const config_file_1 = require("../../utils/config-file");
9
- function findEslintFile(tree, projectRoot) {
10
- if (projectRoot === undefined && tree.exists(config_file_1.baseEsLintConfigFile)) {
11
- return config_file_1.baseEsLintConfigFile;
7
+ exports.eslintConfigFileWhitelist = [
8
+ '.eslintrc',
9
+ '.eslintrc.js',
10
+ '.eslintrc.cjs',
11
+ '.eslintrc.yaml',
12
+ '.eslintrc.yml',
13
+ '.eslintrc.json',
14
+ 'eslint.config.js',
15
+ ];
16
+ exports.baseEsLintConfigFile = '.eslintrc.base.json';
17
+ exports.baseEsLintFlatConfigFile = 'eslint.base.config.js';
18
+ function findEslintFile(tree, projectRoot = '') {
19
+ if (projectRoot === '' && tree.exists(exports.baseEsLintConfigFile)) {
20
+ return exports.baseEsLintConfigFile;
12
21
  }
13
- if (projectRoot === undefined && tree.exists(config_file_1.baseEsLintFlatConfigFile)) {
14
- return config_file_1.baseEsLintFlatConfigFile;
22
+ if (projectRoot === '' && tree.exists(exports.baseEsLintFlatConfigFile)) {
23
+ return exports.baseEsLintFlatConfigFile;
15
24
  }
16
- projectRoot ??= '';
17
- for (const file of config_file_1.ESLINT_CONFIG_FILENAMES) {
25
+ for (const file of exports.eslintConfigFileWhitelist) {
18
26
  if (tree.exists((0, devkit_1.joinPathFragments)(projectRoot, file))) {
19
27
  return file;
20
28
  }
@@ -85,7 +93,7 @@ function replaceFlatConfigPaths(config, sourceRoot, offset, destinationRoot, tre
85
93
  return newConfig;
86
94
  }
87
95
  function offsetFilePath(projectRoot, pathToFile, offset, tree) {
88
- if (config_file_1.ESLINT_CONFIG_FILENAMES.some((eslintFile) => pathToFile.includes(eslintFile))) {
96
+ if (exports.eslintConfigFileWhitelist.some((eslintFile) => pathToFile.includes(eslintFile))) {
89
97
  // if the file is point to base eslint
90
98
  const rootEslint = findEslintFile(tree);
91
99
  if (rootEslint) {
@@ -103,8 +111,8 @@ function addOverrideToLintConfig(tree, root, override, options = {
103
111
  }) {
104
112
  const isBase = options.checkBaseConfig && findEslintFile(tree, root).includes('.base');
105
113
  if ((0, flat_config_1.useFlatConfig)(tree)) {
106
- const fileName = (0, devkit_1.joinPathFragments)(root, isBase ? config_file_1.baseEsLintFlatConfigFile : 'eslint.config.js');
107
- const flatOverride = (0, ast_utils_1.generateFlatOverride)(override);
114
+ const fileName = (0, devkit_1.joinPathFragments)(root, isBase ? exports.baseEsLintFlatConfigFile : 'eslint.config.js');
115
+ const flatOverride = (0, ast_utils_1.generateFlatOverride)(override, root);
108
116
  let content = tree.read(fileName, 'utf8');
109
117
  // we will be using compat here so we need to make sure it's added
110
118
  if (overrideNeedsCompat(override)) {
@@ -113,9 +121,9 @@ function addOverrideToLintConfig(tree, root, override, options = {
113
121
  tree.write(fileName, (0, ast_utils_1.addBlockToFlatConfigExport)(content, flatOverride, options));
114
122
  }
115
123
  else {
116
- const fileName = (0, devkit_1.joinPathFragments)(root, isBase ? config_file_1.baseEsLintConfigFile : '.eslintrc.json');
124
+ const fileName = (0, devkit_1.joinPathFragments)(root, isBase ? exports.baseEsLintConfigFile : '.eslintrc.json');
117
125
  (0, devkit_1.updateJson)(tree, fileName, (json) => {
118
- json.overrides ??= [];
126
+ json.overrides ?? [];
119
127
  if (options.insertAtTheEnd) {
120
128
  json.overrides.push(override);
121
129
  }
@@ -128,7 +136,7 @@ function addOverrideToLintConfig(tree, root, override, options = {
128
136
  }
129
137
  exports.addOverrideToLintConfig = addOverrideToLintConfig;
130
138
  function overrideNeedsCompat(override) {
131
- return (override.env || override.extends || override.plugins || override.parser);
139
+ return (!override.env && !override.extends && !override.plugins && !override.parser);
132
140
  }
133
141
  function updateOverrideInLintConfig(tree, root, lookup, update) {
134
142
  if ((0, flat_config_1.useFlatConfig)(tree)) {
@@ -139,23 +147,10 @@ function updateOverrideInLintConfig(tree, root, lookup, update) {
139
147
  }
140
148
  else {
141
149
  const fileName = (0, devkit_1.joinPathFragments)(root, '.eslintrc.json');
142
- if (!tree.exists(fileName)) {
143
- return;
144
- }
145
- const existingJson = (0, devkit_1.readJson)(tree, fileName);
146
- if (!existingJson.overrides || !existingJson.overrides.some(lookup)) {
147
- return;
148
- }
149
150
  (0, devkit_1.updateJson)(tree, fileName, (json) => {
150
151
  const index = json.overrides.findIndex(lookup);
151
152
  if (index !== -1) {
152
- const newOverride = update(json.overrides[index]);
153
- if (newOverride) {
154
- json.overrides[index] = newOverride;
155
- }
156
- else {
157
- json.overrides.splice(index, 1);
158
- }
153
+ json.overrides[index] = update(json.overrides[index]);
159
154
  }
160
155
  return json;
161
156
  });
@@ -168,12 +163,12 @@ function lintConfigHasOverride(tree, root, lookup, checkBaseConfig = false) {
168
163
  }
169
164
  const isBase = checkBaseConfig && findEslintFile(tree, root).includes('.base');
170
165
  if ((0, flat_config_1.useFlatConfig)(tree)) {
171
- const fileName = (0, devkit_1.joinPathFragments)(root, isBase ? config_file_1.baseEsLintFlatConfigFile : 'eslint.config.js');
166
+ const fileName = (0, devkit_1.joinPathFragments)(root, isBase ? exports.baseEsLintFlatConfigFile : 'eslint.config.js');
172
167
  const content = tree.read(fileName, 'utf8');
173
168
  return (0, ast_utils_1.hasOverride)(content, lookup);
174
169
  }
175
170
  else {
176
- const fileName = (0, devkit_1.joinPathFragments)(root, isBase ? config_file_1.baseEsLintConfigFile : '.eslintrc.json');
171
+ const fileName = (0, devkit_1.joinPathFragments)(root, isBase ? exports.baseEsLintConfigFile : '.eslintrc.json');
177
172
  return (0, devkit_1.readJson)(tree, fileName).overrides?.some(lookup) || false;
178
173
  }
179
174
  }
@@ -188,7 +183,7 @@ function replaceOverridesInLintConfig(tree, root, overrides) {
188
183
  }
189
184
  content = (0, ast_utils_1.removeOverridesFromLintConfig)(content);
190
185
  overrides.forEach((override) => {
191
- const flatOverride = (0, ast_utils_1.generateFlatOverride)(override);
186
+ const flatOverride = (0, ast_utils_1.generateFlatOverride)(override, root);
192
187
  (0, ast_utils_1.addBlockToFlatConfigExport)(content, flatOverride);
193
188
  });
194
189
  tree.write(fileName, content);
@@ -207,9 +202,7 @@ function addExtendsToLintConfig(tree, root, plugin) {
207
202
  if ((0, flat_config_1.useFlatConfig)(tree)) {
208
203
  const fileName = (0, devkit_1.joinPathFragments)(root, 'eslint.config.js');
209
204
  const pluginExtends = (0, ast_utils_1.generatePluginExtendsElement)(plugins);
210
- let content = tree.read(fileName, 'utf8');
211
- content = (0, ast_utils_1.addCompatToFlatConfig)(content);
212
- tree.write(fileName, (0, ast_utils_1.addBlockToFlatConfigExport)(content, pluginExtends));
205
+ tree.write(fileName, (0, ast_utils_1.addBlockToFlatConfigExport)(tree.read(fileName, 'utf8'), pluginExtends));
213
206
  }
214
207
  else {
215
208
  const fileName = (0, devkit_1.joinPathFragments)(root, '.eslintrc.json');
@@ -254,7 +247,7 @@ function addIgnoresToLintConfig(tree, root, ignorePatterns) {
254
247
  if ((0, flat_config_1.useFlatConfig)(tree)) {
255
248
  const fileName = (0, devkit_1.joinPathFragments)(root, 'eslint.config.js');
256
249
  const block = (0, ast_utils_1.generateAst)({
257
- ignores: ignorePatterns.map((path) => (0, path_utils_1.mapFilePath)(path)),
250
+ ignores: ignorePatterns.map((path) => (0, ast_utils_1.mapFilePath)(path, root)),
258
251
  });
259
252
  tree.write(fileName, (0, ast_utils_1.addBlockToFlatConfigExport)(tree.read(fileName, 'utf8'), block));
260
253
  }
@@ -8,7 +8,7 @@ export declare function hasOverride(content: string, lookup: (override: Linter.C
8
8
  /**
9
9
  * Finds an override matching the lookup function and applies the update function to it
10
10
  */
11
- export declare function replaceOverride(content: string, root: string, lookup: (override: Linter.ConfigOverride<Linter.RulesRecord>) => boolean, update?: (override: Linter.ConfigOverride<Linter.RulesRecord>) => Linter.ConfigOverride<Linter.RulesRecord>): string;
11
+ export declare function replaceOverride(content: string, root: string, lookup: (override: Linter.ConfigOverride<Linter.RulesRecord>) => boolean, update: (override: Linter.ConfigOverride<Linter.RulesRecord>) => Linter.ConfigOverride<Linter.RulesRecord>): string;
12
12
  /**
13
13
  * Adding require statement to the top of the file
14
14
  */
@@ -44,7 +44,7 @@ export declare function generatePluginExtendsElement(plugins: string[]): ts.Spre
44
44
  /**
45
45
  * Stringifies TS nodes to file content string
46
46
  */
47
- export declare function stringifyNodeList(nodes: ts.NodeArray<ts.VariableStatement | ts.Identifier | ts.ExpressionStatement | ts.SourceFile>): string;
47
+ export declare function stringifyNodeList(nodes: ts.NodeArray<ts.VariableStatement | ts.Identifier | ts.ExpressionStatement | ts.SourceFile>, root: string, fileName: string): string;
48
48
  /**
49
49
  * generates AST require statement
50
50
  */
@@ -52,8 +52,9 @@ export declare function generateRequire(variableName: string | ts.ObjectBindingP
52
52
  /**
53
53
  * Generates AST object or spread element based on JSON override object
54
54
  */
55
- export declare function generateFlatOverride(override: Linter.ConfigOverride<Linter.RulesRecord>): ts.ObjectLiteralExpression | ts.SpreadElement;
56
- export declare function mapFilePaths(override: Linter.ConfigOverride<Linter.RulesRecord>): void;
55
+ export declare function generateFlatOverride(override: Linter.ConfigOverride<Linter.RulesRecord>, root: string): ts.ObjectLiteralExpression | ts.SpreadElement;
56
+ export declare function mapFilePaths(override: Linter.ConfigOverride<Linter.RulesRecord>, root: string): void;
57
+ export declare function mapFilePath(filePath: string, root: string): string;
57
58
  /**
58
59
  * Generates an AST from a JSON-type input
59
60
  */
@@ -1,9 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateAst = exports.mapFilePaths = exports.generateFlatOverride = exports.generateRequire = exports.stringifyNodeList = exports.generatePluginExtendsElement = exports.generateSpreadElement = exports.createNodeList = exports.addCompatToFlatConfig = exports.addPluginsToExportsBlock = exports.removeCompatExtends = exports.removePlugin = exports.addBlockToFlatConfigExport = exports.addImportToFlatConfig = exports.replaceOverride = exports.hasOverride = exports.removeOverridesFromLintConfig = void 0;
3
+ exports.generateAst = exports.mapFilePath = exports.mapFilePaths = exports.generateFlatOverride = exports.generateRequire = exports.stringifyNodeList = exports.generatePluginExtendsElement = exports.generateSpreadElement = exports.createNodeList = exports.addCompatToFlatConfig = exports.addPluginsToExportsBlock = exports.removeCompatExtends = exports.removePlugin = exports.addBlockToFlatConfigExport = exports.addImportToFlatConfig = exports.replaceOverride = exports.hasOverride = exports.removeOverridesFromLintConfig = void 0;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const ts = require("typescript");
6
- const path_utils_1 = require("./path-utils");
7
6
  /**
8
7
  * Remove all overrides from the config file
9
8
  */
@@ -64,7 +63,7 @@ function hasOverride(content, lookup) {
64
63
  // strip any spread elements
65
64
  objSource = fullNodeText.replace(/\s*\.\.\.[a-zA-Z0-9_]+,?\n?/, '');
66
65
  }
67
- const data = (0, devkit_1.parseJson)(objSource
66
+ const data = JSON.parse(objSource
68
67
  // ensure property names have double quotes so that JSON.parse works
69
68
  .replace(/'/g, '"')
70
69
  .replace(/\s([a-zA-Z0-9_]+)\s*:/g, ' "$1": '));
@@ -78,7 +77,7 @@ function hasOverride(content, lookup) {
78
77
  exports.hasOverride = hasOverride;
79
78
  const STRIP_SPREAD_ELEMENTS = /\s*\.\.\.[a-zA-Z0-9_]+,?\n?/g;
80
79
  function parseTextToJson(text) {
81
- return (0, devkit_1.parseJson)(text
80
+ return JSON.parse(text
82
81
  // ensure property names have double quotes so that JSON.parse works
83
82
  .replace(/'/g, '"')
84
83
  .replace(/\s([a-zA-Z0-9_]+)\s*:/g, ' "$1": '));
@@ -119,14 +118,12 @@ function replaceOverride(content, root, lookup, update) {
119
118
  length: end - start,
120
119
  });
121
120
  const updatedData = update(data);
122
- if (updatedData) {
123
- mapFilePaths(updatedData);
124
- changes.push({
125
- type: devkit_1.ChangeType.Insert,
126
- index: start,
127
- text: JSON.stringify(updatedData, null, 2).slice(2, -2), // remove curly braces and start/end line breaks since we are injecting just properties
128
- });
129
- }
121
+ mapFilePaths(updatedData, root);
122
+ changes.push({
123
+ type: devkit_1.ChangeType.Insert,
124
+ index: start,
125
+ text: JSON.stringify(updatedData, null, 2).slice(2, -2), // remove curly braces and start/end line breaks since we are injecting just properties
126
+ });
130
127
  }
131
128
  }
132
129
  });
@@ -473,15 +470,10 @@ exports.generatePluginExtendsElement = generatePluginExtendsElement;
473
470
  /**
474
471
  * Stringifies TS nodes to file content string
475
472
  */
476
- function stringifyNodeList(nodes) {
473
+ function stringifyNodeList(nodes, root, fileName) {
477
474
  const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
478
- const resultFile = ts.createSourceFile('', '', ts.ScriptTarget.Latest, true, ts.ScriptKind.JS);
479
- return (printer
480
- .printList(ts.ListFormat.MultiLine, nodes, resultFile)
481
- // add new line before compat initialization
482
- .replace(/const compat = new FlatCompat/, '\nconst compat = new FlatCompat')
483
- // add new line before module.exports = ...
484
- .replace(/module\.exports/, '\nmodule.exports'));
475
+ const resultFile = ts.createSourceFile((0, devkit_1.joinPathFragments)(root, fileName), '', ts.ScriptTarget.Latest, true, ts.ScriptKind.JS);
476
+ return printer.printList(ts.ListFormat.MultiLine, nodes, resultFile);
485
477
  }
486
478
  exports.stringifyNodeList = stringifyNodeList;
487
479
  /**
@@ -496,30 +488,21 @@ exports.generateRequire = generateRequire;
496
488
  /**
497
489
  * Generates AST object or spread element based on JSON override object
498
490
  */
499
- function generateFlatOverride(override) {
500
- mapFilePaths(override);
491
+ function generateFlatOverride(override, root) {
492
+ mapFilePaths(override, root);
501
493
  if (!override.env &&
502
494
  !override.extends &&
503
495
  !override.plugins &&
504
496
  !override.parser) {
505
- if (override.parserOptions) {
506
- const { parserOptions, ...rest } = override;
507
- return generateAst({ ...rest, languageSettings: { parserOptions } });
508
- }
509
497
  return generateAst(override);
510
498
  }
511
- const { files, excludedFiles, rules, parserOptions, ...rest } = override;
499
+ const { files, excludedFiles, rules, ...rest } = override;
512
500
  const objectLiteralElements = [
513
501
  ts.factory.createSpreadAssignment(ts.factory.createIdentifier('config')),
514
502
  ];
515
503
  addTSObjectProperty(objectLiteralElements, 'files', files);
516
504
  addTSObjectProperty(objectLiteralElements, 'excludedFiles', excludedFiles);
517
505
  addTSObjectProperty(objectLiteralElements, 'rules', rules);
518
- if (parserOptions) {
519
- addTSObjectProperty(objectLiteralElements, 'languageSettings', {
520
- parserOptions,
521
- });
522
- }
523
506
  return ts.factory.createSpreadElement(ts.factory.createCallExpression(ts.factory.createPropertyAccessExpression(ts.factory.createCallExpression(ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('compat'), ts.factory.createIdentifier('config')), undefined, [generateAst(rest)]), ts.factory.createIdentifier('map')), undefined, [
524
507
  ts.factory.createArrowFunction(undefined, undefined, [
525
508
  ts.factory.createParameterDeclaration(undefined, undefined, 'config'),
@@ -527,21 +510,41 @@ function generateFlatOverride(override) {
527
510
  ]));
528
511
  }
529
512
  exports.generateFlatOverride = generateFlatOverride;
530
- function mapFilePaths(override) {
513
+ function mapFilePaths(override, root) {
531
514
  if (override.files) {
532
515
  override.files = Array.isArray(override.files)
533
516
  ? override.files
534
517
  : [override.files];
535
- override.files = override.files.map((file) => (0, path_utils_1.mapFilePath)(file));
518
+ override.files = override.files.map((file) => mapFilePath(file, root));
536
519
  }
537
520
  if (override.excludedFiles) {
538
521
  override.excludedFiles = Array.isArray(override.excludedFiles)
539
522
  ? override.excludedFiles
540
523
  : [override.excludedFiles];
541
- override.excludedFiles = override.excludedFiles.map((file) => (0, path_utils_1.mapFilePath)(file));
524
+ override.excludedFiles = override.excludedFiles.map((file) => mapFilePath(file, root));
542
525
  }
543
526
  }
544
527
  exports.mapFilePaths = mapFilePaths;
528
+ function mapFilePath(filePath, root) {
529
+ if (filePath.startsWith('!')) {
530
+ const fileWithoutBang = filePath.slice(1);
531
+ if (fileWithoutBang.startsWith('*.')) {
532
+ return `!${(0, devkit_1.joinPathFragments)(root, '**', fileWithoutBang)}`;
533
+ }
534
+ else if (!fileWithoutBang.startsWith(root)) {
535
+ return `!${(0, devkit_1.joinPathFragments)(root, fileWithoutBang)}`;
536
+ }
537
+ return filePath;
538
+ }
539
+ if (filePath.startsWith('*.')) {
540
+ return (0, devkit_1.joinPathFragments)(root, '**', filePath);
541
+ }
542
+ else if (!filePath.startsWith(root)) {
543
+ return (0, devkit_1.joinPathFragments)(root, filePath);
544
+ }
545
+ return filePath;
546
+ }
547
+ exports.mapFilePath = mapFilePath;
545
548
  function addTSObjectProperty(elements, key, value) {
546
549
  if (value) {
547
550
  elements.push(ts.factory.createPropertyAssignment(key, generateAst(value)));
@@ -1,3 +1,2 @@
1
1
  import type { Linter } from 'eslint';
2
- export declare function updateFiles(override: Linter.ConfigOverride<Linter.RulesRecord>): Linter.ConfigOverride<Linter.RulesRecord>;
3
- export declare function mapFilePath(filePath: string): string;
2
+ export declare function updateFiles(override: Linter.ConfigOverride<Linter.RulesRecord>, root: string): Linter.ConfigOverride<Linter.RulesRecord>;
@@ -1,28 +1,31 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.mapFilePath = exports.updateFiles = void 0;
3
+ exports.updateFiles = void 0;
4
4
  const devkit_1 = require("@nx/devkit");
5
- function updateFiles(override) {
5
+ function updateFiles(override, root) {
6
6
  if (override.files) {
7
7
  override.files = Array.isArray(override.files)
8
8
  ? override.files
9
9
  : [override.files];
10
- override.files = override.files.map((file) => mapFilePath(file));
10
+ override.files = override.files.map((file) => mapFilePath(file, root));
11
11
  }
12
12
  return override;
13
13
  }
14
14
  exports.updateFiles = updateFiles;
15
- function mapFilePath(filePath) {
15
+ function mapFilePath(filePath, root) {
16
16
  if (filePath.startsWith('!')) {
17
17
  const fileWithoutBang = filePath.slice(1);
18
18
  if (fileWithoutBang.startsWith('*.')) {
19
- return `!${(0, devkit_1.joinPathFragments)('**', fileWithoutBang)}`;
19
+ return `!${(0, devkit_1.joinPathFragments)(root, '**', fileWithoutBang)}`;
20
+ }
21
+ else {
22
+ return `!${(0, devkit_1.joinPathFragments)(root, fileWithoutBang)}`;
20
23
  }
21
- return filePath;
22
24
  }
23
25
  if (filePath.startsWith('*.')) {
24
- return (0, devkit_1.joinPathFragments)('**', filePath);
26
+ return (0, devkit_1.joinPathFragments)(root, '**', filePath);
27
+ }
28
+ else {
29
+ return (0, devkit_1.joinPathFragments)(root, filePath);
25
30
  }
26
- return filePath;
27
31
  }
28
- exports.mapFilePath = mapFilePath;
@@ -16,7 +16,7 @@
16
16
 
17
17
  import { ESLintUtils } from '@typescript-eslint/utils';
18
18
 
19
- // NOTE: The rule will be available in ESLint configs as "@nx/workspace-<%= name %>"
19
+ // NOTE: The rule will be available in ESLint configs as "@nx/workspace/<%= name %>"
20
20
  export const RULE_NAME = '<%= name %>';
21
21
 
22
22
  export const rule = ESLintUtils.RuleCreator(() => __filename)({
@@ -25,7 +25,7 @@ export const rule = ESLintUtils.RuleCreator(() => __filename)({
25
25
  type: 'problem',
26
26
  docs: {
27
27
  description: ``,
28
- recommended: 'recommended',
28
+ recommended: 'error',
29
29
  },
30
30
  schema: [],
31
31
  messages: {},
@@ -1,5 +1,5 @@
1
1
  {
2
- "$schema": "https://json-schema.org/schema",
2
+ "$schema": "http://json-schema.org/schema",
3
3
  "$id": "NxWorkspaceRule",
4
4
  "cli": "nx",
5
5
  "title": "Create a new Workspace Lint Rule",
@@ -8,13 +8,8 @@ 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
10
  async function lintWorkspaceRuleGenerator(tree, options) {
11
- const nxJson = (0, devkit_1.readNxJson)(tree);
12
11
  // Ensure that the workspace rules project has been created
13
- const projectGeneratorCallback = await (0, workspace_rules_project_1.lintWorkspaceRulesProjectGenerator)(tree, {
14
- skipFormat: true,
15
- addPlugin: process.env.NX_ADD_PLUGINS !== 'false' &&
16
- nxJson.useInferencePlugins !== false,
17
- });
12
+ const projectGeneratorCallback = await (0, workspace_rules_project_1.lintWorkspaceRulesProjectGenerator)(tree, { skipFormat: true });
18
13
  const ruleDir = (0, devkit_1.joinPathFragments)(workspace_lint_rules_1.workspaceLintPluginDir, options.directory ?? '');
19
14
  // Generate the required files for the new rule
20
15
  (0, devkit_1.generateFiles)(tree, (0, path_1.join)(__dirname, 'files'), ruleDir, {
@@ -70,7 +65,7 @@ async function lintWorkspaceRuleGenerator(tree, options) {
70
65
  devkit_1.logger.info(`NX Reminder: Once you have finished writing your rule logic, you need to actually enable the rule within an appropriate ESLint config in your workspace, for example:
71
66
 
72
67
  "rules": {
73
- "@nx/workspace-${options.name}": "error"
68
+ "@nx/workspace/${options.name}": "error"
74
69
  }
75
70
  `);
76
71
  return projectGeneratorCallback;
@@ -1,8 +1,7 @@
1
1
  {
2
2
  "extends": "<%= rootTsConfigPath %>",
3
3
  "compilerOptions": {
4
- "moduleResolution": "node16",
5
- "module": "node16"
4
+ "module": "commonjs"
6
5
  },
7
6
  "files": [],
8
7
  "include": [],
@@ -1,5 +1,5 @@
1
1
  {
2
- "$schema": "https://json-schema.org/schema",
2
+ "$schema": "http://json-schema.org/schema",
3
3
  "$id": "NxWorkspaceRulesProject",
4
4
  "cli": "nx",
5
5
  "title": "Create the Workspace Lint Rules Project",
@@ -1,8 +1,7 @@
1
- import { GeneratorCallback, Tree } from '@nx/devkit';
1
+ import { Tree } from '@nx/devkit';
2
2
  export declare const WORKSPACE_RULES_PROJECT_NAME = "eslint-rules";
3
3
  export declare const WORKSPACE_PLUGIN_DIR = "tools/eslint-rules";
4
4
  export interface LintWorkspaceRulesProjectGeneratorOptions {
5
5
  skipFormat?: boolean;
6
- addPlugin?: boolean;
7
6
  }
8
- export declare function lintWorkspaceRulesProjectGenerator(tree: Tree, options?: LintWorkspaceRulesProjectGeneratorOptions): Promise<GeneratorCallback>;
7
+ export declare function lintWorkspaceRulesProjectGenerator(tree: Tree, options?: LintWorkspaceRulesProjectGeneratorOptions): Promise<import("@nx/devkit").GeneratorCallback>;
@@ -10,8 +10,7 @@ const workspace_lint_rules_1 = require("../../utils/workspace-lint-rules");
10
10
  exports.WORKSPACE_RULES_PROJECT_NAME = 'eslint-rules';
11
11
  exports.WORKSPACE_PLUGIN_DIR = 'tools/eslint-rules';
12
12
  async function lintWorkspaceRulesProjectGenerator(tree, options = {}) {
13
- const { configurationGenerator } = (0, devkit_1.ensurePackage)('@nx/jest', versions_1.nxVersion);
14
- const tasks = [];
13
+ const { addPropertyToJestConfig, configurationGenerator } = (0, devkit_1.ensurePackage)('@nx/jest', versions_1.nxVersion);
15
14
  // Noop if the workspace rules project already exists
16
15
  try {
17
16
  (0, devkit_1.readProjectConfiguration)(tree, exports.WORKSPACE_RULES_PROJECT_NAME);
@@ -40,17 +39,15 @@ async function lintWorkspaceRulesProjectGenerator(tree, options = {}) {
40
39
  (0, devkit_1.updateNxJson)(tree, nxJson);
41
40
  }
42
41
  // Add jest to the project and return installation task
43
- tasks.push(await configurationGenerator(tree, {
44
- ...options,
42
+ const installTask = await configurationGenerator(tree, {
45
43
  project: exports.WORKSPACE_RULES_PROJECT_NAME,
46
44
  supportTsx: false,
47
45
  skipSerializers: true,
48
46
  setupFile: 'none',
49
47
  compiler: 'tsc',
50
48
  skipFormat: true,
51
- }));
49
+ });
52
50
  (0, devkit_1.updateJson)(tree, (0, path_1.join)(workspace_lint_rules_1.workspaceLintPluginDir, 'tsconfig.spec.json'), (json) => {
53
- delete json.compilerOptions?.module;
54
51
  if (json.include) {
55
52
  json.include = json.include.map((v) => {
56
53
  if (v.startsWith('src/**')) {
@@ -70,13 +67,14 @@ async function lintWorkspaceRulesProjectGenerator(tree, options = {}) {
70
67
  return json;
71
68
  });
72
69
  // Add swc dependencies
73
- tasks.push((0, add_swc_dependencies_1.addSwcRegisterDependencies)(tree));
74
- tasks.push((0, devkit_1.addDependenciesToPackageJson)(tree, {}, {
75
- '@typescript-eslint/utils': versions_1.typescriptESLintVersion,
76
- }));
70
+ (0, add_swc_dependencies_1.addSwcRegisterDependencies)(tree);
71
+ // Add extra config to the jest.config.ts file to allow ESLint 8 exports mapping to work with jest
72
+ addPropertyToJestConfig(tree, (0, devkit_1.joinPathFragments)(exports.WORKSPACE_PLUGIN_DIR, 'jest.config.ts'), 'moduleNameMapper', {
73
+ '@eslint/eslintrc': '@eslint/eslintrc/dist/eslintrc-universal.cjs',
74
+ });
77
75
  if (!options.skipFormat) {
78
76
  await (0, devkit_1.formatFiles)(tree);
79
77
  }
80
- return (0, devkit_1.runTasksInSerial)(...tasks);
78
+ return installTask;
81
79
  }
82
80
  exports.lintWorkspaceRulesProjectGenerator = lintWorkspaceRulesProjectGenerator;
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const devkit_1 = require("@nx/devkit");
4
+ const eslint_file_1 = require("../../generators/utils/eslint-file");
4
5
  const eslint_targets_1 = require("../../generators/utils/eslint-targets");
5
- const config_file_1 = require("../../utils/config-file");
6
6
  async function addEslintInputs(tree) {
7
7
  const nxJson = (0, devkit_1.readNxJson)(tree);
8
- const globalEslintFile = config_file_1.ESLINT_CONFIG_FILENAMES.find((file) => tree.exists(file));
8
+ const globalEslintFile = eslint_file_1.eslintConfigFileWhitelist.find((file) => tree.exists(file));
9
9
  if (globalEslintFile && nxJson.namedInputs?.production) {
10
10
  const productionFileset = new Set(nxJson.namedInputs.production);
11
11
  productionFileset.add(`!{projectRoot}/${globalEslintFile}`);
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const devkit_1 = require("@nx/devkit");
4
+ const eslint_file_1 = require("../../generators/utils/eslint-file");
4
5
  const eslint_targets_1 = require("../../generators/utils/eslint-targets");
5
- const config_file_1 = require("../../utils/config-file");
6
6
  async function addEslintIgnore(tree) {
7
7
  const nxJson = (0, devkit_1.readJson)(tree, 'nx.json');
8
- const globalEslintFile = config_file_1.ESLINT_CONFIG_FILENAMES.find((file) => tree.exists(file));
8
+ const globalEslintFile = eslint_file_1.eslintConfigFileWhitelist.find((file) => tree.exists(file));
9
9
  if (globalEslintFile) {
10
10
  if (tree.exists('.eslintignore')) {
11
11
  const content = tree.read('.eslintignore', 'utf-8');
@@ -1,5 +1,5 @@
1
1
  export declare const nxVersion: any;
2
- export declare const eslintVersion = "~8.57.0";
2
+ export declare const eslintVersion = "~8.46.0";
3
3
  export declare const eslintrcVersion = "^2.1.1";
4
4
  export declare const eslintConfigPrettierVersion = "^9.0.0";
5
- export declare const typescriptESLintVersion = "^7.3.0";
5
+ export declare const typescriptESLintVersion = "^5.60.1";
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.typescriptESLintVersion = exports.eslintConfigPrettierVersion = exports.eslintrcVersion = exports.eslintVersion = exports.nxVersion = void 0;
4
4
  exports.nxVersion = require('../../package.json').version;
5
- exports.eslintVersion = '~8.57.0';
5
+ exports.eslintVersion = '~8.46.0';
6
6
  exports.eslintrcVersion = '^2.1.1';
7
7
  exports.eslintConfigPrettierVersion = '^9.0.0';
8
- exports.typescriptESLintVersion = '^7.3.0';
8
+ exports.typescriptESLintVersion = '^5.60.1';
package/plugin.d.ts DELETED
@@ -1 +0,0 @@
1
- export { createNodes, EslintPluginOptions } from './src/plugins/plugin';
package/plugin.js DELETED
@@ -1,5 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createNodes = void 0;
4
- var plugin_1 = require("./src/plugins/plugin");
5
- Object.defineProperty(exports, "createNodes", { enumerable: true, get: function () { return plugin_1.createNodes; } });
@@ -1,28 +0,0 @@
1
- {
2
- "$schema": "https://json-schema.org/schema",
3
- "cli": "nx",
4
- "$id": "NxESLintInit",
5
- "title": "Initialize ESLint Plugin",
6
- "description": "Set up the ESLint plugin.",
7
- "type": "object",
8
- "properties": {
9
- "skipPackageJson": {
10
- "description": "Do not add dependencies to `package.json`.",
11
- "type": "boolean",
12
- "default": false
13
- },
14
- "keepExistingVersions": {
15
- "type": "boolean",
16
- "x-priority": "internal",
17
- "description": "Keep existing dependencies versions",
18
- "default": false
19
- },
20
- "updatePackageScripts": {
21
- "type": "boolean",
22
- "x-priority": "internal",
23
- "description": "Update `package.json` scripts with inferred targets",
24
- "default": false
25
- }
26
- },
27
- "required": []
28
- }
@@ -1,7 +0,0 @@
1
- import { type GeneratorCallback, type Tree } from '@nx/devkit';
2
- export type SetupRootEsLintOptions = {
3
- unitTestRunner?: string;
4
- skipPackageJson?: boolean;
5
- rootProject?: boolean;
6
- };
7
- export declare function setupRootEsLint(tree: Tree, options: SetupRootEsLintOptions): GeneratorCallback;
@@ -1,33 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.setupRootEsLint = void 0;
4
- const devkit_1 = require("@nx/devkit");
5
- const versions_1 = require("../../utils/versions");
6
- const global_eslint_config_1 = require("../init/global-eslint-config");
7
- const eslint_file_1 = require("../utils/eslint-file");
8
- function setupRootEsLint(tree, options) {
9
- const rootEslintFile = (0, eslint_file_1.findEslintFile)(tree);
10
- if (rootEslintFile) {
11
- return () => { };
12
- }
13
- (0, devkit_1.writeJson)(tree, '.eslintrc.json', (0, global_eslint_config_1.getGlobalEsLintConfiguration)(options.unitTestRunner, options.rootProject));
14
- if (tree.exists('.eslintignore')) {
15
- let content = tree.read('.eslintignore', 'utf-8');
16
- if (!/^node_modules$/gm.test(content)) {
17
- content = `${content}\nnode_modules\n`;
18
- tree.write('.eslintignore', content);
19
- }
20
- }
21
- else {
22
- tree.write('.eslintignore', 'node_modules\n');
23
- }
24
- return !options.skipPackageJson
25
- ? (0, devkit_1.addDependenciesToPackageJson)(tree, {}, {
26
- '@nx/eslint-plugin': versions_1.nxVersion,
27
- '@typescript-eslint/parser': versions_1.typescriptESLintVersion,
28
- '@typescript-eslint/eslint-plugin': versions_1.typescriptESLintVersion,
29
- 'eslint-config-prettier': versions_1.eslintConfigPrettierVersion,
30
- })
31
- : () => { };
32
- }
33
- exports.setupRootEsLint = setupRootEsLint;