@samitouri / QOS-React-2 / commits / b130a0f5cd

Remove redundant initial of isArray (#21163)

Behnam Mohammadi committed Apr 1, 2021 at 22:20 UTC b130a0f5cd4f29a1c3147f66e10914c42847678a
28 files changed +105 -77
packages/eslint-plugin-react-hooks/src/ExhaustiveDeps.js
+6 -4
@@ -145,6 +145,8 @@ export default {
145 componentScope = currentScope;
146 }
147
148 + const isArray = Array.isArray;
149 +
150 // Next we'll define a few helpers that helps us
151 // tell if some values don't have to be declared as deps.
152
@@ -157,7 +159,7 @@ export default {
159 // ^^^ true for this reference
160 // False for everything else.
161 function isStableKnownHookValue(resolved) {
160 - if (!Array.isArray(resolved.defs)) {
162 + if (!isArray(resolved.defs)) {
163 return false;
164 }
165 const def = resolved.defs[0];
@@ -226,7 +228,7 @@ export default {
228 if (
229 id.type === 'ArrayPattern' &&
230 id.elements.length === 2 &&
229 - Array.isArray(resolved.identifiers)
231 + isArray(resolved.identifiers)
232 ) {
233 // Is second tuple value the same reference we're checking?
234 if (id.elements[1] === resolved.identifiers[0]) {
@@ -255,7 +257,7 @@ export default {
257 } else if (name === 'useTransition') {
258 if (
259 id.type === 'ArrayPattern' &&
258 - Array.isArray(resolved.identifiers)
260 + isArray(resolved.identifiers)
261 ) {
262 // Is first tuple value the same reference we're checking?
263 if (id.elements[0] === resolved.identifiers[0]) {
@@ -270,7 +272,7 @@ export default {
272
273 // Some are just functions that don't reference anything dynamic.
274 function isFunctionWithoutCapturedValues(resolved) {
273 - if (!Array.isArray(resolved.defs)) {
275 + if (!isArray(resolved.defs)) {
276 return false;
277 }
278 const def = resolved.defs[0];
packages/jest-react/src/JestReact.js
+2 -1
@@ -8,6 +8,7 @@
8 import {REACT_ELEMENT_TYPE, REACT_FRAGMENT_TYPE} from 'shared/ReactSymbols';
9
10 import invariant from 'shared/invariant';
11 +import isArray from 'shared/isArray';
12
13 function captureAssertion(fn) {
14 // Trick to use a Jest matcher inside another Jest matcher. `fn` contains an
@@ -42,7 +43,7 @@ export function unstable_toMatchRenderedOutput(root, expectedJSX) {
43 let actualJSX;
44 if (actualJSON === null || typeof actualJSON === 'string') {
45 actualJSX = actualJSON;
45 - } else if (Array.isArray(actualJSON)) {
46 + } else if (isArray(actualJSON)) {
47 if (actualJSON.length === 0) {
48 actualJSX = null;
49 } else if (actualJSON.length === 1) {
packages/react-devtools-shared/src/backend/renderer.js
+2 -1
@@ -105,6 +105,7 @@ import type {
105 ElementType,
106 } from 'react-devtools-shared/src/types';
107 import is from 'shared/objectIs';
108 +import isArray from 'shared/isArray';
109
110 type getDisplayNameForFiberType = (fiber: Fiber) => string | null;
111 type getTypeSymbolType = (type: any) => Symbol | number;
@@ -1137,7 +1138,7 @@ export function attach(
1138 memoizedState.hasOwnProperty('create') &&
1139 memoizedState.hasOwnProperty('destroy') &&
1140 memoizedState.hasOwnProperty('deps') &&
1140 - (memoizedState.deps === null || Array.isArray(memoizedState.deps)) &&
1141 + (memoizedState.deps === null || isArray(memoizedState.deps)) &&
1142 memoizedState.hasOwnProperty('next')
1143 );
1144 }
packages/react-devtools-shared/src/backend/utils.js
+6 -5
@@ -9,6 +9,7 @@
9
10 import {copy} from 'clipboard-js';
11 import {dehydrate} from '../hydration';
12 +import isArray from 'shared/isArray';
13
14 import type {DehydratedData} from 'react-devtools-shared/src/devtools/views/Components/types';
15
@@ -61,9 +62,9 @@ export function copyWithDelete(
62 index: number = 0,
63 ): Object | Array<any> {
64 const key = path[index];
64 - const updated = Array.isArray(obj) ? obj.slice() : {...obj};
65 + const updated = isArray(obj) ? obj.slice() : {...obj};
66 if (index + 1 === path.length) {
66 - if (Array.isArray(updated)) {
67 + if (isArray(updated)) {
68 updated.splice(((key: any): number), 1);
69 } else {
70 delete updated[key];
@@ -84,12 +85,12 @@ export function copyWithRename(
85 index: number = 0,
86 ): Object | Array<any> {
87 const oldKey = oldPath[index];
87 - const updated = Array.isArray(obj) ? obj.slice() : {...obj};
88 + const updated = isArray(obj) ? obj.slice() : {...obj};
89 if (index + 1 === oldPath.length) {
90 const newKey = newPath[index];
91 // $FlowFixMe number or string is fine here
92 updated[newKey] = updated[oldKey];
92 - if (Array.isArray(updated)) {
93 + if (isArray(updated)) {
94 updated.splice(((oldKey: any): number), 1);
95 } else {
96 delete updated[oldKey];
@@ -111,7 +112,7 @@ export function copyWithSet(
112 return value;
113 }
114 const key = path[index];
114 - const updated = Array.isArray(obj) ? obj.slice() : {...obj};
115 + const updated = isArray(obj) ? obj.slice() : {...obj};
116 // $FlowFixMe number or string is fine here
117 updated[key] = copyWithSet(obj[key], path, value, index + 1);
118 return updated;
packages/react-dom/src/client/ReactDOMSelect.js
+4 -3
@@ -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 isArray from 'shared/isArray';
16
17 let didWarnValueDefaultValue;
18
@@ -45,15 +46,15 @@ function checkSelectPropTypes(props) {
46 if (props[propName] == null) {
47 continue;
48 }
48 - const isArray = Array.isArray(props[propName]);
49 - if (props.multiple && !isArray) {
49 + const propNameIsArray = isArray(props[propName]);
50 + if (props.multiple && !propNameIsArray) {
51 console.error(
52 'The `%s` prop supplied to <select> must be an array if ' +
53 '`multiple` is true.%s',
54 propName,
55 getDeclarationErrorAddendum(),
56 );
56 - } else if (!props.multiple && isArray) {
57 + } else if (!props.multiple && propNameIsArray) {
58 console.error(
59 'The `%s` prop supplied to <select> must be a scalar ' +
60 'value if `multiple` is false.%s',
packages/react-dom/src/client/ReactDOMTextarea.js
+2 -2
@@ -8,12 +8,12 @@
8 */
9
10 import invariant from 'shared/invariant';
11 +import isArray from 'shared/isArray';
12
13 import {checkControlledValueProps} from '../shared/ReactControlledValuePropTypes';
14 import {getCurrentFiberOwnerNameInDevOrNull} from 'react-reconciler/src/ReactCurrentFiber';
15 import {getToStringValue, toString} from './ToStringValue';
16 import type {ToStringValue} from './ToStringValue';
16 -
17 import {disableTextareaChildren} from 'shared/ReactFeatureFlags';
18
19 let didWarnValDefaultVal = false;
@@ -100,7 +100,7 @@ export function initWrapperState(element: Element, props: Object) {
100 defaultValue == null,
101 'If you supply `defaultValue` on a <textarea>, do not pass children.',
102 );
103 - if (Array.isArray(children)) {
103 + if (isArray(children)) {
104 invariant(
105 children.length <= 1,
106 '<textarea> can only have at most one child.',
packages/react-dom/src/server/ReactDOMServerFormatConfig.js
+1 -2
@@ -46,8 +46,7 @@ import hyphenateStyleName from '../shared/hyphenateStyleName';
46 import invariant from 'shared/invariant';
47 import hasOwnProperty from 'shared/hasOwnProperty';
48 import sanitizeURL from '../shared/sanitizeURL';
49 -
50 -const isArray = Array.isArray;
49 +import isArray from 'shared/isArray';
50
51 // Per response, global state that is not contextual to the rendering subtree.
52 export type ResponseState = {
packages/react-dom/src/server/ReactPartialRenderer.js
+6 -5
@@ -14,6 +14,7 @@ import type {ReactProvider, ReactContext} from 'shared/ReactTypes';
14
15 import * as React from 'react';
16 import invariant from 'shared/invariant';
17 +import isArray from 'shared/isArray';
18 import getComponentNameFromType from 'shared/getComponentNameFromType';
19 import {describeUnknownElementTypeFrameInDEV} from 'shared/ReactComponentStackFrame';
20 import ReactSharedInternals from 'shared/ReactSharedInternals';
@@ -1438,7 +1439,7 @@ class ReactDOMServerRenderer {
1439 defaultValue == null,
1440 'If you supply `defaultValue` on a <textarea>, do not pass children.',
1441 );
1441 - if (Array.isArray(textareaChildren)) {
1442 + if (isArray(textareaChildren)) {
1443 invariant(
1444 textareaChildren.length <= 1,
1445 '<textarea> can only have at most one child.',
@@ -1467,14 +1468,14 @@ class ReactDOMServerRenderer {
1468 if (props[propName] == null) {
1469 continue;
1470 }
1470 - const isArray = Array.isArray(props[propName]);
1471 - if (props.multiple && !isArray) {
1471 + const propNameIsArray = isArray(props[propName]);
1472 + if (props.multiple && !propNameIsArray) {
1473 console.error(
1474 'The `%s` prop supplied to <select> must be an array if ' +
1475 '`multiple` is true.',
1476 propName,
1477 );
1477 - } else if (!props.multiple && isArray) {
1478 + } else if (!props.multiple && propNameIsArray) {
1479 console.error(
1480 'The `%s` prop supplied to <select> must be a scalar ' +
1481 'value if `multiple` is false.',
@@ -1515,7 +1516,7 @@ class ReactDOMServerRenderer {
1516 value = optionChildren;
1517 }
1518 selected = false;
1518 - if (Array.isArray(selectValue)) {
1519 + if (isArray(selectValue)) {
1520 // multiple
1521 for (let j = 0; j < selectValue.length; j++) {
1522 if ('' + selectValue[j] === value) {
packages/react-dom/src/test-utils/ReactTestUtils.js
+4 -3
@@ -24,6 +24,7 @@ import {
24 rethrowCaughtError,
25 invokeGuardedCallbackAndCatchFirstError,
26 } from 'shared/ReactErrorUtils';
27 +import isArray from 'shared/isArray';
28
29 // Keep in sync with ReactDOM.js, and ReactTestUtilsAct.js:
30 const EventInternals =
@@ -97,7 +98,7 @@ function validateClassInstance(inst, methodName) {
98 }
99 let received;
100 const stringified = '' + inst;
100 - if (Array.isArray(inst)) {
101 + if (isArray(inst)) {
102 received = 'an array';
103 } else if (inst && inst.nodeType === ELEMENT_NODE && inst.tagName) {
104 received = 'a DOM node';
@@ -197,7 +198,7 @@ function scryRenderedDOMComponentsWithClass(root, classNames) {
198 }
199 const classList = className.split(/\s+/);
200
200 - if (!Array.isArray(classNames)) {
201 + if (!isArray(classNames)) {
202 invariant(
203 classNames !== undefined,
204 'TestUtils.scryRenderedDOMComponentsWithClass expects a ' +
@@ -365,7 +366,7 @@ function executeDispatch(event, listener, inst) {
366 function executeDispatchesInOrder(event) {
367 const dispatchListeners = event._dispatchListeners;
368 const dispatchInstances = event._dispatchInstances;
368 - if (Array.isArray(dispatchListeners)) {
369 + if (isArray(dispatchListeners)) {
370 for (let i = 0; i < dispatchListeners.length; i++) {
371 if (event.isPropagationStopped()) {
372 break;
packages/react-native-renderer/src/ReactNativeAttributePayload.js
+7 -6
@@ -12,6 +12,7 @@ import {
12 deepDiffer,
13 flattenStyle,
14 } from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface';
15 +import isArray from 'shared/isArray';
16
17 import type {AttributeConfiguration} from './ReactNativeTypes';
18
@@ -51,7 +52,7 @@ function restoreDeletedValuesInNestedArray(
52 node: NestedNode,
53 validAttributes: AttributeConfiguration,
54 ) {
54 - if (Array.isArray(node)) {
55 + if (isArray(node)) {
56 let i = node.length;
57 while (i-- && removedKeyCount > 0) {
58 restoreDeletedValuesInNestedArray(
@@ -163,12 +164,12 @@ function diffNestedProperty(
164 return updatePayload;
165 }
166
166 - if (!Array.isArray(prevProp) && !Array.isArray(nextProp)) {
167 + if (!isArray(prevProp) && !isArray(nextProp)) {
168 // Both are leaves, we can diff the leaves.
169 return diffProperties(updatePayload, prevProp, nextProp, validAttributes);
170 }
171
171 - if (Array.isArray(prevProp) && Array.isArray(nextProp)) {
172 + if (isArray(prevProp) && isArray(nextProp)) {
173 // Both are arrays, we can diff the arrays.
174 return diffNestedArrayProperty(
175 updatePayload,
@@ -178,7 +179,7 @@ function diffNestedProperty(
179 );
180 }
181
181 - if (Array.isArray(prevProp)) {
182 + if (isArray(prevProp)) {
183 return diffProperties(
184 updatePayload,
185 // $FlowFixMe - We know that this is always an object when the input is.
@@ -212,7 +213,7 @@ function addNestedProperty(
213 return updatePayload;
214 }
215
215 - if (!Array.isArray(nextProp)) {
216 + if (!isArray(nextProp)) {
217 // Add each property of the leaf.
218 return addProperties(updatePayload, nextProp, validAttributes);
219 }
@@ -242,7 +243,7 @@ function clearNestedProperty(
243 return updatePayload;
244 }
245
245 - if (!Array.isArray(prevProp)) {
246 + if (!isArray(prevProp)) {
247 // Add each property of the leaf.
248 return clearProperties(updatePayload, prevProp, validAttributes);
249 }
packages/react-native-renderer/src/legacy-events/EventPluginUtils.js
+6 -5
@@ -7,6 +7,7 @@
7
8 import {invokeGuardedCallbackAndCatchFirstError} from 'shared/ReactErrorUtils';
9 import invariant from 'shared/invariant';
10 +import isArray from 'shared/isArray';
11
12 export let getFiberCurrentPropsFromNode = null;
13 export let getInstanceFromNode = null;
@@ -36,14 +37,14 @@ if (__DEV__) {
37 const dispatchListeners = event._dispatchListeners;
38 const dispatchInstances = event._dispatchInstances;
39
39 - const listenersIsArr = Array.isArray(dispatchListeners);
40 + const listenersIsArr = isArray(dispatchListeners);
41 const listenersLen = listenersIsArr
42 ? dispatchListeners.length
43 : dispatchListeners
44 ? 1
45 : 0;
46
46 - const instancesIsArr = Array.isArray(dispatchInstances);
47 + const instancesIsArr = isArray(dispatchInstances);
48 const instancesLen = instancesIsArr
49 ? dispatchInstances.length
50 : dispatchInstances
@@ -78,7 +79,7 @@ export function executeDispatchesInOrder(event) {
79 if (__DEV__) {
80 validateEventDispatches(event);
81 }
81 - if (Array.isArray(dispatchListeners)) {
82 + if (isArray(dispatchListeners)) {
83 for (let i = 0; i < dispatchListeners.length; i++) {
84 if (event.isPropagationStopped()) {
85 break;
@@ -106,7 +107,7 @@ function executeDispatchesInOrderStopAtTrueImpl(event) {
107 if (__DEV__) {
108 validateEventDispatches(event);
109 }
109 - if (Array.isArray(dispatchListeners)) {
110 + if (isArray(dispatchListeners)) {
111 for (let i = 0; i < dispatchListeners.length; i++) {
112 if (event.isPropagationStopped()) {
113 break;
@@ -150,7 +151,7 @@ export function executeDirectDispatch(event) {
151 const dispatchListener = event._dispatchListeners;
152 const dispatchInstance = event._dispatchInstances;
153 invariant(
153 - !Array.isArray(dispatchListener),
154 + !isArray(dispatchListener),
155 'executeDirectDispatch(...): Invalid `event`.',
156 );
157 event.currentTarget = dispatchListener
packages/react-native-renderer/src/legacy-events/accumulate.js
+3 -2
@@ -8,6 +8,7 @@
8 */
9
10 import invariant from 'shared/invariant';
11 +import isArray from 'shared/isArray';
12
13 /**
14 * Accumulates items that must not be null or undefined.
@@ -31,11 +32,11 @@ function accumulate<T>(
32
33 // Both are not empty. Warning: Never call x.concat(y) when you are not
34 // certain that x is an Array (x could be a string with concat method).
34 - if (Array.isArray(current)) {
35 + if (isArray(current)) {
36 return current.concat(next);
37 }
38
38 - if (Array.isArray(next)) {
39 + if (isArray(next)) {
40 return [current].concat(next);
41 }
42
packages/react-native-renderer/src/legacy-events/accumulateInto.js
+4 -3
@@ -8,6 +8,7 @@
8 */
9
10 import invariant from 'shared/invariant';
11 +import isArray from 'shared/isArray';
12
13 /**
14 * Accumulates items that must not be null or undefined into the first one. This
@@ -37,8 +38,8 @@ function accumulateInto<T>(
38
39 // Both are not empty. Warning: Never call x.concat(y) when you are not
40 // certain that x is an Array (x could be a string with concat method).
40 - if (Array.isArray(current)) {
41 - if (Array.isArray(next)) {
41 + if (isArray(current)) {
42 + if (isArray(next)) {
43 current.push.apply(current, next);
44 return current;
45 }
@@ -46,7 +47,7 @@ function accumulateInto<T>(
47 return current;
48 }
49
49 - if (Array.isArray(next)) {
50 + if (isArray(next)) {
51 // A bit too dangerous to mutate `next`.
52 return [current].concat(next);
53 }
packages/react-noop-renderer/src/createReactNoop.js
+5 -4
@@ -21,6 +21,7 @@ import type {RootTag} from 'react-reconciler/src/ReactRootTags';
21
22 import * as Scheduler from 'scheduler/unstable_mock';
23 import {REACT_FRAGMENT_TYPE, REACT_ELEMENT_TYPE} from 'shared/ReactSymbols';
24 +import isArray from 'shared/isArray';
25 import {
26 DefaultEventPriority,
27 IdleEventPriority,
@@ -604,7 +605,7 @@ function createReactNoop(reconciler: Function, useMutation: boolean) {
605 if (typeof child === 'string') {
606 return child;
607 }
607 - if (Array.isArray(child)) {
608 + if (isArray(child)) {
609 if (child.length === 0) {
610 return null;
611 }
@@ -618,7 +619,7 @@ function createReactNoop(reconciler: Function, useMutation: boolean) {
619 }
620 return children;
621 }
621 - if (Array.isArray(child.children)) {
622 + if (isArray(child.children)) {
623 // This is an instance.
624 const instance: Instance = (child: any);
625 const children = childToJSX(instance.children, instance.text);
@@ -668,7 +669,7 @@ function createReactNoop(reconciler: Function, useMutation: boolean) {
669 if (children === null) {
670 return null;
671 }
671 - if (Array.isArray(children)) {
672 + if (isArray(children)) {
673 return {
674 $$typeof: REACT_ELEMENT_TYPE,
675 type: REACT_FRAGMENT_TYPE,
@@ -687,7 +688,7 @@ function createReactNoop(reconciler: Function, useMutation: boolean) {
688 if (children === null) {
689 return null;
690 }
690 - if (Array.isArray(children)) {
691 + if (isArray(children)) {
692 return {
693 $$typeof: REACT_ELEMENT_TYPE,
694 type: REACT_FRAGMENT_TYPE,
packages/react-reconciler/src/ReactChildFiber.new.js
+1 -2
@@ -31,6 +31,7 @@ import {
31 SimpleMemoComponent,
32 } from './ReactWorkTags';
33 import invariant from 'shared/invariant';
34 +import isArray from 'shared/isArray';
35 import {
36 warnAboutStringRefs,
37 enableLazyElements,
@@ -97,8 +98,6 @@ if (__DEV__) {
98 };
99 }
100
100 -const isArray = Array.isArray;
101 -
101 function coerceRef(
102 returnFiber: Fiber,
103 current: Fiber | null,
packages/react-reconciler/src/ReactChildFiber.old.js
+1 -2
@@ -11,6 +11,7 @@ import type {ReactElement} from 'shared/ReactElementType';
11 import type {ReactPortal} from 'shared/ReactTypes';
12 import type {Fiber} from './ReactInternalTypes';
13 import type {Lanes} from './ReactFiberLane.old';
14 +import isArray from 'shared/isArray';
15
16 import getComponentNameFromFiber from 'react-reconciler/src/getComponentNameFromFiber';
17 import {Placement, ChildDeletion} from './ReactFiberFlags';
@@ -97,8 +98,6 @@ if (__DEV__) {
98 };
99 }
100
100 -const isArray = Array.isArray;
101 -
101 function coerceRef(
102 returnFiber: Fiber,
103 current: Fiber | null,
packages/react-reconciler/src/ReactFiberClassComponent.new.js
+1 -1
@@ -29,6 +29,7 @@ import shallowEqual from 'shared/shallowEqual';
29 import getComponentNameFromFiber from 'react-reconciler/src/getComponentNameFromFiber';
30 import getComponentNameFromType from 'shared/getComponentNameFromType';
31 import invariant from 'shared/invariant';
32 +import isArray from 'shared/isArray';
33 import {REACT_CONTEXT_TYPE, REACT_PROVIDER_TYPE} from 'shared/ReactSymbols';
34
35 import {resolveDefaultProps} from './ReactFiberLazyComponent.new';
@@ -74,7 +75,6 @@ import {
75 } from './SchedulingProfiler';
76
77 const fakeInternalInstance = {};
77 -const isArray = Array.isArray;
78
79 // React.Component uses a shared frozen object by default.
80 // We'll use it to determine whether we need to initialize legacy refs.
packages/react-reconciler/src/ReactFiberClassComponent.old.js
+1 -1
@@ -29,6 +29,7 @@ import shallowEqual from 'shared/shallowEqual';
29 import getComponentNameFromFiber from 'react-reconciler/src/getComponentNameFromFiber';
30 import getComponentNameFromType from 'shared/getComponentNameFromType';
31 import invariant from 'shared/invariant';
32 +import isArray from 'shared/isArray';
33 import {REACT_CONTEXT_TYPE, REACT_PROVIDER_TYPE} from 'shared/ReactSymbols';
34
35 import {resolveDefaultProps} from './ReactFiberLazyComponent.old';
@@ -74,7 +75,6 @@ import {
75 } from './SchedulingProfiler';
76
77 const fakeInternalInstance = {};
77 -const isArray = Array.isArray;
78
79 // React.Component uses a shared frozen object by default.
80 // We'll use it to determine whether we need to initialize legacy refs.
packages/react-reconciler/src/ReactFiberReconciler.new.js
+6 -5
@@ -34,6 +34,7 @@ import {
34 } from './ReactWorkTags';
35 import getComponentNameFromFiber from 'react-reconciler/src/getComponentNameFromFiber';
36 import invariant from 'shared/invariant';
37 +import isArray from 'shared/isArray';
38 import {enableSchedulingProfiler} from 'shared/ReactFeatureFlags';
39 import ReactSharedInternals from 'shared/ReactSharedInternals';
40 import {getPublicInstance} from './ReactFiberHostConfig';
@@ -482,9 +483,9 @@ if (__DEV__) {
483 index: number,
484 ) => {
485 const key = path[index];
485 - const updated = Array.isArray(obj) ? obj.slice() : {...obj};
486 + const updated = isArray(obj) ? obj.slice() : {...obj};
487 if (index + 1 === path.length) {
487 - if (Array.isArray(updated)) {
488 + if (isArray(updated)) {
489 updated.splice(((key: any): number), 1);
490 } else {
491 delete updated[key];
@@ -510,12 +511,12 @@ if (__DEV__) {
511 index: number,
512 ) => {
513 const oldKey = oldPath[index];
513 - const updated = Array.isArray(obj) ? obj.slice() : {...obj};
514 + const updated = isArray(obj) ? obj.slice() : {...obj};
515 if (index + 1 === oldPath.length) {
516 const newKey = newPath[index];
517 // $FlowFixMe number or string is fine here
518 updated[newKey] = updated[oldKey];
518 - if (Array.isArray(updated)) {
519 + if (isArray(updated)) {
520 updated.splice(((oldKey: any): number), 1);
521 } else {
522 delete updated[oldKey];
@@ -564,7 +565,7 @@ if (__DEV__) {
565 return value;
566 }
567 const key = path[index];
567 - const updated = Array.isArray(obj) ? obj.slice() : {...obj};
568 + const updated = isArray(obj) ? obj.slice() : {...obj};
569 // $FlowFixMe number or string is fine here
570 updated[key] = copyWithSetImpl(obj[key], path, index + 1, value);
571 return updated;
packages/react-reconciler/src/ReactFiberReconciler.old.js
+6 -5
@@ -34,6 +34,7 @@ import {
34 } from './ReactWorkTags';
35 import getComponentNameFromFiber from 'react-reconciler/src/getComponentNameFromFiber';
36 import invariant from 'shared/invariant';
37 +import isArray from 'shared/isArray';
38 import {enableSchedulingProfiler} from 'shared/ReactFeatureFlags';
39 import ReactSharedInternals from 'shared/ReactSharedInternals';
40 import {getPublicInstance} from './ReactFiberHostConfig';
@@ -482,9 +483,9 @@ if (__DEV__) {
483 index: number,
484 ) => {
485 const key = path[index];
485 - const updated = Array.isArray(obj) ? obj.slice() : {...obj};
486 + const updated = isArray(obj) ? obj.slice() : {...obj};
487 if (index + 1 === path.length) {
487 - if (Array.isArray(updated)) {
488 + if (isArray(updated)) {
489 updated.splice(((key: any): number), 1);
490 } else {
491 delete updated[key];
@@ -510,12 +511,12 @@ if (__DEV__) {
511 index: number,
512 ) => {
513 const oldKey = oldPath[index];
513 - const updated = Array.isArray(obj) ? obj.slice() : {...obj};
514 + const updated = isArray(obj) ? obj.slice() : {...obj};
515 if (index + 1 === oldPath.length) {
516 const newKey = newPath[index];
517 // $FlowFixMe number or string is fine here
518 updated[newKey] = updated[oldKey];
518 - if (Array.isArray(updated)) {
519 + if (isArray(updated)) {
520 updated.splice(((oldKey: any): number), 1);
521 } else {
522 delete updated[oldKey];
@@ -564,7 +565,7 @@ if (__DEV__) {
565 return value;
566 }
567 const key = path[index];
567 - const updated = Array.isArray(obj) ? obj.slice() : {...obj};
568 + const updated = isArray(obj) ? obj.slice() : {...obj};
569 // $FlowFixMe number or string is fine here
570 updated[key] = copyWithSetImpl(obj[key], path, index + 1, value);
571 return updated;
packages/react-server-dom-relay/src/ReactFlightDOMRelayServerHostConfig.js
+2 -1
@@ -14,6 +14,7 @@ import type {Request, ReactModel} from 'react-server/src/ReactFlightServer';
14 import JSResourceReference from 'JSResourceReference';
15
16 import hasOwnProperty from 'shared/hasOwnProperty';
17 +import isArray from 'shared/isArray';
18
19 export type ModuleReference<T> = JSResourceReference<T>;
20
@@ -82,7 +83,7 @@ function convertModelToJSON(
83 ): JSONValue {
84 const json = resolveModelToJSON(request, parent, key, model);
85 if (typeof json === 'object' && json !== null) {
85 - if (Array.isArray(json)) {
86 + if (isArray(json)) {
87 const jsonArray: Array<JSONValue> = [];
88 for (let i = 0; i < json.length; i++) {
89 jsonArray[i] = convertModelToJSON(request, json, '' + i, json[i]);
packages/react-server-native-relay/src/ReactFlightNativeRelayServerHostConfig.js
+2 -2
@@ -8,9 +8,9 @@
8 */
9
10 import type {RowEncoding, JSONValue} from './ReactFlightNativeRelayProtocol';
11 -
11 import type {Request, ReactModel} from 'react-server/src/ReactFlightServer';
12 import hasOwnProperty from 'shared/hasOwnProperty';
13 +import isArray from 'shared/isArray';
14 import JSResourceReferenceImpl from 'JSResourceReferenceImpl';
15
16 export type ModuleReference<T> = JSResourceReferenceImpl<T>;
@@ -80,7 +80,7 @@ function convertModelToJSON(
80 ): JSONValue {
81 const json = resolveModelToJSON(request, parent, key, model);
82 if (typeof json === 'object' && json !== null) {
83 - if (Array.isArray(json)) {
83 + if (isArray(json)) {
84 const jsonArray: Array<JSONValue> = [];
85 for (let i = 0; i < json.length; i++) {
86 jsonArray[i] = convertModelToJSON(request, json, '' + i, json[i]);
packages/react-server/src/ReactFizzServer.js
+2 -1
@@ -51,6 +51,7 @@ import {REACT_ELEMENT_TYPE, REACT_SUSPENSE_TYPE} from 'shared/ReactSymbols';
51 import ReactSharedInternals from 'shared/ReactSharedInternals';
52
53 import invariant from 'shared/invariant';
54 +import isArray from 'shared/isArray';
55
56 const ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;
57
@@ -287,7 +288,7 @@ function renderNode(request: Request, task: Task, node: ReactNodeList): void {
288 return;
289 }
290
290 - if (Array.isArray(node)) {
291 + if (isArray(node)) {
292 if (node.length > 0) {
293 for (let i = 0; i < node.length; i++) {
294 renderNode(request, task, node[i]);
packages/react-server/src/ReactFlightServer.js
+1 -2
@@ -44,8 +44,7 @@ import {
44
45 import ReactSharedInternals from 'shared/ReactSharedInternals';
46 import invariant from 'shared/invariant';
47 -
48 -const isArray = Array.isArray;
47 +import isArray from 'shared/isArray';
48
49 type ReactJSONValue =
50 | string
packages/react/src/ReactChildren.js
+3 -2
@@ -10,6 +10,7 @@
10 import type {ReactNodeList} from 'shared/ReactTypes';
11
12 import invariant from 'shared/invariant';
13 +import isArray from 'shared/isArray';
14 import {
15 getIteratorFn,
16 REACT_ELEMENT_TYPE,
@@ -110,7 +111,7 @@ function mapIntoArray(
111 // so that it's consistent if the number of children grows:
112 const childKey =
113 nameSoFar === '' ? SEPARATOR + getElementKey(child, 0) : nameSoFar;
113 - if (Array.isArray(mappedChild)) {
114 + if (isArray(mappedChild)) {
115 let escapedChildKey = '';
116 if (childKey != null) {
117 escapedChildKey = escapeUserProvidedKey(childKey) + '/';
@@ -142,7 +143,7 @@ function mapIntoArray(
143 const nextNamePrefix =
144 nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR;
145
145 - if (Array.isArray(children)) {
146 + if (isArray(children)) {
147 for (let i = 0; i < children.length; i++) {
148 child = children[i];
149 nextName = nextNamePrefix + getElementKey(child, i);
packages/react/src/ReactElementValidator.js
+5 -4
@@ -23,6 +23,7 @@ import {
23 } from 'shared/ReactSymbols';
24 import {warnAboutSpreadingKeyToJSX} from 'shared/ReactFeatureFlags';
25 import checkPropTypes from 'shared/checkPropTypes';
26 +import isArray from 'shared/isArray';
27
28 import ReactCurrentOwner from './ReactCurrentOwner';
29 import {
@@ -168,7 +169,7 @@ function validateChildKeys(node, parentType) {
169 if (typeof node !== 'object') {
170 return;
171 }
171 - if (Array.isArray(node)) {
172 + if (isArray(node)) {
173 for (let i = 0; i < node.length; i++) {
174 const child = node[i];
175 if (isValidElement(child)) {
@@ -313,7 +314,7 @@ export function jsxWithValidation(
314 let typeString;
315 if (type === null) {
316 typeString = 'null';
316 - } else if (Array.isArray(type)) {
317 + } else if (isArray(type)) {
318 typeString = 'array';
319 } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {
320 typeString = `<${getComponentNameFromType(type.type) || 'Unknown'} />`;
@@ -352,7 +353,7 @@ export function jsxWithValidation(
353 const children = props.children;
354 if (children !== undefined) {
355 if (isStaticChildren) {
355 - if (Array.isArray(children)) {
356 + if (isArray(children)) {
357 for (let i = 0; i < children.length; i++) {
358 validateChildKeys(children[i], type);
359 }
@@ -437,7 +438,7 @@ export function createElementWithValidation(type, props, children) {
438 let typeString;
439 if (type === null) {
440 typeString = 'null';
440 - } else if (Array.isArray(type)) {
441 + } else if (isArray(type)) {
442 typeString = 'array';
443 } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {
444 typeString = `<${getComponentNameFromType(type.type) || 'Unknown'} />`;
packages/react/src/jsx/ReactJSXElementValidator.js
+4 -3
@@ -23,6 +23,7 @@ import {
23 } from 'shared/ReactSymbols';
24 import {warnAboutSpreadingKeyToJSX} from 'shared/ReactFeatureFlags';
25 import hasOwnProperty from 'shared/hasOwnProperty';
26 +import isArray from 'shared/isArray';
27 import {jsxDEV} from './ReactJSXElement';
28
29 import {describeUnknownElementTypeFrameInDEV} from 'shared/ReactComponentStackFrame';
@@ -182,7 +183,7 @@ function validateChildKeys(node, parentType) {
183 if (typeof node !== 'object') {
184 return;
185 }
185 - if (Array.isArray(node)) {
186 + if (isArray(node)) {
187 for (let i = 0; i < node.length; i++) {
188 const child = node[i];
189 if (isValidElement(child)) {
@@ -329,7 +330,7 @@ export function jsxWithValidation(
330 let typeString;
331 if (type === null) {
332 typeString = 'null';
332 - } else if (Array.isArray(type)) {
333 + } else if (isArray(type)) {
334 typeString = 'array';
335 } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {
336 typeString = `<${getComponentNameFromType(type.type) || 'Unknown'} />`;
@@ -366,7 +367,7 @@ export function jsxWithValidation(
367 const children = props.children;
368 if (children !== undefined) {
369 if (isStaticChildren) {
369 - if (Array.isArray(children)) {
370 + if (isArray(children)) {
371 for (let i = 0; i < children.length; i++) {
372 validateChildKeys(children[i], type);
373 }
packages/shared/isArray.js new
+12
@@ -0,0 +1,12 @@
1 +/**
2 + * Copyright (c) Facebook, Inc. and its affiliates.
3 + *
4 + * This source code is licensed under the MIT license found in the
5 + * LICENSE file in the root directory of this source tree.
6 + *
7 + * @flow
8 + */
9 +
10 +const isArray = Array.isArray;
11 +
12 +export default isArray;