react 0.14.0-alpha3 → 0.14.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 (200) hide show
  1. package/README.md +5 -2
  2. package/addons.js +8 -3
  3. package/dist/react-dom.js +42 -0
  4. package/dist/react-dom.min.js +12 -0
  5. package/dist/react-with-addons.js +6076 -5337
  6. package/dist/react-with-addons.min.js +6 -6
  7. package/dist/react.js +5445 -4839
  8. package/dist/react.min.js +6 -5
  9. package/lib/{AutoFocusMixin.js → AutoFocusUtils.js} +15 -5
  10. package/lib/BeforeInputEventPlugin.js +13 -13
  11. package/lib/CSSProperty.js +18 -3
  12. package/lib/CSSPropertyOperations.js +22 -14
  13. package/lib/CallbackQueue.js +4 -4
  14. package/lib/ChangeEventPlugin.js +18 -15
  15. package/lib/DOMChildrenOperations.js +17 -7
  16. package/lib/DOMProperty.js +82 -117
  17. package/lib/DOMPropertyOperations.js +84 -33
  18. package/lib/Danger.js +21 -16
  19. package/lib/DefaultEventPluginOrder.js +2 -2
  20. package/lib/EnterLeaveEventPlugin.js +21 -13
  21. package/lib/EventConstants.js +23 -1
  22. package/lib/EventPluginHub.js +17 -20
  23. package/lib/EventPluginRegistry.js +8 -8
  24. package/lib/EventPluginUtils.js +33 -42
  25. package/lib/EventPropagators.js +8 -8
  26. package/lib/FallbackCompositionState.js +9 -3
  27. package/lib/HTMLDOMPropertyConfig.js +19 -3
  28. package/lib/LinkedStateMixin.js +2 -2
  29. package/lib/LinkedValueUtils.js +50 -38
  30. package/lib/MetaMatchers.js +118 -0
  31. package/lib/OrderedMap.js +453 -0
  32. package/lib/PooledClass.js +15 -5
  33. package/lib/React.js +18 -7
  34. package/lib/ReactBrowserComponentMixin.js +4 -4
  35. package/lib/ReactBrowserEventEmitter.js +30 -7
  36. package/lib/ReactCSSTransitionGroup.js +35 -9
  37. package/lib/ReactCSSTransitionGroupChild.js +56 -30
  38. package/lib/ReactChildReconciler.js +24 -19
  39. package/lib/ReactChildren.js +75 -35
  40. package/lib/ReactClass.js +70 -87
  41. package/lib/ReactComponent.js +27 -20
  42. package/lib/ReactComponentBrowserEnvironment.js +2 -2
  43. package/lib/ReactComponentEnvironment.js +2 -2
  44. package/lib/ReactComponentWithPureRenderMixin.js +3 -3
  45. package/lib/ReactCompositeComponent.js +117 -106
  46. package/lib/ReactDOM.js +74 -158
  47. package/lib/ReactDOMButton.js +15 -26
  48. package/lib/ReactDOMComponent.js +441 -72
  49. package/lib/ReactDOMFactories.js +177 -0
  50. package/lib/{emptyObject.js → ReactDOMFeatureFlags.js} +6 -8
  51. package/lib/ReactDOMIDOperations.js +8 -66
  52. package/lib/ReactDOMInput.js +87 -99
  53. package/lib/ReactDOMOption.js +25 -44
  54. package/lib/ReactDOMSelect.js +88 -98
  55. package/lib/ReactDOMSelection.js +3 -3
  56. package/lib/ReactDOMServer.js +5 -3
  57. package/lib/ReactDOMTextComponent.js +33 -20
  58. package/lib/ReactDOMTextarea.js +48 -61
  59. package/lib/ReactDefaultBatchingStrategy.js +4 -4
  60. package/lib/ReactDefaultInjection.js +23 -72
  61. package/lib/ReactDefaultPerf.js +7 -7
  62. package/lib/ReactDefaultPerfAnalysis.js +6 -11
  63. package/lib/ReactElement.js +92 -107
  64. package/lib/ReactElementValidator.js +53 -173
  65. package/lib/ReactEmptyComponent.js +26 -62
  66. package/lib/ReactEmptyComponentRegistry.js +48 -0
  67. package/lib/ReactErrorUtils.js +45 -9
  68. package/lib/ReactEventEmitterMixin.js +3 -4
  69. package/lib/ReactEventListener.js +64 -12
  70. package/lib/ReactFragment.js +29 -115
  71. package/lib/ReactInjection.js +10 -12
  72. package/lib/ReactInputSelection.js +8 -7
  73. package/lib/ReactInstanceHandles.js +12 -12
  74. package/lib/ReactIsomorphic.js +15 -11
  75. package/lib/ReactLink.js +1 -1
  76. package/lib/ReactMarkupChecksum.js +6 -2
  77. package/lib/ReactMount.js +196 -122
  78. package/lib/ReactMultiChild.js +119 -25
  79. package/lib/ReactMultiChildUpdateTypes.js +2 -1
  80. package/lib/ReactNativeComponent.js +3 -8
  81. package/lib/ReactNoopUpdateQueue.js +118 -0
  82. package/lib/ReactOwner.js +3 -3
  83. package/lib/ReactPerf.js +2 -2
  84. package/lib/ReactPropTransferer.js +3 -3
  85. package/lib/ReactPropTypeLocationNames.js +1 -1
  86. package/lib/ReactPropTypeLocations.js +1 -1
  87. package/lib/ReactPropTypes.js +41 -12
  88. package/lib/ReactReconcileTransaction.js +12 -10
  89. package/lib/ReactReconciler.js +8 -11
  90. package/lib/ReactRef.js +15 -2
  91. package/lib/ReactServerBatchingStrategy.js +23 -0
  92. package/lib/ReactServerRendering.js +22 -9
  93. package/lib/ReactServerRenderingTransaction.js +8 -7
  94. package/lib/ReactTestUtils.js +89 -64
  95. package/lib/ReactTransitionChildMapping.js +3 -6
  96. package/lib/ReactTransitionEvents.js +1 -1
  97. package/lib/ReactTransitionGroup.js +5 -6
  98. package/lib/ReactUpdateQueue.js +60 -35
  99. package/lib/ReactUpdates.js +15 -18
  100. package/lib/{isTextNode.js → ReactVersion.js} +2 -13
  101. package/lib/ReactWithAddons.js +24 -17
  102. package/lib/ResponderEventPlugin.js +514 -0
  103. package/lib/ResponderSyntheticEvent.js +40 -0
  104. package/lib/ResponderTouchHistoryStore.js +180 -0
  105. package/lib/SVGDOMPropertyConfig.js +1 -1
  106. package/lib/SelectEventPlugin.js +25 -16
  107. package/lib/SimpleEventPlugin.js +200 -45
  108. package/lib/SyntheticClipboardEvent.js +3 -3
  109. package/lib/SyntheticCompositionEvent.js +3 -3
  110. package/lib/SyntheticDragEvent.js +3 -3
  111. package/lib/SyntheticEvent.js +24 -8
  112. package/lib/SyntheticFocusEvent.js +3 -3
  113. package/lib/SyntheticInputEvent.js +3 -3
  114. package/lib/SyntheticKeyboardEvent.js +6 -6
  115. package/lib/SyntheticMouseEvent.js +5 -5
  116. package/lib/SyntheticTouchEvent.js +4 -4
  117. package/lib/SyntheticUIEvent.js +4 -4
  118. package/lib/SyntheticWheelEvent.js +3 -3
  119. package/lib/TapEventPlugin.js +119 -0
  120. package/lib/Transaction.js +17 -11
  121. package/lib/accumulate.js +44 -0
  122. package/lib/accumulateInto.js +2 -2
  123. package/lib/adler32.js +19 -7
  124. package/lib/cloneWithProps.js +12 -7
  125. package/lib/createHierarchyRenderer.js +85 -0
  126. package/lib/dangerousStyleValue.js +1 -1
  127. package/lib/deprecated.js +48 -0
  128. package/lib/findDOMNode.js +11 -12
  129. package/lib/flattenChildren.js +4 -4
  130. package/lib/forEachAccumulated.js +1 -1
  131. package/lib/getEventCharCode.js +1 -1
  132. package/lib/getEventKey.js +1 -1
  133. package/lib/getEventModifierState.js +0 -1
  134. package/lib/getTestDocument.js +28 -0
  135. package/lib/getTextContentAccessor.js +1 -1
  136. package/lib/instantiateReactComponent.js +27 -25
  137. package/lib/isEventSupported.js +1 -1
  138. package/lib/isTextInputElement.js +2 -1
  139. package/lib/joinClasses.js +1 -1
  140. package/lib/onlyChild.js +3 -3
  141. package/lib/quoteAttributeValueForBrowser.js +1 -1
  142. package/lib/reactComponentExpect.js +216 -0
  143. package/lib/renderSubtreeIntoContainer.js +1 -1
  144. package/lib/setInnerHTML.js +2 -2
  145. package/lib/setTextContent.js +3 -3
  146. package/lib/shallowCompare.js +1 -1
  147. package/lib/shouldUpdateReactComponent.js +12 -8
  148. package/lib/sliceChildren.js +34 -0
  149. package/lib/traverseAllChildren.js +21 -19
  150. package/lib/update.js +13 -13
  151. package/lib/validateDOMNesting.js +6 -6
  152. package/lib/webcomponents.js +6379 -0
  153. package/package.json +4 -6
  154. package/react.js +2 -0
  155. package/addons/CSSTransitionGroup.js +0 -1
  156. package/addons/LinkedStateMixin.js +0 -1
  157. package/addons/Perf.js +0 -1
  158. package/addons/PureRenderMixin.js +0 -1
  159. package/addons/TestUtils.js +0 -1
  160. package/addons/TransitionGroup.js +0 -1
  161. package/addons/batchedUpdates.js +0 -1
  162. package/addons/cloneWithProps.js +0 -1
  163. package/addons/createFragment.js +0 -1
  164. package/addons/renderSubtreeIntoContainer.js +0 -1
  165. package/addons/shallowCompare.js +0 -1
  166. package/addons/update.js +0 -1
  167. package/dist/JSXTransformer.js +0 -17589
  168. package/lib/CSSCore.js +0 -97
  169. package/lib/EventListener.js +0 -84
  170. package/lib/ExecutionEnvironment.js +0 -38
  171. package/lib/LocalEventTrapMixin.js +0 -46
  172. package/lib/ReactContext.js +0 -32
  173. package/lib/ReactDOMClient.js +0 -85
  174. package/lib/ReactDOMForm.js +0 -47
  175. package/lib/ReactDOMIframe.js +0 -43
  176. package/lib/ReactDOMImg.js +0 -44
  177. package/lib/ReactLifeCycle.js +0 -35
  178. package/lib/camelize.js +0 -32
  179. package/lib/camelizeStyleName.js +0 -40
  180. package/lib/containsNode.js +0 -55
  181. package/lib/createArrayFromMixed.js +0 -85
  182. package/lib/createFullPageComponent.js +0 -51
  183. package/lib/createNodesFromMarkup.js +0 -84
  184. package/lib/emptyFunction.js +0 -38
  185. package/lib/focusNode.js +0 -26
  186. package/lib/getActiveElement.js +0 -29
  187. package/lib/getMarkupWrap.js +0 -115
  188. package/lib/getUnboundedScrollPosition.js +0 -38
  189. package/lib/hyphenate.js +0 -33
  190. package/lib/hyphenateStyleName.js +0 -39
  191. package/lib/invariant.js +0 -49
  192. package/lib/isNode.js +0 -23
  193. package/lib/keyMirror.js +0 -48
  194. package/lib/keyOf.js +0 -35
  195. package/lib/mapObject.js +0 -51
  196. package/lib/performance.js +0 -23
  197. package/lib/performanceNow.js +0 -28
  198. package/lib/shallowEqual.js +0 -48
  199. package/lib/toArray.js +0 -57
  200. package/lib/warning.js +0 -61
@@ -10,21 +10,57 @@
10
10
  * @typechecks
11
11
  */
12
12
 
13
- "use strict";
13
+ 'use strict';
14
+
15
+ var caughtError = null;
14
16
 
15
17
  var ReactErrorUtils = {
16
18
  /**
17
- * Creates a guarded version of a function. This is supposed to make debugging
18
- * of event handlers easier. To aid debugging with the browser's debugger,
19
- * this currently simply returns the original function.
19
+ * Call a function while guarding against errors that happens within it.
20
20
  *
21
- * @param {function} func Function to be executed
22
- * @param {string} name The name of the guard
23
- * @return {function}
21
+ * @param {?String} name of the guard to use for logging or debugging
22
+ * @param {Function} func The function to invoke
23
+ * @param {*} a First argument
24
+ * @param {*} b Second argument
25
+ */
26
+ invokeGuardedCallback: function (name, func, a, b) {
27
+ try {
28
+ return func(a, b);
29
+ } catch (x) {
30
+ if (caughtError === null) {
31
+ caughtError = x;
32
+ }
33
+ return undefined;
34
+ }
35
+ },
36
+
37
+ /**
38
+ * During execution of guarded functions we will capture the first error which
39
+ * we will rethrow to be handled by the top level error handler.
24
40
  */
25
- guard: function (func, name) {
26
- return func;
41
+ rethrowCaughtError: function () {
42
+ if (caughtError) {
43
+ var error = caughtError;
44
+ caughtError = null;
45
+ throw error;
46
+ }
27
47
  }
28
48
  };
29
49
 
50
+ if (process.env.NODE_ENV !== 'production') {
51
+ /**
52
+ * To help development we can get better devtools integration by simulating a
53
+ * real browser event.
54
+ */
55
+ if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof Event === 'function') {
56
+ var fakeNode = document.createElement('react');
57
+ ReactErrorUtils.invokeGuardedCallback = function (name, func, a, b) {
58
+ var boundFunc = func.bind(null, a, b);
59
+ fakeNode.addEventListener(name, boundFunc, false);
60
+ fakeNode.dispatchEvent(new Event(name));
61
+ fakeNode.removeEventListener(name, boundFunc, false);
62
+ };
63
+ }
64
+ }
65
+
30
66
  module.exports = ReactErrorUtils;
@@ -11,7 +11,7 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- var EventPluginHub = require("./EventPluginHub");
14
+ var EventPluginHub = require('./EventPluginHub');
15
15
 
16
16
  function runEventQueueInBatch(events) {
17
17
  EventPluginHub.enqueueEvents(events);
@@ -29,9 +29,8 @@ var ReactEventEmitterMixin = {
29
29
  * @param {string} topLevelTargetID ID of `topLevelTarget`.
30
30
  * @param {object} nativeEvent Native environment event.
31
31
  */
32
- handleTopLevel: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent) {
33
- var events = EventPluginHub.extractEvents(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent);
34
-
32
+ handleTopLevel: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {
33
+ var events = EventPluginHub.extractEvents(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget);
35
34
  runEventQueueInBatch(events);
36
35
  }
37
36
  };
@@ -12,16 +12,18 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- var EventListener = require("./EventListener");
16
- var ExecutionEnvironment = require("./ExecutionEnvironment");
17
- var PooledClass = require("./PooledClass");
18
- var ReactInstanceHandles = require("./ReactInstanceHandles");
19
- var ReactMount = require("./ReactMount");
20
- var ReactUpdates = require("./ReactUpdates");
15
+ var EventListener = require('fbjs/lib/EventListener');
16
+ var ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');
17
+ var PooledClass = require('./PooledClass');
18
+ var ReactInstanceHandles = require('./ReactInstanceHandles');
19
+ var ReactMount = require('./ReactMount');
20
+ var ReactUpdates = require('./ReactUpdates');
21
21
 
22
- var assign = require("./Object.assign");
23
- var getEventTarget = require("./getEventTarget");
24
- var getUnboundedScrollPosition = require("./getUnboundedScrollPosition");
22
+ var assign = require('./Object.assign');
23
+ var getEventTarget = require('./getEventTarget');
24
+ var getUnboundedScrollPosition = require('fbjs/lib/getUnboundedScrollPosition');
25
+
26
+ var DOCUMENT_FRAGMENT_NODE_TYPE = 11;
25
27
 
26
28
  /**
27
29
  * Finds the parent React component of `node`.
@@ -57,6 +59,22 @@ assign(TopLevelCallbackBookKeeping.prototype, {
57
59
  PooledClass.addPoolingTo(TopLevelCallbackBookKeeping, PooledClass.twoArgumentPooler);
58
60
 
59
61
  function handleTopLevelImpl(bookKeeping) {
62
+ // TODO: Re-enable event.path handling
63
+ //
64
+ // if (bookKeeping.nativeEvent.path && bookKeeping.nativeEvent.path.length > 1) {
65
+ // // New browsers have a path attribute on native events
66
+ // handleTopLevelWithPath(bookKeeping);
67
+ // } else {
68
+ // // Legacy browsers don't have a path attribute on native events
69
+ // handleTopLevelWithoutPath(bookKeeping);
70
+ // }
71
+
72
+ void handleTopLevelWithPath; // temporarily unused
73
+ handleTopLevelWithoutPath(bookKeeping);
74
+ }
75
+
76
+ // Legacy browsers don't have a path attribute on native events
77
+ function handleTopLevelWithoutPath(bookKeeping) {
60
78
  var topLevelTarget = ReactMount.getFirstReactDOM(getEventTarget(bookKeeping.nativeEvent)) || window;
61
79
 
62
80
  // Loop through the hierarchy, in case there's any nested components.
@@ -72,7 +90,41 @@ function handleTopLevelImpl(bookKeeping) {
72
90
  for (var i = 0; i < bookKeeping.ancestors.length; i++) {
73
91
  topLevelTarget = bookKeeping.ancestors[i];
74
92
  var topLevelTargetID = ReactMount.getID(topLevelTarget) || '';
75
- ReactEventListener._handleTopLevel(bookKeeping.topLevelType, topLevelTarget, topLevelTargetID, bookKeeping.nativeEvent);
93
+ ReactEventListener._handleTopLevel(bookKeeping.topLevelType, topLevelTarget, topLevelTargetID, bookKeeping.nativeEvent, getEventTarget(bookKeeping.nativeEvent));
94
+ }
95
+ }
96
+
97
+ // New browsers have a path attribute on native events
98
+ function handleTopLevelWithPath(bookKeeping) {
99
+ var path = bookKeeping.nativeEvent.path;
100
+ var currentNativeTarget = path[0];
101
+ var eventsFired = 0;
102
+ for (var i = 0; i < path.length; i++) {
103
+ var currentPathElement = path[i];
104
+ if (currentPathElement.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE) {
105
+ currentNativeTarget = path[i + 1];
106
+ }
107
+ // TODO: slow
108
+ var reactParent = ReactMount.getFirstReactDOM(currentPathElement);
109
+ if (reactParent === currentPathElement) {
110
+ var currentPathElementID = ReactMount.getID(currentPathElement);
111
+ var newRootID = ReactInstanceHandles.getReactRootIDFromNodeID(currentPathElementID);
112
+ bookKeeping.ancestors.push(currentPathElement);
113
+
114
+ var topLevelTargetID = ReactMount.getID(currentPathElement) || '';
115
+ eventsFired++;
116
+ ReactEventListener._handleTopLevel(bookKeeping.topLevelType, currentPathElement, topLevelTargetID, bookKeeping.nativeEvent, currentNativeTarget);
117
+
118
+ // Jump to the root of this React render tree
119
+ while (currentPathElementID !== newRootID) {
120
+ i++;
121
+ currentPathElement = path[i];
122
+ currentPathElementID = ReactMount.getID(currentPathElement);
123
+ }
124
+ }
125
+ }
126
+ if (eventsFired === 0) {
127
+ ReactEventListener._handleTopLevel(bookKeeping.topLevelType, window, '', bookKeeping.nativeEvent, getEventTarget(bookKeeping.nativeEvent));
76
128
  }
77
129
  }
78
130
 
@@ -105,7 +157,7 @@ var ReactEventListener = {
105
157
  * @param {string} topLevelType Record from `EventConstants`.
106
158
  * @param {string} handlerBaseName Event name (e.g. "click").
107
159
  * @param {object} handle Element on which to attach listener.
108
- * @return {object} An object with a remove function which will forcefully
160
+ * @return {?object} An object with a remove function which will forcefully
109
161
  * remove the listener.
110
162
  * @internal
111
163
  */
@@ -123,7 +175,7 @@ var ReactEventListener = {
123
175
  * @param {string} topLevelType Record from `EventConstants`.
124
176
  * @param {string} handlerBaseName Event name (e.g. "click").
125
177
  * @param {object} handle Element on which to attach listener.
126
- * @return {object} An object with a remove function which will forcefully
178
+ * @return {?object} An object with a remove function which will forcefully
127
179
  * remove the listener.
128
180
  * @internal
129
181
  */
@@ -6,144 +6,58 @@
6
6
  * LICENSE file in the root directory of this source tree. An additional grant
7
7
  * of patent rights can be found in the PATENTS file in the same directory.
8
8
  *
9
- * @providesModule ReactFragment
10
- */
9
+ * @providesModule ReactFragment
10
+ */
11
11
 
12
12
  'use strict';
13
13
 
14
- var ReactElement = require("./ReactElement");
14
+ var ReactChildren = require('./ReactChildren');
15
+ var ReactElement = require('./ReactElement');
15
16
 
16
- var warning = require("./warning");
17
+ var emptyFunction = require('fbjs/lib/emptyFunction');
18
+ var invariant = require('fbjs/lib/invariant');
19
+ var warning = require('fbjs/lib/warning');
17
20
 
18
21
  /**
19
22
  * We used to allow keyed objects to serve as a collection of ReactElements,
20
23
  * or nested sets. This allowed us a way to explicitly key a set a fragment of
21
24
  * components. This is now being replaced with an opaque data structure.
22
25
  * The upgrade path is to call React.addons.createFragment({ key: value }) to
23
- * create a keyed fragment. The resulting data structure is opaque, for now.
26
+ * create a keyed fragment. The resulting data structure is an array.
24
27
  */
25
28
 
26
- if ('production' !== process.env.NODE_ENV) {
27
- var fragmentKey = '_reactFragment';
28
- var didWarnKey = '_reactDidWarn';
29
- var canWarnForReactFragment = false;
30
-
31
- try {
32
- // Feature test. Don't even try to issue this warning if we can't use
33
- // enumerable: false.
34
-
35
- var dummy = function () {
36
- return 1;
37
- };
29
+ var numericPropertyRegex = /^\d+$/;
38
30
 
39
- Object.defineProperty({}, fragmentKey, { enumerable: false, value: true });
40
-
41
- Object.defineProperty({}, 'key', { enumerable: true, get: dummy });
42
-
43
- canWarnForReactFragment = true;
44
- } catch (x) {}
45
-
46
- var proxyPropertyAccessWithWarning = function (obj, key) {
47
- Object.defineProperty(obj, key, {
48
- enumerable: true,
49
- get: function () {
50
- 'production' !== process.env.NODE_ENV ? warning(this[didWarnKey], 'A ReactFragment is an opaque type. Accessing any of its ' + 'properties is deprecated. Pass it to one of the React.Children ' + 'helpers.') : undefined;
51
- this[didWarnKey] = true;
52
- return this[fragmentKey][key];
53
- },
54
- set: function (value) {
55
- 'production' !== process.env.NODE_ENV ? warning(this[didWarnKey], 'A ReactFragment is an immutable opaque type. Mutating its ' + 'properties is deprecated.') : undefined;
56
- this[didWarnKey] = true;
57
- this[fragmentKey][key] = value;
58
- }
59
- });
60
- };
61
-
62
- var issuedWarnings = {};
63
-
64
- var didWarnForFragment = function (fragment) {
65
- // We use the keys and the type of the value as a heuristic to dedupe the
66
- // warning to avoid spamming too much.
67
- var fragmentCacheKey = '';
68
- for (var key in fragment) {
69
- fragmentCacheKey += key + ':' + typeof fragment[key] + ',';
70
- }
71
- var alreadyWarnedOnce = !!issuedWarnings[fragmentCacheKey];
72
- issuedWarnings[fragmentCacheKey] = true;
73
- return alreadyWarnedOnce;
74
- };
75
- }
31
+ var warnedAboutNumeric = false;
76
32
 
77
33
  var ReactFragment = {
78
34
  // Wrap a keyed object in an opaque proxy that warns you if you access any
79
35
  // of its properties.
80
36
  create: function (object) {
81
- if ('production' !== process.env.NODE_ENV) {
82
- if (typeof object !== 'object' || !object || Array.isArray(object)) {
83
- 'production' !== process.env.NODE_ENV ? warning(false, 'React.addons.createFragment only accepts a single object.', object) : undefined;
84
- return object;
85
- }
86
- if (ReactElement.isValidElement(object)) {
87
- 'production' !== process.env.NODE_ENV ? warning(false, 'React.addons.createFragment does not accept a ReactElement ' + 'without a wrapper object.') : undefined;
88
- return object;
89
- }
90
- if (canWarnForReactFragment) {
91
- var proxy = {};
92
- Object.defineProperty(proxy, fragmentKey, {
93
- enumerable: false,
94
- value: object
95
- });
96
- Object.defineProperty(proxy, didWarnKey, {
97
- writable: true,
98
- enumerable: false,
99
- value: false
100
- });
101
- for (var key in object) {
102
- proxyPropertyAccessWithWarning(proxy, key);
103
- }
104
- Object.preventExtensions(proxy);
105
- return proxy;
106
- }
37
+ if (typeof object !== 'object' || !object || Array.isArray(object)) {
38
+ process.env.NODE_ENV !== 'production' ? warning(false, 'React.addons.createFragment only accepts a single object. Got: %s', object) : undefined;
39
+ return object;
107
40
  }
108
- return object;
109
- },
110
- // Extract the original keyed object from the fragment opaque type. Warn if
111
- // a plain object is passed here.
112
- extract: function (fragment) {
113
- if ('production' !== process.env.NODE_ENV) {
114
- if (canWarnForReactFragment) {
115
- if (!fragment[fragmentKey]) {
116
- 'production' !== process.env.NODE_ENV ? warning(didWarnForFragment(fragment), 'Any use of a keyed object should be wrapped in ' + 'React.addons.createFragment(object) before being passed as a ' + 'child.') : undefined;
117
- return fragment;
118
- }
119
- return fragment[fragmentKey];
120
- }
41
+ if (ReactElement.isValidElement(object)) {
42
+ process.env.NODE_ENV !== 'production' ? warning(false, 'React.addons.createFragment does not accept a ReactElement ' + 'without a wrapper object.') : undefined;
43
+ return object;
121
44
  }
122
- return fragment;
123
- },
124
- // Check if this is a fragment and if so, extract the keyed object. If it
125
- // is a fragment-like object, warn that it should be wrapped. Ignore if we
126
- // can't determine what kind of object this is.
127
- extractIfFragment: function (fragment) {
128
- if ('production' !== process.env.NODE_ENV) {
129
- if (canWarnForReactFragment) {
130
- // If it is the opaque type, return the keyed object.
131
- if (fragment[fragmentKey]) {
132
- return fragment[fragmentKey];
133
- }
134
- // Otherwise, check each property if it has an element, if it does
135
- // it is probably meant as a fragment, so we can warn early. Defer,
136
- // the warning to extract.
137
- for (var key in fragment) {
138
- if (fragment.hasOwnProperty(key) && ReactElement.isValidElement(fragment[key])) {
139
- // This looks like a fragment object, we should provide an
140
- // early warning.
141
- return ReactFragment.extract(fragment);
142
- }
45
+
46
+ !(object.nodeType !== 1) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'React.addons.createFragment(...): Encountered an invalid child; DOM ' + 'elements are not valid children of React components.') : invariant(false) : undefined;
47
+
48
+ var result = [];
49
+
50
+ for (var key in object) {
51
+ if (process.env.NODE_ENV !== 'production') {
52
+ if (!warnedAboutNumeric && numericPropertyRegex.test(key)) {
53
+ process.env.NODE_ENV !== 'production' ? warning(false, 'React.addons.createFragment(...): Child objects should have ' + 'non-numeric keys so ordering is preserved.') : undefined;
54
+ warnedAboutNumeric = true;
143
55
  }
144
56
  }
57
+ ReactChildren.mapIntoWithKeyPrefixInternal(object[key], result, key, emptyFunction.thatReturnsArgument);
145
58
  }
146
- return fragment;
59
+
60
+ return result;
147
61
  }
148
62
  };
149
63
 
@@ -11,22 +11,20 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- var DOMProperty = require("./DOMProperty");
15
- var EventPluginHub = require("./EventPluginHub");
16
- var ReactComponentEnvironment = require("./ReactComponentEnvironment");
17
- var ReactClass = require("./ReactClass");
18
- var ReactEmptyComponent = require("./ReactEmptyComponent");
19
- var ReactBrowserEventEmitter = require("./ReactBrowserEventEmitter");
20
- var ReactNativeComponent = require("./ReactNativeComponent");
21
- var ReactDOMComponent = require("./ReactDOMComponent");
22
- var ReactPerf = require("./ReactPerf");
23
- var ReactRootIndex = require("./ReactRootIndex");
24
- var ReactUpdates = require("./ReactUpdates");
14
+ var DOMProperty = require('./DOMProperty');
15
+ var EventPluginHub = require('./EventPluginHub');
16
+ var ReactComponentEnvironment = require('./ReactComponentEnvironment');
17
+ var ReactClass = require('./ReactClass');
18
+ var ReactEmptyComponent = require('./ReactEmptyComponent');
19
+ var ReactBrowserEventEmitter = require('./ReactBrowserEventEmitter');
20
+ var ReactNativeComponent = require('./ReactNativeComponent');
21
+ var ReactPerf = require('./ReactPerf');
22
+ var ReactRootIndex = require('./ReactRootIndex');
23
+ var ReactUpdates = require('./ReactUpdates');
25
24
 
26
25
  var ReactInjection = {
27
26
  Component: ReactComponentEnvironment.injection,
28
27
  Class: ReactClass.injection,
29
- DOMComponent: ReactDOMComponent.injection,
30
28
  DOMProperty: DOMProperty.injection,
31
29
  EmptyComponent: ReactEmptyComponent.injection,
32
30
  EventPluginHub: EventPluginHub.injection,
@@ -11,11 +11,11 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- var ReactDOMSelection = require("./ReactDOMSelection");
14
+ var ReactDOMSelection = require('./ReactDOMSelection');
15
15
 
16
- var containsNode = require("./containsNode");
17
- var focusNode = require("./focusNode");
18
- var getActiveElement = require("./getActiveElement");
16
+ var containsNode = require('fbjs/lib/containsNode');
17
+ var focusNode = require('fbjs/lib/focusNode');
18
+ var getActiveElement = require('fbjs/lib/getActiveElement');
19
19
 
20
20
  function isInDocument(node) {
21
21
  return containsNode(document.documentElement, node);
@@ -30,7 +30,8 @@ function isInDocument(node) {
30
30
  var ReactInputSelection = {
31
31
 
32
32
  hasSelectionCapabilities: function (elem) {
33
- return elem && (elem.nodeName === 'INPUT' && elem.type === 'text' || elem.nodeName === 'TEXTAREA' || elem.contentEditable === 'true');
33
+ var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
34
+ return nodeName && (nodeName === 'input' && elem.type === 'text' || nodeName === 'textarea' || elem.contentEditable === 'true');
34
35
  },
35
36
 
36
37
  getSelectionInformation: function () {
@@ -73,7 +74,7 @@ var ReactInputSelection = {
73
74
  start: input.selectionStart,
74
75
  end: input.selectionEnd
75
76
  };
76
- } else if (document.selection && input.nodeName === 'INPUT') {
77
+ } else if (document.selection && (input.nodeName && input.nodeName.toLowerCase() === 'input')) {
77
78
  // IE8 input.
78
79
  var range = document.selection.createRange();
79
80
  // There can only be one selection per document in IE, so it must
@@ -108,7 +109,7 @@ var ReactInputSelection = {
108
109
  if ('selectionStart' in input) {
109
110
  input.selectionStart = start;
110
111
  input.selectionEnd = Math.min(end, input.value.length);
111
- } else if (document.selection && input.nodeName === 'INPUT') {
112
+ } else if (document.selection && (input.nodeName && input.nodeName.toLowerCase() === 'input')) {
112
113
  var range = input.createTextRange();
113
114
  range.collapse(true);
114
115
  range.moveStart('character', start);