Linux ubuntu22 5.15.0-133-generic #144-Ubuntu SMP Fri Feb 7 20:47:38 UTC 2025 x86_64
nginx/1.18.0
: 128.199.27.159 | : 216.73.216.1
Cant Read [ /etc/named.conf ]
8.1.31
www-data
www.github.com/MadExploits
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
CPANEL RESET
CREATE WP USER
README
+ Create Folder
+ Create File
/
var /
www /
html /
quiz1 /
node_modules /
eslint /
lib /
rules /
[ HOME SHELL ]
Name
Size
Permission
Action
utils
[ DIR ]
dr-xr-xr-x
accessor-pairs.js
11.71
KB
-rw-rw-rw-
array-bracket-newline.js
9.45
KB
-rw-rw-rw-
array-bracket-spacing.js
8.96
KB
-rw-rw-rw-
array-callback-return.js
15.5
KB
-rw-rw-rw-
array-element-newline.js
10.9
KB
-rw-rw-rw-
arrow-body-style.js
12.67
KB
-rw-rw-rw-
arrow-parens.js
7.61
KB
-rw-rw-rw-
arrow-spacing.js
5.17
KB
-rw-rw-rw-
block-scoped-var.js
4.24
KB
-rw-rw-rw-
block-spacing.js
5.8
KB
-rw-rw-rw-
brace-style.js
8.04
KB
-rw-rw-rw-
callback-return.js
6.41
KB
-rw-rw-rw-
camelcase.js
13.66
KB
-rw-rw-rw-
capitalized-comments.js
10.48
KB
-rw-rw-rw-
class-methods-use-this.js
6.02
KB
-rw-rw-rw-
comma-dangle.js
13.53
KB
-rw-rw-rw-
comma-spacing.js
6.87
KB
-rw-rw-rw-
comma-style.js
11.72
KB
-rw-rw-rw-
complexity.js
5.6
KB
-rw-rw-rw-
computed-property-spacing.js
7.45
KB
-rw-rw-rw-
consistent-return.js
6.91
KB
-rw-rw-rw-
consistent-this.js
4.99
KB
-rw-rw-rw-
constructor-super.js
15.19
KB
-rw-rw-rw-
curly.js
18.93
KB
-rw-rw-rw-
default-case-last.js
1.21
KB
-rw-rw-rw-
default-case.js
2.77
KB
-rw-rw-rw-
default-param-last.js
1.55
KB
-rw-rw-rw-
dot-location.js
3.43
KB
-rw-rw-rw-
dot-notation.js
6.6
KB
-rw-rw-rw-
eol-last.js
4.01
KB
-rw-rw-rw-
eqeqeq.js
5.65
KB
-rw-rw-rw-
for-direction.js
5
KB
-rw-rw-rw-
func-call-spacing.js
9.77
KB
-rw-rw-rw-
func-name-matching.js
9.91
KB
-rw-rw-rw-
func-names.js
6.3
KB
-rw-rw-rw-
func-style.js
2.85
KB
-rw-rw-rw-
function-call-argument-newline...
4.31
KB
-rw-rw-rw-
function-paren-newline.js
11.61
KB
-rw-rw-rw-
generator-star-spacing.js
7.01
KB
-rw-rw-rw-
getter-return.js
6.87
KB
-rw-rw-rw-
global-require.js
2.44
KB
-rw-rw-rw-
grouped-accessor-pairs.js
7.46
KB
-rw-rw-rw-
guard-for-in.js
2.31
KB
-rw-rw-rw-
handle-callback-err.js
3.06
KB
-rw-rw-rw-
id-blacklist.js
7.54
KB
-rw-rw-rw-
id-denylist.js
7.04
KB
-rw-rw-rw-
id-length.js
6.51
KB
-rw-rw-rw-
id-match.js
11.04
KB
-rw-rw-rw-
implicit-arrow-linebreak.js
2.88
KB
-rw-rw-rw-
indent-legacy.js
43.59
KB
-rw-rw-rw-
indent.js
76.54
KB
-rw-rw-rw-
index.js
17.89
KB
-rw-rw-rw-
init-declarations.js
4.38
KB
-rw-rw-rw-
jsx-quotes.js
2.98
KB
-rw-rw-rw-
key-spacing.js
26.36
KB
-rw-rw-rw-
keyword-spacing.js
23.7
KB
-rw-rw-rw-
line-comment-position.js
4.09
KB
-rw-rw-rw-
linebreak-style.js
3.48
KB
-rw-rw-rw-
lines-around-comment.js
17.85
KB
-rw-rw-rw-
lines-around-directive.js
7.6
KB
-rw-rw-rw-
lines-between-class-members.js
11.15
KB
-rw-rw-rw-
logical-assignment-operators.j...
21.38
KB
-rw-rw-rw-
max-classes-per-file.js
2.58
KB
-rw-rw-rw-
max-depth.js
4.68
KB
-rw-rw-rw-
max-len.js
15.81
KB
-rw-rw-rw-
max-lines-per-function.js
6.92
KB
-rw-rw-rw-
max-lines.js
5.95
KB
-rw-rw-rw-
max-nested-callbacks.js
3.48
KB
-rw-rw-rw-
max-params.js
3.1
KB
-rw-rw-rw-
max-statements-per-line.js
7.35
KB
-rw-rw-rw-
max-statements.js
5.81
KB
-rw-rw-rw-
multiline-comment-style.js
21.22
KB
-rw-rw-rw-
multiline-ternary.js
7.62
KB
-rw-rw-rw-
new-cap.js
9.3
KB
-rw-rw-rw-
new-parens.js
3.19
KB
-rw-rw-rw-
newline-after-var.js
9.46
KB
-rw-rw-rw-
newline-before-return.js
7.87
KB
-rw-rw-rw-
newline-per-chained-call.js
4.04
KB
-rw-rw-rw-
no-alert.js
4.25
KB
-rw-rw-rw-
no-array-constructor.js
4.38
KB
-rw-rw-rw-
no-async-promise-executor.js
1.11
KB
-rw-rw-rw-
no-await-in-loop.js
2.73
KB
-rw-rw-rw-
no-bitwise.js
3.5
KB
-rw-rw-rw-
no-buffer-constructor.js
1.4
KB
-rw-rw-rw-
no-caller.js
1.18
KB
-rw-rw-rw-
no-case-declarations.js
1.83
KB
-rw-rw-rw-
no-catch-shadow.js
2.51
KB
-rw-rw-rw-
no-class-assign.js
1.73
KB
-rw-rw-rw-
no-compare-neg-zero.js
1.9
KB
-rw-rw-rw-
no-cond-assign.js
5.52
KB
-rw-rw-rw-
no-confusing-arrow.js
2.9
KB
-rw-rw-rw-
no-console.js
7.17
KB
-rw-rw-rw-
no-const-assign.js
1.52
KB
-rw-rw-rw-
no-constant-binary-expression....
20.41
KB
-rw-rw-rw-
no-constant-condition.js
4.77
KB
-rw-rw-rw-
no-constructor-return.js
1.57
KB
-rw-rw-rw-
no-continue.js
886
B
-rw-rw-rw-
no-control-regex.js
4.58
KB
-rw-rw-rw-
no-debugger.js
959
B
-rw-rw-rw-
no-delete-var.js
983
B
-rw-rw-rw-
no-div-regex.js
1.42
KB
-rw-rw-rw-
no-dupe-args.js
2.36
KB
-rw-rw-rw-
no-dupe-class-members.js
3.29
KB
-rw-rw-rw-
no-dupe-else-if.js
4.51
KB
-rw-rw-rw-
no-dupe-keys.js
3.88
KB
-rw-rw-rw-
no-duplicate-case.js
2.04
KB
-rw-rw-rw-
no-duplicate-imports.js
9.28
KB
-rw-rw-rw-
no-else-return.js
15.71
KB
-rw-rw-rw-
no-empty-character-class.js
2.23
KB
-rw-rw-rw-
no-empty-function.js
4.63
KB
-rw-rw-rw-
no-empty-pattern.js
2.38
KB
-rw-rw-rw-
no-empty-static-block.js
1.22
KB
-rw-rw-rw-
no-empty.js
3.08
KB
-rw-rw-rw-
no-eq-null.js
1.22
KB
-rw-rw-rw-
no-eval.js
9.34
KB
-rw-rw-rw-
no-ex-assign.js
1.43
KB
-rw-rw-rw-
no-extend-native.js
6.5
KB
-rw-rw-rw-
no-extra-bind.js
7.39
KB
-rw-rw-rw-
no-extra-boolean-cast.js
11.7
KB
-rw-rw-rw-
no-extra-label.js
5.04
KB
-rw-rw-rw-
no-extra-parens.js
52.03
KB
-rw-rw-rw-
no-extra-semi.js
4.99
KB
-rw-rw-rw-
no-fallthrough.js
6.89
KB
-rw-rw-rw-
no-floating-decimal.js
2.42
KB
-rw-rw-rw-
no-func-assign.js
2.2
KB
-rw-rw-rw-
no-global-assign.js
2.97
KB
-rw-rw-rw-
no-implicit-coercion.js
12.97
KB
-rw-rw-rw-
no-implicit-globals.js
5.48
KB
-rw-rw-rw-
no-implied-eval.js
4.54
KB
-rw-rw-rw-
no-import-assign.js
7.25
KB
-rw-rw-rw-
no-inline-comments.js
3.29
KB
-rw-rw-rw-
no-inner-declarations.js
2.96
KB
-rw-rw-rw-
no-invalid-regexp.js
6.3
KB
-rw-rw-rw-
no-invalid-this.js
5.01
KB
-rw-rw-rw-
no-irregular-whitespace.js
9.93
KB
-rw-rw-rw-
no-iterator.js
1.28
KB
-rw-rw-rw-
no-label-var.js
2.36
KB
-rw-rw-rw-
no-labels.js
4.38
KB
-rw-rw-rw-
no-lone-blocks.js
4.23
KB
-rw-rw-rw-
no-lonely-if.js
3.65
KB
-rw-rw-rw-
no-loop-func.js
6.16
KB
-rw-rw-rw-
no-loss-of-precision.js
8.07
KB
-rw-rw-rw-
no-magic-numbers.js
9.26
KB
-rw-rw-rw-
no-misleading-character-class....
9.87
KB
-rw-rw-rw-
no-mixed-operators.js
7.58
KB
-rw-rw-rw-
no-mixed-requires.js
7.26
KB
-rw-rw-rw-
no-mixed-spaces-and-tabs.js
3.67
KB
-rw-rw-rw-
no-multi-assign.js
1.76
KB
-rw-rw-rw-
no-multi-spaces.js
5.04
KB
-rw-rw-rw-
no-multi-str.js
1.8
KB
-rw-rw-rw-
no-multiple-empty-lines.js
6.25
KB
-rw-rw-rw-
no-native-reassign.js
2.99
KB
-rw-rw-rw-
no-negated-condition.js
2.9
KB
-rw-rw-rw-
no-negated-in-lhs.js
1.16
KB
-rw-rw-rw-
no-nested-ternary.js
1.12
KB
-rw-rw-rw-
no-new-func.js
2.98
KB
-rw-rw-rw-
no-new-native-nonconstructor.j...
2.11
KB
-rw-rw-rw-
no-new-object.js
1.72
KB
-rw-rw-rw-
no-new-require.js
1.17
KB
-rw-rw-rw-
no-new-symbol.js
1.58
KB
-rw-rw-rw-
no-new-wrappers.js
1.7
KB
-rw-rw-rw-
no-new.js
1.04
KB
-rw-rw-rw-
no-nonoctal-decimal-escape.js
5.47
KB
-rw-rw-rw-
no-obj-calls.js
2.7
KB
-rw-rw-rw-
no-object-constructor.js
3.55
KB
-rw-rw-rw-
no-octal-escape.js
1.44
KB
-rw-rw-rw-
no-octal.js
1.01
KB
-rw-rw-rw-
no-param-reassign.js
8.42
KB
-rw-rw-rw-
no-path-concat.js
1.68
KB
-rw-rw-rw-
no-plusplus.js
3.1
KB
-rw-rw-rw-
no-process-env.js
1.19
KB
-rw-rw-rw-
no-process-exit.js
1.24
KB
-rw-rw-rw-
no-promise-executor-return.js
8.54
KB
-rw-rw-rw-
no-proto.js
1.21
KB
-rw-rw-rw-
no-prototype-builtins.js
5.83
KB
-rw-rw-rw-
no-redeclare.js
5.67
KB
-rw-rw-rw-
no-regex-spaces.js
6.42
KB
-rw-rw-rw-
no-restricted-exports.js
7.1
KB
-rw-rw-rw-
no-restricted-globals.js
3.79
KB
-rw-rw-rw-
no-restricted-imports.js
16.6
KB
-rw-rw-rw-
no-restricted-modules.js
6.9
KB
-rw-rw-rw-
no-restricted-properties.js
6.17
KB
-rw-rw-rw-
no-restricted-syntax.js
2.17
KB
-rw-rw-rw-
no-return-assign.js
2.62
KB
-rw-rw-rw-
no-return-await.js
5.02
KB
-rw-rw-rw-
no-script-url.js
1.72
KB
-rw-rw-rw-
no-self-assign.js
5.5
KB
-rw-rw-rw-
no-self-compare.js
1.81
KB
-rw-rw-rw-
no-sequences.js
4.67
KB
-rw-rw-rw-
no-setter-return.js
7.07
KB
-rw-rw-rw-
no-shadow-restricted-names.js
2.16
KB
-rw-rw-rw-
no-shadow.js
12.31
KB
-rw-rw-rw-
no-spaced-func.js
2.42
KB
-rw-rw-rw-
no-sparse-arrays.js
1.17
KB
-rw-rw-rw-
no-sync.js
1.65
KB
-rw-rw-rw-
no-tabs.js
2.45
KB
-rw-rw-rw-
no-template-curly-in-string.js
1.15
KB
-rw-rw-rw-
no-ternary.js
889
B
-rw-rw-rw-
no-this-before-super.js
10.87
KB
-rw-rw-rw-
no-throw-literal.js
1.28
KB
-rw-rw-rw-
no-trailing-spaces.js
6.72
KB
-rw-rw-rw-
no-undef-init.js
2.35
KB
-rw-rw-rw-
no-undef.js
2.3
KB
-rw-rw-rw-
no-undefined.js
2.24
KB
-rw-rw-rw-
no-underscore-dangle.js
12.79
KB
-rw-rw-rw-
no-unexpected-multiline.js
4.19
KB
-rw-rw-rw-
no-unmodified-loop-condition.j...
11.65
KB
-rw-rw-rw-
no-unneeded-ternary.js
6.79
KB
-rw-rw-rw-
no-unreachable-loop.js
5.94
KB
-rw-rw-rw-
no-unreachable.js
8.9
KB
-rw-rw-rw-
no-unsafe-finally.js
3.91
KB
-rw-rw-rw-
no-unsafe-negation.js
4.63
KB
-rw-rw-rw-
no-unsafe-optional-chaining.js
6.97
KB
-rw-rw-rw-
no-unused-expressions.js
6.08
KB
-rw-rw-rw-
no-unused-labels.js
4.55
KB
-rw-rw-rw-
no-unused-private-class-member...
7.68
KB
-rw-rw-rw-
no-unused-vars.js
27
KB
-rw-rw-rw-
no-use-before-define.js
10.88
KB
-rw-rw-rw-
no-useless-backreference.js
7.57
KB
-rw-rw-rw-
no-useless-call.js
2.99
KB
-rw-rw-rw-
no-useless-catch.js
1.71
KB
-rw-rw-rw-
no-useless-computed-key.js
6.3
KB
-rw-rw-rw-
no-useless-concat.js
3.24
KB
-rw-rw-rw-
no-useless-constructor.js
5.75
KB
-rw-rw-rw-
no-useless-escape.js
13.18
KB
-rw-rw-rw-
no-useless-rename.js
5.88
KB
-rw-rw-rw-
no-useless-return.js
14.01
KB
-rw-rw-rw-
no-var.js
12.14
KB
-rw-rw-rw-
no-void.js
1.72
KB
-rw-rw-rw-
no-warning-comments.js
7.12
KB
-rw-rw-rw-
no-whitespace-before-property....
3.92
KB
-rw-rw-rw-
no-with.js
876
B
-rw-rw-rw-
nonblock-statement-body-positi...
4.56
KB
-rw-rw-rw-
object-curly-newline.js
11.53
KB
-rw-rw-rw-
object-curly-spacing.js
11.61
KB
-rw-rw-rw-
object-property-newline.js
3.8
KB
-rw-rw-rw-
object-shorthand.js
21.78
KB
-rw-rw-rw-
one-var-declaration-per-line.j...
2.86
KB
-rw-rw-rw-
one-var.js
22.37
KB
-rw-rw-rw-
operator-assignment.js
8.58
KB
-rw-rw-rw-
operator-linebreak.js
9.88
KB
-rw-rw-rw-
padded-blocks.js
10.79
KB
-rw-rw-rw-
padding-line-between-statement...
18.85
KB
-rw-rw-rw-
prefer-arrow-callback.js
14.33
KB
-rw-rw-rw-
prefer-const.js
18.27
KB
-rw-rw-rw-
prefer-destructuring.js
10.93
KB
-rw-rw-rw-
prefer-exponentiation-operator...
7.58
KB
-rw-rw-rw-
prefer-named-capture-group.js
5.84
KB
-rw-rw-rw-
prefer-numeric-literals.js
5.7
KB
-rw-rw-rw-
prefer-object-has-own.js
4.24
KB
-rw-rw-rw-
prefer-object-spread.js
10.45
KB
-rw-rw-rw-
prefer-promise-reject-errors.j...
5.37
KB
-rw-rw-rw-
prefer-reflect.js
4.59
KB
-rw-rw-rw-
prefer-regex-literals.js
18.06
KB
-rw-rw-rw-
prefer-rest-params.js
3.39
KB
-rw-rw-rw-
prefer-spread.js
2.78
KB
-rw-rw-rw-
prefer-template.js
11.15
KB
-rw-rw-rw-
quote-props.js
11.82
KB
-rw-rw-rw-
quotes.js
12.41
KB
-rw-rw-rw-
radix.js
6.75
KB
-rw-rw-rw-
require-atomic-updates.js
11.1
KB
-rw-rw-rw-
require-await.js
3.27
KB
-rw-rw-rw-
require-jsdoc.js
3.77
KB
-rw-rw-rw-
require-unicode-regexp.js
5.1
KB
-rw-rw-rw-
require-yield.js
2.05
KB
-rw-rw-rw-
rest-spread-spacing.js
4.03
KB
-rw-rw-rw-
semi-spacing.js
8.71
KB
-rw-rw-rw-
semi-style.js
5.24
KB
-rw-rw-rw-
semi.js
15.87
KB
-rw-rw-rw-
sort-imports.js
10.62
KB
-rw-rw-rw-
sort-keys.js
7.16
KB
-rw-rw-rw-
sort-vars.js
4.04
KB
-rw-rw-rw-
space-before-blocks.js
7.14
KB
-rw-rw-rw-
space-before-function-paren.js
5.87
KB
-rw-rw-rw-
space-in-parens.js
10.55
KB
-rw-rw-rw-
space-infix-ops.js
6.42
KB
-rw-rw-rw-
space-unary-ops.js
12.39
KB
-rw-rw-rw-
spaced-comment.js
12.85
KB
-rw-rw-rw-
strict.js
10.37
KB
-rw-rw-rw-
switch-colon-spacing.js
4.9
KB
-rw-rw-rw-
symbol-description.js
2.04
KB
-rw-rw-rw-
template-curly-spacing.js
4.74
KB
-rw-rw-rw-
template-tag-spacing.js
3.08
KB
-rw-rw-rw-
unicode-bom.js
2.15
KB
-rw-rw-rw-
use-isnan.js
4.64
KB
-rw-rw-rw-
valid-jsdoc.js
20.08
KB
-rw-rw-rw-
valid-typeof.js
4.92
KB
-rw-rw-rw-
vars-on-top.js
5.17
KB
-rw-rw-rw-
wrap-iife.js
7.8
KB
-rw-rw-rw-
wrap-regex.js
1.85
KB
-rw-rw-rw-
yield-star-spacing.js
4.31
KB
-rw-rw-rw-
yoda.js
11.89
KB
-rw-rw-rw-
Delete
Unzip
Zip
${this.title}
Close
Code Editor : no-unused-vars.js
/** * @fileoverview Rule to flag declared but unused variables * @author Ilya Volodin */ "use strict"; //------------------------------------------------------------------------------ // Requirements //------------------------------------------------------------------------------ const astUtils = require("./utils/ast-utils"); //------------------------------------------------------------------------------ // Typedefs //------------------------------------------------------------------------------ /** * Bag of data used for formatting the `unusedVar` lint message. * @typedef {Object} UnusedVarMessageData * @property {string} varName The name of the unused var. * @property {'defined'|'assigned a value'} action Description of the vars state. * @property {string} additional Any additional info to be appended at the end. */ //------------------------------------------------------------------------------ // Rule Definition //------------------------------------------------------------------------------ /** @type {import('../shared/types').Rule} */ module.exports = { meta: { type: "problem", docs: { description: "Disallow unused variables", recommended: true, url: "https://eslint.org/docs/latest/rules/no-unused-vars" }, schema: [ { oneOf: [ { enum: ["all", "local"] }, { type: "object", properties: { vars: { enum: ["all", "local"] }, varsIgnorePattern: { type: "string" }, args: { enum: ["all", "after-used", "none"] }, ignoreRestSiblings: { type: "boolean" }, argsIgnorePattern: { type: "string" }, caughtErrors: { enum: ["all", "none"] }, caughtErrorsIgnorePattern: { type: "string" }, destructuredArrayIgnorePattern: { type: "string" } }, additionalProperties: false } ] } ], messages: { unusedVar: "'{{varName}}' is {{action}} but never used{{additional}}." } }, create(context) { const sourceCode = context.sourceCode; const REST_PROPERTY_TYPE = /^(?:RestElement|(?:Experimental)?RestProperty)$/u; const config = { vars: "all", args: "after-used", ignoreRestSiblings: false, caughtErrors: "none" }; const firstOption = context.options[0]; if (firstOption) { if (typeof firstOption === "string") { config.vars = firstOption; } else { config.vars = firstOption.vars || config.vars; config.args = firstOption.args || config.args; config.ignoreRestSiblings = firstOption.ignoreRestSiblings || config.ignoreRestSiblings; config.caughtErrors = firstOption.caughtErrors || config.caughtErrors; if (firstOption.varsIgnorePattern) { config.varsIgnorePattern = new RegExp(firstOption.varsIgnorePattern, "u"); } if (firstOption.argsIgnorePattern) { config.argsIgnorePattern = new RegExp(firstOption.argsIgnorePattern, "u"); } if (firstOption.caughtErrorsIgnorePattern) { config.caughtErrorsIgnorePattern = new RegExp(firstOption.caughtErrorsIgnorePattern, "u"); } if (firstOption.destructuredArrayIgnorePattern) { config.destructuredArrayIgnorePattern = new RegExp(firstOption.destructuredArrayIgnorePattern, "u"); } } } /** * Generates the message data about the variable being defined and unused, * including the ignore pattern if configured. * @param {Variable} unusedVar eslint-scope variable object. * @returns {UnusedVarMessageData} The message data to be used with this unused variable. */ function getDefinedMessageData(unusedVar) { const defType = unusedVar.defs && unusedVar.defs[0] && unusedVar.defs[0].type; let type; let pattern; if (defType === "CatchClause" && config.caughtErrorsIgnorePattern) { type = "args"; pattern = config.caughtErrorsIgnorePattern.toString(); } else if (defType === "Parameter" && config.argsIgnorePattern) { type = "args"; pattern = config.argsIgnorePattern.toString(); } else if (defType !== "Parameter" && config.varsIgnorePattern) { type = "vars"; pattern = config.varsIgnorePattern.toString(); } const additional = type ? `. Allowed unused ${type} must match ${pattern}` : ""; return { varName: unusedVar.name, action: "defined", additional }; } /** * Generate the warning message about the variable being * assigned and unused, including the ignore pattern if configured. * @param {Variable} unusedVar eslint-scope variable object. * @returns {UnusedVarMessageData} The message data to be used with this unused variable. */ function getAssignedMessageData(unusedVar) { const def = unusedVar.defs[0]; let additional = ""; if (config.destructuredArrayIgnorePattern && def && def.name.parent.type === "ArrayPattern") { additional = `. Allowed unused elements of array destructuring patterns must match ${config.destructuredArrayIgnorePattern.toString()}`; } else if (config.varsIgnorePattern) { additional = `. Allowed unused vars must match ${config.varsIgnorePattern.toString()}`; } return { varName: unusedVar.name, action: "assigned a value", additional }; } //-------------------------------------------------------------------------- // Helpers //-------------------------------------------------------------------------- const STATEMENT_TYPE = /(?:Statement|Declaration)$/u; /** * Determines if a given variable is being exported from a module. * @param {Variable} variable eslint-scope variable object. * @returns {boolean} True if the variable is exported, false if not. * @private */ function isExported(variable) { const definition = variable.defs[0]; if (definition) { let node = definition.node; if (node.type === "VariableDeclarator") { node = node.parent; } else if (definition.type === "Parameter") { return false; } return node.parent.type.indexOf("Export") === 0; } return false; } /** * Checks whether a node is a sibling of the rest property or not. * @param {ASTNode} node a node to check * @returns {boolean} True if the node is a sibling of the rest property, otherwise false. */ function hasRestSibling(node) { return node.type === "Property" && node.parent.type === "ObjectPattern" && REST_PROPERTY_TYPE.test(node.parent.properties[node.parent.properties.length - 1].type); } /** * Determines if a variable has a sibling rest property * @param {Variable} variable eslint-scope variable object. * @returns {boolean} True if the variable is exported, false if not. * @private */ function hasRestSpreadSibling(variable) { if (config.ignoreRestSiblings) { const hasRestSiblingDefinition = variable.defs.some(def => hasRestSibling(def.name.parent)); const hasRestSiblingReference = variable.references.some(ref => hasRestSibling(ref.identifier.parent)); return hasRestSiblingDefinition || hasRestSiblingReference; } return false; } /** * Determines if a reference is a read operation. * @param {Reference} ref An eslint-scope Reference * @returns {boolean} whether the given reference represents a read operation * @private */ function isReadRef(ref) { return ref.isRead(); } /** * Determine if an identifier is referencing an enclosing function name. * @param {Reference} ref The reference to check. * @param {ASTNode[]} nodes The candidate function nodes. * @returns {boolean} True if it's a self-reference, false if not. * @private */ function isSelfReference(ref, nodes) { let scope = ref.from; while (scope) { if (nodes.includes(scope.block)) { return true; } scope = scope.upper; } return false; } /** * Gets a list of function definitions for a specified variable. * @param {Variable} variable eslint-scope variable object. * @returns {ASTNode[]} Function nodes. * @private */ function getFunctionDefinitions(variable) { const functionDefinitions = []; variable.defs.forEach(def => { const { type, node } = def; // FunctionDeclarations if (type === "FunctionName") { functionDefinitions.push(node); } // FunctionExpressions if (type === "Variable" && node.init && (node.init.type === "FunctionExpression" || node.init.type === "ArrowFunctionExpression")) { functionDefinitions.push(node.init); } }); return functionDefinitions; } /** * Checks the position of given nodes. * @param {ASTNode} inner A node which is expected as inside. * @param {ASTNode} outer A node which is expected as outside. * @returns {boolean} `true` if the `inner` node exists in the `outer` node. * @private */ function isInside(inner, outer) { return ( inner.range[0] >= outer.range[0] && inner.range[1] <= outer.range[1] ); } /** * Checks whether a given node is unused expression or not. * @param {ASTNode} node The node itself * @returns {boolean} The node is an unused expression. * @private */ function isUnusedExpression(node) { const parent = node.parent; if (parent.type === "ExpressionStatement") { return true; } if (parent.type === "SequenceExpression") { const isLastExpression = parent.expressions[parent.expressions.length - 1] === node; if (!isLastExpression) { return true; } return isUnusedExpression(parent); } return false; } /** * If a given reference is left-hand side of an assignment, this gets * the right-hand side node of the assignment. * * In the following cases, this returns null. * * - The reference is not the LHS of an assignment expression. * - The reference is inside of a loop. * - The reference is inside of a function scope which is different from * the declaration. * @param {eslint-scope.Reference} ref A reference to check. * @param {ASTNode} prevRhsNode The previous RHS node. * @returns {ASTNode|null} The RHS node or null. * @private */ function getRhsNode(ref, prevRhsNode) { const id = ref.identifier; const parent = id.parent; const refScope = ref.from.variableScope; const varScope = ref.resolved.scope.variableScope; const canBeUsedLater = refScope !== varScope || astUtils.isInLoop(id); /* * Inherits the previous node if this reference is in the node. * This is for `a = a + a`-like code. */ if (prevRhsNode && isInside(id, prevRhsNode)) { return prevRhsNode; } if (parent.type === "AssignmentExpression" && isUnusedExpression(parent) && id === parent.left && !canBeUsedLater ) { return parent.right; } return null; } /** * Checks whether a given function node is stored to somewhere or not. * If the function node is stored, the function can be used later. * @param {ASTNode} funcNode A function node to check. * @param {ASTNode} rhsNode The RHS node of the previous assignment. * @returns {boolean} `true` if under the following conditions: * - the funcNode is assigned to a variable. * - the funcNode is bound as an argument of a function call. * - the function is bound to a property and the object satisfies above conditions. * @private */ function isStorableFunction(funcNode, rhsNode) { let node = funcNode; let parent = funcNode.parent; while (parent && isInside(parent, rhsNode)) { switch (parent.type) { case "SequenceExpression": if (parent.expressions[parent.expressions.length - 1] !== node) { return false; } break; case "CallExpression": case "NewExpression": return parent.callee !== node; case "AssignmentExpression": case "TaggedTemplateExpression": case "YieldExpression": return true; default: if (STATEMENT_TYPE.test(parent.type)) { /* * If it encountered statements, this is a complex pattern. * Since analyzing complex patterns is hard, this returns `true` to avoid false positive. */ return true; } } node = parent; parent = parent.parent; } return false; } /** * Checks whether a given Identifier node exists inside of a function node which can be used later. * * "can be used later" means: * - the function is assigned to a variable. * - the function is bound to a property and the object can be used later. * - the function is bound as an argument of a function call. * * If a reference exists in a function which can be used later, the reference is read when the function is called. * @param {ASTNode} id An Identifier node to check. * @param {ASTNode} rhsNode The RHS node of the previous assignment. * @returns {boolean} `true` if the `id` node exists inside of a function node which can be used later. * @private */ function isInsideOfStorableFunction(id, rhsNode) { const funcNode = astUtils.getUpperFunction(id); return ( funcNode && isInside(funcNode, rhsNode) && isStorableFunction(funcNode, rhsNode) ); } /** * Checks whether a given reference is a read to update itself or not. * @param {eslint-scope.Reference} ref A reference to check. * @param {ASTNode} rhsNode The RHS node of the previous assignment. * @returns {boolean} The reference is a read to update itself. * @private */ function isReadForItself(ref, rhsNode) { const id = ref.identifier; const parent = id.parent; return ref.isRead() && ( // self update. e.g. `a += 1`, `a++` ( ( parent.type === "AssignmentExpression" && parent.left === id && isUnusedExpression(parent) && !astUtils.isLogicalAssignmentOperator(parent.operator) ) || ( parent.type === "UpdateExpression" && isUnusedExpression(parent) ) ) || // in RHS of an assignment for itself. e.g. `a = a + 1` ( rhsNode && isInside(id, rhsNode) && !isInsideOfStorableFunction(id, rhsNode) ) ); } /** * Determine if an identifier is used either in for-in or for-of loops. * @param {Reference} ref The reference to check. * @returns {boolean} whether reference is used in the for-in loops * @private */ function isForInOfRef(ref) { let target = ref.identifier.parent; // "for (var ...) { return; }" if (target.type === "VariableDeclarator") { target = target.parent.parent; } if (target.type !== "ForInStatement" && target.type !== "ForOfStatement") { return false; } // "for (...) { return; }" if (target.body.type === "BlockStatement") { target = target.body.body[0]; // "for (...) return;" } else { target = target.body; } // For empty loop body if (!target) { return false; } return target.type === "ReturnStatement"; } /** * Determines if the variable is used. * @param {Variable} variable The variable to check. * @returns {boolean} True if the variable is used * @private */ function isUsedVariable(variable) { const functionNodes = getFunctionDefinitions(variable), isFunctionDefinition = functionNodes.length > 0; let rhsNode = null; return variable.references.some(ref => { if (isForInOfRef(ref)) { return true; } const forItself = isReadForItself(ref, rhsNode); rhsNode = getRhsNode(ref, rhsNode); return ( isReadRef(ref) && !forItself && !(isFunctionDefinition && isSelfReference(ref, functionNodes)) ); }); } /** * Checks whether the given variable is after the last used parameter. * @param {eslint-scope.Variable} variable The variable to check. * @returns {boolean} `true` if the variable is defined after the last * used parameter. */ function isAfterLastUsedArg(variable) { const def = variable.defs[0]; const params = sourceCode.getDeclaredVariables(def.node); const posteriorParams = params.slice(params.indexOf(variable) + 1); // If any used parameters occur after this parameter, do not report. return !posteriorParams.some(v => v.references.length > 0 || v.eslintUsed); } /** * Gets an array of variables without read references. * @param {Scope} scope an eslint-scope Scope object. * @param {Variable[]} unusedVars an array that saving result. * @returns {Variable[]} unused variables of the scope and descendant scopes. * @private */ function collectUnusedVariables(scope, unusedVars) { const variables = scope.variables; const childScopes = scope.childScopes; let i, l; if (scope.type !== "global" || config.vars === "all") { for (i = 0, l = variables.length; i < l; ++i) { const variable = variables[i]; // skip a variable of class itself name in the class scope if (scope.type === "class" && scope.block.id === variable.identifiers[0]) { continue; } // skip function expression names and variables marked with markVariableAsUsed() if (scope.functionExpressionScope || variable.eslintUsed) { continue; } // skip implicit "arguments" variable if (scope.type === "function" && variable.name === "arguments" && variable.identifiers.length === 0) { continue; } // explicit global variables don't have definitions. const def = variable.defs[0]; if (def) { const type = def.type; const refUsedInArrayPatterns = variable.references.some(ref => ref.identifier.parent.type === "ArrayPattern"); // skip elements of array destructuring patterns if ( ( def.name.parent.type === "ArrayPattern" || refUsedInArrayPatterns ) && config.destructuredArrayIgnorePattern && config.destructuredArrayIgnorePattern.test(def.name.name) ) { continue; } // skip catch variables if (type === "CatchClause") { if (config.caughtErrors === "none") { continue; } // skip ignored parameters if (config.caughtErrorsIgnorePattern && config.caughtErrorsIgnorePattern.test(def.name.name)) { continue; } } if (type === "Parameter") { // skip any setter argument if ((def.node.parent.type === "Property" || def.node.parent.type === "MethodDefinition") && def.node.parent.kind === "set") { continue; } // if "args" option is "none", skip any parameter if (config.args === "none") { continue; } // skip ignored parameters if (config.argsIgnorePattern && config.argsIgnorePattern.test(def.name.name)) { continue; } // if "args" option is "after-used", skip used variables if (config.args === "after-used" && astUtils.isFunction(def.name.parent) && !isAfterLastUsedArg(variable)) { continue; } } else { // skip ignored variables if (config.varsIgnorePattern && config.varsIgnorePattern.test(def.name.name)) { continue; } } } if (!isUsedVariable(variable) && !isExported(variable) && !hasRestSpreadSibling(variable)) { unusedVars.push(variable); } } } for (i = 0, l = childScopes.length; i < l; ++i) { collectUnusedVariables(childScopes[i], unusedVars); } return unusedVars; } //-------------------------------------------------------------------------- // Public //-------------------------------------------------------------------------- return { "Program:exit"(programNode) { const unusedVars = collectUnusedVariables(sourceCode.getScope(programNode), []); for (let i = 0, l = unusedVars.length; i < l; ++i) { const unusedVar = unusedVars[i]; // Report the first declaration. if (unusedVar.defs.length > 0) { // report last write reference, https://github.com/eslint/eslint/issues/14324 const writeReferences = unusedVar.references.filter(ref => ref.isWrite() && ref.from.variableScope === unusedVar.scope.variableScope); let referenceToReport; if (writeReferences.length > 0) { referenceToReport = writeReferences[writeReferences.length - 1]; } context.report({ node: referenceToReport ? referenceToReport.identifier : unusedVar.identifiers[0], messageId: "unusedVar", data: unusedVar.references.some(ref => ref.isWrite()) ? getAssignedMessageData(unusedVar) : getDefinedMessageData(unusedVar) }); // If there are no regular declaration, report the first `/*globals*/` comment directive. } else if (unusedVar.eslintExplicitGlobalComments) { const directiveComment = unusedVar.eslintExplicitGlobalComments[0]; context.report({ node: programNode, loc: astUtils.getNameLocationInGlobalDirectiveComment(sourceCode, directiveComment, unusedVar.name), messageId: "unusedVar", data: getDefinedMessageData(unusedVar) }); } } } }; } };
Close