Remove object-assign polyfill (#23351)
* Remove object-assign polyfill We really rely on a more modern environment where this is typically polyfilled anyway and we don't officially support IE with more extensive polyfilling anyway. So all environments should have the native version by now. * Use shared/assign instead of Object.assign in code This is so that we have one cached local instance in the bundle. Ideally we should have a compile do this for us but we already follow this pattern with hasOwnProperty, isArray, Object.is etc. * Transform Object.assign to now use shared/assign We need this to use the shared instance when Object.spread is used.
Sebastian Markbåge committed
Feb 23, 2022 at 19:34 UTC
1ad8d81292415e26ac070dec03ad84c11fbe207d
45 files changed
+73
-156
package.json
-1
@@ -77,7 +77,6 @@
77
"minimist": "^1.2.3",
78
"mkdirp": "^0.5.1",
79
"ncp": "^2.0.0",
80
- "object-assign": "^4.1.1",
80
"pacote": "^10.3.0",
81
"prettier": "1.19.1",
82
"prop-types": "^15.6.2",
packages/jest-react/package.json
-3
@@ -23,9 +23,6 @@
23
"react": "^17.0.0",
24
"react-test-renderer": "^17.0.0"
25
},
26
- "dependencies": {
27
- "object-assign": "^4.1.1"
28
- },
26
"files": [
27
"LICENSE",
28
"README.md",
packages/react-art/npm/Circle.js
+1
-1
@@ -17,7 +17,7 @@
17
18
'use strict';
19
20
-var assign = require('object-assign');
20
+var assign = Object.assign;
21
var PropTypes = require('prop-types');
22
var React = require('react');
23
var ReactART = require('react-art');
packages/react-art/npm/Rectangle.js
+1
-1
@@ -24,7 +24,7 @@
24
25
'use strict';
26
27
-var assign = require('object-assign');
27
+var assign = Object.assign;
28
var PropTypes = require('prop-types');
29
var React = require('react');
30
var ReactART = require('react-art');
packages/react-art/npm/Wedge.js
+1
-1
@@ -20,7 +20,7 @@
20
21
'use strict';
22
23
-var assign = require('object-assign');
23
+var assign = Object.assign;
24
var PropTypes = require('prop-types');
25
var React = require('react');
26
var ReactART = require('react-art');
packages/react-art/package.json
-1
@@ -25,7 +25,6 @@
25
"art": "^0.10.1",
26
"create-react-class": "^15.6.2",
27
"loose-envify": "^1.1.0",
28
- "object-assign": "^4.1.1",
28
"scheduler": "^0.20.1"
29
},
30
"peerDependencies": {
packages/react-client/package.json
+1
-2
@@ -27,8 +27,7 @@
27
"react": "^17.0.0"
28
},
29
"dependencies": {
30
- "loose-envify": "^1.1.0",
31
- "object-assign": "^4.1.1"
30
+ "loose-envify": "^1.1.0"
31
},
32
"browserify": {
33
"transform": [
packages/react-debug-tools/package.json
+1
-2
@@ -28,7 +28,6 @@
28
"react": "^17.0.0"
29
},
30
"dependencies": {
31
- "error-stack-parser": "^2.0.2",
32
- "object-assign": "^4.1.1"
31
+ "error-stack-parser": "^2.0.2"
32
}
33
}
packages/react-debug-tools/src/ReactDebugHooks.js
+2
-1
@@ -20,6 +20,7 @@ import type {
20
} from 'react-reconciler/src/ReactInternalTypes';
21
22
import ErrorStackParser from 'error-stack-parser';
23
+import assign from 'shared/assign';
24
import ReactSharedInternals from 'shared/ReactSharedInternals';
25
import {
26
FunctionComponent,
@@ -720,7 +721,7 @@ function inspectHooksOfForwardRef<Props, Ref>(
721
function resolveDefaultProps(Component, baseProps) {
722
if (Component && Component.defaultProps) {
723
// Resolve default props. Taken from ReactElement
723
- const props = Object.assign({}, baseProps);
724
+ const props = assign({}, baseProps);
725
const defaultProps = Component.defaultProps;
726
for (const propName in defaultProps) {
727
if (props[propName] === undefined) {
packages/react-devtools-shared/src/backend/views/Highlighter/Overlay.js
+2
-1
@@ -7,9 +7,10 @@
7
* @flow
8
*/
9
10
-import assign from 'object-assign';
10
import {getElementDimensions, getNestedBoundingClientRect} from '../utils';
11
12
+const assign = Object.assign;
13
+
14
import type {DevToolsHook} from 'react-devtools-shared/src/backend/types';
15
import type {Rect} from '../utils';
16
packages/react-dom/package.json
-1
@@ -18,7 +18,6 @@
18
"homepage": "https://reactjs.org/",
19
"dependencies": {
20
"loose-envify": "^1.1.0",
21
- "object-assign": "^4.1.1",
21
"scheduler": "^0.20.1"
22
},
23
"peerDependencies": {
packages/react-dom/src/client/ReactDOMInput.js
+2
-1
@@ -16,6 +16,7 @@ import {getToStringValue, toString} from './ToStringValue';
16
import {checkControlledValueProps} from '../shared/ReactControlledValuePropTypes';
17
import {updateValueIfChanged} from './inputValueTracking';
18
import getActiveElement from './getActiveElement';
19
+import assign from 'shared/assign';
20
import {disableInputAttributeSyncing} from 'shared/ReactFeatureFlags';
21
import {checkAttributeStringCoercion} from 'shared/CheckStringCoercion';
22
@@ -62,7 +63,7 @@ export function getHostProps(element: Element, props: Object) {
63
const node = ((element: any): InputWithWrapperState);
64
const checked = props.checked;
65
65
- const hostProps = Object.assign({}, props, {
66
+ const hostProps = assign({}, props, {
67
defaultChecked: undefined,
68
defaultValue: undefined,
69
value: undefined,
packages/react-dom/src/client/ReactDOMSelect.js
+2
-1
@@ -12,6 +12,7 @@ import {getCurrentFiberOwnerNameInDevOrNull} from 'react-reconciler/src/ReactCur
12
13
import {checkControlledValueProps} from '../shared/ReactControlledValuePropTypes';
14
import {getToStringValue, toString} from './ToStringValue';
15
+import assign from 'shared/assign';
16
import isArray from 'shared/isArray';
17
18
let didWarnValueDefaultValue;
@@ -134,7 +135,7 @@ function updateOptions(
135
*/
136
137
export function getHostProps(element: Element, props: Object) {
137
- return Object.assign({}, props, {
138
+ return assign({}, props, {
139
value: undefined,
140
});
141
}
packages/react-dom/src/events/SyntheticEvent.js
+2
-1
@@ -9,6 +9,7 @@
9
10
/* eslint valid-typeof: 0 */
11
12
+import assign from 'shared/assign';
13
import getEventCharCode from './getEventCharCode';
14
15
type EventInterfaceType = {
@@ -78,7 +79,7 @@ function createSyntheticEvent(Interface: EventInterfaceType) {
79
return this;
80
}
81
81
- Object.assign(SyntheticBaseEvent.prototype, {
82
+ assign(SyntheticBaseEvent.prototype, {
83
preventDefault: function() {
84
this.defaultPrevented = true;
85
const event = this.nativeEvent;
packages/react-dom/src/server/ReactPartialRenderer.js
+11
-10
@@ -80,6 +80,7 @@ import warnValidStyle from '../shared/warnValidStyle';
80
import {validateProperties as validateARIAProperties} from '../shared/ReactDOMInvalidARIAHook';
81
import {validateProperties as validateInputProperties} from '../shared/ReactDOMNullInputValuePropHook';
82
import {validateProperties as validateUnknownProperties} from '../shared/ReactDOMUnknownPropertyHook';
83
+import assign from 'shared/assign';
84
import hasOwnProperty from 'shared/hasOwnProperty';
85
86
// Based on reading the React.Children implementation. TODO: type this somewhere?
@@ -563,7 +564,7 @@ function resolve(
564
}
565
566
if (partialState != null) {
566
- inst.state = Object.assign({}, inst.state, partialState);
567
+ inst.state = assign({}, inst.state, partialState);
568
}
569
}
570
} else {
@@ -695,9 +696,9 @@ function resolve(
696
if (partialState != null) {
697
if (dontMutate) {
698
dontMutate = false;
698
- nextState = Object.assign({}, nextState, partialState);
699
+ nextState = assign({}, nextState, partialState);
700
} else {
700
- Object.assign(nextState, partialState);
701
+ assign(nextState, partialState);
702
}
703
}
704
}
@@ -745,7 +746,7 @@ function resolve(
746
}
747
}
748
if (childContext) {
748
- context = Object.assign({}, context, childContext);
749
+ context = assign({}, context, childContext);
750
}
751
}
752
}
@@ -1192,7 +1193,7 @@ class ReactDOMServerRenderer {
1193
const nextChildren = [
1194
React.createElement(
1195
elementType.type,
1195
- Object.assign({ref: element.ref}, element.props),
1196
+ assign({ref: element.ref}, element.props),
1197
),
1198
];
1199
const frame: Frame = {
@@ -1291,7 +1292,7 @@ class ReactDOMServerRenderer {
1292
const nextChildren = [
1293
React.createElement(
1294
result,
1294
- Object.assign({ref: element.ref}, element.props),
1295
+ assign({ref: element.ref}, element.props),
1296
),
1297
];
1298
const frame: Frame = {
@@ -1413,7 +1414,7 @@ class ReactDOMServerRenderer {
1414
}
1415
}
1416
1416
- props = Object.assign(
1417
+ props = assign(
1418
{
1419
type: undefined,
1420
},
@@ -1485,7 +1486,7 @@ class ReactDOMServerRenderer {
1486
if (__DEV__) {
1487
checkFormFieldValueStringCoercion(initialValue);
1488
}
1488
- props = Object.assign({}, props, {
1489
+ props = assign({}, props, {
1490
value: undefined,
1491
children: '' + initialValue,
1492
});
@@ -1531,7 +1532,7 @@ class ReactDOMServerRenderer {
1532
}
1533
this.currentSelectValue =
1534
props.value != null ? props.value : props.defaultValue;
1534
- props = Object.assign({}, props, {
1535
+ props = assign({}, props, {
1536
value: undefined,
1537
});
1538
} else if (tag === 'option') {
@@ -1577,7 +1578,7 @@ class ReactDOMServerRenderer {
1578
selected = '' + selectValue === value;
1579
}
1580
1580
- props = Object.assign(
1581
+ props = assign(
1582
{
1583
selected: undefined,
1584
},
packages/react-dom/src/test-utils/ReactTestUtils.js
+2
-1
@@ -21,6 +21,7 @@ import {
21
rethrowCaughtError,
22
invokeGuardedCallbackAndCatchFirstError,
23
} from 'shared/ReactErrorUtils';
24
+import assign from 'shared/assign';
25
import isArray from 'shared/isArray';
26
27
// Keep in sync with ReactDOM.js:
@@ -596,7 +597,7 @@ function makeSimulator(eventType) {
597
// Since we aren't using pooling, always persist the event. This will make
598
// sure it's marked and won't warn when setting additional properties.
599
event.persist();
599
- Object.assign(event, eventData);
600
+ assign(event, eventData);
601
602
if (directDispatchEventTypes.has(eventType)) {
603
accumulateDirectDispatchesSingle(event);
packages/react-native-renderer/package.json
-1
@@ -8,7 +8,6 @@
8
"directory": "packages/react-native-renderer"
9
},
10
"dependencies": {
11
- "object-assign": "^4.1.1",
11
"scheduler": "^0.11.0"
12
},
13
"peerDependencies": {
packages/react-native-renderer/src/legacy-events/SyntheticEvent.js
+5
-3
@@ -7,6 +7,8 @@
7
8
/* eslint valid-typeof: 0 */
9
10
+import assign from 'shared/assign';
11
+
12
const EVENT_POOL_SIZE = 10;
13
14
/**
@@ -110,7 +112,7 @@ function SyntheticEvent(
112
return this;
113
}
114
113
-Object.assign(SyntheticEvent.prototype, {
115
+assign(SyntheticEvent.prototype, {
116
preventDefault: function() {
117
this.defaultPrevented = true;
118
const event = this.nativeEvent;
@@ -236,11 +238,11 @@ SyntheticEvent.extend = function(Interface) {
238
function Class() {
239
return Super.apply(this, arguments);
240
}
239
- Object.assign(prototype, Class.prototype);
241
+ assign(prototype, Class.prototype);
242
Class.prototype = prototype;
243
Class.prototype.constructor = Class;
244
243
- Class.Interface = Object.assign({}, Super.Interface, Interface);
245
+ Class.Interface = assign({}, Super.Interface, Interface);
246
Class.extend = Super.extend;
247
addEventPoolingTo(Class);
248
packages/react-noop-renderer/package.json
-1
@@ -11,7 +11,6 @@
11
},
12
"license": "MIT",
13
"dependencies": {
14
- "object-assign": "^4.1.1",
14
"react-reconciler": "*",
15
"react-client": "*",
16
"react-server": "*"
packages/react-reconciler/package.json
-1
@@ -30,7 +30,6 @@
30
},
31
"dependencies": {
32
"loose-envify": "^1.1.0",
33
- "object-assign": "^4.1.1",
33
"scheduler": "^0.20.1"
34
},
35
"browserify": {
packages/react-reconciler/src/ReactFiberClassComponent.new.js
+2
-1
@@ -35,6 +35,7 @@ import {get as getInstance, set as setInstance} from 'shared/ReactInstanceMap';
35
import shallowEqual from 'shared/shallowEqual';
36
import getComponentNameFromFiber from 'react-reconciler/src/getComponentNameFromFiber';
37
import getComponentNameFromType from 'shared/getComponentNameFromType';
38
+import assign from 'shared/assign';
39
import isArray from 'shared/isArray';
40
import {REACT_CONTEXT_TYPE, REACT_PROVIDER_TYPE} from 'shared/ReactSymbols';
41
@@ -186,7 +187,7 @@ function applyDerivedStateFromProps(
187
const memoizedState =
188
partialState === null || partialState === undefined
189
? prevState
189
- : Object.assign({}, prevState, partialState);
190
+ : assign({}, prevState, partialState);
191
workInProgress.memoizedState = memoizedState;
192
193
// Once the update queue is empty, persist the derived state onto the
packages/react-reconciler/src/ReactFiberClassComponent.old.js
+2
-1
@@ -35,6 +35,7 @@ import {get as getInstance, set as setInstance} from 'shared/ReactInstanceMap';
35
import shallowEqual from 'shared/shallowEqual';
36
import getComponentNameFromFiber from 'react-reconciler/src/getComponentNameFromFiber';
37
import getComponentNameFromType from 'shared/getComponentNameFromType';
38
+import assign from 'shared/assign';
39
import isArray from 'shared/isArray';
40
import {REACT_CONTEXT_TYPE, REACT_PROVIDER_TYPE} from 'shared/ReactSymbols';
41
@@ -186,7 +187,7 @@ function applyDerivedStateFromProps(
187
const memoizedState =
188
partialState === null || partialState === undefined
189
? prevState
189
- : Object.assign({}, prevState, partialState);
190
+ : assign({}, prevState, partialState);
191
workInProgress.memoizedState = memoizedState;
192
193
// Once the update queue is empty, persist the derived state onto the
packages/react-reconciler/src/ReactFiberLazyComponent.new.js
+3
-1
@@ -7,10 +7,12 @@
7
* @flow
8
*/
9
10
+import assign from 'shared/assign';
11
+
12
export function resolveDefaultProps(Component: any, baseProps: Object): Object {
13
if (Component && Component.defaultProps) {
14
// Resolve default props. Taken from ReactElement
13
- const props = Object.assign({}, baseProps);
15
+ const props = assign({}, baseProps);
16
const defaultProps = Component.defaultProps;
17
for (const propName in defaultProps) {
18
if (props[propName] === undefined) {
packages/react-reconciler/src/ReactFiberLazyComponent.old.js
+3
-1
@@ -7,10 +7,12 @@
7
* @flow
8
*/
9
10
+import assign from 'shared/assign';
11
+
12
export function resolveDefaultProps(Component: any, baseProps: Object): Object {
13
if (Component && Component.defaultProps) {
14
// Resolve default props. Taken from ReactElement
13
- const props = Object.assign({}, baseProps);
15
+ const props = assign({}, baseProps);
16
const defaultProps = Component.defaultProps;
17
for (const propName in defaultProps) {
18
if (props[propName] === undefined) {
packages/react-reconciler/src/ReactUpdateQueue.new.js
+3
-1
@@ -112,6 +112,8 @@ import {
112
import {pushInterleavedQueue} from './ReactFiberInterleavedUpdates.new';
113
import {setIsStrictModeForDevtools} from './ReactFiberDevToolsHook.new';
114
115
+import assign from 'shared/assign';
116
+
117
export type Update<State> = {|
118
// TODO: Temporary field. Will remove this by storing a map of
119
// transition -> event time on the root.
@@ -442,7 +444,7 @@ function getStateFromUpdate<State>(
444
return prevState;
445
}
446
// Merge the partial state and the previous state.
445
- return Object.assign({}, prevState, partialState);
447
+ return assign({}, prevState, partialState);
448
}
449
case ForceUpdate: {
450
hasForceUpdate = true;
packages/react-reconciler/src/ReactUpdateQueue.old.js
+3
-1
@@ -112,6 +112,8 @@ import {
112
import {pushInterleavedQueue} from './ReactFiberInterleavedUpdates.old';
113
import {setIsStrictModeForDevtools} from './ReactFiberDevToolsHook.old';
114
115
+import assign from 'shared/assign';
116
+
117
export type Update<State> = {|
118
// TODO: Temporary field. Will remove this by storing a map of
119
// transition -> event time on the root.
@@ -442,7 +444,7 @@ function getStateFromUpdate<State>(
444
return prevState;
445
}
446
// Merge the partial state and the previous state.
445
- return Object.assign({}, prevState, partialState);
447
+ return assign({}, prevState, partialState);
448
}
449
case ForceUpdate: {
450
hasForceUpdate = true;
packages/react-server-dom-relay/package.json
-1
@@ -8,7 +8,6 @@
8
"directory": "packages/react-server-dom-relay"
9
},
10
"dependencies": {
11
- "object-assign": "^4.1.1",
11
"scheduler": "^0.11.0"
12
},
13
"peerDependencies": {
packages/react-server-dom-webpack/package.json
+1
-2
@@ -54,8 +54,7 @@
54
"dependencies": {
55
"acorn": "^6.2.1",
56
"neo-async": "^2.6.1",
57
- "loose-envify": "^1.1.0",
58
- "object-assign": "^4.1.1"
57
+ "loose-envify": "^1.1.0"
58
},
59
"browserify": {
60
"transform": [
packages/react-server-native-relay/package.json
-1
@@ -8,7 +8,6 @@
8
"directory": "packages/react-server-native-relay"
9
},
10
"dependencies": {
11
- "object-assign": "^4.1.1",
11
"scheduler": "^0.11.0"
12
},
13
"peerDependencies": {
packages/react-server/package.json
+1
-2
@@ -29,8 +29,7 @@
29
"react": "^17.0.0"
30
},
31
"dependencies": {
32
- "loose-envify": "^1.1.0",
33
- "object-assign": "^4.1.1"
32
+ "loose-envify": "^1.1.0"
33
},
34
"browserify": {
35
"transform": [
packages/react-server/src/ReactFizzClassComponent.js
+4
-3
@@ -17,6 +17,7 @@ import {
17
import {get as getInstance, set as setInstance} from 'shared/ReactInstanceMap';
18
import getComponentNameFromType from 'shared/getComponentNameFromType';
19
import {REACT_CONTEXT_TYPE, REACT_PROVIDER_TYPE} from 'shared/ReactSymbols';
20
+import assign from 'shared/assign';
21
import isArray from 'shared/isArray';
22
23
const didWarnAboutNoopUpdateForComponent = {};
@@ -161,7 +162,7 @@ function applyDerivedStateFromProps(
162
const newState =
163
partialState === null || partialState === undefined
164
? prevState
164
- : Object.assign({}, prevState, partialState);
165
+ : assign({}, prevState, partialState);
166
return newState;
167
}
168
@@ -602,9 +603,9 @@ function processUpdateQueue(
603
if (partialState != null) {
604
if (dontMutate) {
605
dontMutate = false;
605
- nextState = Object.assign({}, nextState, partialState);
606
+ nextState = assign({}, nextState, partialState);
607
} else {
607
- Object.assign(nextState, partialState);
608
+ assign(nextState, partialState);
609
}
610
}
611
}
packages/react-server/src/ReactFizzServer.js
+2
-1
@@ -117,6 +117,7 @@ import {
117
enableSuspenseAvoidThisFallbackFizz,
118
} from 'shared/ReactFeatureFlags';
119
120
+import assign from 'shared/assign';
121
import getComponentNameFromType from 'shared/getComponentNameFromType';
122
import isArray from 'shared/isArray';
123
@@ -837,7 +838,7 @@ function validateFunctionComponentInDev(Component: any): void {
838
function resolveDefaultProps(Component: any, baseProps: Object): Object {
839
if (Component && Component.defaultProps) {
840
// Resolve default props. Taken from ReactElement
840
- const props = Object.assign({}, baseProps);
841
+ const props = assign({}, baseProps);
842
const defaultProps = Component.defaultProps;
843
for (const propName in defaultProps) {
844
if (props[propName] === undefined) {
packages/react-test-renderer/package.json
-1
@@ -19,7 +19,6 @@
19
},
20
"homepage": "https://reactjs.org/",
21
"dependencies": {
22
- "object-assign": "^4.1.1",
22
"react-is": "^17.0.3",
23
"react-shallow-renderer": "^16.13.1",
24
"scheduler": "^0.20.1"
packages/react/package.json
+1
-2
@@ -38,8 +38,7 @@
38
"node": ">=0.10.0"
39
},
40
"dependencies": {
41
- "loose-envify": "^1.1.0",
42
- "object-assign": "^4.1.1"
41
+ "loose-envify": "^1.1.0"
42
},
43
"browserify": {
44
"transform": [
packages/react/src/ReactBaseClasses.js
+2
-1
@@ -6,6 +6,7 @@
6
*/
7
8
import ReactNoopUpdateQueue from './ReactNoopUpdateQueue';
9
+import assign from 'shared/assign';
10
11
const emptyObject = {};
12
if (__DEV__) {
@@ -139,7 +140,7 @@ function PureComponent(props, context, updater) {
140
const pureComponentPrototype = (PureComponent.prototype = new ComponentDummy());
141
pureComponentPrototype.constructor = PureComponent;
142
// Avoid an extra prototype jump for these methods.
142
-Object.assign(pureComponentPrototype, Component.prototype);
143
+assign(pureComponentPrototype, Component.prototype);
144
pureComponentPrototype.isPureReactComponent = true;
145
146
export {Component, PureComponent};
packages/react/src/ReactElement.js
+2
-1
@@ -7,6 +7,7 @@
7
8
import getComponentNameFromType from 'shared/getComponentNameFromType';
9
import {REACT_ELEMENT_TYPE} from 'shared/ReactSymbols';
10
+import assign from 'shared/assign';
11
import hasOwnProperty from 'shared/hasOwnProperty';
12
import {checkKeyStringCoercion} from 'shared/CheckStringCoercion';
13
@@ -492,7 +493,7 @@ export function cloneElement(element, config, children) {
493
let propName;
494
495
// Original props are copied
495
- const props = Object.assign({}, element.props);
496
+ const props = assign({}, element.props);
497
498
// Reserved names are extracted
499
let key = element.key;
packages/react/src/ReactSharedInternals.js
-3
@@ -5,7 +5,6 @@
5
* LICENSE file in the root directory of this source tree.
6
*/
7
8
-import assign from 'object-assign';
8
import ReactCurrentDispatcher from './ReactCurrentDispatcher';
9
import ReactCurrentBatchConfig from './ReactCurrentBatchConfig';
10
import ReactCurrentActQueue from './ReactCurrentActQueue';
@@ -16,8 +15,6 @@ const ReactSharedInternals = {
15
ReactCurrentDispatcher,
16
ReactCurrentBatchConfig,
17
ReactCurrentOwner,
19
- // Used by renderers to avoid bundling object-assign twice in UMD bundles:
20
- assign,
18
};
19
20
if (__DEV__) {
packages/react/src/forks/ReactSharedInternals.umd.js
-3
@@ -5,7 +5,6 @@
5
* LICENSE file in the root directory of this source tree.
6
*/
7
8
-import assign from 'object-assign';
8
import * as Scheduler from 'scheduler';
9
import ReactCurrentDispatcher from '../ReactCurrentDispatcher';
10
import ReactCurrentActQueue from '../ReactCurrentActQueue';
@@ -17,8 +16,6 @@ const ReactSharedInternals = {
16
ReactCurrentDispatcher,
17
ReactCurrentOwner,
18
ReactCurrentBatchConfig,
20
- // Used by renderers to avoid bundling object-assign twice in UMD bundles:
21
- assign,
19
20
// Re-export the schedule API(s) for UMD bundles.
21
// This avoids introducing a dependency on a new UMD global in a minor update,
packages/scheduler/package.json
+1
-2
@@ -17,8 +17,7 @@
17
},
18
"homepage": "https://reactjs.org/",
19
"dependencies": {
20
- "loose-envify": "^1.1.0",
21
- "object-assign": "^4.1.1"
20
+ "loose-envify": "^1.1.0"
21
},
22
"files": [
23
"LICENSE",
packages/shared/assign.js
renamed
+2
-4
@@ -7,8 +7,6 @@
7
* @flow
8
*/
9
10
-import * as React from 'react';
10
+const assign = Object.assign;
11
12
-const ReactInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
13
-
14
-export default ReactInternals.assign;
12
+export default assign;
packages/shared/forks/object-assign.inline-umd.js
deleted
-31
@@ -1,31 +0,0 @@
1
-/**
2
- * Copyright 2004-present Facebook. All Rights Reserved.
3
- */
4
-
5
-const hasOwnProperty = Object.prototype.hasOwnProperty;
6
-
7
-const _assign = function(to, from) {
8
- for (const key in from) {
9
- if (hasOwnProperty.call(from, key)) {
10
- to[key] = from[key];
11
- }
12
- }
13
-};
14
-
15
-export default Object.assign ||
16
- function(target, sources) {
17
- if (target == null) {
18
- throw new TypeError('Object.assign target cannot be null or undefined');
19
- }
20
-
21
- const to = Object(target);
22
-
23
- for (let nextIndex = 1; nextIndex < arguments.length; nextIndex++) {
24
- const nextSource = arguments[nextIndex];
25
- if (nextSource != null) {
26
- _assign(to, Object(nextSource));
27
- }
28
- }
29
-
30
- return to;
31
- };
packages/use-subscription/package.json
-3
@@ -14,9 +14,6 @@
14
"cjs/"
15
],
16
"license": "MIT",
17
- "dependencies": {
18
- "object-assign": "^4.1.1"
19
- },
17
"peerDependencies": {
18
"react": "^16.8.0 || ^17.0.0"
19
},
scripts/babel/transform-object-assign.js
renamed
+5
-5
@@ -14,7 +14,7 @@ module.exports = function autoImporter(babel) {
14
if (state.id) {
15
return state.id;
16
}
17
- state.id = helperModuleImports.addDefault(path, 'object-assign', {
17
+ state.id = helperModuleImports.addDefault(path, 'shared/assign', {
18
nameHint: 'assign',
19
});
20
return state.id;
@@ -28,8 +28,8 @@ module.exports = function autoImporter(babel) {
28
29
visitor: {
30
CallExpression: function(path, file) {
31
- if (file.filename.indexOf('object-assign') !== -1) {
32
- // Don't replace Object.assign if we're transforming object-assign
31
+ if (file.filename.indexOf('shared/assign') !== -1) {
32
+ // Don't replace Object.assign if we're transforming shared/assign
33
return;
34
}
35
if (path.get('callee').matchesPattern('Object.assign')) {
@@ -40,8 +40,8 @@ module.exports = function autoImporter(babel) {
40
},
41
42
MemberExpression: function(path, file) {
43
- if (file.filename.indexOf('object-assign') !== -1) {
44
- // Don't replace Object.assign if we're transforming object-assign
43
+ if (file.filename.indexOf('shared/assign') !== -1) {
44
+ // Don't replace Object.assign if we're transforming shared/assign
45
return;
46
}
47
if (path.matchesPattern('Object.assign')) {
scripts/rollup/build.js
+3
-17
@@ -8,7 +8,6 @@ const prettier = require('rollup-plugin-prettier');
8
const replace = require('rollup-plugin-replace');
9
const stripBanner = require('rollup-plugin-strip-banner');
10
const chalk = require('chalk');
11
-const path = require('path');
11
const resolve = require('rollup-plugin-node-resolve');
12
const fs = require('fs');
13
const argv = require('minimist')(process.argv.slice(2));
@@ -127,6 +126,8 @@ const babelPlugins = [
126
'@babel/plugin-transform-parameters',
127
// TODO: Remove array destructuring from the source. Requires runtime.
128
['@babel/plugin-transform-destructuring', {loose: true, useBuiltIns: true}],
129
+ // Transform Object spread to shared/assign
130
+ require('../babel/transform-object-assign'),
131
];
132
133
const babelToES5Plugins = [
@@ -177,22 +178,7 @@ function getBabelConfig(
178
options.plugins.push(require('../error-codes/transform-error-messages'));
179
}
180
180
- switch (bundleType) {
181
- case UMD_DEV:
182
- case UMD_PROD:
183
- case UMD_PROFILING:
184
- case NODE_DEV:
185
- case NODE_PROD:
186
- case NODE_PROFILING:
187
- return Object.assign({}, options, {
188
- plugins: options.plugins.concat([
189
- // Use object-assign polyfill in open source
190
- path.resolve('./scripts/babel/transform-object-assign-require'),
191
- ]),
192
- });
193
- default:
194
- return options;
195
- }
181
+ return options;
182
}
183
184
function getRollupOutputOptions(
scripts/rollup/forks.js
-32
@@ -36,38 +36,6 @@ const __EXPERIMENTAL__ =
36
// algorithm because 1) require.resolve doesn't work with ESM modules, and 2)
37
// the behavior is easier to predict.
38
const forks = Object.freeze({
39
- // Optimization: for UMDs, use a version that we can inline into the React bundle.
40
- // Use that from all other bundles.
41
-
42
- // NOTE: This is hard-coded to the main entry point of the (third-party)
43
- // object-assign package.
44
- './node_modules/object-assign/index.js': (
45
- bundleType,
46
- entry,
47
- dependencies
48
- ) => {
49
- if (
50
- bundleType !== UMD_DEV &&
51
- bundleType !== UMD_PROD &&
52
- bundleType !== UMD_PROFILING
53
- ) {
54
- // It's only relevant for UMD bundles since that's where the duplication
55
- // happens. Other bundles just require('object-assign') anyway.
56
- return null;
57
- }
58
- if (entry === 'react' || entry === 'react/src/ReactSharedSubset.js') {
59
- // Use the forked version that uses ES modules instead of CommonJS.
60
- return './packages/shared/forks/object-assign.inline-umd.js';
61
- }
62
- if (dependencies.indexOf('react') === -1) {
63
- // We can only apply the optimizations to bundle that depend on React
64
- // because we read assign() from an object exposed on React internals.
65
- return null;
66
- }
67
- // We can use the fork that reads the secret export!
68
- return './packages/shared/forks/object-assign.umd.js';
69
- },
70
-
39
// NOTE: This is hard-coded to the main entry point of the (third-party)
40
// react-shallow-renderer package.
41
'./node_modules/react-shallow-renderer/index.js': () => {