From d992ae0448d2a032e1b65057fb8cb7d4725aa00d Mon Sep 17 00:00:00 2001 From: George Zahariev Date: Thu, 28 Apr 2022 19:40:55 -0700 Subject: [PATCH] Codemod `Object.assign` with object literal first argument to object spread in Xplat Summary: Codemod `Object.assign` with object literal first argument (e.g. `Object.assign({}, foo)`) to object spread. This adds several suppressions for exposed errors. The codemod produces errors as `Object.assign` is more unsafe than object spread. For example, `Object.assign` doesn't handle indexers, nor does it handle inexact objects properly, and when the (currently unsealed) empty object is supplied as the first argument, it also leads to unsafe behaviour: https://flow.org/try/#0FAehAIGJwSQOwCYFMAeSBOBnYyDGAbAQ3SXADdjwBbQgBwC5wBvAbUwBd0BLOAcwF1GHbnwC+AbmDAAFAHkARgCskudgDpCmTF15xpTQowCMogDTU6ASkbyA9rfxJCcS+PBhwAfm8ymwcAGG4Eam-gFqETS0oaKu7hAAyrQkhAjgGOi2WOCa6Si0KuxICFIe0PCohKo5AGZF6HlV7DgqRCTklDyVqowGQpw8vOYRahJSCsqqGlo6en3gAEQAFlwL5vLGZuBdKE1xHjtN4Li2AK74abZkGVzI4AAG8vfgUvphOYzLq6EB4BvBP3CEUOqhi+0SyScaQyWUwOThqAKqmKpQg0AAqnBME5HGkalwsOwcuheDIJoVptpdPotvMTNZmDV7Iw4KcqPIMLE3B5vN4gA The codemod is safe to do, despite some Flow errors, as `Object.assign` and object spread are equivalent at runtime, with the exception that `Object.assign` triggers setters on the target object. However the codemod [does not run](https://github.com/eslint/eslint/blob/938dbdd6c310784cc8a7329efaeb0e34321b9e1f/lib/rules/prefer-object-spread.js#L283-L285) if the first argument (object literal) has getters/setters, so we are fine. ``` ag -l 'Object.assign\(' | xargs ag -l 'flow' | xargs js1 lint --rule '{"prefer-object-spread":2}' --fix ``` Some manual fixes ``` arc f ``` Reviewed By: SamChou19815 Differential Revision: D36023786 fbshipit-source-id: b682562e670410acf4175ba59ab285c7bdcfe052 --- Libraries/Components/StatusBar/StatusBar.js | 17 ++--- Libraries/Inspector/ElementBox.js | 2 +- .../LogBox/Data/__tests__/LogBoxData-test.js | 62 ++++++++----------- Libraries/Utilities/truncate.js | 2 +- 4 files changed, 38 insertions(+), 45 deletions(-) diff --git a/Libraries/Components/StatusBar/StatusBar.js b/Libraries/Components/StatusBar/StatusBar.js index 628bd67b6de..e07389c9723 100644 --- a/Libraries/Components/StatusBar/StatusBar.js +++ b/Libraries/Components/StatusBar/StatusBar.js @@ -112,14 +112,17 @@ function mergePropsStack( propsStack: Array, defaultValues: Object, ): Object { - return propsStack.reduce((prev, cur) => { - for (const prop in cur) { - if (cur[prop] != null) { - prev[prop] = cur[prop]; + return propsStack.reduce( + (prev, cur) => { + for (const prop in cur) { + if (cur[prop] != null) { + prev[prop] = cur[prop]; + } } - } - return prev; - }, Object.assign({}, defaultValues)); + return prev; + }, + {...defaultValues}, + ); } /** diff --git a/Libraries/Inspector/ElementBox.js b/Libraries/Inspector/ElementBox.js index 8c12ca73ebd..001effee47c 100644 --- a/Libraries/Inspector/ElementBox.js +++ b/Libraries/Inspector/ElementBox.js @@ -102,7 +102,7 @@ type Style = { * @return a modified copy */ function resolveRelativeSizes(style: $ReadOnly