40.0.0-1 • Published 2 years ago

@rinfel/eslint-plugin-unicorn v40.0.0-1

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

eslint-plugin-unicorn Coverage Status npm version

Various awesome ESLint rules

⚠️ This is a fork of sindresorhus/eslint-plugin-unicorn with the explicit-length-check rule's greater-than-or-equal option retained. Read more about why this option was removed by the original authors and why we chose to keep using this style in the original GitHub issue discussions.

You might want to check out XO, which includes this plugin.

Propose or contribute a new rule ➡

Install

npm install --save-dev eslint @rinfel/eslint-plugin-unicorn

Usage

Configure it in package.json.

{
	"name": "my-awesome-project",
	"eslintConfig": {
		"env": {
			"es6": true
		},
		"parserOptions": {
			"ecmaVersion": "latest",
			"sourceType": "module"
		},
		"plugins": [
			"@rinfel/unicorn"
		],
		"rules": {
			"@rinfel/unicorn/better-regex": "error",
			"@rinfel/unicorn/catch-error-name": "error",
			"@rinfel/unicorn/consistent-destructuring": "error",
			"@rinfel/unicorn/consistent-function-scoping": "error",
			"@rinfel/unicorn/custom-error-definition": "off",
			"@rinfel/unicorn/empty-brace-spaces": "error",
			"@rinfel/unicorn/error-message": "error",
			"@rinfel/unicorn/escape-case": "error",
			"@rinfel/unicorn/expiring-todo-comments": "error",
			"@rinfel/unicorn/explicit-length-check": "error",
			"@rinfel/unicorn/filename-case": "error",
			"@rinfel/unicorn/import-index": "off",
			"@rinfel/unicorn/import-style": "error",
			"@rinfel/unicorn/new-for-builtins": "error",
			"@rinfel/unicorn/no-abusive-eslint-disable": "error",
			"@rinfel/unicorn/no-array-callback-reference": "error",
			"@rinfel/unicorn/no-array-for-each": "error",
			"@rinfel/unicorn/no-array-method-this-argument": "error",
			"@rinfel/unicorn/no-array-push-push": "error",
			"@rinfel/unicorn/no-array-reduce": "error",
			"@rinfel/unicorn/no-await-expression-member": "error",
			"@rinfel/unicorn/no-console-spaces": "error",
			"@rinfel/unicorn/no-document-cookie": "error",
			"@rinfel/unicorn/no-empty-file": "error",
			"@rinfel/unicorn/no-for-loop": "error",
			"@rinfel/unicorn/no-hex-escape": "error",
			"@rinfel/unicorn/no-instanceof-array": "error",
			"@rinfel/unicorn/no-invalid-remove-event-listener": "error",
			"@rinfel/unicorn/no-keyword-prefix": "off",
			"@rinfel/unicorn/no-lonely-if": "error",
			"no-nested-ternary": "off",
			"@rinfel/unicorn/no-nested-ternary": "error",
			"@rinfel/unicorn/no-new-array": "error",
			"@rinfel/unicorn/no-new-buffer": "error",
			"@rinfel/unicorn/no-null": "error",
			"@rinfel/unicorn/no-object-as-default-parameter": "error",
			"@rinfel/unicorn/no-process-exit": "error",
			"@rinfel/unicorn/no-static-only-class": "error",
			"@rinfel/unicorn/no-thenable": "error",
			"@rinfel/unicorn/no-this-assignment": "error",
			"@rinfel/unicorn/no-unreadable-array-destructuring": "error",
			"@rinfel/unicorn/no-unsafe-regex": "off",
			"@rinfel/unicorn/no-unused-properties": "off",
			"@rinfel/unicorn/no-useless-fallback-in-spread": "error",
			"@rinfel/unicorn/no-useless-length-check": "error",
			"@rinfel/unicorn/no-useless-promise-resolve-reject": "error",
			"@rinfel/unicorn/no-useless-spread": "error",
			"@rinfel/unicorn/no-useless-undefined": "error",
			"@rinfel/unicorn/no-zero-fractions": "error",
			"@rinfel/unicorn/number-literal-case": "error",
			"@rinfel/unicorn/numeric-separators-style": "error",
			"@rinfel/unicorn/prefer-add-event-listener": "error",
			"@rinfel/unicorn/prefer-array-find": "error",
			"@rinfel/unicorn/prefer-array-flat": "error",
			"@rinfel/unicorn/prefer-array-flat-map": "error",
			"@rinfel/unicorn/prefer-array-index-of": "error",
			"@rinfel/unicorn/prefer-array-some": "error",
			"@rinfel/unicorn/prefer-at": "off",
			"@rinfel/unicorn/prefer-code-point": "error",
			"@rinfel/unicorn/prefer-date-now": "error",
			"@rinfel/unicorn/prefer-default-parameters": "error",
			"@rinfel/unicorn/prefer-dom-node-append": "error",
			"@rinfel/unicorn/prefer-dom-node-dataset": "error",
			"@rinfel/unicorn/prefer-dom-node-remove": "error",
			"@rinfel/unicorn/prefer-dom-node-text-content": "error",
			"@rinfel/unicorn/prefer-export-from": "error",
			"@rinfel/unicorn/prefer-includes": "error",
			"@rinfel/unicorn/prefer-json-parse-buffer": "error",
			"@rinfel/unicorn/prefer-keyboard-event-key": "error",
			"@rinfel/unicorn/prefer-math-trunc": "error",
			"@rinfel/unicorn/prefer-modern-dom-apis": "error",
			"@rinfel/unicorn/prefer-module": "error",
			"@rinfel/unicorn/prefer-negative-index": "error",
			"@rinfel/unicorn/prefer-node-protocol": "error",
			"@rinfel/unicorn/prefer-number-properties": "error",
			"@rinfel/unicorn/prefer-object-from-entries": "error",
			"@rinfel/unicorn/prefer-optional-catch-binding": "error",
			"@rinfel/unicorn/prefer-prototype-methods": "error",
			"@rinfel/unicorn/prefer-query-selector": "error",
			"@rinfel/unicorn/prefer-reflect-apply": "error",
			"@rinfel/unicorn/prefer-regexp-test": "error",
			"@rinfel/unicorn/prefer-set-has": "error",
			"@rinfel/unicorn/prefer-spread": "error",
			"@rinfel/unicorn/prefer-string-replace-all": "off",
			"@rinfel/unicorn/prefer-string-slice": "error",
			"@rinfel/unicorn/prefer-string-starts-ends-with": "error",
			"@rinfel/unicorn/prefer-string-trim-start-end": "error",
			"@rinfel/unicorn/prefer-switch": "error",
			"@rinfel/unicorn/prefer-ternary": "error",
			"@rinfel/unicorn/prefer-top-level-await": "off",
			"@rinfel/unicorn/prefer-type-error": "error",
			"@rinfel/unicorn/prevent-abbreviations": "error",
			"@rinfel/unicorn/relative-url-style": "error",
			"@rinfel/unicorn/require-array-join-separator": "error",
			"@rinfel/unicorn/require-number-to-fixed-digits-argument": "error",
			"@rinfel/unicorn/require-post-message-target-origin": "off",
			"@rinfel/unicorn/string-content": "off",
			"@rinfel/unicorn/template-indent": "warn",
			"@rinfel/unicorn/throw-new-error": "error"
		}
	}
}

Rules

Each rule has emojis denoting:

  • ✅ if it belongs to the recommended configuration
  • 🔧 if some problems reported by the rule are automatically fixable by the --fix command line option
  • 💡 if some problems reported by the rule are manually fixable by editor suggestions
Name                                        Description🔧💡
better-regexImprove regexes by making them shorter, consistent, and safer.🔧
catch-error-nameEnforce a specific parameter name in catch clauses.🔧
consistent-destructuringUse destructured variables over properties.🔧💡
consistent-function-scopingMove function definitions to the highest possible scope.
custom-error-definitionEnforce correct Error subclassing.🔧
empty-brace-spacesEnforce no spaces between braces.🔧
error-messageEnforce passing a message value when creating a built-in error.
escape-caseRequire escape sequences to use uppercase values.🔧
expiring-todo-commentsAdd expiration conditions to TODO comments.
explicit-length-checkEnforce explicitly comparing the length or size property of a value.🔧💡
filename-caseEnforce a case style for filenames.
import-indexEnforce importing index files with ..🔧
import-styleEnforce specific import styles per module.
new-for-builtinsEnforce the use of new for all builtins, except String, Number, Boolean, Symbol and BigInt.🔧
no-abusive-eslint-disableEnforce specifying rules to disable in eslint-disable comments.
no-array-callback-referencePrevent passing a function reference directly to iterator methods.💡
no-array-for-eachPrefer for…of over Array#forEach(…).🔧
no-array-method-this-argumentDisallow using the this argument in array methods.🔧💡
no-array-push-pushEnforce combining multiple Array#push() into one call.🔧💡
no-array-reduceDisallow Array#reduce() and Array#reduceRight().
no-await-expression-memberForbid member access from await expression.🔧
no-console-spacesDo not use leading/trailing space between console.log parameters.🔧
no-document-cookieDo not use document.cookie directly.
no-empty-fileDisallow empty files.
no-for-loopDo not use a for loop that can be replaced with a for-of loop.🔧
no-hex-escapeEnforce the use of Unicode escapes instead of hexadecimal escapes.🔧
no-instanceof-arrayRequire Array.isArray() instead of instanceof Array.🔧
no-invalid-remove-event-listenerPrevent calling EventTarget#removeEventListener() with the result of an expression.
no-keyword-prefixDisallow identifiers starting with new or class.
no-lonely-ifDisallow if statements as the only statement in if blocks without else.🔧
no-nested-ternaryDisallow nested ternary expressions.🔧
no-new-arrayDisallow new Array().🔧💡
no-new-bufferEnforce the use of Buffer.from() and Buffer.alloc() instead of the deprecated new Buffer().🔧💡
no-nullDisallow the use of the null literal.🔧💡
no-object-as-default-parameterDisallow the use of objects as default parameters.
no-process-exitDisallow process.exit().
no-static-only-classForbid classes that only have static members.🔧
no-thenableDisallow then property.
no-this-assignmentDisallow assigning this to a variable.
no-unreadable-array-destructuringDisallow unreadable array destructuring.🔧
no-unsafe-regexDisallow unsafe regular expressions.
no-unused-propertiesDisallow unused object properties.
no-useless-fallback-in-spreadForbid useless fallback when spreading in object literals.🔧
no-useless-length-checkDisallow useless array length check.🔧
no-useless-promise-resolve-rejectDisallow returning/yielding Promise.resolve/reject() in async functions or promise callbacks🔧
no-useless-spreadDisallow unnecessary spread.🔧
no-useless-undefinedDisallow useless undefined.🔧
no-zero-fractionsDisallow number literals with zero fractions or dangling dots.🔧
number-literal-caseEnforce proper case for numeric literals.🔧
numeric-separators-styleEnforce the style of numeric separators by correctly grouping digits.🔧
prefer-add-event-listenerPrefer .addEventListener() and .removeEventListener() over on-functions.🔧
prefer-array-findPrefer .find(…) over the first element from .filter(…).🔧💡
prefer-array-flatPrefer Array#flat() over legacy techniques to flatten arrays.🔧
prefer-array-flat-mapPrefer .flatMap(…) over .map(…).flat().🔧
prefer-array-index-ofPrefer Array#indexOf() over Array#findIndex() when looking for the index of an item.🔧💡
prefer-array-somePrefer .some(…) over .filter(…).length check and .find(…).🔧💡
prefer-atPrefer .at() method for index access and String#charAt().🔧💡
prefer-code-pointPrefer String#codePointAt(…) over String#charCodeAt(…) and String.fromCodePoint(…) over String.fromCharCode(…).💡
prefer-date-nowPrefer Date.now() to get the number of milliseconds since the Unix Epoch.🔧
prefer-default-parametersPrefer default parameters over reassignment.🔧💡
prefer-dom-node-appendPrefer Node#append() over Node#appendChild().🔧
prefer-dom-node-datasetPrefer using .dataset on DOM elements over calling attribute methods.🔧
prefer-dom-node-removePrefer childNode.remove() over parentNode.removeChild(childNode).🔧💡
prefer-dom-node-text-contentPrefer .textContent over .innerText.💡
prefer-export-fromPrefer export…from when re-exporting.🔧💡
prefer-includesPrefer .includes() over .indexOf() and Array#some() when checking for existence or non-existence.🔧💡
prefer-json-parse-bufferPrefer reading a JSON file as a buffer.🔧
prefer-keyboard-event-keyPrefer KeyboardEvent#key over KeyboardEvent#keyCode.🔧
prefer-math-truncEnforce the use of Math.trunc instead of bitwise operators.🔧💡
prefer-modern-dom-apisPrefer .before() over .insertBefore(), .replaceWith() over .replaceChild(), prefer one of .before(), .after(), .append() or .prepend() over insertAdjacentText() and insertAdjacentElement().🔧
prefer-modulePrefer JavaScript modules (ESM) over CommonJS.🔧💡
prefer-negative-indexPrefer negative index over .length - index for {String,Array,TypedArray}#slice(), Array#splice() and Array#at().🔧
prefer-node-protocolPrefer using the node: protocol when importing Node.js builtin modules.🔧
prefer-number-propertiesPrefer Number static properties over global ones.🔧💡
prefer-object-from-entriesPrefer using Object.fromEntries(…) to transform a list of key-value pairs into an object.🔧
prefer-optional-catch-bindingPrefer omitting the catch binding parameter.🔧
prefer-prototype-methodsPrefer borrowing methods from the prototype instead of the instance.🔧
prefer-query-selectorPrefer .querySelector() over .getElementById(), .querySelectorAll() over .getElementsByClassName() and .getElementsByTagName().🔧
prefer-reflect-applyPrefer Reflect.apply() over Function#apply().🔧
prefer-regexp-testPrefer RegExp#test() over String#match() and RegExp#exec().🔧
prefer-set-hasPrefer Set#has() over Array#includes() when checking for existence or non-existence.🔧💡
prefer-spreadPrefer the spread operator over Array.from(…), Array#concat(…), Array#slice() and String#split('').🔧💡
prefer-string-replace-allPrefer String#replaceAll() over regex searches with the global flag.🔧
prefer-string-slicePrefer String#slice() over String#substr() and String#substring().🔧
prefer-string-starts-ends-withPrefer String#startsWith() & String#endsWith() over RegExp#test().🔧💡
prefer-string-trim-start-endPrefer String#trimStart() / String#trimEnd() over String#trimLeft() / String#trimRight().🔧
prefer-switchPrefer switch over multiple else-if.🔧
prefer-ternaryPrefer ternary expressions over simple if-else statements.🔧
prefer-top-level-awaitPrefer top-level await over top-level promises and async function calls.💡
prefer-type-errorEnforce throwing TypeError in type checking conditions.🔧
prevent-abbreviationsPrevent abbreviations.🔧
relative-url-styleEnforce consistent relative URL style.🔧
require-array-join-separatorEnforce using the separator argument with Array#join().🔧
require-number-to-fixed-digits-argumentEnforce using the digits argument with Number#toFixed().🔧
require-post-message-target-originEnforce using the targetOrigin argument with window.postMessage().💡
string-contentEnforce better string content.🔧💡
template-indentFix whitespace-insensitive template indentation.🔧
throw-new-errorRequire new when throwing an error.🔧

Deprecated Rules

See docs/deprecated-rules.md

Recommended config

This plugin exports a recommended config that enforces good practices.

Enable it in your package.json with the extends option:

{
	"name": "my-awesome-project",
	"eslintConfig": {
		"extends": "plugin:@rinfel/unicorn/recommended"
	}
}

See the ESLint docs for more information about extending config files.

Note: This config will also enable the correct parser options and environment.

All config

This plugin exports an all config that makes use of all rules (except for deprecated ones).

Enable it in your package.json with the extends option:

{
	"name": "my-awesome-project",
	"eslintConfig": {
		"extends": "plugin:@rinfel/unicorn/all"
	}
}

See the ESLint docs for more information about extending config files.

Maintainers

Former