react 0.14.0-beta1 → 0.14.0-beta2

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 (169) hide show
  1. package/addons.js +5 -2
  2. package/dist/JSXTransformer.js +588 -227
  3. package/dist/react-with-addons.js +3118 -2707
  4. package/dist/react-with-addons.min.js +6 -6
  5. package/dist/react.js +3713 -3317
  6. package/dist/react.min.js +6 -5
  7. package/lib/AutoFocusUtils.js +3 -3
  8. package/lib/BeforeInputEventPlugin.js +13 -13
  9. package/lib/CSSProperty.js +3 -0
  10. package/lib/CSSPropertyOperations.js +13 -13
  11. package/lib/CallbackQueue.js +4 -4
  12. package/lib/ChangeEventPlugin.js +12 -12
  13. package/lib/DOMChildrenOperations.js +10 -6
  14. package/lib/DOMProperty.js +8 -8
  15. package/lib/DOMPropertyOperations.js +9 -9
  16. package/lib/Danger.js +14 -14
  17. package/lib/DefaultEventPluginOrder.js +2 -2
  18. package/lib/EnterLeaveEventPlugin.js +5 -5
  19. package/lib/EventConstants.js +23 -1
  20. package/lib/EventPluginHub.js +11 -11
  21. package/lib/EventPluginRegistry.js +8 -8
  22. package/lib/EventPluginUtils.js +11 -11
  23. package/lib/EventPropagators.js +7 -7
  24. package/lib/FallbackCompositionState.js +3 -3
  25. package/lib/HTMLDOMPropertyConfig.js +4 -2
  26. package/lib/LinkedStateMixin.js +2 -2
  27. package/lib/LinkedValueUtils.js +8 -8
  28. package/lib/MetaMatchers.js +118 -0
  29. package/lib/OrderedMap.js +453 -0
  30. package/lib/PooledClass.js +2 -2
  31. package/lib/React.js +6 -6
  32. package/lib/ReactBrowserComponentMixin.js +4 -4
  33. package/lib/ReactBrowserEventEmitter.js +30 -7
  34. package/lib/ReactCSSTransitionGroup.js +16 -5
  35. package/lib/ReactCSSTransitionGroupChild.js +12 -11
  36. package/lib/ReactChildReconciler.js +25 -18
  37. package/lib/ReactChildren.js +6 -6
  38. package/lib/ReactClass.js +42 -42
  39. package/lib/ReactComponent.js +13 -13
  40. package/lib/ReactComponentBrowserEnvironment.js +2 -2
  41. package/lib/ReactComponentEnvironment.js +2 -2
  42. package/lib/ReactComponentWithPureRenderMixin.js +1 -1
  43. package/lib/ReactCompositeComponent.js +38 -38
  44. package/lib/ReactDOM.js +72 -159
  45. package/lib/ReactDOMComponent.js +104 -60
  46. package/lib/ReactDOMFactories.js +177 -0
  47. package/lib/ReactDOMIDOperations.js +10 -24
  48. package/lib/ReactDOMInput.js +8 -8
  49. package/lib/ReactDOMOption.js +7 -7
  50. package/lib/ReactDOMSelect.js +8 -8
  51. package/lib/ReactDOMSelection.js +3 -3
  52. package/lib/ReactDOMServer.js +2 -2
  53. package/lib/ReactDOMTextComponent.js +11 -11
  54. package/lib/ReactDOMTextarea.js +11 -11
  55. package/lib/ReactDefaultBatchingStrategy.js +4 -4
  56. package/lib/ReactDefaultInjection.js +24 -24
  57. package/lib/ReactDefaultPerf.js +7 -7
  58. package/lib/ReactDefaultPerfAnalysis.js +6 -9
  59. package/lib/ReactElement.js +4 -4
  60. package/lib/ReactElementValidator.js +21 -21
  61. package/lib/ReactEmptyComponent.js +4 -4
  62. package/lib/ReactEventEmitterMixin.js +1 -1
  63. package/lib/ReactEventListener.js +19 -14
  64. package/lib/ReactFragment.js +11 -11
  65. package/lib/ReactInjection.js +11 -11
  66. package/lib/ReactInputSelection.js +4 -4
  67. package/lib/ReactInstanceHandles.js +10 -11
  68. package/lib/ReactIsomorphic.js +11 -11
  69. package/lib/ReactLink.js +1 -1
  70. package/lib/ReactMarkupChecksum.js +6 -2
  71. package/lib/ReactMount.js +68 -48
  72. package/lib/ReactMultiChild.js +83 -22
  73. package/lib/ReactMultiChildUpdateTypes.js +2 -1
  74. package/lib/ReactNativeComponent.js +3 -3
  75. package/lib/ReactNoopUpdateQueue.js +3 -3
  76. package/lib/ReactOwner.js +3 -3
  77. package/lib/ReactPerf.js +2 -2
  78. package/lib/ReactPropTransferer.js +3 -3
  79. package/lib/ReactPropTypeLocationNames.js +1 -1
  80. package/lib/ReactPropTypeLocations.js +1 -1
  81. package/lib/ReactPropTypes.js +34 -8
  82. package/lib/ReactReconcileTransaction.js +6 -6
  83. package/lib/ReactReconciler.js +12 -12
  84. package/lib/ReactRef.js +1 -1
  85. package/lib/ReactServerBatchingStrategy.js +5 -5
  86. package/lib/ReactServerRendering.js +12 -12
  87. package/lib/ReactServerRenderingTransaction.js +5 -5
  88. package/lib/ReactTestUtils.js +26 -27
  89. package/lib/ReactTransitionChildMapping.js +2 -2
  90. package/lib/ReactTransitionEvents.js +1 -1
  91. package/lib/ReactTransitionGroup.js +5 -6
  92. package/lib/ReactUpdateQueue.js +17 -17
  93. package/lib/ReactUpdates.js +14 -14
  94. package/lib/ReactWithAddons.js +14 -14
  95. package/lib/ResponderEventPlugin.js +514 -0
  96. package/lib/ResponderSyntheticEvent.js +40 -0
  97. package/lib/ResponderTouchHistoryStore.js +180 -0
  98. package/lib/SVGDOMPropertyConfig.js +1 -1
  99. package/lib/SelectEventPlugin.js +9 -9
  100. package/lib/SimpleEventPlugin.js +201 -25
  101. package/lib/SyntheticClipboardEvent.js +1 -1
  102. package/lib/SyntheticCompositionEvent.js +1 -1
  103. package/lib/SyntheticDragEvent.js +1 -1
  104. package/lib/SyntheticEvent.js +3 -3
  105. package/lib/SyntheticFocusEvent.js +1 -1
  106. package/lib/SyntheticInputEvent.js +1 -1
  107. package/lib/SyntheticKeyboardEvent.js +4 -4
  108. package/lib/SyntheticMouseEvent.js +3 -3
  109. package/lib/SyntheticTouchEvent.js +2 -2
  110. package/lib/SyntheticUIEvent.js +2 -2
  111. package/lib/SyntheticWheelEvent.js +1 -1
  112. package/lib/TapEventPlugin.js +119 -0
  113. package/lib/Transaction.js +6 -6
  114. package/lib/accumulate.js +44 -0
  115. package/lib/accumulateInto.js +2 -2
  116. package/lib/adler32.js +19 -7
  117. package/lib/cloneWithProps.js +11 -6
  118. package/lib/createHierarchyRenderer.js +85 -0
  119. package/lib/dangerousStyleValue.js +1 -1
  120. package/lib/deprecated.js +4 -4
  121. package/lib/findDOMNode.js +9 -9
  122. package/lib/flattenChildren.js +4 -4
  123. package/lib/getEventKey.js +1 -1
  124. package/lib/getTestDocument.js +28 -0
  125. package/lib/getTextContentAccessor.js +1 -1
  126. package/lib/instantiateReactComponent.js +12 -12
  127. package/lib/isEventSupported.js +1 -1
  128. package/lib/onlyChild.js +3 -3
  129. package/lib/quoteAttributeValueForBrowser.js +1 -1
  130. package/lib/reactComponentExpect.js +210 -0
  131. package/lib/renderSubtreeIntoContainer.js +1 -1
  132. package/lib/setInnerHTML.js +1 -1
  133. package/lib/setTextContent.js +3 -3
  134. package/lib/shallowCompare.js +1 -1
  135. package/lib/sliceChildren.js +51 -0
  136. package/lib/traverseAllChildren.js +14 -13
  137. package/lib/update.js +13 -13
  138. package/lib/validateDOMNesting.js +6 -6
  139. package/lib/webcomponents.js +6379 -0
  140. package/package.json +4 -6
  141. package/react.js +1 -1
  142. package/lib/CSSCore.js +0 -97
  143. package/lib/EventListener.js +0 -84
  144. package/lib/ExecutionEnvironment.js +0 -38
  145. package/lib/ReactDOMClient.js +0 -90
  146. package/lib/camelize.js +0 -32
  147. package/lib/camelizeStyleName.js +0 -40
  148. package/lib/containsNode.js +0 -55
  149. package/lib/createArrayFromMixed.js +0 -85
  150. package/lib/createNodesFromMarkup.js +0 -84
  151. package/lib/emptyFunction.js +0 -38
  152. package/lib/emptyObject.js +0 -20
  153. package/lib/focusNode.js +0 -26
  154. package/lib/getActiveElement.js +0 -29
  155. package/lib/getMarkupWrap.js +0 -93
  156. package/lib/getUnboundedScrollPosition.js +0 -38
  157. package/lib/hyphenate.js +0 -33
  158. package/lib/hyphenateStyleName.js +0 -39
  159. package/lib/invariant.js +0 -49
  160. package/lib/isNode.js +0 -23
  161. package/lib/isTextNode.js +0 -25
  162. package/lib/keyMirror.js +0 -48
  163. package/lib/keyOf.js +0 -35
  164. package/lib/mapObject.js +0 -51
  165. package/lib/performance.js +0 -23
  166. package/lib/performanceNow.js +0 -28
  167. package/lib/shallowEqual.js +0 -48
  168. package/lib/toArray.js +0 -57
  169. package/lib/warning.js +0 -57
@@ -12,7 +12,7 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- var CSSProperty = require("./CSSProperty");
15
+ var CSSProperty = require('./CSSProperty');
16
16
 
17
17
  var isUnitlessNumber = CSSProperty.isUnitlessNumber;
18
18
 
package/lib/deprecated.js CHANGED
@@ -11,8 +11,8 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- var assign = require("./Object.assign");
15
- var warning = require("./warning");
14
+ var assign = require('./Object.assign');
15
+ var warning = require('fbjs/lib/warning');
16
16
 
17
17
  /**
18
18
  * This will log a single deprecation notice per function and forward the call
@@ -26,9 +26,9 @@ var warning = require("./warning");
26
26
  */
27
27
  function deprecated(fnName, newModule, ctx, fn) {
28
28
  var warned = false;
29
- if ('production' !== process.env.NODE_ENV) {
29
+ if (process.env.NODE_ENV !== 'production') {
30
30
  var newFn = function () {
31
- 'production' !== process.env.NODE_ENV ? warning(warned,
31
+ process.env.NODE_ENV !== 'production' ? warning(warned,
32
32
  // Require examples in this string must be split to prevent React's
33
33
  // build tools from mistaking them for real requires.
34
34
  // Otherwise the build tools will attempt to build a '%s' module.
@@ -12,12 +12,12 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- var ReactCurrentOwner = require("./ReactCurrentOwner");
16
- var ReactInstanceMap = require("./ReactInstanceMap");
17
- var ReactMount = require("./ReactMount");
15
+ var ReactCurrentOwner = require('./ReactCurrentOwner');
16
+ var ReactInstanceMap = require('./ReactInstanceMap');
17
+ var ReactMount = require('./ReactMount');
18
18
 
19
- var invariant = require("./invariant");
20
- var warning = require("./warning");
19
+ var invariant = require('fbjs/lib/invariant');
20
+ var warning = require('fbjs/lib/warning');
21
21
 
22
22
  /**
23
23
  * Returns the DOM node rendered by this element.
@@ -26,10 +26,10 @@ var warning = require("./warning");
26
26
  * @return {?DOMElement} The root node of this element.
27
27
  */
28
28
  function findDOMNode(componentOrElement) {
29
- if ('production' !== process.env.NODE_ENV) {
29
+ if (process.env.NODE_ENV !== 'production') {
30
30
  var owner = ReactCurrentOwner.current;
31
31
  if (owner !== null) {
32
- 'production' !== process.env.NODE_ENV ? warning(owner._warnedAboutRefsInRender, '%s is accessing getDOMNode or findDOMNode inside its render(). ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', owner.getName() || 'A component') : undefined;
32
+ process.env.NODE_ENV !== 'production' ? warning(owner._warnedAboutRefsInRender, '%s is accessing getDOMNode or findDOMNode inside its render(). ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', owner.getName() || 'A component') : undefined;
33
33
  owner._warnedAboutRefsInRender = true;
34
34
  }
35
35
  }
@@ -42,8 +42,8 @@ function findDOMNode(componentOrElement) {
42
42
  if (ReactInstanceMap.has(componentOrElement)) {
43
43
  return ReactMount.getNodeFromInstance(componentOrElement);
44
44
  }
45
- !(componentOrElement.render == null || typeof componentOrElement.render !== 'function') ? 'production' !== process.env.NODE_ENV ? invariant(false, 'Component (with keys: %s) contains `render` method ' + 'but is not mounted in the DOM', Object.keys(componentOrElement)) : invariant(false) : undefined;
46
- !false ? 'production' !== process.env.NODE_ENV ? invariant(false, 'Element appears to be neither ReactComponent nor DOMNode (keys: %s)', Object.keys(componentOrElement)) : invariant(false) : undefined;
45
+ !(componentOrElement.render == null || typeof componentOrElement.render !== 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Component (with keys: %s) contains `render` method ' + 'but is not mounted in the DOM', Object.keys(componentOrElement)) : invariant(false) : undefined;
46
+ !false ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Element appears to be neither ReactComponent nor DOMNode (keys: %s)', Object.keys(componentOrElement)) : invariant(false) : undefined;
47
47
  }
48
48
 
49
49
  module.exports = findDOMNode;
@@ -11,8 +11,8 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- var traverseAllChildren = require("./traverseAllChildren");
15
- var warning = require("./warning");
14
+ var traverseAllChildren = require('./traverseAllChildren');
15
+ var warning = require('fbjs/lib/warning');
16
16
 
17
17
  /**
18
18
  * @param {function} traverseContext Context passed through traversal.
@@ -23,8 +23,8 @@ function flattenSingleChildIntoContext(traverseContext, child, name) {
23
23
  // We found a component instance.
24
24
  var result = traverseContext;
25
25
  var keyUnique = result[name] === undefined;
26
- if ('production' !== process.env.NODE_ENV) {
27
- 'production' !== process.env.NODE_ENV ? warning(keyUnique, 'flattenChildren(...): Encountered two children with the same key, ' + '`%s`. Child keys must be unique; when two children share a key, only ' + 'the first child will be used.', name) : undefined;
26
+ if (process.env.NODE_ENV !== 'production') {
27
+ process.env.NODE_ENV !== 'production' ? warning(keyUnique, 'flattenChildren(...): Encountered two children with the same key, ' + '`%s`. Child keys must be unique; when two children share a key, only ' + 'the first child will be used.', name) : undefined;
28
28
  }
29
29
  if (keyUnique && child != null) {
30
30
  result[name] = child;
@@ -12,7 +12,7 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- var getEventCharCode = require("./getEventCharCode");
15
+ var getEventCharCode = require('./getEventCharCode');
16
16
 
17
17
  /**
18
18
  * Normalization of deprecated HTML5 `key` values
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Copyright 2013-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 getTestDocument
10
+ */
11
+
12
+ 'use strict';
13
+
14
+ function getTestDocument(markup) {
15
+ var iframe = document.createElement('iframe');
16
+ iframe.style.display = 'none';
17
+ document.body.appendChild(iframe);
18
+
19
+ var testDocument = iframe.contentDocument || iframe.contentWindow.document;
20
+ testDocument.open();
21
+ testDocument.write(markup || '<!doctype html><html><meta charset=utf-8><title>test doc</title>');
22
+ testDocument.close();
23
+
24
+ iframe.parentNode.removeChild(iframe);
25
+ return testDocument;
26
+ }
27
+
28
+ module.exports = getTestDocument;
@@ -11,7 +11,7 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- var ExecutionEnvironment = require("./ExecutionEnvironment");
14
+ var ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');
15
15
 
16
16
  var contentKey = null;
17
17
 
@@ -12,13 +12,13 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- var ReactCompositeComponent = require("./ReactCompositeComponent");
16
- var ReactEmptyComponent = require("./ReactEmptyComponent");
17
- var ReactNativeComponent = require("./ReactNativeComponent");
15
+ var ReactCompositeComponent = require('./ReactCompositeComponent');
16
+ var ReactEmptyComponent = require('./ReactEmptyComponent');
17
+ var ReactNativeComponent = require('./ReactNativeComponent');
18
18
 
19
- var assign = require("./Object.assign");
20
- var invariant = require("./invariant");
21
- var warning = require("./warning");
19
+ var assign = require('./Object.assign');
20
+ var invariant = require('fbjs/lib/invariant');
21
+ var warning = require('fbjs/lib/warning');
22
22
 
23
23
  // To avoid a cyclic dependency, we create the final class in this module
24
24
  var ReactCompositeComponentWrapper = function () {};
@@ -63,7 +63,7 @@ function instantiateReactComponent(node) {
63
63
 
64
64
  if (typeof node === 'object') {
65
65
  var element = node;
66
- !(element && (typeof element.type === 'function' || typeof element.type === 'string')) ? 'production' !== process.env.NODE_ENV ? invariant(false, 'Element type is invalid: expected a string (for built-in components) ' + 'or a class/function (for composite components) but got: %s.%s', element.type == null ? element.type : typeof element.type, getDeclarationErrorAddendum(element._owner)) : invariant(false) : undefined;
66
+ !(element && (typeof element.type === 'function' || typeof element.type === 'string')) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Element type is invalid: expected a string (for built-in components) ' + 'or a class/function (for composite components) but got: %s.%s', element.type == null ? element.type : typeof element.type, getDeclarationErrorAddendum(element._owner)) : invariant(false) : undefined;
67
67
 
68
68
  // Special case string values
69
69
  if (typeof element.type === 'string') {
@@ -79,11 +79,11 @@ function instantiateReactComponent(node) {
79
79
  } else if (typeof node === 'string' || typeof node === 'number') {
80
80
  instance = ReactNativeComponent.createInstanceForText(node);
81
81
  } else {
82
- !false ? 'production' !== process.env.NODE_ENV ? invariant(false, 'Encountered invalid React node of type %s', typeof node) : invariant(false) : undefined;
82
+ !false ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Encountered invalid React node of type %s', typeof node) : invariant(false) : undefined;
83
83
  }
84
84
 
85
- if ('production' !== process.env.NODE_ENV) {
86
- 'production' !== process.env.NODE_ENV ? warning(typeof instance.construct === 'function' && typeof instance.mountComponent === 'function' && typeof instance.receiveComponent === 'function' && typeof instance.unmountComponent === 'function', 'Only React Components can be mounted.') : undefined;
85
+ if (process.env.NODE_ENV !== 'production') {
86
+ process.env.NODE_ENV !== 'production' ? warning(typeof instance.construct === 'function' && typeof instance.mountComponent === 'function' && typeof instance.receiveComponent === 'function' && typeof instance.unmountComponent === 'function', 'Only React Components can be mounted.') : undefined;
87
87
  }
88
88
 
89
89
  // Sets up the instance. This can probably just move into the constructor now.
@@ -95,14 +95,14 @@ function instantiateReactComponent(node) {
95
95
  instance._mountIndex = 0;
96
96
  instance._mountImage = null;
97
97
 
98
- if ('production' !== process.env.NODE_ENV) {
98
+ if (process.env.NODE_ENV !== 'production') {
99
99
  instance._isOwnerNecessary = false;
100
100
  instance._warnedAboutRefsInRender = false;
101
101
  }
102
102
 
103
103
  // Internal instances should fully constructed at this point, so they should
104
104
  // not get any new fields added to them at this point.
105
- if ('production' !== process.env.NODE_ENV) {
105
+ if (process.env.NODE_ENV !== 'production') {
106
106
  if (Object.preventExtensions) {
107
107
  Object.preventExtensions(instance);
108
108
  }
@@ -11,7 +11,7 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- var ExecutionEnvironment = require("./ExecutionEnvironment");
14
+ var ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');
15
15
 
16
16
  var useHasFeature;
17
17
  if (ExecutionEnvironment.canUseDOM) {
package/lib/onlyChild.js CHANGED
@@ -10,9 +10,9 @@
10
10
  */
11
11
  'use strict';
12
12
 
13
- var ReactElement = require("./ReactElement");
13
+ var ReactElement = require('./ReactElement');
14
14
 
15
- var invariant = require("./invariant");
15
+ var invariant = require('fbjs/lib/invariant');
16
16
 
17
17
  /**
18
18
  * Returns the first child in a collection of children and verifies that there
@@ -26,7 +26,7 @@ var invariant = require("./invariant");
26
26
  * structure.
27
27
  */
28
28
  function onlyChild(children) {
29
- !ReactElement.isValidElement(children) ? 'production' !== process.env.NODE_ENV ? invariant(false, 'onlyChild must be passed a children with exactly one child.') : invariant(false) : undefined;
29
+ !ReactElement.isValidElement(children) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'onlyChild must be passed a children with exactly one child.') : invariant(false) : undefined;
30
30
  return children;
31
31
  }
32
32
 
@@ -11,7 +11,7 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- var escapeTextContentForBrowser = require("./escapeTextContentForBrowser");
14
+ var escapeTextContentForBrowser = require('./escapeTextContentForBrowser');
15
15
 
16
16
  /**
17
17
  * Escapes attribute value to prevent scripting attacks.
@@ -0,0 +1,210 @@
1
+ /**
2
+ * Copyright 2013-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 reactComponentExpect
10
+ * @nolint
11
+ */
12
+
13
+ 'use strict';
14
+
15
+ var ReactInstanceMap = require('./ReactInstanceMap');
16
+ var ReactTestUtils = require('./ReactTestUtils');
17
+
18
+ var assign = require('./Object.assign');
19
+ var invariant = require('fbjs/lib/invariant');
20
+
21
+ function reactComponentExpect(instance) {
22
+ if (instance instanceof reactComponentExpectInternal) {
23
+ return instance;
24
+ }
25
+
26
+ if (!(this instanceof reactComponentExpect)) {
27
+ return new reactComponentExpect(instance);
28
+ }
29
+
30
+ expect(instance).not.toBeNull();
31
+
32
+ !ReactTestUtils.isCompositeComponent(instance) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'reactComponentExpect(...): instance must be a composite component') : invariant(false) : undefined;
33
+ var internalInstance = ReactInstanceMap.get(instance);
34
+
35
+ expect(typeof internalInstance).toBe('object');
36
+ expect(typeof internalInstance.constructor).toBe('function');
37
+ expect(ReactTestUtils.isElement(internalInstance)).toBe(false);
38
+
39
+ return new reactComponentExpectInternal(internalInstance);
40
+ }
41
+
42
+ function reactComponentExpectInternal(internalInstance) {
43
+ this._instance = internalInstance;
44
+ }
45
+
46
+ assign(reactComponentExpectInternal.prototype, {
47
+ // Getters -------------------------------------------------------------------
48
+
49
+ /**
50
+ * @instance: Retrieves the backing instance.
51
+ */
52
+ instance: function () {
53
+ return this._instance.getPublicInstance();
54
+ },
55
+
56
+ /**
57
+ * There are two types of components in the world.
58
+ * - A component created via React.createClass() - Has a single child
59
+ * subComponent - the return value from the .render() function. This
60
+ * function @subComponent expects that this._instance is component created
61
+ * with React.createClass().
62
+ * - A primitive DOM component - which has many renderedChildren, each of
63
+ * which may have a name that is unique with respect to its siblings. This
64
+ * method will fail if this._instance is a primitive component.
65
+ *
66
+ * TL;DR: An instance may have a subComponent (this._renderedComponent) or
67
+ * renderedChildren, but never both. Neither will actually show up until you
68
+ * render the component (simply instantiating is not enough).
69
+ */
70
+ expectRenderedChild: function () {
71
+ this.toBeCompositeComponent();
72
+ var child = this._instance._renderedComponent;
73
+ // TODO: Hide ReactEmptyComponent instances here?
74
+ return new reactComponentExpectInternal(child);
75
+ },
76
+
77
+ /**
78
+ * The nth child of a DOMish component instance that is not falsy.
79
+ */
80
+ expectRenderedChildAt: function (childIndex) {
81
+ // Currently only dom components have arrays of children, but that will
82
+ // change soon.
83
+ this.toBeDOMComponent();
84
+ var renderedChildren = this._instance._renderedChildren || {};
85
+ for (var name in renderedChildren) {
86
+ if (!renderedChildren.hasOwnProperty(name)) {
87
+ continue;
88
+ }
89
+ if (renderedChildren[name]) {
90
+ if (renderedChildren[name]._mountIndex === childIndex) {
91
+ return new reactComponentExpectInternal(renderedChildren[name]);
92
+ }
93
+ }
94
+ }
95
+ throw new Error('Child:' + childIndex + ' is not found');
96
+ },
97
+
98
+ toBeDOMComponentWithChildCount: function (count) {
99
+ this.toBeDOMComponent();
100
+ var renderedChildren = this._instance._renderedChildren;
101
+ expect(renderedChildren).toBeTruthy();
102
+ expect(Object.keys(renderedChildren).length).toBe(count);
103
+ return this;
104
+ },
105
+
106
+ toBeDOMComponentWithNoChildren: function () {
107
+ this.toBeDOMComponent();
108
+ expect(this._instance._renderedChildren).toBeFalsy();
109
+ return this;
110
+ },
111
+
112
+ // Matchers ------------------------------------------------------------------
113
+
114
+ toBeComponentOfType: function (constructor) {
115
+ expect(this._instance._currentElement.type === constructor).toBe(true);
116
+ return this;
117
+ },
118
+
119
+ /**
120
+ * A component that is created with React.createClass. Just duck typing
121
+ * here.
122
+ */
123
+ toBeCompositeComponent: function () {
124
+ expect(typeof this.instance() === 'object' && typeof this.instance().render === 'function').toBe(true);
125
+ return this;
126
+ },
127
+
128
+ toBeCompositeComponentWithType: function (constructor) {
129
+ this.toBeCompositeComponent();
130
+ expect(this._instance._currentElement.type === constructor).toBe(true);
131
+ return this;
132
+ },
133
+
134
+ toBeTextComponentWithValue: function (val) {
135
+ var elementType = typeof this._instance._currentElement;
136
+ expect(elementType === 'string' || elementType === 'number').toBe(true);
137
+ expect(this._instance._stringText).toBe(val);
138
+ return this;
139
+ },
140
+
141
+ toBePresent: function () {
142
+ expect(this.instance()).toBeTruthy();
143
+ return this;
144
+ },
145
+
146
+ /**
147
+ * A terminal type of component representing some virtual dom node. Just duck
148
+ * typing here.
149
+ */
150
+ toBeDOMComponent: function () {
151
+ expect(ReactTestUtils.isDOMComponent(this.instance())).toBe(true);
152
+ return this;
153
+ },
154
+
155
+ /**
156
+ * @deprecated
157
+ * @see toBeComponentOfType
158
+ */
159
+ toBeDOMComponentWithTag: function (tag) {
160
+ this.toBeDOMComponent();
161
+ expect(this.instance().tagName).toBe(tag.toUpperCase());
162
+ return this;
163
+ },
164
+
165
+ /**
166
+ * Check that internal state values are equal to a state of expected values.
167
+ */
168
+ scalarStateEqual: function (stateNameToExpectedValue) {
169
+ expect(this.instance()).toBeTruthy();
170
+ for (var stateName in stateNameToExpectedValue) {
171
+ if (!stateNameToExpectedValue.hasOwnProperty(stateName)) {
172
+ continue;
173
+ }
174
+ expect(this.instance().state[stateName]).toEqual(stateNameToExpectedValue[stateName]);
175
+ }
176
+ return this;
177
+ },
178
+
179
+ /**
180
+ * Check a set of props are equal to a set of expected values - only works
181
+ * with scalars.
182
+ */
183
+ scalarPropsEqual: function (propNameToExpectedValue) {
184
+ expect(this.instance()).toBeTruthy();
185
+ for (var propName in propNameToExpectedValue) {
186
+ if (!propNameToExpectedValue.hasOwnProperty(propName)) {
187
+ continue;
188
+ }
189
+ expect(this.instance().props[propName]).toEqual(propNameToExpectedValue[propName]);
190
+ }
191
+ return this;
192
+ },
193
+
194
+ /**
195
+ * Check a set of props are equal to a set of expected values - only works
196
+ * with scalars.
197
+ */
198
+ scalarContextEqual: function (contextNameToExpectedValue) {
199
+ expect(this.instance()).toBeTruthy();
200
+ for (var contextName in contextNameToExpectedValue) {
201
+ if (!contextNameToExpectedValue.hasOwnProperty(contextName)) {
202
+ continue;
203
+ }
204
+ expect(this.instance().context[contextName]).toEqual(contextNameToExpectedValue[contextName]);
205
+ }
206
+ return this;
207
+ }
208
+ });
209
+
210
+ module.exports = reactComponentExpect;