eslint 8.3.0 → 8.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 (302) hide show
  1. package/README.md +6 -16
  2. package/conf/globals.js +144 -0
  3. package/lib/cli.js +1 -1
  4. package/lib/config/default-config.js +11 -2
  5. package/lib/config/flat-config-array.js +2 -2
  6. package/lib/config/flat-config-helpers.js +67 -0
  7. package/lib/config/flat-config-schema.js +13 -8
  8. package/lib/config/rule-validator.js +28 -27
  9. package/lib/eslint/eslint.js +11 -3
  10. package/lib/linter/apply-disable-directives.js +20 -16
  11. package/lib/linter/linter.js +463 -49
  12. package/lib/options.js +6 -6
  13. package/lib/rule-tester/rule-tester.js +14 -0
  14. package/lib/rules/accessor-pairs.js +1 -0
  15. package/lib/rules/array-bracket-newline.js +1 -0
  16. package/lib/rules/array-bracket-spacing.js +1 -0
  17. package/lib/rules/array-callback-return.js +1 -0
  18. package/lib/rules/array-element-newline.js +1 -0
  19. package/lib/rules/arrow-body-style.js +1 -0
  20. package/lib/rules/arrow-parens.js +1 -0
  21. package/lib/rules/arrow-spacing.js +1 -0
  22. package/lib/rules/block-scoped-var.js +1 -0
  23. package/lib/rules/block-spacing.js +1 -0
  24. package/lib/rules/brace-style.js +1 -0
  25. package/lib/rules/callback-return.js +1 -0
  26. package/lib/rules/camelcase.js +1 -0
  27. package/lib/rules/capitalized-comments.js +1 -0
  28. package/lib/rules/class-methods-use-this.js +1 -0
  29. package/lib/rules/comma-dangle.js +1 -0
  30. package/lib/rules/comma-spacing.js +1 -0
  31. package/lib/rules/comma-style.js +1 -0
  32. package/lib/rules/complexity.js +1 -0
  33. package/lib/rules/computed-property-spacing.js +1 -0
  34. package/lib/rules/consistent-return.js +1 -0
  35. package/lib/rules/consistent-this.js +1 -0
  36. package/lib/rules/constructor-super.js +1 -0
  37. package/lib/rules/curly.js +1 -0
  38. package/lib/rules/default-case-last.js +1 -0
  39. package/lib/rules/default-case.js +1 -0
  40. package/lib/rules/default-param-last.js +1 -0
  41. package/lib/rules/dot-location.js +1 -0
  42. package/lib/rules/dot-notation.js +1 -0
  43. package/lib/rules/eol-last.js +1 -0
  44. package/lib/rules/eqeqeq.js +1 -0
  45. package/lib/rules/for-direction.js +1 -0
  46. package/lib/rules/func-call-spacing.js +1 -0
  47. package/lib/rules/func-name-matching.js +1 -0
  48. package/lib/rules/func-names.js +1 -0
  49. package/lib/rules/func-style.js +1 -0
  50. package/lib/rules/function-call-argument-newline.js +1 -0
  51. package/lib/rules/function-paren-newline.js +1 -0
  52. package/lib/rules/generator-star-spacing.js +1 -0
  53. package/lib/rules/getter-return.js +1 -0
  54. package/lib/rules/global-require.js +1 -0
  55. package/lib/rules/grouped-accessor-pairs.js +1 -0
  56. package/lib/rules/guard-for-in.js +1 -0
  57. package/lib/rules/handle-callback-err.js +1 -0
  58. package/lib/rules/id-blacklist.js +1 -0
  59. package/lib/rules/id-denylist.js +1 -0
  60. package/lib/rules/id-length.js +1 -0
  61. package/lib/rules/id-match.js +35 -0
  62. package/lib/rules/implicit-arrow-linebreak.js +1 -0
  63. package/lib/rules/indent-legacy.js +1 -0
  64. package/lib/rules/indent.js +1 -0
  65. package/lib/rules/index.js +1 -0
  66. package/lib/rules/init-declarations.js +1 -0
  67. package/lib/rules/jsx-quotes.js +1 -0
  68. package/lib/rules/key-spacing.js +1 -0
  69. package/lib/rules/keyword-spacing.js +1 -0
  70. package/lib/rules/line-comment-position.js +1 -0
  71. package/lib/rules/linebreak-style.js +1 -0
  72. package/lib/rules/lines-around-comment.js +1 -0
  73. package/lib/rules/lines-around-directive.js +1 -0
  74. package/lib/rules/lines-between-class-members.js +1 -0
  75. package/lib/rules/max-classes-per-file.js +1 -0
  76. package/lib/rules/max-depth.js +1 -0
  77. package/lib/rules/max-len.js +1 -0
  78. package/lib/rules/max-lines-per-function.js +1 -0
  79. package/lib/rules/max-lines.js +1 -0
  80. package/lib/rules/max-nested-callbacks.js +1 -0
  81. package/lib/rules/max-params.js +1 -0
  82. package/lib/rules/max-statements-per-line.js +1 -0
  83. package/lib/rules/max-statements.js +1 -0
  84. package/lib/rules/multiline-comment-style.js +1 -0
  85. package/lib/rules/multiline-ternary.js +1 -0
  86. package/lib/rules/new-cap.js +1 -0
  87. package/lib/rules/new-parens.js +1 -0
  88. package/lib/rules/newline-after-var.js +1 -0
  89. package/lib/rules/newline-before-return.js +1 -0
  90. package/lib/rules/newline-per-chained-call.js +1 -0
  91. package/lib/rules/no-alert.js +1 -0
  92. package/lib/rules/no-array-constructor.js +1 -0
  93. package/lib/rules/no-async-promise-executor.js +1 -0
  94. package/lib/rules/no-await-in-loop.js +1 -0
  95. package/lib/rules/no-bitwise.js +1 -0
  96. package/lib/rules/no-buffer-constructor.js +1 -0
  97. package/lib/rules/no-caller.js +1 -0
  98. package/lib/rules/no-case-declarations.js +1 -0
  99. package/lib/rules/no-catch-shadow.js +1 -0
  100. package/lib/rules/no-class-assign.js +1 -0
  101. package/lib/rules/no-compare-neg-zero.js +1 -0
  102. package/lib/rules/no-cond-assign.js +1 -0
  103. package/lib/rules/no-confusing-arrow.js +1 -0
  104. package/lib/rules/no-console.js +1 -0
  105. package/lib/rules/no-const-assign.js +1 -0
  106. package/lib/rules/no-constant-condition.js +4 -1
  107. package/lib/rules/no-constructor-return.js +1 -0
  108. package/lib/rules/no-continue.js +1 -0
  109. package/lib/rules/no-control-regex.js +1 -0
  110. package/lib/rules/no-debugger.js +1 -0
  111. package/lib/rules/no-delete-var.js +1 -0
  112. package/lib/rules/no-div-regex.js +1 -0
  113. package/lib/rules/no-dupe-args.js +1 -0
  114. package/lib/rules/no-dupe-class-members.js +1 -0
  115. package/lib/rules/no-dupe-else-if.js +1 -0
  116. package/lib/rules/no-dupe-keys.js +1 -0
  117. package/lib/rules/no-duplicate-case.js +1 -0
  118. package/lib/rules/no-duplicate-imports.js +1 -0
  119. package/lib/rules/no-else-return.js +1 -0
  120. package/lib/rules/no-empty-character-class.js +1 -0
  121. package/lib/rules/no-empty-function.js +1 -0
  122. package/lib/rules/no-empty-pattern.js +1 -0
  123. package/lib/rules/no-empty.js +1 -0
  124. package/lib/rules/no-eq-null.js +1 -0
  125. package/lib/rules/no-eval.js +1 -0
  126. package/lib/rules/no-ex-assign.js +1 -0
  127. package/lib/rules/no-extend-native.js +1 -0
  128. package/lib/rules/no-extra-bind.js +1 -0
  129. package/lib/rules/no-extra-boolean-cast.js +1 -0
  130. package/lib/rules/no-extra-label.js +1 -0
  131. package/lib/rules/no-extra-parens.js +1 -0
  132. package/lib/rules/no-extra-semi.js +1 -0
  133. package/lib/rules/no-fallthrough.js +1 -0
  134. package/lib/rules/no-floating-decimal.js +1 -0
  135. package/lib/rules/no-func-assign.js +1 -0
  136. package/lib/rules/no-global-assign.js +1 -0
  137. package/lib/rules/no-implicit-coercion.js +1 -0
  138. package/lib/rules/no-implicit-globals.js +1 -0
  139. package/lib/rules/no-implied-eval.js +1 -0
  140. package/lib/rules/no-import-assign.js +1 -0
  141. package/lib/rules/no-inline-comments.js +1 -0
  142. package/lib/rules/no-inner-declarations.js +1 -0
  143. package/lib/rules/no-invalid-regexp.js +1 -0
  144. package/lib/rules/no-invalid-this.js +1 -0
  145. package/lib/rules/no-irregular-whitespace.js +1 -0
  146. package/lib/rules/no-iterator.js +1 -0
  147. package/lib/rules/no-label-var.js +1 -0
  148. package/lib/rules/no-labels.js +1 -0
  149. package/lib/rules/no-lone-blocks.js +1 -0
  150. package/lib/rules/no-lonely-if.js +1 -0
  151. package/lib/rules/no-loop-func.js +1 -0
  152. package/lib/rules/no-loss-of-precision.js +1 -0
  153. package/lib/rules/no-magic-numbers.js +1 -0
  154. package/lib/rules/no-misleading-character-class.js +1 -0
  155. package/lib/rules/no-mixed-operators.js +1 -0
  156. package/lib/rules/no-mixed-requires.js +1 -0
  157. package/lib/rules/no-mixed-spaces-and-tabs.js +1 -0
  158. package/lib/rules/no-multi-assign.js +1 -0
  159. package/lib/rules/no-multi-spaces.js +1 -0
  160. package/lib/rules/no-multi-str.js +1 -0
  161. package/lib/rules/no-multiple-empty-lines.js +1 -0
  162. package/lib/rules/no-native-reassign.js +1 -0
  163. package/lib/rules/no-negated-condition.js +1 -0
  164. package/lib/rules/no-negated-in-lhs.js +1 -0
  165. package/lib/rules/no-nested-ternary.js +1 -0
  166. package/lib/rules/no-new-func.js +1 -0
  167. package/lib/rules/no-new-object.js +1 -0
  168. package/lib/rules/no-new-require.js +1 -0
  169. package/lib/rules/no-new-symbol.js +1 -0
  170. package/lib/rules/no-new-wrappers.js +1 -0
  171. package/lib/rules/no-new.js +1 -0
  172. package/lib/rules/no-nonoctal-decimal-escape.js +1 -0
  173. package/lib/rules/no-obj-calls.js +1 -0
  174. package/lib/rules/no-octal-escape.js +1 -0
  175. package/lib/rules/no-octal.js +1 -0
  176. package/lib/rules/no-param-reassign.js +1 -0
  177. package/lib/rules/no-path-concat.js +1 -0
  178. package/lib/rules/no-plusplus.js +1 -0
  179. package/lib/rules/no-process-env.js +1 -0
  180. package/lib/rules/no-process-exit.js +1 -0
  181. package/lib/rules/no-promise-executor-return.js +1 -0
  182. package/lib/rules/no-proto.js +1 -0
  183. package/lib/rules/no-prototype-builtins.js +1 -0
  184. package/lib/rules/no-redeclare.js +1 -0
  185. package/lib/rules/no-regex-spaces.js +1 -0
  186. package/lib/rules/no-restricted-exports.js +1 -0
  187. package/lib/rules/no-restricted-globals.js +1 -0
  188. package/lib/rules/no-restricted-imports.js +1 -0
  189. package/lib/rules/no-restricted-modules.js +1 -0
  190. package/lib/rules/no-restricted-properties.js +1 -0
  191. package/lib/rules/no-restricted-syntax.js +1 -0
  192. package/lib/rules/no-return-assign.js +1 -0
  193. package/lib/rules/no-return-await.js +1 -0
  194. package/lib/rules/no-script-url.js +1 -0
  195. package/lib/rules/no-self-assign.js +2 -1
  196. package/lib/rules/no-self-compare.js +1 -0
  197. package/lib/rules/no-sequences.js +1 -0
  198. package/lib/rules/no-setter-return.js +1 -0
  199. package/lib/rules/no-shadow-restricted-names.js +1 -0
  200. package/lib/rules/no-shadow.js +1 -0
  201. package/lib/rules/no-spaced-func.js +1 -0
  202. package/lib/rules/no-sparse-arrays.js +1 -0
  203. package/lib/rules/no-sync.js +1 -0
  204. package/lib/rules/no-tabs.js +1 -0
  205. package/lib/rules/no-template-curly-in-string.js +1 -0
  206. package/lib/rules/no-ternary.js +1 -0
  207. package/lib/rules/no-this-before-super.js +1 -0
  208. package/lib/rules/no-throw-literal.js +1 -0
  209. package/lib/rules/no-trailing-spaces.js +1 -0
  210. package/lib/rules/no-undef-init.js +1 -0
  211. package/lib/rules/no-undef.js +1 -0
  212. package/lib/rules/no-undefined.js +1 -0
  213. package/lib/rules/no-underscore-dangle.js +1 -0
  214. package/lib/rules/no-unexpected-multiline.js +1 -0
  215. package/lib/rules/no-unmodified-loop-condition.js +1 -0
  216. package/lib/rules/no-unneeded-ternary.js +1 -0
  217. package/lib/rules/no-unreachable-loop.js +1 -0
  218. package/lib/rules/no-unreachable.js +1 -0
  219. package/lib/rules/no-unsafe-finally.js +1 -0
  220. package/lib/rules/no-unsafe-negation.js +1 -0
  221. package/lib/rules/no-unsafe-optional-chaining.js +1 -0
  222. package/lib/rules/no-unused-expressions.js +1 -0
  223. package/lib/rules/no-unused-labels.js +1 -0
  224. package/lib/rules/no-unused-private-class-members.js +1 -0
  225. package/lib/rules/no-unused-vars.js +1 -0
  226. package/lib/rules/no-use-before-define.js +1 -0
  227. package/lib/rules/no-useless-backreference.js +1 -0
  228. package/lib/rules/no-useless-call.js +1 -0
  229. package/lib/rules/no-useless-catch.js +1 -0
  230. package/lib/rules/no-useless-computed-key.js +1 -0
  231. package/lib/rules/no-useless-concat.js +1 -0
  232. package/lib/rules/no-useless-constructor.js +1 -0
  233. package/lib/rules/no-useless-escape.js +1 -0
  234. package/lib/rules/no-useless-rename.js +1 -0
  235. package/lib/rules/no-useless-return.js +1 -0
  236. package/lib/rules/no-var.js +1 -0
  237. package/lib/rules/no-void.js +1 -0
  238. package/lib/rules/no-warning-comments.js +1 -0
  239. package/lib/rules/no-whitespace-before-property.js +1 -0
  240. package/lib/rules/no-with.js +1 -0
  241. package/lib/rules/nonblock-statement-body-position.js +1 -0
  242. package/lib/rules/object-curly-newline.js +1 -0
  243. package/lib/rules/object-curly-spacing.js +1 -0
  244. package/lib/rules/object-property-newline.js +1 -0
  245. package/lib/rules/object-shorthand.js +1 -0
  246. package/lib/rules/one-var-declaration-per-line.js +1 -0
  247. package/lib/rules/one-var.js +1 -0
  248. package/lib/rules/operator-assignment.js +1 -0
  249. package/lib/rules/operator-linebreak.js +1 -0
  250. package/lib/rules/padded-blocks.js +1 -0
  251. package/lib/rules/padding-line-between-statements.js +1 -0
  252. package/lib/rules/prefer-arrow-callback.js +1 -0
  253. package/lib/rules/prefer-const.js +1 -0
  254. package/lib/rules/prefer-destructuring.js +1 -0
  255. package/lib/rules/prefer-exponentiation-operator.js +1 -0
  256. package/lib/rules/prefer-named-capture-group.js +1 -0
  257. package/lib/rules/prefer-numeric-literals.js +1 -0
  258. package/lib/rules/prefer-object-has-own.js +112 -0
  259. package/lib/rules/prefer-object-spread.js +1 -0
  260. package/lib/rules/prefer-promise-reject-errors.js +1 -0
  261. package/lib/rules/prefer-reflect.js +1 -0
  262. package/lib/rules/prefer-regex-literals.js +218 -1
  263. package/lib/rules/prefer-rest-params.js +1 -0
  264. package/lib/rules/prefer-spread.js +1 -0
  265. package/lib/rules/prefer-template.js +2 -1
  266. package/lib/rules/quote-props.js +1 -0
  267. package/lib/rules/quotes.js +1 -0
  268. package/lib/rules/radix.js +1 -0
  269. package/lib/rules/require-atomic-updates.js +1 -0
  270. package/lib/rules/require-await.js +1 -0
  271. package/lib/rules/require-jsdoc.js +1 -0
  272. package/lib/rules/require-unicode-regexp.js +1 -0
  273. package/lib/rules/require-yield.js +1 -0
  274. package/lib/rules/rest-spread-spacing.js +1 -0
  275. package/lib/rules/semi-spacing.js +1 -0
  276. package/lib/rules/semi-style.js +1 -0
  277. package/lib/rules/semi.js +1 -0
  278. package/lib/rules/sort-imports.js +1 -0
  279. package/lib/rules/sort-keys.js +1 -0
  280. package/lib/rules/sort-vars.js +1 -0
  281. package/lib/rules/space-before-blocks.js +1 -0
  282. package/lib/rules/space-before-function-paren.js +1 -0
  283. package/lib/rules/space-in-parens.js +1 -0
  284. package/lib/rules/space-infix-ops.js +1 -0
  285. package/lib/rules/space-unary-ops.js +1 -0
  286. package/lib/rules/spaced-comment.js +1 -0
  287. package/lib/rules/strict.js +1 -0
  288. package/lib/rules/switch-colon-spacing.js +1 -0
  289. package/lib/rules/symbol-description.js +1 -0
  290. package/lib/rules/template-curly-spacing.js +1 -0
  291. package/lib/rules/template-tag-spacing.js +1 -0
  292. package/lib/rules/unicode-bom.js +1 -0
  293. package/lib/rules/use-isnan.js +1 -0
  294. package/lib/rules/valid-jsdoc.js +1 -0
  295. package/lib/rules/valid-typeof.js +1 -0
  296. package/lib/rules/vars-on-top.js +1 -0
  297. package/lib/rules/wrap-iife.js +1 -0
  298. package/lib/rules/wrap-regex.js +1 -0
  299. package/lib/rules/yield-star-spacing.js +1 -0
  300. package/lib/rules/yoda.js +1 -0
  301. package/lib/shared/types.js +10 -0
  302. package/package.json +7 -6
package/lib/options.js CHANGED
@@ -50,7 +50,7 @@ const optionator = require("optionator");
50
50
  * @property {boolean | undefined} reportUnusedDisableDirectives Adds reported errors for unused eslint-disable directives
51
51
  * @property {string} [resolvePluginsRelativeTo] A folder where plugins should be resolved from, CWD by default
52
52
  * @property {Object} [rule] Specify rules
53
- * @property {string[]} [rulesdir] Use additional rules from this directory
53
+ * @property {string[]} [rulesdir] Load additional rules from this directory. Deprecated: Use rules from plugins
54
54
  * @property {boolean} stdin Lint code provided on <STDIN>
55
55
  * @property {string} [stdinFilename] Specify filename to process STDIN as
56
56
  * @property {boolean} quiet Report errors only
@@ -118,11 +118,6 @@ module.exports = optionator({
118
118
  {
119
119
  heading: "Specifying rules and plugins"
120
120
  },
121
- {
122
- option: "rulesdir",
123
- type: "[path::String]",
124
- description: "Use additional rules from this directory"
125
- },
126
121
  {
127
122
  option: "plugin",
128
123
  type: "[String]",
@@ -133,6 +128,11 @@ module.exports = optionator({
133
128
  type: "Object",
134
129
  description: "Specify rules"
135
130
  },
131
+ {
132
+ option: "rulesdir",
133
+ type: "[path::String]",
134
+ description: "Load additional rules from this directory. Deprecated: Use rules from plugins"
135
+ },
136
136
  {
137
137
  heading: "Fixing problems"
138
138
  },
@@ -216,6 +216,9 @@ function freezeDeeply(x) {
216
216
  * @returns {string} The sanitized text.
217
217
  */
218
218
  function sanitize(text) {
219
+ if (typeof text !== "string") {
220
+ return "";
221
+ }
219
222
  return text.replace(
220
223
  /[\u0000-\u0009\u000b-\u001a]/gu, // eslint-disable-line no-control-regex -- Escaping controls
221
224
  c => `\\u${c.codePointAt(0).toString(16).padStart(4, "0")}`
@@ -691,6 +694,13 @@ class RuleTester {
691
694
  * @private
692
695
  */
693
696
  function testValidTemplate(item) {
697
+ const code = typeof item === "object" ? item.code : item;
698
+
699
+ assert.ok(typeof code === "string", "Test case must specify a string value for 'code'");
700
+ if (item.name) {
701
+ assert.ok(typeof item.name === "string", "Optional test case property 'name' must be a string");
702
+ }
703
+
694
704
  const result = runRuleForItem(item);
695
705
  const messages = result.messages;
696
706
 
@@ -731,6 +741,10 @@ class RuleTester {
731
741
  * @private
732
742
  */
733
743
  function testInvalidTemplate(item) {
744
+ assert.ok(typeof item.code === "string", "Test case must specify a string value for 'code'");
745
+ if (item.name) {
746
+ assert.ok(typeof item.name === "string", "Optional test case property 'name' must be a string");
747
+ }
734
748
  assert.ok(item.errors || item.errors === 0,
735
749
  `Did not specify errors for an invalid test of ${ruleName}`);
736
750
 
@@ -134,6 +134,7 @@ function isPropertyDescriptor(node) {
134
134
  // Rule Definition
135
135
  //------------------------------------------------------------------------------
136
136
 
137
+ /** @type {import('../shared/types').Rule} */
137
138
  module.exports = {
138
139
  meta: {
139
140
  type: "suggestion",
@@ -11,6 +11,7 @@ const astUtils = require("./utils/ast-utils");
11
11
  // Rule Definition
12
12
  //------------------------------------------------------------------------------
13
13
 
14
+ /** @type {import('../shared/types').Rule} */
14
15
  module.exports = {
15
16
  meta: {
16
17
  type: "layout",
@@ -10,6 +10,7 @@ const astUtils = require("./utils/ast-utils");
10
10
  // Rule Definition
11
11
  //------------------------------------------------------------------------------
12
12
 
13
+ /** @type {import('../shared/types').Rule} */
13
14
  module.exports = {
14
15
  meta: {
15
16
  type: "layout",
@@ -133,6 +133,7 @@ function getArrayMethodName(node) {
133
133
  // Rule Definition
134
134
  //------------------------------------------------------------------------------
135
135
 
136
+ /** @type {import('../shared/types').Rule} */
136
137
  module.exports = {
137
138
  meta: {
138
139
  type: "problem",
@@ -11,6 +11,7 @@ const astUtils = require("./utils/ast-utils");
11
11
  // Rule Definition
12
12
  //------------------------------------------------------------------------------
13
13
 
14
+ /** @type {import('../shared/types').Rule} */
14
15
  module.exports = {
15
16
  meta: {
16
17
  type: "layout",
@@ -14,6 +14,7 @@ const astUtils = require("./utils/ast-utils");
14
14
  // Rule Definition
15
15
  //------------------------------------------------------------------------------
16
16
 
17
+ /** @type {import('../shared/types').Rule} */
17
18
  module.exports = {
18
19
  meta: {
19
20
  type: "suggestion",
@@ -27,6 +27,7 @@ function hasBlockBody(node) {
27
27
  // Rule Definition
28
28
  //------------------------------------------------------------------------------
29
29
 
30
+ /** @type {import('../shared/types').Rule} */
30
31
  module.exports = {
31
32
  meta: {
32
33
  type: "layout",
@@ -14,6 +14,7 @@ const astUtils = require("./utils/ast-utils");
14
14
  // Rule Definition
15
15
  //------------------------------------------------------------------------------
16
16
 
17
+ /** @type {import('../shared/types').Rule} */
17
18
  module.exports = {
18
19
  meta: {
19
20
  type: "layout",
@@ -8,6 +8,7 @@
8
8
  // Rule Definition
9
9
  //------------------------------------------------------------------------------
10
10
 
11
+ /** @type {import('../shared/types').Rule} */
11
12
  module.exports = {
12
13
  meta: {
13
14
  type: "suggestion",
@@ -11,6 +11,7 @@ const util = require("./utils/ast-utils");
11
11
  // Rule Definition
12
12
  //------------------------------------------------------------------------------
13
13
 
14
+ /** @type {import('../shared/types').Rule} */
14
15
  module.exports = {
15
16
  meta: {
16
17
  type: "layout",
@@ -11,6 +11,7 @@ const astUtils = require("./utils/ast-utils");
11
11
  // Rule Definition
12
12
  //------------------------------------------------------------------------------
13
13
 
14
+ /** @type {import('../shared/types').Rule} */
14
15
  module.exports = {
15
16
  meta: {
16
17
  type: "layout",
@@ -9,6 +9,7 @@
9
9
  // Rule Definition
10
10
  //------------------------------------------------------------------------------
11
11
 
12
+ /** @type {import('../shared/types').Rule} */
12
13
  module.exports = {
13
14
  meta: {
14
15
  deprecated: true,
@@ -9,6 +9,7 @@
9
9
  // Rule Definition
10
10
  //------------------------------------------------------------------------------
11
11
 
12
+ /** @type {import('../shared/types').Rule} */
12
13
  module.exports = {
13
14
  meta: {
14
15
  type: "suggestion",
@@ -99,6 +99,7 @@ function createRegExpForIgnorePatterns(normalizedOptions) {
99
99
  // Rule Definition
100
100
  //------------------------------------------------------------------------------
101
101
 
102
+ /** @type {import('../shared/types').Rule} */
102
103
  module.exports = {
103
104
  meta: {
104
105
  type: "suggestion",
@@ -15,6 +15,7 @@ const astUtils = require("./utils/ast-utils");
15
15
  // Rule Definition
16
16
  //------------------------------------------------------------------------------
17
17
 
18
+ /** @type {import('../shared/types').Rule} */
18
19
  module.exports = {
19
20
  meta: {
20
21
  type: "suggestion",
@@ -70,6 +70,7 @@ function normalizeOptions(optionValue, ecmaVersion) {
70
70
  // Rule Definition
71
71
  //------------------------------------------------------------------------------
72
72
 
73
+ /** @type {import('../shared/types').Rule} */
73
74
  module.exports = {
74
75
  meta: {
75
76
  type: "layout",
@@ -10,6 +10,7 @@ const astUtils = require("./utils/ast-utils");
10
10
  // Rule Definition
11
11
  //------------------------------------------------------------------------------
12
12
 
13
+ /** @type {import('../shared/types').Rule} */
13
14
  module.exports = {
14
15
  meta: {
15
16
  type: "layout",
@@ -11,6 +11,7 @@ const astUtils = require("./utils/ast-utils");
11
11
  // Rule Definition
12
12
  //------------------------------------------------------------------------------
13
13
 
14
+ /** @type {import('../shared/types').Rule} */
14
15
  module.exports = {
15
16
  meta: {
16
17
  type: "layout",
@@ -17,6 +17,7 @@ const { upperCaseFirst } = require("../shared/string-utils");
17
17
  // Rule Definition
18
18
  //------------------------------------------------------------------------------
19
19
 
20
+ /** @type {import('../shared/types').Rule} */
20
21
  module.exports = {
21
22
  meta: {
22
23
  type: "suggestion",
@@ -10,6 +10,7 @@ const astUtils = require("./utils/ast-utils");
10
10
  // Rule Definition
11
11
  //------------------------------------------------------------------------------
12
12
 
13
+ /** @type {import('../shared/types').Rule} */
13
14
  module.exports = {
14
15
  meta: {
15
16
  type: "layout",
@@ -40,6 +40,7 @@ function isClassConstructor(node) {
40
40
  // Rule Definition
41
41
  //------------------------------------------------------------------------------
42
42
 
43
+ /** @type {import('../shared/types').Rule} */
43
44
  module.exports = {
44
45
  meta: {
45
46
  type: "suggestion",
@@ -8,6 +8,7 @@
8
8
  // Rule Definition
9
9
  //------------------------------------------------------------------------------
10
10
 
11
+ /** @type {import('../shared/types').Rule} */
11
12
  module.exports = {
12
13
  meta: {
13
14
  type: "suggestion",
@@ -116,6 +116,7 @@ function isPossibleConstructor(node) {
116
116
  // Rule Definition
117
117
  //------------------------------------------------------------------------------
118
118
 
119
+ /** @type {import('../shared/types').Rule} */
119
120
  module.exports = {
120
121
  meta: {
121
122
  type: "problem",
@@ -14,6 +14,7 @@ const astUtils = require("./utils/ast-utils");
14
14
  // Rule Definition
15
15
  //------------------------------------------------------------------------------
16
16
 
17
+ /** @type {import('../shared/types').Rule} */
17
18
  module.exports = {
18
19
  meta: {
19
20
  type: "suggestion",
@@ -9,6 +9,7 @@
9
9
  // Rule Definition
10
10
  //------------------------------------------------------------------------------
11
11
 
12
+ /** @type {import('../shared/types').Rule} */
12
13
  module.exports = {
13
14
  meta: {
14
15
  type: "suggestion",
@@ -10,6 +10,7 @@ const DEFAULT_COMMENT_PATTERN = /^no default$/iu;
10
10
  // Rule Definition
11
11
  //------------------------------------------------------------------------------
12
12
 
13
+ /** @type {import('../shared/types').Rule} */
13
14
  module.exports = {
14
15
  meta: {
15
16
  type: "suggestion",
@@ -5,6 +5,7 @@
5
5
 
6
6
  "use strict";
7
7
 
8
+ /** @type {import('../shared/types').Rule} */
8
9
  module.exports = {
9
10
  meta: {
10
11
  type: "suggestion",
@@ -11,6 +11,7 @@ const astUtils = require("./utils/ast-utils");
11
11
  // Rule Definition
12
12
  //------------------------------------------------------------------------------
13
13
 
14
+ /** @type {import('../shared/types').Rule} */
14
15
  module.exports = {
15
16
  meta: {
16
17
  type: "layout",
@@ -20,6 +20,7 @@ const validIdentifier = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/u;
20
20
  // `null` literal must be handled separately.
21
21
  const literalTypesToCheck = new Set(["string", "boolean"]);
22
22
 
23
+ /** @type {import('../shared/types').Rule} */
23
24
  module.exports = {
24
25
  meta: {
25
26
  type: "suggestion",
@@ -8,6 +8,7 @@
8
8
  // Rule Definition
9
9
  //------------------------------------------------------------------------------
10
10
 
11
+ /** @type {import('../shared/types').Rule} */
11
12
  module.exports = {
12
13
  meta: {
13
14
  type: "layout",
@@ -15,6 +15,7 @@ const astUtils = require("./utils/ast-utils");
15
15
  // Rule Definition
16
16
  //------------------------------------------------------------------------------
17
17
 
18
+ /** @type {import('../shared/types').Rule} */
18
19
  module.exports = {
19
20
  meta: {
20
21
  type: "suggestion",
@@ -9,6 +9,7 @@
9
9
  // Rule Definition
10
10
  //------------------------------------------------------------------------------
11
11
 
12
+ /** @type {import('../shared/types').Rule} */
12
13
  module.exports = {
13
14
  meta: {
14
15
  type: "problem",
@@ -15,6 +15,7 @@ const astUtils = require("./utils/ast-utils");
15
15
  // Rule Definition
16
16
  //------------------------------------------------------------------------------
17
17
 
18
+ /** @type {import('../shared/types').Rule} */
18
19
  module.exports = {
19
20
  meta: {
20
21
  type: "layout",
@@ -68,6 +68,7 @@ const optionsObject = {
68
68
  additionalProperties: false
69
69
  };
70
70
 
71
+ /** @type {import('../shared/types').Rule} */
71
72
  module.exports = {
72
73
  meta: {
73
74
  type: "suggestion",
@@ -24,6 +24,7 @@ function isFunctionName(variable) {
24
24
  // Rule Definition
25
25
  //------------------------------------------------------------------------------
26
26
 
27
+ /** @type {import('../shared/types').Rule} */
27
28
  module.exports = {
28
29
  meta: {
29
30
  type: "suggestion",
@@ -8,6 +8,7 @@
8
8
  // Rule Definition
9
9
  //------------------------------------------------------------------------------
10
10
 
11
+ /** @type {import('../shared/types').Rule} */
11
12
  module.exports = {
12
13
  meta: {
13
14
  type: "suggestion",
@@ -9,6 +9,7 @@
9
9
  // Rule Definition
10
10
  //------------------------------------------------------------------------------
11
11
 
12
+ /** @type {import('../shared/types').Rule} */
12
13
  module.exports = {
13
14
  meta: {
14
15
  type: "layout",
@@ -14,6 +14,7 @@ const astUtils = require("./utils/ast-utils");
14
14
  // Rule Definition
15
15
  //------------------------------------------------------------------------------
16
16
 
17
+ /** @type {import('../shared/types').Rule} */
17
18
  module.exports = {
18
19
  meta: {
19
20
  type: "layout",
@@ -25,6 +25,7 @@ const OVERRIDE_SCHEMA = {
25
25
  ]
26
26
  };
27
27
 
28
+ /** @type {import('../shared/types').Rule} */
28
29
  module.exports = {
29
30
  meta: {
30
31
  type: "layout",
@@ -29,6 +29,7 @@ function isReachable(segment) {
29
29
  // Rule Definition
30
30
  //------------------------------------------------------------------------------
31
31
 
32
+ /** @type {import('../shared/types').Rule} */
32
33
  module.exports = {
33
34
  meta: {
34
35
  type: "problem",
@@ -48,6 +48,7 @@ function isShadowed(scope, node) {
48
48
  return reference && reference.resolved && reference.resolved.defs.length > 0;
49
49
  }
50
50
 
51
+ /** @type {import('../shared/types').Rule} */
51
52
  module.exports = {
52
53
  meta: {
53
54
  deprecated: true,
@@ -90,6 +90,7 @@ function isAccessorKind(node) {
90
90
  // Rule Definition
91
91
  //------------------------------------------------------------------------------
92
92
 
93
+ /** @type {import('../shared/types').Rule} */
93
94
  module.exports = {
94
95
  meta: {
95
96
  type: "suggestion",
@@ -9,6 +9,7 @@
9
9
  // Rule Definition
10
10
  //------------------------------------------------------------------------------
11
11
 
12
+ /** @type {import('../shared/types').Rule} */
12
13
  module.exports = {
13
14
  meta: {
14
15
  type: "suggestion",
@@ -10,6 +10,7 @@
10
10
  // Rule Definition
11
11
  //------------------------------------------------------------------------------
12
12
 
13
+ /** @type {import('../shared/types').Rule} */
13
14
  module.exports = {
14
15
  meta: {
15
16
  deprecated: true,
@@ -110,6 +110,7 @@ function isShorthandPropertyDefinition(node) {
110
110
  // Rule Definition
111
111
  //------------------------------------------------------------------------------
112
112
 
113
+ /** @type {import('../shared/types').Rule} */
113
114
  module.exports = {
114
115
  meta: {
115
116
  deprecated: true,
@@ -93,6 +93,7 @@ function isPropertyNameInDestructuring(node) {
93
93
  // Rule Definition
94
94
  //------------------------------------------------------------------------------
95
95
 
96
+ /** @type {import('../shared/types').Rule} */
96
97
  module.exports = {
97
98
  meta: {
98
99
  type: "suggestion",
@@ -10,6 +10,7 @@
10
10
  // Rule Definition
11
11
  //------------------------------------------------------------------------------
12
12
 
13
+ /** @type {import('../shared/types').Rule} */
13
14
  module.exports = {
14
15
  meta: {
15
16
  type: "suggestion",
@@ -9,6 +9,7 @@
9
9
  // Rule Definition
10
10
  //------------------------------------------------------------------------------
11
11
 
12
+ /** @type {import('../shared/types').Rule} */
12
13
  module.exports = {
13
14
  meta: {
14
15
  type: "suggestion",
@@ -66,6 +67,8 @@ module.exports = {
66
67
  onlyDeclarations = !!options.onlyDeclarations,
67
68
  ignoreDestructuring = !!options.ignoreDestructuring;
68
69
 
70
+ let globalScope;
71
+
69
72
  //--------------------------------------------------------------------------
70
73
  // Helpers
71
74
  //--------------------------------------------------------------------------
@@ -76,6 +79,19 @@ module.exports = {
76
79
  const DECLARATION_TYPES = new Set(["FunctionDeclaration", "VariableDeclarator"]);
77
80
  const IMPORT_TYPES = new Set(["ImportSpecifier", "ImportNamespaceSpecifier", "ImportDefaultSpecifier"]);
78
81
 
82
+ /**
83
+ * Checks whether the given node represents a reference to a global variable that is not declared in the source code.
84
+ * These identifiers will be allowed, as it is assumed that user has no control over the names of external global variables.
85
+ * @param {ASTNode} node `Identifier` node to check.
86
+ * @returns {boolean} `true` if the node is a reference to a global variable.
87
+ */
88
+ function isReferenceToGlobalVariable(node) {
89
+ const variable = globalScope.set.get(node.name);
90
+
91
+ return variable && variable.defs.length === 0 &&
92
+ variable.references.some(ref => ref.identifier === node);
93
+ }
94
+
79
95
  /**
80
96
  * Checks if a string matches the provided pattern
81
97
  * @param {string} name The string to check.
@@ -154,11 +170,19 @@ module.exports = {
154
170
 
155
171
  return {
156
172
 
173
+ Program() {
174
+ globalScope = context.getScope();
175
+ },
176
+
157
177
  Identifier(node) {
158
178
  const name = node.name,
159
179
  parent = node.parent,
160
180
  effectiveParent = (parent.type === "MemberExpression") ? parent.parent : parent;
161
181
 
182
+ if (isReferenceToGlobalVariable(node)) {
183
+ return;
184
+ }
185
+
162
186
  if (parent.type === "MemberExpression") {
163
187
 
164
188
  if (!checkProperties) {
@@ -187,6 +211,17 @@ module.exports = {
187
211
  }
188
212
  }
189
213
 
214
+ // For https://github.com/eslint/eslint/issues/15123
215
+ } else if (
216
+ parent.type === "Property" &&
217
+ parent.parent.type === "ObjectExpression" &&
218
+ parent.key === node &&
219
+ !parent.computed
220
+ ) {
221
+ if (checkProperties && isInvalid(name)) {
222
+ report(node);
223
+ }
224
+
190
225
  /*
191
226
  * Properties have their own rules, and
192
227
  * AssignmentPattern nodes can be treated like Properties:
@@ -9,6 +9,7 @@ const { isCommentToken, isNotOpeningParenToken } = require("./utils/ast-utils");
9
9
  //------------------------------------------------------------------------------
10
10
  // Rule Definition
11
11
  //------------------------------------------------------------------------------
12
+ /** @type {import('../shared/types').Rule} */
12
13
  module.exports = {
13
14
  meta: {
14
15
  type: "layout",
@@ -20,6 +20,7 @@ const astUtils = require("./utils/ast-utils");
20
20
  //------------------------------------------------------------------------------
21
21
 
22
22
  /* istanbul ignore next: this rule has known coverage issues, but it's deprecated and shouldn't be updated in the future anyway. */
23
+ /** @type {import('../shared/types').Rule} */
23
24
  module.exports = {
24
25
  meta: {
25
26
  type: "layout",
@@ -494,6 +494,7 @@ const ELEMENT_LIST_SCHEMA = {
494
494
  ]
495
495
  };
496
496
 
497
+ /** @type {import('../shared/types').Rule} */
497
498
  module.exports = {
498
499
  meta: {
499
500
  type: "layout",
@@ -255,6 +255,7 @@ module.exports = new LazyLoadingRuleMap(Object.entries({
255
255
  "prefer-exponentiation-operator": () => require("./prefer-exponentiation-operator"),
256
256
  "prefer-named-capture-group": () => require("./prefer-named-capture-group"),
257
257
  "prefer-numeric-literals": () => require("./prefer-numeric-literals"),
258
+ "prefer-object-has-own": () => require("./prefer-object-has-own"),
258
259
  "prefer-object-spread": () => require("./prefer-object-spread"),
259
260
  "prefer-promise-reject-errors": () => require("./prefer-promise-reject-errors"),
260
261
  "prefer-reflect": () => require("./prefer-reflect"),
@@ -42,6 +42,7 @@ function isInitialized(node) {
42
42
  // Rule Definition
43
43
  //------------------------------------------------------------------------------
44
44
 
45
+ /** @type {import('../shared/types').Rule} */
45
46
  module.exports = {
46
47
  meta: {
47
48
  type: "suggestion",
@@ -36,6 +36,7 @@ const QUOTE_SETTINGS = {
36
36
  // Rule Definition
37
37
  //------------------------------------------------------------------------------
38
38
 
39
+ /** @type {import('../shared/types').Rule} */
39
40
  module.exports = {
40
41
  meta: {
41
42
  type: "layout",
@@ -133,6 +133,7 @@ function initOptions(toOptions, fromOptions) {
133
133
  // Rule Definition
134
134
  //------------------------------------------------------------------------------
135
135
 
136
+ /** @type {import('../shared/types').Rule} */
136
137
  module.exports = {
137
138
  meta: {
138
139
  type: "layout",