From 096360db0303f7582eae80331ee4a54762f3b022 Mon Sep 17 00:00:00 2001 From: Sebastian Markbage Date: Wed, 8 Oct 2014 11:32:40 -0700 Subject: [PATCH] Use Object.assign instead of merge, mergeInto, mixInto and copyProperties This makes it easier to contribute without having to learn a bunch of slightly different helpers and remember their slightly different signatures and semantics. We'll probably start using ES7 spread properties instead of merge in the future when at least one more transpiler supports it. --- .../transitions/ReactCSSTransitionGroup.js | 4 +-- .../transitions/ReactTransitionGroup.js | 3 +- src/addons/update.js | 5 ++- src/browser/ReactBrowserEventEmitter.js | 3 +- src/browser/ReactPutListenerQueue.js | 4 +-- src/browser/ReactReconcileTransaction.js | 5 +-- src/browser/ReactTextComponent.js | 4 +-- .../server/ReactServerRenderingTransaction.js | 8 +++-- src/browser/syntheticEvents/SyntheticEvent.js | 8 ++--- src/browser/ui/ReactDOMComponent.js | 17 +++++----- src/browser/ui/ReactEventListener.js | 3 +- .../ui/__tests__/ReactDOMComponent-test.js | 13 +++---- .../ui/dom/components/ReactDOMInput.js | 3 +- .../ui/dom/components/ReactDOMSelect.js | 4 +-- .../ui/dom/components/ReactDOMTextarea.js | 3 +- src/core/ReactComponent.js | 5 ++- src/core/ReactCompositeComponent.js | 34 ++++++++++++------- src/core/ReactContext.js | 4 +-- src/core/ReactDefaultBatchingStrategy.js | 14 ++++---- src/core/ReactLegacyElement.js | 2 +- src/core/ReactNativeComponent.js | 3 +- src/core/ReactPropTransferer.js | 5 ++- src/core/ReactUpdates.js | 6 ++-- .../__tests__/EventPluginRegistry-test.js | 4 +-- src/test/ReactDefaultPerfAnalysis.js | 16 ++++++--- src/test/ReactTestUtils.js | 6 ++-- src/test/reactComponentExpect.js | 4 +-- src/utils/CallbackQueue.js | 3 +- src/utils/LegacyImmutableObject.js | 10 +++--- src/utils/OrderedMap.js | 3 +- src/utils/__tests__/Transaction-test.js | 14 ++++---- src/utils/mixInto.js | 34 ------------------- src/vendor/core/emptyFunction.js | 4 +-- src/vendor/immutable/Immutable.js | 3 +- 34 files changed, 103 insertions(+), 158 deletions(-) delete mode 100644 src/utils/mixInto.js diff --git a/src/addons/transitions/ReactCSSTransitionGroup.js b/src/addons/transitions/ReactCSSTransitionGroup.js index c54d9a7aeb..5b6ce5607c 100644 --- a/src/addons/transitions/ReactCSSTransitionGroup.js +++ b/src/addons/transitions/ReactCSSTransitionGroup.js @@ -28,8 +28,6 @@ var ReactCSSTransitionGroupChild = React.createFactory( require('ReactCSSTransitionGroupChild') ); -var merge = require('merge'); - var ReactCSSTransitionGroup = React.createClass({ displayName: 'ReactCSSTransitionGroup', @@ -63,7 +61,7 @@ var ReactCSSTransitionGroup = React.createClass({ render: function() { return ( ReactTransitionGroup( - merge(this.props, {childFactory: this._wrapChild}) + Object.assign({}, this.props, {childFactory: this._wrapChild}) ) ); } diff --git a/src/addons/transitions/ReactTransitionGroup.js b/src/addons/transitions/ReactTransitionGroup.js index 174d389676..1203abb703 100644 --- a/src/addons/transitions/ReactTransitionGroup.js +++ b/src/addons/transitions/ReactTransitionGroup.js @@ -23,7 +23,6 @@ var ReactTransitionChildMapping = require('ReactTransitionChildMapping'); var cloneWithProps = require('cloneWithProps'); var emptyFunction = require('emptyFunction'); -var merge = require('merge'); var ReactTransitionGroup = React.createClass({ displayName: 'ReactTransitionGroup', @@ -159,7 +158,7 @@ var ReactTransitionGroup = React.createClass({ // This entered again before it fully left. Add it again. this.performEnter(key); } else { - var newChildren = merge(this.state.children); + var newChildren = Object.assign({}, this.state.children); delete newChildren[key]; this.setState({children: newChildren}); } diff --git a/src/addons/update.js b/src/addons/update.js index 43ec8dd53f..c55f4b13dd 100644 --- a/src/addons/update.js +++ b/src/addons/update.js @@ -18,7 +18,6 @@ "use strict"; -var copyProperties = require('copyProperties'); var keyOf = require('keyOf'); var invariant = require('invariant'); @@ -26,7 +25,7 @@ function shallowCopy(x) { if (Array.isArray(x)) { return x.concat(); } else if (x && typeof x === 'object') { - return copyProperties(new x.constructor(), x); + return Object.assign(new x.constructor(), x); } else { return x; } @@ -106,7 +105,7 @@ function update(value, spec) { COMMAND_MERGE, nextValue ); - copyProperties(nextValue, spec[COMMAND_MERGE]); + Object.assign(nextValue, spec[COMMAND_MERGE]); } if (spec.hasOwnProperty(COMMAND_PUSH)) { diff --git a/src/browser/ReactBrowserEventEmitter.js b/src/browser/ReactBrowserEventEmitter.js index 677b076986..62d65347b7 100644 --- a/src/browser/ReactBrowserEventEmitter.js +++ b/src/browser/ReactBrowserEventEmitter.js @@ -26,7 +26,6 @@ var ReactEventEmitterMixin = require('ReactEventEmitterMixin'); var ViewportMetrics = require('ViewportMetrics'); var isEventSupported = require('isEventSupported'); -var merge = require('merge'); /** * Summary of `ReactBrowserEventEmitter` event handling: @@ -155,7 +154,7 @@ function getListeningForDocument(mountAt) { * * @internal */ -var ReactBrowserEventEmitter = merge(ReactEventEmitterMixin, { +var ReactBrowserEventEmitter = Object.assign({}, ReactEventEmitterMixin, { /** * Injectable event backend diff --git a/src/browser/ReactPutListenerQueue.js b/src/browser/ReactPutListenerQueue.js index 0e2500e499..31256aaaaf 100644 --- a/src/browser/ReactPutListenerQueue.js +++ b/src/browser/ReactPutListenerQueue.js @@ -21,13 +21,11 @@ var PooledClass = require('PooledClass'); var ReactBrowserEventEmitter = require('ReactBrowserEventEmitter'); -var mixInto = require('mixInto'); - function ReactPutListenerQueue() { this.listenersToPut = []; } -mixInto(ReactPutListenerQueue, { +Object.assign(ReactPutListenerQueue.prototype, { enqueuePutListener: function(rootNodeID, propKey, propValue) { this.listenersToPut.push({ rootNodeID: rootNodeID, diff --git a/src/browser/ReactReconcileTransaction.js b/src/browser/ReactReconcileTransaction.js index e4ac1ffa02..42c88cbca2 100644 --- a/src/browser/ReactReconcileTransaction.js +++ b/src/browser/ReactReconcileTransaction.js @@ -26,8 +26,6 @@ var ReactInputSelection = require('ReactInputSelection'); var ReactPutListenerQueue = require('ReactPutListenerQueue'); var Transaction = require('Transaction'); -var mixInto = require('mixInto'); - /** * Ensures that, when possible, the selection range (currently selected text * input) is not disturbed by performing the transaction. @@ -174,8 +172,7 @@ var Mixin = { }; -mixInto(ReactReconcileTransaction, Transaction.Mixin); -mixInto(ReactReconcileTransaction, Mixin); +Object.assign(ReactReconcileTransaction.prototype, Transaction.Mixin, Mixin); PooledClass.addPoolingTo(ReactReconcileTransaction); diff --git a/src/browser/ReactTextComponent.js b/src/browser/ReactTextComponent.js index 25cdd6e1bf..aa2819fff6 100644 --- a/src/browser/ReactTextComponent.js +++ b/src/browser/ReactTextComponent.js @@ -25,7 +25,6 @@ var ReactComponent = require('ReactComponent'); var ReactElement = require('ReactElement'); var escapeTextForBrowser = require('escapeTextForBrowser'); -var mixInto = require('mixInto'); /** * Text nodes violate a couple assumptions that React makes about components: @@ -46,8 +45,7 @@ var ReactTextComponent = function(props) { // This constructor and it's argument is currently used by mocks. }; -mixInto(ReactTextComponent, ReactComponent.Mixin); -mixInto(ReactTextComponent, { +Object.assign(ReactTextComponent.prototype, ReactComponent.Mixin, { /** * Creates the markup for this text node. This node is not intended to have diff --git a/src/browser/server/ReactServerRenderingTransaction.js b/src/browser/server/ReactServerRenderingTransaction.js index 2251f82f96..7b7d8f86b6 100644 --- a/src/browser/server/ReactServerRenderingTransaction.js +++ b/src/browser/server/ReactServerRenderingTransaction.js @@ -25,7 +25,6 @@ var ReactPutListenerQueue = require('ReactPutListenerQueue'); var Transaction = require('Transaction'); var emptyFunction = require('emptyFunction'); -var mixInto = require('mixInto'); /** * Provides a `CallbackQueue` queue for collecting `onDOMReady` callbacks @@ -107,8 +106,11 @@ var Mixin = { }; -mixInto(ReactServerRenderingTransaction, Transaction.Mixin); -mixInto(ReactServerRenderingTransaction, Mixin); +Object.assign( + ReactServerRenderingTransaction.prototype, + Transaction.Mixin, + Mixin +); PooledClass.addPoolingTo(ReactServerRenderingTransaction); diff --git a/src/browser/syntheticEvents/SyntheticEvent.js b/src/browser/syntheticEvents/SyntheticEvent.js index f6012d59cf..ae3fb6c54b 100644 --- a/src/browser/syntheticEvents/SyntheticEvent.js +++ b/src/browser/syntheticEvents/SyntheticEvent.js @@ -23,8 +23,6 @@ var PooledClass = require('PooledClass'); var emptyFunction = require('emptyFunction'); var getEventTarget = require('getEventTarget'); -var merge = require('merge'); -var mergeInto = require('mergeInto'); /** * @interface Event @@ -91,7 +89,7 @@ function SyntheticEvent(dispatchConfig, dispatchMarker, nativeEvent) { this.isPropagationStopped = emptyFunction.thatReturnsFalse; } -mergeInto(SyntheticEvent.prototype, { +Object.assign(SyntheticEvent.prototype, { preventDefault: function() { this.defaultPrevented = true; @@ -149,11 +147,11 @@ SyntheticEvent.augmentClass = function(Class, Interface) { var Super = this; var prototype = Object.create(Super.prototype); - mergeInto(prototype, Class.prototype); + Object.assign(prototype, Class.prototype); Class.prototype = prototype; Class.prototype.constructor = Class; - Class.Interface = merge(Super.Interface, Interface); + Class.Interface = Object.assign({}, Super.Interface, Interface); Class.augmentClass = Super.augmentClass; PooledClass.addPoolingTo(Class, PooledClass.threeArgumentPooler); diff --git a/src/browser/ui/ReactDOMComponent.js b/src/browser/ui/ReactDOMComponent.js index cbbe776d3d..a7536c71c7 100644 --- a/src/browser/ui/ReactDOMComponent.js +++ b/src/browser/ui/ReactDOMComponent.js @@ -33,8 +33,6 @@ var escapeTextForBrowser = require('escapeTextForBrowser'); var invariant = require('invariant'); var isEventSupported = require('isEventSupported'); var keyOf = require('keyOf'); -var merge = require('merge'); -var mixInto = require('mixInto'); var monitorCodeUse = require('monitorCodeUse'); var deleteListener = ReactBrowserEventEmitter.deleteListener; @@ -207,7 +205,7 @@ ReactDOMComponent.Mixin = { } else { if (propKey === STYLE) { if (propValue) { - propValue = props.style = merge(props.style); + propValue = props.style = Object.assign({}, props.style); } propValue = CSSPropertyOperations.createMarkupForStyles(propValue); } @@ -356,7 +354,7 @@ ReactDOMComponent.Mixin = { } if (propKey === STYLE) { if (nextProp) { - nextProp = nextProps.style = merge(nextProp); + nextProp = nextProps.style = Object.assign({}, nextProp); } if (lastProp) { // Unset styles on `lastProp` but not on `nextProp`. @@ -465,9 +463,12 @@ ReactDOMComponent.Mixin = { }; -mixInto(ReactDOMComponent, ReactComponent.Mixin); -mixInto(ReactDOMComponent, ReactDOMComponent.Mixin); -mixInto(ReactDOMComponent, ReactMultiChild.Mixin); -mixInto(ReactDOMComponent, ReactBrowserComponentMixin); +Object.assign( + ReactDOMComponent.prototype, + ReactComponent.Mixin, + ReactDOMComponent.Mixin, + ReactMultiChild.Mixin, + ReactBrowserComponentMixin +); module.exports = ReactDOMComponent; diff --git a/src/browser/ui/ReactEventListener.js b/src/browser/ui/ReactEventListener.js index 5dc6683bb7..c032b5483e 100644 --- a/src/browser/ui/ReactEventListener.js +++ b/src/browser/ui/ReactEventListener.js @@ -28,7 +28,6 @@ var ReactUpdates = require('ReactUpdates'); var getEventTarget = require('getEventTarget'); var getUnboundedScrollPosition = require('getUnboundedScrollPosition'); -var mixInto = require('mixInto'); /** * Finds the parent React component of `node`. @@ -54,7 +53,7 @@ function TopLevelCallbackBookKeeping(topLevelType, nativeEvent) { this.nativeEvent = nativeEvent; this.ancestors = []; } -mixInto(TopLevelCallbackBookKeeping, { +Object.assign(TopLevelCallbackBookKeeping.prototype, { destructor: function() { this.topLevelType = null; this.nativeEvent = null; diff --git a/src/browser/ui/__tests__/ReactDOMComponent-test.js b/src/browser/ui/__tests__/ReactDOMComponent-test.js index 3da6798f7a..7e5274c9f7 100644 --- a/src/browser/ui/__tests__/ReactDOMComponent-test.js +++ b/src/browser/ui/__tests__/ReactDOMComponent-test.js @@ -224,7 +224,6 @@ describe('ReactDOMComponent', function() { var ReactDefaultInjection = require('ReactDefaultInjection'); ReactDefaultInjection.inject(); - var mixInto = require('mixInto'); var ReactDOMComponent = require('ReactDOMComponent'); var ReactReconcileTransaction = require('ReactReconcileTransaction'); @@ -232,7 +231,7 @@ describe('ReactDOMComponent', function() { this.props = initialProps || {}; this._rootNodeID = 'test'; }; - mixInto(NodeStub, ReactDOMComponent.Mixin); + Object.assign(NodeStub.prototype, ReactDOMComponent.Mixin); genMarkup = function(props) { var transaction = new ReactReconcileTransaction(); @@ -275,7 +274,6 @@ describe('ReactDOMComponent', function() { beforeEach(function() { require('mock-modules').dumpCache(); - var mixInto = require('mixInto'); var ReactDOMComponent = require('ReactDOMComponent'); var ReactReconcileTransaction = require('ReactReconcileTransaction'); @@ -283,7 +281,7 @@ describe('ReactDOMComponent', function() { this.props = initialProps || {}; this._rootNodeID = 'test'; }; - mixInto(NodeStub, ReactDOMComponent.Mixin); + Object.assign(NodeStub.prototype, ReactDOMComponent.Mixin); genMarkup = function(props) { var transaction = new ReactReconcileTransaction(); @@ -312,7 +310,6 @@ describe('ReactDOMComponent', function() { beforeEach(function() { require('mock-modules').dumpCache(); - var mixInto = require('mixInto'); var ReactComponent = require('ReactComponent'); var ReactMultiChild = require('ReactMultiChild'); var ReactDOMComponent = require('ReactDOMComponent'); @@ -321,9 +318,9 @@ describe('ReactDOMComponent', function() { var StubNativeComponent = function(element) { ReactComponent.Mixin.construct.call(this, element); }; - mixInto(StubNativeComponent, ReactComponent.Mixin); - mixInto(StubNativeComponent, ReactDOMComponent.Mixin); - mixInto(StubNativeComponent, ReactMultiChild.Mixin); + Object.assign(StubNativeComponent.prototype, ReactComponent.Mixin); + Object.assign(StubNativeComponent.prototype, ReactDOMComponent.Mixin); + Object.assign(StubNativeComponent.prototype, ReactMultiChild.Mixin); mountComponent = function(props) { var transaction = new ReactReconcileTransaction(); diff --git a/src/browser/ui/dom/components/ReactDOMInput.js b/src/browser/ui/dom/components/ReactDOMInput.js index a653d375d6..a6fbc5c530 100644 --- a/src/browser/ui/dom/components/ReactDOMInput.js +++ b/src/browser/ui/dom/components/ReactDOMInput.js @@ -29,7 +29,6 @@ var ReactMount = require('ReactMount'); var ReactUpdates = require('ReactUpdates'); var invariant = require('invariant'); -var merge = require('merge'); // Store a reference to the `ReactDOMComponent`. TODO: use string var input = ReactElement.createFactory(ReactDOM.input.type); @@ -74,7 +73,7 @@ var ReactDOMInput = ReactCompositeComponent.createClass({ render: function() { // Clone `this.props` so we don't mutate the input. - var props = merge(this.props); + var props = Object.assign({}, this.props); props.defaultChecked = null; props.defaultValue = null; diff --git a/src/browser/ui/dom/components/ReactDOMSelect.js b/src/browser/ui/dom/components/ReactDOMSelect.js index dfd5d8d665..b385b2ba59 100644 --- a/src/browser/ui/dom/components/ReactDOMSelect.js +++ b/src/browser/ui/dom/components/ReactDOMSelect.js @@ -26,8 +26,6 @@ var ReactElement = require('ReactElement'); var ReactDOM = require('ReactDOM'); var ReactUpdates = require('ReactUpdates'); -var merge = require('merge'); - // Store a reference to the