react 0.7.1 → 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 (203) hide show
  1. package/README.md +15 -228
  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 -31
  132. package/react.js +4 -0
  133. package/.npmignore +0 -7
  134. package/.travis.yml +0 -7
  135. package/Jakefile.js +0 -39
  136. package/LICENSE +0 -19
  137. package/browser-test/dist.html +0 -90
  138. package/browser-test/index.html +0 -86
  139. package/browser-test/min.html +0 -90
  140. package/dist/react.js +0 -3141
  141. package/dist/react.min.js +0 -22
  142. package/doc/advanced.md +0 -175
  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 -120
  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 -89
  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 -101
  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 -113
  176. package/lib/when-task.js +0 -84
  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 -352
  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/log-events.mocha.js +0 -88
  189. package/test/mocha.opts +0 -2
  190. package/test/module-use.mocha.js +0 -164
  191. package/test/promise-auto-resolve.mocha.js +0 -68
  192. package/test/ret-task.mocha.js +0 -220
  193. package/test/task.mocha.js +0 -42
  194. package/test/validate-cb-task.mocha.js +0 -100
  195. package/test/validate-ret-task.mocha.js +0 -110
  196. package/test/validate.mocha.js +0 -324
  197. package/test/vcon.mocha.js +0 -193
  198. package/vendor/chai/chai.js +0 -4251
  199. package/vendor/jquery/jquery-1.7.1.js +0 -9266
  200. package/vendor/jquery/jquery-1.7.1.min.js +0 -4
  201. package/vendor/node/util.js +0 -531
  202. package/vendor/requirejs/require.js +0 -2045
  203. package/vendor/requirejs/require.min.js +0 -36
@@ -0,0 +1,189 @@
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 ReactDOMSelection
17
+ */
18
+
19
+ "use strict";
20
+
21
+ var getNodeForCharacterOffset = require("./getNodeForCharacterOffset");
22
+ var getTextContentAccessor = require("./getTextContentAccessor");
23
+
24
+ /**
25
+ * Get the appropriate anchor and focus node/offset pairs for IE.
26
+ *
27
+ * The catch here is that IE's selection API doesn't provide information
28
+ * about whether the selection is forward or backward, so we have to
29
+ * behave as though it's always forward.
30
+ *
31
+ * IE text differs from modern selection in that it behaves as though
32
+ * block elements end with a new line. This means character offsets will
33
+ * differ between the two APIs.
34
+ *
35
+ * @param {DOMElement} node
36
+ * @return {object}
37
+ */
38
+ function getIEOffsets(node) {
39
+ var selection = document.selection;
40
+ var selectedRange = selection.createRange();
41
+ var selectedLength = selectedRange.text.length;
42
+
43
+ // Duplicate selection so we can move range without breaking user selection.
44
+ var fromStart = selectedRange.duplicate();
45
+ fromStart.moveToElementText(node);
46
+ fromStart.setEndPoint('EndToStart', selectedRange);
47
+
48
+ var startOffset = fromStart.text.length;
49
+ var endOffset = startOffset + selectedLength;
50
+
51
+ return {
52
+ start: startOffset,
53
+ end: endOffset
54
+ };
55
+ }
56
+
57
+ /**
58
+ * @param {DOMElement} node
59
+ * @return {?object}
60
+ */
61
+ function getModernOffsets(node) {
62
+ var selection = window.getSelection();
63
+
64
+ if (selection.rangeCount === 0) {
65
+ return null;
66
+ }
67
+
68
+ var anchorNode = selection.anchorNode;
69
+ var anchorOffset = selection.anchorOffset;
70
+ var focusNode = selection.focusNode;
71
+ var focusOffset = selection.focusOffset;
72
+
73
+ var currentRange = selection.getRangeAt(0);
74
+ var rangeLength = currentRange.toString().length;
75
+
76
+ var tempRange = currentRange.cloneRange();
77
+ tempRange.selectNodeContents(node);
78
+ tempRange.setEnd(currentRange.startContainer, currentRange.startOffset);
79
+
80
+ var start = tempRange.toString().length;
81
+ var end = start + rangeLength;
82
+
83
+ // Detect whether the selection is backward.
84
+ var detectionRange = document.createRange();
85
+ detectionRange.setStart(anchorNode, anchorOffset);
86
+ detectionRange.setEnd(focusNode, focusOffset);
87
+ var isBackward = detectionRange.collapsed;
88
+ detectionRange.detach();
89
+
90
+ return {
91
+ start: isBackward ? end : start,
92
+ end: isBackward ? start : end
93
+ };
94
+ }
95
+
96
+ /**
97
+ * @param {DOMElement|DOMTextNode} node
98
+ * @param {object} offsets
99
+ */
100
+ function setIEOffsets(node, offsets) {
101
+ var range = document.selection.createRange().duplicate();
102
+ var start, end;
103
+
104
+ if (typeof offsets.end === 'undefined') {
105
+ start = offsets.start;
106
+ end = start;
107
+ } else if (offsets.start > offsets.end) {
108
+ start = offsets.end;
109
+ end = offsets.start;
110
+ } else {
111
+ start = offsets.start;
112
+ end = offsets.end;
113
+ }
114
+
115
+ range.moveToElementText(node);
116
+ range.moveStart('character', start);
117
+ range.setEndPoint('EndToStart', range);
118
+ range.moveEnd('character', end - start);
119
+ range.select();
120
+ }
121
+
122
+ /**
123
+ * In modern non-IE browsers, we can support both forward and backward
124
+ * selections.
125
+ *
126
+ * Note: IE10+ supports the Selection object, but it does not support
127
+ * the `extend` method, which means that even in modern IE, it's not possible
128
+ * to programatically create a backward selection. Thus, for all IE
129
+ * versions, we use the old IE API to create our selections.
130
+ *
131
+ * @param {DOMElement|DOMTextNode} node
132
+ * @param {object} offsets
133
+ */
134
+ function setModernOffsets(node, offsets) {
135
+ var selection = window.getSelection();
136
+
137
+ var length = node[getTextContentAccessor()].length;
138
+ var start = Math.min(offsets.start, length);
139
+ var end = typeof offsets.end === 'undefined' ?
140
+ start : Math.min(offsets.end, length);
141
+
142
+ // IE 11 uses modern selection, but doesn't support the extend method.
143
+ // Flip backward selections, so we can set with a single range.
144
+ if (!selection.extend && start > end) {
145
+ var temp = end;
146
+ end = start;
147
+ start = temp;
148
+ }
149
+
150
+ var startMarker = getNodeForCharacterOffset(node, start);
151
+ var endMarker = getNodeForCharacterOffset(node, end);
152
+
153
+ if (startMarker && endMarker) {
154
+ var range = document.createRange();
155
+ range.setStart(startMarker.node, startMarker.offset);
156
+ selection.removeAllRanges();
157
+
158
+ if (start > end) {
159
+ selection.addRange(range);
160
+ selection.extend(endMarker.node, endMarker.offset);
161
+ } else {
162
+ range.setEnd(endMarker.node, endMarker.offset);
163
+ selection.addRange(range);
164
+ }
165
+
166
+ range.detach();
167
+ }
168
+ }
169
+
170
+ var ReactDOMSelection = {
171
+ /**
172
+ * @param {DOMElement} node
173
+ */
174
+ getOffsets: function(node) {
175
+ var getOffsets = document.selection ? getIEOffsets : getModernOffsets;
176
+ return getOffsets(node);
177
+ },
178
+
179
+ /**
180
+ * @param {DOMElement|DOMTextNode} node
181
+ * @param {object} offsets
182
+ */
183
+ setOffsets: function(node, offsets) {
184
+ var setOffsets = document.selection ? setIEOffsets : setModernOffsets;
185
+ setOffsets(node, offsets);
186
+ }
187
+ };
188
+
189
+ module.exports = ReactDOMSelection;
@@ -0,0 +1,136 @@
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 ReactDOMTextarea
17
+ */
18
+
19
+ "use strict";
20
+
21
+ var DOMPropertyOperations = require("./DOMPropertyOperations");
22
+ var LinkedValueMixin = require("./LinkedValueMixin");
23
+ var ReactCompositeComponent = require("./ReactCompositeComponent");
24
+ var ReactDOM = require("./ReactDOM");
25
+
26
+ var invariant = require("./invariant");
27
+ var merge = require("./merge");
28
+
29
+ // Store a reference to the <textarea> `ReactDOMComponent`.
30
+ var textarea = ReactDOM.textarea;
31
+
32
+ /**
33
+ * Implements a <textarea> native component that allows setting `value`, and
34
+ * `defaultValue`. This differs from the traditional DOM API because value is
35
+ * usually set as PCDATA children.
36
+ *
37
+ * If `value` is not supplied (or null/undefined), user actions that affect the
38
+ * value will trigger updates to the element.
39
+ *
40
+ * If `value` is supplied (and not null/undefined), the rendered element will
41
+ * not trigger updates to the element. Instead, the `value` prop must change in
42
+ * order for the rendered element to be updated.
43
+ *
44
+ * The rendered element will be initialized with an empty value, the prop
45
+ * `defaultValue` if specified, or the children content (deprecated).
46
+ */
47
+ var ReactDOMTextarea = ReactCompositeComponent.createClass({
48
+ mixins: [LinkedValueMixin],
49
+
50
+ getInitialState: function() {
51
+ var defaultValue = this.props.defaultValue;
52
+ // TODO (yungsters): Remove support for children content in <textarea>.
53
+ var children = this.props.children;
54
+ if (children != null) {
55
+ if ("production" !== process.env.NODE_ENV) {
56
+ console.warn(
57
+ 'Use the `defaultValue` or `value` props instead of setting ' +
58
+ 'children on <textarea>.'
59
+ );
60
+ }
61
+ ("production" !== process.env.NODE_ENV ? invariant(
62
+ defaultValue == null,
63
+ 'If you supply `defaultValue` on a <textarea>, do not pass children.'
64
+ ) : invariant(defaultValue == null));
65
+ if (Array.isArray(children)) {
66
+ ("production" !== process.env.NODE_ENV ? invariant(
67
+ children.length <= 1,
68
+ '<textarea> can only have at most one child.'
69
+ ) : invariant(children.length <= 1));
70
+ children = children[0];
71
+ }
72
+
73
+ defaultValue = '' + children;
74
+ }
75
+ if (defaultValue == null) {
76
+ defaultValue = '';
77
+ }
78
+ var value = this.getValue();
79
+ return {
80
+ // We save the initial value so that `ReactDOMComponent` doesn't update
81
+ // `textContent` (unnecessary since we update value).
82
+ // The initial value can be a boolean or object so that's why it's
83
+ // forced to be a string.
84
+ initialValue: '' + (value != null ? value : defaultValue),
85
+ value: defaultValue
86
+ };
87
+ },
88
+
89
+ shouldComponentUpdate: function() {
90
+ // Defer any updates to this component during the `onChange` handler.
91
+ return !this._isChanging;
92
+ },
93
+
94
+ render: function() {
95
+ // Clone `this.props` so we don't mutate the input.
96
+ var props = merge(this.props);
97
+ var value = this.getValue();
98
+
99
+ ("production" !== process.env.NODE_ENV ? invariant(
100
+ props.dangerouslySetInnerHTML == null,
101
+ '`dangerouslySetInnerHTML` does not make sense on <textarea>.'
102
+ ) : invariant(props.dangerouslySetInnerHTML == null));
103
+
104
+ props.defaultValue = null;
105
+ props.value = value != null ? value : this.state.value;
106
+ props.onChange = this._handleChange;
107
+
108
+ // Always set children to the same thing. In IE9, the selection range will
109
+ // get reset if `textContent` is mutated.
110
+ return textarea(props, this.state.initialValue);
111
+ },
112
+
113
+ componentDidUpdate: function(prevProps, prevState, rootNode) {
114
+ var value = this.getValue();
115
+ if (value != null) {
116
+ // Cast `value` to a string to ensure the value is set correctly. While
117
+ // browsers typically do this as necessary, jsdom doesn't.
118
+ DOMPropertyOperations.setValueForProperty(rootNode, 'value', '' + value);
119
+ }
120
+ },
121
+
122
+ _handleChange: function(event) {
123
+ var returnValue;
124
+ var onChange = this.getOnChange();
125
+ if (onChange) {
126
+ this._isChanging = true;
127
+ returnValue = onChange(event);
128
+ this._isChanging = false;
129
+ }
130
+ this.setState({value: event.target.value});
131
+ return returnValue;
132
+ }
133
+
134
+ });
135
+
136
+ module.exports = ReactDOMTextarea;
@@ -0,0 +1,75 @@
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 ReactDefaultBatchingStrategy
17
+ */
18
+
19
+ "use strict";
20
+
21
+ var ReactUpdates = require("./ReactUpdates");
22
+ var Transaction = require("./Transaction");
23
+
24
+ var emptyFunction = require("./emptyFunction");
25
+ var mixInto = require("./mixInto");
26
+
27
+ var RESET_BATCHED_UPDATES = {
28
+ initialize: emptyFunction,
29
+ close: function() {
30
+ ReactDefaultBatchingStrategy.isBatchingUpdates = false;
31
+ }
32
+ };
33
+
34
+ var FLUSH_BATCHED_UPDATES = {
35
+ initialize: emptyFunction,
36
+ close: ReactUpdates.flushBatchedUpdates.bind(ReactUpdates)
37
+ };
38
+
39
+ var TRANSACTION_WRAPPERS = [FLUSH_BATCHED_UPDATES, RESET_BATCHED_UPDATES];
40
+
41
+ function ReactDefaultBatchingStrategyTransaction() {
42
+ this.reinitializeTransaction();
43
+ }
44
+
45
+ mixInto(ReactDefaultBatchingStrategyTransaction, Transaction.Mixin);
46
+ mixInto(ReactDefaultBatchingStrategyTransaction, {
47
+ getTransactionWrappers: function() {
48
+ return TRANSACTION_WRAPPERS;
49
+ }
50
+ });
51
+
52
+ var transaction = new ReactDefaultBatchingStrategyTransaction();
53
+
54
+ var ReactDefaultBatchingStrategy = {
55
+ isBatchingUpdates: false,
56
+
57
+ /**
58
+ * Call the provided function in a context within which calls to `setState`
59
+ * and friends are batched such that components aren't updated unnecessarily.
60
+ */
61
+ batchedUpdates: function(callback, param) {
62
+ var alreadyBatchingUpdates = ReactDefaultBatchingStrategy.isBatchingUpdates;
63
+
64
+ ReactDefaultBatchingStrategy.isBatchingUpdates = true;
65
+
66
+ // The code is written this way to avoid extra allocations
67
+ if (alreadyBatchingUpdates) {
68
+ callback(param);
69
+ } else {
70
+ transaction.perform(callback, null, param);
71
+ }
72
+ }
73
+ };
74
+
75
+ module.exports = ReactDefaultBatchingStrategy;
@@ -0,0 +1,91 @@
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 ReactDefaultInjection
17
+ */
18
+
19
+ "use strict";
20
+
21
+ var ReactDOM = require("./ReactDOM");
22
+ var ReactDOMButton = require("./ReactDOMButton");
23
+ var ReactDOMForm = require("./ReactDOMForm");
24
+ var ReactDOMInput = require("./ReactDOMInput");
25
+ var ReactDOMOption = require("./ReactDOMOption");
26
+ var ReactDOMSelect = require("./ReactDOMSelect");
27
+ var ReactDOMTextarea = require("./ReactDOMTextarea");
28
+ var ReactEventEmitter = require("./ReactEventEmitter");
29
+ var ReactEventTopLevelCallback = require("./ReactEventTopLevelCallback");
30
+ var ReactPerf = require("./ReactPerf");
31
+
32
+ var DefaultDOMPropertyConfig = require("./DefaultDOMPropertyConfig");
33
+ var DOMProperty = require("./DOMProperty");
34
+
35
+ var ChangeEventPlugin = require("./ChangeEventPlugin");
36
+ var CompositionEventPlugin = require("./CompositionEventPlugin");
37
+ var DefaultEventPluginOrder = require("./DefaultEventPluginOrder");
38
+ var EnterLeaveEventPlugin = require("./EnterLeaveEventPlugin");
39
+ var EventPluginHub = require("./EventPluginHub");
40
+ var MobileSafariClickEventPlugin = require("./MobileSafariClickEventPlugin");
41
+ var ReactInstanceHandles = require("./ReactInstanceHandles");
42
+ var SelectEventPlugin = require("./SelectEventPlugin");
43
+ var SimpleEventPlugin = require("./SimpleEventPlugin");
44
+
45
+ var ReactDefaultBatchingStrategy = require("./ReactDefaultBatchingStrategy");
46
+ var ReactUpdates = require("./ReactUpdates");
47
+
48
+ function inject() {
49
+ ReactEventEmitter.TopLevelCallbackCreator = ReactEventTopLevelCallback;
50
+ /**
51
+ * Inject module for resolving DOM hierarchy and plugin ordering.
52
+ */
53
+ EventPluginHub.injection.injectEventPluginOrder(DefaultEventPluginOrder);
54
+ EventPluginHub.injection.injectInstanceHandle(ReactInstanceHandles);
55
+
56
+ /**
57
+ * Some important event plugins included by default (without having to require
58
+ * them).
59
+ */
60
+ EventPluginHub.injection.injectEventPluginsByName({
61
+ SimpleEventPlugin: SimpleEventPlugin,
62
+ EnterLeaveEventPlugin: EnterLeaveEventPlugin,
63
+ ChangeEventPlugin: ChangeEventPlugin,
64
+ CompositionEventPlugin: CompositionEventPlugin,
65
+ MobileSafariClickEventPlugin: MobileSafariClickEventPlugin,
66
+ SelectEventPlugin: SelectEventPlugin
67
+ });
68
+
69
+ ReactDOM.injection.injectComponentClasses({
70
+ button: ReactDOMButton,
71
+ form: ReactDOMForm,
72
+ input: ReactDOMInput,
73
+ option: ReactDOMOption,
74
+ select: ReactDOMSelect,
75
+ textarea: ReactDOMTextarea
76
+ });
77
+
78
+ DOMProperty.injection.injectDOMPropertyConfig(DefaultDOMPropertyConfig);
79
+
80
+ if ("production" !== process.env.NODE_ENV) {
81
+ ReactPerf.injection.injectMeasure(require("./ReactDefaultPerf").measure);
82
+ }
83
+
84
+ ReactUpdates.injection.injectBatchingStrategy(
85
+ ReactDefaultBatchingStrategy
86
+ );
87
+ }
88
+
89
+ module.exports = {
90
+ inject: inject
91
+ };