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