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 831057d723..b323c62f2d 100644 Binary files a/test/snapshots/prefer-object-from-entries.mjs.snap and b/test/snapshots/prefer-object-from-entries.mjs.snap differ