eslint 8.55.0 → 9.0.0-alpha.0

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 (54) hide show
  1. package/README.md +15 -15
  2. package/conf/rule-type-list.json +3 -1
  3. package/lib/api.js +1 -1
  4. package/lib/cli-engine/cli-engine.js +15 -4
  5. package/lib/cli-engine/formatters/formatters-meta.json +1 -29
  6. package/lib/cli.js +52 -10
  7. package/lib/config/default-config.js +3 -0
  8. package/lib/config/flat-config-array.js +0 -20
  9. package/lib/config/flat-config-helpers.js +41 -20
  10. package/lib/config/flat-config-schema.js +57 -26
  11. package/lib/config/rule-validator.js +27 -4
  12. package/lib/eslint/eslint-helpers.js +35 -22
  13. package/lib/eslint/eslint.js +856 -373
  14. package/lib/eslint/index.js +2 -2
  15. package/lib/eslint/legacy-eslint.js +722 -0
  16. package/lib/linter/apply-disable-directives.js +33 -5
  17. package/lib/linter/config-comment-parser.js +36 -2
  18. package/lib/linter/linter.js +100 -120
  19. package/lib/linter/rules.js +6 -15
  20. package/lib/options.js +17 -1
  21. package/lib/rule-tester/rule-tester.js +240 -272
  22. package/lib/rules/index.js +0 -2
  23. package/lib/rules/no-constant-binary-expression.js +1 -1
  24. package/lib/rules/no-constructor-return.js +1 -1
  25. package/lib/rules/no-empty-static-block.js +1 -1
  26. package/lib/rules/no-extra-semi.js +1 -1
  27. package/lib/rules/no-implicit-coercion.js +17 -1
  28. package/lib/rules/no-inner-declarations.js +1 -1
  29. package/lib/rules/no-invalid-regexp.js +1 -1
  30. package/lib/rules/no-invalid-this.js +1 -1
  31. package/lib/rules/no-mixed-spaces-and-tabs.js +1 -1
  32. package/lib/rules/no-new-native-nonconstructor.js +1 -1
  33. package/lib/rules/no-new-symbol.js +8 -1
  34. package/lib/rules/no-promise-executor-return.js +9 -6
  35. package/lib/rules/no-restricted-properties.js +15 -28
  36. package/lib/rules/no-sequences.js +1 -0
  37. package/lib/rules/no-unused-private-class-members.js +1 -1
  38. package/lib/shared/config-validator.js +44 -11
  39. package/lib/shared/severity.js +49 -0
  40. package/lib/shared/types.js +1 -1
  41. package/lib/source-code/source-code.js +3 -102
  42. package/lib/unsupported-api.js +3 -5
  43. package/package.json +12 -14
  44. package/lib/cli-engine/formatters/checkstyle.js +0 -60
  45. package/lib/cli-engine/formatters/compact.js +0 -60
  46. package/lib/cli-engine/formatters/jslint-xml.js +0 -41
  47. package/lib/cli-engine/formatters/junit.js +0 -82
  48. package/lib/cli-engine/formatters/tap.js +0 -95
  49. package/lib/cli-engine/formatters/unix.js +0 -58
  50. package/lib/cli-engine/formatters/visualstudio.js +0 -63
  51. package/lib/eslint/flat-eslint.js +0 -1149
  52. package/lib/rule-tester/flat-rule-tester.js +0 -1122
  53. package/lib/rules/require-jsdoc.js +0 -122
  54. package/lib/rules/valid-jsdoc.js +0 -516
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint",
3
- "version": "8.55.0",
3
+ "version": "9.0.0-alpha.0",
4
4
  "author": "Nicholas C. Zakas <nicholas+npm@nczconsulting.com>",
5
5
  "description": "An AST-based pattern checker for JavaScript.",
6
6
  "bin": {
@@ -17,6 +17,7 @@
17
17
  "build:site": "node Makefile.js gensite",
18
18
  "build:webpack": "node Makefile.js webpack",
19
19
  "build:readme": "node tools/update-readme.js",
20
+ "build:rules-index": "node Makefile.js generateRuleIndexPage",
20
21
  "lint": "node Makefile.js lint",
21
22
  "lint:docs:js": "node Makefile.js lintDocsJS",
22
23
  "lint:docs:rule-examples": "node Makefile.js checkRuleExamples",
@@ -64,17 +65,15 @@
64
65
  "dependencies": {
65
66
  "@eslint-community/eslint-utils": "^4.2.0",
66
67
  "@eslint-community/regexpp": "^4.6.1",
67
- "@eslint/eslintrc": "^2.1.4",
68
- "@eslint/js": "8.55.0",
68
+ "@eslint/eslintrc": "^3.0.0",
69
+ "@eslint/js": "9.0.0-alpha.0",
69
70
  "@humanwhocodes/config-array": "^0.11.13",
70
71
  "@humanwhocodes/module-importer": "^1.0.1",
71
72
  "@nodelib/fs.walk": "^1.2.8",
72
- "@ungap/structured-clone": "^1.2.0",
73
73
  "ajv": "^6.12.4",
74
74
  "chalk": "^4.0.0",
75
75
  "cross-spawn": "^7.0.2",
76
76
  "debug": "^4.3.2",
77
- "doctrine": "^3.0.0",
78
77
  "escape-string-regexp": "^4.0.0",
79
78
  "eslint-scope": "^7.2.2",
80
79
  "eslint-visitor-keys": "^3.4.3",
@@ -91,7 +90,6 @@
91
90
  "imurmurhash": "^0.1.4",
92
91
  "is-glob": "^4.0.0",
93
92
  "is-path-inside": "^3.0.3",
94
- "js-yaml": "^4.1.0",
95
93
  "json-stable-stringify-without-jsonify": "^1.0.1",
96
94
  "levn": "^0.4.1",
97
95
  "lodash.merge": "^4.6.2",
@@ -119,11 +117,11 @@
119
117
  "eslint": "file:.",
120
118
  "eslint-config-eslint": "file:packages/eslint-config-eslint",
121
119
  "eslint-plugin-eslint-comments": "^3.2.0",
122
- "eslint-plugin-eslint-plugin": "^5.1.0",
120
+ "eslint-plugin-eslint-plugin": "^5.2.1",
123
121
  "eslint-plugin-internal-rules": "file:tools/internal-rules",
124
- "eslint-plugin-jsdoc": "^46.2.5",
125
- "eslint-plugin-n": "^16.0.0",
126
- "eslint-plugin-unicorn": "^42.0.0",
122
+ "eslint-plugin-jsdoc": "^46.9.0",
123
+ "eslint-plugin-n": "^16.6.0",
124
+ "eslint-plugin-unicorn": "^49.0.0",
127
125
  "eslint-release": "^3.2.0",
128
126
  "eslump": "^3.0.0",
129
127
  "esprima": "^4.0.1",
@@ -132,12 +130,13 @@
132
130
  "glob": "^7.1.6",
133
131
  "got": "^11.8.3",
134
132
  "gray-matter": "^4.0.3",
133
+ "js-yaml": "^4.1.0",
135
134
  "lint-staged": "^11.0.0",
136
135
  "load-perf": "^0.2.0",
137
136
  "markdown-it": "^12.2.0",
138
137
  "markdown-it-container": "^3.0.0",
139
- "markdownlint": "^0.31.1",
140
- "markdownlint-cli": "^0.37.0",
138
+ "markdownlint": "^0.32.0",
139
+ "markdownlint-cli": "^0.38.0",
141
140
  "marked": "^4.0.8",
142
141
  "memfs": "^3.0.1",
143
142
  "metascraper": "^5.25.7",
@@ -147,7 +146,6 @@
147
146
  "metascraper-logo-favicon": "^5.25.7",
148
147
  "metascraper-title": "^5.25.7",
149
148
  "mocha": "^8.3.2",
150
- "mocha-junit-reporter": "^2.0.0",
151
149
  "node-polyfill-webpack-plugin": "^1.0.3",
152
150
  "npm-license": "^0.3.3",
153
151
  "pirates": "^4.0.5",
@@ -174,6 +172,6 @@
174
172
  ],
175
173
  "license": "MIT",
176
174
  "engines": {
177
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
175
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
178
176
  }
179
177
  }
@@ -1,60 +0,0 @@
1
- /**
2
- * @fileoverview CheckStyle XML reporter
3
- * @author Ian Christian Myers
4
- */
5
- "use strict";
6
-
7
- const xmlEscape = require("../xml-escape");
8
-
9
- //------------------------------------------------------------------------------
10
- // Helper Functions
11
- //------------------------------------------------------------------------------
12
-
13
- /**
14
- * Returns the severity of warning or error
15
- * @param {Object} message message object to examine
16
- * @returns {string} severity level
17
- * @private
18
- */
19
- function getMessageType(message) {
20
- if (message.fatal || message.severity === 2) {
21
- return "error";
22
- }
23
- return "warning";
24
-
25
- }
26
-
27
- //------------------------------------------------------------------------------
28
- // Public Interface
29
- //------------------------------------------------------------------------------
30
-
31
- module.exports = function(results) {
32
-
33
- let output = "";
34
-
35
- output += "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
36
- output += "<checkstyle version=\"4.3\">";
37
-
38
- results.forEach(result => {
39
- const messages = result.messages;
40
-
41
- output += `<file name="${xmlEscape(result.filePath)}">`;
42
-
43
- messages.forEach(message => {
44
- output += [
45
- `<error line="${xmlEscape(message.line || 0)}"`,
46
- `column="${xmlEscape(message.column || 0)}"`,
47
- `severity="${xmlEscape(getMessageType(message))}"`,
48
- `message="${xmlEscape(message.message)}${message.ruleId ? ` (${message.ruleId})` : ""}"`,
49
- `source="${message.ruleId ? xmlEscape(`eslint.rules.${message.ruleId}`) : ""}" />`
50
- ].join(" ");
51
- });
52
-
53
- output += "</file>";
54
-
55
- });
56
-
57
- output += "</checkstyle>";
58
-
59
- return output;
60
- };
@@ -1,60 +0,0 @@
1
- /**
2
- * @fileoverview Compact reporter
3
- * @author Nicholas C. Zakas
4
- */
5
- "use strict";
6
-
7
- //------------------------------------------------------------------------------
8
- // Helper Functions
9
- //------------------------------------------------------------------------------
10
-
11
- /**
12
- * Returns the severity of warning or error
13
- * @param {Object} message message object to examine
14
- * @returns {string} severity level
15
- * @private
16
- */
17
- function getMessageType(message) {
18
- if (message.fatal || message.severity === 2) {
19
- return "Error";
20
- }
21
- return "Warning";
22
-
23
- }
24
-
25
-
26
- //------------------------------------------------------------------------------
27
- // Public Interface
28
- //------------------------------------------------------------------------------
29
-
30
- module.exports = function(results) {
31
-
32
- let output = "",
33
- total = 0;
34
-
35
- results.forEach(result => {
36
-
37
- const messages = result.messages;
38
-
39
- total += messages.length;
40
-
41
- messages.forEach(message => {
42
-
43
- output += `${result.filePath}: `;
44
- output += `line ${message.line || 0}`;
45
- output += `, col ${message.column || 0}`;
46
- output += `, ${getMessageType(message)}`;
47
- output += ` - ${message.message}`;
48
- output += message.ruleId ? ` (${message.ruleId})` : "";
49
- output += "\n";
50
-
51
- });
52
-
53
- });
54
-
55
- if (total > 0) {
56
- output += `\n${total} problem${total !== 1 ? "s" : ""}`;
57
- }
58
-
59
- return output;
60
- };
@@ -1,41 +0,0 @@
1
- /**
2
- * @fileoverview JSLint XML reporter
3
- * @author Ian Christian Myers
4
- */
5
- "use strict";
6
-
7
- const xmlEscape = require("../xml-escape");
8
-
9
- //------------------------------------------------------------------------------
10
- // Public Interface
11
- //------------------------------------------------------------------------------
12
-
13
- module.exports = function(results) {
14
-
15
- let output = "";
16
-
17
- output += "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
18
- output += "<jslint>";
19
-
20
- results.forEach(result => {
21
- const messages = result.messages;
22
-
23
- output += `<file name="${result.filePath}">`;
24
-
25
- messages.forEach(message => {
26
- output += [
27
- `<issue line="${message.line}"`,
28
- `char="${message.column}"`,
29
- `evidence="${xmlEscape(message.source || "")}"`,
30
- `reason="${xmlEscape(message.message || "")}${message.ruleId ? ` (${message.ruleId})` : ""}" />`
31
- ].join(" ");
32
- });
33
-
34
- output += "</file>";
35
-
36
- });
37
-
38
- output += "</jslint>";
39
-
40
- return output;
41
- };
@@ -1,82 +0,0 @@
1
- /**
2
- * @fileoverview jUnit Reporter
3
- * @author Jamund Ferguson
4
- */
5
- "use strict";
6
-
7
- const xmlEscape = require("../xml-escape");
8
- const path = require("path");
9
-
10
- //------------------------------------------------------------------------------
11
- // Helper Functions
12
- //------------------------------------------------------------------------------
13
-
14
- /**
15
- * Returns the severity of warning or error
16
- * @param {Object} message message object to examine
17
- * @returns {string} severity level
18
- * @private
19
- */
20
- function getMessageType(message) {
21
- if (message.fatal || message.severity === 2) {
22
- return "Error";
23
- }
24
- return "Warning";
25
-
26
- }
27
-
28
- /**
29
- * Returns a full file path without extension
30
- * @param {string} filePath input file path
31
- * @returns {string} file path without extension
32
- * @private
33
- */
34
- function pathWithoutExt(filePath) {
35
- return path.join(path.dirname(filePath), path.basename(filePath, path.extname(filePath)));
36
- }
37
-
38
- //------------------------------------------------------------------------------
39
- // Public Interface
40
- //------------------------------------------------------------------------------
41
-
42
- module.exports = function(results) {
43
-
44
- let output = "";
45
-
46
- output += "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
47
- output += "<testsuites>\n";
48
-
49
- results.forEach(result => {
50
-
51
- const messages = result.messages;
52
- const classname = pathWithoutExt(result.filePath);
53
-
54
- if (messages.length > 0) {
55
- output += `<testsuite package="org.eslint" time="0" tests="${messages.length}" errors="${messages.length}" name="${result.filePath}">\n`;
56
- messages.forEach(message => {
57
- const type = message.fatal ? "error" : "failure";
58
-
59
- output += `<testcase time="0" name="org.eslint.${message.ruleId || "unknown"}" classname="${classname}">`;
60
- output += `<${type} message="${xmlEscape(message.message || "")}">`;
61
- output += "<![CDATA[";
62
- output += `line ${message.line || 0}, col `;
63
- output += `${message.column || 0}, ${getMessageType(message)}`;
64
- output += ` - ${xmlEscape(message.message || "")}`;
65
- output += (message.ruleId ? ` (${message.ruleId})` : "");
66
- output += "]]>";
67
- output += `</${type}>`;
68
- output += "</testcase>\n";
69
- });
70
- output += "</testsuite>\n";
71
- } else {
72
- output += `<testsuite package="org.eslint" time="0" tests="1" errors="0" name="${result.filePath}">\n`;
73
- output += `<testcase time="0" name="${result.filePath}" classname="${classname}" />\n`;
74
- output += "</testsuite>\n";
75
- }
76
-
77
- });
78
-
79
- output += "</testsuites>\n";
80
-
81
- return output;
82
- };
@@ -1,95 +0,0 @@
1
- /**
2
- * @fileoverview TAP reporter
3
- * @author Jonathan Kingston
4
- */
5
- "use strict";
6
-
7
- const yaml = require("js-yaml");
8
-
9
- //------------------------------------------------------------------------------
10
- // Helper Functions
11
- //------------------------------------------------------------------------------
12
-
13
- /**
14
- * Returns a canonical error level string based upon the error message passed in.
15
- * @param {Object} message Individual error message provided by eslint
16
- * @returns {string} Error level string
17
- */
18
- function getMessageType(message) {
19
- if (message.fatal || message.severity === 2) {
20
- return "error";
21
- }
22
- return "warning";
23
- }
24
-
25
- /**
26
- * Takes in a JavaScript object and outputs a TAP diagnostics string
27
- * @param {Object} diagnostic JavaScript object to be embedded as YAML into output.
28
- * @returns {string} diagnostics string with YAML embedded - TAP version 13 compliant
29
- */
30
- function outputDiagnostics(diagnostic) {
31
- const prefix = " ";
32
- let output = `${prefix}---\n`;
33
-
34
- output += prefix + yaml.dump(diagnostic).split("\n").join(`\n${prefix}`);
35
- output += "...\n";
36
- return output;
37
- }
38
-
39
- //------------------------------------------------------------------------------
40
- // Public Interface
41
- //------------------------------------------------------------------------------
42
-
43
- module.exports = function(results) {
44
- let output = `TAP version 13\n1..${results.length}\n`;
45
-
46
- results.forEach((result, id) => {
47
- const messages = result.messages;
48
- let testResult = "ok";
49
- let diagnostics = {};
50
-
51
- if (messages.length > 0) {
52
- messages.forEach(message => {
53
- const severity = getMessageType(message);
54
- const diagnostic = {
55
- message: message.message,
56
- severity,
57
- data: {
58
- line: message.line || 0,
59
- column: message.column || 0,
60
- ruleId: message.ruleId || ""
61
- }
62
- };
63
-
64
- // This ensures a warning message is not flagged as error
65
- if (severity === "error") {
66
- testResult = "not ok";
67
- }
68
-
69
- /*
70
- * If we have multiple messages place them under a messages key
71
- * The first error will be logged as message key
72
- * This is to adhere to TAP 13 loosely defined specification of having a message key
73
- */
74
- if ("message" in diagnostics) {
75
- if (typeof diagnostics.messages === "undefined") {
76
- diagnostics.messages = [];
77
- }
78
- diagnostics.messages.push(diagnostic);
79
- } else {
80
- diagnostics = diagnostic;
81
- }
82
- });
83
- }
84
-
85
- output += `${testResult} ${id + 1} - ${result.filePath}\n`;
86
-
87
- // If we have an error include diagnostics
88
- if (messages.length > 0) {
89
- output += outputDiagnostics(diagnostics);
90
- }
91
-
92
- });
93
-
94
- return output;
95
- };
@@ -1,58 +0,0 @@
1
- /**
2
- * @fileoverview unix-style formatter.
3
- * @author oshi-shinobu
4
- */
5
- "use strict";
6
-
7
- //------------------------------------------------------------------------------
8
- // Helper Functions
9
- //------------------------------------------------------------------------------
10
-
11
- /**
12
- * Returns a canonical error level string based upon the error message passed in.
13
- * @param {Object} message Individual error message provided by eslint
14
- * @returns {string} Error level string
15
- */
16
- function getMessageType(message) {
17
- if (message.fatal || message.severity === 2) {
18
- return "Error";
19
- }
20
- return "Warning";
21
-
22
- }
23
-
24
-
25
- //------------------------------------------------------------------------------
26
- // Public Interface
27
- //------------------------------------------------------------------------------
28
-
29
- module.exports = function(results) {
30
-
31
- let output = "",
32
- total = 0;
33
-
34
- results.forEach(result => {
35
-
36
- const messages = result.messages;
37
-
38
- total += messages.length;
39
-
40
- messages.forEach(message => {
41
-
42
- output += `${result.filePath}:`;
43
- output += `${message.line || 0}:`;
44
- output += `${message.column || 0}:`;
45
- output += ` ${message.message} `;
46
- output += `[${getMessageType(message)}${message.ruleId ? `/${message.ruleId}` : ""}]`;
47
- output += "\n";
48
-
49
- });
50
-
51
- });
52
-
53
- if (total > 0) {
54
- output += `\n${total} problem${total !== 1 ? "s" : ""}`;
55
- }
56
-
57
- return output;
58
- };
@@ -1,63 +0,0 @@
1
- /**
2
- * @fileoverview Visual Studio compatible formatter
3
- * @author Ronald Pijnacker
4
- */
5
-
6
- "use strict";
7
-
8
- //------------------------------------------------------------------------------
9
- // Helper Functions
10
- //------------------------------------------------------------------------------
11
-
12
- /**
13
- * Returns the severity of warning or error
14
- * @param {Object} message message object to examine
15
- * @returns {string} severity level
16
- * @private
17
- */
18
- function getMessageType(message) {
19
- if (message.fatal || message.severity === 2) {
20
- return "error";
21
- }
22
- return "warning";
23
-
24
- }
25
-
26
-
27
- //------------------------------------------------------------------------------
28
- // Public Interface
29
- //------------------------------------------------------------------------------
30
-
31
- module.exports = function(results) {
32
-
33
- let output = "",
34
- total = 0;
35
-
36
- results.forEach(result => {
37
-
38
- const messages = result.messages;
39
-
40
- total += messages.length;
41
-
42
- messages.forEach(message => {
43
-
44
- output += result.filePath;
45
- output += `(${message.line || 0}`;
46
- output += message.column ? `,${message.column}` : "";
47
- output += `): ${getMessageType(message)}`;
48
- output += message.ruleId ? ` ${message.ruleId}` : "";
49
- output += ` : ${message.message}`;
50
- output += "\n";
51
-
52
- });
53
-
54
- });
55
-
56
- if (total === 0) {
57
- output += "no problems";
58
- } else {
59
- output += `\n${total} problem${total !== 1 ? "s" : ""}`;
60
- }
61
-
62
- return output;
63
- };