react 0.7.0 → 0.9.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 (217) hide show
  1. package/README.md +10 -231
  2. package/addons.js +1 -0
  3. package/lib/AutoFocusMixin.js +30 -0
  4. package/lib/CSSCore.js +115 -0
  5. package/lib/CSSProperty.js +121 -0
  6. package/lib/CSSPropertyOperations.js +97 -0
  7. package/lib/ChangeEventPlugin.js +387 -0
  8. package/lib/ClientReactRootIndex.js +30 -0
  9. package/lib/CompositionEventPlugin.js +260 -0
  10. package/lib/DOMChildrenOperations.js +165 -0
  11. package/lib/DOMProperty.js +268 -0
  12. package/lib/DOMPropertyOperations.js +181 -0
  13. package/lib/Danger.js +187 -0
  14. package/lib/DefaultDOMPropertyConfig.js +203 -0
  15. package/lib/DefaultEventPluginOrder.js +44 -0
  16. package/lib/EnterLeaveEventPlugin.js +145 -0
  17. package/lib/EventConstants.js +76 -0
  18. package/lib/EventListener.js +69 -0
  19. package/lib/EventPluginHub.js +293 -0
  20. package/lib/EventPluginRegistry.js +281 -0
  21. package/lib/EventPluginUtils.js +214 -0
  22. package/lib/EventPropagators.js +143 -0
  23. package/lib/ExecutionEnvironment.js +44 -0
  24. package/lib/LinkedStateMixin.js +46 -0
  25. package/lib/LinkedValueUtils.js +161 -0
  26. package/lib/MobileSafariClickEventPlugin.js +63 -0
  27. package/lib/PooledClass.js +119 -0
  28. package/lib/React.js +95 -0
  29. package/lib/ReactCSSTransitionGroup.js +65 -0
  30. package/lib/ReactCSSTransitionGroupChild.js +138 -0
  31. package/lib/ReactChildren.js +132 -0
  32. package/lib/ReactComponent.js +550 -0
  33. package/lib/ReactComponentBrowserEnvironment.js +158 -0
  34. package/lib/ReactComponentEnvironment.js +26 -0
  35. package/lib/ReactCompositeComponent.js +1455 -0
  36. package/lib/ReactContext.js +67 -0
  37. package/lib/ReactCurrentOwner.js +39 -0
  38. package/lib/ReactDOM.js +207 -0
  39. package/lib/ReactDOMButton.js +68 -0
  40. package/lib/ReactDOMComponent.js +399 -0
  41. package/lib/ReactDOMForm.js +59 -0
  42. package/lib/ReactDOMIDOperations.js +218 -0
  43. package/lib/ReactDOMImg.js +58 -0
  44. package/lib/ReactDOMInput.js +181 -0
  45. package/lib/ReactDOMOption.js +51 -0
  46. package/lib/ReactDOMSelect.js +179 -0
  47. package/lib/ReactDOMSelection.js +189 -0
  48. package/lib/ReactDOMTextarea.js +140 -0
  49. package/lib/ReactDefaultBatchingStrategy.js +75 -0
  50. package/lib/ReactDefaultInjection.js +115 -0
  51. package/lib/ReactDefaultPerf.js +244 -0
  52. package/lib/ReactDefaultPerfAnalysis.js +199 -0
  53. package/lib/ReactErrorUtils.js +37 -0
  54. package/lib/ReactEventEmitter.js +339 -0
  55. package/lib/ReactEventEmitterMixin.js +57 -0
  56. package/lib/ReactEventTopLevelCallback.js +149 -0
  57. package/lib/ReactInjection.js +39 -0
  58. package/lib/ReactInputSelection.js +140 -0
  59. package/lib/ReactInstanceHandles.js +338 -0
  60. package/lib/ReactLink.js +54 -0
  61. package/lib/ReactMarkupChecksum.js +53 -0
  62. package/lib/ReactMount.js +641 -0
  63. package/lib/ReactMountReady.js +95 -0
  64. package/lib/ReactMultiChild.js +425 -0
  65. package/lib/ReactMultiChildUpdateTypes.js +38 -0
  66. package/lib/ReactOwner.js +154 -0
  67. package/lib/ReactPerf.js +85 -0
  68. package/lib/ReactPropTransferer.js +147 -0
  69. package/lib/ReactPropTypeLocationNames.js +31 -0
  70. package/lib/ReactPropTypeLocations.js +29 -0
  71. package/lib/ReactPropTypes.js +359 -0
  72. package/lib/ReactPutListenerQueue.js +61 -0
  73. package/lib/ReactReconcileTransaction.js +181 -0
  74. package/lib/ReactRootIndex.js +36 -0
  75. package/lib/ReactServerRendering.js +59 -0
  76. package/lib/ReactStateSetters.js +111 -0
  77. package/lib/ReactTestUtils.js +394 -0
  78. package/lib/ReactTextComponent.js +99 -0
  79. package/lib/ReactTransitionChildMapping.js +106 -0
  80. package/lib/ReactTransitionEvents.js +97 -0
  81. package/lib/ReactTransitionGroup.js +187 -0
  82. package/lib/ReactUpdates.js +148 -0
  83. package/lib/ReactWithAddons.js +51 -0
  84. package/lib/SelectEventPlugin.js +200 -0
  85. package/lib/ServerReactRootIndex.js +36 -0
  86. package/lib/SimpleEventPlugin.js +413 -0
  87. package/lib/SyntheticClipboardEvent.js +51 -0
  88. package/lib/SyntheticCompositionEvent.js +51 -0
  89. package/lib/SyntheticDragEvent.js +44 -0
  90. package/lib/SyntheticEvent.js +164 -0
  91. package/lib/SyntheticFocusEvent.js +44 -0
  92. package/lib/SyntheticKeyboardEvent.js +58 -0
  93. package/lib/SyntheticMouseEvent.js +85 -0
  94. package/lib/SyntheticTouchEvent.js +50 -0
  95. package/lib/SyntheticUIEvent.js +45 -0
  96. package/lib/SyntheticWheelEvent.js +66 -0
  97. package/lib/Transaction.js +276 -0
  98. package/lib/ViewportMetrics.js +37 -0
  99. package/lib/accumulate.js +54 -0
  100. package/lib/adler32.js +39 -0
  101. package/lib/cloneWithProps.js +59 -0
  102. package/lib/containsNode.js +49 -0
  103. package/lib/copyProperties.js +54 -0
  104. package/lib/createArrayFrom.js +91 -0
  105. package/lib/createFullPageComponent.js +63 -0
  106. package/lib/createNodesFromMarkup.js +93 -0
  107. package/lib/createObjectFrom.js +61 -0
  108. package/lib/cx.js +44 -0
  109. package/lib/dangerousStyleValue.js +57 -0
  110. package/lib/emptyFunction.js +43 -0
  111. package/lib/escapeTextForBrowser.js +47 -0
  112. package/lib/flattenChildren.js +57 -0
  113. package/lib/forEachAccumulated.js +36 -0
  114. package/lib/getActiveElement.js +34 -0
  115. package/lib/getEventKey.js +85 -0
  116. package/lib/getEventTarget.js +36 -0
  117. package/lib/getMarkupWrap.js +118 -0
  118. package/lib/getNodeForCharacterOffset.js +80 -0
  119. package/lib/getReactRootElementInContainer.js +40 -0
  120. package/lib/getTextContentAccessor.js +42 -0
  121. package/lib/getUnboundedScrollPosition.js +45 -0
  122. package/lib/hyphenate.js +35 -0
  123. package/lib/invariant.js +62 -0
  124. package/lib/isEventSupported.js +70 -0
  125. package/lib/isNode.js +33 -0
  126. package/lib/isTextInputElement.js +49 -0
  127. package/lib/isTextNode.js +30 -0
  128. package/lib/joinClasses.js +44 -0
  129. package/lib/keyMirror.js +58 -0
  130. package/lib/keyOf.js +41 -0
  131. package/lib/memoizeStringOnly.js +39 -0
  132. package/lib/merge.js +37 -0
  133. package/lib/mergeHelpers.js +136 -0
  134. package/lib/mergeInto.js +45 -0
  135. package/lib/mixInto.js +34 -0
  136. package/lib/objMap.js +47 -0
  137. package/lib/objMapKeyVal.js +47 -0
  138. package/lib/onlyChild.js +43 -0
  139. package/lib/performanceNow.js +42 -0
  140. package/lib/shallowEqual.js +49 -0
  141. package/lib/shouldUpdateReactComponent.js +58 -0
  142. package/lib/toArray.js +75 -0
  143. package/lib/traverseAllChildren.js +189 -0
  144. package/lib/warning.js +48 -0
  145. package/package.json +33 -21
  146. package/react.js +1 -0
  147. package/.npmignore +0 -7
  148. package/.travis.yml +0 -7
  149. package/Jakefile.js +0 -39
  150. package/LICENSE +0 -19
  151. package/browser-test/dist.html +0 -90
  152. package/browser-test/index.html +0 -86
  153. package/browser-test/min.html +0 -90
  154. package/dist/react.js +0 -3141
  155. package/dist/react.min.js +0 -22
  156. package/doc/advanced.md +0 -174
  157. package/doc/color-def.graffle +0 -938
  158. package/doc/color-def.png +0 -0
  159. package/doc/simple.dot +0 -25
  160. package/doc/simple.png +0 -0
  161. package/examples/longer-example.js +0 -41
  162. package/examples/simple.js +0 -45
  163. package/examples/using-ast-directly.js +0 -30
  164. package/examples/using-events1.js +0 -79
  165. package/examples/using-log-events.js +0 -43
  166. package/lib/base-task.js +0 -120
  167. package/lib/cb-task.js +0 -84
  168. package/lib/core.js +0 -138
  169. package/lib/dsl.js +0 -138
  170. package/lib/error.js +0 -55
  171. package/lib/event-collector.js +0 -81
  172. package/lib/event-manager.js +0 -89
  173. package/lib/eventemitter.js +0 -20
  174. package/lib/finalcb-first-task.js +0 -68
  175. package/lib/finalcb-task.js +0 -65
  176. package/lib/id.js +0 -22
  177. package/lib/input-parser.js +0 -56
  178. package/lib/log-events.js +0 -101
  179. package/lib/parse.js +0 -41
  180. package/lib/promise-resolve.js +0 -50
  181. package/lib/promise-task.js +0 -93
  182. package/lib/react.js +0 -59
  183. package/lib/ret-task.js +0 -71
  184. package/lib/sprintf.js +0 -18
  185. package/lib/status.js +0 -14
  186. package/lib/task.js +0 -251
  187. package/lib/track-tasks.js +0 -74
  188. package/lib/validate.js +0 -159
  189. package/lib/vcon.js +0 -113
  190. package/lib/when-task.js +0 -84
  191. package/src/dist.build.requirejs +0 -20
  192. package/test/ast.mocha.js +0 -136
  193. package/test/cb-task.mocha.js +0 -220
  194. package/test/core-deferred.mocha.js +0 -143
  195. package/test/core-when.mocha.js +0 -96
  196. package/test/core.mocha.js +0 -589
  197. package/test/dsl.mocha.js +0 -352
  198. package/test/event-manager.mocha.js +0 -119
  199. package/test/exec-options.mocha.js +0 -48
  200. package/test/finalcb-task.mocha.js +0 -58
  201. package/test/input-parser.mocha.js +0 -86
  202. package/test/log-events.mocha.js +0 -88
  203. package/test/mocha.opts +0 -2
  204. package/test/module-use.mocha.js +0 -164
  205. package/test/promise-auto-resolve.mocha.js +0 -68
  206. package/test/ret-task.mocha.js +0 -220
  207. package/test/task.mocha.js +0 -42
  208. package/test/validate-cb-task.mocha.js +0 -100
  209. package/test/validate-ret-task.mocha.js +0 -110
  210. package/test/validate.mocha.js +0 -324
  211. package/test/vcon.mocha.js +0 -193
  212. package/vendor/chai/chai.js +0 -4251
  213. package/vendor/jquery/jquery-1.7.1.js +0 -9266
  214. package/vendor/jquery/jquery-1.7.1.min.js +0 -4
  215. package/vendor/node/util.js +0 -531
  216. package/vendor/requirejs/require.js +0 -2045
  217. package/vendor/requirejs/require.min.js +0 -36
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Copyright 2013-2014 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 ReactMountReady
17
+ */
18
+
19
+ "use strict";
20
+
21
+ var PooledClass = require("./PooledClass");
22
+
23
+ var mixInto = require("./mixInto");
24
+
25
+ /**
26
+ * A specialized pseudo-event module to help keep track of components waiting to
27
+ * be notified when their DOM representations are available for use.
28
+ *
29
+ * This implements `PooledClass`, so you should never need to instantiate this.
30
+ * Instead, use `ReactMountReady.getPooled()`.
31
+ *
32
+ * @param {?array<function>} initialCollection
33
+ * @class ReactMountReady
34
+ * @implements PooledClass
35
+ * @internal
36
+ */
37
+ function ReactMountReady(initialCollection) {
38
+ this._queue = initialCollection || null;
39
+ }
40
+
41
+ mixInto(ReactMountReady, {
42
+
43
+ /**
44
+ * Enqueues a callback to be invoked when `notifyAll` is invoked. This is used
45
+ * to enqueue calls to `componentDidMount` and `componentDidUpdate`.
46
+ *
47
+ * @param {ReactComponent} component Component being rendered.
48
+ * @param {function(DOMElement)} callback Invoked when `notifyAll` is invoked.
49
+ * @internal
50
+ */
51
+ enqueue: function(component, callback) {
52
+ this._queue = this._queue || [];
53
+ this._queue.push({component: component, callback: callback});
54
+ },
55
+
56
+ /**
57
+ * Invokes all enqueued callbacks and clears the queue. This is invoked after
58
+ * the DOM representation of a component has been created or updated.
59
+ *
60
+ * @internal
61
+ */
62
+ notifyAll: function() {
63
+ var queue = this._queue;
64
+ if (queue) {
65
+ this._queue = null;
66
+ for (var i = 0, l = queue.length; i < l; i++) {
67
+ var component = queue[i].component;
68
+ var callback = queue[i].callback;
69
+ callback.call(component);
70
+ }
71
+ queue.length = 0;
72
+ }
73
+ },
74
+
75
+ /**
76
+ * Resets the internal queue.
77
+ *
78
+ * @internal
79
+ */
80
+ reset: function() {
81
+ this._queue = null;
82
+ },
83
+
84
+ /**
85
+ * `PooledClass` looks for this.
86
+ */
87
+ destructor: function() {
88
+ this.reset();
89
+ }
90
+
91
+ });
92
+
93
+ PooledClass.addPoolingTo(ReactMountReady);
94
+
95
+ module.exports = ReactMountReady;
@@ -0,0 +1,425 @@
1
+ /**
2
+ * Copyright 2013-2014 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 ReactMultiChild
17
+ * @typechecks static-only
18
+ */
19
+
20
+ "use strict";
21
+
22
+ var ReactComponent = require("./ReactComponent");
23
+ var ReactMultiChildUpdateTypes = require("./ReactMultiChildUpdateTypes");
24
+
25
+ var flattenChildren = require("./flattenChildren");
26
+ var shouldUpdateReactComponent = require("./shouldUpdateReactComponent");
27
+
28
+ /**
29
+ * Updating children of a component may trigger recursive updates. The depth is
30
+ * used to batch recursive updates to render markup more efficiently.
31
+ *
32
+ * @type {number}
33
+ * @private
34
+ */
35
+ var updateDepth = 0;
36
+
37
+ /**
38
+ * Queue of update configuration objects.
39
+ *
40
+ * Each object has a `type` property that is in `ReactMultiChildUpdateTypes`.
41
+ *
42
+ * @type {array<object>}
43
+ * @private
44
+ */
45
+ var updateQueue = [];
46
+
47
+ /**
48
+ * Queue of markup to be rendered.
49
+ *
50
+ * @type {array<string>}
51
+ * @private
52
+ */
53
+ var markupQueue = [];
54
+
55
+ /**
56
+ * Enqueues markup to be rendered and inserted at a supplied index.
57
+ *
58
+ * @param {string} parentID ID of the parent component.
59
+ * @param {string} markup Markup that renders into an element.
60
+ * @param {number} toIndex Destination index.
61
+ * @private
62
+ */
63
+ function enqueueMarkup(parentID, markup, toIndex) {
64
+ // NOTE: Null values reduce hidden classes.
65
+ updateQueue.push({
66
+ parentID: parentID,
67
+ parentNode: null,
68
+ type: ReactMultiChildUpdateTypes.INSERT_MARKUP,
69
+ markupIndex: markupQueue.push(markup) - 1,
70
+ textContent: null,
71
+ fromIndex: null,
72
+ toIndex: toIndex
73
+ });
74
+ }
75
+
76
+ /**
77
+ * Enqueues moving an existing element to another index.
78
+ *
79
+ * @param {string} parentID ID of the parent component.
80
+ * @param {number} fromIndex Source index of the existing element.
81
+ * @param {number} toIndex Destination index of the element.
82
+ * @private
83
+ */
84
+ function enqueueMove(parentID, fromIndex, toIndex) {
85
+ // NOTE: Null values reduce hidden classes.
86
+ updateQueue.push({
87
+ parentID: parentID,
88
+ parentNode: null,
89
+ type: ReactMultiChildUpdateTypes.MOVE_EXISTING,
90
+ markupIndex: null,
91
+ textContent: null,
92
+ fromIndex: fromIndex,
93
+ toIndex: toIndex
94
+ });
95
+ }
96
+
97
+ /**
98
+ * Enqueues removing an element at an index.
99
+ *
100
+ * @param {string} parentID ID of the parent component.
101
+ * @param {number} fromIndex Index of the element to remove.
102
+ * @private
103
+ */
104
+ function enqueueRemove(parentID, fromIndex) {
105
+ // NOTE: Null values reduce hidden classes.
106
+ updateQueue.push({
107
+ parentID: parentID,
108
+ parentNode: null,
109
+ type: ReactMultiChildUpdateTypes.REMOVE_NODE,
110
+ markupIndex: null,
111
+ textContent: null,
112
+ fromIndex: fromIndex,
113
+ toIndex: null
114
+ });
115
+ }
116
+
117
+ /**
118
+ * Enqueues setting the text content.
119
+ *
120
+ * @param {string} parentID ID of the parent component.
121
+ * @param {string} textContent Text content to set.
122
+ * @private
123
+ */
124
+ function enqueueTextContent(parentID, textContent) {
125
+ // NOTE: Null values reduce hidden classes.
126
+ updateQueue.push({
127
+ parentID: parentID,
128
+ parentNode: null,
129
+ type: ReactMultiChildUpdateTypes.TEXT_CONTENT,
130
+ markupIndex: null,
131
+ textContent: textContent,
132
+ fromIndex: null,
133
+ toIndex: null
134
+ });
135
+ }
136
+
137
+ /**
138
+ * Processes any enqueued updates.
139
+ *
140
+ * @private
141
+ */
142
+ function processQueue() {
143
+ if (updateQueue.length) {
144
+ ReactComponent.BackendIDOperations.dangerouslyProcessChildrenUpdates(
145
+ updateQueue,
146
+ markupQueue
147
+ );
148
+ clearQueue();
149
+ }
150
+ }
151
+
152
+ /**
153
+ * Clears any enqueued updates.
154
+ *
155
+ * @private
156
+ */
157
+ function clearQueue() {
158
+ updateQueue.length = 0;
159
+ markupQueue.length = 0;
160
+ }
161
+
162
+ /**
163
+ * ReactMultiChild are capable of reconciling multiple children.
164
+ *
165
+ * @class ReactMultiChild
166
+ * @internal
167
+ */
168
+ var ReactMultiChild = {
169
+
170
+ /**
171
+ * Provides common functionality for components that must reconcile multiple
172
+ * children. This is used by `ReactDOMComponent` to mount, update, and
173
+ * unmount child components.
174
+ *
175
+ * @lends {ReactMultiChild.prototype}
176
+ */
177
+ Mixin: {
178
+
179
+ /**
180
+ * Generates a "mount image" for each of the supplied children. In the case
181
+ * of `ReactDOMComponent`, a mount image is a string of markup.
182
+ *
183
+ * @param {?object} nestedChildren Nested child maps.
184
+ * @return {array} An array of mounted representations.
185
+ * @internal
186
+ */
187
+ mountChildren: function(nestedChildren, transaction) {
188
+ var children = flattenChildren(nestedChildren);
189
+ var mountImages = [];
190
+ var index = 0;
191
+ this._renderedChildren = children;
192
+ for (var name in children) {
193
+ var child = children[name];
194
+ if (children.hasOwnProperty(name)) {
195
+ // Inlined for performance, see `ReactInstanceHandles.createReactID`.
196
+ var rootID = this._rootNodeID + name;
197
+ var mountImage = child.mountComponent(
198
+ rootID,
199
+ transaction,
200
+ this._mountDepth + 1
201
+ );
202
+ child._mountIndex = index;
203
+ mountImages.push(mountImage);
204
+ index++;
205
+ }
206
+ }
207
+ return mountImages;
208
+ },
209
+
210
+ /**
211
+ * Replaces any rendered children with a text content string.
212
+ *
213
+ * @param {string} nextContent String of content.
214
+ * @internal
215
+ */
216
+ updateTextContent: function(nextContent) {
217
+ updateDepth++;
218
+ var errorThrown = true;
219
+ try {
220
+ var prevChildren = this._renderedChildren;
221
+ // Remove any rendered children.
222
+ for (var name in prevChildren) {
223
+ if (prevChildren.hasOwnProperty(name)) {
224
+ this._unmountChildByName(prevChildren[name], name);
225
+ }
226
+ }
227
+ // Set new text content.
228
+ this.setTextContent(nextContent);
229
+ errorThrown = false;
230
+ } finally {
231
+ updateDepth--;
232
+ if (!updateDepth) {
233
+ errorThrown ? clearQueue() : processQueue();
234
+ }
235
+ }
236
+ },
237
+
238
+ /**
239
+ * Updates the rendered children with new children.
240
+ *
241
+ * @param {?object} nextNestedChildren Nested child maps.
242
+ * @param {ReactReconcileTransaction} transaction
243
+ * @internal
244
+ */
245
+ updateChildren: function(nextNestedChildren, transaction) {
246
+ updateDepth++;
247
+ var errorThrown = true;
248
+ try {
249
+ this._updateChildren(nextNestedChildren, transaction);
250
+ errorThrown = false;
251
+ } finally {
252
+ updateDepth--;
253
+ if (!updateDepth) {
254
+ errorThrown ? clearQueue() : processQueue();
255
+ }
256
+ }
257
+ },
258
+
259
+ /**
260
+ * Improve performance by isolating this hot code path from the try/catch
261
+ * block in `updateChildren`.
262
+ *
263
+ * @param {?object} nextNestedChildren Nested child maps.
264
+ * @param {ReactReconcileTransaction} transaction
265
+ * @final
266
+ * @protected
267
+ */
268
+ _updateChildren: function(nextNestedChildren, transaction) {
269
+ var nextChildren = flattenChildren(nextNestedChildren);
270
+ var prevChildren = this._renderedChildren;
271
+ if (!nextChildren && !prevChildren) {
272
+ return;
273
+ }
274
+ var name;
275
+ // `nextIndex` will increment for each child in `nextChildren`, but
276
+ // `lastIndex` will be the last index visited in `prevChildren`.
277
+ var lastIndex = 0;
278
+ var nextIndex = 0;
279
+ for (name in nextChildren) {
280
+ if (!nextChildren.hasOwnProperty(name)) {
281
+ continue;
282
+ }
283
+ var prevChild = prevChildren && prevChildren[name];
284
+ var nextChild = nextChildren[name];
285
+ if (shouldUpdateReactComponent(prevChild, nextChild)) {
286
+ this.moveChild(prevChild, nextIndex, lastIndex);
287
+ lastIndex = Math.max(prevChild._mountIndex, lastIndex);
288
+ prevChild.receiveComponent(nextChild, transaction);
289
+ prevChild._mountIndex = nextIndex;
290
+ } else {
291
+ if (prevChild) {
292
+ // Update `lastIndex` before `_mountIndex` gets unset by unmounting.
293
+ lastIndex = Math.max(prevChild._mountIndex, lastIndex);
294
+ this._unmountChildByName(prevChild, name);
295
+ }
296
+ this._mountChildByNameAtIndex(
297
+ nextChild, name, nextIndex, transaction
298
+ );
299
+ }
300
+ nextIndex++;
301
+ }
302
+ // Remove children that are no longer present.
303
+ for (name in prevChildren) {
304
+ if (prevChildren.hasOwnProperty(name) &&
305
+ !(nextChildren && nextChildren[name])) {
306
+ this._unmountChildByName(prevChildren[name], name);
307
+ }
308
+ }
309
+ },
310
+
311
+ /**
312
+ * Unmounts all rendered children. This should be used to clean up children
313
+ * when this component is unmounted.
314
+ *
315
+ * @internal
316
+ */
317
+ unmountChildren: function() {
318
+ var renderedChildren = this._renderedChildren;
319
+ for (var name in renderedChildren) {
320
+ var renderedChild = renderedChildren[name];
321
+ // TODO: When is this not true?
322
+ if (renderedChild.unmountComponent) {
323
+ renderedChild.unmountComponent();
324
+ }
325
+ }
326
+ this._renderedChildren = null;
327
+ },
328
+
329
+ /**
330
+ * Moves a child component to the supplied index.
331
+ *
332
+ * @param {ReactComponent} child Component to move.
333
+ * @param {number} toIndex Destination index of the element.
334
+ * @param {number} lastIndex Last index visited of the siblings of `child`.
335
+ * @protected
336
+ */
337
+ moveChild: function(child, toIndex, lastIndex) {
338
+ // If the index of `child` is less than `lastIndex`, then it needs to
339
+ // be moved. Otherwise, we do not need to move it because a child will be
340
+ // inserted or moved before `child`.
341
+ if (child._mountIndex < lastIndex) {
342
+ enqueueMove(this._rootNodeID, child._mountIndex, toIndex);
343
+ }
344
+ },
345
+
346
+ /**
347
+ * Creates a child component.
348
+ *
349
+ * @param {ReactComponent} child Component to create.
350
+ * @param {string} mountImage Markup to insert.
351
+ * @protected
352
+ */
353
+ createChild: function(child, mountImage) {
354
+ enqueueMarkup(this._rootNodeID, mountImage, child._mountIndex);
355
+ },
356
+
357
+ /**
358
+ * Removes a child component.
359
+ *
360
+ * @param {ReactComponent} child Child to remove.
361
+ * @protected
362
+ */
363
+ removeChild: function(child) {
364
+ enqueueRemove(this._rootNodeID, child._mountIndex);
365
+ },
366
+
367
+ /**
368
+ * Sets this text content string.
369
+ *
370
+ * @param {string} textContent Text content to set.
371
+ * @protected
372
+ */
373
+ setTextContent: function(textContent) {
374
+ enqueueTextContent(this._rootNodeID, textContent);
375
+ },
376
+
377
+ /**
378
+ * Mounts a child with the supplied name.
379
+ *
380
+ * NOTE: This is part of `updateChildren` and is here for readability.
381
+ *
382
+ * @param {ReactComponent} child Component to mount.
383
+ * @param {string} name Name of the child.
384
+ * @param {number} index Index at which to insert the child.
385
+ * @param {ReactReconcileTransaction} transaction
386
+ * @private
387
+ */
388
+ _mountChildByNameAtIndex: function(child, name, index, transaction) {
389
+ // Inlined for performance, see `ReactInstanceHandles.createReactID`.
390
+ var rootID = this._rootNodeID + name;
391
+ var mountImage = child.mountComponent(
392
+ rootID,
393
+ transaction,
394
+ this._mountDepth + 1
395
+ );
396
+ child._mountIndex = index;
397
+ this.createChild(child, mountImage);
398
+ this._renderedChildren = this._renderedChildren || {};
399
+ this._renderedChildren[name] = child;
400
+ },
401
+
402
+ /**
403
+ * Unmounts a rendered child by name.
404
+ *
405
+ * NOTE: This is part of `updateChildren` and is here for readability.
406
+ *
407
+ * @param {ReactComponent} child Component to unmount.
408
+ * @param {string} name Name of the child in `this._renderedChildren`.
409
+ * @private
410
+ */
411
+ _unmountChildByName: function(child, name) {
412
+ // TODO: When is this not true?
413
+ if (ReactComponent.isValidComponent(child)) {
414
+ this.removeChild(child);
415
+ child._mountIndex = null;
416
+ child.unmountComponent();
417
+ delete this._renderedChildren[name];
418
+ }
419
+ }
420
+
421
+ }
422
+
423
+ };
424
+
425
+ module.exports = ReactMultiChild;