@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.
- package/LICENSE +1 -1
- package/README.md +4 -9
- package/generators.json +0 -6
- package/migrations.json +0 -68
- package/package.json +8 -9
- package/src/executors/lint/hasher.js +1 -1
- package/src/executors/lint/lint.impl.js +33 -67
- package/src/executors/lint/schema.d.ts +0 -1
- package/src/executors/lint/schema.json +3 -7
- package/src/executors/lint/utility/eslint-utils.js +1 -5
- package/src/generators/convert-to-flat-config/converters/json-converter.d.ts +1 -6
- package/src/generators/convert-to-flat-config/converters/json-converter.js +33 -28
- package/src/generators/convert-to-flat-config/generator.js +17 -73
- package/src/generators/convert-to-flat-config/schema.json +1 -1
- package/src/generators/init/global-eslint-config.js +5 -9
- package/src/generators/init/init-migration.d.ts +1 -1
- package/src/generators/init/init-migration.js +14 -53
- package/src/generators/init/init.d.ts +5 -5
- package/src/generators/init/init.js +35 -63
- package/src/generators/lint-project/lint-project.d.ts +3 -9
- package/src/generators/lint-project/lint-project.js +40 -76
- package/src/generators/utils/eslint-file.d.ts +5 -2
- package/src/generators/utils/eslint-file.js +30 -37
- package/src/generators/utils/flat-config/ast-utils.d.ts +5 -4
- package/src/generators/utils/flat-config/ast-utils.js +38 -35
- package/src/generators/utils/flat-config/path-utils.d.ts +1 -2
- package/src/generators/utils/flat-config/path-utils.js +12 -9
- package/src/generators/workspace-rule/files/__name__.ts__tmpl__ +2 -2
- package/src/generators/workspace-rule/schema.json +1 -1
- package/src/generators/workspace-rule/workspace-rule.js +2 -7
- package/src/generators/workspace-rules-project/files/tsconfig.json__tmpl__ +1 -2
- package/src/generators/workspace-rules-project/schema.json +1 -1
- package/src/generators/workspace-rules-project/workspace-rules-project.d.ts +2 -3
- package/src/generators/workspace-rules-project/workspace-rules-project.js +9 -11
- package/src/migrations/update-15-0-0/add-eslint-inputs.js +2 -2
- package/src/migrations/update-15-7-1/add-eslint-ignore.js +2 -2
- package/src/utils/versions.d.ts +2 -2
- package/src/utils/versions.js +2 -2
- package/plugin.d.ts +0 -1
- package/plugin.js +0 -5
- package/src/generators/init/schema.json +0 -28
- package/src/generators/lint-project/setup-root-eslint.d.ts +0 -7
- package/src/generators/lint-project/setup-root-eslint.js +0 -33
- package/src/generators/utils/plugin.d.ts +0 -2
- package/src/generators/utils/plugin.js +0 -11
- package/src/migrations/update-17-1-0/update-typescript-eslint.d.ts +0 -2
- package/src/migrations/update-17-1-0/update-typescript-eslint.js +0 -74
- package/src/migrations/update-17-2-0/simplify-eslint-patterns.d.ts +0 -2
- package/src/migrations/update-17-2-0/simplify-eslint-patterns.js +0 -46
- package/src/migrations/update-17-2-9/move-options-to-target-defaults.d.ts +0 -2
- package/src/migrations/update-17-2-9/move-options-to-target-defaults.js +0 -107
- package/src/plugins/plugin.d.ts +0 -6
- package/src/plugins/plugin.js +0 -117
- package/src/utils/config-file.d.ts +0 -4
- 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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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 ===
|
|
14
|
-
return
|
|
22
|
+
if (projectRoot === '' && tree.exists(exports.baseEsLintFlatConfigFile)) {
|
|
23
|
+
return exports.baseEsLintFlatConfigFile;
|
|
15
24
|
}
|
|
16
|
-
|
|
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 (
|
|
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 ?
|
|
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 ?
|
|
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
|
|
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
|
-
|
|
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 ?
|
|
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 ?
|
|
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
|
-
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
56
|
-
export declare function mapFilePaths(override: Linter.ConfigOverride<Linter.RulesRecord
|
|
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 =
|
|
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
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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(
|
|
479
|
-
return (
|
|
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,
|
|
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) => (
|
|
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) => (
|
|
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
|
|
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.
|
|
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
|
|
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: '
|
|
28
|
+
recommended: 'error',
|
|
29
29
|
},
|
|
30
30
|
schema: [],
|
|
31
31
|
messages: {},
|
|
@@ -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
|
|
68
|
+
"@nx/workspace/${options.name}": "error"
|
|
74
69
|
}
|
|
75
70
|
`);
|
|
76
71
|
return projectGeneratorCallback;
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
|
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 =
|
|
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 =
|
|
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');
|
package/src/utils/versions.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const nxVersion: any;
|
|
2
|
-
export declare const eslintVersion = "~8.
|
|
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 = "^
|
|
5
|
+
export declare const typescriptESLintVersion = "^5.60.1";
|
package/src/utils/versions.js
CHANGED
|
@@ -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.
|
|
5
|
+
exports.eslintVersion = '~8.46.0';
|
|
6
6
|
exports.eslintrcVersion = '^2.1.1';
|
|
7
7
|
exports.eslintConfigPrettierVersion = '^9.0.0';
|
|
8
|
-
exports.typescriptESLintVersion = '^
|
|
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;
|