react 0.7.1 → 0.10.0-rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/README.md +10 -231
  2. package/addons.js +1 -0
  3. package/lib/AutoFocusMixin.js +32 -0
  4. package/lib/CSSCore.js +115 -0
  5. package/lib/CSSProperty.js +121 -0
  6. package/lib/CSSPropertyOperations.js +97 -0
  7. package/lib/ChangeEventPlugin.js +387 -0
  8. package/lib/ClientReactRootIndex.js +30 -0
  9. package/lib/CompositionEventPlugin.js +260 -0
  10. package/lib/DOMChildrenOperations.js +171 -0
  11. package/lib/DOMProperty.js +270 -0
  12. package/lib/DOMPropertyOperations.js +181 -0
  13. package/lib/Danger.js +187 -0
  14. package/lib/DefaultDOMPropertyConfig.js +196 -0
  15. package/lib/DefaultEventPluginOrder.js +44 -0
  16. package/lib/EnterLeaveEventPlugin.js +145 -0
  17. package/lib/EventConstants.js +76 -0
  18. package/lib/EventListener.js +69 -0
  19. package/lib/EventPluginHub.js +295 -0
  20. package/lib/EventPluginRegistry.js +281 -0
  21. package/lib/EventPluginUtils.js +214 -0
  22. package/lib/EventPropagators.js +143 -0
  23. package/lib/ExecutionEnvironment.js +44 -0
  24. package/lib/LinkedStateMixin.js +46 -0
  25. package/lib/LinkedValueUtils.js +160 -0
  26. package/lib/MobileSafariClickEventPlugin.js +63 -0
  27. package/lib/PooledClass.js +119 -0
  28. package/lib/React.js +97 -0
  29. package/lib/ReactBrowserComponentMixin.js +42 -0
  30. package/lib/ReactCSSTransitionGroup.js +65 -0
  31. package/lib/ReactCSSTransitionGroupChild.js +138 -0
  32. package/lib/ReactChildren.js +132 -0
  33. package/lib/ReactComponent.js +595 -0
  34. package/lib/ReactComponentBrowserEnvironment.js +124 -0
  35. package/lib/ReactCompositeComponent.js +1587 -0
  36. package/lib/ReactContext.js +67 -0
  37. package/lib/ReactCurrentOwner.js +39 -0
  38. package/lib/ReactDOM.js +207 -0
  39. package/lib/ReactDOMButton.js +69 -0
  40. package/lib/ReactDOMComponent.js +416 -0
  41. package/lib/ReactDOMForm.js +62 -0
  42. package/lib/ReactDOMIDOperations.js +218 -0
  43. package/lib/ReactDOMImg.js +61 -0
  44. package/lib/ReactDOMInput.js +182 -0
  45. package/lib/ReactDOMOption.js +55 -0
  46. package/lib/ReactDOMSelect.js +180 -0
  47. package/lib/ReactDOMSelection.js +189 -0
  48. package/lib/ReactDOMTextarea.js +144 -0
  49. package/lib/ReactDefaultBatchingStrategy.js +75 -0
  50. package/lib/ReactDefaultInjection.js +125 -0
  51. package/lib/ReactDefaultPerf.js +244 -0
  52. package/lib/ReactDefaultPerfAnalysis.js +199 -0
  53. package/lib/ReactErrorUtils.js +37 -0
  54. package/lib/ReactEventEmitter.js +339 -0
  55. package/lib/ReactEventEmitterMixin.js +57 -0
  56. package/lib/ReactEventTopLevelCallback.js +149 -0
  57. package/lib/ReactInjection.js +43 -0
  58. package/lib/ReactInputSelection.js +141 -0
  59. package/lib/ReactInstanceHandles.js +338 -0
  60. package/lib/ReactLink.js +54 -0
  61. package/lib/ReactMarkupChecksum.js +53 -0
  62. package/lib/ReactMount.js +649 -0
  63. package/lib/ReactMountReady.js +95 -0
  64. package/lib/ReactMultiChild.js +432 -0
  65. package/lib/ReactMultiChildUpdateTypes.js +38 -0
  66. package/lib/ReactOwner.js +159 -0
  67. package/lib/ReactPerf.js +85 -0
  68. package/lib/ReactPropTransferer.js +147 -0
  69. package/lib/ReactPropTypeLocationNames.js +31 -0
  70. package/lib/ReactPropTypeLocations.js +29 -0
  71. package/lib/ReactPropTypes.js +359 -0
  72. package/lib/ReactPutListenerQueue.js +61 -0
  73. package/lib/ReactReconcileTransaction.js +182 -0
  74. package/lib/ReactRootIndex.js +36 -0
  75. package/lib/ReactServerRendering.js +89 -0
  76. package/lib/ReactServerRenderingTransaction.js +116 -0
  77. package/lib/ReactStateSetters.js +111 -0
  78. package/lib/ReactTestUtils.js +394 -0
  79. package/lib/ReactTextComponent.js +121 -0
  80. package/lib/ReactTransitionChildMapping.js +106 -0
  81. package/lib/ReactTransitionEvents.js +97 -0
  82. package/lib/ReactTransitionGroup.js +187 -0
  83. package/lib/ReactUpdates.js +148 -0
  84. package/lib/ReactWithAddons.js +53 -0
  85. package/lib/SelectEventPlugin.js +200 -0
  86. package/lib/ServerReactRootIndex.js +36 -0
  87. package/lib/SimpleEventPlugin.js +413 -0
  88. package/lib/SyntheticClipboardEvent.js +51 -0
  89. package/lib/SyntheticCompositionEvent.js +51 -0
  90. package/lib/SyntheticDragEvent.js +44 -0
  91. package/lib/SyntheticEvent.js +164 -0
  92. package/lib/SyntheticFocusEvent.js +44 -0
  93. package/lib/SyntheticKeyboardEvent.js +58 -0
  94. package/lib/SyntheticMouseEvent.js +85 -0
  95. package/lib/SyntheticTouchEvent.js +50 -0
  96. package/lib/SyntheticUIEvent.js +45 -0
  97. package/lib/SyntheticWheelEvent.js +66 -0
  98. package/lib/Transaction.js +276 -0
  99. package/lib/ViewportMetrics.js +37 -0
  100. package/lib/accumulate.js +54 -0
  101. package/lib/adler32.js +39 -0
  102. package/lib/cloneWithProps.js +59 -0
  103. package/lib/containsNode.js +49 -0
  104. package/lib/copyProperties.js +54 -0
  105. package/lib/createArrayFrom.js +91 -0
  106. package/lib/createFullPageComponent.js +63 -0
  107. package/lib/createNodesFromMarkup.js +93 -0
  108. package/lib/createObjectFrom.js +61 -0
  109. package/lib/cx.js +44 -0
  110. package/lib/dangerousStyleValue.js +57 -0
  111. package/lib/emptyFunction.js +43 -0
  112. package/lib/emptyObject.js +27 -0
  113. package/lib/escapeTextForBrowser.js +47 -0
  114. package/lib/flattenChildren.js +57 -0
  115. package/lib/focusNode.js +33 -0
  116. package/lib/forEachAccumulated.js +36 -0
  117. package/lib/getActiveElement.js +34 -0
  118. package/lib/getEventKey.js +85 -0
  119. package/lib/getEventTarget.js +36 -0
  120. package/lib/getMarkupWrap.js +118 -0
  121. package/lib/getNodeForCharacterOffset.js +80 -0
  122. package/lib/getReactRootElementInContainer.js +40 -0
  123. package/lib/getTextContentAccessor.js +42 -0
  124. package/lib/getUnboundedScrollPosition.js +45 -0
  125. package/lib/hyphenate.js +35 -0
  126. package/lib/instantiateReactComponent.js +70 -0
  127. package/lib/invariant.js +62 -0
  128. package/lib/isEventSupported.js +70 -0
  129. package/lib/isNode.js +33 -0
  130. package/lib/isTextInputElement.js +49 -0
  131. package/lib/isTextNode.js +30 -0
  132. package/lib/joinClasses.js +44 -0
  133. package/lib/keyMirror.js +58 -0
  134. package/lib/keyOf.js +41 -0
  135. package/lib/memoizeStringOnly.js +39 -0
  136. package/lib/merge.js +37 -0
  137. package/lib/mergeHelpers.js +136 -0
  138. package/lib/mergeInto.js +45 -0
  139. package/lib/mixInto.js +34 -0
  140. package/lib/monitorCodeUse.js +37 -0
  141. package/lib/objMap.js +47 -0
  142. package/lib/objMapKeyVal.js +47 -0
  143. package/lib/onlyChild.js +43 -0
  144. package/lib/performanceNow.js +42 -0
  145. package/lib/shallowEqual.js +49 -0
  146. package/lib/shouldUpdateReactComponent.js +61 -0
  147. package/lib/toArray.js +75 -0
  148. package/lib/traverseAllChildren.js +190 -0
  149. package/lib/update.js +159 -0
  150. package/lib/warning.js +48 -0
  151. package/package.json +33 -31
  152. package/react.js +1 -0
  153. package/.npmignore +0 -7
  154. package/.travis.yml +0 -7
  155. package/Jakefile.js +0 -39
  156. package/LICENSE +0 -19
  157. package/browser-test/dist.html +0 -90
  158. package/browser-test/index.html +0 -86
  159. package/browser-test/min.html +0 -90
  160. package/dist/react.js +0 -3141
  161. package/dist/react.min.js +0 -22
  162. package/doc/advanced.md +0 -175
  163. package/doc/color-def.graffle +0 -938
  164. package/doc/color-def.png +0 -0
  165. package/doc/simple.dot +0 -25
  166. package/doc/simple.png +0 -0
  167. package/examples/longer-example.js +0 -41
  168. package/examples/simple.js +0 -45
  169. package/examples/using-ast-directly.js +0 -30
  170. package/examples/using-events1.js +0 -79
  171. package/examples/using-log-events.js +0 -43
  172. package/lib/base-task.js +0 -120
  173. package/lib/cb-task.js +0 -84
  174. package/lib/core.js +0 -138
  175. package/lib/dsl.js +0 -138
  176. package/lib/error.js +0 -55
  177. package/lib/event-collector.js +0 -81
  178. package/lib/event-manager.js +0 -89
  179. package/lib/eventemitter.js +0 -20
  180. package/lib/finalcb-first-task.js +0 -68
  181. package/lib/finalcb-task.js +0 -65
  182. package/lib/id.js +0 -22
  183. package/lib/input-parser.js +0 -56
  184. package/lib/log-events.js +0 -101
  185. package/lib/parse.js +0 -41
  186. package/lib/promise-resolve.js +0 -50
  187. package/lib/promise-task.js +0 -93
  188. package/lib/react.js +0 -59
  189. package/lib/ret-task.js +0 -71
  190. package/lib/sprintf.js +0 -18
  191. package/lib/status.js +0 -14
  192. package/lib/task.js +0 -251
  193. package/lib/track-tasks.js +0 -74
  194. package/lib/validate.js +0 -159
  195. package/lib/vcon.js +0 -113
  196. package/lib/when-task.js +0 -84
  197. package/src/dist.build.requirejs +0 -20
  198. package/test/ast.mocha.js +0 -136
  199. package/test/cb-task.mocha.js +0 -220
  200. package/test/core-deferred.mocha.js +0 -143
  201. package/test/core-when.mocha.js +0 -96
  202. package/test/core.mocha.js +0 -589
  203. package/test/dsl.mocha.js +0 -352
  204. package/test/event-manager.mocha.js +0 -119
  205. package/test/exec-options.mocha.js +0 -48
  206. package/test/finalcb-task.mocha.js +0 -58
  207. package/test/input-parser.mocha.js +0 -86
  208. package/test/log-events.mocha.js +0 -88
  209. package/test/mocha.opts +0 -2
  210. package/test/module-use.mocha.js +0 -164
  211. package/test/promise-auto-resolve.mocha.js +0 -68
  212. package/test/ret-task.mocha.js +0 -220
  213. package/test/task.mocha.js +0 -42
  214. package/test/validate-cb-task.mocha.js +0 -100
  215. package/test/validate-ret-task.mocha.js +0 -110
  216. package/test/validate.mocha.js +0 -324
  217. package/test/vcon.mocha.js +0 -193
  218. package/vendor/chai/chai.js +0 -4251
  219. package/vendor/jquery/jquery-1.7.1.js +0 -9266
  220. package/vendor/jquery/jquery-1.7.1.min.js +0 -4
  221. package/vendor/node/util.js +0 -531
  222. package/vendor/requirejs/require.js +0 -2045
  223. package/vendor/requirejs/require.min.js +0 -36
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Copyright 2013-2014 Facebook, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ * @providesModule onlyChild
17
+ */
18
+ "use strict";
19
+
20
+ var ReactComponent = require("./ReactComponent");
21
+
22
+ var invariant = require("./invariant");
23
+
24
+ /**
25
+ * Returns the first child in a collection of children and verifies that there
26
+ * is only one child in the collection. The current implementation of this
27
+ * function assumes that a single child gets passed without a wrapper, but the
28
+ * purpose of this helper function is to abstract away the particular structure
29
+ * of children.
30
+ *
31
+ * @param {?object} children Child collection structure.
32
+ * @return {ReactComponent} The first and only `ReactComponent` contained in the
33
+ * structure.
34
+ */
35
+ function onlyChild(children) {
36
+ ("production" !== process.env.NODE_ENV ? invariant(
37
+ ReactComponent.isValidComponent(children),
38
+ 'onlyChild must be passed a children with exactly one child.'
39
+ ) : invariant(ReactComponent.isValidComponent(children)));
40
+ return children;
41
+ }
42
+
43
+ module.exports = onlyChild;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Copyright 2013-2014 Facebook, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ * @providesModule performanceNow
17
+ * @typechecks static-only
18
+ */
19
+
20
+ "use strict";
21
+
22
+ var ExecutionEnvironment = require("./ExecutionEnvironment");
23
+
24
+ /**
25
+ * Detect if we can use window.performance.now() and gracefully
26
+ * fallback to Date.now() if it doesn't exist.
27
+ * We need to support Firefox < 15 for now due to Facebook's webdriver
28
+ * infrastructure.
29
+ */
30
+ var performance = null;
31
+
32
+ if (ExecutionEnvironment.canUseDOM) {
33
+ performance = window.performance || window.webkitPerformance;
34
+ }
35
+
36
+ if (!performance || !performance.now) {
37
+ performance = Date;
38
+ }
39
+
40
+ var performanceNow = performance.now.bind(performance);
41
+
42
+ module.exports = performanceNow;
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Copyright 2013-2014 Facebook, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ * @providesModule shallowEqual
17
+ */
18
+
19
+ "use strict";
20
+
21
+ /**
22
+ * Performs equality by iterating through keys on an object and returning
23
+ * false when any key has values which are not strictly equal between
24
+ * objA and objB. Returns true when the values of all keys are strictly equal.
25
+ *
26
+ * @return {boolean}
27
+ */
28
+ function shallowEqual(objA, objB) {
29
+ if (objA === objB) {
30
+ return true;
31
+ }
32
+ var key;
33
+ // Test for A's keys different from B.
34
+ for (key in objA) {
35
+ if (objA.hasOwnProperty(key) &&
36
+ (!objB.hasOwnProperty(key) || objA[key] !== objB[key])) {
37
+ return false;
38
+ }
39
+ }
40
+ // Test for B'a keys missing from A.
41
+ for (key in objB) {
42
+ if (objB.hasOwnProperty(key) && !objA.hasOwnProperty(key)) {
43
+ return false;
44
+ }
45
+ }
46
+ return true;
47
+ }
48
+
49
+ module.exports = shallowEqual;
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Copyright 2013-2014 Facebook, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ * @providesModule shouldUpdateReactComponent
17
+ * @typechecks static-only
18
+ */
19
+
20
+ "use strict";
21
+
22
+ /**
23
+ * Given a `prevComponentInstance` and `nextComponent`, determines if
24
+ * `prevComponentInstance` should be updated as opposed to being destroyed or
25
+ * replaced by a new instance. The second argument is a descriptor. Future
26
+ * versions of the reconciler should only compare descriptors to other
27
+ * descriptors.
28
+ *
29
+ * @param {?object} prevComponentInstance
30
+ * @param {?object} nextDescriptor
31
+ * @return {boolean} True if `prevComponentInstance` should be updated.
32
+ * @protected
33
+ */
34
+ function shouldUpdateReactComponent(prevComponentInstance, nextDescriptor) {
35
+ // TODO: Remove warning after a release.
36
+ if (prevComponentInstance && nextDescriptor &&
37
+ prevComponentInstance.constructor === nextDescriptor.constructor && (
38
+ (prevComponentInstance.props && prevComponentInstance.props.key) ===
39
+ (nextDescriptor.props && nextDescriptor.props.key)
40
+ )) {
41
+ if (prevComponentInstance._owner === nextDescriptor._owner) {
42
+ return true;
43
+ } else {
44
+ if ("production" !== process.env.NODE_ENV) {
45
+ if (prevComponentInstance.state) {
46
+ console.warn(
47
+ 'A recent change to React has been found to impact your code. ' +
48
+ 'A mounted component will now be unmounted and replaced by a ' +
49
+ 'component (of the same class) if their owners are different. ' +
50
+ 'Previously, ownership was not considered when updating.',
51
+ prevComponentInstance,
52
+ nextDescriptor
53
+ );
54
+ }
55
+ }
56
+ }
57
+ }
58
+ return false;
59
+ }
60
+
61
+ module.exports = shouldUpdateReactComponent;
package/lib/toArray.js ADDED
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Copyright 2014 Facebook, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ * @providesModule toArray
17
+ * @typechecks
18
+ */
19
+
20
+ var invariant = require("./invariant");
21
+
22
+ /**
23
+ * Convert array-like objects to arrays.
24
+ *
25
+ * This API assumes the caller knows the contents of the data type. For less
26
+ * well defined inputs use createArrayFrom.
27
+ *
28
+ * @param {object|function} obj
29
+ * @return {array}
30
+ */
31
+ function toArray(obj) {
32
+ var length = obj.length;
33
+
34
+ // Some browse builtin objects can report typeof 'function' (e.g. NodeList in
35
+ // old versions of Safari).
36
+ ("production" !== process.env.NODE_ENV ? invariant(
37
+ !Array.isArray(obj) &&
38
+ (typeof obj === 'object' || typeof obj === 'function'),
39
+ 'toArray: Array-like object expected'
40
+ ) : invariant(!Array.isArray(obj) &&
41
+ (typeof obj === 'object' || typeof obj === 'function')));
42
+
43
+ ("production" !== process.env.NODE_ENV ? invariant(
44
+ typeof length === 'number',
45
+ 'toArray: Object needs a length property'
46
+ ) : invariant(typeof length === 'number'));
47
+
48
+ ("production" !== process.env.NODE_ENV ? invariant(
49
+ length === 0 ||
50
+ (length - 1) in obj,
51
+ 'toArray: Object should have keys for indices'
52
+ ) : invariant(length === 0 ||
53
+ (length - 1) in obj));
54
+
55
+ // Old IE doesn't give collections access to hasOwnProperty. Assume inputs
56
+ // without method will throw during the slice call and skip straight to the
57
+ // fallback.
58
+ if (obj.hasOwnProperty) {
59
+ try {
60
+ return Array.prototype.slice.call(obj);
61
+ } catch (e) {
62
+ // IE < 9 does not support Array#slice on collections objects
63
+ }
64
+ }
65
+
66
+ // Fall back to copying key by key. This assumes all keys have a value,
67
+ // so will not preserve sparsely populated inputs.
68
+ var ret = Array(length);
69
+ for (var ii = 0; ii < length; ii++) {
70
+ ret[ii] = obj[ii];
71
+ }
72
+ return ret;
73
+ }
74
+
75
+ module.exports = toArray;
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Copyright 2013-2014 Facebook, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ * @providesModule traverseAllChildren
17
+ */
18
+
19
+ "use strict";
20
+
21
+ var ReactInstanceHandles = require("./ReactInstanceHandles");
22
+ var ReactTextComponent = require("./ReactTextComponent");
23
+
24
+ var invariant = require("./invariant");
25
+
26
+ var SEPARATOR = ReactInstanceHandles.SEPARATOR;
27
+ var SUBSEPARATOR = ':';
28
+
29
+ /**
30
+ * TODO: Test that:
31
+ * 1. `mapChildren` transforms strings and numbers into `ReactTextComponent`.
32
+ * 2. it('should fail when supplied duplicate key', function() {
33
+ * 3. That a single child and an array with one item have the same key pattern.
34
+ * });
35
+ */
36
+
37
+ var userProvidedKeyEscaperLookup = {
38
+ '=': '=0',
39
+ '.': '=1',
40
+ ':': '=2'
41
+ };
42
+
43
+ var userProvidedKeyEscapeRegex = /[=.:]/g;
44
+
45
+ function userProvidedKeyEscaper(match) {
46
+ return userProvidedKeyEscaperLookup[match];
47
+ }
48
+
49
+ /**
50
+ * Generate a key string that identifies a component within a set.
51
+ *
52
+ * @param {*} component A component that could contain a manual key.
53
+ * @param {number} index Index that is used if a manual key is not provided.
54
+ * @return {string}
55
+ */
56
+ function getComponentKey(component, index) {
57
+ if (component && component.props && component.props.key != null) {
58
+ // Explicit key
59
+ return wrapUserProvidedKey(component.props.key);
60
+ }
61
+ // Implicit key determined by the index in the set
62
+ return index.toString(36);
63
+ }
64
+
65
+ /**
66
+ * Escape a component key so that it is safe to use in a reactid.
67
+ *
68
+ * @param {*} key Component key to be escaped.
69
+ * @return {string} An escaped string.
70
+ */
71
+ function escapeUserProvidedKey(text) {
72
+ return ('' + text).replace(
73
+ userProvidedKeyEscapeRegex,
74
+ userProvidedKeyEscaper
75
+ );
76
+ }
77
+
78
+ /**
79
+ * Wrap a `key` value explicitly provided by the user to distinguish it from
80
+ * implicitly-generated keys generated by a component's index in its parent.
81
+ *
82
+ * @param {string} key Value of a user-provided `key` attribute
83
+ * @return {string}
84
+ */
85
+ function wrapUserProvidedKey(key) {
86
+ return '$' + escapeUserProvidedKey(key);
87
+ }
88
+
89
+ /**
90
+ * @param {?*} children Children tree container.
91
+ * @param {!string} nameSoFar Name of the key path so far.
92
+ * @param {!number} indexSoFar Number of children encountered until this point.
93
+ * @param {!function} callback Callback to invoke with each child found.
94
+ * @param {?*} traverseContext Used to pass information throughout the traversal
95
+ * process.
96
+ * @return {!number} The number of children in this subtree.
97
+ */
98
+ var traverseAllChildrenImpl =
99
+ function(children, nameSoFar, indexSoFar, callback, traverseContext) {
100
+ var subtreeCount = 0; // Count of children found in the current subtree.
101
+ if (Array.isArray(children)) {
102
+ for (var i = 0; i < children.length; i++) {
103
+ var child = children[i];
104
+ var nextName = (
105
+ nameSoFar +
106
+ (nameSoFar ? SUBSEPARATOR : SEPARATOR) +
107
+ getComponentKey(child, i)
108
+ );
109
+ var nextIndex = indexSoFar + subtreeCount;
110
+ subtreeCount += traverseAllChildrenImpl(
111
+ child,
112
+ nextName,
113
+ nextIndex,
114
+ callback,
115
+ traverseContext
116
+ );
117
+ }
118
+ } else {
119
+ var type = typeof children;
120
+ var isOnlyChild = nameSoFar === '';
121
+ // If it's the only child, treat the name as if it was wrapped in an array
122
+ // so that it's consistent if the number of children grows
123
+ var storageName =
124
+ isOnlyChild ? SEPARATOR + getComponentKey(children, 0) : nameSoFar;
125
+ if (children == null || type === 'boolean') {
126
+ // All of the above are perceived as null.
127
+ callback(traverseContext, null, storageName, indexSoFar);
128
+ subtreeCount = 1;
129
+ } else if (children.type && children.type.prototype &&
130
+ children.type.prototype.mountComponentIntoNode) {
131
+ callback(traverseContext, children, storageName, indexSoFar);
132
+ subtreeCount = 1;
133
+ } else {
134
+ if (type === 'object') {
135
+ ("production" !== process.env.NODE_ENV ? invariant(
136
+ !children || children.nodeType !== 1,
137
+ 'traverseAllChildren(...): Encountered an invalid child; DOM ' +
138
+ 'elements are not valid children of React components.'
139
+ ) : invariant(!children || children.nodeType !== 1));
140
+ for (var key in children) {
141
+ if (children.hasOwnProperty(key)) {
142
+ subtreeCount += traverseAllChildrenImpl(
143
+ children[key],
144
+ (
145
+ nameSoFar + (nameSoFar ? SUBSEPARATOR : SEPARATOR) +
146
+ wrapUserProvidedKey(key) + SUBSEPARATOR +
147
+ getComponentKey(children[key], 0)
148
+ ),
149
+ indexSoFar + subtreeCount,
150
+ callback,
151
+ traverseContext
152
+ );
153
+ }
154
+ }
155
+ } else if (type === 'string') {
156
+ var normalizedText = new ReactTextComponent(children);
157
+ callback(traverseContext, normalizedText, storageName, indexSoFar);
158
+ subtreeCount += 1;
159
+ } else if (type === 'number') {
160
+ var normalizedNumber = new ReactTextComponent('' + children);
161
+ callback(traverseContext, normalizedNumber, storageName, indexSoFar);
162
+ subtreeCount += 1;
163
+ }
164
+ }
165
+ }
166
+ return subtreeCount;
167
+ };
168
+
169
+ /**
170
+ * Traverses children that are typically specified as `props.children`, but
171
+ * might also be specified through attributes:
172
+ *
173
+ * - `traverseAllChildren(this.props.children, ...)`
174
+ * - `traverseAllChildren(this.props.leftPanelChildren, ...)`
175
+ *
176
+ * The `traverseContext` is an optional argument that is passed through the
177
+ * entire traversal. It can be used to store accumulations or anything else that
178
+ * the callback might find relevant.
179
+ *
180
+ * @param {?*} children Children tree object.
181
+ * @param {!function} callback To invoke upon traversing each child.
182
+ * @param {?*} traverseContext Context for traversal.
183
+ */
184
+ function traverseAllChildren(children, callback, traverseContext) {
185
+ if (children !== null && children !== undefined) {
186
+ traverseAllChildrenImpl(children, '', 0, callback, traverseContext);
187
+ }
188
+ }
189
+
190
+ module.exports = traverseAllChildren;