1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | 'use strict';
|
10 |
|
11 | var _prodInvariant = require('./reactProdInvariant');
|
12 |
|
13 | var ReactCurrentOwner = require('./ReactCurrentOwner');
|
14 | var REACT_ELEMENT_TYPE = require('./ReactElementSymbol');
|
15 |
|
16 | var getIteratorFn = require('./getIteratorFn');
|
17 | var invariant = require('fbjs/lib/invariant');
|
18 | var KeyEscapeUtils = require('./KeyEscapeUtils');
|
19 | var warning = require('fbjs/lib/warning');
|
20 |
|
21 | var SEPARATOR = '.';
|
22 | var SUBSEPARATOR = ':';
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 | var didWarnAboutMaps = false;
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 |
|
44 | function getComponentKey(component, index) {
|
45 |
|
46 |
|
47 | if (component && typeof component === 'object' && component.key != null) {
|
48 |
|
49 | return KeyEscapeUtils.escape(component.key);
|
50 | }
|
51 |
|
52 | return index.toString(36);
|
53 | }
|
54 |
|
55 |
|
56 |
|
57 |
|
58 |
|
59 |
|
60 |
|
61 |
|
62 |
|
63 | function traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) {
|
64 | var type = typeof children;
|
65 |
|
66 | if (type === 'undefined' || type === 'boolean') {
|
67 |
|
68 | children = null;
|
69 | }
|
70 |
|
71 | if (children === null || type === 'string' || type === 'number' ||
|
72 |
|
73 |
|
74 | type === 'object' && children.$$typeof === REACT_ELEMENT_TYPE) {
|
75 | callback(traverseContext, children,
|
76 |
|
77 |
|
78 | nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar);
|
79 | return 1;
|
80 | }
|
81 |
|
82 | var child;
|
83 | var nextName;
|
84 | var subtreeCount = 0;
|
85 | var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR;
|
86 |
|
87 | if (Array.isArray(children)) {
|
88 | for (var i = 0; i < children.length; i++) {
|
89 | child = children[i];
|
90 | nextName = nextNamePrefix + getComponentKey(child, i);
|
91 | subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);
|
92 | }
|
93 | } else {
|
94 | var iteratorFn = getIteratorFn(children);
|
95 | if (iteratorFn) {
|
96 | var iterator = iteratorFn.call(children);
|
97 | var step;
|
98 | if (iteratorFn !== children.entries) {
|
99 | var ii = 0;
|
100 | while (!(step = iterator.next()).done) {
|
101 | child = step.value;
|
102 | nextName = nextNamePrefix + getComponentKey(child, ii++);
|
103 | subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);
|
104 | }
|
105 | } else {
|
106 | if (process.env.NODE_ENV !== 'production') {
|
107 | var mapsAsChildrenAddendum = '';
|
108 | if (ReactCurrentOwner.current) {
|
109 | var mapsAsChildrenOwnerName = ReactCurrentOwner.current.getName();
|
110 | if (mapsAsChildrenOwnerName) {
|
111 | mapsAsChildrenAddendum = ' Check the render method of `' + mapsAsChildrenOwnerName + '`.';
|
112 | }
|
113 | }
|
114 | process.env.NODE_ENV !== 'production' ? warning(didWarnAboutMaps, 'Using Maps as children is not yet fully supported. It is an ' + 'experimental feature that might be removed. Convert it to a ' + 'sequence / iterable of keyed ReactElements instead.%s', mapsAsChildrenAddendum) : void 0;
|
115 | didWarnAboutMaps = true;
|
116 | }
|
117 |
|
118 | while (!(step = iterator.next()).done) {
|
119 | var entry = step.value;
|
120 | if (entry) {
|
121 | child = entry[1];
|
122 | nextName = nextNamePrefix + KeyEscapeUtils.escape(entry[0]) + SUBSEPARATOR + getComponentKey(child, 0);
|
123 | subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);
|
124 | }
|
125 | }
|
126 | }
|
127 | } else if (type === 'object') {
|
128 | var addendum = '';
|
129 | if (process.env.NODE_ENV !== 'production') {
|
130 | addendum = ' If you meant to render a collection of children, use an array ' + 'instead or wrap the object using createFragment(object) from the ' + 'React add-ons.';
|
131 | if (children._isReactElement) {
|
132 | addendum = " It looks like you're using an element created by a different " + 'version of React. Make sure to use only one copy of React.';
|
133 | }
|
134 | if (ReactCurrentOwner.current) {
|
135 | var name = ReactCurrentOwner.current.getName();
|
136 | if (name) {
|
137 | addendum += ' Check the render method of `' + name + '`.';
|
138 | }
|
139 | }
|
140 | }
|
141 | var childrenString = String(children);
|
142 | !false ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Objects are not valid as a React child (found: %s).%s', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString, addendum) : _prodInvariant('31', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString, addendum) : void 0;
|
143 | }
|
144 | }
|
145 |
|
146 | return subtreeCount;
|
147 | }
|
148 |
|
149 |
|
150 |
|
151 |
|
152 |
|
153 |
|
154 |
|
155 |
|
156 |
|
157 |
|
158 |
|
159 |
|
160 |
|
161 |
|
162 |
|
163 |
|
164 |
|
165 | function traverseAllChildren(children, callback, traverseContext) {
|
166 | if (children == null) {
|
167 | return 0;
|
168 | }
|
169 |
|
170 | return traverseAllChildrenImpl(children, '', callback, traverseContext);
|
171 | }
|
172 |
|
173 | module.exports = traverseAllChildren; |
\ | No newline at end of file |