react 0.14.0-alpha2 → 0.14.0-beta3

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 (196) hide show
  1. package/README.md +5 -2
  2. package/addons.js +6 -3
  3. package/dist/JSXTransformer.js +634 -274
  4. package/dist/react-with-addons.js +5350 -4954
  5. package/dist/react-with-addons.min.js +6 -6
  6. package/dist/react.js +4777 -4408
  7. package/dist/react.min.js +6 -5
  8. package/lib/{AutoFocusMixin.js → AutoFocusUtils.js} +15 -5
  9. package/lib/BeforeInputEventPlugin.js +13 -13
  10. package/lib/CSSProperty.js +3 -0
  11. package/lib/CSSPropertyOperations.js +13 -13
  12. package/lib/CallbackQueue.js +4 -4
  13. package/lib/ChangeEventPlugin.js +16 -14
  14. package/lib/DOMChildrenOperations.js +10 -6
  15. package/lib/DOMProperty.js +82 -117
  16. package/lib/DOMPropertyOperations.js +78 -33
  17. package/lib/Danger.js +14 -14
  18. package/lib/DefaultEventPluginOrder.js +2 -2
  19. package/lib/EnterLeaveEventPlugin.js +8 -8
  20. package/lib/EventConstants.js +23 -1
  21. package/lib/EventPluginHub.js +13 -13
  22. package/lib/EventPluginRegistry.js +8 -8
  23. package/lib/EventPluginUtils.js +17 -17
  24. package/lib/EventPropagators.js +7 -7
  25. package/lib/FallbackCompositionState.js +3 -3
  26. package/lib/HTMLDOMPropertyConfig.js +13 -3
  27. package/lib/LinkedStateMixin.js +2 -2
  28. package/lib/LinkedValueUtils.js +50 -38
  29. package/lib/MetaMatchers.js +118 -0
  30. package/lib/OrderedMap.js +453 -0
  31. package/lib/PooledClass.js +14 -2
  32. package/lib/React.js +6 -6
  33. package/lib/ReactBrowserComponentMixin.js +4 -4
  34. package/lib/ReactBrowserEventEmitter.js +30 -7
  35. package/lib/ReactCSSTransitionGroup.js +16 -5
  36. package/lib/ReactCSSTransitionGroupChild.js +20 -11
  37. package/lib/ReactChildReconciler.js +25 -18
  38. package/lib/ReactChildren.js +9 -9
  39. package/lib/ReactClass.js +65 -83
  40. package/lib/ReactComponent.js +22 -17
  41. package/lib/ReactComponentBrowserEnvironment.js +2 -2
  42. package/lib/ReactComponentEnvironment.js +2 -2
  43. package/lib/ReactComponentWithPureRenderMixin.js +3 -3
  44. package/lib/ReactCompositeComponent.js +80 -111
  45. package/lib/ReactDOM.js +72 -158
  46. package/lib/ReactDOMButton.js +15 -26
  47. package/lib/ReactDOMComponent.js +378 -56
  48. package/lib/ReactDOMFactories.js +177 -0
  49. package/lib/ReactDOMIDOperations.js +23 -23
  50. package/lib/ReactDOMInput.js +83 -99
  51. package/lib/ReactDOMOption.js +25 -45
  52. package/lib/ReactDOMSelect.js +88 -98
  53. package/lib/ReactDOMSelection.js +3 -3
  54. package/lib/ReactDOMServer.js +2 -2
  55. package/lib/ReactDOMTextComponent.js +11 -11
  56. package/lib/ReactDOMTextarea.js +48 -61
  57. package/lib/ReactDefaultBatchingStrategy.js +4 -4
  58. package/lib/ReactDefaultInjection.js +24 -71
  59. package/lib/ReactDefaultPerf.js +7 -7
  60. package/lib/ReactDefaultPerfAnalysis.js +6 -9
  61. package/lib/ReactElement.js +22 -83
  62. package/lib/ReactElementValidator.js +48 -117
  63. package/lib/ReactEmptyComponent.js +4 -4
  64. package/lib/ReactErrorUtils.js +1 -1
  65. package/lib/ReactEventEmitterMixin.js +3 -4
  66. package/lib/ReactEventListener.js +57 -12
  67. package/lib/ReactFragment.js +22 -17
  68. package/lib/ReactInjection.js +11 -11
  69. package/lib/ReactInputSelection.js +8 -7
  70. package/lib/ReactInstanceHandles.js +12 -12
  71. package/lib/ReactIsomorphic.js +11 -11
  72. package/lib/ReactLink.js +1 -1
  73. package/lib/ReactMarkupChecksum.js +6 -2
  74. package/lib/ReactMount.js +88 -88
  75. package/lib/ReactMultiChild.js +83 -22
  76. package/lib/ReactMultiChildUpdateTypes.js +2 -1
  77. package/lib/ReactNativeComponent.js +3 -8
  78. package/lib/ReactNoopUpdateQueue.js +118 -0
  79. package/lib/ReactOwner.js +3 -3
  80. package/lib/ReactPerf.js +2 -2
  81. package/lib/ReactPropTransferer.js +3 -3
  82. package/lib/ReactPropTypeLocationNames.js +1 -1
  83. package/lib/ReactPropTypeLocations.js +1 -1
  84. package/lib/ReactPropTypes.js +49 -11
  85. package/lib/ReactReconcileTransaction.js +8 -8
  86. package/lib/ReactReconciler.js +18 -20
  87. package/lib/ReactRef.js +1 -1
  88. package/lib/ReactServerBatchingStrategy.js +23 -0
  89. package/lib/ReactServerRendering.js +22 -9
  90. package/lib/ReactServerRenderingTransaction.js +7 -7
  91. package/lib/ReactTestUtils.js +80 -58
  92. package/lib/ReactTransitionChildMapping.js +2 -2
  93. package/lib/ReactTransitionEvents.js +1 -1
  94. package/lib/ReactTransitionGroup.js +5 -6
  95. package/lib/ReactUpdateQueue.js +61 -36
  96. package/lib/ReactUpdates.js +14 -17
  97. package/lib/ReactWithAddons.js +14 -16
  98. package/lib/ResponderEventPlugin.js +514 -0
  99. package/lib/ResponderSyntheticEvent.js +40 -0
  100. package/lib/ResponderTouchHistoryStore.js +180 -0
  101. package/lib/SVGDOMPropertyConfig.js +1 -1
  102. package/lib/SelectEventPlugin.js +14 -15
  103. package/lib/SimpleEventPlugin.js +205 -29
  104. package/lib/SyntheticClipboardEvent.js +3 -3
  105. package/lib/SyntheticCompositionEvent.js +3 -3
  106. package/lib/SyntheticDragEvent.js +3 -3
  107. package/lib/SyntheticEvent.js +9 -8
  108. package/lib/SyntheticFocusEvent.js +3 -3
  109. package/lib/SyntheticInputEvent.js +3 -3
  110. package/lib/SyntheticKeyboardEvent.js +6 -6
  111. package/lib/SyntheticMouseEvent.js +5 -5
  112. package/lib/SyntheticTouchEvent.js +4 -4
  113. package/lib/SyntheticUIEvent.js +4 -4
  114. package/lib/SyntheticWheelEvent.js +3 -3
  115. package/lib/TapEventPlugin.js +119 -0
  116. package/lib/Transaction.js +16 -10
  117. package/lib/accumulate.js +44 -0
  118. package/lib/accumulateInto.js +2 -2
  119. package/lib/adler32.js +19 -7
  120. package/lib/cloneWithProps.js +12 -7
  121. package/lib/createHierarchyRenderer.js +85 -0
  122. package/lib/dangerousStyleValue.js +1 -1
  123. package/lib/deprecated.js +47 -0
  124. package/lib/findDOMNode.js +11 -12
  125. package/lib/flattenChildren.js +4 -4
  126. package/lib/forEachAccumulated.js +1 -1
  127. package/lib/getEventCharCode.js +1 -1
  128. package/lib/getEventKey.js +1 -1
  129. package/lib/getEventModifierState.js +0 -1
  130. package/lib/getTestDocument.js +28 -0
  131. package/lib/getTextContentAccessor.js +1 -1
  132. package/lib/instantiateReactComponent.js +24 -20
  133. package/lib/isEventSupported.js +1 -1
  134. package/lib/isTextInputElement.js +2 -1
  135. package/lib/joinClasses.js +1 -1
  136. package/lib/onlyChild.js +3 -3
  137. package/lib/quoteAttributeValueForBrowser.js +1 -1
  138. package/lib/reactComponentExpect.js +210 -0
  139. package/lib/renderSubtreeIntoContainer.js +1 -1
  140. package/lib/setInnerHTML.js +2 -2
  141. package/lib/setTextContent.js +3 -3
  142. package/lib/shallowCompare.js +1 -1
  143. package/lib/sliceChildren.js +51 -0
  144. package/lib/traverseAllChildren.js +15 -14
  145. package/lib/update.js +13 -13
  146. package/lib/validateDOMNesting.js +14 -6
  147. package/lib/webcomponents.js +6379 -0
  148. package/package.json +4 -6
  149. package/react.js +53 -1
  150. package/addons/CSSTransitionGroup.js +0 -1
  151. package/addons/LinkedStateMixin.js +0 -1
  152. package/addons/Perf.js +0 -1
  153. package/addons/PureRenderMixin.js +0 -1
  154. package/addons/TestUtils.js +0 -1
  155. package/addons/TransitionGroup.js +0 -1
  156. package/addons/batchedUpdates.js +0 -1
  157. package/addons/cloneWithProps.js +0 -1
  158. package/addons/createFragment.js +0 -1
  159. package/addons/renderSubtreeIntoContainer.js +0 -1
  160. package/addons/shallowCompare.js +0 -1
  161. package/addons/update.js +0 -1
  162. package/lib/CSSCore.js +0 -97
  163. package/lib/EventListener.js +0 -84
  164. package/lib/ExecutionEnvironment.js +0 -38
  165. package/lib/LocalEventTrapMixin.js +0 -46
  166. package/lib/ReactContext.js +0 -32
  167. package/lib/ReactDOMClient.js +0 -85
  168. package/lib/ReactDOMForm.js +0 -47
  169. package/lib/ReactDOMIframe.js +0 -43
  170. package/lib/ReactDOMImg.js +0 -44
  171. package/lib/ReactLifeCycle.js +0 -35
  172. package/lib/camelize.js +0 -32
  173. package/lib/camelizeStyleName.js +0 -40
  174. package/lib/containsNode.js +0 -55
  175. package/lib/createArrayFromMixed.js +0 -85
  176. package/lib/createFullPageComponent.js +0 -51
  177. package/lib/createNodesFromMarkup.js +0 -84
  178. package/lib/emptyFunction.js +0 -38
  179. package/lib/emptyObject.js +0 -20
  180. package/lib/focusNode.js +0 -26
  181. package/lib/getActiveElement.js +0 -29
  182. package/lib/getMarkupWrap.js +0 -115
  183. package/lib/getUnboundedScrollPosition.js +0 -38
  184. package/lib/hyphenate.js +0 -33
  185. package/lib/hyphenateStyleName.js +0 -39
  186. package/lib/invariant.js +0 -49
  187. package/lib/isNode.js +0 -23
  188. package/lib/isTextNode.js +0 -25
  189. package/lib/keyMirror.js +0 -48
  190. package/lib/keyOf.js +0 -35
  191. package/lib/mapObject.js +0 -51
  192. package/lib/performance.js +0 -23
  193. package/lib/performanceNow.js +0 -28
  194. package/lib/shallowEqual.js +0 -48
  195. package/lib/toArray.js +0 -57
  196. package/lib/warning.js +0 -61
@@ -11,7 +11,7 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- var keyMirror = require("./keyMirror");
14
+ var keyMirror = require('fbjs/lib/keyMirror');
15
15
 
16
16
  /**
17
17
  * When a component's children are updated, a series of update configuration
@@ -25,6 +25,7 @@ var ReactMultiChildUpdateTypes = keyMirror({
25
25
  INSERT_MARKUP: null,
26
26
  MOVE_EXISTING: null,
27
27
  REMOVE_NODE: null,
28
+ SET_MARKUP: null,
28
29
  TEXT_CONTENT: null
29
30
  });
30
31
 
@@ -11,8 +11,8 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- var assign = require("./Object.assign");
15
- var invariant = require("./invariant");
14
+ var assign = require('./Object.assign');
15
+ var invariant = require('fbjs/lib/invariant');
16
16
 
17
17
  var autoGenerateWrapperClass = null;
18
18
  var genericComponentClass = null;
@@ -35,11 +35,6 @@ var ReactNativeComponentInjection = {
35
35
  // tag. That particular tag will use this class instead of the generic one.
36
36
  injectComponentClasses: function (componentClasses) {
37
37
  assign(tagToComponentClass, componentClasses);
38
- },
39
- // Temporary hack since we expect DOM refs to behave like composites,
40
- // for this release.
41
- injectAutoWrapper: function (wrapperFactory) {
42
- autoGenerateWrapperClass = wrapperFactory;
43
38
  }
44
39
  };
45
40
 
@@ -68,7 +63,7 @@ function getComponentClassForElement(element) {
68
63
  * @return {function} The internal class constructor function.
69
64
  */
70
65
  function createInternalComponent(element) {
71
- 'production' !== process.env.NODE_ENV ? invariant(genericComponentClass, 'There is no registered component for the tag %s', element.type) : invariant(genericComponentClass);
66
+ !genericComponentClass ? process.env.NODE_ENV !== 'production' ? invariant(false, 'There is no registered component for the tag %s', element.type) : invariant(false) : undefined;
72
67
  return new genericComponentClass(element.type, element.props);
73
68
  }
74
69
 
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Copyright 2015, Facebook, Inc.
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under the BSD-style license found in the
6
+ * LICENSE file in the root directory of this source tree. An additional grant
7
+ * of patent rights can be found in the PATENTS file in the same directory.
8
+ *
9
+ * @providesModule ReactNoopUpdateQueue
10
+ */
11
+
12
+ 'use strict';
13
+
14
+ var warning = require('fbjs/lib/warning');
15
+
16
+ function warnTDZ(publicInstance, callerName) {
17
+ if (process.env.NODE_ENV !== 'production') {
18
+ process.env.NODE_ENV !== 'production' ? warning(false, '%s(...): Can only update a mounted or mounting component. ' + 'This usually means you called %s() on an unmounted component. ' + 'This is a no-op. Please check the code for the %s component.', callerName, callerName, publicInstance.constructor && publicInstance.constructor.displayName || '') : undefined;
19
+ }
20
+ }
21
+
22
+ /**
23
+ * This is the abstract API for an update queue.
24
+ */
25
+ var ReactNoopUpdateQueue = {
26
+
27
+ /**
28
+ * Checks whether or not this composite component is mounted.
29
+ * @param {ReactClass} publicInstance The instance we want to test.
30
+ * @return {boolean} True if mounted, false otherwise.
31
+ * @protected
32
+ * @final
33
+ */
34
+ isMounted: function (publicInstance) {
35
+ return false;
36
+ },
37
+
38
+ /**
39
+ * Enqueue a callback that will be executed after all the pending updates
40
+ * have processed.
41
+ *
42
+ * @param {ReactClass} publicInstance The instance to use as `this` context.
43
+ * @param {?function} callback Called after state is updated.
44
+ * @internal
45
+ */
46
+ enqueueCallback: function (publicInstance, callback) {},
47
+
48
+ /**
49
+ * Forces an update. This should only be invoked when it is known with
50
+ * certainty that we are **not** in a DOM transaction.
51
+ *
52
+ * You may want to call this when you know that some deeper aspect of the
53
+ * component's state has changed but `setState` was not called.
54
+ *
55
+ * This will not invoke `shouldComponentUpdate`, but it will invoke
56
+ * `componentWillUpdate` and `componentDidUpdate`.
57
+ *
58
+ * @param {ReactClass} publicInstance The instance that should rerender.
59
+ * @internal
60
+ */
61
+ enqueueForceUpdate: function (publicInstance) {
62
+ warnTDZ(publicInstance, 'forceUpdate');
63
+ },
64
+
65
+ /**
66
+ * Replaces all of the state. Always use this or `setState` to mutate state.
67
+ * You should treat `this.state` as immutable.
68
+ *
69
+ * There is no guarantee that `this.state` will be immediately updated, so
70
+ * accessing `this.state` after calling this method may return the old value.
71
+ *
72
+ * @param {ReactClass} publicInstance The instance that should rerender.
73
+ * @param {object} completeState Next state.
74
+ * @internal
75
+ */
76
+ enqueueReplaceState: function (publicInstance, completeState) {
77
+ warnTDZ(publicInstance, 'replaceState');
78
+ },
79
+
80
+ /**
81
+ * Sets a subset of the state. This only exists because _pendingState is
82
+ * internal. This provides a merging strategy that is not available to deep
83
+ * properties which is confusing. TODO: Expose pendingState or don't use it
84
+ * during the merge.
85
+ *
86
+ * @param {ReactClass} publicInstance The instance that should rerender.
87
+ * @param {object} partialState Next partial state to be merged with state.
88
+ * @internal
89
+ */
90
+ enqueueSetState: function (publicInstance, partialState) {
91
+ warnTDZ(publicInstance, 'setState');
92
+ },
93
+
94
+ /**
95
+ * Sets a subset of the props.
96
+ *
97
+ * @param {ReactClass} publicInstance The instance that should rerender.
98
+ * @param {object} partialProps Subset of the next props.
99
+ * @internal
100
+ */
101
+ enqueueSetProps: function (publicInstance, partialProps) {
102
+ warnTDZ(publicInstance, 'setProps');
103
+ },
104
+
105
+ /**
106
+ * Replaces all of the props.
107
+ *
108
+ * @param {ReactClass} publicInstance The instance that should rerender.
109
+ * @param {object} props New props.
110
+ * @internal
111
+ */
112
+ enqueueReplaceProps: function (publicInstance, props) {
113
+ warnTDZ(publicInstance, 'replaceProps');
114
+ }
115
+
116
+ };
117
+
118
+ module.exports = ReactNoopUpdateQueue;
package/lib/ReactOwner.js CHANGED
@@ -11,7 +11,7 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- var invariant = require("./invariant");
14
+ var invariant = require('fbjs/lib/invariant');
15
15
 
16
16
  /**
17
17
  * ReactOwners are capable of storing references to owned components.
@@ -64,7 +64,7 @@ var ReactOwner = {
64
64
  * @internal
65
65
  */
66
66
  addComponentAsRefTo: function (component, ref, owner) {
67
- 'production' !== process.env.NODE_ENV ? invariant(ReactOwner.isValidOwner(owner), 'addComponentAsRefTo(...): Only a ReactOwner can have refs. This ' + 'usually means that you\'re trying to add a ref to a component that ' + 'doesn\'t have an owner (that is, was not created inside of another ' + 'component\'s `render` method). Try rendering this component inside of ' + 'a new top-level component which will hold the ref.') : invariant(ReactOwner.isValidOwner(owner));
67
+ !ReactOwner.isValidOwner(owner) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'addComponentAsRefTo(...): Only a ReactOwner can have refs. This ' + 'usually means that you\'re trying to add a ref to a component that ' + 'doesn\'t have an owner (that is, was not created inside of another ' + 'component\'s `render` method). Try rendering this component inside of ' + 'a new top-level component which will hold the ref.') : invariant(false) : undefined;
68
68
  owner.attachRef(ref, component);
69
69
  },
70
70
 
@@ -78,7 +78,7 @@ var ReactOwner = {
78
78
  * @internal
79
79
  */
80
80
  removeComponentAsRefFrom: function (component, ref, owner) {
81
- 'production' !== process.env.NODE_ENV ? invariant(ReactOwner.isValidOwner(owner), 'removeComponentAsRefFrom(...): Only a ReactOwner can have refs. This ' + 'usually means that you\'re trying to remove a ref to a component that ' + 'doesn\'t have an owner (that is, was not created inside of another ' + 'component\'s `render` method). Try rendering this component inside of ' + 'a new top-level component which will hold the ref.') : invariant(ReactOwner.isValidOwner(owner));
81
+ !ReactOwner.isValidOwner(owner) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'removeComponentAsRefFrom(...): Only a ReactOwner can have refs. This ' + 'usually means that you\'re trying to remove a ref from a component that ' + 'doesn\'t have an owner (that is, was not created inside of another ' + 'component\'s `render` method). Try rendering this component inside of ' + 'a new top-level component which will hold the ref.') : invariant(false) : undefined;
82
82
  // Check that `component` is still the current ref because we do not want to
83
83
  // detach the ref if another component stole it.
84
84
  if (owner.getPublicInstance().refs[ref] === component.getPublicInstance()) {
package/lib/ReactPerf.js CHANGED
@@ -35,7 +35,7 @@ var ReactPerf = {
35
35
  * @param {object<string>} methodNames
36
36
  */
37
37
  measureMethods: function (object, objectName, methodNames) {
38
- if ('production' !== process.env.NODE_ENV) {
38
+ if (process.env.NODE_ENV !== 'production') {
39
39
  for (var key in methodNames) {
40
40
  if (!methodNames.hasOwnProperty(key)) {
41
41
  continue;
@@ -54,7 +54,7 @@ var ReactPerf = {
54
54
  * @return {function}
55
55
  */
56
56
  measure: function (objName, fnName, func) {
57
- if ('production' !== process.env.NODE_ENV) {
57
+ if (process.env.NODE_ENV !== 'production') {
58
58
  var measuredFunc = null;
59
59
  var wrapper = function () {
60
60
  if (ReactPerf.enableMeasure) {
@@ -11,9 +11,9 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- var assign = require("./Object.assign");
15
- var emptyFunction = require("./emptyFunction");
16
- var joinClasses = require("./joinClasses");
14
+ var assign = require('./Object.assign');
15
+ var emptyFunction = require('fbjs/lib/emptyFunction');
16
+ var joinClasses = require('./joinClasses');
17
17
 
18
18
  /**
19
19
  * Creates a transfer strategy that will merge prop values using the supplied
@@ -13,7 +13,7 @@
13
13
 
14
14
  var ReactPropTypeLocationNames = {};
15
15
 
16
- if ('production' !== process.env.NODE_ENV) {
16
+ if (process.env.NODE_ENV !== 'production') {
17
17
  ReactPropTypeLocationNames = {
18
18
  prop: 'prop',
19
19
  context: 'context',
@@ -11,7 +11,7 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- var keyMirror = require("./keyMirror");
14
+ var keyMirror = require('fbjs/lib/keyMirror');
15
15
 
16
16
  var ReactPropTypeLocations = keyMirror({
17
17
  prop: null,
@@ -11,11 +11,12 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- var ReactElement = require("./ReactElement");
15
- var ReactFragment = require("./ReactFragment");
16
- var ReactPropTypeLocationNames = require("./ReactPropTypeLocationNames");
14
+ var ReactElement = require('./ReactElement');
15
+ var ReactFragment = require('./ReactFragment');
16
+ var ReactPropTypeLocationNames = require('./ReactPropTypeLocationNames');
17
17
 
18
- var emptyFunction = require("./emptyFunction");
18
+ var emptyFunction = require('fbjs/lib/emptyFunction');
19
+ var getIteratorFn = require('./getIteratorFn');
19
20
 
20
21
  /**
21
22
  * Collection of methods that allow declaration and validation of props that are
@@ -137,7 +138,7 @@ function createArrayOfTypeChecker(typeChecker) {
137
138
  return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));
138
139
  }
139
140
  for (var i = 0; i < propValue.length; i++) {
140
- var error = typeChecker(propValue, i, componentName, location, '' + propFullName + '[' + i + ']');
141
+ var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']');
141
142
  if (error instanceof Error) {
142
143
  return error;
143
144
  }
@@ -171,6 +172,12 @@ function createInstanceTypeChecker(expectedClass) {
171
172
  }
172
173
 
173
174
  function createEnumTypeChecker(expectedValues) {
175
+ if (!Array.isArray(expectedValues)) {
176
+ return createChainableTypeChecker(function () {
177
+ return new Error('Invalid argument supplied to oneOf, expected an instance of array.');
178
+ });
179
+ }
180
+
174
181
  function validate(props, propName, componentName, location, propFullName) {
175
182
  var propValue = props[propName];
176
183
  for (var i = 0; i < expectedValues.length; i++) {
@@ -196,7 +203,7 @@ function createObjectOfTypeChecker(typeChecker) {
196
203
  }
197
204
  for (var key in propValue) {
198
205
  if (propValue.hasOwnProperty(key)) {
199
- var error = typeChecker(propValue, key, componentName, location, '' + propFullName + '.' + key);
206
+ var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key);
200
207
  if (error instanceof Error) {
201
208
  return error;
202
209
  }
@@ -208,6 +215,12 @@ function createObjectOfTypeChecker(typeChecker) {
208
215
  }
209
216
 
210
217
  function createUnionTypeChecker(arrayOfTypeCheckers) {
218
+ if (!Array.isArray(arrayOfTypeCheckers)) {
219
+ return createChainableTypeChecker(function () {
220
+ return new Error('Invalid argument supplied to oneOfType, expected an instance of array.');
221
+ });
222
+ }
223
+
211
224
  function validate(props, propName, componentName, location, propFullName) {
212
225
  for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
213
226
  var checker = arrayOfTypeCheckers[i];
@@ -246,7 +259,7 @@ function createShapeTypeChecker(shapeTypes) {
246
259
  if (!checker) {
247
260
  continue;
248
261
  }
249
- var error = checker(propValue, key, componentName, location, '' + propFullName + '.' + key);
262
+ var error = checker(propValue, key, componentName, location, propFullName + '.' + key);
250
263
  if (error) {
251
264
  return error;
252
265
  }
@@ -271,12 +284,37 @@ function isNode(propValue) {
271
284
  if (propValue === null || ReactElement.isValidElement(propValue)) {
272
285
  return true;
273
286
  }
274
- propValue = ReactFragment.extractIfFragment(propValue);
275
- for (var k in propValue) {
276
- if (!isNode(propValue[k])) {
277
- return false;
287
+
288
+ var iteratorFn = getIteratorFn(propValue);
289
+ if (iteratorFn) {
290
+ var iterator = iteratorFn.call(propValue);
291
+ var step;
292
+ if (iteratorFn !== propValue.entries) {
293
+ while (!(step = iterator.next()).done) {
294
+ if (!isNode(step.value)) {
295
+ return false;
296
+ }
297
+ }
298
+ } else {
299
+ // Iterator will provide entry [k,v] tuples rather than values.
300
+ while (!(step = iterator.next()).done) {
301
+ var entry = step.value;
302
+ if (entry) {
303
+ if (!isNode(entry[1])) {
304
+ return false;
305
+ }
306
+ }
307
+ }
308
+ }
309
+ } else {
310
+ propValue = ReactFragment.extractIfFragment(propValue);
311
+ for (var k in propValue) {
312
+ if (!isNode(propValue[k])) {
313
+ return false;
314
+ }
278
315
  }
279
316
  }
317
+
280
318
  return true;
281
319
  default:
282
320
  return false;
@@ -12,13 +12,13 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- var CallbackQueue = require("./CallbackQueue");
16
- var PooledClass = require("./PooledClass");
17
- var ReactBrowserEventEmitter = require("./ReactBrowserEventEmitter");
18
- var ReactInputSelection = require("./ReactInputSelection");
19
- var Transaction = require("./Transaction");
15
+ var CallbackQueue = require('./CallbackQueue');
16
+ var PooledClass = require('./PooledClass');
17
+ var ReactBrowserEventEmitter = require('./ReactBrowserEventEmitter');
18
+ var ReactInputSelection = require('./ReactInputSelection');
19
+ var Transaction = require('./Transaction');
20
20
 
21
- var assign = require("./Object.assign");
21
+ var assign = require('./Object.assign');
22
22
 
23
23
  /**
24
24
  * Ensures that, when possible, the selection range (currently selected text
@@ -118,7 +118,7 @@ var Mixin = {
118
118
  * @see Transaction
119
119
  * @abstract
120
120
  * @final
121
- * @return {array<object>} List of operation wrap proceedures.
121
+ * @return {array<object>} List of operation wrap procedures.
122
122
  * TODO: convert to array<TransactionWrapper>
123
123
  */
124
124
  getTransactionWrappers: function () {
@@ -134,7 +134,7 @@ var Mixin = {
134
134
 
135
135
  /**
136
136
  * `PooledClass` looks for this, and will invoke this before allowing this
137
- * instance to be resused.
137
+ * instance to be reused.
138
138
  */
139
139
  destructor: function () {
140
140
  CallbackQueue.release(this.reactMountReady);
@@ -11,8 +11,7 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- var ReactRef = require("./ReactRef");
15
- var ReactElementValidator = require("./ReactElementValidator");
14
+ var ReactRef = require('./ReactRef');
16
15
 
17
16
  /**
18
17
  * Helper to call ReactRef.attachRefs with this composite component, split out
@@ -36,10 +35,9 @@ var ReactReconciler = {
36
35
  */
37
36
  mountComponent: function (internalInstance, rootID, transaction, context) {
38
37
  var markup = internalInstance.mountComponent(rootID, transaction, context);
39
- if ('production' !== process.env.NODE_ENV) {
40
- ReactElementValidator.checkAndWarnForMutatedProps(internalInstance._currentElement);
38
+ if (internalInstance._currentElement.ref != null) {
39
+ transaction.getReactMountReady().enqueue(attachRefs, internalInstance);
41
40
  }
42
- transaction.getReactMountReady().enqueue(attachRefs, internalInstance);
43
41
  return markup;
44
42
  },
45
43
 
@@ -65,21 +63,21 @@ var ReactReconciler = {
65
63
  */
66
64
  receiveComponent: function (internalInstance, nextElement, transaction, context) {
67
65
  var prevElement = internalInstance._currentElement;
68
-
69
- if (nextElement === prevElement && nextElement._owner != null) {
70
- // Since elements are immutable after the owner is rendered,
71
- // we can do a cheap identity compare here to determine if this is a
72
- // superfluous reconcile. It's possible for state to be mutable but such
73
- // change should trigger an update of the owner which would recreate
74
- // the element. We explicitly check for the existence of an owner since
75
- // it's possible for an element created outside a composite to be
76
- // deeply mutated and reused.
77
- return;
78
- }
79
-
80
- if ('production' !== process.env.NODE_ENV) {
81
- ReactElementValidator.checkAndWarnForMutatedProps(nextElement);
82
- }
66
+ if (nextElement === prevElement && nextElement._owner != null
67
+ // TODO: Shouldn't we need to do this: `&& context === internalInstance._context`
68
+ ) {
69
+ // Since elements are immutable after the owner is rendered,
70
+ // we can do a cheap identity compare here to determine if this is a
71
+ // superfluous reconcile. It's possible for state to be mutable but such
72
+ // change should trigger an update of the owner which would recreate
73
+ // the element. We explicitly check for the existence of an owner since
74
+ // it's possible for an element created outside a composite to be
75
+ // deeply mutated and reused.
76
+
77
+ // TODO: Bailing out early is just a perf optimization right?
78
+ // TODO: Removing the return statement should affect correctness?
79
+ return;
80
+ }
83
81
 
84
82
  var refsChanged = ReactRef.shouldUpdateRefs(prevElement, nextElement);
85
83