57.0.0 β€’ Published 4 months ago

eslint-plugin-unicorn v57.0.0

Weekly downloads
618,087
License
MIT
Repository
github
Last release
4 months ago

eslint-plugin-unicorn Coverage Status npm version

More than 100 powerful ESLint rules

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

Propose or contribute a new rule ➑

Install

npm install --save-dev eslint eslint-plugin-unicorn

Requires ESLint >=9.20.0, flat config, and ESM.

Usage

Use a preset config or configure each rule in eslint.config.js.

If you don't use the preset, ensure you use the same languageOptions config as below.

import eslintPluginUnicorn from 'eslint-plugin-unicorn';
import globals from 'globals';

export default [
	{
		languageOptions: {
			globals: globals.builtin,
		},
		plugins: {
			unicorn: eslintPluginUnicorn,
		},
		rules: {
			'unicorn/better-regex': 'error',
			'unicorn/…': 'error',
		},
	},
	// …
];

Rules

πŸ’Ό Configurations enabled in.\ βœ… Set in the recommended configuration.\ πŸ”§ Automatically fixable by the --fix CLI option.\ πŸ’‘ 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-assertEnforce consistent assertion style with node:assert.βœ…πŸ”§
consistent-date-clonePrefer passing Date directly to the constructor when cloning.βœ…πŸ”§
consistent-destructuringUse destructured variables over properties.πŸ”§πŸ’‘
consistent-empty-array-spreadPrefer consistent types when spreading a ternary in an array literal.βœ…πŸ”§
consistent-existence-index-checkEnforce consistent style for element existence checks with indexOf(), lastIndexOf(), findIndex(), and findLastIndex().βœ…πŸ”§
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-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-accessor-recursionDisallow recursive access to this within getters and setters.βœ…
no-anonymous-default-exportDisallow anonymous functions and classes as the default export.βœ…πŸ’‘
no-array-callback-referencePrevent passing a function reference directly to iterator methods.βœ…πŸ’‘
no-array-for-eachPrefer for…of over the forEach method.βœ…πŸ”§πŸ’‘
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-memberDisallow member access from await expression.βœ…πŸ”§
no-await-in-promise-methodsDisallow using await in Promise method parameters.βœ…πŸ’‘
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-builtinsDisallow instanceof with built-in objectsβœ…πŸ”§πŸ’‘
no-invalid-fetch-optionsDisallow invalid options in fetch() and new Request().βœ…
no-invalid-remove-event-listenerPrevent calling EventTarget#removeEventListener() with the result of an expression.βœ…
no-keyword-prefixDisallow identifiers starting with new or class.
no-length-as-slice-endDisallow using .length as the end argument of {Array,String,TypedArray}#slice().βœ…πŸ”§
no-lonely-ifDisallow if statements as the only statement in if blocks without else.βœ…πŸ”§
no-magic-array-flat-depthDisallow a magic number as the depth argument in Array#flat(…).βœ…
no-named-defaultDisallow named usage of default import and export.βœ…πŸ”§
no-negated-conditionDisallow negated conditions.βœ…πŸ”§
no-negation-in-equality-checkDisallow negated expression in equality check.βœ…πŸ’‘
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-single-promise-in-promise-methodsDisallow passing single-element arrays to Promise methods.βœ…πŸ”§πŸ’‘
no-static-only-classDisallow classes that only have static members.βœ…πŸ”§
no-thenableDisallow then property.βœ…
no-this-assignmentDisallow assigning this to a variable.βœ…
no-typeof-undefinedDisallow comparing undefined using typeof.βœ…πŸ”§πŸ’‘
no-unnecessary-awaitDisallow awaiting non-promise values.βœ…πŸ”§
no-unnecessary-polyfillsEnforce the use of built-in methods instead of unnecessary polyfills.βœ…
no-unreadable-array-destructuringDisallow unreadable array destructuring.βœ…πŸ”§
no-unreadable-iifeDisallow unreadable IIFEs.βœ…
no-unused-propertiesDisallow unused object properties.
no-useless-fallback-in-spreadDisallow 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-switch-caseDisallow useless case in switch statements.βœ…πŸ’‘
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(…) and .findLast(…) over the first or last 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,lastIndexOf}() over Array#{findIndex,findLastIndex}() when looking for the index of an item.βœ…πŸ”§πŸ’‘
prefer-array-somePrefer .some(…) over .filter(…).length check and .{find,findLast,findIndex,findLastIndex}(…).βœ…πŸ”§πŸ’‘
prefer-atPrefer .at() method for index access and String#charAt().βœ…πŸ”§πŸ’‘
prefer-blob-reading-methodsPrefer Blob#arrayBuffer() over FileReader#readAsArrayBuffer(…) and Blob#text() over FileReader#readAsText(…).βœ…
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-event-targetPrefer EventTarget over EventEmitter.βœ…
prefer-export-fromPrefer export…from when re-exporting.βœ…πŸ”§πŸ’‘
prefer-global-thisPrefer globalThis over window, self, and global.βœ…πŸ”§
prefer-includesPrefer .includes() over .indexOf(), .lastIndexOf(), 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-logical-operator-over-ternaryPrefer using a logical operator over a ternary.βœ…πŸ’‘
prefer-math-min-maxPrefer Math.min() and Math.max() over ternaries for simple comparisons.βœ…πŸ”§
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-modern-math-apisPrefer modern Math APIs over legacy patterns.βœ…πŸ”§
prefer-modulePrefer JavaScript modules (ESM) over CommonJS.βœ…πŸ”§πŸ’‘
prefer-native-coercion-functionsPrefer using String, Number, BigInt, Boolean, and Symbol directly.βœ…πŸ”§
prefer-negative-indexPrefer negative index over .length - index when possible.βœ…πŸ”§
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() and .getElementsByName().βœ…πŸ”§
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-set-sizePrefer using Set#size instead of Array#length.βœ…πŸ”§
prefer-spreadPrefer the spread operator over Array.from(…), Array#concat(…), Array#{slice,toSpliced}() and String#split('').βœ…πŸ”§πŸ’‘
prefer-string-rawPrefer using the String.raw tag to avoid escaping \. | βœ… | πŸ”§
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-structured-clonePrefer using structuredClone to create a deep clone.βœ…πŸ’‘
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.πŸ”§πŸ’‘
switch-case-bracesEnforce consistent brace style for case clauses.βœ…πŸ”§
template-indentFix whitespace-insensitive template indentation.βœ…πŸ”§
text-encoding-identifier-caseEnforce consistent case for text encoding identifiers.βœ…πŸ”§πŸ’‘
throw-new-errorRequire new when creating an error.βœ…πŸ”§

Deprecated Rules

See docs/deprecated-rules.md

Preset configs

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

Note: Preset configs will also enable the correct language options.

Recommended config

This plugin exports a recommended config that enforces good practices.

import eslintPluginUnicorn from 'eslint-plugin-unicorn';

export default [
		// …
		eslintPluginUnicorn.configs.recommended,
		{
			rules: {
				'unicorn/better-regex': 'warn',
			},
		},
];

All config

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

import eslintPluginUnicorn from 'eslint-plugin-unicorn';

export default [
		// …
		eslintPluginUnicorn.configs.all,
		{
			rules: {
				'unicorn/better-regex': 'warn',
			},
		},
];

Maintainers

Former

@yysmx/eslint-config@yysmx/eslint-config-basic@bridge-tools/config@d6stiny/eslint-config@lvyunlong/eslint-config@lvyunlong/eslint-config-basic@jcamp/eslint-config-basic@jbabin91/configs@jiqi/eslint-config@jiqi/eslint-config-basic@jiralite/eslint-config-neon@kaivanwong/eslint-config-base@rjqh/eslint-config-basic@rain-star/eslint-config-basic@cyenoch/eslint-config@sysdotini/eslint-config@asasinmode/eslint-config@ridedott/eslint-config@obvcloud/eslint-config-preset-basic@denverzh/eslint-config@denverzh/eslint-config-basetables-viewtable-maquantable-views@moka-test/test-confignoodles-normmobilelivedesignsystemreactreact-native-braveeslint-config-slickeslint-config-superstrictws-scriptseslint-config-quartz@martyncherry/eslint-configmetamo-eslint-configmetamo-lint-config@araclx/eslint@tapsellorg/eslint-angular-config@tribecamp/eslint@conten2/eslint-configform-viewsfilters-pack-test@sno2wman/eslint-config@psimk/porter-react-base-skeleton@psimk/porter-react-skeleton@psimk/porter-vue-skeletoneslint-config-sanches-testtaknepoidet-eslint-configeslint-config-refined@martynastell/build-configs@martynastell/eslint-configeslint-config-happyeslint-config-neaf@tomcarter17/eslint-config-typescript-react@nexhome/restrictionseslint-config-coobeet@darkobits/ts-unified@happ/eslint-config@happ/eslint-plugineslint-config-remedy@miszo/eslint-config@ywjt/mpa-builder@ywjt/spa-builder@ywjt/spa-m-buildereslint-config-matthis-libeslint-config-matthis-nodeeslint-config-matthis-webeslint-config-typical@praburangki/eslint-config-basic@beequeue/eslint-configeslint-plugin-ultimate-typescript-configeslint-config-imprintbreki-styleguides@vividcat/eslint-config-standard@leonzalion/eslint-config@leonzalion/eslintrcke-tools-lint@infrascript/config-eslint@zguolee/eslint-config-basic@ymkz/eslint-config@liuxy0551/eslint-config-dtstack-basic@nplus-cumt/eslint-config-basic@ventjs/eslint-config-basic@ixfe/eslint-config-basic@ts-terraform/config-eslint@configscript/config-eslint@silence94/eslint-config-basiceslint-config-jonyamo-baseeslint-config-martyncherryeslint-config-quark@jady/eslint-configopr-config@caryhu/eslint-config-basic@airbnb-config/eslint-config-base@kidwen/eslint-angularmichaelkohler-eslint-config-basegang-eslint-config@fellwork/eslint-config-core@fellwork/eslint-config-foreman@no_idea/eslint-config-basic@michaelkohler/eslint-config-base
57.0.0

4 months ago

56.0.1

7 months ago

56.0.0

8 months ago

55.0.0

11 months ago

54.0.0

12 months ago

53.0.0

1 year ago

52.0.0

1 year ago

51.0.1

1 year ago

51.0.0

1 year ago

50.0.1

1 year ago

50.0.0

1 year ago

49.0.0

2 years ago

48.0.1

2 years ago

48.0.0

2 years ago

47.0.0

2 years ago

46.0.1

2 years ago

46.0.0

2 years ago

45.0.2

3 years ago

45.0.1

3 years ago

45.0.0

3 years ago

44.0.1

3 years ago

44.0.2

3 years ago

44.0.0

3 years ago

43.0.2

3 years ago

43.0.1

3 years ago

43.0.0

3 years ago

42.0.0

3 years ago

41.0.1

3 years ago

40.0.0

3 years ago

40.1.0

3 years ago

41.0.0

3 years ago

38.0.1

4 years ago

38.0.0

4 years ago

39.0.0

4 years ago

37.0.0

4 years ago

37.0.1

4 years ago

36.0.0

4 years ago

35.0.0

4 years ago

34.0.1

4 years ago

34.0.0

4 years ago

33.0.0

4 years ago

33.0.1

4 years ago

32.0.0

4 years ago

32.0.1

4 years ago

31.0.0

4 years ago

30.0.0

4 years ago

29.0.0

4 years ago

28.0.2

4 years ago

28.0.1

4 years ago

28.0.0

4 years ago

27.0.0

4 years ago

26.0.1

4 years ago

26.0.0

4 years ago

25.0.1

4 years ago

25.0.0

4 years ago

24.0.0

4 years ago

23.0.0

5 years ago

22.0.0

5 years ago

21.0.0

5 years ago

20.1.0

5 years ago

20.0.0

5 years ago

19.0.1

5 years ago

19.0.0

5 years ago

18.0.1

5 years ago

18.0.0

5 years ago

17.2.0

5 years ago

17.1.0

5 years ago

17.0.1

5 years ago

17.0.0

5 years ago

16.1.1

5 years ago

16.1.0

5 years ago

16.0.0

5 years ago

15.0.1

5 years ago

15.0.0

5 years ago

14.0.1

6 years ago

14.0.0

6 years ago

13.0.0

6 years ago

12.1.0

6 years ago

12.0.2

6 years ago

12.0.1

6 years ago

12.0.0

6 years ago

11.0.2

6 years ago

11.0.1

6 years ago

11.0.0

6 years ago

10.0.0

6 years ago

9.1.1

6 years ago

9.1.0

6 years ago

9.0.0

6 years ago

8.0.2

6 years ago

8.0.1

6 years ago

8.0.0

6 years ago

7.1.0

6 years ago

7.0.0

6 years ago

6.0.1

7 years ago

6.0.0

7 years ago

5.0.0

7 years ago

4.0.3

7 years ago

4.0.2

7 years ago

4.0.1

7 years ago

4.0.0

7 years ago

3.0.1

8 years ago

3.0.0

8 years ago

2.1.2

8 years ago

2.1.1

8 years ago

2.1.0

8 years ago

2.0.1

8 years ago

2.0.0

8 years ago

1.0.0

9 years ago