From 309771da578ea644abc7323735aabdbf7f8571b2 Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Wed, 30 Mar 2022 19:36:39 +0800 Subject: [PATCH] `prefer-object-from-entries`: Stop checking unknown cases (#1771) --- docs/rules/prefer-object-from-entries.md | 4 - rules/prefer-object-from-entries.js | 10 - test/prefer-object-from-entries.mjs | 100 +++-- .../prefer-object-from-entries.mjs.md | 344 +----------------- .../prefer-object-from-entries.mjs.snap | Bin 3486 -> 2317 bytes 5 files changed, 49 insertions(+), 409 deletions(-) diff --git a/docs/rules/prefer-object-from-entries.md b/docs/rules/prefer-object-from-entries.md index 241ff17223..9928f398d1 100644 --- a/docs/rules/prefer-object-from-entries.md +++ b/docs/rules/prefer-object-from-entries.md @@ -34,10 +34,6 @@ const object = pairs.reduce( ); ``` -```js -const object = pairs.reduce(addPairToObject, {}); -``` - ```js const object = _.fromPairs(pairs); ``` diff --git a/rules/prefer-object-from-entries.js b/rules/prefer-object-from-entries.js index abeb087850..d0fc85a4b7 100644 --- a/rules/prefer-object-from-entries.js +++ b/rules/prefer-object-from-entries.js @@ -183,10 +183,6 @@ function create(context) { for (const {selector, test, getProperty} of fixableArrayReduceCases) { listeners[selector] = node => { - // If this listener exits without adding a fix, the `arrayReduceWithEmptyObject` listener - // should still add it into the `arrayReduce` map. To be safer, add it here too. - arrayReduce.set(node, undefined); - const [callbackFunction] = node.arguments; if (!test(callbackFunction)) { return; @@ -211,12 +207,6 @@ function create(context) { }; } - listeners[arrayReduceWithEmptyObject] = node => { - if (!arrayReduce.has(node)) { - arrayReduce.set(node, undefined); - } - }; - listeners['Program:exit'] = () => { for (const [node, fix] of arrayReduce.entries()) { context.report({ diff --git a/test/prefer-object-from-entries.mjs b/test/prefer-object-from-entries.mjs index 67c8848d8e..152d2978b8 100644 --- a/test/prefer-object-from-entries.mjs +++ b/test/prefer-object-from-entries.mjs @@ -30,6 +30,52 @@ test.snapshot({ 'pairs.reduce(object => ({...object, key}), object.create(null));', 'pairs.reduce(object => ({...object, key}), object.CREATE(null));', 'pairs.reduce(object => ({...object, key}), Object.create("null"));', + // Unknown callback + 'pairs.reduce(callback, {})', + 'pairs.reduce(callback, Object.create(null))', + 'pairs.reduce(async function * () {}, {})', + 'pairs.reduce()', + 'pairs.reduce(callback, {}, extraArgument)', + 'pairs.reduce?.(callback, {})', + 'pairs?.reduce(callback, {})', + 'pairs.notReduce(callback, {})', + 'pairs[reduce](callback, {})', + 'pairs.reduce(...callback, {})', + 'pairs.reduce(function(object) {Object.assign(object, {key})}, {});', + 'pairs.reduce(object => ({...object, key} + 1), {});', + 'pairs.reduce((object = {}) => ({...object, key}), {});', + 'pairs.reduce((object) => ({...NotSameObject, key}), {});', + 'pairs.reduce(object => ({...object, key, anotherKey}), {});', + 'pairs.reduce(object => ({}), {});', + 'pairs.reduce(object => ({keyFirst, ...object}), {});', + 'pairs.reduce(async object => ({...object, key}), {});', + 'pairs.reduce(async object => await {...object, key}, {});', + 'pairs.reduce((...object) => ({...object, key}), {});', + 'pairs.reduce(({object}) => ({...object, key}), {});', + 'pairs.reduce(object => ({...object, ...key}), {});', + 'pairs.reduce(object => Object.assign(NotSameObject, {key}), {});', + 'pairs.reduce(object => Object.assign(object, {}), {});', + 'pairs.reduce(object => Object.assign(object, {...key}), {});', + 'pairs.reduce(object => Object.assign?.(object, {key}), {});', + 'pairs.reduce(object => Object?.assign(object, {key}), {});', + 'pairs.reduce(object => Object.notAssign(object, {key}), {});', + 'pairs.reduce(object => NotObject.assign(object, {key}), {});', + // `object` is used somewhere else + 'pairs.reduce(object => ({...object, object}), {});', + 'pairs.reduce(object => ({...object, key: Object.keys(object)}), {});', + 'pairs.reduce((object, [key, value = object]) => ({...object, [key]: value}), {});', + 'pairs.reduce((object) => Object.assign(object, {object}), {});', + 'pairs.reduce(object => ({...object, key: function () { return object; }}), {});', + // Complicated key value + 'pairs.reduce(object => ({...object, method() {}}), {});', + 'pairs.reduce(object => Object.assign(object, {async * method() {}}), {});', + 'pairs.reduce(object => ({...object, async method() {}}), {});', + 'pairs.reduce(object => ({...object, * method() {}}), {});', + 'pairs.reduce(object => ({...object, async * method() {}}), {});', + 'pairs.reduce(object => ({...object, get key() {}}), {});', + 'pairs.reduce(object => ({...object, set key(v) {}}), {});', + // #1631 + 'const flattened = arrayOfObjects.reduce((flattened, next) => Object.assign(flattened, next), {});', ], invalid: [ 'pairs.reduce(object => ({...object, key}), {});', @@ -100,61 +146,9 @@ test.snapshot({ // `.reduce` has multiple parameters 'pairs.reduce((object, element, index, array) => ({...object, key}), {});', 'pairs.reduce((object, [key, value], index, array,) => ({...object, [key]: value + index + array.length}), {});', - // Callback function, not fixable, but should still be caught by another listener - 'pairs.reduce(function(object) {Object.assign(object, {key})}, {});', - 'pairs.reduce(object => ({...object, key} + 1), {});', - 'pairs.reduce((object = {}) => ({...object, key}), {});', - 'pairs.reduce((object) => ({...NotSameObject, key}), {});', - 'pairs.reduce(object => ({...object, key, anotherKey}), {});', - 'pairs.reduce(object => ({}), {});', - 'pairs.reduce(object => ({keyFirst, ...object}), {});', - 'pairs.reduce(async object => ({...object, key}), {});', - 'pairs.reduce(async object => await {...object, key}, {});', - 'pairs.reduce((...object) => ({...object, key}), {});', - 'pairs.reduce(({object}) => ({...object, key}), {});', - 'pairs.reduce(object => ({...object, ...key}), {});', - 'pairs.reduce(object => Object.assign(NotSameObject, {key}), {});', - 'pairs.reduce(object => Object.assign(object, {}), {});', - 'pairs.reduce(object => Object.assign(object, {...key}), {});', - 'pairs.reduce(object => Object.assign?.(object, {key}), {});', - 'pairs.reduce(object => Object?.assign(object, {key}), {});', - 'pairs.reduce(object => Object.notAssign(object, {key}), {});', - 'pairs.reduce(object => NotObject.assign(object, {key}), {});', - // `object` is used somewhere else - 'pairs.reduce(object => ({...object, object}), {});', - 'pairs.reduce(object => ({...object, key: Object.keys(object)}), {});', - 'pairs.reduce((object, [key, value = object]) => ({...object, [key]: value}), {});', - 'pairs.reduce((object) => Object.assign(object, {object}), {});', - 'pairs.reduce(object => ({...object, key: function () { return object; }}), {});', - 'pairs.reduce(object => ({...object, key: function (object) { return object; }}), {});', // This is fixable - // Complicated key value - 'pairs.reduce(object => ({...object, method() {}}), {});', - 'pairs.reduce(object => Object.assign(object, {async * method() {}}), {});', - 'pairs.reduce(object => ({...object, async method() {}}), {});', - 'pairs.reduce(object => ({...object, * method() {}}), {});', - 'pairs.reduce(object => ({...object, async * method() {}}), {});', + 'pairs.reduce(object => ({...object, key: function (object) { return object; }}), {});', 'pairs.reduce(object => ({...object, method: async () => {}}), {});', 'pairs.reduce(object => ({...object, method: async function * (){}}), {});', - 'pairs.reduce(object => ({...object, get key() {}}), {});', - 'pairs.reduce(object => ({...object, set key(v) {}}), {});', - ], -}); - -// Non-fixable `Array#reduce()` -test.snapshot({ - valid: [ - 'pairs.reduce()', - 'pairs.reduce(callback, {}, extraArgument)', - 'pairs.reduce?.(callback, {})', - 'pairs?.reduce(callback, {})', - 'pairs.notReduce(callback, {})', - 'pairs[reduce](callback, {})', - 'pairs.reduce(...callback, {})', - ], - invalid: [ - 'pairs.reduce(callback, {})', - 'pairs.reduce(callback, Object.create(null))', - 'pairs.reduce(async function * () {}, {})', ], }); diff --git a/test/snapshots/prefer-object-from-entries.mjs.md b/test/snapshots/prefer-object-from-entries.mjs.md index 257b1da2ae..e096845d57 100644 --- a/test/snapshots/prefer-object-from-entries.mjs.md +++ b/test/snapshots/prefer-object-from-entries.mjs.md @@ -612,246 +612,6 @@ Generated by [AVA](https://avajs.dev). ` ## Invalid #36 - 1 | pairs.reduce(function(object) {Object.assign(object, {key})}, {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(function(object) {Object.assign(object, {key})}, {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #37 - 1 | pairs.reduce(object => ({...object, key} + 1), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(object => ({...object, key} + 1), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #38 - 1 | pairs.reduce((object = {}) => ({...object, key}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce((object = {}) => ({...object, key}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #39 - 1 | pairs.reduce((object) => ({...NotSameObject, key}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce((object) => ({...NotSameObject, key}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #40 - 1 | pairs.reduce(object => ({...object, key, anotherKey}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(object => ({...object, key, anotherKey}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #41 - 1 | pairs.reduce(object => ({}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(object => ({}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #42 - 1 | pairs.reduce(object => ({keyFirst, ...object}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(object => ({keyFirst, ...object}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #43 - 1 | pairs.reduce(async object => ({...object, key}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(async object => ({...object, key}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #44 - 1 | pairs.reduce(async object => await {...object, key}, {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(async object => await {...object, key}, {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #45 - 1 | pairs.reduce((...object) => ({...object, key}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce((...object) => ({...object, key}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #46 - 1 | pairs.reduce(({object}) => ({...object, key}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(({object}) => ({...object, key}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #47 - 1 | pairs.reduce(object => ({...object, ...key}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(object => ({...object, ...key}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #48 - 1 | pairs.reduce(object => Object.assign(NotSameObject, {key}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(object => Object.assign(NotSameObject, {key}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #49 - 1 | pairs.reduce(object => Object.assign(object, {}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(object => Object.assign(object, {}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #50 - 1 | pairs.reduce(object => Object.assign(object, {...key}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(object => Object.assign(object, {...key}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #51 - 1 | pairs.reduce(object => Object.assign?.(object, {key}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(object => Object.assign?.(object, {key}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #52 - 1 | pairs.reduce(object => Object?.assign(object, {key}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(object => Object?.assign(object, {key}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #53 - 1 | pairs.reduce(object => Object.notAssign(object, {key}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(object => Object.notAssign(object, {key}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #54 - 1 | pairs.reduce(object => NotObject.assign(object, {key}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(object => NotObject.assign(object, {key}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #55 - 1 | pairs.reduce(object => ({...object, object}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(object => ({...object, object}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #56 - 1 | pairs.reduce(object => ({...object, key: Object.keys(object)}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(object => ({...object, key: Object.keys(object)}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #57 - 1 | pairs.reduce((object, [key, value = object]) => ({...object, [key]: value}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce((object, [key, value = object]) => ({...object, [key]: value}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #58 - 1 | pairs.reduce((object) => Object.assign(object, {object}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce((object) => Object.assign(object, {object}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #59 - 1 | pairs.reduce(object => ({...object, key: function () { return object; }}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(object => ({...object, key: function () { return object; }}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #60 1 | pairs.reduce(object => ({...object, key: function (object) { return object; }}), {}); > Output @@ -867,57 +627,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ ` -## Invalid #61 - 1 | pairs.reduce(object => ({...object, method() {}}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(object => ({...object, method() {}}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #62 - 1 | pairs.reduce(object => Object.assign(object, {async * method() {}}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(object => Object.assign(object, {async * method() {}}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #63 - 1 | pairs.reduce(object => ({...object, async method() {}}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(object => ({...object, async method() {}}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #64 - 1 | pairs.reduce(object => ({...object, * method() {}}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(object => ({...object, * method() {}}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #65 - 1 | pairs.reduce(object => ({...object, async * method() {}}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(object => ({...object, async * method() {}}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #66 +## Invalid #37 1 | pairs.reduce(object => ({...object, method: async () => {}}), {}); > Output @@ -933,7 +643,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ ` -## Invalid #67 +## Invalid #38 1 | pairs.reduce(object => ({...object, method: async function * (){}}), {}); > Output @@ -949,56 +659,6 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ ` -## Invalid #68 - 1 | pairs.reduce(object => ({...object, get key() {}}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(object => ({...object, get key() {}}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #69 - 1 | pairs.reduce(object => ({...object, set key(v) {}}), {}); - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(object => ({...object, set key(v) {}}), {});␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #1 - 1 | pairs.reduce(callback, {}) - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(callback, {})␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #2 - 1 | pairs.reduce(callback, Object.create(null)) - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(callback, Object.create(null))␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - -## Invalid #3 - 1 | pairs.reduce(async function * () {}, {}) - -> Error 1/1 - - `␊ - > 1 | pairs.reduce(async function * () {}, {})␊ - | ^^^^^^ Prefer \`Object.fromEntries()\` over \`Array#reduce()\`.␊ - ` - ## Invalid #1 1 | _.fromPairs(pairs) diff --git a/test/snapshots/prefer-object-from-entries.mjs.snap b/test/snapshots/prefer-object-from-entries.mjs.snap index 831057d723fc05c684871819cbc2dbcb402bca23..b323c62f2d6b1e6733f53a6e428c6445af4133ab 100644 GIT binary patch literal 2317 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 literal 3486 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