@samitouri / QOS-React-2 / commits / 1ad8d81292

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': () => {