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.
- package/README.md +5 -2
- package/addons.js +8 -3
- package/dist/react-dom.js +42 -0
- package/dist/react-dom.min.js +12 -0
- package/dist/react-with-addons.js +6076 -5337
- package/dist/react-with-addons.min.js +6 -6
- package/dist/react.js +5445 -4839
- package/dist/react.min.js +6 -5
- package/lib/{AutoFocusMixin.js → AutoFocusUtils.js} +15 -5
- package/lib/BeforeInputEventPlugin.js +13 -13
- package/lib/CSSProperty.js +18 -3
- package/lib/CSSPropertyOperations.js +22 -14
- package/lib/CallbackQueue.js +4 -4
- package/lib/ChangeEventPlugin.js +18 -15
- package/lib/DOMChildrenOperations.js +17 -7
- package/lib/DOMProperty.js +82 -117
- package/lib/DOMPropertyOperations.js +84 -33
- package/lib/Danger.js +21 -16
- package/lib/DefaultEventPluginOrder.js +2 -2
- package/lib/EnterLeaveEventPlugin.js +21 -13
- package/lib/EventConstants.js +23 -1
- package/lib/EventPluginHub.js +17 -20
- package/lib/EventPluginRegistry.js +8 -8
- package/lib/EventPluginUtils.js +33 -42
- package/lib/EventPropagators.js +8 -8
- package/lib/FallbackCompositionState.js +9 -3
- package/lib/HTMLDOMPropertyConfig.js +19 -3
- package/lib/LinkedStateMixin.js +2 -2
- package/lib/LinkedValueUtils.js +50 -38
- package/lib/MetaMatchers.js +118 -0
- package/lib/OrderedMap.js +453 -0
- package/lib/PooledClass.js +15 -5
- package/lib/React.js +18 -7
- package/lib/ReactBrowserComponentMixin.js +4 -4
- package/lib/ReactBrowserEventEmitter.js +30 -7
- package/lib/ReactCSSTransitionGroup.js +35 -9
- package/lib/ReactCSSTransitionGroupChild.js +56 -30
- package/lib/ReactChildReconciler.js +24 -19
- package/lib/ReactChildren.js +75 -35
- package/lib/ReactClass.js +70 -87
- package/lib/ReactComponent.js +27 -20
- package/lib/ReactComponentBrowserEnvironment.js +2 -2
- package/lib/ReactComponentEnvironment.js +2 -2
- package/lib/ReactComponentWithPureRenderMixin.js +3 -3
- package/lib/ReactCompositeComponent.js +117 -106
- package/lib/ReactDOM.js +74 -158
- package/lib/ReactDOMButton.js +15 -26
- package/lib/ReactDOMComponent.js +441 -72
- package/lib/ReactDOMFactories.js +177 -0
- package/lib/{emptyObject.js → ReactDOMFeatureFlags.js} +6 -8
- package/lib/ReactDOMIDOperations.js +8 -66
- package/lib/ReactDOMInput.js +87 -99
- package/lib/ReactDOMOption.js +25 -44
- package/lib/ReactDOMSelect.js +88 -98
- package/lib/ReactDOMSelection.js +3 -3
- package/lib/ReactDOMServer.js +5 -3
- package/lib/ReactDOMTextComponent.js +33 -20
- package/lib/ReactDOMTextarea.js +48 -61
- package/lib/ReactDefaultBatchingStrategy.js +4 -4
- package/lib/ReactDefaultInjection.js +23 -72
- package/lib/ReactDefaultPerf.js +7 -7
- package/lib/ReactDefaultPerfAnalysis.js +6 -11
- package/lib/ReactElement.js +92 -107
- package/lib/ReactElementValidator.js +53 -173
- package/lib/ReactEmptyComponent.js +26 -62
- package/lib/ReactEmptyComponentRegistry.js +48 -0
- package/lib/ReactErrorUtils.js +45 -9
- package/lib/ReactEventEmitterMixin.js +3 -4
- package/lib/ReactEventListener.js +64 -12
- package/lib/ReactFragment.js +29 -115
- package/lib/ReactInjection.js +10 -12
- package/lib/ReactInputSelection.js +8 -7
- package/lib/ReactInstanceHandles.js +12 -12
- package/lib/ReactIsomorphic.js +15 -11
- package/lib/ReactLink.js +1 -1
- package/lib/ReactMarkupChecksum.js +6 -2
- package/lib/ReactMount.js +196 -122
- package/lib/ReactMultiChild.js +119 -25
- package/lib/ReactMultiChildUpdateTypes.js +2 -1
- package/lib/ReactNativeComponent.js +3 -8
- package/lib/ReactNoopUpdateQueue.js +118 -0
- package/lib/ReactOwner.js +3 -3
- package/lib/ReactPerf.js +2 -2
- package/lib/ReactPropTransferer.js +3 -3
- package/lib/ReactPropTypeLocationNames.js +1 -1
- package/lib/ReactPropTypeLocations.js +1 -1
- package/lib/ReactPropTypes.js +41 -12
- package/lib/ReactReconcileTransaction.js +12 -10
- package/lib/ReactReconciler.js +8 -11
- package/lib/ReactRef.js +15 -2
- package/lib/ReactServerBatchingStrategy.js +23 -0
- package/lib/ReactServerRendering.js +22 -9
- package/lib/ReactServerRenderingTransaction.js +8 -7
- package/lib/ReactTestUtils.js +89 -64
- package/lib/ReactTransitionChildMapping.js +3 -6
- package/lib/ReactTransitionEvents.js +1 -1
- package/lib/ReactTransitionGroup.js +5 -6
- package/lib/ReactUpdateQueue.js +60 -35
- package/lib/ReactUpdates.js +15 -18
- package/lib/{isTextNode.js → ReactVersion.js} +2 -13
- package/lib/ReactWithAddons.js +24 -17
- package/lib/ResponderEventPlugin.js +514 -0
- package/lib/ResponderSyntheticEvent.js +40 -0
- package/lib/ResponderTouchHistoryStore.js +180 -0
- package/lib/SVGDOMPropertyConfig.js +1 -1
- package/lib/SelectEventPlugin.js +25 -16
- package/lib/SimpleEventPlugin.js +200 -45
- package/lib/SyntheticClipboardEvent.js +3 -3
- package/lib/SyntheticCompositionEvent.js +3 -3
- package/lib/SyntheticDragEvent.js +3 -3
- package/lib/SyntheticEvent.js +24 -8
- package/lib/SyntheticFocusEvent.js +3 -3
- package/lib/SyntheticInputEvent.js +3 -3
- package/lib/SyntheticKeyboardEvent.js +6 -6
- package/lib/SyntheticMouseEvent.js +5 -5
- package/lib/SyntheticTouchEvent.js +4 -4
- package/lib/SyntheticUIEvent.js +4 -4
- package/lib/SyntheticWheelEvent.js +3 -3
- package/lib/TapEventPlugin.js +119 -0
- package/lib/Transaction.js +17 -11
- package/lib/accumulate.js +44 -0
- package/lib/accumulateInto.js +2 -2
- package/lib/adler32.js +19 -7
- package/lib/cloneWithProps.js +12 -7
- package/lib/createHierarchyRenderer.js +85 -0
- package/lib/dangerousStyleValue.js +1 -1
- package/lib/deprecated.js +48 -0
- package/lib/findDOMNode.js +11 -12
- package/lib/flattenChildren.js +4 -4
- package/lib/forEachAccumulated.js +1 -1
- package/lib/getEventCharCode.js +1 -1
- package/lib/getEventKey.js +1 -1
- package/lib/getEventModifierState.js +0 -1
- package/lib/getTestDocument.js +28 -0
- package/lib/getTextContentAccessor.js +1 -1
- package/lib/instantiateReactComponent.js +27 -25
- package/lib/isEventSupported.js +1 -1
- package/lib/isTextInputElement.js +2 -1
- package/lib/joinClasses.js +1 -1
- package/lib/onlyChild.js +3 -3
- package/lib/quoteAttributeValueForBrowser.js +1 -1
- package/lib/reactComponentExpect.js +216 -0
- package/lib/renderSubtreeIntoContainer.js +1 -1
- package/lib/setInnerHTML.js +2 -2
- package/lib/setTextContent.js +3 -3
- package/lib/shallowCompare.js +1 -1
- package/lib/shouldUpdateReactComponent.js +12 -8
- package/lib/sliceChildren.js +34 -0
- package/lib/traverseAllChildren.js +21 -19
- package/lib/update.js +13 -13
- package/lib/validateDOMNesting.js +6 -6
- package/lib/webcomponents.js +6379 -0
- package/package.json +4 -6
- package/react.js +2 -0
- package/addons/CSSTransitionGroup.js +0 -1
- package/addons/LinkedStateMixin.js +0 -1
- package/addons/Perf.js +0 -1
- package/addons/PureRenderMixin.js +0 -1
- package/addons/TestUtils.js +0 -1
- package/addons/TransitionGroup.js +0 -1
- package/addons/batchedUpdates.js +0 -1
- package/addons/cloneWithProps.js +0 -1
- package/addons/createFragment.js +0 -1
- package/addons/renderSubtreeIntoContainer.js +0 -1
- package/addons/shallowCompare.js +0 -1
- package/addons/update.js +0 -1
- package/dist/JSXTransformer.js +0 -17589
- package/lib/CSSCore.js +0 -97
- package/lib/EventListener.js +0 -84
- package/lib/ExecutionEnvironment.js +0 -38
- package/lib/LocalEventTrapMixin.js +0 -46
- package/lib/ReactContext.js +0 -32
- package/lib/ReactDOMClient.js +0 -85
- package/lib/ReactDOMForm.js +0 -47
- package/lib/ReactDOMIframe.js +0 -43
- package/lib/ReactDOMImg.js +0 -44
- package/lib/ReactLifeCycle.js +0 -35
- package/lib/camelize.js +0 -32
- package/lib/camelizeStyleName.js +0 -40
- package/lib/containsNode.js +0 -55
- package/lib/createArrayFromMixed.js +0 -85
- package/lib/createFullPageComponent.js +0 -51
- package/lib/createNodesFromMarkup.js +0 -84
- package/lib/emptyFunction.js +0 -38
- package/lib/focusNode.js +0 -26
- package/lib/getActiveElement.js +0 -29
- package/lib/getMarkupWrap.js +0 -115
- package/lib/getUnboundedScrollPosition.js +0 -38
- package/lib/hyphenate.js +0 -33
- package/lib/hyphenateStyleName.js +0 -39
- package/lib/invariant.js +0 -49
- package/lib/isNode.js +0 -23
- package/lib/keyMirror.js +0 -48
- package/lib/keyOf.js +0 -35
- package/lib/mapObject.js +0 -51
- package/lib/performance.js +0 -23
- package/lib/performanceNow.js +0 -28
- package/lib/shallowEqual.js +0 -48
- package/lib/toArray.js +0 -57
- package/lib/warning.js +0 -61
package/lib/ReactErrorUtils.js
CHANGED
|
@@ -10,21 +10,57 @@
|
|
|
10
10
|
* @typechecks
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
'use strict';
|
|
14
|
+
|
|
15
|
+
var caughtError = null;
|
|
14
16
|
|
|
15
17
|
var ReactErrorUtils = {
|
|
16
18
|
/**
|
|
17
|
-
*
|
|
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 {
|
|
22
|
-
* @param {
|
|
23
|
-
* @
|
|
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
|
-
|
|
26
|
-
|
|
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(
|
|
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(
|
|
16
|
-
var ExecutionEnvironment = require(
|
|
17
|
-
var PooledClass = require(
|
|
18
|
-
var ReactInstanceHandles = require(
|
|
19
|
-
var ReactMount = require(
|
|
20
|
-
var ReactUpdates = require(
|
|
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(
|
|
23
|
-
var getEventTarget = require(
|
|
24
|
-
var getUnboundedScrollPosition = require(
|
|
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
|
*/
|
package/lib/ReactFragment.js
CHANGED
|
@@ -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
|
|
14
|
+
var ReactChildren = require('./ReactChildren');
|
|
15
|
+
var ReactElement = require('./ReactElement');
|
|
15
16
|
|
|
16
|
-
var
|
|
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
|
|
26
|
+
* create a keyed fragment. The resulting data structure is an array.
|
|
24
27
|
*/
|
|
25
28
|
|
|
26
|
-
|
|
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
|
-
|
|
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 ('
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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
|
-
|
|
59
|
+
|
|
60
|
+
return result;
|
|
147
61
|
}
|
|
148
62
|
};
|
|
149
63
|
|
package/lib/ReactInjection.js
CHANGED
|
@@ -11,22 +11,20 @@
|
|
|
11
11
|
|
|
12
12
|
'use strict';
|
|
13
13
|
|
|
14
|
-
var DOMProperty = require(
|
|
15
|
-
var EventPluginHub = require(
|
|
16
|
-
var ReactComponentEnvironment = require(
|
|
17
|
-
var ReactClass = require(
|
|
18
|
-
var ReactEmptyComponent = require(
|
|
19
|
-
var ReactBrowserEventEmitter = require(
|
|
20
|
-
var ReactNativeComponent = require(
|
|
21
|
-
var
|
|
22
|
-
var
|
|
23
|
-
var
|
|
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(
|
|
14
|
+
var ReactDOMSelection = require('./ReactDOMSelection');
|
|
15
15
|
|
|
16
|
-
var containsNode = require(
|
|
17
|
-
var focusNode = require(
|
|
18
|
-
var getActiveElement = require(
|
|
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
|
-
|
|
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 === '
|
|
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 === '
|
|
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);
|