From 9ecb68cd870c651c9275344fee535873baef9fef Mon Sep 17 00:00:00 2001 From: Marin Atanasov Date: Mon, 18 Jul 2022 17:55:56 +0300 Subject: [PATCH] Lodash: Refactor away from _.isPlainObject() --- .eslintrc.js | 1 + package-lock.json | 61 ++++++++++++++++++- packages/blocks/package.json | 1 + packages/blocks/src/store/actions.js | 3 +- packages/components/src/text/hook.js | 8 ++- packages/data/package.json | 1 + .../data/src/plugins/persistence/index.js | 3 +- packages/element/package.json | 1 + packages/element/src/serialize.js | 3 +- .../npm-package-json-lint-config/package.json | 3 + .../test/index.test.js | 14 ++--- packages/prettier-config/package.json | 3 + packages/prettier-config/test/index.js | 14 ++--- packages/redux-routine/package.json | 1 + packages/redux-routine/src/is-action.js | 2 +- test/native/jest.config.js | 2 +- test/unit/jest.config.js | 1 + 17 files changed, 94 insertions(+), 28 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index a5c1d80254f7c..6d91043574dd9 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -106,6 +106,7 @@ module.exports = { 'isNumber', 'isObject', 'isObjectLike', + 'isPlainObject', 'isString', 'isUndefined', 'keyBy', diff --git a/package-lock.json b/package-lock.json index 865c7bddb0349..86ad472b1a35a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16653,6 +16653,7 @@ "@wordpress/shortcode": "file:packages/shortcode", "colord": "^2.7.0", "hpq": "^1.3.0", + "is-plain-obj": "^4.1.0", "lodash": "^4.17.21", "memize": "^1.1.0", "rememo": "^4.0.0", @@ -16665,6 +16666,11 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/colord/-/colord-2.8.0.tgz", "integrity": "sha512-kNkVV4KFta3TYQv0bzs4xNwLaeag261pxgzGQSh4cQ1rEhYjcTJfFRP0SDlbhLONg0eSoLzrDd79PosjbltufA==" + }, + "is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" } } }, @@ -16739,6 +16745,11 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz", "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==" }, + "is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" + }, "moment": { "version": "2.29.3", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", @@ -16889,11 +16900,19 @@ "@wordpress/priority-queue": "file:packages/priority-queue", "@wordpress/redux-routine": "file:packages/redux-routine", "equivalent-key-map": "^0.2.2", + "is-plain-obj": "^4.1.0", "is-promise": "^4.0.0", "lodash": "^4.17.21", "redux": "^4.1.2", "turbo-combine-reducers": "^1.0.2", "use-memo-one": "^1.1.1" + }, + "dependencies": { + "is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" + } } }, "@wordpress/data-controls": { @@ -17180,9 +17199,17 @@ "@types/react": "^17.0.37", "@types/react-dom": "^17.0.11", "@wordpress/escape-html": "file:packages/escape-html", + "is-plain-obj": "^4.1.0", "lodash": "^4.17.21", "react": "^17.0.2", "react-dom": "^17.0.2" + }, + "dependencies": { + "is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" + } } }, "@wordpress/env": { @@ -17577,7 +17604,18 @@ }, "@wordpress/npm-package-json-lint-config": { "version": "file:packages/npm-package-json-lint-config", - "dev": true + "dev": true, + "requires": { + "is-plain-obj": "^4.1.0" + }, + "dependencies": { + "is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true + } + } }, "@wordpress/nux": { "version": "file:packages/nux", @@ -17637,7 +17675,18 @@ }, "@wordpress/prettier-config": { "version": "file:packages/prettier-config", - "dev": true + "dev": true, + "requires": { + "is-plain-obj": "^4.1.0" + }, + "dependencies": { + "is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true + } + } }, "@wordpress/primitives": { "version": "file:packages/primitives", @@ -17745,9 +17794,17 @@ "version": "file:packages/redux-routine", "requires": { "@babel/runtime": "^7.16.0", + "is-plain-obj": "^4.1.0", "is-promise": "^4.0.0", "lodash": "^4.17.21", "rungen": "^0.3.2" + }, + "dependencies": { + "is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" + } } }, "@wordpress/report-flaky-tests": { diff --git a/packages/blocks/package.json b/packages/blocks/package.json index b3e9bcc9f0d92..902dca9f54f0a 100644 --- a/packages/blocks/package.json +++ b/packages/blocks/package.json @@ -43,6 +43,7 @@ "@wordpress/shortcode": "file:../shortcode", "colord": "^2.7.0", "hpq": "^1.3.0", + "is-plain-obj": "^4.1.0", "lodash": "^4.17.21", "memize": "^1.1.0", "rememo": "^4.0.0", diff --git a/packages/blocks/src/store/actions.js b/packages/blocks/src/store/actions.js index f4cd32eada6c9..02cdc2f0a0f8a 100644 --- a/packages/blocks/src/store/actions.js +++ b/packages/blocks/src/store/actions.js @@ -1,7 +1,8 @@ /** * External dependencies */ -import { castArray, isPlainObject, omit, pick, some } from 'lodash'; +import isPlainObject from 'is-plain-obj'; +import { castArray, omit, pick, some } from 'lodash'; /** * WordPress dependencies diff --git a/packages/components/src/text/hook.js b/packages/components/src/text/hook.js index c914293c70e5e..7a83bc9c33699 100644 --- a/packages/components/src/text/hook.js +++ b/packages/components/src/text/hook.js @@ -2,7 +2,6 @@ * External dependencies */ import { css } from '@emotion/react'; -import { isPlainObject } from 'lodash'; /** * WordPress dependencies @@ -167,8 +166,11 @@ export default function useText( props ) { */ if ( ! truncate && Array.isArray( children ) ) { content = Children.map( children, ( child ) => { - // @ts-ignore - if ( ! isPlainObject( child ) || ! ( 'props' in child ) ) { + if ( + typeof child !== 'object' || + child === null || + ! ( 'props' in child ) + ) { return child; } diff --git a/packages/data/package.json b/packages/data/package.json index 0b5bc7103247e..fb13ecc5476c7 100644 --- a/packages/data/package.json +++ b/packages/data/package.json @@ -35,6 +35,7 @@ "@wordpress/priority-queue": "file:../priority-queue", "@wordpress/redux-routine": "file:../redux-routine", "equivalent-key-map": "^0.2.2", + "is-plain-obj": "^4.1.0", "is-promise": "^4.0.0", "lodash": "^4.17.21", "redux": "^4.1.2", diff --git a/packages/data/src/plugins/persistence/index.js b/packages/data/src/plugins/persistence/index.js index 3029b459b3ad9..a9eb1d21bd1e9 100644 --- a/packages/data/src/plugins/persistence/index.js +++ b/packages/data/src/plugins/persistence/index.js @@ -1,7 +1,8 @@ /** * External dependencies */ -import { merge, isPlainObject } from 'lodash'; +import isPlainObject from 'is-plain-obj'; +import { merge } from 'lodash'; /** * Internal dependencies diff --git a/packages/element/package.json b/packages/element/package.json index f1df161755a79..7ba42d5b42422 100644 --- a/packages/element/package.json +++ b/packages/element/package.json @@ -32,6 +32,7 @@ "@types/react": "^17.0.37", "@types/react-dom": "^17.0.11", "@wordpress/escape-html": "file:../escape-html", + "is-plain-obj": "^4.1.0", "lodash": "^4.17.21", "react": "^17.0.2", "react-dom": "^17.0.2" diff --git a/packages/element/src/serialize.js b/packages/element/src/serialize.js index 9e14a089f8eb4..dd3d26b6c4b8f 100644 --- a/packages/element/src/serialize.js +++ b/packages/element/src/serialize.js @@ -28,7 +28,8 @@ /** * External dependencies */ -import { kebabCase, isPlainObject } from 'lodash'; +import isPlainObject from 'is-plain-obj'; +import { kebabCase } from 'lodash'; /** * WordPress dependencies diff --git a/packages/npm-package-json-lint-config/package.json b/packages/npm-package-json-lint-config/package.json index fc82b9cd8aba4..f18cb00b57bf4 100644 --- a/packages/npm-package-json-lint-config/package.json +++ b/packages/npm-package-json-lint-config/package.json @@ -26,6 +26,9 @@ "index.js" ], "main": "index.js", + "dependencies": { + "is-plain-obj": "^4.1.0" + }, "peerDependencies": { "npm-package-json-lint": ">=3.6.0" }, diff --git a/packages/npm-package-json-lint-config/test/index.test.js b/packages/npm-package-json-lint-config/test/index.test.js index 16dd989d61fd3..15733d7d0198c 100644 --- a/packages/npm-package-json-lint-config/test/index.test.js +++ b/packages/npm-package-json-lint-config/test/index.test.js @@ -1,17 +1,13 @@ +/** + * External dependencies + */ +import isPlainObject from 'is-plain-obj'; + /** * Internal dependencies */ import config from '../'; -const isPlainObject = ( obj ) => { - return ( - typeof obj === 'object' && - obj !== null && - obj.constructor === Object && - Object.prototype.toString.call( obj ) === '[object Object]' - ); -}; - describe( 'npm-package-json-lint config tests', () => { it( 'should be an object', () => { expect( isPlainObject( config ) ).toBeTruthy(); diff --git a/packages/prettier-config/package.json b/packages/prettier-config/package.json index b8afd52844bc3..ecae559e7c9ae 100644 --- a/packages/prettier-config/package.json +++ b/packages/prettier-config/package.json @@ -27,6 +27,9 @@ ], "main": "lib/index.js", "types": "build-types", + "dependencies": { + "is-plain-obj": "^4.1.0" + }, "peerDependencies": { "prettier": ">=2" }, diff --git a/packages/prettier-config/test/index.js b/packages/prettier-config/test/index.js index 991ed5d3bbe5e..13b136107db88 100644 --- a/packages/prettier-config/test/index.js +++ b/packages/prettier-config/test/index.js @@ -1,17 +1,13 @@ +/** + * External dependencies + */ +import isPlainObject from 'is-plain-obj'; + /** * Internal dependencies */ import config from '../lib/'; -const isPlainObject = ( obj ) => { - return ( - typeof obj === 'object' && - obj !== null && - obj.constructor === Object && - Object.prototype.toString.call( obj ) === '[object Object]' - ); -}; - describe( 'prettier config tests', () => { it( 'should be an object', () => { expect( isPlainObject( config ) ).toBeTruthy(); diff --git a/packages/redux-routine/package.json b/packages/redux-routine/package.json index 24091f7471c15..a3cf1777de26e 100644 --- a/packages/redux-routine/package.json +++ b/packages/redux-routine/package.json @@ -30,6 +30,7 @@ "sideEffects": false, "dependencies": { "@babel/runtime": "^7.16.0", + "is-plain-obj": "^4.1.0", "is-promise": "^4.0.0", "lodash": "^4.17.21", "rungen": "^0.3.2" diff --git a/packages/redux-routine/src/is-action.js b/packages/redux-routine/src/is-action.js index bcabab4e07a88..cdd59c8cd63d2 100644 --- a/packages/redux-routine/src/is-action.js +++ b/packages/redux-routine/src/is-action.js @@ -1,7 +1,7 @@ /** * External dependencies */ -import { isPlainObject } from 'lodash'; +import isPlainObject from 'is-plain-obj'; /* eslint-disable jsdoc/valid-types */ /** diff --git a/test/native/jest.config.js b/test/native/jest.config.js index a6ccf676882fb..0a7bf84287f42 100644 --- a/test/native/jest.config.js +++ b/test/native/jest.config.js @@ -65,7 +65,7 @@ module.exports = { // See: https://github.com/wordpress-mobile/gutenberg-mobile/pull/257#discussion_r234978268 // There is no overloading in jest so we need to rewrite the config from react-native-jest-preset: // https://github.com/facebook/react-native/blob/HEAD/jest-preset.json#L20 - 'node_modules/(?!(simple-html-tokenizer|(jest-)?react-native|@react-native|react-clone-referenced-element|@react-navigation))', + 'node_modules/(?!(simple-html-tokenizer|is-plain-obj|(jest-)?react-native|@react-native|react-clone-referenced-element|@react-navigation))', ], snapshotSerializers: [ '@emotion/jest/serializer' ], reporters: [ 'default', 'jest-junit' ], diff --git a/test/unit/jest.config.js b/test/unit/jest.config.js index c430aae0ed244..2294974ffea32 100644 --- a/test/unit/jest.config.js +++ b/test/unit/jest.config.js @@ -36,6 +36,7 @@ module.exports = { transform: { '^.+\\.[jt]sx?$': '/test/unit/scripts/babel-transformer.js', }, + transformIgnorePatterns: [ 'node_modules/(?!(is-plain-obj))' ], snapshotSerializers: [ 'enzyme-to-json/serializer', '@emotion/jest/serializer',