react 0.6.2 → 0.8.0

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 (204) hide show
  1. package/README.md +15 -217
  2. package/ReactJSErrors.js +40 -0
  3. package/addons.js +4 -0
  4. package/lib/$.js +46 -0
  5. package/lib/CSSCore.js +114 -0
  6. package/lib/CSSProperty.js +90 -0
  7. package/lib/CSSPropertyOperations.js +97 -0
  8. package/lib/CallbackRegistry.js +91 -0
  9. package/lib/ChangeEventPlugin.js +365 -0
  10. package/lib/CompositionEventPlugin.js +212 -0
  11. package/lib/DOMChildrenOperations.js +135 -0
  12. package/lib/DOMProperty.js +266 -0
  13. package/lib/DOMPropertyOperations.js +168 -0
  14. package/lib/Danger.js +186 -0
  15. package/lib/DefaultDOMPropertyConfig.js +187 -0
  16. package/lib/DefaultEventPluginOrder.js +44 -0
  17. package/lib/EnterLeaveEventPlugin.js +112 -0
  18. package/lib/EventConstants.js +73 -0
  19. package/lib/EventListener.js +61 -0
  20. package/lib/EventPluginHub.js +190 -0
  21. package/lib/EventPluginRegistry.js +237 -0
  22. package/lib/EventPluginUtils.js +185 -0
  23. package/lib/EventPropagators.js +179 -0
  24. package/lib/ExecutionEnvironment.js +41 -0
  25. package/lib/LinkedStateMixin.js +46 -0
  26. package/lib/LinkedValueMixin.js +68 -0
  27. package/lib/MobileSafariClickEventPlugin.js +63 -0
  28. package/lib/PooledClass.js +113 -0
  29. package/lib/React.js +71 -0
  30. package/lib/ReactChildren.js +132 -0
  31. package/lib/ReactComponent.js +515 -0
  32. package/lib/ReactComponentBrowserEnvironment.js +140 -0
  33. package/lib/ReactComponentEnvironment.js +24 -0
  34. package/lib/ReactCompositeComponent.js +1020 -0
  35. package/lib/ReactCurrentOwner.js +39 -0
  36. package/lib/ReactDOM.js +194 -0
  37. package/lib/ReactDOMButton.js +64 -0
  38. package/lib/ReactDOMComponent.js +374 -0
  39. package/lib/ReactDOMForm.js +52 -0
  40. package/lib/ReactDOMIDOperations.js +173 -0
  41. package/lib/ReactDOMInput.js +169 -0
  42. package/lib/ReactDOMOption.js +50 -0
  43. package/lib/ReactDOMSelect.js +160 -0
  44. package/lib/ReactDOMSelection.js +189 -0
  45. package/lib/ReactDOMTextarea.js +136 -0
  46. package/lib/ReactDefaultBatchingStrategy.js +75 -0
  47. package/lib/ReactDefaultInjection.js +91 -0
  48. package/lib/ReactDefaultPerf.js +407 -0
  49. package/lib/ReactErrorUtils.js +46 -0
  50. package/lib/ReactEventEmitter.js +341 -0
  51. package/lib/ReactEventEmitterMixin.js +89 -0
  52. package/lib/ReactEventTopLevelCallback.js +89 -0
  53. package/lib/ReactInputSelection.js +140 -0
  54. package/lib/ReactInstanceHandles.js +322 -0
  55. package/lib/ReactLink.js +54 -0
  56. package/lib/ReactMarkupChecksum.js +53 -0
  57. package/lib/ReactMount.js +617 -0
  58. package/lib/ReactMountReady.js +95 -0
  59. package/lib/ReactMultiChild.js +441 -0
  60. package/lib/ReactMultiChildUpdateTypes.js +36 -0
  61. package/lib/ReactOwner.js +146 -0
  62. package/lib/ReactPerf.js +88 -0
  63. package/lib/ReactPropTransferer.js +128 -0
  64. package/lib/ReactPropTypes.js +158 -0
  65. package/lib/ReactReconcileTransaction.js +161 -0
  66. package/lib/ReactServerRendering.js +62 -0
  67. package/lib/ReactStateSetters.js +111 -0
  68. package/lib/ReactTextComponent.js +94 -0
  69. package/lib/ReactTransitionEvents.js +97 -0
  70. package/lib/ReactTransitionGroup.js +112 -0
  71. package/lib/ReactTransitionKeySet.js +111 -0
  72. package/lib/ReactTransitionableChild.js +152 -0
  73. package/lib/ReactUpdates.js +145 -0
  74. package/lib/ReactWithAddons.js +41 -0
  75. package/lib/SelectEventPlugin.js +217 -0
  76. package/lib/SimpleEventPlugin.js +365 -0
  77. package/lib/SyntheticClipboardEvent.js +45 -0
  78. package/lib/SyntheticCompositionEvent.js +51 -0
  79. package/lib/SyntheticEvent.js +163 -0
  80. package/lib/SyntheticFocusEvent.js +44 -0
  81. package/lib/SyntheticKeyboardEvent.js +56 -0
  82. package/lib/SyntheticMouseEvent.js +85 -0
  83. package/lib/SyntheticTouchEvent.js +50 -0
  84. package/lib/SyntheticUIEvent.js +45 -0
  85. package/lib/SyntheticWheelEvent.js +63 -0
  86. package/lib/Transaction.js +251 -0
  87. package/lib/ViewportMetrics.js +37 -0
  88. package/lib/accumulate.js +54 -0
  89. package/lib/adler32.js +39 -0
  90. package/lib/containsNode.js +49 -0
  91. package/lib/copyProperties.js +54 -0
  92. package/lib/createArrayFrom.js +94 -0
  93. package/lib/createNodesFromMarkup.js +93 -0
  94. package/lib/createObjectFrom.js +61 -0
  95. package/lib/cx.js +44 -0
  96. package/lib/dangerousStyleValue.js +57 -0
  97. package/lib/emptyFunction.js +43 -0
  98. package/lib/escapeTextForBrowser.js +47 -0
  99. package/lib/ex.js +49 -0
  100. package/lib/filterAttributes.js +45 -0
  101. package/lib/flattenChildren.js +54 -0
  102. package/lib/forEachAccumulated.js +36 -0
  103. package/lib/ge.js +76 -0
  104. package/lib/getActiveElement.js +33 -0
  105. package/lib/getEventTarget.js +36 -0
  106. package/lib/getMarkupWrap.js +108 -0
  107. package/lib/getNodeForCharacterOffset.js +80 -0
  108. package/lib/getReactRootElementInContainer.js +40 -0
  109. package/lib/getTextContentAccessor.js +40 -0
  110. package/lib/getUnboundedScrollPosition.js +45 -0
  111. package/lib/hyphenate.js +35 -0
  112. package/lib/invariant.js +54 -0
  113. package/lib/isEventSupported.js +74 -0
  114. package/lib/isNode.js +33 -0
  115. package/lib/isTextInputElement.js +49 -0
  116. package/lib/isTextNode.js +30 -0
  117. package/lib/joinClasses.js +44 -0
  118. package/lib/keyMirror.js +58 -0
  119. package/lib/keyOf.js +41 -0
  120. package/lib/memoizeStringOnly.js +39 -0
  121. package/lib/merge.js +37 -0
  122. package/lib/mergeHelpers.js +137 -0
  123. package/lib/mergeInto.js +45 -0
  124. package/lib/mixInto.js +34 -0
  125. package/lib/mutateHTMLNodeWithMarkup.js +100 -0
  126. package/lib/objMap.js +47 -0
  127. package/lib/objMapKeyVal.js +47 -0
  128. package/lib/performanceNow.js +42 -0
  129. package/lib/shallowEqual.js +49 -0
  130. package/lib/traverseAllChildren.js +127 -0
  131. package/package.json +33 -21
  132. package/react.js +4 -0
  133. package/.npmignore +0 -7
  134. package/.travis.yml +0 -5
  135. package/Jakefile.js +0 -39
  136. package/LICENSE +0 -19
  137. package/browser-test/dist.html +0 -89
  138. package/browser-test/index.html +0 -85
  139. package/browser-test/min.html +0 -89
  140. package/dist/react.js +0 -3094
  141. package/dist/react.min.js +0 -22
  142. package/doc/advanced.md +0 -166
  143. package/doc/color-def.graffle +0 -938
  144. package/doc/color-def.png +0 -0
  145. package/doc/simple.dot +0 -25
  146. package/doc/simple.png +0 -0
  147. package/examples/longer-example.js +0 -41
  148. package/examples/simple.js +0 -45
  149. package/examples/using-ast-directly.js +0 -30
  150. package/examples/using-events1.js +0 -79
  151. package/examples/using-log-events.js +0 -43
  152. package/lib/base-task.js +0 -123
  153. package/lib/cb-task.js +0 -84
  154. package/lib/core.js +0 -138
  155. package/lib/dsl.js +0 -138
  156. package/lib/error.js +0 -55
  157. package/lib/event-collector.js +0 -81
  158. package/lib/event-manager.js +0 -85
  159. package/lib/eventemitter.js +0 -20
  160. package/lib/finalcb-first-task.js +0 -68
  161. package/lib/finalcb-task.js +0 -65
  162. package/lib/id.js +0 -22
  163. package/lib/input-parser.js +0 -56
  164. package/lib/log-events.js +0 -92
  165. package/lib/parse.js +0 -41
  166. package/lib/promise-resolve.js +0 -50
  167. package/lib/promise-task.js +0 -93
  168. package/lib/react.js +0 -59
  169. package/lib/ret-task.js +0 -71
  170. package/lib/sprintf.js +0 -18
  171. package/lib/status.js +0 -14
  172. package/lib/task.js +0 -251
  173. package/lib/track-tasks.js +0 -74
  174. package/lib/validate.js +0 -159
  175. package/lib/vcon.js +0 -90
  176. package/lib/when-task.js +0 -85
  177. package/src/dist.build.requirejs +0 -20
  178. package/test/ast.mocha.js +0 -136
  179. package/test/cb-task.mocha.js +0 -220
  180. package/test/core-deferred.mocha.js +0 -143
  181. package/test/core-when.mocha.js +0 -96
  182. package/test/core.mocha.js +0 -589
  183. package/test/dsl.mocha.js +0 -350
  184. package/test/event-manager.mocha.js +0 -119
  185. package/test/exec-options.mocha.js +0 -48
  186. package/test/finalcb-task.mocha.js +0 -58
  187. package/test/input-parser.mocha.js +0 -86
  188. package/test/mocha.opts +0 -2
  189. package/test/module-use.mocha.js +0 -147
  190. package/test/promise-auto-resolve.mocha.js +0 -68
  191. package/test/ret-task.mocha.js +0 -220
  192. package/test/task.mocha.js +0 -42
  193. package/test/validate-cb-task.mocha.js +0 -100
  194. package/test/validate-ret-task.mocha.js +0 -110
  195. package/test/validate.mocha.js +0 -324
  196. package/test/vcon.mocha.js +0 -193
  197. package/vendor/chai/chai.js +0 -2038
  198. package/vendor/jquery/jquery-1.7.1.js +0 -9266
  199. package/vendor/jquery/jquery-1.7.1.min.js +0 -4
  200. package/vendor/mocha/mocha.css +0 -135
  201. package/vendor/mocha/mocha.js +0 -3589
  202. package/vendor/node/util.js +0 -531
  203. package/vendor/requirejs/require.js +0 -2053
  204. package/vendor/requirejs/require.min.js +0 -33
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Copyright 2013 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 mergeInto
17
+ * @typechecks static-only
18
+ */
19
+
20
+ "use strict";
21
+
22
+ var mergeHelpers = require("./mergeHelpers");
23
+
24
+ var checkMergeObjectArg = mergeHelpers.checkMergeObjectArg;
25
+
26
+ /**
27
+ * Shallow merges two structures by mutating the first parameter.
28
+ *
29
+ * @param {object} one Object to be merged into.
30
+ * @param {?object} two Optional object with properties to merge from.
31
+ */
32
+ function mergeInto(one, two) {
33
+ checkMergeObjectArg(one);
34
+ if (two != null) {
35
+ checkMergeObjectArg(two);
36
+ for (var key in two) {
37
+ if (!two.hasOwnProperty(key)) {
38
+ continue;
39
+ }
40
+ one[key] = two[key];
41
+ }
42
+ }
43
+ }
44
+
45
+ module.exports = mergeInto;
package/lib/mixInto.js ADDED
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Copyright 2013 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 mixInto
17
+ */
18
+
19
+ "use strict";
20
+
21
+ /**
22
+ * Simply copies properties to the prototype.
23
+ */
24
+ var mixInto = function(constructor, methodBag) {
25
+ var methodName;
26
+ for (methodName in methodBag) {
27
+ if (!methodBag.hasOwnProperty(methodName)) {
28
+ continue;
29
+ }
30
+ constructor.prototype[methodName] = methodBag[methodName];
31
+ }
32
+ };
33
+
34
+ module.exports = mixInto;
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Copyright 2013 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 mutateHTMLNodeWithMarkup
17
+ * @typechecks static-only
18
+ */
19
+
20
+ /*jslint evil: true */
21
+
22
+ 'use strict';
23
+
24
+ var createNodesFromMarkup = require("./createNodesFromMarkup");
25
+ var filterAttributes = require("./filterAttributes");
26
+ var invariant = require("./invariant");
27
+
28
+ /**
29
+ * You can't set the innerHTML of a document. Unless you have
30
+ * this function.
31
+ *
32
+ * @param {DOMElement} node with tagName == 'html'
33
+ * @param {string} markup markup string including <html>.
34
+ */
35
+ function mutateHTMLNodeWithMarkup(node, markup) {
36
+ ("production" !== process.env.NODE_ENV ? invariant(
37
+ node.tagName.toLowerCase() === 'html',
38
+ 'mutateHTMLNodeWithMarkup(): node must have tagName of "html", got %s',
39
+ node.tagName
40
+ ) : invariant(node.tagName.toLowerCase() === 'html'));
41
+
42
+ markup = markup.trim();
43
+ ("production" !== process.env.NODE_ENV ? invariant(
44
+ markup.toLowerCase().indexOf('<html') === 0,
45
+ 'mutateHTMLNodeWithMarkup(): markup must start with <html'
46
+ ) : invariant(markup.toLowerCase().indexOf('<html') === 0));
47
+
48
+ // First let's extract the various pieces of markup.
49
+ var htmlOpenTagEnd = markup.indexOf('>') + 1;
50
+ var htmlCloseTagStart = markup.lastIndexOf('<');
51
+ var htmlOpenTag = markup.substring(0, htmlOpenTagEnd);
52
+ var innerHTML = markup.substring(htmlOpenTagEnd, htmlCloseTagStart);
53
+
54
+ // Now for the fun stuff. Pass through both sets of attributes and
55
+ // bring them up-to-date. We get the new set by creating a markup
56
+ // fragment.
57
+ var shouldExtractAttributes = htmlOpenTag.indexOf(' ') > -1;
58
+ var attributeHolder = null;
59
+
60
+ if (shouldExtractAttributes) {
61
+ // We extract the attributes by creating a <span> and evaluating
62
+ // the node.
63
+ attributeHolder = createNodesFromMarkup(
64
+ htmlOpenTag.replace('html ', 'span ') + '</span>'
65
+ )[0];
66
+
67
+ // Add all attributes present in attributeHolder
68
+ var attributesToSet = filterAttributes(
69
+ attributeHolder,
70
+ function(attr) {
71
+ return node.getAttributeNS(attr.namespaceURI, attr.name) !== attr.value;
72
+ }
73
+ );
74
+ attributesToSet.forEach(function(attr) {
75
+ node.setAttributeNS(attr.namespaceURI, attr.name, attr.value);
76
+ });
77
+ }
78
+
79
+ // Remove all attributes not present in attributeHolder
80
+ var attributesToRemove = filterAttributes(
81
+ node,
82
+ function(attr) {
83
+ // Remove all attributes if attributeHolder is null or if it does not have
84
+ // the desired attribute.
85
+ return !(
86
+ attributeHolder &&
87
+ attributeHolder.hasAttributeNS(attr.namespaceURI, attr.name)
88
+ );
89
+ }
90
+ );
91
+ attributesToRemove.forEach(function(attr) {
92
+ node.removeAttributeNS(attr.namespaceURI, attr.name);
93
+ });
94
+
95
+ // Finally, set the inner HTML. No tricks needed. Do this last to
96
+ // minimize likelihood of triggering reflows.
97
+ node.innerHTML = innerHTML;
98
+ }
99
+
100
+ module.exports = mutateHTMLNodeWithMarkup;
package/lib/objMap.js ADDED
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Copyright 2013 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 objMap
17
+ */
18
+
19
+ "use strict";
20
+
21
+ /**
22
+ * For each key/value pair, invokes callback func and constructs a resulting
23
+ * object which contains, for every key in obj, values that are the result of
24
+ * of invoking the function:
25
+ *
26
+ * func(value, key, iteration)
27
+ *
28
+ * @param {?object} obj Object to map keys over
29
+ * @param {function} func Invoked for each key/val pair.
30
+ * @param {?*} context
31
+ * @return {?object} Result of mapping or null if obj is falsey
32
+ */
33
+ function objMap(obj, func, context) {
34
+ if (!obj) {
35
+ return null;
36
+ }
37
+ var i = 0;
38
+ var ret = {};
39
+ for (var key in obj) {
40
+ if (obj.hasOwnProperty(key)) {
41
+ ret[key] = func.call(context, obj[key], key, i++);
42
+ }
43
+ }
44
+ return ret;
45
+ }
46
+
47
+ module.exports = objMap;
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Copyright 2013 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 objMapKeyVal
17
+ */
18
+
19
+ "use strict";
20
+
21
+ /**
22
+ * Behaves the same as `objMap` but invokes func with the key first, and value
23
+ * second. Use `objMap` unless you need this special case.
24
+ * Invokes func as:
25
+ *
26
+ * func(key, value, iteration)
27
+ *
28
+ * @param {?object} obj Object to map keys over
29
+ * @param {!function} func Invoked for each key/val pair.
30
+ * @param {?*} context
31
+ * @return {?object} Result of mapping or null if obj is falsey
32
+ */
33
+ function objMapKeyVal(obj, func, context) {
34
+ if (!obj) {
35
+ return null;
36
+ }
37
+ var i = 0;
38
+ var ret = {};
39
+ for (var key in obj) {
40
+ if (obj.hasOwnProperty(key)) {
41
+ ret[key] = func.call(context, key, obj[key], i++);
42
+ }
43
+ }
44
+ return ret;
45
+ }
46
+
47
+ module.exports = objMapKeyVal;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Copyright 2013 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 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,127 @@
1
+ /**
2
+ * Copyright 2013 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 ReactComponent = require("./ReactComponent");
22
+ var ReactTextComponent = require("./ReactTextComponent");
23
+
24
+ var invariant = require("./invariant");
25
+
26
+ /**
27
+ * TODO: Test that:
28
+ * 1. `mapChildren` transforms strings and numbers into `ReactTextComponent`.
29
+ * 2. it('should fail when supplied duplicate key', function() {
30
+ * 3. That a single child and an array with one item have the same key pattern.
31
+ * });
32
+ */
33
+
34
+ /**
35
+ * @param {?*} children Children tree container.
36
+ * @param {!string} nameSoFar Name of the key path so far.
37
+ * @param {!number} indexSoFar Number of children encountered until this point.
38
+ * @param {!function} callback Callback to invoke with each child found.
39
+ * @param {?*} traverseContext Used to pass information throughout the traversal
40
+ * process.
41
+ * @return {!number} The number of children in this subtree.
42
+ */
43
+ var traverseAllChildrenImpl =
44
+ function(children, nameSoFar, indexSoFar, callback, traverseContext) {
45
+ var subtreeCount = 0; // Count of children found in the current subtree.
46
+ if (Array.isArray(children)) {
47
+ for (var i = 0; i < children.length; i++) {
48
+ var child = children[i];
49
+ var nextName = nameSoFar + ReactComponent.getKey(child, i);
50
+ var nextIndex = indexSoFar + subtreeCount;
51
+ subtreeCount += traverseAllChildrenImpl(
52
+ child,
53
+ nextName,
54
+ nextIndex,
55
+ callback,
56
+ traverseContext
57
+ );
58
+ }
59
+ } else {
60
+ var type = typeof children;
61
+ var isOnlyChild = nameSoFar === '';
62
+ // If it's the only child, treat the name as if it was wrapped in an array
63
+ // so that it's consistent if the number of children grows
64
+ var storageName = isOnlyChild ?
65
+ ReactComponent.getKey(children, 0):
66
+ nameSoFar;
67
+ if (children === null || children === undefined || type === 'boolean') {
68
+ // All of the above are perceived as null.
69
+ callback(traverseContext, null, storageName, indexSoFar);
70
+ subtreeCount = 1;
71
+ } else if (children.mountComponentIntoNode) {
72
+ callback(traverseContext, children, storageName, indexSoFar);
73
+ subtreeCount = 1;
74
+ } else {
75
+ if (type === 'object') {
76
+ ("production" !== process.env.NODE_ENV ? invariant(
77
+ !children || children.nodeType !== 1,
78
+ 'traverseAllChildren(...): Encountered an invalid child; DOM ' +
79
+ 'elements are not valid children of React components.'
80
+ ) : invariant(!children || children.nodeType !== 1));
81
+ for (var key in children) {
82
+ if (children.hasOwnProperty(key)) {
83
+ subtreeCount += traverseAllChildrenImpl(
84
+ children[key],
85
+ nameSoFar + '{' + key + '}',
86
+ indexSoFar + subtreeCount,
87
+ callback,
88
+ traverseContext
89
+ );
90
+ }
91
+ }
92
+ } else if (type === 'string') {
93
+ var normalizedText = new ReactTextComponent(children);
94
+ callback(traverseContext, normalizedText, storageName, indexSoFar);
95
+ subtreeCount += 1;
96
+ } else if (type === 'number') {
97
+ var normalizedNumber = new ReactTextComponent('' + children);
98
+ callback(traverseContext, normalizedNumber, storageName, indexSoFar);
99
+ subtreeCount += 1;
100
+ }
101
+ }
102
+ }
103
+ return subtreeCount;
104
+ };
105
+
106
+ /**
107
+ * Traverses children that are typically specified as `props.children`, but
108
+ * might also be specified through attributes:
109
+ *
110
+ * - `traverseAllChildren(this.props.children, ...)`
111
+ * - `traverseAllChildren(this.props.leftPanelChildren, ...)`
112
+ *
113
+ * The `traverseContext` is an optional argument that is passed through the
114
+ * entire traversal. It can be used to store accumulations or anything else that
115
+ * the callback might find relevant.
116
+ *
117
+ * @param {?*} children Children tree object.
118
+ * @param {!function} callback To invoke upon traversing each child.
119
+ * @param {?*} traverseContext Context for traversal.
120
+ */
121
+ function traverseAllChildren(children, callback, traverseContext) {
122
+ if (children !== null && children !== undefined) {
123
+ traverseAllChildrenImpl(children, '', 0, callback, traverseContext);
124
+ }
125
+ }
126
+
127
+ module.exports = traverseAllChildren;