diff --git a/docs/rules/prefer-exponentiation-operator.md b/docs/rules/prefer-exponentiation-operator.md index 8358b728f8..966549fc8e 100644 --- a/docs/rules/prefer-exponentiation-operator.md +++ b/docs/rules/prefer-exponentiation-operator.md @@ -1,5 +1,7 @@ # Prefer the exponentiation operator over `Math.pow()` +**This rule is deprecated. Use the built-in ESLint [`prefer-exponentiation-operator`](https://eslint.org/docs/rules/prefer-exponentiation-operator) rule instead.** + Enforces the use of the [exponentiation operator](http://2ality.com/2016/02/exponentiation-operator.html) over [`Math.pow()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/pow). This rule is fixable. diff --git a/index.js b/index.js index fec6e2a4b8..c83f2ea4cf 100644 --- a/index.js +++ b/index.js @@ -46,7 +46,6 @@ module.exports = { 'unicorn/prefer-add-event-listener': 'error', 'unicorn/prefer-dataset': 'error', 'unicorn/prefer-event-key': 'error', - 'unicorn/prefer-exponentiation-operator': 'error', 'unicorn/prefer-flat-map': 'error', 'unicorn/prefer-includes': 'error', 'unicorn/prefer-modern-dom-apis': 'error', diff --git a/readme.md b/readme.md index 923fa503cd..1d73a498a5 100644 --- a/readme.md +++ b/readme.md @@ -64,7 +64,6 @@ Configure it in `package.json`. "unicorn/prefer-add-event-listener": "error", "unicorn/prefer-dataset": "error", "unicorn/prefer-event-key": "error", - "unicorn/prefer-exponentiation-operator": "error", "unicorn/prefer-flat-map": "error", "unicorn/prefer-includes": "error", "unicorn/prefer-modern-dom-apis": "error", @@ -118,7 +117,6 @@ Configure it in `package.json`. - [prefer-add-event-listener](docs/rules/prefer-add-event-listener.md) - Prefer `.addEventListener()` and `.removeEventListener()` over `on`-functions. *(partly fixable)* - [prefer-dataset](docs/rules/prefer-dataset.md) - Prefer using `.dataset` on DOM elements over `.setAttribute(…)`. *(fixable)* - [prefer-event-key](docs/rules/prefer-event-key.md) - Prefer `KeyboardEvent#key` over `KeyboardEvent#keyCode`. *(partly fixable)* -- [prefer-exponentiation-operator](docs/rules/prefer-exponentiation-operator.md) - Prefer the exponentiation operator over `Math.pow()` *(fixable)* - [prefer-flat-map](docs/rules/prefer-flat-map.md) - Prefer `.flatMap(…)` over `.map(…).flat()`. *(fixable)* - [prefer-includes](docs/rules/prefer-includes.md) - Prefer `.includes()` over `.indexOf()` when checking for existence or non-existence. *(fixable)* - [prefer-modern-dom-apis](docs/rules/prefer-modern-dom-apis.md) - Prefer `.before()` over `.insertBefore()`, `.replaceWith()` over `.replaceChild()`, prefer one of `.before()`, `.after()`, `.append()` or `.prepend()` over `insertAdjacentText()` and `insertAdjacentElement()`. *(fixable)* @@ -137,6 +135,9 @@ Configure it in `package.json`. - [regex-shorthand](docs/rules/regex-shorthand.md) - Enforce the use of regex shorthands to improve readability. *(fixable)* - [throw-new-error](docs/rules/throw-new-error.md) - Require `new` when throwing an error. *(fixable)* +## Deprecated Rules + +- [prefer-exponentiation-operator](docs/rules/prefer-exponentiation-operator.md) - Use the built-in ESLint [`prefer-exponentiation-operator`](https://eslint.org/docs/rules/prefer-exponentiation-operator) rule instead. ## Recommended config diff --git a/rules/prefer-exponentiation-operator.js b/rules/prefer-exponentiation-operator.js index ff5e5e49e7..df7e6d0ce0 100644 --- a/rules/prefer-exponentiation-operator.js +++ b/rules/prefer-exponentiation-operator.js @@ -58,5 +58,9 @@ module.exports = { url: getDocumentationUrl(__filename) }, fixable: 'code' - } + }, + deprecated: true, + replacedBy: [ + 'prefer-exponentiation-operator' + ] }; diff --git a/test/package.js b/test/package.js index b8d43d747c..4fc902458e 100644 --- a/test/package.js +++ b/test/package.js @@ -15,6 +15,10 @@ const ignoredRules = [ 'no-nested-ternary' ]; +const deprecatedRules = [ + 'prefer-exponentiation-operator' +]; + const testSorted = (t, actualOrder, sourceName) => { actualOrder = actualOrder.filter(x => !ignoredRules.includes(x)); const sortedOrder = actualOrder.slice(0).sort(); @@ -30,13 +34,14 @@ test('Every rule is defined in index file in alphabetical order', t => { for (const file of ruleFiles) { const name = path.basename(file, '.js'); t.truthy(index.rules[name], `'${name}' is not exported in 'index.js'`); - t.truthy(index.configs.recommended.rules[`unicorn/${name}`], `'${name}' is not set in the recommended config`); + if (!deprecatedRules.includes(name)) { + t.truthy(index.configs.recommended.rules[`unicorn/${name}`], `'${name}' is not set in the recommended config`); + } + t.truthy(fs.existsSync(path.join('docs/rules', `${name}.md`)), `There is no documentation for '${name}'`); t.truthy(fs.existsSync(path.join('test', file)), `There are no tests for '${name}'`); } - console.log(Object.keys(index.rules).length - ignoredRules.length, ruleFiles.length); - t.is( Object.keys(index.rules).length, ruleFiles.length, @@ -44,7 +49,7 @@ test('Every rule is defined in index file in alphabetical order', t => { ); t.is( Object.keys(index.configs.recommended.rules).length - ignoredRules.length, - ruleFiles.length, + ruleFiles.length - deprecatedRules.length, 'There are more exported rules in the recommended config than rule files.' ); @@ -62,7 +67,7 @@ test('Every rule is defined in readme.md usage and list of rules in alphabetical t.truthy(usageRules, 'List of rules should be defined in readme.md ## Usage and be valid JSON'); - const rulesMatch = /## Rules(.*?)## Recommended config/ms.exec(readme); + const rulesMatch = /## Rules(.*?)## Deprecated Rules/ms.exec(readme); t.truthy(rulesMatch, 'List of rules should be defined in readme.md in ## Rules before ## Recommended config'); const rulesText = rulesMatch[1]; const re = /- \[(.*?)]\((.*?)\) - (.*)\n/gm; @@ -77,14 +82,17 @@ test('Every rule is defined in readme.md usage and list of rules in alphabetical } } while (match); - for (const file of ruleFiles) { - const name = path.basename(file, '.js'); + const availableRules = ruleFiles + .map(file => path.basename(file, '.js')) + .filter(name => !deprecatedRules.includes(name)); + + for (const name of availableRules) { t.truthy(usageRules[`unicorn/${name}`], `'${name}' is not described in the readme.md ## Usage`); t.truthy(rules.includes(name), `'${name}' is not described in the readme.md ## Rules`); } - t.is(Object.keys(usageRules).length - ignoredRules.length, ruleFiles.length, 'There are more rules in readme.md ## Usage than rule files.'); - t.is(Object.keys(rules).length, ruleFiles.length, 'There are more rules in readme.md ## Rules than rule files.'); + t.is(Object.keys(usageRules).length - ignoredRules.length, availableRules.length, 'There are more rules in readme.md ## Usage than rule files.'); + t.is(Object.keys(rules).length, availableRules.length, 'There are more rules in readme.md ## Rules than rule files.'); testSorted(t, Object.keys(usageRules), 'readme.md ## Usage rules'); testSorted(t, rules, 'readme.md ## Rules'); diff --git a/test/prefer-exponentiation-operator.js b/test/prefer-exponentiation-operator.js index e75849209b..8e7aa7854d 100644 --- a/test/prefer-exponentiation-operator.js +++ b/test/prefer-exponentiation-operator.js @@ -10,6 +10,11 @@ const ruleTester = avaRuleTester(test, { const message = 'Prefer the exponentiation operator over `Math.pow()`.'; +test('deprecated', t => { + t.true(rule.deprecated); + t.deepEqual(rule.replacedBy, ['prefer-exponentiation-operator']); +}); + ruleTester.run('prefer-exponentiation-operator', rule, { valid: [ 'a ** b;',