eslint 9.4.0 → 9.6.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 (42) hide show
  1. package/README.md +3 -3
  2. package/conf/ecma-version.js +1 -1
  3. package/conf/globals.js +6 -1
  4. package/lib/api.js +1 -1
  5. package/lib/cli.js +23 -2
  6. package/lib/config/default-config.js +5 -0
  7. package/lib/config/flat-config-array.js +71 -8
  8. package/lib/config/flat-config-schema.js +46 -62
  9. package/lib/eslint/eslint-helpers.js +32 -17
  10. package/lib/eslint/eslint.js +30 -12
  11. package/lib/eslint/legacy-eslint.js +14 -0
  12. package/lib/languages/js/index.js +247 -0
  13. package/lib/{source-code → languages/js/source-code}/source-code.js +46 -22
  14. package/lib/languages/js/validate-language-options.js +181 -0
  15. package/lib/linter/apply-disable-directives.js +8 -3
  16. package/lib/linter/config-comment-parser.js +3 -16
  17. package/lib/linter/linter.js +291 -249
  18. package/lib/linter/report-translator.js +14 -7
  19. package/lib/linter/vfile.js +104 -0
  20. package/lib/options.js +13 -1
  21. package/lib/rule-tester/rule-tester.js +5 -2
  22. package/lib/rules/no-sparse-arrays.js +26 -3
  23. package/lib/rules/no-unused-vars.js +33 -31
  24. package/lib/shared/flags.js +26 -0
  25. package/lib/shared/logging.js +10 -1
  26. package/lib/shared/types.js +1 -1
  27. package/messages/all-matched-files-ignored.js +21 -0
  28. package/package.json +13 -18
  29. /package/lib/{source-code → languages/js/source-code}/index.js +0 -0
  30. /package/lib/{source-code → languages/js/source-code}/token-store/backward-token-comment-cursor.js +0 -0
  31. /package/lib/{source-code → languages/js/source-code}/token-store/backward-token-cursor.js +0 -0
  32. /package/lib/{source-code → languages/js/source-code}/token-store/cursor.js +0 -0
  33. /package/lib/{source-code → languages/js/source-code}/token-store/cursors.js +0 -0
  34. /package/lib/{source-code → languages/js/source-code}/token-store/decorative-cursor.js +0 -0
  35. /package/lib/{source-code → languages/js/source-code}/token-store/filter-cursor.js +0 -0
  36. /package/lib/{source-code → languages/js/source-code}/token-store/forward-token-comment-cursor.js +0 -0
  37. /package/lib/{source-code → languages/js/source-code}/token-store/forward-token-cursor.js +0 -0
  38. /package/lib/{source-code → languages/js/source-code}/token-store/index.js +0 -0
  39. /package/lib/{source-code → languages/js/source-code}/token-store/limit-cursor.js +0 -0
  40. /package/lib/{source-code → languages/js/source-code}/token-store/padded-token-cursor.js +0 -0
  41. /package/lib/{source-code → languages/js/source-code}/token-store/skip-cursor.js +0 -0
  42. /package/lib/{source-code → languages/js/source-code}/token-store/utils.js +0 -0
@@ -240,15 +240,22 @@ function mapSuggestions(descriptor, sourceCode, messages) {
240
240
  * @param {{start: SourceLocation, end: (SourceLocation|null)}} options.loc Start and end location
241
241
  * @param {{text: string, range: (number[]|null)}} options.fix The fix object
242
242
  * @param {Array<{text: string, range: (number[]|null)}>} options.suggestions The array of suggestions objects
243
+ * @param {Language} [options.language] The language to use to adjust line and column offsets.
243
244
  * @returns {LintMessage} Information about the report
244
245
  */
245
246
  function createProblem(options) {
247
+ const { language } = options;
248
+
249
+ // calculate offsets based on the language in use
250
+ const columnOffset = language.columnStart === 1 ? 0 : 1;
251
+ const lineOffset = language.lineStart === 1 ? 0 : 1;
252
+
246
253
  const problem = {
247
254
  ruleId: options.ruleId,
248
255
  severity: options.severity,
249
256
  message: options.message,
250
- line: options.loc.start.line,
251
- column: options.loc.start.column + 1,
257
+ line: options.loc.start.line + lineOffset,
258
+ column: options.loc.start.column + columnOffset,
252
259
  nodeType: options.node && options.node.type || null
253
260
  };
254
261
 
@@ -261,8 +268,8 @@ function createProblem(options) {
261
268
  }
262
269
 
263
270
  if (options.loc.end) {
264
- problem.endLine = options.loc.end.line;
265
- problem.endColumn = options.loc.end.column + 1;
271
+ problem.endLine = options.loc.end.line + lineOffset;
272
+ problem.endColumn = options.loc.end.column + columnOffset;
266
273
  }
267
274
 
268
275
  if (options.fix) {
@@ -313,8 +320,7 @@ function validateSuggestions(suggest, messages) {
313
320
  /**
314
321
  * Returns a function that converts the arguments of a `context.report` call from a rule into a reported
315
322
  * problem for the Node.js API.
316
- * @param {{ruleId: string, severity: number, sourceCode: SourceCode, messageIds: Object, disableFixes: boolean}} metadata Metadata for the reported problem
317
- * @param {SourceCode} sourceCode The `SourceCode` instance for the text being linted
323
+ * @param {{ruleId: string, severity: number, sourceCode: SourceCode, messageIds: Object, disableFixes: boolean, language:Language}} metadata Metadata for the reported problem
318
324
  * @returns {function(...args): LintMessage} Function that returns information about the report
319
325
  */
320
326
 
@@ -363,7 +369,8 @@ module.exports = function createReportTranslator(metadata) {
363
369
  messageId: descriptor.messageId,
364
370
  loc: normalizeReportLoc(descriptor),
365
371
  fix: metadata.disableFixes ? null : normalizeFixes(descriptor, metadata.sourceCode),
366
- suggestions: metadata.disableFixes ? [] : mapSuggestions(descriptor, metadata.sourceCode, messages)
372
+ suggestions: metadata.disableFixes ? [] : mapSuggestions(descriptor, metadata.sourceCode, messages),
373
+ language: metadata.language
367
374
  });
368
375
  };
369
376
  };
@@ -0,0 +1,104 @@
1
+ /**
2
+ * @fileoverview Virtual file
3
+ * @author Nicholas C. Zakas
4
+ */
5
+
6
+ "use strict";
7
+
8
+ //------------------------------------------------------------------------------
9
+ // Helpers
10
+ //------------------------------------------------------------------------------
11
+
12
+ /**
13
+ * Determines if a given value has a byte order mark (BOM).
14
+ * @param {string|Uint8Array} value The value to check.
15
+ * @returns {boolean} `true` if the value has a BOM, `false` otherwise.
16
+ */
17
+ function hasUnicodeBOM(value) {
18
+ return typeof value === "string"
19
+ ? value.charCodeAt(0) === 0xFEFF
20
+ : value[0] === 0xEF && value[1] === 0xBB && value[2] === 0xBF;
21
+ }
22
+
23
+ /**
24
+ * Strips Unicode BOM from the given value.
25
+ * @param {string|Uint8Array} value The value to remove the BOM from.
26
+ * @returns {string|Uint8Array} The stripped value.
27
+ */
28
+ function stripUnicodeBOM(value) {
29
+
30
+ if (!hasUnicodeBOM(value)) {
31
+ return value;
32
+ }
33
+
34
+ if (typeof value === "string") {
35
+
36
+ /*
37
+ * Check Unicode BOM.
38
+ * In JavaScript, string data is stored as UTF-16, so BOM is 0xFEFF.
39
+ * http://www.ecma-international.org/ecma-262/6.0/#sec-unicode-format-control-characters
40
+ */
41
+ return value.slice(1);
42
+ }
43
+
44
+ /*
45
+ * In a Uint8Array, the BOM is represented by three bytes: 0xEF, 0xBB, and 0xBF,
46
+ * so we can just remove the first three bytes.
47
+ */
48
+ return value.slice(3);
49
+ }
50
+
51
+ //------------------------------------------------------------------------------
52
+ // Exports
53
+ //------------------------------------------------------------------------------
54
+
55
+ /**
56
+ * Represents a virtual file inside of ESLint.
57
+ */
58
+ class VFile {
59
+
60
+ /**
61
+ * The file path including any processor-created virtual path.
62
+ * @type {string}
63
+ * @readonly
64
+ */
65
+ path;
66
+
67
+ /**
68
+ * The file path on disk.
69
+ * @type {string}
70
+ * @readonly
71
+ */
72
+ physicalPath;
73
+
74
+ /**
75
+ * The file contents.
76
+ * @type {string|Uint8Array}
77
+ * @readonly
78
+ */
79
+ body;
80
+
81
+ /**
82
+ * Indicates whether the file has a byte order mark (BOM).
83
+ * @type {boolean}
84
+ * @readonly
85
+ */
86
+ bom;
87
+
88
+ /**
89
+ * Creates a new instance.
90
+ * @param {string} path The file path.
91
+ * @param {string|Uint8Array} body The file contents.
92
+ * @param {Object} [options] Additional options.
93
+ * @param {string} [options.physicalPath] The file path on disk.
94
+ */
95
+ constructor(path, body, { physicalPath } = {}) {
96
+ this.path = path;
97
+ this.physicalPath = physicalPath ?? path;
98
+ this.bom = hasUnicodeBOM(body);
99
+ this.body = stripUnicodeBOM(body);
100
+ }
101
+
102
+ }
103
+
104
+ module.exports = { VFile };
package/lib/options.js CHANGED
@@ -30,6 +30,7 @@ const optionator = require("optionator");
30
30
  * @property {boolean} errorOnUnmatchedPattern Prevent errors when pattern is unmatched
31
31
  * @property {boolean} eslintrc Disable use of configuration from .eslintrc.*
32
32
  * @property {string[]} [ext] Specify JavaScript file extensions
33
+ * @property {string[]} [flag] Feature flags
33
34
  * @property {boolean} fix Automatically fix problems
34
35
  * @property {boolean} fixDryRun Automatically fix problems without saving the changes to the file system
35
36
  * @property {("directive" | "problem" | "suggestion" | "layout")[]} [fixType] Specify the types of fixes to apply (directive, problem, suggestion, layout)
@@ -176,6 +177,16 @@ module.exports = function(usingFlatConfig) {
176
177
  };
177
178
  }
178
179
 
180
+ let flagFlag;
181
+
182
+ if (usingFlatConfig) {
183
+ flagFlag = {
184
+ option: "flag",
185
+ type: "[String]",
186
+ description: "Enable a feature flag"
187
+ };
188
+ }
189
+
179
190
  return optionator({
180
191
  prepend: "eslint [options] file.js [file.js] [dir]",
181
192
  defaults: {
@@ -424,7 +435,8 @@ module.exports = function(usingFlatConfig) {
424
435
  type: "path::String",
425
436
  description: "Print the configuration for the given file"
426
437
  },
427
- statsFlag
438
+ statsFlag,
439
+ flagFlag
428
440
  ].filter(value => !!value)
429
441
  });
430
442
  };
@@ -27,10 +27,11 @@ const { defaultConfig } = require("../config/default-config");
27
27
  const ajv = require("../shared/ajv")({ strictDefaults: true });
28
28
 
29
29
  const parserSymbol = Symbol.for("eslint.RuleTester.parser");
30
- const { SourceCode } = require("../source-code");
31
30
  const { ConfigArraySymbol } = require("@eslint/config-array");
32
31
  const { isSerializable } = require("../shared/serialization");
33
32
 
33
+ const { SourceCode } = require("../languages/js/source-code");
34
+
34
35
  //------------------------------------------------------------------------------
35
36
  // Typedefs
36
37
  //------------------------------------------------------------------------------
@@ -591,7 +592,8 @@ class RuleTester {
591
592
  * here, just use the default one to keep that performance
592
593
  * enhancement.
593
594
  */
594
- rules: defaultConfig[0].plugins["@"].rules
595
+ rules: defaultConfig[0].plugins["@"].rules,
596
+ languages: defaultConfig[0].plugins["@"].languages
595
597
  },
596
598
  "rule-to-test": {
597
599
  rules: {
@@ -611,6 +613,7 @@ class RuleTester {
611
613
  }
612
614
  }
613
615
  },
616
+ language: defaultConfig[0].language,
614
617
  languageOptions: {
615
618
  ...defaultConfig[0].languageOptions
616
619
  }
@@ -4,6 +4,8 @@
4
4
  */
5
5
  "use strict";
6
6
 
7
+ const astUtils = require("./utils/ast-utils");
8
+
7
9
  //------------------------------------------------------------------------------
8
10
  // Rule Definition
9
11
  //------------------------------------------------------------------------------
@@ -36,11 +38,32 @@ module.exports = {
36
38
  return {
37
39
 
38
40
  ArrayExpression(node) {
41
+ if (!node.elements.includes(null)) {
42
+ return;
43
+ }
44
+
45
+ const { sourceCode } = context;
46
+ let commaToken;
47
+
48
+ for (const [index, element] of node.elements.entries()) {
49
+ if (index === node.elements.length - 1 && element) {
50
+ return;
51
+ }
52
+
53
+ commaToken = sourceCode.getTokenAfter(
54
+ element ?? commaToken ?? sourceCode.getFirstToken(node),
55
+ astUtils.isCommaToken
56
+ );
39
57
 
40
- const emptySpot = node.elements.includes(null);
58
+ if (element) {
59
+ continue;
60
+ }
41
61
 
42
- if (emptySpot) {
43
- context.report({ node, messageId: "unexpectedSparseArray" });
62
+ context.report({
63
+ node,
64
+ loc: commaToken.loc,
65
+ messageId: "unexpectedSparseArray"
66
+ });
44
67
  }
45
68
  }
46
69
 
@@ -147,6 +147,36 @@ module.exports = {
147
147
  }
148
148
  }
149
149
 
150
+ /**
151
+ * Determines what variable type a def is.
152
+ * @param {Object} def the declaration to check
153
+ * @returns {VariableType} a simple name for the types of variables that this rule supports
154
+ */
155
+ function defToVariableType(def) {
156
+
157
+ /*
158
+ * This `destructuredArrayIgnorePattern` error report works differently from the catch
159
+ * clause and parameter error reports. _Both_ the `varsIgnorePattern` and the
160
+ * `destructuredArrayIgnorePattern` will be checked for array destructuring. However,
161
+ * for the purposes of the report, the currently defined behavior is to only inform the
162
+ * user of the `destructuredArrayIgnorePattern` if it's present (regardless of the fact
163
+ * that the `varsIgnorePattern` would also apply). If it's not present, the user will be
164
+ * informed of the `varsIgnorePattern`, assuming that's present.
165
+ */
166
+ if (config.destructuredArrayIgnorePattern && def.name.parent.type === "ArrayPattern") {
167
+ return "array-destructure";
168
+ }
169
+
170
+ switch (def.type) {
171
+ case "CatchClause":
172
+ return "catch-clause";
173
+ case "Parameter":
174
+ return "parameter";
175
+ default:
176
+ return "variable";
177
+ }
178
+ }
179
+
150
180
  /**
151
181
  * Gets a given variable's description and configured ignore pattern
152
182
  * based on the provided variableType
@@ -167,7 +197,7 @@ module.exports = {
167
197
 
168
198
  case "catch-clause":
169
199
  pattern = config.caughtErrorsIgnorePattern;
170
- variableDescription = "args";
200
+ variableDescription = "caught errors";
171
201
  break;
172
202
 
173
203
  case "parameter":
@@ -202,28 +232,7 @@ module.exports = {
202
232
  let additionalMessageData = "";
203
233
 
204
234
  if (def) {
205
- let pattern;
206
- let variableDescription;
207
-
208
- switch (def.type) {
209
- case "CatchClause":
210
- if (config.caughtErrorsIgnorePattern) {
211
- [variableDescription, pattern] = getVariableDescription("catch-clause");
212
- }
213
- break;
214
-
215
- case "Parameter":
216
- if (config.argsIgnorePattern) {
217
- [variableDescription, pattern] = getVariableDescription("parameter");
218
- }
219
- break;
220
-
221
- default:
222
- if (config.varsIgnorePattern) {
223
- [variableDescription, pattern] = getVariableDescription("variable");
224
- }
225
- break;
226
- }
235
+ const [variableDescription, pattern] = getVariableDescription(defToVariableType(def));
227
236
 
228
237
  if (pattern && variableDescription) {
229
238
  additionalMessageData = `. Allowed unused ${variableDescription} must match ${pattern}`;
@@ -248,14 +257,7 @@ module.exports = {
248
257
  let additionalMessageData = "";
249
258
 
250
259
  if (def) {
251
- let pattern;
252
- let variableDescription;
253
-
254
- if (def.name.parent.type === "ArrayPattern" && config.destructuredArrayIgnorePattern) {
255
- [variableDescription, pattern] = getVariableDescription("array-destructure");
256
- } else if (config.varsIgnorePattern) {
257
- [variableDescription, pattern] = getVariableDescription("variable");
258
- }
260
+ const [variableDescription, pattern] = getVariableDescription(defToVariableType(def));
259
261
 
260
262
  if (pattern && variableDescription) {
261
263
  additionalMessageData = `. Allowed unused ${variableDescription} must match ${pattern}`;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @fileoverview Shared flags for ESLint.
3
+ */
4
+
5
+ "use strict";
6
+
7
+ /**
8
+ * The set of flags that change ESLint behavior with a description.
9
+ * @type {Map<string, string>}
10
+ */
11
+ const activeFlags = new Map([
12
+ ["test_only", "This flag is only used for testing."]
13
+ ]);
14
+
15
+ /**
16
+ * The set of flags that used to be active but no longer have an effect.
17
+ * @type {Map<string, string>}
18
+ */
19
+ const inactiveFlags = new Map([
20
+ ["test_only_old", "This flag is no longer used for testing."]
21
+ ]);
22
+
23
+ module.exports = {
24
+ activeFlags,
25
+ inactiveFlags
26
+ };
@@ -11,7 +11,7 @@
11
11
  module.exports = {
12
12
 
13
13
  /**
14
- * Cover for console.log
14
+ * Cover for console.info
15
15
  * @param {...any} args The elements to log.
16
16
  * @returns {void}
17
17
  */
@@ -19,6 +19,15 @@ module.exports = {
19
19
  console.log(...args);
20
20
  },
21
21
 
22
+ /**
23
+ * Cover for console.warn
24
+ * @param {...any} args The elements to log.
25
+ * @returns {void}
26
+ */
27
+ warn(...args) {
28
+ console.warn(...args);
29
+ },
30
+
22
31
  /**
23
32
  * Cover for console.error
24
33
  * @param {...any} args The elements to log.
@@ -21,7 +21,7 @@ module.exports = {};
21
21
  /**
22
22
  * @typedef {Object} ParserOptions
23
23
  * @property {EcmaFeatures} [ecmaFeatures] The optional features.
24
- * @property {3|5|6|7|8|9|10|11|12|13|14|15|2015|2016|2017|2018|2019|2020|2021|2022|2023|2024} [ecmaVersion] The ECMAScript version (or revision number).
24
+ * @property {3|5|6|7|8|9|10|11|12|13|14|15|16|2015|2016|2017|2018|2019|2020|2021|2022|2023|2024|2025} [ecmaVersion] The ECMAScript version (or revision number).
25
25
  * @property {"script"|"module"} [sourceType] The source code type.
26
26
  * @property {boolean} [allowReserved] Allowing the use of reserved words as identifiers in ES3.
27
27
  */
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ module.exports = function(it) {
4
+ const { pattern } = it;
5
+
6
+ return `
7
+ You are linting "${pattern}", but all of the files matching the glob pattern "${pattern}" are ignored.
8
+
9
+ If you don't want to lint these files, remove the pattern "${pattern}" from the list of arguments passed to ESLint.
10
+
11
+ If you do want to lint these files, explicitly list one or more of the files from this glob that you'd like to lint to see more details about why they are ignored.
12
+
13
+ * If the file is ignored because of a matching ignore pattern, check global ignores in your config file.
14
+ https://eslint.org/docs/latest/use/configure/ignore
15
+
16
+ * If the file is ignored because no matching configuration was supplied, check file patterns in your config file.
17
+ https://eslint.org/docs/latest/use/configure/configuration-files#specifying-files-with-arbitrary-extensions
18
+
19
+ * If the file is ignored because it is located outside of the base path, change the location of your config file to be in a parent directory.
20
+ `.trimStart();
21
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint",
3
- "version": "9.4.0",
3
+ "version": "9.6.0",
4
4
  "author": "Nicholas C. Zakas <nicholas+npm@nczconsulting.com>",
5
5
  "description": "An AST-based pattern checker for JavaScript.",
6
6
  "bin": {
@@ -62,15 +62,15 @@
62
62
  "messages"
63
63
  ],
64
64
  "repository": "eslint/eslint",
65
- "funding": "https://opencollective.com/eslint",
65
+ "funding": "https://eslint.org/donate",
66
66
  "homepage": "https://eslint.org",
67
67
  "bugs": "https://github.com/eslint/eslint/issues/",
68
68
  "dependencies": {
69
69
  "@eslint-community/eslint-utils": "^4.2.0",
70
70
  "@eslint-community/regexpp": "^4.6.1",
71
- "@eslint/config-array": "^0.15.1",
71
+ "@eslint/config-array": "^0.17.0",
72
72
  "@eslint/eslintrc": "^3.1.0",
73
- "@eslint/js": "9.4.0",
73
+ "@eslint/js": "9.6.0",
74
74
  "@humanwhocodes/module-importer": "^1.0.1",
75
75
  "@humanwhocodes/retry": "^0.3.0",
76
76
  "@nodelib/fs.walk": "^1.2.8",
@@ -81,8 +81,8 @@
81
81
  "escape-string-regexp": "^4.0.0",
82
82
  "eslint-scope": "^8.0.1",
83
83
  "eslint-visitor-keys": "^4.0.0",
84
- "espree": "^10.0.1",
85
- "esquery": "^1.4.2",
84
+ "espree": "^10.1.0",
85
+ "esquery": "^1.5.0",
86
86
  "esutils": "^2.0.2",
87
87
  "fast-deep-equal": "^3.1.3",
88
88
  "file-entry-cache": "^8.0.0",
@@ -104,14 +104,12 @@
104
104
  "devDependencies": {
105
105
  "@babel/core": "^7.4.3",
106
106
  "@babel/preset-env": "^7.4.3",
107
- "@eslint-community/eslint-plugin-eslint-comments": "^4.3.0",
108
107
  "@types/estree": "^1.0.5",
109
108
  "@types/node": "^20.11.5",
110
- "@wdio/browser-runner": "^8.14.6",
111
- "@wdio/cli": "^8.14.6",
112
- "@wdio/concise-reporter": "^8.14.0",
113
- "@wdio/globals": "^8.14.6",
114
- "@wdio/mocha-framework": "^8.14.0",
109
+ "@wdio/browser-runner": "^8.38.3",
110
+ "@wdio/cli": "^8.38.2",
111
+ "@wdio/concise-reporter": "^8.38.2",
112
+ "@wdio/mocha-framework": "^8.38.2",
115
113
  "babel-loader": "^8.0.5",
116
114
  "c8": "^7.12.0",
117
115
  "chai": "^4.0.1",
@@ -122,11 +120,8 @@
122
120
  "eslint": "file:.",
123
121
  "eslint-config-eslint": "file:packages/eslint-config-eslint",
124
122
  "eslint-plugin-eslint-plugin": "^6.0.0",
125
- "eslint-plugin-internal-rules": "file:tools/internal-rules",
126
- "eslint-plugin-jsdoc": "^48.2.3",
127
- "eslint-plugin-n": "^17.2.0",
128
- "eslint-plugin-unicorn": "^52.0.0",
129
123
  "eslint-release": "^3.2.2",
124
+ "eslint-rule-composer": "^0.3.0",
130
125
  "eslump": "^3.0.0",
131
126
  "esprima": "^4.0.1",
132
127
  "fast-glob": "^3.2.11",
@@ -136,13 +131,13 @@
136
131
  "got": "^11.8.3",
137
132
  "gray-matter": "^4.0.3",
138
133
  "js-yaml": "^4.1.0",
139
- "knip": "^5.8.0",
134
+ "knip": "^5.21.0",
140
135
  "lint-staged": "^11.0.0",
141
136
  "load-perf": "^0.2.0",
142
137
  "markdown-it": "^12.2.0",
143
138
  "markdown-it-container": "^3.0.0",
144
139
  "markdownlint": "^0.34.0",
145
- "markdownlint-cli": "^0.40.0",
140
+ "markdownlint-cli": "^0.41.0",
146
141
  "marked": "^4.0.8",
147
142
  "metascraper": "^5.25.7",
148
143
  "metascraper-description": "^5.25.7",