You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
2.6 KiB
73 lines
2.6 KiB
/** |
|
* Copyright (c) 2013-present, Facebook, Inc. |
|
* |
|
* This source code is licensed under the MIT license found in the |
|
* LICENSE file in the root directory of this source tree. |
|
* |
|
* |
|
*/ |
|
|
|
'use strict'; |
|
|
|
var KeyEscapeUtils = require('./KeyEscapeUtils'); |
|
var traverseAllChildren = require('./traverseAllChildren'); |
|
var warning = require('fbjs/lib/warning'); |
|
|
|
var ReactComponentTreeHook; |
|
|
|
if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'test') { |
|
// Temporary hack. |
|
// Inline requires don't work well with Jest: |
|
// https://github.com/facebook/react/issues/7240 |
|
// Remove the inline requires when we don't need them anymore: |
|
// https://github.com/facebook/react/pull/7178 |
|
ReactComponentTreeHook = require('./ReactComponentTreeHook'); |
|
} |
|
|
|
/** |
|
* @param {function} traverseContext Context passed through traversal. |
|
* @param {?ReactComponent} child React child component. |
|
* @param {!string} name String name of key path to child. |
|
* @param {number=} selfDebugID Optional debugID of the current internal instance. |
|
*/ |
|
function flattenSingleChildIntoContext(traverseContext, child, name, selfDebugID) { |
|
// We found a component instance. |
|
if (traverseContext && typeof traverseContext === 'object') { |
|
var result = traverseContext; |
|
var keyUnique = result[name] === undefined; |
|
if (process.env.NODE_ENV !== 'production') { |
|
if (!ReactComponentTreeHook) { |
|
ReactComponentTreeHook = require('./ReactComponentTreeHook'); |
|
} |
|
if (!keyUnique) { |
|
process.env.NODE_ENV !== 'production' ? warning(false, 'flattenChildren(...): Encountered two children with the same key, ' + '`%s`. Child keys must be unique; when two children share a key, only ' + 'the first child will be used.%s', KeyEscapeUtils.unescape(name), ReactComponentTreeHook.getStackAddendumByID(selfDebugID)) : void 0; |
|
} |
|
} |
|
if (keyUnique && child != null) { |
|
result[name] = child; |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* Flattens children that are typically specified as `props.children`. Any null |
|
* children will not be included in the resulting object. |
|
* @return {!object} flattened children keyed by name. |
|
*/ |
|
function flattenChildren(children, selfDebugID) { |
|
if (children == null) { |
|
return children; |
|
} |
|
var result = {}; |
|
|
|
if (process.env.NODE_ENV !== 'production') { |
|
traverseAllChildren(children, function (traverseContext, child, name) { |
|
return flattenSingleChildIntoContext(traverseContext, child, name, selfDebugID); |
|
}, result); |
|
} else { |
|
traverseAllChildren(children, flattenSingleChildIntoContext, result); |
|
} |
|
return result; |
|
} |
|
|
|
module.exports = flattenChildren; |