Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4337c1c006 | ||
|
|
170a8b21b6 | ||
|
|
6948842cf8 | ||
|
|
056ac56b52 | ||
|
|
1fb5c123b8 | ||
|
|
790e2446ab | ||
|
|
037717685a |
@@ -9,6 +9,7 @@ build/
|
||||
coverage/
|
||||
fixtures/
|
||||
scripts/bench/benchmarks/**/*.js
|
||||
old_major_packages/
|
||||
|
||||
# React repository clone
|
||||
scripts/bench/remote-repo/
|
||||
@@ -20,4 +21,4 @@ packages/react-devtools-extensions/shared/build
|
||||
packages/react-devtools-inline/dist
|
||||
packages/react-devtools-shell/dist
|
||||
packages/react-devtools-scheduling-profiler/dist
|
||||
packages/react-devtools-scheduling-profiler/static
|
||||
packages/react-devtools-scheduling-profiler/static
|
||||
|
||||
31
old_major_packages/14/react-dom/LICENSE
Normal file
31
old_major_packages/14/react-dom/LICENSE
Normal file
@@ -0,0 +1,31 @@
|
||||
BSD License
|
||||
|
||||
For React software
|
||||
|
||||
Copyright (c) 2013-2015, Facebook, Inc.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name Facebook nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific
|
||||
prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
33
old_major_packages/14/react-dom/PATENTS
Normal file
33
old_major_packages/14/react-dom/PATENTS
Normal file
@@ -0,0 +1,33 @@
|
||||
Additional Grant of Patent Rights Version 2
|
||||
|
||||
"Software" means the React software distributed by Facebook, Inc.
|
||||
|
||||
Facebook, Inc. ("Facebook") hereby grants to each recipient of the Software
|
||||
("you") a perpetual, worldwide, royalty-free, non-exclusive, irrevocable
|
||||
(subject to the termination provision below) license under any Necessary
|
||||
Claims, to make, have made, use, sell, offer to sell, import, and otherwise
|
||||
transfer the Software. For avoidance of doubt, no license is granted under
|
||||
Facebook's rights in any patent claims that are infringed by (i) modifications
|
||||
to the Software made by you or any third party or (ii) the Software in
|
||||
combination with any software or other technology.
|
||||
|
||||
The license granted hereunder will terminate, automatically and without notice,
|
||||
if you (or any of your subsidiaries, corporate affiliates or agents) initiate
|
||||
directly or indirectly, or take a direct financial interest in, any Patent
|
||||
Assertion: (i) against Facebook or any of its subsidiaries or corporate
|
||||
affiliates, (ii) against any party if such Patent Assertion arises in whole or
|
||||
in part from any software, technology, product or service of Facebook or any of
|
||||
its subsidiaries or corporate affiliates, or (iii) against any party relating
|
||||
to the Software. Notwithstanding the foregoing, if Facebook or any of its
|
||||
subsidiaries or corporate affiliates files a lawsuit alleging patent
|
||||
infringement against you in the first instance, and you respond by filing a
|
||||
patent infringement counterclaim in that lawsuit against that party that is
|
||||
unrelated to the Software, the license granted hereunder will not terminate
|
||||
under section (i) of this paragraph due to such counterclaim.
|
||||
|
||||
A "Necessary Claim" is a claim of a patent owned by Facebook that is
|
||||
necessarily infringed by the Software standing alone.
|
||||
|
||||
A "Patent Assertion" is any lawsuit or other action alleging direct, indirect,
|
||||
or contributory infringement or inducement to infringe any patent, including a
|
||||
cross-claim or counterclaim.
|
||||
54
old_major_packages/14/react-dom/README.md
Normal file
54
old_major_packages/14/react-dom/README.md
Normal file
@@ -0,0 +1,54 @@
|
||||
# `react-dom`
|
||||
|
||||
This package serves as the entry point of the DOM-related rendering paths. It is intended to be paired with the isomorphic React, which will be shipped as `react` to npm.
|
||||
|
||||
## Installation
|
||||
|
||||
```sh
|
||||
npm install react react-dom
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### In the browser
|
||||
|
||||
```js
|
||||
var React = require('react');
|
||||
var ReactDOM = require('react-dom');
|
||||
|
||||
class MyComponent extends React.Component {
|
||||
render() {
|
||||
return <div>Hello World</div>;
|
||||
}
|
||||
}
|
||||
|
||||
ReactDOM.render(<MyComponent />, node);
|
||||
```
|
||||
|
||||
### On the server
|
||||
|
||||
```js
|
||||
var React = require('react');
|
||||
var ReactDOMServer = require('react-dom/server');
|
||||
|
||||
class MyComponent extends React.Component {
|
||||
render() {
|
||||
return <div>Hello World</div>;
|
||||
}
|
||||
}
|
||||
|
||||
ReactDOMServer.renderToString(<MyComponent />);
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
### `react-dom`
|
||||
|
||||
- `findDOMNode`
|
||||
- `render`
|
||||
- `unmountComponentAtNode`
|
||||
|
||||
### `react-dom/server`
|
||||
|
||||
- `renderToString`
|
||||
- `renderToStaticMarkup`
|
||||
42
old_major_packages/14/react-dom/dist/react-dom-server.js
vendored
Normal file
42
old_major_packages/14/react-dom/dist/react-dom-server.js
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
/**
|
||||
* ReactDOMServer v0.14.10
|
||||
*
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
*/
|
||||
// Based off https://github.com/ForbesLindesay/umd/blob/master/template.js
|
||||
;(function(f) {
|
||||
// CommonJS
|
||||
if (typeof exports === "object" && typeof module !== "undefined") {
|
||||
module.exports = f(require('react'));
|
||||
|
||||
// RequireJS
|
||||
} else if (typeof define === "function" && define.amd) {
|
||||
define(['react'], f);
|
||||
|
||||
// <script>
|
||||
} else {
|
||||
var g;
|
||||
if (typeof window !== "undefined") {
|
||||
g = window;
|
||||
} else if (typeof global !== "undefined") {
|
||||
g = global;
|
||||
} else if (typeof self !== "undefined") {
|
||||
g = self;
|
||||
} else {
|
||||
// works providing we're not in "use strict";
|
||||
// needed for Java 8 Nashorn
|
||||
// see https://github.com/facebook/react/issues/3037
|
||||
g = this;
|
||||
}
|
||||
g.ReactDOMServer = f(g.React);
|
||||
}
|
||||
|
||||
})(function(React) {
|
||||
return React.__SECRET_DOM_SERVER_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
|
||||
});
|
||||
12
old_major_packages/14/react-dom/dist/react-dom-server.min.js
vendored
Normal file
12
old_major_packages/14/react-dom/dist/react-dom-server.min.js
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
/**
|
||||
* ReactDOMServer v0.14.10
|
||||
*
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
*/
|
||||
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e(require("react"));else if("function"==typeof define&&define.amd)define(["react"],e);else{var f;f="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,f.ReactDOMServer=e(f.React)}}(function(e){return e.__SECRET_DOM_SERVER_DO_NOT_USE_OR_YOU_WILL_BE_FIRED});
|
||||
42
old_major_packages/14/react-dom/dist/react-dom.js
vendored
Normal file
42
old_major_packages/14/react-dom/dist/react-dom.js
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
/**
|
||||
* ReactDOM v0.14.10
|
||||
*
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
*/
|
||||
// Based off https://github.com/ForbesLindesay/umd/blob/master/template.js
|
||||
;(function(f) {
|
||||
// CommonJS
|
||||
if (typeof exports === "object" && typeof module !== "undefined") {
|
||||
module.exports = f(require('react'));
|
||||
|
||||
// RequireJS
|
||||
} else if (typeof define === "function" && define.amd) {
|
||||
define(['react'], f);
|
||||
|
||||
// <script>
|
||||
} else {
|
||||
var g;
|
||||
if (typeof window !== "undefined") {
|
||||
g = window;
|
||||
} else if (typeof global !== "undefined") {
|
||||
g = global;
|
||||
} else if (typeof self !== "undefined") {
|
||||
g = self;
|
||||
} else {
|
||||
// works providing we're not in "use strict";
|
||||
// needed for Java 8 Nashorn
|
||||
// see https://github.com/facebook/react/issues/3037
|
||||
g = this;
|
||||
}
|
||||
g.ReactDOM = f(g.React);
|
||||
}
|
||||
|
||||
})(function(React) {
|
||||
return React.__SECRET_DOM_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
|
||||
});
|
||||
12
old_major_packages/14/react-dom/dist/react-dom.min.js
vendored
Normal file
12
old_major_packages/14/react-dom/dist/react-dom.min.js
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
/**
|
||||
* ReactDOM v0.14.10
|
||||
*
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
*/
|
||||
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e(require("react"));else if("function"==typeof define&&define.amd)define(["react"],e);else{var f;f="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,f.ReactDOM=e(f.React)}}(function(e){return e.__SECRET_DOM_DO_NOT_USE_OR_YOU_WILL_BE_FIRED});
|
||||
3
old_major_packages/14/react-dom/index.js
vendored
Normal file
3
old_major_packages/14/react-dom/index.js
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
'use strict';
|
||||
|
||||
module.exports = require('react/lib/ReactDOM');
|
||||
27
old_major_packages/14/react-dom/package.json
Normal file
27
old_major_packages/14/react-dom/package.json
Normal file
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"bugs": {
|
||||
"url": "https://github.com/facebook/react/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"dependencies": {},
|
||||
"deprecated": false,
|
||||
"description": "React package for working with the DOM.",
|
||||
"homepage": "https://facebook.github.io/react/",
|
||||
"keywords": [
|
||||
"react"
|
||||
],
|
||||
"license": "BSD-3-Clause",
|
||||
"main": "index.js",
|
||||
"name": "react-dom",
|
||||
"peerDependencies": {
|
||||
"react": "^0.14.10"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/facebook/react.git"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "node server.js"
|
||||
},
|
||||
"version": "0.14.10"
|
||||
}
|
||||
3
old_major_packages/14/react-dom/server.js
vendored
Normal file
3
old_major_packages/14/react-dom/server.js
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
'use strict';
|
||||
|
||||
module.exports = require('react/lib/ReactDOMServer');
|
||||
31
old_major_packages/14/react/LICENSE
Normal file
31
old_major_packages/14/react/LICENSE
Normal file
@@ -0,0 +1,31 @@
|
||||
BSD License
|
||||
|
||||
For React software
|
||||
|
||||
Copyright (c) 2013-2015, Facebook, Inc.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name Facebook nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific
|
||||
prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
33
old_major_packages/14/react/PATENTS
Normal file
33
old_major_packages/14/react/PATENTS
Normal file
@@ -0,0 +1,33 @@
|
||||
Additional Grant of Patent Rights Version 2
|
||||
|
||||
"Software" means the React software distributed by Facebook, Inc.
|
||||
|
||||
Facebook, Inc. ("Facebook") hereby grants to each recipient of the Software
|
||||
("you") a perpetual, worldwide, royalty-free, non-exclusive, irrevocable
|
||||
(subject to the termination provision below) license under any Necessary
|
||||
Claims, to make, have made, use, sell, offer to sell, import, and otherwise
|
||||
transfer the Software. For avoidance of doubt, no license is granted under
|
||||
Facebook's rights in any patent claims that are infringed by (i) modifications
|
||||
to the Software made by you or any third party or (ii) the Software in
|
||||
combination with any software or other technology.
|
||||
|
||||
The license granted hereunder will terminate, automatically and without notice,
|
||||
if you (or any of your subsidiaries, corporate affiliates or agents) initiate
|
||||
directly or indirectly, or take a direct financial interest in, any Patent
|
||||
Assertion: (i) against Facebook or any of its subsidiaries or corporate
|
||||
affiliates, (ii) against any party if such Patent Assertion arises in whole or
|
||||
in part from any software, technology, product or service of Facebook or any of
|
||||
its subsidiaries or corporate affiliates, or (iii) against any party relating
|
||||
to the Software. Notwithstanding the foregoing, if Facebook or any of its
|
||||
subsidiaries or corporate affiliates files a lawsuit alleging patent
|
||||
infringement against you in the first instance, and you respond by filing a
|
||||
patent infringement counterclaim in that lawsuit against that party that is
|
||||
unrelated to the Software, the license granted hereunder will not terminate
|
||||
under section (i) of this paragraph due to such counterclaim.
|
||||
|
||||
A "Necessary Claim" is a claim of a patent owned by Facebook that is
|
||||
necessarily infringed by the Software standing alone.
|
||||
|
||||
A "Patent Assertion" is any lawsuit or other action alleging direct, indirect,
|
||||
or contributory infringement or inducement to infringe any patent, including a
|
||||
cross-claim or counterclaim.
|
||||
23
old_major_packages/14/react/README.md
Normal file
23
old_major_packages/14/react/README.md
Normal file
@@ -0,0 +1,23 @@
|
||||
# react
|
||||
|
||||
An npm package to get you immediate access to [React](https://facebook.github.io/react/),
|
||||
without also requiring the JSX transformer. This is especially useful for cases where you
|
||||
want to [`browserify`](https://github.com/substack/node-browserify) your module using
|
||||
`React`.
|
||||
|
||||
**Note:** by default, React will be in development mode. The development version includes extra warnings about common mistakes, whereas the production version includes extra performance optimizations and strips all error messages.
|
||||
|
||||
To use React in production mode, set the environment variable `NODE_ENV` to `production`. A minifier that performs dead-code elimination such as [UglifyJS](https://github.com/mishoo/UglifyJS2) is recommended to completely remove the extra code present in development mode.
|
||||
|
||||
## Example Usage
|
||||
|
||||
```js
|
||||
var React = require('react');
|
||||
|
||||
// Addons are in separate packages:
|
||||
var createFragment = require('react-addons-create-fragment');
|
||||
var immutabilityHelpers = require('react-addons-update');
|
||||
var CSSTransitionGroup = require('react-addons-css-transition-group');
|
||||
```
|
||||
|
||||
For a complete list of addons visit the [addons documentation page](https://facebook.github.io/react/docs/addons.html).
|
||||
13
old_major_packages/14/react/addons.js
Normal file
13
old_major_packages/14/react/addons.js
Normal file
@@ -0,0 +1,13 @@
|
||||
'use strict';
|
||||
|
||||
var warning = require('fbjs/lib/warning');
|
||||
warning(
|
||||
false,
|
||||
// Require examples in this string must be split to prevent React's
|
||||
// build tools from mistaking them for real requires.
|
||||
// Otherwise the build tools will attempt to build a 'react-addons-{addon}' module.
|
||||
'require' + "('react/addons') is deprecated. " +
|
||||
'Access using require' + "('react-addons-{addon}') instead."
|
||||
);
|
||||
|
||||
module.exports = require('./lib/ReactWithAddons');
|
||||
@@ -0,0 +1,861 @@
|
||||
/** @license React v0.14.10
|
||||
* react-jsx-dev-runtime.development.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
if (process.env.NODE_ENV !== "production") {
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
var React = require('react');
|
||||
|
||||
// ATTENTION
|
||||
// When adding new symbols to this file,
|
||||
// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'
|
||||
// The Symbol used to tag the ReactElement-like types. If there is no native Symbol
|
||||
// nor polyfill, then a plain number is used for performance.
|
||||
var REACT_ELEMENT_TYPE = 0xeac7;
|
||||
var REACT_PORTAL_TYPE = 0xeaca;
|
||||
exports.Fragment = 0xeacb;
|
||||
var REACT_STRICT_MODE_TYPE = 0xeacc;
|
||||
var REACT_PROFILER_TYPE = 0xead2;
|
||||
var REACT_PROVIDER_TYPE = 0xeacd;
|
||||
var REACT_CONTEXT_TYPE = 0xeace;
|
||||
var REACT_FORWARD_REF_TYPE = 0xead0;
|
||||
var REACT_SUSPENSE_TYPE = 0xead1;
|
||||
var REACT_SUSPENSE_LIST_TYPE = 0xead8;
|
||||
var REACT_MEMO_TYPE = 0xead3;
|
||||
var REACT_LAZY_TYPE = 0xead4;
|
||||
var REACT_BLOCK_TYPE = 0xead9;
|
||||
var REACT_SERVER_BLOCK_TYPE = 0xeada;
|
||||
var REACT_FUNDAMENTAL_TYPE = 0xead5;
|
||||
var REACT_SCOPE_TYPE = 0xead7;
|
||||
var REACT_OPAQUE_ID_TYPE = 0xeae0;
|
||||
var REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1;
|
||||
var REACT_OFFSCREEN_TYPE = 0xeae2;
|
||||
var REACT_LEGACY_HIDDEN_TYPE = 0xeae3;
|
||||
|
||||
if (typeof Symbol === 'function' && Symbol.for) {
|
||||
var symbolFor = Symbol.for;
|
||||
REACT_ELEMENT_TYPE = symbolFor('react.element');
|
||||
REACT_PORTAL_TYPE = symbolFor('react.portal');
|
||||
exports.Fragment = symbolFor('react.fragment');
|
||||
REACT_STRICT_MODE_TYPE = symbolFor('react.strict_mode');
|
||||
REACT_PROFILER_TYPE = symbolFor('react.profiler');
|
||||
REACT_PROVIDER_TYPE = symbolFor('react.provider');
|
||||
REACT_CONTEXT_TYPE = symbolFor('react.context');
|
||||
REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref');
|
||||
REACT_SUSPENSE_TYPE = symbolFor('react.suspense');
|
||||
REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list');
|
||||
REACT_MEMO_TYPE = symbolFor('react.memo');
|
||||
REACT_LAZY_TYPE = symbolFor('react.lazy');
|
||||
REACT_BLOCK_TYPE = symbolFor('react.block');
|
||||
REACT_SERVER_BLOCK_TYPE = symbolFor('react.server.block');
|
||||
REACT_FUNDAMENTAL_TYPE = symbolFor('react.fundamental');
|
||||
REACT_SCOPE_TYPE = symbolFor('react.scope');
|
||||
REACT_OPAQUE_ID_TYPE = symbolFor('react.opaque.id');
|
||||
REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode');
|
||||
REACT_OFFSCREEN_TYPE = symbolFor('react.offscreen');
|
||||
REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden');
|
||||
}
|
||||
|
||||
var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
|
||||
var FAUX_ITERATOR_SYMBOL = '@@iterator';
|
||||
function getIteratorFn(maybeIterable) {
|
||||
if (maybeIterable === null || typeof maybeIterable !== 'object') {
|
||||
return null;
|
||||
}
|
||||
|
||||
var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];
|
||||
|
||||
if (typeof maybeIterator === 'function') {
|
||||
return maybeIterator;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function error(format) {
|
||||
{
|
||||
for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
|
||||
args[_key2 - 1] = arguments[_key2];
|
||||
}
|
||||
|
||||
printWarning('error', format, args);
|
||||
}
|
||||
}
|
||||
|
||||
function printWarning(level, format, args) {
|
||||
// When changing this logic, you might want to also
|
||||
// update consoleWithStackDev.www.js as well.
|
||||
{
|
||||
var stack = '';
|
||||
|
||||
|
||||
if (stack !== '') {
|
||||
format += '%s';
|
||||
args = args.concat([stack]);
|
||||
}
|
||||
|
||||
var argsWithFormat = args.map(function (item) {
|
||||
return '' + item;
|
||||
}); // Careful: RN currently depends on this prefix
|
||||
|
||||
argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it
|
||||
// breaks IE9: https://github.com/facebook/react/issues/13610
|
||||
// eslint-disable-next-line react-internal/no-production-logging
|
||||
|
||||
Function.prototype.apply.call(console[level], console, argsWithFormat);
|
||||
}
|
||||
}
|
||||
|
||||
// Filter certain DOM attributes (e.g. src, href) if their values are empty strings.
|
||||
|
||||
var enableScopeAPI = false; // Experimental Create Event Handle API.
|
||||
|
||||
function isValidElementType(type) {
|
||||
if (typeof type === 'string' || typeof type === 'function') {
|
||||
return true;
|
||||
} // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).
|
||||
|
||||
|
||||
if (type === exports.Fragment || type === REACT_PROFILER_TYPE || type === REACT_DEBUG_TRACING_MODE_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || type === REACT_LEGACY_HIDDEN_TYPE || enableScopeAPI ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (typeof type === 'object' && type !== null) {
|
||||
if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_BLOCK_TYPE || type[0] === REACT_SERVER_BLOCK_TYPE) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
var BEFORE_SLASH_RE = /^(.*)[\\\/]/;
|
||||
function describeComponentFrame (name, source, ownerName) {
|
||||
var sourceInfo = '';
|
||||
|
||||
if (source) {
|
||||
var path = source.fileName;
|
||||
var fileName = path.replace(BEFORE_SLASH_RE, '');
|
||||
|
||||
{
|
||||
// In DEV, include code for a common special case:
|
||||
// prefer "folder/index.js" instead of just "index.js".
|
||||
if (/^index\./.test(fileName)) {
|
||||
var match = path.match(BEFORE_SLASH_RE);
|
||||
|
||||
if (match) {
|
||||
var pathBeforeSlash = match[1];
|
||||
|
||||
if (pathBeforeSlash) {
|
||||
var folderName = pathBeforeSlash.replace(BEFORE_SLASH_RE, '');
|
||||
fileName = folderName + '/' + fileName;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sourceInfo = ' (at ' + fileName + ':' + source.lineNumber + ')';
|
||||
} else if (ownerName) {
|
||||
sourceInfo = ' (created by ' + ownerName + ')';
|
||||
}
|
||||
|
||||
return '\n in ' + (name || 'Unknown') + sourceInfo;
|
||||
}
|
||||
|
||||
var Resolved = 1;
|
||||
function refineResolvedLazyComponent(lazyComponent) {
|
||||
return lazyComponent._status === Resolved ? lazyComponent._result : null;
|
||||
}
|
||||
|
||||
function getWrappedName(outerType, innerType, wrapperName) {
|
||||
var functionName = innerType.displayName || innerType.name || '';
|
||||
return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName);
|
||||
}
|
||||
|
||||
function getComponentName(type) {
|
||||
if (type == null) {
|
||||
// Host root, text node or just invalid type.
|
||||
return null;
|
||||
}
|
||||
|
||||
{
|
||||
if (typeof type.tag === 'number') {
|
||||
error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.');
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof type === 'function') {
|
||||
return type.displayName || type.name || null;
|
||||
}
|
||||
|
||||
if (typeof type === 'string') {
|
||||
return type;
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
case exports.Fragment:
|
||||
return 'Fragment';
|
||||
|
||||
case REACT_PORTAL_TYPE:
|
||||
return 'Portal';
|
||||
|
||||
case REACT_PROFILER_TYPE:
|
||||
return "Profiler";
|
||||
|
||||
case REACT_STRICT_MODE_TYPE:
|
||||
return 'StrictMode';
|
||||
|
||||
case REACT_SUSPENSE_TYPE:
|
||||
return 'Suspense';
|
||||
|
||||
case REACT_SUSPENSE_LIST_TYPE:
|
||||
return 'SuspenseList';
|
||||
}
|
||||
|
||||
if (typeof type === 'object') {
|
||||
switch (type.$$typeof) {
|
||||
case REACT_CONTEXT_TYPE:
|
||||
return 'Context.Consumer';
|
||||
|
||||
case REACT_PROVIDER_TYPE:
|
||||
return 'Context.Provider';
|
||||
|
||||
case REACT_FORWARD_REF_TYPE:
|
||||
return getWrappedName(type, type.render, 'ForwardRef');
|
||||
|
||||
case REACT_MEMO_TYPE:
|
||||
return getComponentName(type.type);
|
||||
|
||||
case REACT_BLOCK_TYPE:
|
||||
return getComponentName(type.render);
|
||||
|
||||
case REACT_LAZY_TYPE:
|
||||
{
|
||||
var thenable = type;
|
||||
var resolvedThenable = refineResolvedLazyComponent(thenable);
|
||||
|
||||
if (resolvedThenable) {
|
||||
return getComponentName(resolvedThenable);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
var loggedTypeFailures = {};
|
||||
var currentlyValidatingElement = null;
|
||||
|
||||
function setCurrentlyValidatingElement(element) {
|
||||
currentlyValidatingElement = element;
|
||||
}
|
||||
|
||||
function checkPropTypes(typeSpecs, values, location, componentName, element) {
|
||||
{
|
||||
// $FlowFixMe This is okay but Flow doesn't know it.
|
||||
var has = Function.call.bind(Object.prototype.hasOwnProperty);
|
||||
|
||||
for (var typeSpecName in typeSpecs) {
|
||||
if (has(typeSpecs, typeSpecName)) {
|
||||
var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to
|
||||
// fail the render phase where it didn't fail before. So we log it.
|
||||
// After these have been cleaned up, we'll let them throw.
|
||||
|
||||
try {
|
||||
// This is intentionally an invariant that gets caught. It's the same
|
||||
// behavior as without this statement except with a better message.
|
||||
if (typeof typeSpecs[typeSpecName] !== 'function') {
|
||||
var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.');
|
||||
err.name = 'Invariant Violation';
|
||||
throw err;
|
||||
}
|
||||
|
||||
error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');
|
||||
} catch (ex) {
|
||||
error$1 = ex;
|
||||
}
|
||||
|
||||
if (error$1 && !(error$1 instanceof Error)) {
|
||||
setCurrentlyValidatingElement(element);
|
||||
|
||||
error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1);
|
||||
|
||||
setCurrentlyValidatingElement(null);
|
||||
}
|
||||
|
||||
if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {
|
||||
// Only monitor this failure once because there tends to be a lot of the
|
||||
// same error.
|
||||
loggedTypeFailures[error$1.message] = true;
|
||||
setCurrentlyValidatingElement(element);
|
||||
|
||||
error('Failed %s type: %s', location, error$1.message);
|
||||
|
||||
setCurrentlyValidatingElement(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var ReactCurrentOwner = require('react/lib/ReactCurrentOwner');
|
||||
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
||||
var RESERVED_PROPS = {
|
||||
key: true,
|
||||
ref: true,
|
||||
__self: true,
|
||||
__source: true
|
||||
};
|
||||
var specialPropKeyWarningShown;
|
||||
var specialPropRefWarningShown;
|
||||
var didWarnAboutStringRefs;
|
||||
|
||||
{
|
||||
didWarnAboutStringRefs = {};
|
||||
}
|
||||
|
||||
function hasValidRef(config) {
|
||||
{
|
||||
if (hasOwnProperty.call(config, 'ref')) {
|
||||
var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;
|
||||
|
||||
if (getter && getter.isReactWarning) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return config.ref !== undefined;
|
||||
}
|
||||
|
||||
function hasValidKey(config) {
|
||||
{
|
||||
if (hasOwnProperty.call(config, 'key')) {
|
||||
var getter = Object.getOwnPropertyDescriptor(config, 'key').get;
|
||||
|
||||
if (getter && getter.isReactWarning) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return config.key !== undefined;
|
||||
}
|
||||
|
||||
function defineKeyPropWarningGetter(props, displayName) {
|
||||
{
|
||||
var warnAboutAccessingKey = function () {
|
||||
if (!specialPropKeyWarningShown) {
|
||||
specialPropKeyWarningShown = true;
|
||||
|
||||
error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);
|
||||
}
|
||||
};
|
||||
|
||||
warnAboutAccessingKey.isReactWarning = true;
|
||||
Object.defineProperty(props, 'key', {
|
||||
get: warnAboutAccessingKey,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function defineRefPropWarningGetter(props, displayName) {
|
||||
{
|
||||
var warnAboutAccessingRef = function () {
|
||||
if (!specialPropRefWarningShown) {
|
||||
specialPropRefWarningShown = true;
|
||||
|
||||
error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);
|
||||
}
|
||||
};
|
||||
|
||||
warnAboutAccessingRef.isReactWarning = true;
|
||||
Object.defineProperty(props, 'ref', {
|
||||
get: warnAboutAccessingRef,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Factory method to create a new React element. This no longer adheres to
|
||||
* the class pattern, so do not use new to call it. Also, instanceof check
|
||||
* will not work. Instead test $$typeof field against Symbol.for('react.element') to check
|
||||
* if something is a React Element.
|
||||
*
|
||||
* @param {*} type
|
||||
* @param {*} props
|
||||
* @param {*} key
|
||||
* @param {string|object} ref
|
||||
* @param {*} owner
|
||||
* @param {*} self A *temporary* helper to detect places where `this` is
|
||||
* different from the `owner` when React.createElement is called, so that we
|
||||
* can warn. We want to get rid of owner and replace string `ref`s with arrow
|
||||
* functions, and as long as `this` and owner are the same, there will be no
|
||||
* change in behavior.
|
||||
* @param {*} source An annotation object (added by a transpiler or otherwise)
|
||||
* indicating filename, line number, and/or other information.
|
||||
* @internal
|
||||
*/
|
||||
|
||||
|
||||
var ReactElement = function (type, key, ref, self, source, owner, props) {
|
||||
var element = {
|
||||
// This tag allows us to uniquely identify this as a React Element
|
||||
$$typeof: REACT_ELEMENT_TYPE,
|
||||
// Built-in properties that belong on the element
|
||||
type: type,
|
||||
key: key,
|
||||
ref: ref,
|
||||
props: props,
|
||||
// Record the component responsible for creating this element.
|
||||
_owner: owner
|
||||
};
|
||||
|
||||
{
|
||||
// The validation flag is currently mutative. We put it on
|
||||
// an external backing store so that we can freeze the whole object.
|
||||
// This can be replaced with a WeakMap once they are implemented in
|
||||
// commonly used development environments.
|
||||
element._store = {}; // To make comparing ReactElements easier for testing purposes, we make
|
||||
// the validation flag non-enumerable (where possible, which should
|
||||
// include every environment we run tests in), so the test framework
|
||||
// ignores it.
|
||||
|
||||
Object.defineProperty(element._store, 'validated', {
|
||||
configurable: false,
|
||||
enumerable: false,
|
||||
writable: true,
|
||||
value: false
|
||||
}); // self and source are DEV only properties.
|
||||
|
||||
Object.defineProperty(element, '_self', {
|
||||
configurable: false,
|
||||
enumerable: false,
|
||||
writable: false,
|
||||
value: self
|
||||
}); // Two elements created in two different places should be considered
|
||||
// equal for testing purposes and therefore we hide it from enumeration.
|
||||
|
||||
Object.defineProperty(element, '_source', {
|
||||
configurable: false,
|
||||
enumerable: false,
|
||||
writable: false,
|
||||
value: source
|
||||
});
|
||||
|
||||
if (Object.freeze) {
|
||||
Object.freeze(element.props);
|
||||
Object.freeze(element);
|
||||
}
|
||||
}
|
||||
|
||||
return element;
|
||||
};
|
||||
/**
|
||||
* https://github.com/reactjs/rfcs/pull/107
|
||||
* @param {*} type
|
||||
* @param {object} props
|
||||
* @param {string} key
|
||||
*/
|
||||
|
||||
function jsxDEV(type, config, maybeKey, source, self) {
|
||||
{
|
||||
var propName; // Reserved names are extracted
|
||||
|
||||
var props = {};
|
||||
var key = null;
|
||||
var ref = null; // Currently, key can be spread in as a prop. This causes a potential
|
||||
// issue if key is also explicitly declared (ie. <div {...props} key="Hi" />
|
||||
// or <div key="Hi" {...props} /> ). We want to deprecate key spread,
|
||||
// but as an intermediary step, we will use jsxDEV for everything except
|
||||
// <div {...props} key="Hi" />, because we aren't currently able to tell if
|
||||
// key is explicitly declared to be undefined or not.
|
||||
|
||||
if (maybeKey !== undefined) {
|
||||
key = '' + maybeKey;
|
||||
}
|
||||
|
||||
if (hasValidKey(config)) {
|
||||
key = '' + config.key;
|
||||
}
|
||||
|
||||
if (hasValidRef(config)) {
|
||||
ref = config.ref;
|
||||
} // Remaining properties are added to a new props object
|
||||
|
||||
|
||||
for (propName in config) {
|
||||
if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {
|
||||
props[propName] = config[propName];
|
||||
}
|
||||
} // Resolve default props
|
||||
|
||||
|
||||
if (type && type.defaultProps) {
|
||||
var defaultProps = type.defaultProps;
|
||||
|
||||
for (propName in defaultProps) {
|
||||
if (props[propName] === undefined) {
|
||||
props[propName] = defaultProps[propName];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (key || ref) {
|
||||
var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;
|
||||
|
||||
if (key) {
|
||||
defineKeyPropWarningGetter(props, displayName);
|
||||
}
|
||||
|
||||
if (ref) {
|
||||
defineRefPropWarningGetter(props, displayName);
|
||||
}
|
||||
}
|
||||
|
||||
return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);
|
||||
}
|
||||
}
|
||||
|
||||
var ReactCurrentOwner$1 = require('react/lib/ReactCurrentOwner');
|
||||
|
||||
function setCurrentlyValidatingElement$1(element) {
|
||||
currentlyValidatingElement = element;
|
||||
}
|
||||
|
||||
var propTypesMisspellWarningShown;
|
||||
|
||||
{
|
||||
propTypesMisspellWarningShown = false;
|
||||
}
|
||||
/**
|
||||
* Verifies the object is a ReactElement.
|
||||
* See https://reactjs.org/docs/react-api.html#isvalidelement
|
||||
* @param {?object} object
|
||||
* @return {boolean} True if `object` is a ReactElement.
|
||||
* @final
|
||||
*/
|
||||
|
||||
function isValidElement(object) {
|
||||
{
|
||||
return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
|
||||
}
|
||||
}
|
||||
|
||||
function getDeclarationErrorAddendum() {
|
||||
{
|
||||
if (ReactCurrentOwner$1.current) {
|
||||
var name = ReactCurrentOwner$1.current.getName();
|
||||
|
||||
if (name) {
|
||||
return '\n\nCheck the render method of `' + name + '`.';
|
||||
}
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
function getSourceInfoErrorAddendum(source) {
|
||||
{
|
||||
if (source !== undefined) {
|
||||
var fileName = source.fileName.replace(/^.*[\\\/]/, '');
|
||||
var lineNumber = source.lineNumber;
|
||||
return '\n\nCheck your code at ' + fileName + ':' + lineNumber + '.';
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Warn if there's no key explicitly set on dynamic arrays of children or
|
||||
* object keys are not valid. This allows us to keep track of children between
|
||||
* updates.
|
||||
*/
|
||||
|
||||
|
||||
var ownerHasKeyUseWarning = {};
|
||||
|
||||
function getCurrentComponentErrorInfo(parentType) {
|
||||
{
|
||||
var info = getDeclarationErrorAddendum();
|
||||
|
||||
if (!info) {
|
||||
var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;
|
||||
|
||||
if (parentName) {
|
||||
info = "\n\nCheck the top-level render call using <" + parentName + ">.";
|
||||
}
|
||||
}
|
||||
|
||||
return info;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Warn if the element doesn't have an explicit key assigned to it.
|
||||
* This element is in an array. The array could grow and shrink or be
|
||||
* reordered. All children that haven't already been validated are required to
|
||||
* have a "key" property assigned to it. Error statuses are cached so a warning
|
||||
* will only be shown once.
|
||||
*
|
||||
* @internal
|
||||
* @param {ReactElement} element Element that requires a key.
|
||||
* @param {*} parentType element's parent's type.
|
||||
*/
|
||||
|
||||
|
||||
function validateExplicitKey(element, parentType) {
|
||||
{
|
||||
if (!element._store || element._store.validated || element.key != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
element._store.validated = true;
|
||||
var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);
|
||||
|
||||
if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {
|
||||
return;
|
||||
}
|
||||
|
||||
ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a
|
||||
// property, it may be the creator of the child that's responsible for
|
||||
// assigning it a key.
|
||||
|
||||
var childOwner = '';
|
||||
|
||||
if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) {
|
||||
// Give the component that originally created this child.
|
||||
childOwner = " It was passed a child from " + element._owner.getName() + ".";
|
||||
}
|
||||
|
||||
setCurrentlyValidatingElement$1(element);
|
||||
|
||||
error('Each child in a list should have a unique "key" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner);
|
||||
|
||||
setCurrentlyValidatingElement$1(null);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Ensure that every element either is passed in a static location, in an
|
||||
* array with an explicit keys property defined, or in an object literal
|
||||
* with valid key property.
|
||||
*
|
||||
* @internal
|
||||
* @param {ReactNode} node Statically passed child of any type.
|
||||
* @param {*} parentType node's parent's type.
|
||||
*/
|
||||
|
||||
|
||||
function validateChildKeys(node, parentType) {
|
||||
{
|
||||
if (typeof node !== 'object') {
|
||||
return;
|
||||
}
|
||||
|
||||
if (Array.isArray(node)) {
|
||||
for (var i = 0; i < node.length; i++) {
|
||||
var child = node[i];
|
||||
|
||||
if (isValidElement(child)) {
|
||||
validateExplicitKey(child, parentType);
|
||||
}
|
||||
}
|
||||
} else if (isValidElement(node)) {
|
||||
// This element was passed in a valid location.
|
||||
if (node._store) {
|
||||
node._store.validated = true;
|
||||
}
|
||||
} else if (node) {
|
||||
var iteratorFn = getIteratorFn(node);
|
||||
|
||||
if (typeof iteratorFn === 'function') {
|
||||
// Entry iterators used to provide implicit keys,
|
||||
// but now we print a separate warning for them later.
|
||||
if (iteratorFn !== node.entries) {
|
||||
var iterator = iteratorFn.call(node);
|
||||
var step;
|
||||
|
||||
while (!(step = iterator.next()).done) {
|
||||
if (isValidElement(step.value)) {
|
||||
validateExplicitKey(step.value, parentType);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Given an element, validate that its props follow the propTypes definition,
|
||||
* provided by the type.
|
||||
*
|
||||
* @param {ReactElement} element
|
||||
*/
|
||||
|
||||
|
||||
function validatePropTypes(element) {
|
||||
{
|
||||
var type = element.type;
|
||||
|
||||
if (type === null || type === undefined || typeof type === 'string') {
|
||||
return;
|
||||
}
|
||||
|
||||
var propTypes;
|
||||
|
||||
if (typeof type === 'function') {
|
||||
propTypes = type.propTypes;
|
||||
} else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.
|
||||
// Inner props are checked in the reconciler.
|
||||
type.$$typeof === REACT_MEMO_TYPE)) {
|
||||
propTypes = type.propTypes;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
if (propTypes) {
|
||||
// Intentionally inside to avoid triggering lazy initializers:
|
||||
var name = getComponentName(type);
|
||||
checkPropTypes(propTypes, element.props, 'prop', name, element);
|
||||
} else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {
|
||||
propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers:
|
||||
|
||||
var _name = getComponentName(type);
|
||||
|
||||
error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown');
|
||||
}
|
||||
|
||||
if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {
|
||||
error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Given a fragment, validate that it can only be provided with fragment props
|
||||
* @param {ReactElement} fragment
|
||||
*/
|
||||
|
||||
|
||||
function validateFragmentProps(fragment) {
|
||||
{
|
||||
var keys = Object.keys(fragment.props);
|
||||
|
||||
for (var i = 0; i < keys.length; i++) {
|
||||
var key = keys[i];
|
||||
|
||||
if (key !== 'children' && key !== 'key') {
|
||||
setCurrentlyValidatingElement$1(fragment);
|
||||
|
||||
error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);
|
||||
|
||||
setCurrentlyValidatingElement$1(null);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (fragment.ref !== null) {
|
||||
setCurrentlyValidatingElement$1(fragment);
|
||||
|
||||
error('Invalid attribute `ref` supplied to `React.Fragment`.');
|
||||
|
||||
setCurrentlyValidatingElement$1(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function jsxWithValidation(type, props, key, isStaticChildren, source, self) {
|
||||
{
|
||||
var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to
|
||||
// succeed and there will likely be errors in render.
|
||||
|
||||
if (!validType) {
|
||||
var info = '';
|
||||
|
||||
if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {
|
||||
info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports.";
|
||||
}
|
||||
|
||||
var sourceInfo = getSourceInfoErrorAddendum(source);
|
||||
|
||||
if (sourceInfo) {
|
||||
info += sourceInfo;
|
||||
} else {
|
||||
info += getDeclarationErrorAddendum();
|
||||
}
|
||||
|
||||
var typeString;
|
||||
|
||||
if (type === null) {
|
||||
typeString = 'null';
|
||||
} else if (Array.isArray(type)) {
|
||||
typeString = 'array';
|
||||
} else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {
|
||||
typeString = "<" + (getComponentName(type.type) || 'Unknown') + " />";
|
||||
info = ' Did you accidentally export a JSX literal instead of a component?';
|
||||
} else {
|
||||
typeString = typeof type;
|
||||
}
|
||||
|
||||
error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);
|
||||
}
|
||||
|
||||
var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used.
|
||||
// TODO: Drop this when these are no longer allowed as the type argument.
|
||||
|
||||
if (element == null) {
|
||||
return element;
|
||||
} // Skip key warning if the type isn't valid since our key validation logic
|
||||
// doesn't expect a non-string/function type and can throw confusing errors.
|
||||
// We don't want exception behavior to differ between dev and prod.
|
||||
// (Rendering will throw with a helpful message and as soon as the type is
|
||||
// fixed, the key warnings will appear.)
|
||||
|
||||
|
||||
if (validType) {
|
||||
var children = props.children;
|
||||
|
||||
if (children !== undefined) {
|
||||
if (isStaticChildren) {
|
||||
if (Array.isArray(children)) {
|
||||
for (var i = 0; i < children.length; i++) {
|
||||
validateChildKeys(children[i], type);
|
||||
}
|
||||
|
||||
if (Object.freeze) {
|
||||
Object.freeze(children);
|
||||
}
|
||||
} else {
|
||||
error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.');
|
||||
}
|
||||
} else {
|
||||
validateChildKeys(children, type);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (type === exports.Fragment) {
|
||||
validateFragmentProps(element);
|
||||
} else {
|
||||
validatePropTypes(element);
|
||||
}
|
||||
|
||||
return element;
|
||||
}
|
||||
} // These two functions exist to still get child warnings in dev
|
||||
|
||||
var jsxDEV$1 = jsxWithValidation ;
|
||||
|
||||
exports.jsxDEV = jsxDEV$1;
|
||||
})();
|
||||
}
|
||||
9
old_major_packages/14/react/cjs/react-jsx-dev-runtime.production.min.js
vendored
Normal file
9
old_major_packages/14/react/cjs/react-jsx-dev-runtime.production.min.js
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
/** @license React v0.14.10
|
||||
* react-jsx-dev-runtime.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
'use strict';require("react");exports.Fragment=60107;if("function"===typeof Symbol&&Symbol.for){var a=Symbol.for;exports.Fragment=a("react.fragment")}exports.jsxDEV=void 0;
|
||||
883
old_major_packages/14/react/cjs/react-jsx-runtime.development.js
Normal file
883
old_major_packages/14/react/cjs/react-jsx-runtime.development.js
Normal file
@@ -0,0 +1,883 @@
|
||||
/** @license React v0.14.10
|
||||
* react-jsx-runtime.development.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
if (process.env.NODE_ENV !== "production") {
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
var React = require('react');
|
||||
|
||||
// ATTENTION
|
||||
// When adding new symbols to this file,
|
||||
// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'
|
||||
// The Symbol used to tag the ReactElement-like types. If there is no native Symbol
|
||||
// nor polyfill, then a plain number is used for performance.
|
||||
var REACT_ELEMENT_TYPE = 0xeac7;
|
||||
var REACT_PORTAL_TYPE = 0xeaca;
|
||||
exports.Fragment = 0xeacb;
|
||||
var REACT_STRICT_MODE_TYPE = 0xeacc;
|
||||
var REACT_PROFILER_TYPE = 0xead2;
|
||||
var REACT_PROVIDER_TYPE = 0xeacd;
|
||||
var REACT_CONTEXT_TYPE = 0xeace;
|
||||
var REACT_FORWARD_REF_TYPE = 0xead0;
|
||||
var REACT_SUSPENSE_TYPE = 0xead1;
|
||||
var REACT_SUSPENSE_LIST_TYPE = 0xead8;
|
||||
var REACT_MEMO_TYPE = 0xead3;
|
||||
var REACT_LAZY_TYPE = 0xead4;
|
||||
var REACT_BLOCK_TYPE = 0xead9;
|
||||
var REACT_SERVER_BLOCK_TYPE = 0xeada;
|
||||
var REACT_FUNDAMENTAL_TYPE = 0xead5;
|
||||
var REACT_SCOPE_TYPE = 0xead7;
|
||||
var REACT_OPAQUE_ID_TYPE = 0xeae0;
|
||||
var REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1;
|
||||
var REACT_OFFSCREEN_TYPE = 0xeae2;
|
||||
var REACT_LEGACY_HIDDEN_TYPE = 0xeae3;
|
||||
|
||||
if (typeof Symbol === 'function' && Symbol.for) {
|
||||
var symbolFor = Symbol.for;
|
||||
REACT_ELEMENT_TYPE = symbolFor('react.element');
|
||||
REACT_PORTAL_TYPE = symbolFor('react.portal');
|
||||
exports.Fragment = symbolFor('react.fragment');
|
||||
REACT_STRICT_MODE_TYPE = symbolFor('react.strict_mode');
|
||||
REACT_PROFILER_TYPE = symbolFor('react.profiler');
|
||||
REACT_PROVIDER_TYPE = symbolFor('react.provider');
|
||||
REACT_CONTEXT_TYPE = symbolFor('react.context');
|
||||
REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref');
|
||||
REACT_SUSPENSE_TYPE = symbolFor('react.suspense');
|
||||
REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list');
|
||||
REACT_MEMO_TYPE = symbolFor('react.memo');
|
||||
REACT_LAZY_TYPE = symbolFor('react.lazy');
|
||||
REACT_BLOCK_TYPE = symbolFor('react.block');
|
||||
REACT_SERVER_BLOCK_TYPE = symbolFor('react.server.block');
|
||||
REACT_FUNDAMENTAL_TYPE = symbolFor('react.fundamental');
|
||||
REACT_SCOPE_TYPE = symbolFor('react.scope');
|
||||
REACT_OPAQUE_ID_TYPE = symbolFor('react.opaque.id');
|
||||
REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode');
|
||||
REACT_OFFSCREEN_TYPE = symbolFor('react.offscreen');
|
||||
REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden');
|
||||
}
|
||||
|
||||
var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
|
||||
var FAUX_ITERATOR_SYMBOL = '@@iterator';
|
||||
function getIteratorFn(maybeIterable) {
|
||||
if (maybeIterable === null || typeof maybeIterable !== 'object') {
|
||||
return null;
|
||||
}
|
||||
|
||||
var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];
|
||||
|
||||
if (typeof maybeIterator === 'function') {
|
||||
return maybeIterator;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function error(format) {
|
||||
{
|
||||
for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
|
||||
args[_key2 - 1] = arguments[_key2];
|
||||
}
|
||||
|
||||
printWarning('error', format, args);
|
||||
}
|
||||
}
|
||||
|
||||
function printWarning(level, format, args) {
|
||||
// When changing this logic, you might want to also
|
||||
// update consoleWithStackDev.www.js as well.
|
||||
{
|
||||
var stack = '';
|
||||
|
||||
if (stack !== '') {
|
||||
format += '%s';
|
||||
args = args.concat([stack]);
|
||||
}
|
||||
|
||||
var argsWithFormat = args.map(function (item) {
|
||||
return '' + item;
|
||||
}); // Careful: RN currently depends on this prefix
|
||||
|
||||
argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it
|
||||
// breaks IE9: https://github.com/facebook/react/issues/13610
|
||||
// eslint-disable-next-line react-internal/no-production-logging
|
||||
|
||||
Function.prototype.apply.call(console[level], console, argsWithFormat);
|
||||
}
|
||||
}
|
||||
|
||||
// Filter certain DOM attributes (e.g. src, href) if their values are empty strings.
|
||||
|
||||
var enableScopeAPI = false; // Experimental Create Event Handle API.
|
||||
|
||||
function isValidElementType(type) {
|
||||
if (typeof type === 'string' || typeof type === 'function') {
|
||||
return true;
|
||||
} // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).
|
||||
|
||||
|
||||
if (type === exports.Fragment || type === REACT_PROFILER_TYPE || type === REACT_DEBUG_TRACING_MODE_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || type === REACT_LEGACY_HIDDEN_TYPE || enableScopeAPI ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (typeof type === 'object' && type !== null) {
|
||||
if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_BLOCK_TYPE || type[0] === REACT_SERVER_BLOCK_TYPE) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
var BEFORE_SLASH_RE = /^(.*)[\\\/]/;
|
||||
function describeComponentFrame (name, source, ownerName) {
|
||||
var sourceInfo = '';
|
||||
|
||||
if (source) {
|
||||
var path = source.fileName;
|
||||
var fileName = path.replace(BEFORE_SLASH_RE, '');
|
||||
|
||||
{
|
||||
// In DEV, include code for a common special case:
|
||||
// prefer "folder/index.js" instead of just "index.js".
|
||||
if (/^index\./.test(fileName)) {
|
||||
var match = path.match(BEFORE_SLASH_RE);
|
||||
|
||||
if (match) {
|
||||
var pathBeforeSlash = match[1];
|
||||
|
||||
if (pathBeforeSlash) {
|
||||
var folderName = pathBeforeSlash.replace(BEFORE_SLASH_RE, '');
|
||||
fileName = folderName + '/' + fileName;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sourceInfo = ' (at ' + fileName + ':' + source.lineNumber + ')';
|
||||
} else if (ownerName) {
|
||||
sourceInfo = ' (created by ' + ownerName + ')';
|
||||
}
|
||||
|
||||
return '\n in ' + (name || 'Unknown') + sourceInfo;
|
||||
}
|
||||
|
||||
var Resolved = 1;
|
||||
function refineResolvedLazyComponent(lazyComponent) {
|
||||
return lazyComponent._status === Resolved ? lazyComponent._result : null;
|
||||
}
|
||||
|
||||
function getWrappedName(outerType, innerType, wrapperName) {
|
||||
var functionName = innerType.displayName || innerType.name || '';
|
||||
return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName);
|
||||
}
|
||||
|
||||
function getComponentName(type) {
|
||||
if (type == null) {
|
||||
// Host root, text node or just invalid type.
|
||||
return null;
|
||||
}
|
||||
|
||||
{
|
||||
if (typeof type.tag === 'number') {
|
||||
error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.');
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof type === 'function') {
|
||||
return type.displayName || type.name || null;
|
||||
}
|
||||
|
||||
if (typeof type === 'string') {
|
||||
return type;
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
case exports.Fragment:
|
||||
return 'Fragment';
|
||||
|
||||
case REACT_PORTAL_TYPE:
|
||||
return 'Portal';
|
||||
|
||||
case REACT_PROFILER_TYPE:
|
||||
return "Profiler";
|
||||
|
||||
case REACT_STRICT_MODE_TYPE:
|
||||
return 'StrictMode';
|
||||
|
||||
case REACT_SUSPENSE_TYPE:
|
||||
return 'Suspense';
|
||||
|
||||
case REACT_SUSPENSE_LIST_TYPE:
|
||||
return 'SuspenseList';
|
||||
}
|
||||
|
||||
if (typeof type === 'object') {
|
||||
switch (type.$$typeof) {
|
||||
case REACT_CONTEXT_TYPE:
|
||||
return 'Context.Consumer';
|
||||
|
||||
case REACT_PROVIDER_TYPE:
|
||||
return 'Context.Provider';
|
||||
|
||||
case REACT_FORWARD_REF_TYPE:
|
||||
return getWrappedName(type, type.render, 'ForwardRef');
|
||||
|
||||
case REACT_MEMO_TYPE:
|
||||
return getComponentName(type.type);
|
||||
|
||||
case REACT_BLOCK_TYPE:
|
||||
return getComponentName(type.render);
|
||||
|
||||
case REACT_LAZY_TYPE:
|
||||
{
|
||||
var thenable = type;
|
||||
var resolvedThenable = refineResolvedLazyComponent(thenable);
|
||||
|
||||
if (resolvedThenable) {
|
||||
return getComponentName(resolvedThenable);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
var loggedTypeFailures = {};
|
||||
var currentlyValidatingElement = null;
|
||||
|
||||
function setCurrentlyValidatingElement(element) {
|
||||
{
|
||||
currentlyValidatingElement = element;
|
||||
}
|
||||
}
|
||||
|
||||
function checkPropTypes(typeSpecs, values, location, componentName, element) {
|
||||
{
|
||||
// $FlowFixMe This is okay but Flow doesn't know it.
|
||||
var has = Function.call.bind(Object.prototype.hasOwnProperty);
|
||||
|
||||
for (var typeSpecName in typeSpecs) {
|
||||
if (has(typeSpecs, typeSpecName)) {
|
||||
var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to
|
||||
// fail the render phase where it didn't fail before. So we log it.
|
||||
// After these have been cleaned up, we'll let them throw.
|
||||
|
||||
try {
|
||||
// This is intentionally an invariant that gets caught. It's the same
|
||||
// behavior as without this statement except with a better message.
|
||||
if (typeof typeSpecs[typeSpecName] !== 'function') {
|
||||
var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.');
|
||||
err.name = 'Invariant Violation';
|
||||
throw err;
|
||||
}
|
||||
|
||||
error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');
|
||||
} catch (ex) {
|
||||
error$1 = ex;
|
||||
}
|
||||
|
||||
if (error$1 && !(error$1 instanceof Error)) {
|
||||
setCurrentlyValidatingElement(element);
|
||||
|
||||
error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1);
|
||||
|
||||
setCurrentlyValidatingElement(null);
|
||||
}
|
||||
|
||||
if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {
|
||||
// Only monitor this failure once because there tends to be a lot of the
|
||||
// same error.
|
||||
loggedTypeFailures[error$1.message] = true;
|
||||
setCurrentlyValidatingElement(element);
|
||||
|
||||
error('Failed %s type: %s', location, error$1.message);
|
||||
|
||||
setCurrentlyValidatingElement(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var ReactCurrentOwner = require('react/lib/ReactCurrentOwner');
|
||||
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
||||
var RESERVED_PROPS = {
|
||||
key: true,
|
||||
ref: true,
|
||||
__self: true,
|
||||
__source: true
|
||||
};
|
||||
var specialPropKeyWarningShown;
|
||||
var specialPropRefWarningShown;
|
||||
var didWarnAboutStringRefs;
|
||||
|
||||
{
|
||||
didWarnAboutStringRefs = {};
|
||||
}
|
||||
|
||||
function hasValidRef(config) {
|
||||
{
|
||||
if (hasOwnProperty.call(config, 'ref')) {
|
||||
var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;
|
||||
|
||||
if (getter && getter.isReactWarning) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return config.ref !== undefined;
|
||||
}
|
||||
|
||||
function hasValidKey(config) {
|
||||
{
|
||||
if (hasOwnProperty.call(config, 'key')) {
|
||||
var getter = Object.getOwnPropertyDescriptor(config, 'key').get;
|
||||
|
||||
if (getter && getter.isReactWarning) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return config.key !== undefined;
|
||||
}
|
||||
|
||||
function defineKeyPropWarningGetter(props, displayName) {
|
||||
{
|
||||
var warnAboutAccessingKey = function () {
|
||||
if (!specialPropKeyWarningShown) {
|
||||
specialPropKeyWarningShown = true;
|
||||
|
||||
error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);
|
||||
}
|
||||
};
|
||||
|
||||
warnAboutAccessingKey.isReactWarning = true;
|
||||
Object.defineProperty(props, 'key', {
|
||||
get: warnAboutAccessingKey,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function defineRefPropWarningGetter(props, displayName) {
|
||||
{
|
||||
var warnAboutAccessingRef = function () {
|
||||
if (!specialPropRefWarningShown) {
|
||||
specialPropRefWarningShown = true;
|
||||
|
||||
error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);
|
||||
}
|
||||
};
|
||||
|
||||
warnAboutAccessingRef.isReactWarning = true;
|
||||
Object.defineProperty(props, 'ref', {
|
||||
get: warnAboutAccessingRef,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Factory method to create a new React element. This no longer adheres to
|
||||
* the class pattern, so do not use new to call it. Also, instanceof check
|
||||
* will not work. Instead test $$typeof field against Symbol.for('react.element') to check
|
||||
* if something is a React Element.
|
||||
*
|
||||
* @param {*} type
|
||||
* @param {*} props
|
||||
* @param {*} key
|
||||
* @param {string|object} ref
|
||||
* @param {*} owner
|
||||
* @param {*} self A *temporary* helper to detect places where `this` is
|
||||
* different from the `owner` when React.createElement is called, so that we
|
||||
* can warn. We want to get rid of owner and replace string `ref`s with arrow
|
||||
* functions, and as long as `this` and owner are the same, there will be no
|
||||
* change in behavior.
|
||||
* @param {*} source An annotation object (added by a transpiler or otherwise)
|
||||
* indicating filename, line number, and/or other information.
|
||||
* @internal
|
||||
*/
|
||||
|
||||
|
||||
var ReactElement = function (type, key, ref, self, source, owner, props) {
|
||||
var element = {
|
||||
// This tag allows us to uniquely identify this as a React Element
|
||||
$$typeof: REACT_ELEMENT_TYPE,
|
||||
// Built-in properties that belong on the element
|
||||
type: type,
|
||||
key: key,
|
||||
ref: ref,
|
||||
props: props,
|
||||
// Record the component responsible for creating this element.
|
||||
_owner: owner
|
||||
};
|
||||
|
||||
{
|
||||
// The validation flag is currently mutative. We put it on
|
||||
// an external backing store so that we can freeze the whole object.
|
||||
// This can be replaced with a WeakMap once they are implemented in
|
||||
// commonly used development environments.
|
||||
element._store = {}; // To make comparing ReactElements easier for testing purposes, we make
|
||||
// the validation flag non-enumerable (where possible, which should
|
||||
// include every environment we run tests in), so the test framework
|
||||
// ignores it.
|
||||
|
||||
Object.defineProperty(element._store, 'validated', {
|
||||
configurable: false,
|
||||
enumerable: false,
|
||||
writable: true,
|
||||
value: false
|
||||
}); // self and source are DEV only properties.
|
||||
|
||||
Object.defineProperty(element, '_self', {
|
||||
configurable: false,
|
||||
enumerable: false,
|
||||
writable: false,
|
||||
value: self
|
||||
}); // Two elements created in two different places should be considered
|
||||
// equal for testing purposes and therefore we hide it from enumeration.
|
||||
|
||||
Object.defineProperty(element, '_source', {
|
||||
configurable: false,
|
||||
enumerable: false,
|
||||
writable: false,
|
||||
value: source
|
||||
});
|
||||
|
||||
if (Object.freeze) {
|
||||
Object.freeze(element.props);
|
||||
Object.freeze(element);
|
||||
}
|
||||
}
|
||||
|
||||
return element;
|
||||
};
|
||||
/**
|
||||
* https://github.com/reactjs/rfcs/pull/107
|
||||
* @param {*} type
|
||||
* @param {object} props
|
||||
* @param {string} key
|
||||
*/
|
||||
|
||||
function jsxDEV(type, config, maybeKey, source, self) {
|
||||
{
|
||||
var propName; // Reserved names are extracted
|
||||
|
||||
var props = {};
|
||||
var key = null;
|
||||
var ref = null; // Currently, key can be spread in as a prop. This causes a potential
|
||||
// issue if key is also explicitly declared (ie. <div {...props} key="Hi" />
|
||||
// or <div key="Hi" {...props} /> ). We want to deprecate key spread,
|
||||
// but as an intermediary step, we will use jsxDEV for everything except
|
||||
// <div {...props} key="Hi" />, because we aren't currently able to tell if
|
||||
// key is explicitly declared to be undefined or not.
|
||||
|
||||
if (maybeKey !== undefined) {
|
||||
key = '' + maybeKey;
|
||||
}
|
||||
|
||||
if (hasValidKey(config)) {
|
||||
key = '' + config.key;
|
||||
}
|
||||
|
||||
if (hasValidRef(config)) {
|
||||
ref = config.ref;
|
||||
} // Remaining properties are added to a new props object
|
||||
|
||||
|
||||
for (propName in config) {
|
||||
if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {
|
||||
props[propName] = config[propName];
|
||||
}
|
||||
} // Resolve default props
|
||||
|
||||
|
||||
if (type && type.defaultProps) {
|
||||
var defaultProps = type.defaultProps;
|
||||
|
||||
for (propName in defaultProps) {
|
||||
if (props[propName] === undefined) {
|
||||
props[propName] = defaultProps[propName];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (key || ref) {
|
||||
var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;
|
||||
|
||||
if (key) {
|
||||
defineKeyPropWarningGetter(props, displayName);
|
||||
}
|
||||
|
||||
if (ref) {
|
||||
defineRefPropWarningGetter(props, displayName);
|
||||
}
|
||||
}
|
||||
|
||||
return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);
|
||||
}
|
||||
}
|
||||
|
||||
var ReactCurrentOwner$1 = require('react/lib/ReactCurrentOwner');
|
||||
|
||||
function setCurrentlyValidatingElement$1(element) {
|
||||
currentlyValidatingElement = element;
|
||||
}
|
||||
|
||||
var propTypesMisspellWarningShown;
|
||||
|
||||
{
|
||||
propTypesMisspellWarningShown = false;
|
||||
}
|
||||
/**
|
||||
* Verifies the object is a ReactElement.
|
||||
* See https://reactjs.org/docs/react-api.html#isvalidelement
|
||||
* @param {?object} object
|
||||
* @return {boolean} True if `object` is a ReactElement.
|
||||
* @final
|
||||
*/
|
||||
|
||||
function isValidElement(object) {
|
||||
{
|
||||
return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
|
||||
}
|
||||
}
|
||||
|
||||
function getDeclarationErrorAddendum() {
|
||||
{
|
||||
if (ReactCurrentOwner$1.current) {
|
||||
var name = ReactCurrentOwner$1.current.getName();
|
||||
|
||||
if (name) {
|
||||
return '\n\nCheck the render method of `' + name + '`.';
|
||||
}
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
function getSourceInfoErrorAddendum(source) {
|
||||
{
|
||||
if (source !== undefined) {
|
||||
var fileName = source.fileName.replace(/^.*[\\\/]/, '');
|
||||
var lineNumber = source.lineNumber;
|
||||
return '\n\nCheck your code at ' + fileName + ':' + lineNumber + '.';
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Warn if there's no key explicitly set on dynamic arrays of children or
|
||||
* object keys are not valid. This allows us to keep track of children between
|
||||
* updates.
|
||||
*/
|
||||
|
||||
|
||||
var ownerHasKeyUseWarning = {};
|
||||
|
||||
function getCurrentComponentErrorInfo(parentType) {
|
||||
{
|
||||
var info = getDeclarationErrorAddendum();
|
||||
|
||||
if (!info) {
|
||||
var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;
|
||||
|
||||
if (parentName) {
|
||||
info = "\n\nCheck the top-level render call using <" + parentName + ">.";
|
||||
}
|
||||
}
|
||||
|
||||
return info;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Warn if the element doesn't have an explicit key assigned to it.
|
||||
* This element is in an array. The array could grow and shrink or be
|
||||
* reordered. All children that haven't already been validated are required to
|
||||
* have a "key" property assigned to it. Error statuses are cached so a warning
|
||||
* will only be shown once.
|
||||
*
|
||||
* @internal
|
||||
* @param {ReactElement} element Element that requires a key.
|
||||
* @param {*} parentType element's parent's type.
|
||||
*/
|
||||
|
||||
|
||||
function validateExplicitKey(element, parentType) {
|
||||
{
|
||||
if (!element._store || element._store.validated || element.key != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
element._store.validated = true;
|
||||
var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);
|
||||
|
||||
if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {
|
||||
return;
|
||||
}
|
||||
|
||||
ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a
|
||||
// property, it may be the creator of the child that's responsible for
|
||||
// assigning it a key.
|
||||
|
||||
var childOwner = '';
|
||||
|
||||
if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) {
|
||||
// Give the component that originally created this child.
|
||||
childOwner = " It was passed a child from " + element._owner.getName() + ".";
|
||||
}
|
||||
|
||||
setCurrentlyValidatingElement$1(element);
|
||||
|
||||
error('Each child in a list should have a unique "key" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner);
|
||||
|
||||
setCurrentlyValidatingElement$1(null);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Ensure that every element either is passed in a static location, in an
|
||||
* array with an explicit keys property defined, or in an object literal
|
||||
* with valid key property.
|
||||
*
|
||||
* @internal
|
||||
* @param {ReactNode} node Statically passed child of any type.
|
||||
* @param {*} parentType node's parent's type.
|
||||
*/
|
||||
|
||||
|
||||
function validateChildKeys(node, parentType) {
|
||||
{
|
||||
if (typeof node !== 'object') {
|
||||
return;
|
||||
}
|
||||
|
||||
if (Array.isArray(node)) {
|
||||
for (var i = 0; i < node.length; i++) {
|
||||
var child = node[i];
|
||||
|
||||
if (isValidElement(child)) {
|
||||
validateExplicitKey(child, parentType);
|
||||
}
|
||||
}
|
||||
} else if (isValidElement(node)) {
|
||||
// This element was passed in a valid location.
|
||||
if (node._store) {
|
||||
node._store.validated = true;
|
||||
}
|
||||
} else if (node) {
|
||||
var iteratorFn = getIteratorFn(node);
|
||||
|
||||
if (typeof iteratorFn === 'function') {
|
||||
// Entry iterators used to provide implicit keys,
|
||||
// but now we print a separate warning for them later.
|
||||
if (iteratorFn !== node.entries) {
|
||||
var iterator = iteratorFn.call(node);
|
||||
var step;
|
||||
|
||||
while (!(step = iterator.next()).done) {
|
||||
if (isValidElement(step.value)) {
|
||||
validateExplicitKey(step.value, parentType);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Given an element, validate that its props follow the propTypes definition,
|
||||
* provided by the type.
|
||||
*
|
||||
* @param {ReactElement} element
|
||||
*/
|
||||
|
||||
|
||||
function validatePropTypes(element) {
|
||||
{
|
||||
var type = element.type;
|
||||
|
||||
if (type === null || type === undefined || typeof type === 'string') {
|
||||
return;
|
||||
}
|
||||
|
||||
var propTypes;
|
||||
|
||||
if (typeof type === 'function') {
|
||||
propTypes = type.propTypes;
|
||||
} else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.
|
||||
// Inner props are checked in the reconciler.
|
||||
type.$$typeof === REACT_MEMO_TYPE)) {
|
||||
propTypes = type.propTypes;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
if (propTypes) {
|
||||
// Intentionally inside to avoid triggering lazy initializers:
|
||||
var name = getComponentName(type);
|
||||
checkPropTypes(propTypes, element.props, 'prop', name, element);
|
||||
} else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {
|
||||
propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers:
|
||||
|
||||
var _name = getComponentName(type);
|
||||
|
||||
error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown');
|
||||
}
|
||||
|
||||
if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {
|
||||
error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Given a fragment, validate that it can only be provided with fragment props
|
||||
* @param {ReactElement} fragment
|
||||
*/
|
||||
|
||||
|
||||
function validateFragmentProps(fragment) {
|
||||
{
|
||||
var keys = Object.keys(fragment.props);
|
||||
|
||||
for (var i = 0; i < keys.length; i++) {
|
||||
var key = keys[i];
|
||||
|
||||
if (key !== 'children' && key !== 'key') {
|
||||
setCurrentlyValidatingElement$1(fragment);
|
||||
|
||||
error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);
|
||||
|
||||
setCurrentlyValidatingElement$1(null);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (fragment.ref !== null) {
|
||||
setCurrentlyValidatingElement$1(fragment);
|
||||
|
||||
error('Invalid attribute `ref` supplied to `React.Fragment`.');
|
||||
|
||||
setCurrentlyValidatingElement$1(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function jsxWithValidation(type, props, key, isStaticChildren, source, self) {
|
||||
{
|
||||
var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to
|
||||
// succeed and there will likely be errors in render.
|
||||
|
||||
if (!validType) {
|
||||
var info = '';
|
||||
|
||||
if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {
|
||||
info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports.";
|
||||
}
|
||||
|
||||
var sourceInfo = getSourceInfoErrorAddendum(source);
|
||||
|
||||
if (sourceInfo) {
|
||||
info += sourceInfo;
|
||||
} else {
|
||||
info += getDeclarationErrorAddendum();
|
||||
}
|
||||
|
||||
var typeString;
|
||||
|
||||
if (type === null) {
|
||||
typeString = 'null';
|
||||
} else if (Array.isArray(type)) {
|
||||
typeString = 'array';
|
||||
} else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {
|
||||
typeString = "<" + (getComponentName(type.type) || 'Unknown') + " />";
|
||||
info = ' Did you accidentally export a JSX literal instead of a component?';
|
||||
} else {
|
||||
typeString = typeof type;
|
||||
}
|
||||
|
||||
error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);
|
||||
}
|
||||
|
||||
var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used.
|
||||
// TODO: Drop this when these are no longer allowed as the type argument.
|
||||
|
||||
if (element == null) {
|
||||
return element;
|
||||
} // Skip key warning if the type isn't valid since our key validation logic
|
||||
// doesn't expect a non-string/function type and can throw confusing errors.
|
||||
// We don't want exception behavior to differ between dev and prod.
|
||||
// (Rendering will throw with a helpful message and as soon as the type is
|
||||
// fixed, the key warnings will appear.)
|
||||
|
||||
|
||||
if (validType) {
|
||||
var children = props.children;
|
||||
|
||||
if (children !== undefined) {
|
||||
if (isStaticChildren) {
|
||||
if (Array.isArray(children)) {
|
||||
for (var i = 0; i < children.length; i++) {
|
||||
validateChildKeys(children[i], type);
|
||||
}
|
||||
|
||||
if (Object.freeze) {
|
||||
Object.freeze(children);
|
||||
}
|
||||
} else {
|
||||
error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.');
|
||||
}
|
||||
} else {
|
||||
validateChildKeys(children, type);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (type === exports.Fragment) {
|
||||
validateFragmentProps(element);
|
||||
} else {
|
||||
validatePropTypes(element);
|
||||
}
|
||||
|
||||
return element;
|
||||
}
|
||||
} // These two functions exist to still get child warnings in dev
|
||||
// even with the prod transform. This means that jsxDEV is purely
|
||||
// opt-in behavior for better messages but that we won't stop
|
||||
// giving you warnings if you use production apis.
|
||||
|
||||
function jsxWithValidationStatic(type, props, key) {
|
||||
{
|
||||
return jsxWithValidation(type, props, key, true);
|
||||
}
|
||||
}
|
||||
function jsxWithValidationDynamic(type, props, key) {
|
||||
{
|
||||
return jsxWithValidation(type, props, key, false);
|
||||
}
|
||||
}
|
||||
|
||||
var jsx = jsxWithValidationDynamic ; // we may want to special case jsxs internally to take advantage of static children.
|
||||
// for now we can ship identical prod functions
|
||||
|
||||
var jsxs = jsxWithValidationStatic ;
|
||||
|
||||
exports.jsx = jsx;
|
||||
exports.jsxs = jsxs;
|
||||
})();
|
||||
}
|
||||
10
old_major_packages/14/react/cjs/react-jsx-runtime.production.min.js
vendored
Normal file
10
old_major_packages/14/react/cjs/react-jsx-runtime.production.min.js
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
/** @license React v0.14.10
|
||||
* react-jsx-runtime.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
'use strict';var f=require("react"),g=60103;exports.Fragment=60107;if("function"===typeof Symbol&&Symbol.for){var h=Symbol.for;g=h("react.element");exports.Fragment=h("react.fragment")}var m=require("react/lib/ReactCurrentOwner"),n=Object.prototype.hasOwnProperty,p={key:!0,ref:!0,__self:!0,__source:!0};
|
||||
function q(c,a,k){var b,d={},e=null,l=null;void 0!==k&&(e=""+k);void 0!==a.key&&(e=""+a.key);void 0!==a.ref&&(l=a.ref);for(b in a)n.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:g,type:c,key:e,ref:l,props:d,_owner:m.current}}exports.jsx=q;exports.jsxs=q;
|
||||
20775
old_major_packages/14/react/dist/react-with-addons.js
vendored
Normal file
20775
old_major_packages/14/react/dist/react-with-addons.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
16
old_major_packages/14/react/dist/react-with-addons.min.js
vendored
Normal file
16
old_major_packages/14/react/dist/react-with-addons.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
18812
old_major_packages/14/react/dist/react.js
vendored
Normal file
18812
old_major_packages/14/react/dist/react.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
16
old_major_packages/14/react/dist/react.min.js
vendored
Normal file
16
old_major_packages/14/react/dist/react.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
7
old_major_packages/14/react/jsx-dev-runtime.js
Normal file
7
old_major_packages/14/react/jsx-dev-runtime.js
Normal file
@@ -0,0 +1,7 @@
|
||||
'use strict';
|
||||
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
module.exports = require('./cjs/react-jsx-dev-runtime.production.min.js');
|
||||
} else {
|
||||
module.exports = require('./cjs/react-jsx-dev-runtime.development.js');
|
||||
}
|
||||
7
old_major_packages/14/react/jsx-runtime.js
Normal file
7
old_major_packages/14/react/jsx-runtime.js
Normal file
@@ -0,0 +1,7 @@
|
||||
'use strict';
|
||||
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
module.exports = require('./cjs/react-jsx-runtime.production.min.js');
|
||||
} else {
|
||||
module.exports = require('./cjs/react-jsx-runtime.development.js');
|
||||
}
|
||||
36
old_major_packages/14/react/lib/AutoFocusUtils.js
Normal file
36
old_major_packages/14/react/lib/AutoFocusUtils.js
Normal file
@@ -0,0 +1,36 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule AutoFocusUtils
|
||||
* @typechecks static-only
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ReactMount = require('./ReactMount');
|
||||
|
||||
var findDOMNode = require('./findDOMNode');
|
||||
var focusNode = require('fbjs/lib/focusNode');
|
||||
|
||||
var Mixin = {
|
||||
componentDidMount: function () {
|
||||
if (this.props.autoFocus) {
|
||||
focusNode(findDOMNode(this));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var AutoFocusUtils = {
|
||||
Mixin: Mixin,
|
||||
|
||||
focusDOMComponent: function () {
|
||||
focusNode(ReactMount.getNode(this._rootNodeID));
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = AutoFocusUtils;
|
||||
405
old_major_packages/14/react/lib/BeforeInputEventPlugin.js
Normal file
405
old_major_packages/14/react/lib/BeforeInputEventPlugin.js
Normal file
@@ -0,0 +1,405 @@
|
||||
/**
|
||||
* Copyright 2013-2015 Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule BeforeInputEventPlugin
|
||||
* @typechecks static-only
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var EventConstants = require('./EventConstants');
|
||||
var EventPropagators = require('./EventPropagators');
|
||||
var ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');
|
||||
var FallbackCompositionState = require('./FallbackCompositionState');
|
||||
var SyntheticCompositionEvent = require('./SyntheticCompositionEvent');
|
||||
var SyntheticInputEvent = require('./SyntheticInputEvent');
|
||||
|
||||
var keyOf = require('fbjs/lib/keyOf');
|
||||
|
||||
var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space
|
||||
var START_KEYCODE = 229;
|
||||
|
||||
var canUseCompositionEvent = ExecutionEnvironment.canUseDOM && 'CompositionEvent' in window;
|
||||
|
||||
var documentMode = null;
|
||||
if (ExecutionEnvironment.canUseDOM && 'documentMode' in document) {
|
||||
documentMode = document.documentMode;
|
||||
}
|
||||
|
||||
// Webkit offers a very useful `textInput` event that can be used to
|
||||
// directly represent `beforeInput`. The IE `textinput` event is not as
|
||||
// useful, so we don't use it.
|
||||
var canUseTextInputEvent = ExecutionEnvironment.canUseDOM && 'TextEvent' in window && !documentMode && !isPresto();
|
||||
|
||||
// In IE9+, we have access to composition events, but the data supplied
|
||||
// by the native compositionend event may be incorrect. Japanese ideographic
|
||||
// spaces, for instance (\u3000) are not recorded correctly.
|
||||
var useFallbackCompositionData = ExecutionEnvironment.canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11);
|
||||
|
||||
/**
|
||||
* Opera <= 12 includes TextEvent in window, but does not fire
|
||||
* text input events. Rely on keypress instead.
|
||||
*/
|
||||
function isPresto() {
|
||||
var opera = window.opera;
|
||||
return typeof opera === 'object' && typeof opera.version === 'function' && parseInt(opera.version(), 10) <= 12;
|
||||
}
|
||||
|
||||
var SPACEBAR_CODE = 32;
|
||||
var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE);
|
||||
|
||||
var topLevelTypes = EventConstants.topLevelTypes;
|
||||
|
||||
// Events and their corresponding property names.
|
||||
var eventTypes = {
|
||||
beforeInput: {
|
||||
phasedRegistrationNames: {
|
||||
bubbled: keyOf({ onBeforeInput: null }),
|
||||
captured: keyOf({ onBeforeInputCapture: null })
|
||||
},
|
||||
dependencies: [topLevelTypes.topCompositionEnd, topLevelTypes.topKeyPress, topLevelTypes.topTextInput, topLevelTypes.topPaste]
|
||||
},
|
||||
compositionEnd: {
|
||||
phasedRegistrationNames: {
|
||||
bubbled: keyOf({ onCompositionEnd: null }),
|
||||
captured: keyOf({ onCompositionEndCapture: null })
|
||||
},
|
||||
dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionEnd, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown]
|
||||
},
|
||||
compositionStart: {
|
||||
phasedRegistrationNames: {
|
||||
bubbled: keyOf({ onCompositionStart: null }),
|
||||
captured: keyOf({ onCompositionStartCapture: null })
|
||||
},
|
||||
dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionStart, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown]
|
||||
},
|
||||
compositionUpdate: {
|
||||
phasedRegistrationNames: {
|
||||
bubbled: keyOf({ onCompositionUpdate: null }),
|
||||
captured: keyOf({ onCompositionUpdateCapture: null })
|
||||
},
|
||||
dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionUpdate, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown]
|
||||
}
|
||||
};
|
||||
|
||||
// Track whether we've ever handled a keypress on the space key.
|
||||
var hasSpaceKeypress = false;
|
||||
|
||||
/**
|
||||
* Return whether a native keypress event is assumed to be a command.
|
||||
* This is required because Firefox fires `keypress` events for key commands
|
||||
* (cut, copy, select-all, etc.) even though no character is inserted.
|
||||
*/
|
||||
function isKeypressCommand(nativeEvent) {
|
||||
return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) &&
|
||||
// ctrlKey && altKey is equivalent to AltGr, and is not a command.
|
||||
!(nativeEvent.ctrlKey && nativeEvent.altKey);
|
||||
}
|
||||
|
||||
/**
|
||||
* Translate native top level events into event types.
|
||||
*
|
||||
* @param {string} topLevelType
|
||||
* @return {object}
|
||||
*/
|
||||
function getCompositionEventType(topLevelType) {
|
||||
switch (topLevelType) {
|
||||
case topLevelTypes.topCompositionStart:
|
||||
return eventTypes.compositionStart;
|
||||
case topLevelTypes.topCompositionEnd:
|
||||
return eventTypes.compositionEnd;
|
||||
case topLevelTypes.topCompositionUpdate:
|
||||
return eventTypes.compositionUpdate;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Does our fallback best-guess model think this event signifies that
|
||||
* composition has begun?
|
||||
*
|
||||
* @param {string} topLevelType
|
||||
* @param {object} nativeEvent
|
||||
* @return {boolean}
|
||||
*/
|
||||
function isFallbackCompositionStart(topLevelType, nativeEvent) {
|
||||
return topLevelType === topLevelTypes.topKeyDown && nativeEvent.keyCode === START_KEYCODE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Does our fallback mode think that this event is the end of composition?
|
||||
*
|
||||
* @param {string} topLevelType
|
||||
* @param {object} nativeEvent
|
||||
* @return {boolean}
|
||||
*/
|
||||
function isFallbackCompositionEnd(topLevelType, nativeEvent) {
|
||||
switch (topLevelType) {
|
||||
case topLevelTypes.topKeyUp:
|
||||
// Command keys insert or clear IME input.
|
||||
return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1;
|
||||
case topLevelTypes.topKeyDown:
|
||||
// Expect IME keyCode on each keydown. If we get any other
|
||||
// code we must have exited earlier.
|
||||
return nativeEvent.keyCode !== START_KEYCODE;
|
||||
case topLevelTypes.topKeyPress:
|
||||
case topLevelTypes.topMouseDown:
|
||||
case topLevelTypes.topBlur:
|
||||
// Events are not possible without cancelling IME.
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Google Input Tools provides composition data via a CustomEvent,
|
||||
* with the `data` property populated in the `detail` object. If this
|
||||
* is available on the event object, use it. If not, this is a plain
|
||||
* composition event and we have nothing special to extract.
|
||||
*
|
||||
* @param {object} nativeEvent
|
||||
* @return {?string}
|
||||
*/
|
||||
function getDataFromCustomEvent(nativeEvent) {
|
||||
var detail = nativeEvent.detail;
|
||||
if (typeof detail === 'object' && 'data' in detail) {
|
||||
return detail.data;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// Track the current IME composition fallback object, if any.
|
||||
var currentComposition = null;
|
||||
|
||||
/**
|
||||
* @param {string} topLevelType Record from `EventConstants`.
|
||||
* @param {DOMEventTarget} topLevelTarget The listening component root node.
|
||||
* @param {string} topLevelTargetID ID of `topLevelTarget`.
|
||||
* @param {object} nativeEvent Native browser event.
|
||||
* @return {?object} A SyntheticCompositionEvent.
|
||||
*/
|
||||
function extractCompositionEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {
|
||||
var eventType;
|
||||
var fallbackData;
|
||||
|
||||
if (canUseCompositionEvent) {
|
||||
eventType = getCompositionEventType(topLevelType);
|
||||
} else if (!currentComposition) {
|
||||
if (isFallbackCompositionStart(topLevelType, nativeEvent)) {
|
||||
eventType = eventTypes.compositionStart;
|
||||
}
|
||||
} else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) {
|
||||
eventType = eventTypes.compositionEnd;
|
||||
}
|
||||
|
||||
if (!eventType) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (useFallbackCompositionData) {
|
||||
// The current composition is stored statically and must not be
|
||||
// overwritten while composition continues.
|
||||
if (!currentComposition && eventType === eventTypes.compositionStart) {
|
||||
currentComposition = FallbackCompositionState.getPooled(topLevelTarget);
|
||||
} else if (eventType === eventTypes.compositionEnd) {
|
||||
if (currentComposition) {
|
||||
fallbackData = currentComposition.getData();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var event = SyntheticCompositionEvent.getPooled(eventType, topLevelTargetID, nativeEvent, nativeEventTarget);
|
||||
|
||||
if (fallbackData) {
|
||||
// Inject data generated from fallback path into the synthetic event.
|
||||
// This matches the property of native CompositionEventInterface.
|
||||
event.data = fallbackData;
|
||||
} else {
|
||||
var customData = getDataFromCustomEvent(nativeEvent);
|
||||
if (customData !== null) {
|
||||
event.data = customData;
|
||||
}
|
||||
}
|
||||
|
||||
EventPropagators.accumulateTwoPhaseDispatches(event);
|
||||
return event;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} topLevelType Record from `EventConstants`.
|
||||
* @param {object} nativeEvent Native browser event.
|
||||
* @return {?string} The string corresponding to this `beforeInput` event.
|
||||
*/
|
||||
function getNativeBeforeInputChars(topLevelType, nativeEvent) {
|
||||
switch (topLevelType) {
|
||||
case topLevelTypes.topCompositionEnd:
|
||||
return getDataFromCustomEvent(nativeEvent);
|
||||
case topLevelTypes.topKeyPress:
|
||||
/**
|
||||
* If native `textInput` events are available, our goal is to make
|
||||
* use of them. However, there is a special case: the spacebar key.
|
||||
* In Webkit, preventing default on a spacebar `textInput` event
|
||||
* cancels character insertion, but it *also* causes the browser
|
||||
* to fall back to its default spacebar behavior of scrolling the
|
||||
* page.
|
||||
*
|
||||
* Tracking at:
|
||||
* https://code.google.com/p/chromium/issues/detail?id=355103
|
||||
*
|
||||
* To avoid this issue, use the keypress event as if no `textInput`
|
||||
* event is available.
|
||||
*/
|
||||
var which = nativeEvent.which;
|
||||
if (which !== SPACEBAR_CODE) {
|
||||
return null;
|
||||
}
|
||||
|
||||
hasSpaceKeypress = true;
|
||||
return SPACEBAR_CHAR;
|
||||
|
||||
case topLevelTypes.topTextInput:
|
||||
// Record the characters to be added to the DOM.
|
||||
var chars = nativeEvent.data;
|
||||
|
||||
// If it's a spacebar character, assume that we have already handled
|
||||
// it at the keypress level and bail immediately. Android Chrome
|
||||
// doesn't give us keycodes, so we need to blacklist it.
|
||||
if (chars === SPACEBAR_CHAR && hasSpaceKeypress) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return chars;
|
||||
|
||||
default:
|
||||
// For other native event types, do nothing.
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* For browsers that do not provide the `textInput` event, extract the
|
||||
* appropriate string to use for SyntheticInputEvent.
|
||||
*
|
||||
* @param {string} topLevelType Record from `EventConstants`.
|
||||
* @param {object} nativeEvent Native browser event.
|
||||
* @return {?string} The fallback string for this `beforeInput` event.
|
||||
*/
|
||||
function getFallbackBeforeInputChars(topLevelType, nativeEvent) {
|
||||
// If we are currently composing (IME) and using a fallback to do so,
|
||||
// try to extract the composed characters from the fallback object.
|
||||
if (currentComposition) {
|
||||
if (topLevelType === topLevelTypes.topCompositionEnd || isFallbackCompositionEnd(topLevelType, nativeEvent)) {
|
||||
var chars = currentComposition.getData();
|
||||
FallbackCompositionState.release(currentComposition);
|
||||
currentComposition = null;
|
||||
return chars;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
switch (topLevelType) {
|
||||
case topLevelTypes.topPaste:
|
||||
// If a paste event occurs after a keypress, throw out the input
|
||||
// chars. Paste events should not lead to BeforeInput events.
|
||||
return null;
|
||||
case topLevelTypes.topKeyPress:
|
||||
/**
|
||||
* As of v27, Firefox may fire keypress events even when no character
|
||||
* will be inserted. A few possibilities:
|
||||
*
|
||||
* - `which` is `0`. Arrow keys, Esc key, etc.
|
||||
*
|
||||
* - `which` is the pressed key code, but no char is available.
|
||||
* Ex: 'AltGr + d` in Polish. There is no modified character for
|
||||
* this key combination and no character is inserted into the
|
||||
* document, but FF fires the keypress for char code `100` anyway.
|
||||
* No `input` event will occur.
|
||||
*
|
||||
* - `which` is the pressed key code, but a command combination is
|
||||
* being used. Ex: `Cmd+C`. No character is inserted, and no
|
||||
* `input` event will occur.
|
||||
*/
|
||||
if (nativeEvent.which && !isKeypressCommand(nativeEvent)) {
|
||||
return String.fromCharCode(nativeEvent.which);
|
||||
}
|
||||
return null;
|
||||
case topLevelTypes.topCompositionEnd:
|
||||
return useFallbackCompositionData ? null : nativeEvent.data;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract a SyntheticInputEvent for `beforeInput`, based on either native
|
||||
* `textInput` or fallback behavior.
|
||||
*
|
||||
* @param {string} topLevelType Record from `EventConstants`.
|
||||
* @param {DOMEventTarget} topLevelTarget The listening component root node.
|
||||
* @param {string} topLevelTargetID ID of `topLevelTarget`.
|
||||
* @param {object} nativeEvent Native browser event.
|
||||
* @return {?object} A SyntheticInputEvent.
|
||||
*/
|
||||
function extractBeforeInputEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {
|
||||
var chars;
|
||||
|
||||
if (canUseTextInputEvent) {
|
||||
chars = getNativeBeforeInputChars(topLevelType, nativeEvent);
|
||||
} else {
|
||||
chars = getFallbackBeforeInputChars(topLevelType, nativeEvent);
|
||||
}
|
||||
|
||||
// If no characters are being inserted, no BeforeInput event should
|
||||
// be fired.
|
||||
if (!chars) {
|
||||
return null;
|
||||
}
|
||||
|
||||
var event = SyntheticInputEvent.getPooled(eventTypes.beforeInput, topLevelTargetID, nativeEvent, nativeEventTarget);
|
||||
|
||||
event.data = chars;
|
||||
EventPropagators.accumulateTwoPhaseDispatches(event);
|
||||
return event;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an `onBeforeInput` event to match
|
||||
* http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents.
|
||||
*
|
||||
* This event plugin is based on the native `textInput` event
|
||||
* available in Chrome, Safari, Opera, and IE. This event fires after
|
||||
* `onKeyPress` and `onCompositionEnd`, but before `onInput`.
|
||||
*
|
||||
* `beforeInput` is spec'd but not implemented in any browsers, and
|
||||
* the `input` event does not provide any useful information about what has
|
||||
* actually been added, contrary to the spec. Thus, `textInput` is the best
|
||||
* available event to identify the characters that have actually been inserted
|
||||
* into the target node.
|
||||
*
|
||||
* This plugin is also responsible for emitting `composition` events, thus
|
||||
* allowing us to share composition fallback code for both `beforeInput` and
|
||||
* `composition` event types.
|
||||
*/
|
||||
var BeforeInputEventPlugin = {
|
||||
|
||||
eventTypes: eventTypes,
|
||||
|
||||
/**
|
||||
* @param {string} topLevelType Record from `EventConstants`.
|
||||
* @param {DOMEventTarget} topLevelTarget The listening component root node.
|
||||
* @param {string} topLevelTargetID ID of `topLevelTarget`.
|
||||
* @param {object} nativeEvent Native browser event.
|
||||
* @return {*} An accumulation of synthetic events.
|
||||
* @see {EventPluginHub.extractEvents}
|
||||
*/
|
||||
extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {
|
||||
return [extractCompositionEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget), extractBeforeInputEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget)];
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = BeforeInputEventPlugin;
|
||||
139
old_major_packages/14/react/lib/CSSProperty.js
Normal file
139
old_major_packages/14/react/lib/CSSProperty.js
Normal file
@@ -0,0 +1,139 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule CSSProperty
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* CSS properties which accept numbers but are not in units of "px".
|
||||
*/
|
||||
var isUnitlessNumber = {
|
||||
animationIterationCount: true,
|
||||
boxFlex: true,
|
||||
boxFlexGroup: true,
|
||||
boxOrdinalGroup: true,
|
||||
columnCount: true,
|
||||
flex: true,
|
||||
flexGrow: true,
|
||||
flexPositive: true,
|
||||
flexShrink: true,
|
||||
flexNegative: true,
|
||||
flexOrder: true,
|
||||
fontWeight: true,
|
||||
lineClamp: true,
|
||||
lineHeight: true,
|
||||
opacity: true,
|
||||
order: true,
|
||||
orphans: true,
|
||||
tabSize: true,
|
||||
widows: true,
|
||||
zIndex: true,
|
||||
zoom: true,
|
||||
|
||||
// SVG-related properties
|
||||
fillOpacity: true,
|
||||
stopOpacity: true,
|
||||
strokeDashoffset: true,
|
||||
strokeOpacity: true,
|
||||
strokeWidth: true
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {string} prefix vendor-specific prefix, eg: Webkit
|
||||
* @param {string} key style name, eg: transitionDuration
|
||||
* @return {string} style name prefixed with `prefix`, properly camelCased, eg:
|
||||
* WebkitTransitionDuration
|
||||
*/
|
||||
function prefixKey(prefix, key) {
|
||||
return prefix + key.charAt(0).toUpperCase() + key.substring(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Support style names that may come passed in prefixed by adding permutations
|
||||
* of vendor prefixes.
|
||||
*/
|
||||
var prefixes = ['Webkit', 'ms', 'Moz', 'O'];
|
||||
|
||||
// Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an
|
||||
// infinite loop, because it iterates over the newly added props too.
|
||||
Object.keys(isUnitlessNumber).forEach(function (prop) {
|
||||
prefixes.forEach(function (prefix) {
|
||||
isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* Most style properties can be unset by doing .style[prop] = '' but IE8
|
||||
* doesn't like doing that with shorthand properties so for the properties that
|
||||
* IE8 breaks on, which are listed here, we instead unset each of the
|
||||
* individual properties. See http://bugs.jquery.com/ticket/12385.
|
||||
* The 4-value 'clock' properties like margin, padding, border-width seem to
|
||||
* behave without any problems. Curiously, list-style works too without any
|
||||
* special prodding.
|
||||
*/
|
||||
var shorthandPropertyExpansions = {
|
||||
background: {
|
||||
backgroundAttachment: true,
|
||||
backgroundColor: true,
|
||||
backgroundImage: true,
|
||||
backgroundPositionX: true,
|
||||
backgroundPositionY: true,
|
||||
backgroundRepeat: true
|
||||
},
|
||||
backgroundPosition: {
|
||||
backgroundPositionX: true,
|
||||
backgroundPositionY: true
|
||||
},
|
||||
border: {
|
||||
borderWidth: true,
|
||||
borderStyle: true,
|
||||
borderColor: true
|
||||
},
|
||||
borderBottom: {
|
||||
borderBottomWidth: true,
|
||||
borderBottomStyle: true,
|
||||
borderBottomColor: true
|
||||
},
|
||||
borderLeft: {
|
||||
borderLeftWidth: true,
|
||||
borderLeftStyle: true,
|
||||
borderLeftColor: true
|
||||
},
|
||||
borderRight: {
|
||||
borderRightWidth: true,
|
||||
borderRightStyle: true,
|
||||
borderRightColor: true
|
||||
},
|
||||
borderTop: {
|
||||
borderTopWidth: true,
|
||||
borderTopStyle: true,
|
||||
borderTopColor: true
|
||||
},
|
||||
font: {
|
||||
fontStyle: true,
|
||||
fontVariant: true,
|
||||
fontWeight: true,
|
||||
fontSize: true,
|
||||
lineHeight: true,
|
||||
fontFamily: true
|
||||
},
|
||||
outline: {
|
||||
outlineWidth: true,
|
||||
outlineStyle: true,
|
||||
outlineColor: true
|
||||
}
|
||||
};
|
||||
|
||||
var CSSProperty = {
|
||||
isUnitlessNumber: isUnitlessNumber,
|
||||
shorthandPropertyExpansions: shorthandPropertyExpansions
|
||||
};
|
||||
|
||||
module.exports = CSSProperty;
|
||||
175
old_major_packages/14/react/lib/CSSPropertyOperations.js
Normal file
175
old_major_packages/14/react/lib/CSSPropertyOperations.js
Normal file
@@ -0,0 +1,175 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule CSSPropertyOperations
|
||||
* @typechecks static-only
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var CSSProperty = require('./CSSProperty');
|
||||
var ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');
|
||||
var ReactPerf = require('./ReactPerf');
|
||||
|
||||
var camelizeStyleName = require('fbjs/lib/camelizeStyleName');
|
||||
var dangerousStyleValue = require('./dangerousStyleValue');
|
||||
var hyphenateStyleName = require('fbjs/lib/hyphenateStyleName');
|
||||
var memoizeStringOnly = require('fbjs/lib/memoizeStringOnly');
|
||||
var warning = require('fbjs/lib/warning');
|
||||
|
||||
var processStyleName = memoizeStringOnly(function (styleName) {
|
||||
return hyphenateStyleName(styleName);
|
||||
});
|
||||
|
||||
var hasShorthandPropertyBug = false;
|
||||
var styleFloatAccessor = 'cssFloat';
|
||||
if (ExecutionEnvironment.canUseDOM) {
|
||||
var tempStyle = document.createElement('div').style;
|
||||
try {
|
||||
// IE8 throws "Invalid argument." if resetting shorthand style properties.
|
||||
tempStyle.font = '';
|
||||
} catch (e) {
|
||||
hasShorthandPropertyBug = true;
|
||||
}
|
||||
// IE8 only supports accessing cssFloat (standard) as styleFloat
|
||||
if (document.documentElement.style.cssFloat === undefined) {
|
||||
styleFloatAccessor = 'styleFloat';
|
||||
}
|
||||
}
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
// 'msTransform' is correct, but the other prefixes should be capitalized
|
||||
var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;
|
||||
|
||||
// style values shouldn't contain a semicolon
|
||||
var badStyleValueWithSemicolonPattern = /;\s*$/;
|
||||
|
||||
var warnedStyleNames = {};
|
||||
var warnedStyleValues = {};
|
||||
|
||||
var warnHyphenatedStyleName = function (name) {
|
||||
if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
|
||||
return;
|
||||
}
|
||||
|
||||
warnedStyleNames[name] = true;
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'Unsupported style property %s. Did you mean %s?', name, camelizeStyleName(name)) : undefined;
|
||||
};
|
||||
|
||||
var warnBadVendoredStyleName = function (name) {
|
||||
if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
|
||||
return;
|
||||
}
|
||||
|
||||
warnedStyleNames[name] = true;
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1)) : undefined;
|
||||
};
|
||||
|
||||
var warnStyleValueWithSemicolon = function (name, value) {
|
||||
if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {
|
||||
return;
|
||||
}
|
||||
|
||||
warnedStyleValues[value] = true;
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'Style property values shouldn\'t contain a semicolon. ' + 'Try "%s: %s" instead.', name, value.replace(badStyleValueWithSemicolonPattern, '')) : undefined;
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {string} name
|
||||
* @param {*} value
|
||||
*/
|
||||
var warnValidStyle = function (name, value) {
|
||||
if (name.indexOf('-') > -1) {
|
||||
warnHyphenatedStyleName(name);
|
||||
} else if (badVendoredStyleNamePattern.test(name)) {
|
||||
warnBadVendoredStyleName(name);
|
||||
} else if (badStyleValueWithSemicolonPattern.test(value)) {
|
||||
warnStyleValueWithSemicolon(name, value);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Operations for dealing with CSS properties.
|
||||
*/
|
||||
var CSSPropertyOperations = {
|
||||
|
||||
/**
|
||||
* Serializes a mapping of style properties for use as inline styles:
|
||||
*
|
||||
* > createMarkupForStyles({width: '200px', height: 0})
|
||||
* "width:200px;height:0;"
|
||||
*
|
||||
* Undefined values are ignored so that declarative programming is easier.
|
||||
* The result should be HTML-escaped before insertion into the DOM.
|
||||
*
|
||||
* @param {object} styles
|
||||
* @return {?string}
|
||||
*/
|
||||
createMarkupForStyles: function (styles) {
|
||||
var serialized = '';
|
||||
for (var styleName in styles) {
|
||||
if (!styles.hasOwnProperty(styleName)) {
|
||||
continue;
|
||||
}
|
||||
var styleValue = styles[styleName];
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
warnValidStyle(styleName, styleValue);
|
||||
}
|
||||
if (styleValue != null) {
|
||||
serialized += processStyleName(styleName) + ':';
|
||||
serialized += dangerousStyleValue(styleName, styleValue) + ';';
|
||||
}
|
||||
}
|
||||
return serialized || null;
|
||||
},
|
||||
|
||||
/**
|
||||
* Sets the value for multiple styles on a node. If a value is specified as
|
||||
* '' (empty string), the corresponding style property will be unset.
|
||||
*
|
||||
* @param {DOMElement} node
|
||||
* @param {object} styles
|
||||
*/
|
||||
setValueForStyles: function (node, styles) {
|
||||
var style = node.style;
|
||||
for (var styleName in styles) {
|
||||
if (!styles.hasOwnProperty(styleName)) {
|
||||
continue;
|
||||
}
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
warnValidStyle(styleName, styles[styleName]);
|
||||
}
|
||||
var styleValue = dangerousStyleValue(styleName, styles[styleName]);
|
||||
if (styleName === 'float') {
|
||||
styleName = styleFloatAccessor;
|
||||
}
|
||||
if (styleValue) {
|
||||
style[styleName] = styleValue;
|
||||
} else {
|
||||
var expansion = hasShorthandPropertyBug && CSSProperty.shorthandPropertyExpansions[styleName];
|
||||
if (expansion) {
|
||||
// Shorthand property that IE8 won't like unsetting, so unset each
|
||||
// component to placate it
|
||||
for (var individualStyleName in expansion) {
|
||||
style[individualStyleName] = '';
|
||||
}
|
||||
} else {
|
||||
style[styleName] = '';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
ReactPerf.measureMethods(CSSPropertyOperations, 'CSSPropertyOperations', {
|
||||
setValueForStyles: 'setValueForStyles'
|
||||
});
|
||||
|
||||
module.exports = CSSPropertyOperations;
|
||||
93
old_major_packages/14/react/lib/CallbackQueue.js
Normal file
93
old_major_packages/14/react/lib/CallbackQueue.js
Normal file
@@ -0,0 +1,93 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule CallbackQueue
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var PooledClass = require('./PooledClass');
|
||||
|
||||
var assign = require('./Object.assign');
|
||||
var invariant = require('fbjs/lib/invariant');
|
||||
|
||||
/**
|
||||
* A specialized pseudo-event module to help keep track of components waiting to
|
||||
* be notified when their DOM representations are available for use.
|
||||
*
|
||||
* This implements `PooledClass`, so you should never need to instantiate this.
|
||||
* Instead, use `CallbackQueue.getPooled()`.
|
||||
*
|
||||
* @class ReactMountReady
|
||||
* @implements PooledClass
|
||||
* @internal
|
||||
*/
|
||||
function CallbackQueue() {
|
||||
this._callbacks = null;
|
||||
this._contexts = null;
|
||||
}
|
||||
|
||||
assign(CallbackQueue.prototype, {
|
||||
|
||||
/**
|
||||
* Enqueues a callback to be invoked when `notifyAll` is invoked.
|
||||
*
|
||||
* @param {function} callback Invoked when `notifyAll` is invoked.
|
||||
* @param {?object} context Context to call `callback` with.
|
||||
* @internal
|
||||
*/
|
||||
enqueue: function (callback, context) {
|
||||
this._callbacks = this._callbacks || [];
|
||||
this._contexts = this._contexts || [];
|
||||
this._callbacks.push(callback);
|
||||
this._contexts.push(context);
|
||||
},
|
||||
|
||||
/**
|
||||
* Invokes all enqueued callbacks and clears the queue. This is invoked after
|
||||
* the DOM representation of a component has been created or updated.
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
notifyAll: function () {
|
||||
var callbacks = this._callbacks;
|
||||
var contexts = this._contexts;
|
||||
if (callbacks) {
|
||||
!(callbacks.length === contexts.length) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Mismatched list of contexts in callback queue') : invariant(false) : undefined;
|
||||
this._callbacks = null;
|
||||
this._contexts = null;
|
||||
for (var i = 0; i < callbacks.length; i++) {
|
||||
callbacks[i].call(contexts[i]);
|
||||
}
|
||||
callbacks.length = 0;
|
||||
contexts.length = 0;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Resets the internal queue.
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
reset: function () {
|
||||
this._callbacks = null;
|
||||
this._contexts = null;
|
||||
},
|
||||
|
||||
/**
|
||||
* `PooledClass` looks for this.
|
||||
*/
|
||||
destructor: function () {
|
||||
this.reset();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
PooledClass.addPoolingTo(CallbackQueue);
|
||||
|
||||
module.exports = CallbackQueue;
|
||||
321
old_major_packages/14/react/lib/ChangeEventPlugin.js
Normal file
321
old_major_packages/14/react/lib/ChangeEventPlugin.js
Normal file
@@ -0,0 +1,321 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ChangeEventPlugin
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var EventConstants = require('./EventConstants');
|
||||
var EventPluginHub = require('./EventPluginHub');
|
||||
var EventPropagators = require('./EventPropagators');
|
||||
var ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');
|
||||
var ReactUpdates = require('./ReactUpdates');
|
||||
var SyntheticEvent = require('./SyntheticEvent');
|
||||
|
||||
var getEventTarget = require('./getEventTarget');
|
||||
var isEventSupported = require('./isEventSupported');
|
||||
var isTextInputElement = require('./isTextInputElement');
|
||||
var keyOf = require('fbjs/lib/keyOf');
|
||||
|
||||
var topLevelTypes = EventConstants.topLevelTypes;
|
||||
|
||||
var eventTypes = {
|
||||
change: {
|
||||
phasedRegistrationNames: {
|
||||
bubbled: keyOf({ onChange: null }),
|
||||
captured: keyOf({ onChangeCapture: null })
|
||||
},
|
||||
dependencies: [topLevelTypes.topBlur, topLevelTypes.topChange, topLevelTypes.topClick, topLevelTypes.topFocus, topLevelTypes.topInput, topLevelTypes.topKeyDown, topLevelTypes.topKeyUp, topLevelTypes.topSelectionChange]
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* For IE shims
|
||||
*/
|
||||
var activeElement = null;
|
||||
var activeElementID = null;
|
||||
var activeElementValue = null;
|
||||
var activeElementValueProp = null;
|
||||
|
||||
/**
|
||||
* SECTION: handle `change` event
|
||||
*/
|
||||
function shouldUseChangeEvent(elem) {
|
||||
var nodeName = elem.nodeName && elem.nodeName.toLowerCase();
|
||||
return nodeName === 'select' || nodeName === 'input' && elem.type === 'file';
|
||||
}
|
||||
|
||||
var doesChangeEventBubble = false;
|
||||
if (ExecutionEnvironment.canUseDOM) {
|
||||
// See `handleChange` comment below
|
||||
doesChangeEventBubble = isEventSupported('change') && (!('documentMode' in document) || document.documentMode > 8);
|
||||
}
|
||||
|
||||
function manualDispatchChangeEvent(nativeEvent) {
|
||||
var event = SyntheticEvent.getPooled(eventTypes.change, activeElementID, nativeEvent, getEventTarget(nativeEvent));
|
||||
EventPropagators.accumulateTwoPhaseDispatches(event);
|
||||
|
||||
// If change and propertychange bubbled, we'd just bind to it like all the
|
||||
// other events and have it go through ReactBrowserEventEmitter. Since it
|
||||
// doesn't, we manually listen for the events and so we have to enqueue and
|
||||
// process the abstract event manually.
|
||||
//
|
||||
// Batching is necessary here in order to ensure that all event handlers run
|
||||
// before the next rerender (including event handlers attached to ancestor
|
||||
// elements instead of directly on the input). Without this, controlled
|
||||
// components don't work properly in conjunction with event bubbling because
|
||||
// the component is rerendered and the value reverted before all the event
|
||||
// handlers can run. See https://github.com/facebook/react/issues/708.
|
||||
ReactUpdates.batchedUpdates(runEventInBatch, event);
|
||||
}
|
||||
|
||||
function runEventInBatch(event) {
|
||||
EventPluginHub.enqueueEvents(event);
|
||||
EventPluginHub.processEventQueue(false);
|
||||
}
|
||||
|
||||
function startWatchingForChangeEventIE8(target, targetID) {
|
||||
activeElement = target;
|
||||
activeElementID = targetID;
|
||||
activeElement.attachEvent('onchange', manualDispatchChangeEvent);
|
||||
}
|
||||
|
||||
function stopWatchingForChangeEventIE8() {
|
||||
if (!activeElement) {
|
||||
return;
|
||||
}
|
||||
activeElement.detachEvent('onchange', manualDispatchChangeEvent);
|
||||
activeElement = null;
|
||||
activeElementID = null;
|
||||
}
|
||||
|
||||
function getTargetIDForChangeEvent(topLevelType, topLevelTarget, topLevelTargetID) {
|
||||
if (topLevelType === topLevelTypes.topChange) {
|
||||
return topLevelTargetID;
|
||||
}
|
||||
}
|
||||
function handleEventsForChangeEventIE8(topLevelType, topLevelTarget, topLevelTargetID) {
|
||||
if (topLevelType === topLevelTypes.topFocus) {
|
||||
// stopWatching() should be a noop here but we call it just in case we
|
||||
// missed a blur event somehow.
|
||||
stopWatchingForChangeEventIE8();
|
||||
startWatchingForChangeEventIE8(topLevelTarget, topLevelTargetID);
|
||||
} else if (topLevelType === topLevelTypes.topBlur) {
|
||||
stopWatchingForChangeEventIE8();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* SECTION: handle `input` event
|
||||
*/
|
||||
var isInputEventSupported = false;
|
||||
if (ExecutionEnvironment.canUseDOM) {
|
||||
// IE9 claims to support the input event but fails to trigger it when
|
||||
// deleting text, so we ignore its input events
|
||||
isInputEventSupported = isEventSupported('input') && (!('documentMode' in document) || document.documentMode > 9);
|
||||
}
|
||||
|
||||
/**
|
||||
* (For old IE.) Replacement getter/setter for the `value` property that gets
|
||||
* set on the active element.
|
||||
*/
|
||||
var newValueProp = {
|
||||
get: function () {
|
||||
return activeElementValueProp.get.call(this);
|
||||
},
|
||||
set: function (val) {
|
||||
// Cast to a string so we can do equality checks.
|
||||
activeElementValue = '' + val;
|
||||
activeElementValueProp.set.call(this, val);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* (For old IE.) Starts tracking propertychange events on the passed-in element
|
||||
* and override the value property so that we can distinguish user events from
|
||||
* value changes in JS.
|
||||
*/
|
||||
function startWatchingForValueChange(target, targetID) {
|
||||
activeElement = target;
|
||||
activeElementID = targetID;
|
||||
activeElementValue = target.value;
|
||||
activeElementValueProp = Object.getOwnPropertyDescriptor(target.constructor.prototype, 'value');
|
||||
|
||||
// Not guarded in a canDefineProperty check: IE8 supports defineProperty only
|
||||
// on DOM elements
|
||||
Object.defineProperty(activeElement, 'value', newValueProp);
|
||||
activeElement.attachEvent('onpropertychange', handlePropertyChange);
|
||||
}
|
||||
|
||||
/**
|
||||
* (For old IE.) Removes the event listeners from the currently-tracked element,
|
||||
* if any exists.
|
||||
*/
|
||||
function stopWatchingForValueChange() {
|
||||
if (!activeElement) {
|
||||
return;
|
||||
}
|
||||
|
||||
// delete restores the original property definition
|
||||
delete activeElement.value;
|
||||
activeElement.detachEvent('onpropertychange', handlePropertyChange);
|
||||
|
||||
activeElement = null;
|
||||
activeElementID = null;
|
||||
activeElementValue = null;
|
||||
activeElementValueProp = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* (For old IE.) Handles a propertychange event, sending a `change` event if
|
||||
* the value of the active element has changed.
|
||||
*/
|
||||
function handlePropertyChange(nativeEvent) {
|
||||
if (nativeEvent.propertyName !== 'value') {
|
||||
return;
|
||||
}
|
||||
var value = nativeEvent.srcElement.value;
|
||||
if (value === activeElementValue) {
|
||||
return;
|
||||
}
|
||||
activeElementValue = value;
|
||||
|
||||
manualDispatchChangeEvent(nativeEvent);
|
||||
}
|
||||
|
||||
/**
|
||||
* If a `change` event should be fired, returns the target's ID.
|
||||
*/
|
||||
function getTargetIDForInputEvent(topLevelType, topLevelTarget, topLevelTargetID) {
|
||||
if (topLevelType === topLevelTypes.topInput) {
|
||||
// In modern browsers (i.e., not IE8 or IE9), the input event is exactly
|
||||
// what we want so fall through here and trigger an abstract event
|
||||
return topLevelTargetID;
|
||||
}
|
||||
}
|
||||
|
||||
// For IE8 and IE9.
|
||||
function handleEventsForInputEventIE(topLevelType, topLevelTarget, topLevelTargetID) {
|
||||
if (topLevelType === topLevelTypes.topFocus) {
|
||||
// In IE8, we can capture almost all .value changes by adding a
|
||||
// propertychange handler and looking for events with propertyName
|
||||
// equal to 'value'
|
||||
// In IE9, propertychange fires for most input events but is buggy and
|
||||
// doesn't fire when text is deleted, but conveniently, selectionchange
|
||||
// appears to fire in all of the remaining cases so we catch those and
|
||||
// forward the event if the value has changed
|
||||
// In either case, we don't want to call the event handler if the value
|
||||
// is changed from JS so we redefine a setter for `.value` that updates
|
||||
// our activeElementValue variable, allowing us to ignore those changes
|
||||
//
|
||||
// stopWatching() should be a noop here but we call it just in case we
|
||||
// missed a blur event somehow.
|
||||
stopWatchingForValueChange();
|
||||
startWatchingForValueChange(topLevelTarget, topLevelTargetID);
|
||||
} else if (topLevelType === topLevelTypes.topBlur) {
|
||||
stopWatchingForValueChange();
|
||||
}
|
||||
}
|
||||
|
||||
// For IE8 and IE9.
|
||||
function getTargetIDForInputEventIE(topLevelType, topLevelTarget, topLevelTargetID) {
|
||||
if (topLevelType === topLevelTypes.topSelectionChange || topLevelType === topLevelTypes.topKeyUp || topLevelType === topLevelTypes.topKeyDown) {
|
||||
// On the selectionchange event, the target is just document which isn't
|
||||
// helpful for us so just check activeElement instead.
|
||||
//
|
||||
// 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire
|
||||
// propertychange on the first input event after setting `value` from a
|
||||
// script and fires only keydown, keypress, keyup. Catching keyup usually
|
||||
// gets it and catching keydown lets us fire an event for the first
|
||||
// keystroke if user does a key repeat (it'll be a little delayed: right
|
||||
// before the second keystroke). Other input methods (e.g., paste) seem to
|
||||
// fire selectionchange normally.
|
||||
if (activeElement && activeElement.value !== activeElementValue) {
|
||||
activeElementValue = activeElement.value;
|
||||
return activeElementID;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* SECTION: handle `click` event
|
||||
*/
|
||||
function shouldUseClickEvent(elem) {
|
||||
// Use the `click` event to detect changes to checkbox and radio inputs.
|
||||
// This approach works across all browsers, whereas `change` does not fire
|
||||
// until `blur` in IE8.
|
||||
return elem.nodeName && elem.nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio');
|
||||
}
|
||||
|
||||
function getTargetIDForClickEvent(topLevelType, topLevelTarget, topLevelTargetID) {
|
||||
if (topLevelType === topLevelTypes.topClick) {
|
||||
return topLevelTargetID;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This plugin creates an `onChange` event that normalizes change events
|
||||
* across form elements. This event fires at a time when it's possible to
|
||||
* change the element's value without seeing a flicker.
|
||||
*
|
||||
* Supported elements are:
|
||||
* - input (see `isTextInputElement`)
|
||||
* - textarea
|
||||
* - select
|
||||
*/
|
||||
var ChangeEventPlugin = {
|
||||
|
||||
eventTypes: eventTypes,
|
||||
|
||||
/**
|
||||
* @param {string} topLevelType Record from `EventConstants`.
|
||||
* @param {DOMEventTarget} topLevelTarget The listening component root node.
|
||||
* @param {string} topLevelTargetID ID of `topLevelTarget`.
|
||||
* @param {object} nativeEvent Native browser event.
|
||||
* @return {*} An accumulation of synthetic events.
|
||||
* @see {EventPluginHub.extractEvents}
|
||||
*/
|
||||
extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {
|
||||
|
||||
var getTargetIDFunc, handleEventFunc;
|
||||
if (shouldUseChangeEvent(topLevelTarget)) {
|
||||
if (doesChangeEventBubble) {
|
||||
getTargetIDFunc = getTargetIDForChangeEvent;
|
||||
} else {
|
||||
handleEventFunc = handleEventsForChangeEventIE8;
|
||||
}
|
||||
} else if (isTextInputElement(topLevelTarget)) {
|
||||
if (isInputEventSupported) {
|
||||
getTargetIDFunc = getTargetIDForInputEvent;
|
||||
} else {
|
||||
getTargetIDFunc = getTargetIDForInputEventIE;
|
||||
handleEventFunc = handleEventsForInputEventIE;
|
||||
}
|
||||
} else if (shouldUseClickEvent(topLevelTarget)) {
|
||||
getTargetIDFunc = getTargetIDForClickEvent;
|
||||
}
|
||||
|
||||
if (getTargetIDFunc) {
|
||||
var targetID = getTargetIDFunc(topLevelType, topLevelTarget, topLevelTargetID);
|
||||
if (targetID) {
|
||||
var event = SyntheticEvent.getPooled(eventTypes.change, targetID, nativeEvent, nativeEventTarget);
|
||||
event.type = 'change';
|
||||
EventPropagators.accumulateTwoPhaseDispatches(event);
|
||||
return event;
|
||||
}
|
||||
}
|
||||
|
||||
if (handleEventFunc) {
|
||||
handleEventFunc(topLevelType, topLevelTarget, topLevelTargetID);
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
module.exports = ChangeEventPlugin;
|
||||
23
old_major_packages/14/react/lib/ClientReactRootIndex.js
Normal file
23
old_major_packages/14/react/lib/ClientReactRootIndex.js
Normal file
@@ -0,0 +1,23 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ClientReactRootIndex
|
||||
* @typechecks
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var nextReactRootIndex = 0;
|
||||
|
||||
var ClientReactRootIndex = {
|
||||
createReactRootIndex: function () {
|
||||
return nextReactRootIndex++;
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = ClientReactRootIndex;
|
||||
129
old_major_packages/14/react/lib/DOMChildrenOperations.js
Normal file
129
old_major_packages/14/react/lib/DOMChildrenOperations.js
Normal file
@@ -0,0 +1,129 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule DOMChildrenOperations
|
||||
* @typechecks static-only
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var Danger = require('./Danger');
|
||||
var ReactMultiChildUpdateTypes = require('./ReactMultiChildUpdateTypes');
|
||||
var ReactPerf = require('./ReactPerf');
|
||||
|
||||
var setInnerHTML = require('./setInnerHTML');
|
||||
var setTextContent = require('./setTextContent');
|
||||
var invariant = require('fbjs/lib/invariant');
|
||||
|
||||
/**
|
||||
* Inserts `childNode` as a child of `parentNode` at the `index`.
|
||||
*
|
||||
* @param {DOMElement} parentNode Parent node in which to insert.
|
||||
* @param {DOMElement} childNode Child node to insert.
|
||||
* @param {number} index Index at which to insert the child.
|
||||
* @internal
|
||||
*/
|
||||
function insertChildAt(parentNode, childNode, index) {
|
||||
// By exploiting arrays returning `undefined` for an undefined index, we can
|
||||
// rely exclusively on `insertBefore(node, null)` instead of also using
|
||||
// `appendChild(node)`. However, using `undefined` is not allowed by all
|
||||
// browsers so we must replace it with `null`.
|
||||
|
||||
// fix render order error in safari
|
||||
// IE8 will throw error when index out of list size.
|
||||
var beforeChild = index >= parentNode.childNodes.length ? null : parentNode.childNodes.item(index);
|
||||
|
||||
parentNode.insertBefore(childNode, beforeChild);
|
||||
}
|
||||
|
||||
/**
|
||||
* Operations for updating with DOM children.
|
||||
*/
|
||||
var DOMChildrenOperations = {
|
||||
|
||||
dangerouslyReplaceNodeWithMarkup: Danger.dangerouslyReplaceNodeWithMarkup,
|
||||
|
||||
updateTextContent: setTextContent,
|
||||
|
||||
/**
|
||||
* Updates a component's children by processing a series of updates. The
|
||||
* update configurations are each expected to have a `parentNode` property.
|
||||
*
|
||||
* @param {array<object>} updates List of update configurations.
|
||||
* @param {array<string>} markupList List of markup strings.
|
||||
* @internal
|
||||
*/
|
||||
processUpdates: function (updates, markupList) {
|
||||
var update;
|
||||
// Mapping from parent IDs to initial child orderings.
|
||||
var initialChildren = null;
|
||||
// List of children that will be moved or removed.
|
||||
var updatedChildren = null;
|
||||
|
||||
for (var i = 0; i < updates.length; i++) {
|
||||
update = updates[i];
|
||||
if (update.type === ReactMultiChildUpdateTypes.MOVE_EXISTING || update.type === ReactMultiChildUpdateTypes.REMOVE_NODE) {
|
||||
var updatedIndex = update.fromIndex;
|
||||
var updatedChild = update.parentNode.childNodes[updatedIndex];
|
||||
var parentID = update.parentID;
|
||||
|
||||
!updatedChild ? process.env.NODE_ENV !== 'production' ? invariant(false, 'processUpdates(): Unable to find child %s of element. This ' + 'probably means the DOM was unexpectedly mutated (e.g., by the ' + 'browser), usually due to forgetting a <tbody> when using tables, ' + 'nesting tags like <form>, <p>, or <a>, or using non-SVG elements ' + 'in an <svg> parent. Try inspecting the child nodes of the element ' + 'with React ID `%s`.', updatedIndex, parentID) : invariant(false) : undefined;
|
||||
|
||||
initialChildren = initialChildren || {};
|
||||
initialChildren[parentID] = initialChildren[parentID] || [];
|
||||
initialChildren[parentID][updatedIndex] = updatedChild;
|
||||
|
||||
updatedChildren = updatedChildren || [];
|
||||
updatedChildren.push(updatedChild);
|
||||
}
|
||||
}
|
||||
|
||||
var renderedMarkup;
|
||||
// markupList is either a list of markup or just a list of elements
|
||||
if (markupList.length && typeof markupList[0] === 'string') {
|
||||
renderedMarkup = Danger.dangerouslyRenderMarkup(markupList);
|
||||
} else {
|
||||
renderedMarkup = markupList;
|
||||
}
|
||||
|
||||
// Remove updated children first so that `toIndex` is consistent.
|
||||
if (updatedChildren) {
|
||||
for (var j = 0; j < updatedChildren.length; j++) {
|
||||
updatedChildren[j].parentNode.removeChild(updatedChildren[j]);
|
||||
}
|
||||
}
|
||||
|
||||
for (var k = 0; k < updates.length; k++) {
|
||||
update = updates[k];
|
||||
switch (update.type) {
|
||||
case ReactMultiChildUpdateTypes.INSERT_MARKUP:
|
||||
insertChildAt(update.parentNode, renderedMarkup[update.markupIndex], update.toIndex);
|
||||
break;
|
||||
case ReactMultiChildUpdateTypes.MOVE_EXISTING:
|
||||
insertChildAt(update.parentNode, initialChildren[update.parentID][update.fromIndex], update.toIndex);
|
||||
break;
|
||||
case ReactMultiChildUpdateTypes.SET_MARKUP:
|
||||
setInnerHTML(update.parentNode, update.content);
|
||||
break;
|
||||
case ReactMultiChildUpdateTypes.TEXT_CONTENT:
|
||||
setTextContent(update.parentNode, update.content);
|
||||
break;
|
||||
case ReactMultiChildUpdateTypes.REMOVE_NODE:
|
||||
// Already removed by the for-loop above.
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
ReactPerf.measureMethods(DOMChildrenOperations, 'DOMChildrenOperations', {
|
||||
updateTextContent: 'updateTextContent'
|
||||
});
|
||||
|
||||
module.exports = DOMChildrenOperations;
|
||||
234
old_major_packages/14/react/lib/DOMProperty.js
Normal file
234
old_major_packages/14/react/lib/DOMProperty.js
Normal file
@@ -0,0 +1,234 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule DOMProperty
|
||||
* @typechecks static-only
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var invariant = require('fbjs/lib/invariant');
|
||||
|
||||
function checkMask(value, bitmask) {
|
||||
return (value & bitmask) === bitmask;
|
||||
}
|
||||
|
||||
var DOMPropertyInjection = {
|
||||
/**
|
||||
* Mapping from normalized, camelcased property names to a configuration that
|
||||
* specifies how the associated DOM property should be accessed or rendered.
|
||||
*/
|
||||
MUST_USE_ATTRIBUTE: 0x1,
|
||||
MUST_USE_PROPERTY: 0x2,
|
||||
HAS_SIDE_EFFECTS: 0x4,
|
||||
HAS_BOOLEAN_VALUE: 0x8,
|
||||
HAS_NUMERIC_VALUE: 0x10,
|
||||
HAS_POSITIVE_NUMERIC_VALUE: 0x20 | 0x10,
|
||||
HAS_OVERLOADED_BOOLEAN_VALUE: 0x40,
|
||||
|
||||
/**
|
||||
* Inject some specialized knowledge about the DOM. This takes a config object
|
||||
* with the following properties:
|
||||
*
|
||||
* isCustomAttribute: function that given an attribute name will return true
|
||||
* if it can be inserted into the DOM verbatim. Useful for data-* or aria-*
|
||||
* attributes where it's impossible to enumerate all of the possible
|
||||
* attribute names,
|
||||
*
|
||||
* Properties: object mapping DOM property name to one of the
|
||||
* DOMPropertyInjection constants or null. If your attribute isn't in here,
|
||||
* it won't get written to the DOM.
|
||||
*
|
||||
* DOMAttributeNames: object mapping React attribute name to the DOM
|
||||
* attribute name. Attribute names not specified use the **lowercase**
|
||||
* normalized name.
|
||||
*
|
||||
* DOMAttributeNamespaces: object mapping React attribute name to the DOM
|
||||
* attribute namespace URL. (Attribute names not specified use no namespace.)
|
||||
*
|
||||
* DOMPropertyNames: similar to DOMAttributeNames but for DOM properties.
|
||||
* Property names not specified use the normalized name.
|
||||
*
|
||||
* DOMMutationMethods: Properties that require special mutation methods. If
|
||||
* `value` is undefined, the mutation method should unset the property.
|
||||
*
|
||||
* @param {object} domPropertyConfig the config as described above.
|
||||
*/
|
||||
injectDOMPropertyConfig: function (domPropertyConfig) {
|
||||
var Injection = DOMPropertyInjection;
|
||||
var Properties = domPropertyConfig.Properties || {};
|
||||
var DOMAttributeNamespaces = domPropertyConfig.DOMAttributeNamespaces || {};
|
||||
var DOMAttributeNames = domPropertyConfig.DOMAttributeNames || {};
|
||||
var DOMPropertyNames = domPropertyConfig.DOMPropertyNames || {};
|
||||
var DOMMutationMethods = domPropertyConfig.DOMMutationMethods || {};
|
||||
|
||||
if (domPropertyConfig.isCustomAttribute) {
|
||||
DOMProperty._isCustomAttributeFunctions.push(domPropertyConfig.isCustomAttribute);
|
||||
}
|
||||
|
||||
for (var propName in Properties) {
|
||||
!!DOMProperty.properties.hasOwnProperty(propName) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'injectDOMPropertyConfig(...): You\'re trying to inject DOM property ' + '\'%s\' which has already been injected. You may be accidentally ' + 'injecting the same DOM property config twice, or you may be ' + 'injecting two configs that have conflicting property names.', propName) : invariant(false) : undefined;
|
||||
|
||||
var lowerCased = propName.toLowerCase();
|
||||
var propConfig = Properties[propName];
|
||||
|
||||
var propertyInfo = {
|
||||
attributeName: lowerCased,
|
||||
attributeNamespace: null,
|
||||
propertyName: propName,
|
||||
mutationMethod: null,
|
||||
|
||||
mustUseAttribute: checkMask(propConfig, Injection.MUST_USE_ATTRIBUTE),
|
||||
mustUseProperty: checkMask(propConfig, Injection.MUST_USE_PROPERTY),
|
||||
hasSideEffects: checkMask(propConfig, Injection.HAS_SIDE_EFFECTS),
|
||||
hasBooleanValue: checkMask(propConfig, Injection.HAS_BOOLEAN_VALUE),
|
||||
hasNumericValue: checkMask(propConfig, Injection.HAS_NUMERIC_VALUE),
|
||||
hasPositiveNumericValue: checkMask(propConfig, Injection.HAS_POSITIVE_NUMERIC_VALUE),
|
||||
hasOverloadedBooleanValue: checkMask(propConfig, Injection.HAS_OVERLOADED_BOOLEAN_VALUE)
|
||||
};
|
||||
|
||||
!(!propertyInfo.mustUseAttribute || !propertyInfo.mustUseProperty) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'DOMProperty: Cannot require using both attribute and property: %s', propName) : invariant(false) : undefined;
|
||||
!(propertyInfo.mustUseProperty || !propertyInfo.hasSideEffects) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'DOMProperty: Properties that have side effects must use property: %s', propName) : invariant(false) : undefined;
|
||||
!(propertyInfo.hasBooleanValue + propertyInfo.hasNumericValue + propertyInfo.hasOverloadedBooleanValue <= 1) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'DOMProperty: Value can be one of boolean, overloaded boolean, or ' + 'numeric value, but not a combination: %s', propName) : invariant(false) : undefined;
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
DOMProperty.getPossibleStandardName[lowerCased] = propName;
|
||||
}
|
||||
|
||||
if (DOMAttributeNames.hasOwnProperty(propName)) {
|
||||
var attributeName = DOMAttributeNames[propName];
|
||||
propertyInfo.attributeName = attributeName;
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
DOMProperty.getPossibleStandardName[attributeName] = propName;
|
||||
}
|
||||
}
|
||||
|
||||
if (DOMAttributeNamespaces.hasOwnProperty(propName)) {
|
||||
propertyInfo.attributeNamespace = DOMAttributeNamespaces[propName];
|
||||
}
|
||||
|
||||
if (DOMPropertyNames.hasOwnProperty(propName)) {
|
||||
propertyInfo.propertyName = DOMPropertyNames[propName];
|
||||
}
|
||||
|
||||
if (DOMMutationMethods.hasOwnProperty(propName)) {
|
||||
propertyInfo.mutationMethod = DOMMutationMethods[propName];
|
||||
}
|
||||
|
||||
DOMProperty.properties[propName] = propertyInfo;
|
||||
}
|
||||
}
|
||||
};
|
||||
var defaultValueCache = {};
|
||||
|
||||
/**
|
||||
* DOMProperty exports lookup objects that can be used like functions:
|
||||
*
|
||||
* > DOMProperty.isValid['id']
|
||||
* true
|
||||
* > DOMProperty.isValid['foobar']
|
||||
* undefined
|
||||
*
|
||||
* Although this may be confusing, it performs better in general.
|
||||
*
|
||||
* @see http://jsperf.com/key-exists
|
||||
* @see http://jsperf.com/key-missing
|
||||
*/
|
||||
var DOMProperty = {
|
||||
|
||||
ID_ATTRIBUTE_NAME: 'data-reactid',
|
||||
|
||||
/**
|
||||
* Map from property "standard name" to an object with info about how to set
|
||||
* the property in the DOM. Each object contains:
|
||||
*
|
||||
* attributeName:
|
||||
* Used when rendering markup or with `*Attribute()`.
|
||||
* attributeNamespace
|
||||
* propertyName:
|
||||
* Used on DOM node instances. (This includes properties that mutate due to
|
||||
* external factors.)
|
||||
* mutationMethod:
|
||||
* If non-null, used instead of the property or `setAttribute()` after
|
||||
* initial render.
|
||||
* mustUseAttribute:
|
||||
* Whether the property must be accessed and mutated using `*Attribute()`.
|
||||
* (This includes anything that fails `<propName> in <element>`.)
|
||||
* mustUseProperty:
|
||||
* Whether the property must be accessed and mutated as an object property.
|
||||
* hasSideEffects:
|
||||
* Whether or not setting a value causes side effects such as triggering
|
||||
* resources to be loaded or text selection changes. If true, we read from
|
||||
* the DOM before updating to ensure that the value is only set if it has
|
||||
* changed.
|
||||
* hasBooleanValue:
|
||||
* Whether the property should be removed when set to a falsey value.
|
||||
* hasNumericValue:
|
||||
* Whether the property must be numeric or parse as a numeric and should be
|
||||
* removed when set to a falsey value.
|
||||
* hasPositiveNumericValue:
|
||||
* Whether the property must be positive numeric or parse as a positive
|
||||
* numeric and should be removed when set to a falsey value.
|
||||
* hasOverloadedBooleanValue:
|
||||
* Whether the property can be used as a flag as well as with a value.
|
||||
* Removed when strictly equal to false; present without a value when
|
||||
* strictly equal to true; present with a value otherwise.
|
||||
*/
|
||||
properties: {},
|
||||
|
||||
/**
|
||||
* Mapping from lowercase property names to the properly cased version, used
|
||||
* to warn in the case of missing properties. Available only in __DEV__.
|
||||
* @type {Object}
|
||||
*/
|
||||
getPossibleStandardName: process.env.NODE_ENV !== 'production' ? {} : null,
|
||||
|
||||
/**
|
||||
* All of the isCustomAttribute() functions that have been injected.
|
||||
*/
|
||||
_isCustomAttributeFunctions: [],
|
||||
|
||||
/**
|
||||
* Checks whether a property name is a custom attribute.
|
||||
* @method
|
||||
*/
|
||||
isCustomAttribute: function (attributeName) {
|
||||
for (var i = 0; i < DOMProperty._isCustomAttributeFunctions.length; i++) {
|
||||
var isCustomAttributeFn = DOMProperty._isCustomAttributeFunctions[i];
|
||||
if (isCustomAttributeFn(attributeName)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the default property value for a DOM property (i.e., not an
|
||||
* attribute). Most default values are '' or false, but not all. Worse yet,
|
||||
* some (in particular, `type`) vary depending on the type of element.
|
||||
*
|
||||
* TODO: Is it better to grab all the possible properties when creating an
|
||||
* element to avoid having to create the same element twice?
|
||||
*/
|
||||
getDefaultValueForProperty: function (nodeName, prop) {
|
||||
var nodeDefaults = defaultValueCache[nodeName];
|
||||
var testElement;
|
||||
if (!nodeDefaults) {
|
||||
defaultValueCache[nodeName] = nodeDefaults = {};
|
||||
}
|
||||
if (!(prop in nodeDefaults)) {
|
||||
testElement = document.createElement(nodeName);
|
||||
nodeDefaults[prop] = testElement[prop];
|
||||
}
|
||||
return nodeDefaults[prop];
|
||||
},
|
||||
|
||||
injection: DOMPropertyInjection
|
||||
};
|
||||
|
||||
module.exports = DOMProperty;
|
||||
225
old_major_packages/14/react/lib/DOMPropertyOperations.js
Normal file
225
old_major_packages/14/react/lib/DOMPropertyOperations.js
Normal file
@@ -0,0 +1,225 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule DOMPropertyOperations
|
||||
* @typechecks static-only
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var DOMProperty = require('./DOMProperty');
|
||||
var ReactPerf = require('./ReactPerf');
|
||||
|
||||
var quoteAttributeValueForBrowser = require('./quoteAttributeValueForBrowser');
|
||||
var warning = require('fbjs/lib/warning');
|
||||
|
||||
// Simplified subset
|
||||
var VALID_ATTRIBUTE_NAME_REGEX = /^[a-zA-Z_][\w\.\-]*$/;
|
||||
var illegalAttributeNameCache = {};
|
||||
var validatedAttributeNameCache = {};
|
||||
|
||||
function isAttributeNameSafe(attributeName) {
|
||||
if (validatedAttributeNameCache.hasOwnProperty(attributeName)) {
|
||||
return true;
|
||||
}
|
||||
if (illegalAttributeNameCache.hasOwnProperty(attributeName)) {
|
||||
return false;
|
||||
}
|
||||
if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) {
|
||||
validatedAttributeNameCache[attributeName] = true;
|
||||
return true;
|
||||
}
|
||||
illegalAttributeNameCache[attributeName] = true;
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'Invalid attribute name: `%s`', attributeName) : undefined;
|
||||
return false;
|
||||
}
|
||||
|
||||
function shouldIgnoreValue(propertyInfo, value) {
|
||||
return value == null || propertyInfo.hasBooleanValue && !value || propertyInfo.hasNumericValue && isNaN(value) || propertyInfo.hasPositiveNumericValue && value < 1 || propertyInfo.hasOverloadedBooleanValue && value === false;
|
||||
}
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
var reactProps = {
|
||||
children: true,
|
||||
dangerouslySetInnerHTML: true,
|
||||
key: true,
|
||||
ref: true
|
||||
};
|
||||
var warnedProperties = {};
|
||||
|
||||
var warnUnknownProperty = function (name) {
|
||||
if (reactProps.hasOwnProperty(name) && reactProps[name] || warnedProperties.hasOwnProperty(name) && warnedProperties[name]) {
|
||||
return;
|
||||
}
|
||||
|
||||
warnedProperties[name] = true;
|
||||
var lowerCasedName = name.toLowerCase();
|
||||
|
||||
// data-* attributes should be lowercase; suggest the lowercase version
|
||||
var standardName = DOMProperty.isCustomAttribute(lowerCasedName) ? lowerCasedName : DOMProperty.getPossibleStandardName.hasOwnProperty(lowerCasedName) ? DOMProperty.getPossibleStandardName[lowerCasedName] : null;
|
||||
|
||||
// For now, only warn when we have a suggested correction. This prevents
|
||||
// logging too much when using transferPropsTo.
|
||||
process.env.NODE_ENV !== 'production' ? warning(standardName == null, 'Unknown DOM property %s. Did you mean %s?', name, standardName) : undefined;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Operations for dealing with DOM properties.
|
||||
*/
|
||||
var DOMPropertyOperations = {
|
||||
|
||||
/**
|
||||
* Creates markup for the ID property.
|
||||
*
|
||||
* @param {string} id Unescaped ID.
|
||||
* @return {string} Markup string.
|
||||
*/
|
||||
createMarkupForID: function (id) {
|
||||
return DOMProperty.ID_ATTRIBUTE_NAME + '=' + quoteAttributeValueForBrowser(id);
|
||||
},
|
||||
|
||||
setAttributeForID: function (node, id) {
|
||||
node.setAttribute(DOMProperty.ID_ATTRIBUTE_NAME, id);
|
||||
},
|
||||
|
||||
/**
|
||||
* Creates markup for a property.
|
||||
*
|
||||
* @param {string} name
|
||||
* @param {*} value
|
||||
* @return {?string} Markup string, or null if the property was invalid.
|
||||
*/
|
||||
createMarkupForProperty: function (name, value) {
|
||||
var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null;
|
||||
if (propertyInfo) {
|
||||
if (shouldIgnoreValue(propertyInfo, value)) {
|
||||
return '';
|
||||
}
|
||||
var attributeName = propertyInfo.attributeName;
|
||||
if (propertyInfo.hasBooleanValue || propertyInfo.hasOverloadedBooleanValue && value === true) {
|
||||
return attributeName + '=""';
|
||||
}
|
||||
return attributeName + '=' + quoteAttributeValueForBrowser(value);
|
||||
} else if (DOMProperty.isCustomAttribute(name)) {
|
||||
if (value == null) {
|
||||
return '';
|
||||
}
|
||||
return name + '=' + quoteAttributeValueForBrowser(value);
|
||||
} else if (process.env.NODE_ENV !== 'production') {
|
||||
warnUnknownProperty(name);
|
||||
}
|
||||
return null;
|
||||
},
|
||||
|
||||
/**
|
||||
* Creates markup for a custom property.
|
||||
*
|
||||
* @param {string} name
|
||||
* @param {*} value
|
||||
* @return {string} Markup string, or empty string if the property was invalid.
|
||||
*/
|
||||
createMarkupForCustomAttribute: function (name, value) {
|
||||
if (!isAttributeNameSafe(name) || value == null) {
|
||||
return '';
|
||||
}
|
||||
return name + '=' + quoteAttributeValueForBrowser(value);
|
||||
},
|
||||
|
||||
/**
|
||||
* Sets the value for a property on a node.
|
||||
*
|
||||
* @param {DOMElement} node
|
||||
* @param {string} name
|
||||
* @param {*} value
|
||||
*/
|
||||
setValueForProperty: function (node, name, value) {
|
||||
var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null;
|
||||
if (propertyInfo) {
|
||||
var mutationMethod = propertyInfo.mutationMethod;
|
||||
if (mutationMethod) {
|
||||
mutationMethod(node, value);
|
||||
} else if (shouldIgnoreValue(propertyInfo, value)) {
|
||||
this.deleteValueForProperty(node, name);
|
||||
} else if (propertyInfo.mustUseAttribute) {
|
||||
var attributeName = propertyInfo.attributeName;
|
||||
var namespace = propertyInfo.attributeNamespace;
|
||||
// `setAttribute` with objects becomes only `[object]` in IE8/9,
|
||||
// ('' + value) makes it output the correct toString()-value.
|
||||
if (namespace) {
|
||||
node.setAttributeNS(namespace, attributeName, '' + value);
|
||||
} else if (propertyInfo.hasBooleanValue || propertyInfo.hasOverloadedBooleanValue && value === true) {
|
||||
node.setAttribute(attributeName, '');
|
||||
} else {
|
||||
node.setAttribute(attributeName, '' + value);
|
||||
}
|
||||
} else {
|
||||
var propName = propertyInfo.propertyName;
|
||||
// Must explicitly cast values for HAS_SIDE_EFFECTS-properties to the
|
||||
// property type before comparing; only `value` does and is string.
|
||||
if (!propertyInfo.hasSideEffects || '' + node[propName] !== '' + value) {
|
||||
// Contrary to `setAttribute`, object properties are properly
|
||||
// `toString`ed by IE8/9.
|
||||
node[propName] = value;
|
||||
}
|
||||
}
|
||||
} else if (DOMProperty.isCustomAttribute(name)) {
|
||||
DOMPropertyOperations.setValueForAttribute(node, name, value);
|
||||
} else if (process.env.NODE_ENV !== 'production') {
|
||||
warnUnknownProperty(name);
|
||||
}
|
||||
},
|
||||
|
||||
setValueForAttribute: function (node, name, value) {
|
||||
if (!isAttributeNameSafe(name)) {
|
||||
return;
|
||||
}
|
||||
if (value == null) {
|
||||
node.removeAttribute(name);
|
||||
} else {
|
||||
node.setAttribute(name, '' + value);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Deletes the value for a property on a node.
|
||||
*
|
||||
* @param {DOMElement} node
|
||||
* @param {string} name
|
||||
*/
|
||||
deleteValueForProperty: function (node, name) {
|
||||
var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null;
|
||||
if (propertyInfo) {
|
||||
var mutationMethod = propertyInfo.mutationMethod;
|
||||
if (mutationMethod) {
|
||||
mutationMethod(node, undefined);
|
||||
} else if (propertyInfo.mustUseAttribute) {
|
||||
node.removeAttribute(propertyInfo.attributeName);
|
||||
} else {
|
||||
var propName = propertyInfo.propertyName;
|
||||
var defaultValue = DOMProperty.getDefaultValueForProperty(node.nodeName, propName);
|
||||
if (!propertyInfo.hasSideEffects || '' + node[propName] !== defaultValue) {
|
||||
node[propName] = defaultValue;
|
||||
}
|
||||
}
|
||||
} else if (DOMProperty.isCustomAttribute(name)) {
|
||||
node.removeAttribute(name);
|
||||
} else if (process.env.NODE_ENV !== 'production') {
|
||||
warnUnknownProperty(name);
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
ReactPerf.measureMethods(DOMPropertyOperations, 'DOMPropertyOperations', {
|
||||
setValueForProperty: 'setValueForProperty',
|
||||
setValueForAttribute: 'setValueForAttribute',
|
||||
deleteValueForProperty: 'deleteValueForProperty'
|
||||
});
|
||||
|
||||
module.exports = DOMPropertyOperations;
|
||||
145
old_major_packages/14/react/lib/Danger.js
Normal file
145
old_major_packages/14/react/lib/Danger.js
Normal file
@@ -0,0 +1,145 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule Danger
|
||||
* @typechecks static-only
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');
|
||||
|
||||
var createNodesFromMarkup = require('fbjs/lib/createNodesFromMarkup');
|
||||
var emptyFunction = require('fbjs/lib/emptyFunction');
|
||||
var getMarkupWrap = require('fbjs/lib/getMarkupWrap');
|
||||
var invariant = require('fbjs/lib/invariant');
|
||||
|
||||
var OPEN_TAG_NAME_EXP = /^(<[^ \/>]+)/;
|
||||
var RESULT_INDEX_ATTR = 'data-danger-index';
|
||||
|
||||
/**
|
||||
* Extracts the `nodeName` from a string of markup.
|
||||
*
|
||||
* NOTE: Extracting the `nodeName` does not require a regular expression match
|
||||
* because we make assumptions about React-generated markup (i.e. there are no
|
||||
* spaces surrounding the opening tag and there is at least one attribute).
|
||||
*
|
||||
* @param {string} markup String of markup.
|
||||
* @return {string} Node name of the supplied markup.
|
||||
* @see http://jsperf.com/extract-nodename
|
||||
*/
|
||||
function getNodeName(markup) {
|
||||
return markup.substring(1, markup.indexOf(' '));
|
||||
}
|
||||
|
||||
var Danger = {
|
||||
|
||||
/**
|
||||
* Renders markup into an array of nodes. The markup is expected to render
|
||||
* into a list of root nodes. Also, the length of `resultList` and
|
||||
* `markupList` should be the same.
|
||||
*
|
||||
* @param {array<string>} markupList List of markup strings to render.
|
||||
* @return {array<DOMElement>} List of rendered nodes.
|
||||
* @internal
|
||||
*/
|
||||
dangerouslyRenderMarkup: function (markupList) {
|
||||
!ExecutionEnvironment.canUseDOM ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyRenderMarkup(...): Cannot render markup in a worker ' + 'thread. Make sure `window` and `document` are available globally ' + 'before requiring React when unit testing or use ' + 'ReactDOMServer.renderToString for server rendering.') : invariant(false) : undefined;
|
||||
var nodeName;
|
||||
var markupByNodeName = {};
|
||||
// Group markup by `nodeName` if a wrap is necessary, else by '*'.
|
||||
for (var i = 0; i < markupList.length; i++) {
|
||||
!markupList[i] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyRenderMarkup(...): Missing markup.') : invariant(false) : undefined;
|
||||
nodeName = getNodeName(markupList[i]);
|
||||
nodeName = getMarkupWrap(nodeName) ? nodeName : '*';
|
||||
markupByNodeName[nodeName] = markupByNodeName[nodeName] || [];
|
||||
markupByNodeName[nodeName][i] = markupList[i];
|
||||
}
|
||||
var resultList = [];
|
||||
var resultListAssignmentCount = 0;
|
||||
for (nodeName in markupByNodeName) {
|
||||
if (!markupByNodeName.hasOwnProperty(nodeName)) {
|
||||
continue;
|
||||
}
|
||||
var markupListByNodeName = markupByNodeName[nodeName];
|
||||
|
||||
// This for-in loop skips the holes of the sparse array. The order of
|
||||
// iteration should follow the order of assignment, which happens to match
|
||||
// numerical index order, but we don't rely on that.
|
||||
var resultIndex;
|
||||
for (resultIndex in markupListByNodeName) {
|
||||
if (markupListByNodeName.hasOwnProperty(resultIndex)) {
|
||||
var markup = markupListByNodeName[resultIndex];
|
||||
|
||||
// Push the requested markup with an additional RESULT_INDEX_ATTR
|
||||
// attribute. If the markup does not start with a < character, it
|
||||
// will be discarded below (with an appropriate console.error).
|
||||
markupListByNodeName[resultIndex] = markup.replace(OPEN_TAG_NAME_EXP,
|
||||
// This index will be parsed back out below.
|
||||
'$1 ' + RESULT_INDEX_ATTR + '="' + resultIndex + '" ');
|
||||
}
|
||||
}
|
||||
|
||||
// Render each group of markup with similar wrapping `nodeName`.
|
||||
var renderNodes = createNodesFromMarkup(markupListByNodeName.join(''), emptyFunction // Do nothing special with <script> tags.
|
||||
);
|
||||
|
||||
for (var j = 0; j < renderNodes.length; ++j) {
|
||||
var renderNode = renderNodes[j];
|
||||
if (renderNode.hasAttribute && renderNode.hasAttribute(RESULT_INDEX_ATTR)) {
|
||||
|
||||
resultIndex = +renderNode.getAttribute(RESULT_INDEX_ATTR);
|
||||
renderNode.removeAttribute(RESULT_INDEX_ATTR);
|
||||
|
||||
!!resultList.hasOwnProperty(resultIndex) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Danger: Assigning to an already-occupied result index.') : invariant(false) : undefined;
|
||||
|
||||
resultList[resultIndex] = renderNode;
|
||||
|
||||
// This should match resultList.length and markupList.length when
|
||||
// we're done.
|
||||
resultListAssignmentCount += 1;
|
||||
} else if (process.env.NODE_ENV !== 'production') {
|
||||
console.error('Danger: Discarding unexpected node:', renderNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Although resultList was populated out of order, it should now be a dense
|
||||
// array.
|
||||
!(resultListAssignmentCount === resultList.length) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Danger: Did not assign to every index of resultList.') : invariant(false) : undefined;
|
||||
|
||||
!(resultList.length === markupList.length) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Danger: Expected markup to render %s nodes, but rendered %s.', markupList.length, resultList.length) : invariant(false) : undefined;
|
||||
|
||||
return resultList;
|
||||
},
|
||||
|
||||
/**
|
||||
* Replaces a node with a string of markup at its current position within its
|
||||
* parent. The markup must render into a single root node.
|
||||
*
|
||||
* @param {DOMElement} oldChild Child node to replace.
|
||||
* @param {string} markup Markup to render in place of the child node.
|
||||
* @internal
|
||||
*/
|
||||
dangerouslyReplaceNodeWithMarkup: function (oldChild, markup) {
|
||||
!ExecutionEnvironment.canUseDOM ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyReplaceNodeWithMarkup(...): Cannot render markup in a ' + 'worker thread. Make sure `window` and `document` are available ' + 'globally before requiring React when unit testing or use ' + 'ReactDOMServer.renderToString() for server rendering.') : invariant(false) : undefined;
|
||||
!markup ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyReplaceNodeWithMarkup(...): Missing markup.') : invariant(false) : undefined;
|
||||
!(oldChild.tagName.toLowerCase() !== 'html') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyReplaceNodeWithMarkup(...): Cannot replace markup of the ' + '<html> node. This is because browser quirks make this unreliable ' + 'and/or slow. If you want to render to the root you must use ' + 'server rendering. See ReactDOMServer.renderToString().') : invariant(false) : undefined;
|
||||
|
||||
var newChild;
|
||||
if (typeof markup === 'string') {
|
||||
newChild = createNodesFromMarkup(markup, emptyFunction)[0];
|
||||
} else {
|
||||
newChild = markup;
|
||||
}
|
||||
oldChild.parentNode.replaceChild(newChild, oldChild);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
module.exports = Danger;
|
||||
27
old_major_packages/14/react/lib/DefaultEventPluginOrder.js
Normal file
27
old_major_packages/14/react/lib/DefaultEventPluginOrder.js
Normal file
@@ -0,0 +1,27 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule DefaultEventPluginOrder
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var keyOf = require('fbjs/lib/keyOf');
|
||||
|
||||
/**
|
||||
* Module that is injectable into `EventPluginHub`, that specifies a
|
||||
* deterministic ordering of `EventPlugin`s. A convenient way to reason about
|
||||
* plugins, without having to package every one of them. This is better than
|
||||
* having plugins be ordered in the same order that they are injected because
|
||||
* that ordering would be influenced by the packaging order.
|
||||
* `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that
|
||||
* preventing default on events is convenient in `SimpleEventPlugin` handlers.
|
||||
*/
|
||||
var DefaultEventPluginOrder = [keyOf({ ResponderEventPlugin: null }), keyOf({ SimpleEventPlugin: null }), keyOf({ TapEventPlugin: null }), keyOf({ EnterLeaveEventPlugin: null }), keyOf({ ChangeEventPlugin: null }), keyOf({ SelectEventPlugin: null }), keyOf({ BeforeInputEventPlugin: null })];
|
||||
|
||||
module.exports = DefaultEventPluginOrder;
|
||||
124
old_major_packages/14/react/lib/EnterLeaveEventPlugin.js
Normal file
124
old_major_packages/14/react/lib/EnterLeaveEventPlugin.js
Normal file
@@ -0,0 +1,124 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule EnterLeaveEventPlugin
|
||||
* @typechecks static-only
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var EventConstants = require('./EventConstants');
|
||||
var EventPropagators = require('./EventPropagators');
|
||||
var SyntheticMouseEvent = require('./SyntheticMouseEvent');
|
||||
|
||||
var ReactMount = require('./ReactMount');
|
||||
var keyOf = require('fbjs/lib/keyOf');
|
||||
|
||||
var topLevelTypes = EventConstants.topLevelTypes;
|
||||
var getFirstReactDOM = ReactMount.getFirstReactDOM;
|
||||
|
||||
var eventTypes = {
|
||||
mouseEnter: {
|
||||
registrationName: keyOf({ onMouseEnter: null }),
|
||||
dependencies: [topLevelTypes.topMouseOut, topLevelTypes.topMouseOver]
|
||||
},
|
||||
mouseLeave: {
|
||||
registrationName: keyOf({ onMouseLeave: null }),
|
||||
dependencies: [topLevelTypes.topMouseOut, topLevelTypes.topMouseOver]
|
||||
}
|
||||
};
|
||||
|
||||
var extractedEvents = [null, null];
|
||||
|
||||
var EnterLeaveEventPlugin = {
|
||||
|
||||
eventTypes: eventTypes,
|
||||
|
||||
/**
|
||||
* For almost every interaction we care about, there will be both a top-level
|
||||
* `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that
|
||||
* we do not extract duplicate events. However, moving the mouse into the
|
||||
* browser from outside will not fire a `mouseout` event. In this case, we use
|
||||
* the `mouseover` top-level event.
|
||||
*
|
||||
* @param {string} topLevelType Record from `EventConstants`.
|
||||
* @param {DOMEventTarget} topLevelTarget The listening component root node.
|
||||
* @param {string} topLevelTargetID ID of `topLevelTarget`.
|
||||
* @param {object} nativeEvent Native browser event.
|
||||
* @return {*} An accumulation of synthetic events.
|
||||
* @see {EventPluginHub.extractEvents}
|
||||
*/
|
||||
extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {
|
||||
if (topLevelType === topLevelTypes.topMouseOver && (nativeEvent.relatedTarget || nativeEvent.fromElement)) {
|
||||
return null;
|
||||
}
|
||||
if (topLevelType !== topLevelTypes.topMouseOut && topLevelType !== topLevelTypes.topMouseOver) {
|
||||
// Must not be a mouse in or mouse out - ignoring.
|
||||
return null;
|
||||
}
|
||||
|
||||
var win;
|
||||
if (topLevelTarget.window === topLevelTarget) {
|
||||
// `topLevelTarget` is probably a window object.
|
||||
win = topLevelTarget;
|
||||
} else {
|
||||
// TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.
|
||||
var doc = topLevelTarget.ownerDocument;
|
||||
if (doc) {
|
||||
win = doc.defaultView || doc.parentWindow;
|
||||
} else {
|
||||
win = window;
|
||||
}
|
||||
}
|
||||
|
||||
var from;
|
||||
var to;
|
||||
var fromID = '';
|
||||
var toID = '';
|
||||
if (topLevelType === topLevelTypes.topMouseOut) {
|
||||
from = topLevelTarget;
|
||||
fromID = topLevelTargetID;
|
||||
to = getFirstReactDOM(nativeEvent.relatedTarget || nativeEvent.toElement);
|
||||
if (to) {
|
||||
toID = ReactMount.getID(to);
|
||||
} else {
|
||||
to = win;
|
||||
}
|
||||
to = to || win;
|
||||
} else {
|
||||
from = win;
|
||||
to = topLevelTarget;
|
||||
toID = topLevelTargetID;
|
||||
}
|
||||
|
||||
if (from === to) {
|
||||
// Nothing pertains to our managed components.
|
||||
return null;
|
||||
}
|
||||
|
||||
var leave = SyntheticMouseEvent.getPooled(eventTypes.mouseLeave, fromID, nativeEvent, nativeEventTarget);
|
||||
leave.type = 'mouseleave';
|
||||
leave.target = from;
|
||||
leave.relatedTarget = to;
|
||||
|
||||
var enter = SyntheticMouseEvent.getPooled(eventTypes.mouseEnter, toID, nativeEvent, nativeEventTarget);
|
||||
enter.type = 'mouseenter';
|
||||
enter.target = to;
|
||||
enter.relatedTarget = from;
|
||||
|
||||
EventPropagators.accumulateEnterLeaveDispatches(leave, enter, fromID, toID);
|
||||
|
||||
extractedEvents[0] = leave;
|
||||
extractedEvents[1] = enter;
|
||||
|
||||
return extractedEvents;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
module.exports = EnterLeaveEventPlugin;
|
||||
92
old_major_packages/14/react/lib/EventConstants.js
Normal file
92
old_major_packages/14/react/lib/EventConstants.js
Normal file
@@ -0,0 +1,92 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule EventConstants
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var keyMirror = require('fbjs/lib/keyMirror');
|
||||
|
||||
var PropagationPhases = keyMirror({ bubbled: null, captured: null });
|
||||
|
||||
/**
|
||||
* Types of raw signals from the browser caught at the top level.
|
||||
*/
|
||||
var topLevelTypes = keyMirror({
|
||||
topAbort: null,
|
||||
topBlur: null,
|
||||
topCanPlay: null,
|
||||
topCanPlayThrough: null,
|
||||
topChange: null,
|
||||
topClick: null,
|
||||
topCompositionEnd: null,
|
||||
topCompositionStart: null,
|
||||
topCompositionUpdate: null,
|
||||
topContextMenu: null,
|
||||
topCopy: null,
|
||||
topCut: null,
|
||||
topDoubleClick: null,
|
||||
topDrag: null,
|
||||
topDragEnd: null,
|
||||
topDragEnter: null,
|
||||
topDragExit: null,
|
||||
topDragLeave: null,
|
||||
topDragOver: null,
|
||||
topDragStart: null,
|
||||
topDrop: null,
|
||||
topDurationChange: null,
|
||||
topEmptied: null,
|
||||
topEncrypted: null,
|
||||
topEnded: null,
|
||||
topError: null,
|
||||
topFocus: null,
|
||||
topInput: null,
|
||||
topKeyDown: null,
|
||||
topKeyPress: null,
|
||||
topKeyUp: null,
|
||||
topLoad: null,
|
||||
topLoadedData: null,
|
||||
topLoadedMetadata: null,
|
||||
topLoadStart: null,
|
||||
topMouseDown: null,
|
||||
topMouseMove: null,
|
||||
topMouseOut: null,
|
||||
topMouseOver: null,
|
||||
topMouseUp: null,
|
||||
topPaste: null,
|
||||
topPause: null,
|
||||
topPlay: null,
|
||||
topPlaying: null,
|
||||
topProgress: null,
|
||||
topRateChange: null,
|
||||
topReset: null,
|
||||
topScroll: null,
|
||||
topSeeked: null,
|
||||
topSeeking: null,
|
||||
topSelectionChange: null,
|
||||
topStalled: null,
|
||||
topSubmit: null,
|
||||
topSuspend: null,
|
||||
topTextInput: null,
|
||||
topTimeUpdate: null,
|
||||
topTouchCancel: null,
|
||||
topTouchEnd: null,
|
||||
topTouchMove: null,
|
||||
topTouchStart: null,
|
||||
topVolumeChange: null,
|
||||
topWaiting: null,
|
||||
topWheel: null
|
||||
});
|
||||
|
||||
var EventConstants = {
|
||||
topLevelTypes: topLevelTypes,
|
||||
PropagationPhases: PropagationPhases
|
||||
};
|
||||
|
||||
module.exports = EventConstants;
|
||||
279
old_major_packages/14/react/lib/EventPluginHub.js
Normal file
279
old_major_packages/14/react/lib/EventPluginHub.js
Normal file
@@ -0,0 +1,279 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule EventPluginHub
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var EventPluginRegistry = require('./EventPluginRegistry');
|
||||
var EventPluginUtils = require('./EventPluginUtils');
|
||||
var ReactErrorUtils = require('./ReactErrorUtils');
|
||||
|
||||
var accumulateInto = require('./accumulateInto');
|
||||
var forEachAccumulated = require('./forEachAccumulated');
|
||||
var invariant = require('fbjs/lib/invariant');
|
||||
var warning = require('fbjs/lib/warning');
|
||||
|
||||
/**
|
||||
* Internal store for event listeners
|
||||
*/
|
||||
var listenerBank = {};
|
||||
|
||||
/**
|
||||
* Internal queue of events that have accumulated their dispatches and are
|
||||
* waiting to have their dispatches executed.
|
||||
*/
|
||||
var eventQueue = null;
|
||||
|
||||
/**
|
||||
* Dispatches an event and releases it back into the pool, unless persistent.
|
||||
*
|
||||
* @param {?object} event Synthetic event to be dispatched.
|
||||
* @param {boolean} simulated If the event is simulated (changes exn behavior)
|
||||
* @private
|
||||
*/
|
||||
var executeDispatchesAndRelease = function (event, simulated) {
|
||||
if (event) {
|
||||
EventPluginUtils.executeDispatchesInOrder(event, simulated);
|
||||
|
||||
if (!event.isPersistent()) {
|
||||
event.constructor.release(event);
|
||||
}
|
||||
}
|
||||
};
|
||||
var executeDispatchesAndReleaseSimulated = function (e) {
|
||||
return executeDispatchesAndRelease(e, true);
|
||||
};
|
||||
var executeDispatchesAndReleaseTopLevel = function (e) {
|
||||
return executeDispatchesAndRelease(e, false);
|
||||
};
|
||||
|
||||
/**
|
||||
* - `InstanceHandle`: [required] Module that performs logical traversals of DOM
|
||||
* hierarchy given ids of the logical DOM elements involved.
|
||||
*/
|
||||
var InstanceHandle = null;
|
||||
|
||||
function validateInstanceHandle() {
|
||||
var valid = InstanceHandle && InstanceHandle.traverseTwoPhase && InstanceHandle.traverseEnterLeave;
|
||||
process.env.NODE_ENV !== 'production' ? warning(valid, 'InstanceHandle not injected before use!') : undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* This is a unified interface for event plugins to be installed and configured.
|
||||
*
|
||||
* Event plugins can implement the following properties:
|
||||
*
|
||||
* `extractEvents` {function(string, DOMEventTarget, string, object): *}
|
||||
* Required. When a top-level event is fired, this method is expected to
|
||||
* extract synthetic events that will in turn be queued and dispatched.
|
||||
*
|
||||
* `eventTypes` {object}
|
||||
* Optional, plugins that fire events must publish a mapping of registration
|
||||
* names that are used to register listeners. Values of this mapping must
|
||||
* be objects that contain `registrationName` or `phasedRegistrationNames`.
|
||||
*
|
||||
* `executeDispatch` {function(object, function, string)}
|
||||
* Optional, allows plugins to override how an event gets dispatched. By
|
||||
* default, the listener is simply invoked.
|
||||
*
|
||||
* Each plugin that is injected into `EventsPluginHub` is immediately operable.
|
||||
*
|
||||
* @public
|
||||
*/
|
||||
var EventPluginHub = {
|
||||
|
||||
/**
|
||||
* Methods for injecting dependencies.
|
||||
*/
|
||||
injection: {
|
||||
|
||||
/**
|
||||
* @param {object} InjectedMount
|
||||
* @public
|
||||
*/
|
||||
injectMount: EventPluginUtils.injection.injectMount,
|
||||
|
||||
/**
|
||||
* @param {object} InjectedInstanceHandle
|
||||
* @public
|
||||
*/
|
||||
injectInstanceHandle: function (InjectedInstanceHandle) {
|
||||
InstanceHandle = InjectedInstanceHandle;
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
validateInstanceHandle();
|
||||
}
|
||||
},
|
||||
|
||||
getInstanceHandle: function () {
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
validateInstanceHandle();
|
||||
}
|
||||
return InstanceHandle;
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {array} InjectedEventPluginOrder
|
||||
* @public
|
||||
*/
|
||||
injectEventPluginOrder: EventPluginRegistry.injectEventPluginOrder,
|
||||
|
||||
/**
|
||||
* @param {object} injectedNamesToPlugins Map from names to plugin modules.
|
||||
*/
|
||||
injectEventPluginsByName: EventPluginRegistry.injectEventPluginsByName
|
||||
|
||||
},
|
||||
|
||||
eventNameDispatchConfigs: EventPluginRegistry.eventNameDispatchConfigs,
|
||||
|
||||
registrationNameModules: EventPluginRegistry.registrationNameModules,
|
||||
|
||||
/**
|
||||
* Stores `listener` at `listenerBank[registrationName][id]`. Is idempotent.
|
||||
*
|
||||
* @param {string} id ID of the DOM element.
|
||||
* @param {string} registrationName Name of listener (e.g. `onClick`).
|
||||
* @param {?function} listener The callback to store.
|
||||
*/
|
||||
putListener: function (id, registrationName, listener) {
|
||||
!(typeof listener === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Expected %s listener to be a function, instead got type %s', registrationName, typeof listener) : invariant(false) : undefined;
|
||||
|
||||
var bankForRegistrationName = listenerBank[registrationName] || (listenerBank[registrationName] = {});
|
||||
bankForRegistrationName[id] = listener;
|
||||
|
||||
var PluginModule = EventPluginRegistry.registrationNameModules[registrationName];
|
||||
if (PluginModule && PluginModule.didPutListener) {
|
||||
PluginModule.didPutListener(id, registrationName, listener);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {string} id ID of the DOM element.
|
||||
* @param {string} registrationName Name of listener (e.g. `onClick`).
|
||||
* @return {?function} The stored callback.
|
||||
*/
|
||||
getListener: function (id, registrationName) {
|
||||
var bankForRegistrationName = listenerBank[registrationName];
|
||||
return bankForRegistrationName && bankForRegistrationName[id];
|
||||
},
|
||||
|
||||
/**
|
||||
* Deletes a listener from the registration bank.
|
||||
*
|
||||
* @param {string} id ID of the DOM element.
|
||||
* @param {string} registrationName Name of listener (e.g. `onClick`).
|
||||
*/
|
||||
deleteListener: function (id, registrationName) {
|
||||
var PluginModule = EventPluginRegistry.registrationNameModules[registrationName];
|
||||
if (PluginModule && PluginModule.willDeleteListener) {
|
||||
PluginModule.willDeleteListener(id, registrationName);
|
||||
}
|
||||
|
||||
var bankForRegistrationName = listenerBank[registrationName];
|
||||
// TODO: This should never be null -- when is it?
|
||||
if (bankForRegistrationName) {
|
||||
delete bankForRegistrationName[id];
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Deletes all listeners for the DOM element with the supplied ID.
|
||||
*
|
||||
* @param {string} id ID of the DOM element.
|
||||
*/
|
||||
deleteAllListeners: function (id) {
|
||||
for (var registrationName in listenerBank) {
|
||||
if (!listenerBank[registrationName][id]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
var PluginModule = EventPluginRegistry.registrationNameModules[registrationName];
|
||||
if (PluginModule && PluginModule.willDeleteListener) {
|
||||
PluginModule.willDeleteListener(id, registrationName);
|
||||
}
|
||||
|
||||
delete listenerBank[registrationName][id];
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Allows registered plugins an opportunity to extract events from top-level
|
||||
* native browser events.
|
||||
*
|
||||
* @param {string} topLevelType Record from `EventConstants`.
|
||||
* @param {DOMEventTarget} topLevelTarget The listening component root node.
|
||||
* @param {string} topLevelTargetID ID of `topLevelTarget`.
|
||||
* @param {object} nativeEvent Native browser event.
|
||||
* @return {*} An accumulation of synthetic events.
|
||||
* @internal
|
||||
*/
|
||||
extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {
|
||||
var events;
|
||||
var plugins = EventPluginRegistry.plugins;
|
||||
for (var i = 0; i < plugins.length; i++) {
|
||||
// Not every plugin in the ordering may be loaded at runtime.
|
||||
var possiblePlugin = plugins[i];
|
||||
if (possiblePlugin) {
|
||||
var extractedEvents = possiblePlugin.extractEvents(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget);
|
||||
if (extractedEvents) {
|
||||
events = accumulateInto(events, extractedEvents);
|
||||
}
|
||||
}
|
||||
}
|
||||
return events;
|
||||
},
|
||||
|
||||
/**
|
||||
* Enqueues a synthetic event that should be dispatched when
|
||||
* `processEventQueue` is invoked.
|
||||
*
|
||||
* @param {*} events An accumulation of synthetic events.
|
||||
* @internal
|
||||
*/
|
||||
enqueueEvents: function (events) {
|
||||
if (events) {
|
||||
eventQueue = accumulateInto(eventQueue, events);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Dispatches all synthetic events on the event queue.
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
processEventQueue: function (simulated) {
|
||||
// Set `eventQueue` to null before processing it so that we can tell if more
|
||||
// events get enqueued while processing.
|
||||
var processingEventQueue = eventQueue;
|
||||
eventQueue = null;
|
||||
if (simulated) {
|
||||
forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseSimulated);
|
||||
} else {
|
||||
forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseTopLevel);
|
||||
}
|
||||
!!eventQueue ? process.env.NODE_ENV !== 'production' ? invariant(false, 'processEventQueue(): Additional events were enqueued while processing ' + 'an event queue. Support for this has not yet been implemented.') : invariant(false) : undefined;
|
||||
// This would be a good time to rethrow if any of the event handlers threw.
|
||||
ReactErrorUtils.rethrowCaughtError();
|
||||
},
|
||||
|
||||
/**
|
||||
* These are needed for tests only. Do not use!
|
||||
*/
|
||||
__purge: function () {
|
||||
listenerBank = {};
|
||||
},
|
||||
|
||||
__getListenerBank: function () {
|
||||
return listenerBank;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
module.exports = EventPluginHub;
|
||||
220
old_major_packages/14/react/lib/EventPluginRegistry.js
Normal file
220
old_major_packages/14/react/lib/EventPluginRegistry.js
Normal file
@@ -0,0 +1,220 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule EventPluginRegistry
|
||||
* @typechecks static-only
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var invariant = require('fbjs/lib/invariant');
|
||||
|
||||
/**
|
||||
* Injectable ordering of event plugins.
|
||||
*/
|
||||
var EventPluginOrder = null;
|
||||
|
||||
/**
|
||||
* Injectable mapping from names to event plugin modules.
|
||||
*/
|
||||
var namesToPlugins = {};
|
||||
|
||||
/**
|
||||
* Recomputes the plugin list using the injected plugins and plugin ordering.
|
||||
*
|
||||
* @private
|
||||
*/
|
||||
function recomputePluginOrdering() {
|
||||
if (!EventPluginOrder) {
|
||||
// Wait until an `EventPluginOrder` is injected.
|
||||
return;
|
||||
}
|
||||
for (var pluginName in namesToPlugins) {
|
||||
var PluginModule = namesToPlugins[pluginName];
|
||||
var pluginIndex = EventPluginOrder.indexOf(pluginName);
|
||||
!(pluginIndex > -1) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Cannot inject event plugins that do not exist in ' + 'the plugin ordering, `%s`.', pluginName) : invariant(false) : undefined;
|
||||
if (EventPluginRegistry.plugins[pluginIndex]) {
|
||||
continue;
|
||||
}
|
||||
!PluginModule.extractEvents ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Event plugins must implement an `extractEvents` ' + 'method, but `%s` does not.', pluginName) : invariant(false) : undefined;
|
||||
EventPluginRegistry.plugins[pluginIndex] = PluginModule;
|
||||
var publishedEvents = PluginModule.eventTypes;
|
||||
for (var eventName in publishedEvents) {
|
||||
!publishEventForPlugin(publishedEvents[eventName], PluginModule, eventName) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.', eventName, pluginName) : invariant(false) : undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Publishes an event so that it can be dispatched by the supplied plugin.
|
||||
*
|
||||
* @param {object} dispatchConfig Dispatch configuration for the event.
|
||||
* @param {object} PluginModule Plugin publishing the event.
|
||||
* @return {boolean} True if the event was successfully published.
|
||||
* @private
|
||||
*/
|
||||
function publishEventForPlugin(dispatchConfig, PluginModule, eventName) {
|
||||
!!EventPluginRegistry.eventNameDispatchConfigs.hasOwnProperty(eventName) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same ' + 'event name, `%s`.', eventName) : invariant(false) : undefined;
|
||||
EventPluginRegistry.eventNameDispatchConfigs[eventName] = dispatchConfig;
|
||||
|
||||
var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;
|
||||
if (phasedRegistrationNames) {
|
||||
for (var phaseName in phasedRegistrationNames) {
|
||||
if (phasedRegistrationNames.hasOwnProperty(phaseName)) {
|
||||
var phasedRegistrationName = phasedRegistrationNames[phaseName];
|
||||
publishRegistrationName(phasedRegistrationName, PluginModule, eventName);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
} else if (dispatchConfig.registrationName) {
|
||||
publishRegistrationName(dispatchConfig.registrationName, PluginModule, eventName);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Publishes a registration name that is used to identify dispatched events and
|
||||
* can be used with `EventPluginHub.putListener` to register listeners.
|
||||
*
|
||||
* @param {string} registrationName Registration name to add.
|
||||
* @param {object} PluginModule Plugin publishing the event.
|
||||
* @private
|
||||
*/
|
||||
function publishRegistrationName(registrationName, PluginModule, eventName) {
|
||||
!!EventPluginRegistry.registrationNameModules[registrationName] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same ' + 'registration name, `%s`.', registrationName) : invariant(false) : undefined;
|
||||
EventPluginRegistry.registrationNameModules[registrationName] = PluginModule;
|
||||
EventPluginRegistry.registrationNameDependencies[registrationName] = PluginModule.eventTypes[eventName].dependencies;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers plugins so that they can extract and dispatch events.
|
||||
*
|
||||
* @see {EventPluginHub}
|
||||
*/
|
||||
var EventPluginRegistry = {
|
||||
|
||||
/**
|
||||
* Ordered list of injected plugins.
|
||||
*/
|
||||
plugins: [],
|
||||
|
||||
/**
|
||||
* Mapping from event name to dispatch config
|
||||
*/
|
||||
eventNameDispatchConfigs: {},
|
||||
|
||||
/**
|
||||
* Mapping from registration name to plugin module
|
||||
*/
|
||||
registrationNameModules: {},
|
||||
|
||||
/**
|
||||
* Mapping from registration name to event name
|
||||
*/
|
||||
registrationNameDependencies: {},
|
||||
|
||||
/**
|
||||
* Injects an ordering of plugins (by plugin name). This allows the ordering
|
||||
* to be decoupled from injection of the actual plugins so that ordering is
|
||||
* always deterministic regardless of packaging, on-the-fly injection, etc.
|
||||
*
|
||||
* @param {array} InjectedEventPluginOrder
|
||||
* @internal
|
||||
* @see {EventPluginHub.injection.injectEventPluginOrder}
|
||||
*/
|
||||
injectEventPluginOrder: function (InjectedEventPluginOrder) {
|
||||
!!EventPluginOrder ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Cannot inject event plugin ordering more than ' + 'once. You are likely trying to load more than one copy of React.') : invariant(false) : undefined;
|
||||
// Clone the ordering so it cannot be dynamically mutated.
|
||||
EventPluginOrder = Array.prototype.slice.call(InjectedEventPluginOrder);
|
||||
recomputePluginOrdering();
|
||||
},
|
||||
|
||||
/**
|
||||
* Injects plugins to be used by `EventPluginHub`. The plugin names must be
|
||||
* in the ordering injected by `injectEventPluginOrder`.
|
||||
*
|
||||
* Plugins can be injected as part of page initialization or on-the-fly.
|
||||
*
|
||||
* @param {object} injectedNamesToPlugins Map from names to plugin modules.
|
||||
* @internal
|
||||
* @see {EventPluginHub.injection.injectEventPluginsByName}
|
||||
*/
|
||||
injectEventPluginsByName: function (injectedNamesToPlugins) {
|
||||
var isOrderingDirty = false;
|
||||
for (var pluginName in injectedNamesToPlugins) {
|
||||
if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) {
|
||||
continue;
|
||||
}
|
||||
var PluginModule = injectedNamesToPlugins[pluginName];
|
||||
if (!namesToPlugins.hasOwnProperty(pluginName) || namesToPlugins[pluginName] !== PluginModule) {
|
||||
!!namesToPlugins[pluginName] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Cannot inject two different event plugins ' + 'using the same name, `%s`.', pluginName) : invariant(false) : undefined;
|
||||
namesToPlugins[pluginName] = PluginModule;
|
||||
isOrderingDirty = true;
|
||||
}
|
||||
}
|
||||
if (isOrderingDirty) {
|
||||
recomputePluginOrdering();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Looks up the plugin for the supplied event.
|
||||
*
|
||||
* @param {object} event A synthetic event.
|
||||
* @return {?object} The plugin that created the supplied event.
|
||||
* @internal
|
||||
*/
|
||||
getPluginModuleForEvent: function (event) {
|
||||
var dispatchConfig = event.dispatchConfig;
|
||||
if (dispatchConfig.registrationName) {
|
||||
return EventPluginRegistry.registrationNameModules[dispatchConfig.registrationName] || null;
|
||||
}
|
||||
for (var phase in dispatchConfig.phasedRegistrationNames) {
|
||||
if (!dispatchConfig.phasedRegistrationNames.hasOwnProperty(phase)) {
|
||||
continue;
|
||||
}
|
||||
var PluginModule = EventPluginRegistry.registrationNameModules[dispatchConfig.phasedRegistrationNames[phase]];
|
||||
if (PluginModule) {
|
||||
return PluginModule;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
},
|
||||
|
||||
/**
|
||||
* Exposed for unit testing.
|
||||
* @private
|
||||
*/
|
||||
_resetEventPlugins: function () {
|
||||
EventPluginOrder = null;
|
||||
for (var pluginName in namesToPlugins) {
|
||||
if (namesToPlugins.hasOwnProperty(pluginName)) {
|
||||
delete namesToPlugins[pluginName];
|
||||
}
|
||||
}
|
||||
EventPluginRegistry.plugins.length = 0;
|
||||
|
||||
var eventNameDispatchConfigs = EventPluginRegistry.eventNameDispatchConfigs;
|
||||
for (var eventName in eventNameDispatchConfigs) {
|
||||
if (eventNameDispatchConfigs.hasOwnProperty(eventName)) {
|
||||
delete eventNameDispatchConfigs[eventName];
|
||||
}
|
||||
}
|
||||
|
||||
var registrationNameModules = EventPluginRegistry.registrationNameModules;
|
||||
for (var registrationName in registrationNameModules) {
|
||||
if (registrationNameModules.hasOwnProperty(registrationName)) {
|
||||
delete registrationNameModules[registrationName];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
module.exports = EventPluginRegistry;
|
||||
202
old_major_packages/14/react/lib/EventPluginUtils.js
Normal file
202
old_major_packages/14/react/lib/EventPluginUtils.js
Normal file
@@ -0,0 +1,202 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule EventPluginUtils
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var EventConstants = require('./EventConstants');
|
||||
var ReactErrorUtils = require('./ReactErrorUtils');
|
||||
|
||||
var invariant = require('fbjs/lib/invariant');
|
||||
var warning = require('fbjs/lib/warning');
|
||||
|
||||
/**
|
||||
* Injected dependencies:
|
||||
*/
|
||||
|
||||
/**
|
||||
* - `Mount`: [required] Module that can convert between React dom IDs and
|
||||
* actual node references.
|
||||
*/
|
||||
var injection = {
|
||||
Mount: null,
|
||||
injectMount: function (InjectedMount) {
|
||||
injection.Mount = InjectedMount;
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
process.env.NODE_ENV !== 'production' ? warning(InjectedMount && InjectedMount.getNode && InjectedMount.getID, 'EventPluginUtils.injection.injectMount(...): Injected Mount ' + 'module is missing getNode or getID.') : undefined;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var topLevelTypes = EventConstants.topLevelTypes;
|
||||
|
||||
function isEndish(topLevelType) {
|
||||
return topLevelType === topLevelTypes.topMouseUp || topLevelType === topLevelTypes.topTouchEnd || topLevelType === topLevelTypes.topTouchCancel;
|
||||
}
|
||||
|
||||
function isMoveish(topLevelType) {
|
||||
return topLevelType === topLevelTypes.topMouseMove || topLevelType === topLevelTypes.topTouchMove;
|
||||
}
|
||||
function isStartish(topLevelType) {
|
||||
return topLevelType === topLevelTypes.topMouseDown || topLevelType === topLevelTypes.topTouchStart;
|
||||
}
|
||||
|
||||
var validateEventDispatches;
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
validateEventDispatches = function (event) {
|
||||
var dispatchListeners = event._dispatchListeners;
|
||||
var dispatchIDs = event._dispatchIDs;
|
||||
|
||||
var listenersIsArr = Array.isArray(dispatchListeners);
|
||||
var idsIsArr = Array.isArray(dispatchIDs);
|
||||
var IDsLen = idsIsArr ? dispatchIDs.length : dispatchIDs ? 1 : 0;
|
||||
var listenersLen = listenersIsArr ? dispatchListeners.length : dispatchListeners ? 1 : 0;
|
||||
|
||||
process.env.NODE_ENV !== 'production' ? warning(idsIsArr === listenersIsArr && IDsLen === listenersLen, 'EventPluginUtils: Invalid `event`.') : undefined;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Dispatch the event to the listener.
|
||||
* @param {SyntheticEvent} event SyntheticEvent to handle
|
||||
* @param {boolean} simulated If the event is simulated (changes exn behavior)
|
||||
* @param {function} listener Application-level callback
|
||||
* @param {string} domID DOM id to pass to the callback.
|
||||
*/
|
||||
function executeDispatch(event, simulated, listener, domID) {
|
||||
var type = event.type || 'unknown-event';
|
||||
event.currentTarget = injection.Mount.getNode(domID);
|
||||
if (simulated) {
|
||||
ReactErrorUtils.invokeGuardedCallbackWithCatch(type, listener, event, domID);
|
||||
} else {
|
||||
ReactErrorUtils.invokeGuardedCallback(type, listener, event, domID);
|
||||
}
|
||||
event.currentTarget = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Standard/simple iteration through an event's collected dispatches.
|
||||
*/
|
||||
function executeDispatchesInOrder(event, simulated) {
|
||||
var dispatchListeners = event._dispatchListeners;
|
||||
var dispatchIDs = event._dispatchIDs;
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
validateEventDispatches(event);
|
||||
}
|
||||
if (Array.isArray(dispatchListeners)) {
|
||||
for (var i = 0; i < dispatchListeners.length; i++) {
|
||||
if (event.isPropagationStopped()) {
|
||||
break;
|
||||
}
|
||||
// Listeners and IDs are two parallel arrays that are always in sync.
|
||||
executeDispatch(event, simulated, dispatchListeners[i], dispatchIDs[i]);
|
||||
}
|
||||
} else if (dispatchListeners) {
|
||||
executeDispatch(event, simulated, dispatchListeners, dispatchIDs);
|
||||
}
|
||||
event._dispatchListeners = null;
|
||||
event._dispatchIDs = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Standard/simple iteration through an event's collected dispatches, but stops
|
||||
* at the first dispatch execution returning true, and returns that id.
|
||||
*
|
||||
* @return {?string} id of the first dispatch execution who's listener returns
|
||||
* true, or null if no listener returned true.
|
||||
*/
|
||||
function executeDispatchesInOrderStopAtTrueImpl(event) {
|
||||
var dispatchListeners = event._dispatchListeners;
|
||||
var dispatchIDs = event._dispatchIDs;
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
validateEventDispatches(event);
|
||||
}
|
||||
if (Array.isArray(dispatchListeners)) {
|
||||
for (var i = 0; i < dispatchListeners.length; i++) {
|
||||
if (event.isPropagationStopped()) {
|
||||
break;
|
||||
}
|
||||
// Listeners and IDs are two parallel arrays that are always in sync.
|
||||
if (dispatchListeners[i](event, dispatchIDs[i])) {
|
||||
return dispatchIDs[i];
|
||||
}
|
||||
}
|
||||
} else if (dispatchListeners) {
|
||||
if (dispatchListeners(event, dispatchIDs)) {
|
||||
return dispatchIDs;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see executeDispatchesInOrderStopAtTrueImpl
|
||||
*/
|
||||
function executeDispatchesInOrderStopAtTrue(event) {
|
||||
var ret = executeDispatchesInOrderStopAtTrueImpl(event);
|
||||
event._dispatchIDs = null;
|
||||
event._dispatchListeners = null;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Execution of a "direct" dispatch - there must be at most one dispatch
|
||||
* accumulated on the event or it is considered an error. It doesn't really make
|
||||
* sense for an event with multiple dispatches (bubbled) to keep track of the
|
||||
* return values at each dispatch execution, but it does tend to make sense when
|
||||
* dealing with "direct" dispatches.
|
||||
*
|
||||
* @return {*} The return value of executing the single dispatch.
|
||||
*/
|
||||
function executeDirectDispatch(event) {
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
validateEventDispatches(event);
|
||||
}
|
||||
var dispatchListener = event._dispatchListeners;
|
||||
var dispatchID = event._dispatchIDs;
|
||||
!!Array.isArray(dispatchListener) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'executeDirectDispatch(...): Invalid `event`.') : invariant(false) : undefined;
|
||||
var res = dispatchListener ? dispatchListener(event, dispatchID) : null;
|
||||
event._dispatchListeners = null;
|
||||
event._dispatchIDs = null;
|
||||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {SyntheticEvent} event
|
||||
* @return {boolean} True iff number of dispatches accumulated is greater than 0.
|
||||
*/
|
||||
function hasDispatches(event) {
|
||||
return !!event._dispatchListeners;
|
||||
}
|
||||
|
||||
/**
|
||||
* General utilities that are useful in creating custom Event Plugins.
|
||||
*/
|
||||
var EventPluginUtils = {
|
||||
isEndish: isEndish,
|
||||
isMoveish: isMoveish,
|
||||
isStartish: isStartish,
|
||||
|
||||
executeDirectDispatch: executeDirectDispatch,
|
||||
executeDispatchesInOrder: executeDispatchesInOrder,
|
||||
executeDispatchesInOrderStopAtTrue: executeDispatchesInOrderStopAtTrue,
|
||||
hasDispatches: hasDispatches,
|
||||
|
||||
getNode: function (id) {
|
||||
return injection.Mount.getNode(id);
|
||||
},
|
||||
getID: function (node) {
|
||||
return injection.Mount.getID(node);
|
||||
},
|
||||
|
||||
injection: injection
|
||||
};
|
||||
|
||||
module.exports = EventPluginUtils;
|
||||
135
old_major_packages/14/react/lib/EventPropagators.js
Normal file
135
old_major_packages/14/react/lib/EventPropagators.js
Normal file
@@ -0,0 +1,135 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule EventPropagators
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var EventConstants = require('./EventConstants');
|
||||
var EventPluginHub = require('./EventPluginHub');
|
||||
|
||||
var warning = require('fbjs/lib/warning');
|
||||
|
||||
var accumulateInto = require('./accumulateInto');
|
||||
var forEachAccumulated = require('./forEachAccumulated');
|
||||
|
||||
var PropagationPhases = EventConstants.PropagationPhases;
|
||||
var getListener = EventPluginHub.getListener;
|
||||
|
||||
/**
|
||||
* Some event types have a notion of different registration names for different
|
||||
* "phases" of propagation. This finds listeners by a given phase.
|
||||
*/
|
||||
function listenerAtPhase(id, event, propagationPhase) {
|
||||
var registrationName = event.dispatchConfig.phasedRegistrationNames[propagationPhase];
|
||||
return getListener(id, registrationName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tags a `SyntheticEvent` with dispatched listeners. Creating this function
|
||||
* here, allows us to not have to bind or create functions for each event.
|
||||
* Mutating the event's members allows us to not have to create a wrapping
|
||||
* "dispatch" object that pairs the event with the listener.
|
||||
*/
|
||||
function accumulateDirectionalDispatches(domID, upwards, event) {
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
process.env.NODE_ENV !== 'production' ? warning(domID, 'Dispatching id must not be null') : undefined;
|
||||
}
|
||||
var phase = upwards ? PropagationPhases.bubbled : PropagationPhases.captured;
|
||||
var listener = listenerAtPhase(domID, event, phase);
|
||||
if (listener) {
|
||||
event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);
|
||||
event._dispatchIDs = accumulateInto(event._dispatchIDs, domID);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Collect dispatches (must be entirely collected before dispatching - see unit
|
||||
* tests). Lazily allocate the array to conserve memory. We must loop through
|
||||
* each event and perform the traversal for each one. We cannot perform a
|
||||
* single traversal for the entire collection of events because each event may
|
||||
* have a different target.
|
||||
*/
|
||||
function accumulateTwoPhaseDispatchesSingle(event) {
|
||||
if (event && event.dispatchConfig.phasedRegistrationNames) {
|
||||
EventPluginHub.injection.getInstanceHandle().traverseTwoPhase(event.dispatchMarker, accumulateDirectionalDispatches, event);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Same as `accumulateTwoPhaseDispatchesSingle`, but skips over the targetID.
|
||||
*/
|
||||
function accumulateTwoPhaseDispatchesSingleSkipTarget(event) {
|
||||
if (event && event.dispatchConfig.phasedRegistrationNames) {
|
||||
EventPluginHub.injection.getInstanceHandle().traverseTwoPhaseSkipTarget(event.dispatchMarker, accumulateDirectionalDispatches, event);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Accumulates without regard to direction, does not look for phased
|
||||
* registration names. Same as `accumulateDirectDispatchesSingle` but without
|
||||
* requiring that the `dispatchMarker` be the same as the dispatched ID.
|
||||
*/
|
||||
function accumulateDispatches(id, ignoredDirection, event) {
|
||||
if (event && event.dispatchConfig.registrationName) {
|
||||
var registrationName = event.dispatchConfig.registrationName;
|
||||
var listener = getListener(id, registrationName);
|
||||
if (listener) {
|
||||
event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);
|
||||
event._dispatchIDs = accumulateInto(event._dispatchIDs, id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Accumulates dispatches on an `SyntheticEvent`, but only for the
|
||||
* `dispatchMarker`.
|
||||
* @param {SyntheticEvent} event
|
||||
*/
|
||||
function accumulateDirectDispatchesSingle(event) {
|
||||
if (event && event.dispatchConfig.registrationName) {
|
||||
accumulateDispatches(event.dispatchMarker, null, event);
|
||||
}
|
||||
}
|
||||
|
||||
function accumulateTwoPhaseDispatches(events) {
|
||||
forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle);
|
||||
}
|
||||
|
||||
function accumulateTwoPhaseDispatchesSkipTarget(events) {
|
||||
forEachAccumulated(events, accumulateTwoPhaseDispatchesSingleSkipTarget);
|
||||
}
|
||||
|
||||
function accumulateEnterLeaveDispatches(leave, enter, fromID, toID) {
|
||||
EventPluginHub.injection.getInstanceHandle().traverseEnterLeave(fromID, toID, accumulateDispatches, leave, enter);
|
||||
}
|
||||
|
||||
function accumulateDirectDispatches(events) {
|
||||
forEachAccumulated(events, accumulateDirectDispatchesSingle);
|
||||
}
|
||||
|
||||
/**
|
||||
* A small set of propagation patterns, each of which will accept a small amount
|
||||
* of information, and generate a set of "dispatch ready event objects" - which
|
||||
* are sets of events that have already been annotated with a set of dispatched
|
||||
* listener functions/ids. The API is designed this way to discourage these
|
||||
* propagation strategies from actually executing the dispatches, since we
|
||||
* always want to collect the entire set of dispatches before executing event a
|
||||
* single one.
|
||||
*
|
||||
* @constructor EventPropagators
|
||||
*/
|
||||
var EventPropagators = {
|
||||
accumulateTwoPhaseDispatches: accumulateTwoPhaseDispatches,
|
||||
accumulateTwoPhaseDispatchesSkipTarget: accumulateTwoPhaseDispatchesSkipTarget,
|
||||
accumulateDirectDispatches: accumulateDirectDispatches,
|
||||
accumulateEnterLeaveDispatches: accumulateEnterLeaveDispatches
|
||||
};
|
||||
|
||||
module.exports = EventPropagators;
|
||||
95
old_major_packages/14/react/lib/FallbackCompositionState.js
Normal file
95
old_major_packages/14/react/lib/FallbackCompositionState.js
Normal file
@@ -0,0 +1,95 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule FallbackCompositionState
|
||||
* @typechecks static-only
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var PooledClass = require('./PooledClass');
|
||||
|
||||
var assign = require('./Object.assign');
|
||||
var getTextContentAccessor = require('./getTextContentAccessor');
|
||||
|
||||
/**
|
||||
* This helper class stores information about text content of a target node,
|
||||
* allowing comparison of content before and after a given event.
|
||||
*
|
||||
* Identify the node where selection currently begins, then observe
|
||||
* both its text content and its current position in the DOM. Since the
|
||||
* browser may natively replace the target node during composition, we can
|
||||
* use its position to find its replacement.
|
||||
*
|
||||
* @param {DOMEventTarget} root
|
||||
*/
|
||||
function FallbackCompositionState(root) {
|
||||
this._root = root;
|
||||
this._startText = this.getText();
|
||||
this._fallbackText = null;
|
||||
}
|
||||
|
||||
assign(FallbackCompositionState.prototype, {
|
||||
destructor: function () {
|
||||
this._root = null;
|
||||
this._startText = null;
|
||||
this._fallbackText = null;
|
||||
},
|
||||
|
||||
/**
|
||||
* Get current text of input.
|
||||
*
|
||||
* @return {string}
|
||||
*/
|
||||
getText: function () {
|
||||
if ('value' in this._root) {
|
||||
return this._root.value;
|
||||
}
|
||||
return this._root[getTextContentAccessor()];
|
||||
},
|
||||
|
||||
/**
|
||||
* Determine the differing substring between the initially stored
|
||||
* text content and the current content.
|
||||
*
|
||||
* @return {string}
|
||||
*/
|
||||
getData: function () {
|
||||
if (this._fallbackText) {
|
||||
return this._fallbackText;
|
||||
}
|
||||
|
||||
var start;
|
||||
var startValue = this._startText;
|
||||
var startLength = startValue.length;
|
||||
var end;
|
||||
var endValue = this.getText();
|
||||
var endLength = endValue.length;
|
||||
|
||||
for (start = 0; start < startLength; start++) {
|
||||
if (startValue[start] !== endValue[start]) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
var minEnd = startLength - start;
|
||||
for (end = 1; end <= minEnd; end++) {
|
||||
if (startValue[startLength - end] !== endValue[endLength - end]) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
var sliceTail = end > 1 ? 1 - end : undefined;
|
||||
this._fallbackText = endValue.slice(start, sliceTail);
|
||||
return this._fallbackText;
|
||||
}
|
||||
});
|
||||
|
||||
PooledClass.addPoolingTo(FallbackCompositionState);
|
||||
|
||||
module.exports = FallbackCompositionState;
|
||||
230
old_major_packages/14/react/lib/HTMLDOMPropertyConfig.js
Normal file
230
old_major_packages/14/react/lib/HTMLDOMPropertyConfig.js
Normal file
@@ -0,0 +1,230 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule HTMLDOMPropertyConfig
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var DOMProperty = require('./DOMProperty');
|
||||
var ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');
|
||||
|
||||
var MUST_USE_ATTRIBUTE = DOMProperty.injection.MUST_USE_ATTRIBUTE;
|
||||
var MUST_USE_PROPERTY = DOMProperty.injection.MUST_USE_PROPERTY;
|
||||
var HAS_BOOLEAN_VALUE = DOMProperty.injection.HAS_BOOLEAN_VALUE;
|
||||
var HAS_SIDE_EFFECTS = DOMProperty.injection.HAS_SIDE_EFFECTS;
|
||||
var HAS_NUMERIC_VALUE = DOMProperty.injection.HAS_NUMERIC_VALUE;
|
||||
var HAS_POSITIVE_NUMERIC_VALUE = DOMProperty.injection.HAS_POSITIVE_NUMERIC_VALUE;
|
||||
var HAS_OVERLOADED_BOOLEAN_VALUE = DOMProperty.injection.HAS_OVERLOADED_BOOLEAN_VALUE;
|
||||
|
||||
var hasSVG;
|
||||
if (ExecutionEnvironment.canUseDOM) {
|
||||
var implementation = document.implementation;
|
||||
hasSVG = implementation && implementation.hasFeature && implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#BasicStructure', '1.1');
|
||||
}
|
||||
|
||||
var HTMLDOMPropertyConfig = {
|
||||
isCustomAttribute: RegExp.prototype.test.bind(/^(data|aria)-[a-z_][a-z\d_.\-]*$/),
|
||||
Properties: {
|
||||
/**
|
||||
* Standard Properties
|
||||
*/
|
||||
accept: null,
|
||||
acceptCharset: null,
|
||||
accessKey: null,
|
||||
action: null,
|
||||
allowFullScreen: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,
|
||||
allowTransparency: MUST_USE_ATTRIBUTE,
|
||||
alt: null,
|
||||
async: HAS_BOOLEAN_VALUE,
|
||||
autoComplete: null,
|
||||
// autoFocus is polyfilled/normalized by AutoFocusUtils
|
||||
// autoFocus: HAS_BOOLEAN_VALUE,
|
||||
autoPlay: HAS_BOOLEAN_VALUE,
|
||||
capture: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,
|
||||
cellPadding: null,
|
||||
cellSpacing: null,
|
||||
charSet: MUST_USE_ATTRIBUTE,
|
||||
challenge: MUST_USE_ATTRIBUTE,
|
||||
checked: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
|
||||
classID: MUST_USE_ATTRIBUTE,
|
||||
// To set className on SVG elements, it's necessary to use .setAttribute;
|
||||
// this works on HTML elements too in all browsers except IE8. Conveniently,
|
||||
// IE8 doesn't support SVG and so we can simply use the attribute in
|
||||
// browsers that support SVG and the property in browsers that don't,
|
||||
// regardless of whether the element is HTML or SVG.
|
||||
className: hasSVG ? MUST_USE_ATTRIBUTE : MUST_USE_PROPERTY,
|
||||
cols: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE,
|
||||
colSpan: null,
|
||||
content: null,
|
||||
contentEditable: null,
|
||||
contextMenu: MUST_USE_ATTRIBUTE,
|
||||
controls: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
|
||||
coords: null,
|
||||
crossOrigin: null,
|
||||
data: null, // For `<object />` acts as `src`.
|
||||
dateTime: MUST_USE_ATTRIBUTE,
|
||||
'default': HAS_BOOLEAN_VALUE,
|
||||
defer: HAS_BOOLEAN_VALUE,
|
||||
dir: null,
|
||||
disabled: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,
|
||||
download: HAS_OVERLOADED_BOOLEAN_VALUE,
|
||||
draggable: null,
|
||||
encType: null,
|
||||
form: MUST_USE_ATTRIBUTE,
|
||||
formAction: MUST_USE_ATTRIBUTE,
|
||||
formEncType: MUST_USE_ATTRIBUTE,
|
||||
formMethod: MUST_USE_ATTRIBUTE,
|
||||
formNoValidate: HAS_BOOLEAN_VALUE,
|
||||
formTarget: MUST_USE_ATTRIBUTE,
|
||||
frameBorder: MUST_USE_ATTRIBUTE,
|
||||
headers: null,
|
||||
height: MUST_USE_ATTRIBUTE,
|
||||
hidden: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,
|
||||
high: null,
|
||||
href: null,
|
||||
hrefLang: null,
|
||||
htmlFor: null,
|
||||
httpEquiv: null,
|
||||
icon: null,
|
||||
id: MUST_USE_PROPERTY,
|
||||
inputMode: MUST_USE_ATTRIBUTE,
|
||||
integrity: null,
|
||||
is: MUST_USE_ATTRIBUTE,
|
||||
keyParams: MUST_USE_ATTRIBUTE,
|
||||
keyType: MUST_USE_ATTRIBUTE,
|
||||
kind: null,
|
||||
label: null,
|
||||
lang: null,
|
||||
list: MUST_USE_ATTRIBUTE,
|
||||
loop: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
|
||||
low: null,
|
||||
manifest: MUST_USE_ATTRIBUTE,
|
||||
marginHeight: null,
|
||||
marginWidth: null,
|
||||
max: null,
|
||||
maxLength: MUST_USE_ATTRIBUTE,
|
||||
media: MUST_USE_ATTRIBUTE,
|
||||
mediaGroup: null,
|
||||
method: null,
|
||||
min: null,
|
||||
minLength: MUST_USE_ATTRIBUTE,
|
||||
multiple: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
|
||||
muted: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
|
||||
name: null,
|
||||
nonce: MUST_USE_ATTRIBUTE,
|
||||
noValidate: HAS_BOOLEAN_VALUE,
|
||||
open: HAS_BOOLEAN_VALUE,
|
||||
optimum: null,
|
||||
pattern: null,
|
||||
placeholder: null,
|
||||
poster: null,
|
||||
preload: null,
|
||||
radioGroup: null,
|
||||
readOnly: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
|
||||
rel: null,
|
||||
required: HAS_BOOLEAN_VALUE,
|
||||
reversed: HAS_BOOLEAN_VALUE,
|
||||
role: MUST_USE_ATTRIBUTE,
|
||||
rows: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE,
|
||||
rowSpan: null,
|
||||
sandbox: null,
|
||||
scope: null,
|
||||
scoped: HAS_BOOLEAN_VALUE,
|
||||
scrolling: null,
|
||||
seamless: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,
|
||||
selected: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
|
||||
shape: null,
|
||||
size: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE,
|
||||
sizes: MUST_USE_ATTRIBUTE,
|
||||
span: HAS_POSITIVE_NUMERIC_VALUE,
|
||||
spellCheck: null,
|
||||
src: null,
|
||||
srcDoc: MUST_USE_PROPERTY,
|
||||
srcLang: null,
|
||||
srcSet: MUST_USE_ATTRIBUTE,
|
||||
start: HAS_NUMERIC_VALUE,
|
||||
step: null,
|
||||
style: null,
|
||||
summary: null,
|
||||
tabIndex: null,
|
||||
target: null,
|
||||
title: null,
|
||||
type: null,
|
||||
useMap: null,
|
||||
value: MUST_USE_PROPERTY | HAS_SIDE_EFFECTS,
|
||||
width: MUST_USE_ATTRIBUTE,
|
||||
wmode: MUST_USE_ATTRIBUTE,
|
||||
wrap: null,
|
||||
|
||||
/**
|
||||
* RDFa Properties
|
||||
*/
|
||||
about: MUST_USE_ATTRIBUTE,
|
||||
datatype: MUST_USE_ATTRIBUTE,
|
||||
inlist: MUST_USE_ATTRIBUTE,
|
||||
prefix: MUST_USE_ATTRIBUTE,
|
||||
// property is also supported for OpenGraph in meta tags.
|
||||
property: MUST_USE_ATTRIBUTE,
|
||||
resource: MUST_USE_ATTRIBUTE,
|
||||
'typeof': MUST_USE_ATTRIBUTE,
|
||||
vocab: MUST_USE_ATTRIBUTE,
|
||||
|
||||
/**
|
||||
* Non-standard Properties
|
||||
*/
|
||||
// autoCapitalize and autoCorrect are supported in Mobile Safari for
|
||||
// keyboard hints.
|
||||
autoCapitalize: MUST_USE_ATTRIBUTE,
|
||||
autoCorrect: MUST_USE_ATTRIBUTE,
|
||||
// autoSave allows WebKit/Blink to persist values of input fields on page reloads
|
||||
autoSave: null,
|
||||
// color is for Safari mask-icon link
|
||||
color: null,
|
||||
// itemProp, itemScope, itemType are for
|
||||
// Microdata support. See http://schema.org/docs/gs.html
|
||||
itemProp: MUST_USE_ATTRIBUTE,
|
||||
itemScope: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,
|
||||
itemType: MUST_USE_ATTRIBUTE,
|
||||
// itemID and itemRef are for Microdata support as well but
|
||||
// only specified in the the WHATWG spec document. See
|
||||
// https://html.spec.whatwg.org/multipage/microdata.html#microdata-dom-api
|
||||
itemID: MUST_USE_ATTRIBUTE,
|
||||
itemRef: MUST_USE_ATTRIBUTE,
|
||||
// results show looking glass icon and recent searches on input
|
||||
// search fields in WebKit/Blink
|
||||
results: null,
|
||||
// IE-only attribute that specifies security restrictions on an iframe
|
||||
// as an alternative to the sandbox attribute on IE<10
|
||||
security: MUST_USE_ATTRIBUTE,
|
||||
// IE-only attribute that controls focus behavior
|
||||
unselectable: MUST_USE_ATTRIBUTE
|
||||
},
|
||||
DOMAttributeNames: {
|
||||
acceptCharset: 'accept-charset',
|
||||
className: 'class',
|
||||
htmlFor: 'for',
|
||||
httpEquiv: 'http-equiv'
|
||||
},
|
||||
DOMPropertyNames: {
|
||||
autoComplete: 'autocomplete',
|
||||
autoFocus: 'autofocus',
|
||||
autoPlay: 'autoplay',
|
||||
autoSave: 'autosave',
|
||||
// `encoding` is equivalent to `enctype`, IE8 lacks an `enctype` setter.
|
||||
// http://www.w3.org/TR/html5/forms.html#dom-fs-encoding
|
||||
encType: 'encoding',
|
||||
hrefLang: 'hreflang',
|
||||
radioGroup: 'radiogroup',
|
||||
spellCheck: 'spellcheck',
|
||||
srcDoc: 'srcdoc',
|
||||
srcSet: 'srcset'
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = HTMLDOMPropertyConfig;
|
||||
36
old_major_packages/14/react/lib/LinkedStateMixin.js
Normal file
36
old_major_packages/14/react/lib/LinkedStateMixin.js
Normal file
@@ -0,0 +1,36 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule LinkedStateMixin
|
||||
* @typechecks static-only
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ReactLink = require('./ReactLink');
|
||||
var ReactStateSetters = require('./ReactStateSetters');
|
||||
|
||||
/**
|
||||
* A simple mixin around ReactLink.forState().
|
||||
*/
|
||||
var LinkedStateMixin = {
|
||||
/**
|
||||
* Create a ReactLink that's linked to part of this component's state. The
|
||||
* ReactLink will have the current value of this.state[key] and will call
|
||||
* setState() when a change is requested.
|
||||
*
|
||||
* @param {string} key state key to update. Note: you may want to use keyOf()
|
||||
* if you're using Google Closure Compiler advanced mode.
|
||||
* @return {ReactLink} ReactLink instance linking to the state.
|
||||
*/
|
||||
linkState: function (key) {
|
||||
return new ReactLink(this.state[key], ReactStateSetters.createStateKeySetter(this, key));
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = LinkedStateMixin;
|
||||
134
old_major_packages/14/react/lib/LinkedValueUtils.js
Normal file
134
old_major_packages/14/react/lib/LinkedValueUtils.js
Normal file
@@ -0,0 +1,134 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule LinkedValueUtils
|
||||
* @typechecks static-only
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ReactPropTypes = require('./ReactPropTypes');
|
||||
var ReactPropTypeLocations = require('./ReactPropTypeLocations');
|
||||
|
||||
var invariant = require('fbjs/lib/invariant');
|
||||
var warning = require('fbjs/lib/warning');
|
||||
|
||||
var hasReadOnlyValue = {
|
||||
'button': true,
|
||||
'checkbox': true,
|
||||
'image': true,
|
||||
'hidden': true,
|
||||
'radio': true,
|
||||
'reset': true,
|
||||
'submit': true
|
||||
};
|
||||
|
||||
function _assertSingleLink(inputProps) {
|
||||
!(inputProps.checkedLink == null || inputProps.valueLink == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Cannot provide a checkedLink and a valueLink. If you want to use ' + 'checkedLink, you probably don\'t want to use valueLink and vice versa.') : invariant(false) : undefined;
|
||||
}
|
||||
function _assertValueLink(inputProps) {
|
||||
_assertSingleLink(inputProps);
|
||||
!(inputProps.value == null && inputProps.onChange == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Cannot provide a valueLink and a value or onChange event. If you want ' + 'to use value or onChange, you probably don\'t want to use valueLink.') : invariant(false) : undefined;
|
||||
}
|
||||
|
||||
function _assertCheckedLink(inputProps) {
|
||||
_assertSingleLink(inputProps);
|
||||
!(inputProps.checked == null && inputProps.onChange == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Cannot provide a checkedLink and a checked property or onChange event. ' + 'If you want to use checked or onChange, you probably don\'t want to ' + 'use checkedLink') : invariant(false) : undefined;
|
||||
}
|
||||
|
||||
var propTypes = {
|
||||
value: function (props, propName, componentName) {
|
||||
if (!props[propName] || hasReadOnlyValue[props.type] || props.onChange || props.readOnly || props.disabled) {
|
||||
return null;
|
||||
}
|
||||
return new Error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.');
|
||||
},
|
||||
checked: function (props, propName, componentName) {
|
||||
if (!props[propName] || props.onChange || props.readOnly || props.disabled) {
|
||||
return null;
|
||||
}
|
||||
return new Error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.');
|
||||
},
|
||||
onChange: ReactPropTypes.func
|
||||
};
|
||||
|
||||
var loggedTypeFailures = {};
|
||||
function getDeclarationErrorAddendum(owner) {
|
||||
if (owner) {
|
||||
var name = owner.getName();
|
||||
if (name) {
|
||||
return ' Check the render method of `' + name + '`.';
|
||||
}
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Provide a linked `value` attribute for controlled forms. You should not use
|
||||
* this outside of the ReactDOM controlled form components.
|
||||
*/
|
||||
var LinkedValueUtils = {
|
||||
checkPropTypes: function (tagName, props, owner) {
|
||||
for (var propName in propTypes) {
|
||||
if (propTypes.hasOwnProperty(propName)) {
|
||||
var error = propTypes[propName](props, propName, tagName, ReactPropTypeLocations.prop, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');
|
||||
}
|
||||
if (error instanceof Error && !(error.message in loggedTypeFailures)) {
|
||||
// Only monitor this failure once because there tends to be a lot of the
|
||||
// same error.
|
||||
loggedTypeFailures[error.message] = true;
|
||||
|
||||
var addendum = getDeclarationErrorAddendum(owner);
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'Failed form propType: %s%s', error.message, addendum) : undefined;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {object} inputProps Props for form component
|
||||
* @return {*} current value of the input either from value prop or link.
|
||||
*/
|
||||
getValue: function (inputProps) {
|
||||
if (inputProps.valueLink) {
|
||||
_assertValueLink(inputProps);
|
||||
return inputProps.valueLink.value;
|
||||
}
|
||||
return inputProps.value;
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {object} inputProps Props for form component
|
||||
* @return {*} current checked status of the input either from checked prop
|
||||
* or link.
|
||||
*/
|
||||
getChecked: function (inputProps) {
|
||||
if (inputProps.checkedLink) {
|
||||
_assertCheckedLink(inputProps);
|
||||
return inputProps.checkedLink.value;
|
||||
}
|
||||
return inputProps.checked;
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {object} inputProps Props for form component
|
||||
* @param {SyntheticEvent} event change event to handle
|
||||
*/
|
||||
executeOnChange: function (inputProps, event) {
|
||||
if (inputProps.valueLink) {
|
||||
_assertValueLink(inputProps);
|
||||
return inputProps.valueLink.requestChange(event.target.value);
|
||||
} else if (inputProps.checkedLink) {
|
||||
_assertCheckedLink(inputProps);
|
||||
return inputProps.checkedLink.requestChange(event.target.checked);
|
||||
} else if (inputProps.onChange) {
|
||||
return inputProps.onChange.call(undefined, event);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = LinkedValueUtils;
|
||||
118
old_major_packages/14/react/lib/MetaMatchers.js
Normal file
118
old_major_packages/14/react/lib/MetaMatchers.js
Normal file
@@ -0,0 +1,118 @@
|
||||
/**
|
||||
* Copyright 2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule MetaMatchers
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* This modules adds a jasmine matcher toEqualSpecsIn that can be used to
|
||||
* compare the specs in two different "describe" functions and their result.
|
||||
* It can be used to test a test.
|
||||
*/
|
||||
|
||||
function getRunnerWithResults(describeFunction) {
|
||||
if (describeFunction._cachedRunner) {
|
||||
// Cached result of execution. This is a convenience way to test against
|
||||
// the same authorative function multiple times.
|
||||
return describeFunction._cachedRunner;
|
||||
}
|
||||
// Patch the current global environment.
|
||||
var env = new jasmine.Env();
|
||||
// Execute the tests synchronously.
|
||||
env.updateInterval = 0;
|
||||
var outerGetEnv = jasmine.getEnv;
|
||||
jasmine.getEnv = function () {
|
||||
return env;
|
||||
};
|
||||
// TODO: Bring over matchers from the existing environment.
|
||||
var runner = env.currentRunner();
|
||||
try {
|
||||
env.describe('', describeFunction);
|
||||
env.execute();
|
||||
} finally {
|
||||
// Restore the environment.
|
||||
jasmine.getEnv = outerGetEnv;
|
||||
}
|
||||
describeFunction._cachedRunner = runner;
|
||||
return runner;
|
||||
}
|
||||
|
||||
function compareSpec(actual, expected) {
|
||||
if (actual.results().totalCount !== expected.results().totalCount) {
|
||||
return 'Expected ' + expected.results().totalCount + ' expects, ' + 'but got ' + actual.results().totalCount + ':' + actual.getFullName();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function includesDescription(specs, description, startIndex) {
|
||||
for (var i = startIndex; i < specs.length; i++) {
|
||||
if (specs[i].description === description) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function compareSpecs(actualSpecs, expectedSpecs) {
|
||||
for (var i = 0; i < actualSpecs.length && i < expectedSpecs.length; i++) {
|
||||
var actual = actualSpecs[i];
|
||||
var expected = expectedSpecs[i];
|
||||
if (actual.description === expected.description) {
|
||||
var errorMessage = compareSpec(actual, expected);
|
||||
if (errorMessage) {
|
||||
return errorMessage;
|
||||
}
|
||||
continue;
|
||||
} else if (includesDescription(actualSpecs, expected.description, i)) {
|
||||
return 'Did not expect the spec:' + actualSpecs[i].getFullName();
|
||||
} else {
|
||||
return 'Expected an equivalent to:' + expectedSpecs[i].getFullName();
|
||||
}
|
||||
}
|
||||
if (i < actualSpecs.length) {
|
||||
return 'Did not expect the spec:' + actualSpecs[i].getFullName();
|
||||
}
|
||||
if (i < expectedSpecs.length) {
|
||||
return 'Expected an equivalent to:' + expectedSpecs[i].getFullName();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function compareDescription(a, b) {
|
||||
if (a.description === b.description) {
|
||||
return 0;
|
||||
}
|
||||
return a.description < b.description ? -1 : 1;
|
||||
}
|
||||
|
||||
function compareRunners(actual, expected) {
|
||||
return compareSpecs(actual.specs().sort(compareDescription), expected.specs().sort(compareDescription));
|
||||
}
|
||||
|
||||
var MetaMatchers = {
|
||||
toEqualSpecsIn: function (expectedDescribeFunction) {
|
||||
var actualDescribeFunction = this.actual;
|
||||
if (typeof actualDescribeFunction !== 'function') {
|
||||
throw Error('toEqualSpecsIn() should be used on a describe function');
|
||||
}
|
||||
if (typeof expectedDescribeFunction !== 'function') {
|
||||
throw Error('toEqualSpecsIn() should be passed a describe function');
|
||||
}
|
||||
var actual = getRunnerWithResults(actualDescribeFunction);
|
||||
var expected = getRunnerWithResults(expectedDescribeFunction);
|
||||
var errorMessage = compareRunners(actual, expected);
|
||||
this.message = function () {
|
||||
return [errorMessage, 'The specs are equal. Expected them to be different.'];
|
||||
};
|
||||
return !errorMessage;
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = MetaMatchers;
|
||||
47
old_major_packages/14/react/lib/Object.assign.js
Normal file
47
old_major_packages/14/react/lib/Object.assign.js
Normal file
@@ -0,0 +1,47 @@
|
||||
/**
|
||||
* Copyright 2014-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule Object.assign
|
||||
*/
|
||||
|
||||
// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign
|
||||
|
||||
'use strict';
|
||||
|
||||
function assign(target, sources) {
|
||||
if (target == null) {
|
||||
throw new TypeError('Object.assign target cannot be null or undefined');
|
||||
}
|
||||
|
||||
var to = Object(target);
|
||||
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
||||
|
||||
for (var nextIndex = 1; nextIndex < arguments.length; nextIndex++) {
|
||||
var nextSource = arguments[nextIndex];
|
||||
if (nextSource == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
var from = Object(nextSource);
|
||||
|
||||
// We don't currently support accessors nor proxies. Therefore this
|
||||
// copy cannot throw. If we ever supported this then we must handle
|
||||
// exceptions and side-effects. We don't support symbols so they won't
|
||||
// be transferred.
|
||||
|
||||
for (var key in from) {
|
||||
if (hasOwnProperty.call(from, key)) {
|
||||
to[key] = from[key];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return to;
|
||||
}
|
||||
|
||||
module.exports = assign;
|
||||
453
old_major_packages/14/react/lib/OrderedMap.js
Normal file
453
old_major_packages/14/react/lib/OrderedMap.js
Normal file
@@ -0,0 +1,453 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule OrderedMap
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var assign = require('./Object.assign');
|
||||
var invariant = require('fbjs/lib/invariant');
|
||||
|
||||
var PREFIX = 'key:';
|
||||
|
||||
/**
|
||||
* Utility to extract a backing object from an initialization `Array`, allowing
|
||||
* the caller to assist in resolving the unique ID for each entry via the
|
||||
* `keyExtractor` callback. The `keyExtractor` must extract non-empty strings or
|
||||
* numbers.
|
||||
* @param {Array<Object!>} arr Array of items.
|
||||
* @param {function} keyExtractor Extracts a unique key from each item.
|
||||
* @return {Object} Map from unique key to originating value that the key was
|
||||
* extracted from.
|
||||
* @throws Exception if the initialization array has duplicate extracted keys.
|
||||
*/
|
||||
function extractObjectFromArray(arr, keyExtractor) {
|
||||
var normalizedObj = {};
|
||||
for (var i = 0; i < arr.length; i++) {
|
||||
var item = arr[i];
|
||||
var key = keyExtractor(item);
|
||||
assertValidPublicKey(key);
|
||||
var normalizedKey = PREFIX + key;
|
||||
!!(normalizedKey in normalizedObj) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'OrderedMap: IDs returned by the key extraction function must be unique.') : invariant(false) : undefined;
|
||||
normalizedObj[normalizedKey] = item;
|
||||
}
|
||||
return normalizedObj;
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility class for mappings with ordering. This class is to be used in an
|
||||
* immutable manner. A `OrderedMap` is very much like the native JavaScript
|
||||
* object, where keys map to values via the `get()` function. Also, like the
|
||||
* native JavaScript object, there is an ordering associated with the mapping.
|
||||
* This class is helpful because it eliminates many of the pitfalls that come
|
||||
* with the native JavaScript ordered mappings. Specifically, there are
|
||||
* inconsistencies with numeric keys in some JavaScript implementations
|
||||
* (enumeration ordering). This class protects against those pitfalls and
|
||||
* provides functional utilities for dealing with these `OrderedMap`s.
|
||||
*
|
||||
* - TODO:
|
||||
* - orderedMergeExclusive: Merges mutually exclusive `OrderedMap`s.
|
||||
* - mapReverse().
|
||||
*
|
||||
* @class {OrderedMap}
|
||||
* @constructor {OrderedMap}
|
||||
* @param {Object} normalizedObj Object that is known to be a defensive copy of
|
||||
* caller supplied data. We require a defensive copy to guard against callers
|
||||
* mutating. It is also assumed that the keys of `normalizedObj` have been
|
||||
* normalized and do not contain any numeric-appearing strings.
|
||||
* @param {number} computedLength The precomputed length of `_normalizedObj`
|
||||
* keys.
|
||||
* @private
|
||||
*/
|
||||
function OrderedMapImpl(normalizedObj, computedLength) {
|
||||
this._normalizedObj = normalizedObj;
|
||||
this._computedPositions = null;
|
||||
this.length = computedLength;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates a "public" key - that is, one that the public facing API supplies.
|
||||
* The key is then normalized for internal storage. In order to be considered
|
||||
* valid, all keys must be non-empty, defined, non-null strings or numbers.
|
||||
*
|
||||
* @param {string?} key Validates that the key is suitable for use in a
|
||||
* `OrderedMap`.
|
||||
* @throws Error if key is not appropriate for use in `OrderedMap`.
|
||||
*/
|
||||
function assertValidPublicKey(key) {
|
||||
!(key !== '' && (typeof key === 'string' || typeof key === 'number')) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'OrderedMap: Key must be non-empty, non-null string or number.') : invariant(false) : undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates that arguments to range operations are within the correct limits.
|
||||
*
|
||||
* @param {number} start Start of range.
|
||||
* @param {number} length Length of range.
|
||||
* @param {number} actualLen Actual length of range that should not be
|
||||
* exceeded.
|
||||
* @throws Error if range arguments are out of bounds.
|
||||
*/
|
||||
function assertValidRangeIndices(start, length, actualLen) {
|
||||
!(typeof start === 'number' && typeof length === 'number' && length >= 0 && start >= 0 && start + length <= actualLen) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'OrderedMap: `mapRange` and `forEachRange` expect non-negative start and ' + 'length arguments within the bounds of the instance.') : invariant(false) : undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Merges two "normalized" objects (objects who's key have been normalized) into
|
||||
* a `OrderedMap`.
|
||||
*
|
||||
* @param {Object} a Object of key value pairs.
|
||||
* @param {Object} b Object of key value pairs.
|
||||
* @return {OrderedMap} new `OrderedMap` that results in merging `a` and `b`.
|
||||
*/
|
||||
function _fromNormalizedObjects(a, b) {
|
||||
// Second optional, both must be plain JavaScript objects.
|
||||
!(a && a.constructor === Object && (!b || b.constructor === Object)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'OrderedMap: Corrupted instance of OrderedMap detected.') : invariant(false) : undefined;
|
||||
|
||||
var newSet = {};
|
||||
var length = 0;
|
||||
var key;
|
||||
for (key in a) {
|
||||
if (a.hasOwnProperty(key)) {
|
||||
newSet[key] = a[key];
|
||||
length++;
|
||||
}
|
||||
}
|
||||
|
||||
for (key in b) {
|
||||
if (b.hasOwnProperty(key)) {
|
||||
// Increment length if not already added via first object (a)
|
||||
if (!(key in newSet)) {
|
||||
length++;
|
||||
}
|
||||
newSet[key] = b[key];
|
||||
}
|
||||
}
|
||||
return new OrderedMapImpl(newSet, length);
|
||||
}
|
||||
|
||||
/**
|
||||
* Methods for `OrderedMap` instances.
|
||||
*
|
||||
* @lends OrderedMap.prototype
|
||||
* TODO: Make this data structure lazy, unify with LazyArray.
|
||||
* TODO: Unify this with ImmutableObject - it is to be used immutably.
|
||||
* TODO: If so, consider providing `fromObject` API.
|
||||
* TODO: Create faster implementation of merging/mapping from original Array,
|
||||
* without having to first create an object - simply for the sake of merging.
|
||||
*/
|
||||
var OrderedMapMethods = {
|
||||
|
||||
/**
|
||||
* Returns whether or not a given key is present in the map.
|
||||
*
|
||||
* @param {string} key Valid string key to lookup membership for.
|
||||
* @return {boolean} Whether or not `key` is a member of the map.
|
||||
* @throws Error if provided known invalid key.
|
||||
*/
|
||||
has: function (key) {
|
||||
assertValidPublicKey(key);
|
||||
var normalizedKey = PREFIX + key;
|
||||
return normalizedKey in this._normalizedObj;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the object for a given key, or `undefined` if not present. To
|
||||
* distinguish an undefined entry vs not being in the set, use `has()`.
|
||||
*
|
||||
* @param {string} key String key to lookup the value for.
|
||||
* @return {Object?} Object at key `key`, or undefined if not in map.
|
||||
* @throws Error if provided known invalid key.
|
||||
*/
|
||||
get: function (key) {
|
||||
assertValidPublicKey(key);
|
||||
var normalizedKey = PREFIX + key;
|
||||
return this.has(key) ? this._normalizedObj[normalizedKey] : undefined;
|
||||
},
|
||||
|
||||
/**
|
||||
* Merges, appending new keys to the end of the ordering. Keys in `orderedMap`
|
||||
* that are redundant with `this`, maintain the same ordering index that they
|
||||
* had in `this`. This is how standard JavaScript object merging would work.
|
||||
* If you wish to prepend a `OrderedMap` to the beginning of another
|
||||
* `OrderedMap` then simply reverse the order of operation. This is the analog
|
||||
* to `merge(x, y)`.
|
||||
*
|
||||
* @param {OrderedMap} orderedMap OrderedMap to merge onto the end.
|
||||
* @return {OrderedMap} New OrderedMap that represents the result of the
|
||||
* merge.
|
||||
*/
|
||||
merge: function (orderedMap) {
|
||||
!(orderedMap instanceof OrderedMapImpl) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'OrderedMap.merge(...): Expected an OrderedMap instance.') : invariant(false) : undefined;
|
||||
return _fromNormalizedObjects(this._normalizedObj, orderedMap._normalizedObj);
|
||||
},
|
||||
|
||||
/**
|
||||
* Functional map API. Returns a new `OrderedMap`.
|
||||
*
|
||||
* @param {Function} cb Callback to invoke for each item.
|
||||
* @param {Object?=} context Context to invoke callback from.
|
||||
* @return {OrderedMap} OrderedMap that results from mapping.
|
||||
*/
|
||||
map: function (cb, context) {
|
||||
return this.mapRange(cb, 0, this.length, context);
|
||||
},
|
||||
|
||||
/**
|
||||
* The callback `cb` is invoked with the arguments (item, key,
|
||||
* indexInOriginal).
|
||||
*
|
||||
* @param {Function} cb Determines result for each item.
|
||||
* @param {number} start Start index of map range.
|
||||
* @param {end} length End index of map range.
|
||||
* @param {*!?} context Context of callback invocation.
|
||||
* @return {OrderedMap} OrderedMap resulting from mapping the range.
|
||||
*/
|
||||
mapRange: function (cb, start, length, context) {
|
||||
var thisSet = this._normalizedObj;
|
||||
var newSet = {};
|
||||
var i = 0;
|
||||
assertValidRangeIndices(start, length, this.length);
|
||||
var end = start + length - 1;
|
||||
for (var key in thisSet) {
|
||||
if (thisSet.hasOwnProperty(key)) {
|
||||
if (i >= start) {
|
||||
if (i > end) {
|
||||
break;
|
||||
}
|
||||
var item = thisSet[key];
|
||||
newSet[key] = cb.call(context, item, key.substr(PREFIX.length), i);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
return new OrderedMapImpl(newSet, length);
|
||||
},
|
||||
|
||||
/**
|
||||
* Function filter API. Returns new `OrderedMap`.
|
||||
*
|
||||
* @param {Function} cb Callback to invoke for each item.
|
||||
* @param {Object?=} context Context to invoke callback from.
|
||||
* @return {OrderedMap} OrderedMap that results from filtering.
|
||||
*/
|
||||
filter: function (cb, context) {
|
||||
return this.filterRange(cb, 0, this.length, context);
|
||||
},
|
||||
|
||||
/**
|
||||
* The callback `cb` is invoked with the arguments (item, key,
|
||||
* indexInOriginal).
|
||||
*
|
||||
* @param {Function} cb Returns true if item should be in result.
|
||||
* @param {number} start Start index of filter range.
|
||||
* @param {number} length End index of map range.
|
||||
* @param {*!?} context Context of callback invocation.
|
||||
* @return {OrderedMap} OrderedMap resulting from filtering the range.
|
||||
*/
|
||||
filterRange: function (cb, start, length, context) {
|
||||
var newSet = {};
|
||||
var newSetLength = 0;
|
||||
this.forEachRange(function (item, key, originalIndex) {
|
||||
if (cb.call(context, item, key, originalIndex)) {
|
||||
var normalizedKey = PREFIX + key;
|
||||
newSet[normalizedKey] = item;
|
||||
newSetLength++;
|
||||
}
|
||||
}, start, length);
|
||||
return new OrderedMapImpl(newSet, newSetLength);
|
||||
},
|
||||
|
||||
forEach: function (cb, context) {
|
||||
this.forEachRange(cb, 0, this.length, context);
|
||||
},
|
||||
|
||||
forEachRange: function (cb, start, length, context) {
|
||||
assertValidRangeIndices(start, length, this.length);
|
||||
var thisSet = this._normalizedObj;
|
||||
var i = 0;
|
||||
var end = start + length - 1;
|
||||
for (var key in thisSet) {
|
||||
if (thisSet.hasOwnProperty(key)) {
|
||||
if (i >= start) {
|
||||
if (i > end) {
|
||||
break;
|
||||
}
|
||||
var item = thisSet[key];
|
||||
cb.call(context, item, key.substr(PREFIX.length), i);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Even though `mapRange`/`forEachKeyRange` allow zero length mappings, we'll
|
||||
* impose an additional restriction here that the length of mapping be greater
|
||||
* than zero - the only reason is that there are many ways to express length
|
||||
* zero in terms of two keys and that is confusing.
|
||||
*/
|
||||
mapKeyRange: function (cb, startKey, endKey, context) {
|
||||
var startIndex = this.indexOfKey(startKey);
|
||||
var endIndex = this.indexOfKey(endKey);
|
||||
!(startIndex !== undefined && endIndex !== undefined) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'mapKeyRange must be given keys that are present.') : invariant(false) : undefined;
|
||||
!(endIndex >= startIndex) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'OrderedMap.mapKeyRange(...): `endKey` must not come before `startIndex`.') : invariant(false) : undefined;
|
||||
return this.mapRange(cb, startIndex, endIndex - startIndex + 1, context);
|
||||
},
|
||||
|
||||
forEachKeyRange: function (cb, startKey, endKey, context) {
|
||||
var startIndex = this.indexOfKey(startKey);
|
||||
var endIndex = this.indexOfKey(endKey);
|
||||
!(startIndex !== undefined && endIndex !== undefined) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'forEachKeyRange must be given keys that are present.') : invariant(false) : undefined;
|
||||
!(endIndex >= startIndex) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'OrderedMap.forEachKeyRange(...): `endKey` must not come before ' + '`startIndex`.') : invariant(false) : undefined;
|
||||
this.forEachRange(cb, startIndex, endIndex - startIndex + 1, context);
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {number} pos Index to search for key at.
|
||||
* @return {string|undefined} Either the key at index `pos` or undefined if
|
||||
* not in map.
|
||||
*/
|
||||
keyAtIndex: function (pos) {
|
||||
var computedPositions = this._getOrComputePositions();
|
||||
var keyAtPos = computedPositions.keyByIndex[pos];
|
||||
return keyAtPos ? keyAtPos.substr(PREFIX.length) : undefined;
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {string} key String key from which to find the next key.
|
||||
* @return {string|undefined} Either the next key, or undefined if there is no
|
||||
* next key.
|
||||
* @throws Error if `key` is not in this `OrderedMap`.
|
||||
*/
|
||||
keyAfter: function (key) {
|
||||
return this.nthKeyAfter(key, 1);
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {string} key String key from which to find the preceding key.
|
||||
* @return {string|undefined} Either the preceding key, or undefined if there
|
||||
* is no preceding.key.
|
||||
* @throws Error if `key` is not in this `OrderedMap`.
|
||||
*/
|
||||
keyBefore: function (key) {
|
||||
return this.nthKeyBefore(key, 1);
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {string} key String key from which to find a following key.
|
||||
* @param {number} n Distance to scan forward after `key`.
|
||||
* @return {string|undefined} Either the nth key after `key`, or undefined if
|
||||
* there is no next key.
|
||||
* @throws Error if `key` is not in this `OrderedMap`.
|
||||
*/
|
||||
nthKeyAfter: function (key, n) {
|
||||
var curIndex = this.indexOfKey(key);
|
||||
!(curIndex !== undefined) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'OrderedMap.nthKeyAfter: The key `%s` does not exist in this instance.', key) : invariant(false) : undefined;
|
||||
return this.keyAtIndex(curIndex + n);
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {string} key String key from which to find a preceding key.
|
||||
* @param {number} n Distance to scan backwards before `key`.
|
||||
* @return {string|undefined} Either the nth key before `key`, or undefined if
|
||||
* there is no previous key.
|
||||
* @throws Error if `key` is not in this `OrderedMap`.
|
||||
*/
|
||||
nthKeyBefore: function (key, n) {
|
||||
return this.nthKeyAfter(key, -n);
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {string} key Key to find the index of.
|
||||
* @return {number|undefined} Index of the provided key, or `undefined` if the
|
||||
* key is not found.
|
||||
*/
|
||||
indexOfKey: function (key) {
|
||||
assertValidPublicKey(key);
|
||||
var normalizedKey = PREFIX + key;
|
||||
var computedPositions = this._getOrComputePositions();
|
||||
var computedPosition = computedPositions.indexByKey[normalizedKey];
|
||||
// Just writing it this way to make it clear this is intentional.
|
||||
return computedPosition === undefined ? undefined : computedPosition;
|
||||
},
|
||||
|
||||
/**
|
||||
* @return {Array} An ordered array of this object's values.
|
||||
*/
|
||||
toArray: function () {
|
||||
var result = [];
|
||||
var thisSet = this._normalizedObj;
|
||||
for (var key in thisSet) {
|
||||
if (thisSet.hasOwnProperty(key)) {
|
||||
result.push(thisSet[key]);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
},
|
||||
|
||||
/**
|
||||
* Finds the key at a given position, or indicates via `undefined` that that
|
||||
* position does not exist in the `OrderedMap`. It is appropriate to return
|
||||
* undefined, indicating that the key doesn't exist in the `OrderedMap`
|
||||
* because `undefined` is not ever a valid `OrderedMap` key.
|
||||
*
|
||||
* @private
|
||||
* @return {string?} Name of the item at position `pos`, or `undefined` if
|
||||
* there is no item at that position.
|
||||
*/
|
||||
_getOrComputePositions: function () {
|
||||
// TODO: Entertain computing this at construction time in some less
|
||||
// performance critical paths.
|
||||
var computedPositions = this._computedPositions;
|
||||
if (!computedPositions) {
|
||||
this._computePositions();
|
||||
}
|
||||
return this._computedPositions;
|
||||
},
|
||||
|
||||
/**
|
||||
* Precomputes the index/key mapping for future lookup. Since `OrderedMap`s
|
||||
* are immutable, there is only ever a need to perform this once.
|
||||
* @private
|
||||
*/
|
||||
_computePositions: function () {
|
||||
this._computedPositions = {
|
||||
keyByIndex: {},
|
||||
indexByKey: {}
|
||||
};
|
||||
var keyByIndex = this._computedPositions.keyByIndex;
|
||||
var indexByKey = this._computedPositions.indexByKey;
|
||||
var index = 0;
|
||||
var thisSet = this._normalizedObj;
|
||||
for (var key in thisSet) {
|
||||
if (thisSet.hasOwnProperty(key)) {
|
||||
keyByIndex[index] = key;
|
||||
indexByKey[key] = index;
|
||||
index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
assign(OrderedMapImpl.prototype, OrderedMapMethods);
|
||||
|
||||
var OrderedMap = {
|
||||
from: function (orderedMap) {
|
||||
!(orderedMap instanceof OrderedMapImpl) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'OrderedMap.from(...): Expected an OrderedMap instance.') : invariant(false) : undefined;
|
||||
return _fromNormalizedObjects(orderedMap._normalizedObj, null);
|
||||
},
|
||||
|
||||
fromArray: function (arr, keyExtractor) {
|
||||
!Array.isArray(arr) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'OrderedMap.fromArray(...): First argument must be an array.') : invariant(false) : undefined;
|
||||
!(typeof keyExtractor === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'OrderedMap.fromArray(...): Second argument must be a function used ' + 'to determine the unique key for each entry.') : invariant(false) : undefined;
|
||||
return new OrderedMapImpl(extractObjectFromArray(arr, keyExtractor), arr.length);
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = OrderedMap;
|
||||
119
old_major_packages/14/react/lib/PooledClass.js
Normal file
119
old_major_packages/14/react/lib/PooledClass.js
Normal file
@@ -0,0 +1,119 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule PooledClass
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var invariant = require('fbjs/lib/invariant');
|
||||
|
||||
/**
|
||||
* Static poolers. Several custom versions for each potential number of
|
||||
* arguments. A completely generic pooler is easy to implement, but would
|
||||
* require accessing the `arguments` object. In each of these, `this` refers to
|
||||
* the Class itself, not an instance. If any others are needed, simply add them
|
||||
* here, or in their own files.
|
||||
*/
|
||||
var oneArgumentPooler = function (copyFieldsFrom) {
|
||||
var Klass = this;
|
||||
if (Klass.instancePool.length) {
|
||||
var instance = Klass.instancePool.pop();
|
||||
Klass.call(instance, copyFieldsFrom);
|
||||
return instance;
|
||||
} else {
|
||||
return new Klass(copyFieldsFrom);
|
||||
}
|
||||
};
|
||||
|
||||
var twoArgumentPooler = function (a1, a2) {
|
||||
var Klass = this;
|
||||
if (Klass.instancePool.length) {
|
||||
var instance = Klass.instancePool.pop();
|
||||
Klass.call(instance, a1, a2);
|
||||
return instance;
|
||||
} else {
|
||||
return new Klass(a1, a2);
|
||||
}
|
||||
};
|
||||
|
||||
var threeArgumentPooler = function (a1, a2, a3) {
|
||||
var Klass = this;
|
||||
if (Klass.instancePool.length) {
|
||||
var instance = Klass.instancePool.pop();
|
||||
Klass.call(instance, a1, a2, a3);
|
||||
return instance;
|
||||
} else {
|
||||
return new Klass(a1, a2, a3);
|
||||
}
|
||||
};
|
||||
|
||||
var fourArgumentPooler = function (a1, a2, a3, a4) {
|
||||
var Klass = this;
|
||||
if (Klass.instancePool.length) {
|
||||
var instance = Klass.instancePool.pop();
|
||||
Klass.call(instance, a1, a2, a3, a4);
|
||||
return instance;
|
||||
} else {
|
||||
return new Klass(a1, a2, a3, a4);
|
||||
}
|
||||
};
|
||||
|
||||
var fiveArgumentPooler = function (a1, a2, a3, a4, a5) {
|
||||
var Klass = this;
|
||||
if (Klass.instancePool.length) {
|
||||
var instance = Klass.instancePool.pop();
|
||||
Klass.call(instance, a1, a2, a3, a4, a5);
|
||||
return instance;
|
||||
} else {
|
||||
return new Klass(a1, a2, a3, a4, a5);
|
||||
}
|
||||
};
|
||||
|
||||
var standardReleaser = function (instance) {
|
||||
var Klass = this;
|
||||
!(instance instanceof Klass) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Trying to release an instance into a pool of a different type.') : invariant(false) : undefined;
|
||||
instance.destructor();
|
||||
if (Klass.instancePool.length < Klass.poolSize) {
|
||||
Klass.instancePool.push(instance);
|
||||
}
|
||||
};
|
||||
|
||||
var DEFAULT_POOL_SIZE = 10;
|
||||
var DEFAULT_POOLER = oneArgumentPooler;
|
||||
|
||||
/**
|
||||
* Augments `CopyConstructor` to be a poolable class, augmenting only the class
|
||||
* itself (statically) not adding any prototypical fields. Any CopyConstructor
|
||||
* you give this may have a `poolSize` property, and will look for a
|
||||
* prototypical `destructor` on instances (optional).
|
||||
*
|
||||
* @param {Function} CopyConstructor Constructor that can be used to reset.
|
||||
* @param {Function} pooler Customizable pooler.
|
||||
*/
|
||||
var addPoolingTo = function (CopyConstructor, pooler) {
|
||||
var NewKlass = CopyConstructor;
|
||||
NewKlass.instancePool = [];
|
||||
NewKlass.getPooled = pooler || DEFAULT_POOLER;
|
||||
if (!NewKlass.poolSize) {
|
||||
NewKlass.poolSize = DEFAULT_POOL_SIZE;
|
||||
}
|
||||
NewKlass.release = standardReleaser;
|
||||
return NewKlass;
|
||||
};
|
||||
|
||||
var PooledClass = {
|
||||
addPoolingTo: addPoolingTo,
|
||||
oneArgumentPooler: oneArgumentPooler,
|
||||
twoArgumentPooler: twoArgumentPooler,
|
||||
threeArgumentPooler: threeArgumentPooler,
|
||||
fourArgumentPooler: fourArgumentPooler,
|
||||
fiveArgumentPooler: fiveArgumentPooler
|
||||
};
|
||||
|
||||
module.exports = PooledClass;
|
||||
40
old_major_packages/14/react/lib/React.js
Normal file
40
old_major_packages/14/react/lib/React.js
Normal file
@@ -0,0 +1,40 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule React
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ReactDOM = require('./ReactDOM');
|
||||
var ReactDOMServer = require('./ReactDOMServer');
|
||||
var ReactIsomorphic = require('./ReactIsomorphic');
|
||||
|
||||
var assign = require('./Object.assign');
|
||||
var deprecated = require('./deprecated');
|
||||
|
||||
// `version` will be added here by ReactIsomorphic.
|
||||
var React = {};
|
||||
|
||||
assign(React, ReactIsomorphic);
|
||||
|
||||
assign(React, {
|
||||
// ReactDOM
|
||||
findDOMNode: deprecated('findDOMNode', 'ReactDOM', 'react-dom', ReactDOM, ReactDOM.findDOMNode),
|
||||
render: deprecated('render', 'ReactDOM', 'react-dom', ReactDOM, ReactDOM.render),
|
||||
unmountComponentAtNode: deprecated('unmountComponentAtNode', 'ReactDOM', 'react-dom', ReactDOM, ReactDOM.unmountComponentAtNode),
|
||||
|
||||
// ReactDOMServer
|
||||
renderToString: deprecated('renderToString', 'ReactDOMServer', 'react-dom/server', ReactDOMServer, ReactDOMServer.renderToString),
|
||||
renderToStaticMarkup: deprecated('renderToStaticMarkup', 'ReactDOMServer', 'react-dom/server', ReactDOMServer, ReactDOMServer.renderToStaticMarkup)
|
||||
});
|
||||
|
||||
React.__SECRET_DOM_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactDOM;
|
||||
React.__SECRET_DOM_SERVER_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactDOMServer;
|
||||
|
||||
module.exports = React;
|
||||
5
old_major_packages/14/react/lib/React.native.js
Normal file
5
old_major_packages/14/react/lib/React.native.js
Normal file
@@ -0,0 +1,5 @@
|
||||
'use strict';
|
||||
|
||||
// TODO: Once we remove the DOM bits from React, this shim can go away.
|
||||
|
||||
module.exports = require('./ReactIsomorphic');
|
||||
@@ -0,0 +1,36 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactBrowserComponentMixin
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ReactInstanceMap = require('./ReactInstanceMap');
|
||||
|
||||
var findDOMNode = require('./findDOMNode');
|
||||
var warning = require('fbjs/lib/warning');
|
||||
|
||||
var didWarnKey = '_getDOMNodeDidWarn';
|
||||
|
||||
var ReactBrowserComponentMixin = {
|
||||
/**
|
||||
* Returns the DOM node rendered by this component.
|
||||
*
|
||||
* @return {DOMElement} The root node of this component.
|
||||
* @final
|
||||
* @protected
|
||||
*/
|
||||
getDOMNode: function () {
|
||||
process.env.NODE_ENV !== 'production' ? warning(this.constructor[didWarnKey], '%s.getDOMNode(...) is deprecated. Please use ' + 'ReactDOM.findDOMNode(instance) instead.', ReactInstanceMap.get(this).getName() || this.tagName || 'Unknown') : undefined;
|
||||
this.constructor[didWarnKey] = true;
|
||||
return findDOMNode(this);
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = ReactBrowserComponentMixin;
|
||||
324
old_major_packages/14/react/lib/ReactBrowserEventEmitter.js
Normal file
324
old_major_packages/14/react/lib/ReactBrowserEventEmitter.js
Normal file
@@ -0,0 +1,324 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactBrowserEventEmitter
|
||||
* @typechecks static-only
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var EventConstants = require('./EventConstants');
|
||||
var EventPluginHub = require('./EventPluginHub');
|
||||
var EventPluginRegistry = require('./EventPluginRegistry');
|
||||
var ReactEventEmitterMixin = require('./ReactEventEmitterMixin');
|
||||
var ReactPerf = require('./ReactPerf');
|
||||
var ViewportMetrics = require('./ViewportMetrics');
|
||||
|
||||
var assign = require('./Object.assign');
|
||||
var isEventSupported = require('./isEventSupported');
|
||||
|
||||
/**
|
||||
* Summary of `ReactBrowserEventEmitter` event handling:
|
||||
*
|
||||
* - Top-level delegation is used to trap most native browser events. This
|
||||
* may only occur in the main thread and is the responsibility of
|
||||
* ReactEventListener, which is injected and can therefore support pluggable
|
||||
* event sources. This is the only work that occurs in the main thread.
|
||||
*
|
||||
* - We normalize and de-duplicate events to account for browser quirks. This
|
||||
* may be done in the worker thread.
|
||||
*
|
||||
* - Forward these native events (with the associated top-level type used to
|
||||
* trap it) to `EventPluginHub`, which in turn will ask plugins if they want
|
||||
* to extract any synthetic events.
|
||||
*
|
||||
* - The `EventPluginHub` will then process each event by annotating them with
|
||||
* "dispatches", a sequence of listeners and IDs that care about that event.
|
||||
*
|
||||
* - The `EventPluginHub` then dispatches the events.
|
||||
*
|
||||
* Overview of React and the event system:
|
||||
*
|
||||
* +------------+ .
|
||||
* | DOM | .
|
||||
* +------------+ .
|
||||
* | .
|
||||
* v .
|
||||
* +------------+ .
|
||||
* | ReactEvent | .
|
||||
* | Listener | .
|
||||
* +------------+ . +-----------+
|
||||
* | . +--------+|SimpleEvent|
|
||||
* | . | |Plugin |
|
||||
* +-----|------+ . v +-----------+
|
||||
* | | | . +--------------+ +------------+
|
||||
* | +-----------.--->|EventPluginHub| | Event |
|
||||
* | | . | | +-----------+ | Propagators|
|
||||
* | ReactEvent | . | | |TapEvent | |------------|
|
||||
* | Emitter | . | |<---+|Plugin | |other plugin|
|
||||
* | | . | | +-----------+ | utilities |
|
||||
* | +-----------.--->| | +------------+
|
||||
* | | | . +--------------+
|
||||
* +-----|------+ . ^ +-----------+
|
||||
* | . | |Enter/Leave|
|
||||
* + . +-------+|Plugin |
|
||||
* +-------------+ . +-----------+
|
||||
* | application | .
|
||||
* |-------------| .
|
||||
* | | .
|
||||
* | | .
|
||||
* +-------------+ .
|
||||
* .
|
||||
* React Core . General Purpose Event Plugin System
|
||||
*/
|
||||
|
||||
var alreadyListeningTo = {};
|
||||
var isMonitoringScrollValue = false;
|
||||
var reactTopListenersCounter = 0;
|
||||
|
||||
// For events like 'submit' which don't consistently bubble (which we trap at a
|
||||
// lower node than `document`), binding at `document` would cause duplicate
|
||||
// events so we don't include them here
|
||||
var topEventMapping = {
|
||||
topAbort: 'abort',
|
||||
topBlur: 'blur',
|
||||
topCanPlay: 'canplay',
|
||||
topCanPlayThrough: 'canplaythrough',
|
||||
topChange: 'change',
|
||||
topClick: 'click',
|
||||
topCompositionEnd: 'compositionend',
|
||||
topCompositionStart: 'compositionstart',
|
||||
topCompositionUpdate: 'compositionupdate',
|
||||
topContextMenu: 'contextmenu',
|
||||
topCopy: 'copy',
|
||||
topCut: 'cut',
|
||||
topDoubleClick: 'dblclick',
|
||||
topDrag: 'drag',
|
||||
topDragEnd: 'dragend',
|
||||
topDragEnter: 'dragenter',
|
||||
topDragExit: 'dragexit',
|
||||
topDragLeave: 'dragleave',
|
||||
topDragOver: 'dragover',
|
||||
topDragStart: 'dragstart',
|
||||
topDrop: 'drop',
|
||||
topDurationChange: 'durationchange',
|
||||
topEmptied: 'emptied',
|
||||
topEncrypted: 'encrypted',
|
||||
topEnded: 'ended',
|
||||
topError: 'error',
|
||||
topFocus: 'focus',
|
||||
topInput: 'input',
|
||||
topKeyDown: 'keydown',
|
||||
topKeyPress: 'keypress',
|
||||
topKeyUp: 'keyup',
|
||||
topLoadedData: 'loadeddata',
|
||||
topLoadedMetadata: 'loadedmetadata',
|
||||
topLoadStart: 'loadstart',
|
||||
topMouseDown: 'mousedown',
|
||||
topMouseMove: 'mousemove',
|
||||
topMouseOut: 'mouseout',
|
||||
topMouseOver: 'mouseover',
|
||||
topMouseUp: 'mouseup',
|
||||
topPaste: 'paste',
|
||||
topPause: 'pause',
|
||||
topPlay: 'play',
|
||||
topPlaying: 'playing',
|
||||
topProgress: 'progress',
|
||||
topRateChange: 'ratechange',
|
||||
topScroll: 'scroll',
|
||||
topSeeked: 'seeked',
|
||||
topSeeking: 'seeking',
|
||||
topSelectionChange: 'selectionchange',
|
||||
topStalled: 'stalled',
|
||||
topSuspend: 'suspend',
|
||||
topTextInput: 'textInput',
|
||||
topTimeUpdate: 'timeupdate',
|
||||
topTouchCancel: 'touchcancel',
|
||||
topTouchEnd: 'touchend',
|
||||
topTouchMove: 'touchmove',
|
||||
topTouchStart: 'touchstart',
|
||||
topVolumeChange: 'volumechange',
|
||||
topWaiting: 'waiting',
|
||||
topWheel: 'wheel'
|
||||
};
|
||||
|
||||
/**
|
||||
* To ensure no conflicts with other potential React instances on the page
|
||||
*/
|
||||
var topListenersIDKey = '_reactListenersID' + String(Math.random()).slice(2);
|
||||
|
||||
function getListeningForDocument(mountAt) {
|
||||
// In IE8, `mountAt` is a host object and doesn't have `hasOwnProperty`
|
||||
// directly.
|
||||
if (!Object.prototype.hasOwnProperty.call(mountAt, topListenersIDKey)) {
|
||||
mountAt[topListenersIDKey] = reactTopListenersCounter++;
|
||||
alreadyListeningTo[mountAt[topListenersIDKey]] = {};
|
||||
}
|
||||
return alreadyListeningTo[mountAt[topListenersIDKey]];
|
||||
}
|
||||
|
||||
/**
|
||||
* `ReactBrowserEventEmitter` is used to attach top-level event listeners. For
|
||||
* example:
|
||||
*
|
||||
* ReactBrowserEventEmitter.putListener('myID', 'onClick', myFunction);
|
||||
*
|
||||
* This would allocate a "registration" of `('onClick', myFunction)` on 'myID'.
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
var ReactBrowserEventEmitter = assign({}, ReactEventEmitterMixin, {
|
||||
|
||||
/**
|
||||
* Injectable event backend
|
||||
*/
|
||||
ReactEventListener: null,
|
||||
|
||||
injection: {
|
||||
/**
|
||||
* @param {object} ReactEventListener
|
||||
*/
|
||||
injectReactEventListener: function (ReactEventListener) {
|
||||
ReactEventListener.setHandleTopLevel(ReactBrowserEventEmitter.handleTopLevel);
|
||||
ReactBrowserEventEmitter.ReactEventListener = ReactEventListener;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Sets whether or not any created callbacks should be enabled.
|
||||
*
|
||||
* @param {boolean} enabled True if callbacks should be enabled.
|
||||
*/
|
||||
setEnabled: function (enabled) {
|
||||
if (ReactBrowserEventEmitter.ReactEventListener) {
|
||||
ReactBrowserEventEmitter.ReactEventListener.setEnabled(enabled);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* @return {boolean} True if callbacks are enabled.
|
||||
*/
|
||||
isEnabled: function () {
|
||||
return !!(ReactBrowserEventEmitter.ReactEventListener && ReactBrowserEventEmitter.ReactEventListener.isEnabled());
|
||||
},
|
||||
|
||||
/**
|
||||
* We listen for bubbled touch events on the document object.
|
||||
*
|
||||
* Firefox v8.01 (and possibly others) exhibited strange behavior when
|
||||
* mounting `onmousemove` events at some node that was not the document
|
||||
* element. The symptoms were that if your mouse is not moving over something
|
||||
* contained within that mount point (for example on the background) the
|
||||
* top-level listeners for `onmousemove` won't be called. However, if you
|
||||
* register the `mousemove` on the document object, then it will of course
|
||||
* catch all `mousemove`s. This along with iOS quirks, justifies restricting
|
||||
* top-level listeners to the document object only, at least for these
|
||||
* movement types of events and possibly all events.
|
||||
*
|
||||
* @see http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html
|
||||
*
|
||||
* Also, `keyup`/`keypress`/`keydown` do not bubble to the window on IE, but
|
||||
* they bubble to document.
|
||||
*
|
||||
* @param {string} registrationName Name of listener (e.g. `onClick`).
|
||||
* @param {object} contentDocumentHandle Document which owns the container
|
||||
*/
|
||||
listenTo: function (registrationName, contentDocumentHandle) {
|
||||
var mountAt = contentDocumentHandle;
|
||||
var isListening = getListeningForDocument(mountAt);
|
||||
var dependencies = EventPluginRegistry.registrationNameDependencies[registrationName];
|
||||
|
||||
var topLevelTypes = EventConstants.topLevelTypes;
|
||||
for (var i = 0; i < dependencies.length; i++) {
|
||||
var dependency = dependencies[i];
|
||||
if (!(isListening.hasOwnProperty(dependency) && isListening[dependency])) {
|
||||
if (dependency === topLevelTypes.topWheel) {
|
||||
if (isEventSupported('wheel')) {
|
||||
ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topWheel, 'wheel', mountAt);
|
||||
} else if (isEventSupported('mousewheel')) {
|
||||
ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topWheel, 'mousewheel', mountAt);
|
||||
} else {
|
||||
// Firefox needs to capture a different mouse scroll event.
|
||||
// @see http://www.quirksmode.org/dom/events/tests/scroll.html
|
||||
ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topWheel, 'DOMMouseScroll', mountAt);
|
||||
}
|
||||
} else if (dependency === topLevelTypes.topScroll) {
|
||||
|
||||
if (isEventSupported('scroll', true)) {
|
||||
ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelTypes.topScroll, 'scroll', mountAt);
|
||||
} else {
|
||||
ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topScroll, 'scroll', ReactBrowserEventEmitter.ReactEventListener.WINDOW_HANDLE);
|
||||
}
|
||||
} else if (dependency === topLevelTypes.topFocus || dependency === topLevelTypes.topBlur) {
|
||||
|
||||
if (isEventSupported('focus', true)) {
|
||||
ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelTypes.topFocus, 'focus', mountAt);
|
||||
ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelTypes.topBlur, 'blur', mountAt);
|
||||
} else if (isEventSupported('focusin')) {
|
||||
// IE has `focusin` and `focusout` events which bubble.
|
||||
// @see http://www.quirksmode.org/blog/archives/2008/04/delegating_the.html
|
||||
ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topFocus, 'focusin', mountAt);
|
||||
ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topBlur, 'focusout', mountAt);
|
||||
}
|
||||
|
||||
// to make sure blur and focus event listeners are only attached once
|
||||
isListening[topLevelTypes.topBlur] = true;
|
||||
isListening[topLevelTypes.topFocus] = true;
|
||||
} else if (topEventMapping.hasOwnProperty(dependency)) {
|
||||
ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(dependency, topEventMapping[dependency], mountAt);
|
||||
}
|
||||
|
||||
isListening[dependency] = true;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
trapBubbledEvent: function (topLevelType, handlerBaseName, handle) {
|
||||
return ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelType, handlerBaseName, handle);
|
||||
},
|
||||
|
||||
trapCapturedEvent: function (topLevelType, handlerBaseName, handle) {
|
||||
return ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelType, handlerBaseName, handle);
|
||||
},
|
||||
|
||||
/**
|
||||
* Listens to window scroll and resize events. We cache scroll values so that
|
||||
* application code can access them without triggering reflows.
|
||||
*
|
||||
* NOTE: Scroll events do not bubble.
|
||||
*
|
||||
* @see http://www.quirksmode.org/dom/events/scroll.html
|
||||
*/
|
||||
ensureScrollValueMonitoring: function () {
|
||||
if (!isMonitoringScrollValue) {
|
||||
var refresh = ViewportMetrics.refreshScrollValues;
|
||||
ReactBrowserEventEmitter.ReactEventListener.monitorScrollValue(refresh);
|
||||
isMonitoringScrollValue = true;
|
||||
}
|
||||
},
|
||||
|
||||
eventNameDispatchConfigs: EventPluginHub.eventNameDispatchConfigs,
|
||||
|
||||
registrationNameModules: EventPluginHub.registrationNameModules,
|
||||
|
||||
putListener: EventPluginHub.putListener,
|
||||
|
||||
getListener: EventPluginHub.getListener,
|
||||
|
||||
deleteListener: EventPluginHub.deleteListener,
|
||||
|
||||
deleteAllListeners: EventPluginHub.deleteAllListeners
|
||||
|
||||
});
|
||||
|
||||
ReactPerf.measureMethods(ReactBrowserEventEmitter, 'ReactBrowserEventEmitter', {
|
||||
putListener: 'putListener',
|
||||
deleteListener: 'deleteListener'
|
||||
});
|
||||
|
||||
module.exports = ReactBrowserEventEmitter;
|
||||
83
old_major_packages/14/react/lib/ReactCSSTransitionGroup.js
Normal file
83
old_major_packages/14/react/lib/ReactCSSTransitionGroup.js
Normal file
@@ -0,0 +1,83 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @typechecks
|
||||
* @providesModule ReactCSSTransitionGroup
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var React = require('./React');
|
||||
|
||||
var assign = require('./Object.assign');
|
||||
|
||||
var ReactTransitionGroup = require('./ReactTransitionGroup');
|
||||
var ReactCSSTransitionGroupChild = require('./ReactCSSTransitionGroupChild');
|
||||
|
||||
function createTransitionTimeoutPropValidator(transitionType) {
|
||||
var timeoutPropName = 'transition' + transitionType + 'Timeout';
|
||||
var enabledPropName = 'transition' + transitionType;
|
||||
|
||||
return function (props) {
|
||||
// If the transition is enabled
|
||||
if (props[enabledPropName]) {
|
||||
// If no timeout duration is provided
|
||||
if (props[timeoutPropName] == null) {
|
||||
return new Error(timeoutPropName + ' wasn\'t supplied to ReactCSSTransitionGroup: ' + 'this can cause unreliable animations and won\'t be supported in ' + 'a future version of React. See ' + 'https://fb.me/react-animation-transition-group-timeout for more ' + 'information.');
|
||||
|
||||
// If the duration isn't a number
|
||||
} else if (typeof props[timeoutPropName] !== 'number') {
|
||||
return new Error(timeoutPropName + ' must be a number (in milliseconds)');
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
var ReactCSSTransitionGroup = React.createClass({
|
||||
displayName: 'ReactCSSTransitionGroup',
|
||||
|
||||
propTypes: {
|
||||
transitionName: ReactCSSTransitionGroupChild.propTypes.name,
|
||||
|
||||
transitionAppear: React.PropTypes.bool,
|
||||
transitionEnter: React.PropTypes.bool,
|
||||
transitionLeave: React.PropTypes.bool,
|
||||
transitionAppearTimeout: createTransitionTimeoutPropValidator('Appear'),
|
||||
transitionEnterTimeout: createTransitionTimeoutPropValidator('Enter'),
|
||||
transitionLeaveTimeout: createTransitionTimeoutPropValidator('Leave')
|
||||
},
|
||||
|
||||
getDefaultProps: function () {
|
||||
return {
|
||||
transitionAppear: false,
|
||||
transitionEnter: true,
|
||||
transitionLeave: true
|
||||
};
|
||||
},
|
||||
|
||||
_wrapChild: function (child) {
|
||||
// We need to provide this childFactory so that
|
||||
// ReactCSSTransitionGroupChild can receive updates to name, enter, and
|
||||
// leave while it is leaving.
|
||||
return React.createElement(ReactCSSTransitionGroupChild, {
|
||||
name: this.props.transitionName,
|
||||
appear: this.props.transitionAppear,
|
||||
enter: this.props.transitionEnter,
|
||||
leave: this.props.transitionLeave,
|
||||
appearTimeout: this.props.transitionAppearTimeout,
|
||||
enterTimeout: this.props.transitionEnterTimeout,
|
||||
leaveTimeout: this.props.transitionLeaveTimeout
|
||||
}, child);
|
||||
},
|
||||
|
||||
render: function () {
|
||||
return React.createElement(ReactTransitionGroup, assign({}, this.props, { childFactory: this._wrapChild }));
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = ReactCSSTransitionGroup;
|
||||
165
old_major_packages/14/react/lib/ReactCSSTransitionGroupChild.js
Normal file
165
old_major_packages/14/react/lib/ReactCSSTransitionGroupChild.js
Normal file
@@ -0,0 +1,165 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @typechecks
|
||||
* @providesModule ReactCSSTransitionGroupChild
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var React = require('./React');
|
||||
var ReactDOM = require('./ReactDOM');
|
||||
|
||||
var CSSCore = require('fbjs/lib/CSSCore');
|
||||
var ReactTransitionEvents = require('./ReactTransitionEvents');
|
||||
|
||||
var onlyChild = require('./onlyChild');
|
||||
|
||||
// We don't remove the element from the DOM until we receive an animationend or
|
||||
// transitionend event. If the user screws up and forgets to add an animation
|
||||
// their node will be stuck in the DOM forever, so we detect if an animation
|
||||
// does not start and if it doesn't, we just call the end listener immediately.
|
||||
var TICK = 17;
|
||||
|
||||
var ReactCSSTransitionGroupChild = React.createClass({
|
||||
displayName: 'ReactCSSTransitionGroupChild',
|
||||
|
||||
propTypes: {
|
||||
name: React.PropTypes.oneOfType([React.PropTypes.string, React.PropTypes.shape({
|
||||
enter: React.PropTypes.string,
|
||||
leave: React.PropTypes.string,
|
||||
active: React.PropTypes.string
|
||||
}), React.PropTypes.shape({
|
||||
enter: React.PropTypes.string,
|
||||
enterActive: React.PropTypes.string,
|
||||
leave: React.PropTypes.string,
|
||||
leaveActive: React.PropTypes.string,
|
||||
appear: React.PropTypes.string,
|
||||
appearActive: React.PropTypes.string
|
||||
})]).isRequired,
|
||||
|
||||
// Once we require timeouts to be specified, we can remove the
|
||||
// boolean flags (appear etc.) and just accept a number
|
||||
// or a bool for the timeout flags (appearTimeout etc.)
|
||||
appear: React.PropTypes.bool,
|
||||
enter: React.PropTypes.bool,
|
||||
leave: React.PropTypes.bool,
|
||||
appearTimeout: React.PropTypes.number,
|
||||
enterTimeout: React.PropTypes.number,
|
||||
leaveTimeout: React.PropTypes.number
|
||||
},
|
||||
|
||||
transition: function (animationType, finishCallback, userSpecifiedDelay) {
|
||||
var node = ReactDOM.findDOMNode(this);
|
||||
|
||||
if (!node) {
|
||||
if (finishCallback) {
|
||||
finishCallback();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
var className = this.props.name[animationType] || this.props.name + '-' + animationType;
|
||||
var activeClassName = this.props.name[animationType + 'Active'] || className + '-active';
|
||||
var timeout = null;
|
||||
|
||||
var endListener = function (e) {
|
||||
if (e && e.target !== node) {
|
||||
return;
|
||||
}
|
||||
|
||||
clearTimeout(timeout);
|
||||
|
||||
CSSCore.removeClass(node, className);
|
||||
CSSCore.removeClass(node, activeClassName);
|
||||
|
||||
ReactTransitionEvents.removeEndEventListener(node, endListener);
|
||||
|
||||
// Usually this optional callback is used for informing an owner of
|
||||
// a leave animation and telling it to remove the child.
|
||||
if (finishCallback) {
|
||||
finishCallback();
|
||||
}
|
||||
};
|
||||
|
||||
CSSCore.addClass(node, className);
|
||||
|
||||
// Need to do this to actually trigger a transition.
|
||||
this.queueClass(activeClassName);
|
||||
|
||||
// If the user specified a timeout delay.
|
||||
if (userSpecifiedDelay) {
|
||||
// Clean-up the animation after the specified delay
|
||||
timeout = setTimeout(endListener, userSpecifiedDelay);
|
||||
this.transitionTimeouts.push(timeout);
|
||||
} else {
|
||||
// DEPRECATED: this listener will be removed in a future version of react
|
||||
ReactTransitionEvents.addEndEventListener(node, endListener);
|
||||
}
|
||||
},
|
||||
|
||||
queueClass: function (className) {
|
||||
this.classNameQueue.push(className);
|
||||
|
||||
if (!this.timeout) {
|
||||
this.timeout = setTimeout(this.flushClassNameQueue, TICK);
|
||||
}
|
||||
},
|
||||
|
||||
flushClassNameQueue: function () {
|
||||
if (this.isMounted()) {
|
||||
this.classNameQueue.forEach(CSSCore.addClass.bind(CSSCore, ReactDOM.findDOMNode(this)));
|
||||
}
|
||||
this.classNameQueue.length = 0;
|
||||
this.timeout = null;
|
||||
},
|
||||
|
||||
componentWillMount: function () {
|
||||
this.classNameQueue = [];
|
||||
this.transitionTimeouts = [];
|
||||
},
|
||||
|
||||
componentWillUnmount: function () {
|
||||
if (this.timeout) {
|
||||
clearTimeout(this.timeout);
|
||||
}
|
||||
this.transitionTimeouts.forEach(function (timeout) {
|
||||
clearTimeout(timeout);
|
||||
});
|
||||
},
|
||||
|
||||
componentWillAppear: function (done) {
|
||||
if (this.props.appear) {
|
||||
this.transition('appear', done, this.props.appearTimeout);
|
||||
} else {
|
||||
done();
|
||||
}
|
||||
},
|
||||
|
||||
componentWillEnter: function (done) {
|
||||
if (this.props.enter) {
|
||||
this.transition('enter', done, this.props.enterTimeout);
|
||||
} else {
|
||||
done();
|
||||
}
|
||||
},
|
||||
|
||||
componentWillLeave: function (done) {
|
||||
if (this.props.leave) {
|
||||
this.transition('leave', done, this.props.leaveTimeout);
|
||||
} else {
|
||||
done();
|
||||
}
|
||||
},
|
||||
|
||||
render: function () {
|
||||
return onlyChild(this.props.children);
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = ReactCSSTransitionGroupChild;
|
||||
122
old_major_packages/14/react/lib/ReactChildReconciler.js
Normal file
122
old_major_packages/14/react/lib/ReactChildReconciler.js
Normal file
@@ -0,0 +1,122 @@
|
||||
/**
|
||||
* Copyright 2014-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactChildReconciler
|
||||
* @typechecks static-only
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ReactReconciler = require('./ReactReconciler');
|
||||
|
||||
var instantiateReactComponent = require('./instantiateReactComponent');
|
||||
var shouldUpdateReactComponent = require('./shouldUpdateReactComponent');
|
||||
var traverseAllChildren = require('./traverseAllChildren');
|
||||
var warning = require('fbjs/lib/warning');
|
||||
|
||||
function instantiateChild(childInstances, child, name) {
|
||||
// We found a component instance.
|
||||
var keyUnique = childInstances[name] === undefined;
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
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;
|
||||
}
|
||||
if (child != null && keyUnique) {
|
||||
childInstances[name] = instantiateReactComponent(child, null);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ReactChildReconciler provides helpers for initializing or updating a set of
|
||||
* children. Its output is suitable for passing it onto ReactMultiChild which
|
||||
* does diffed reordering and insertion.
|
||||
*/
|
||||
var ReactChildReconciler = {
|
||||
/**
|
||||
* Generates a "mount image" for each of the supplied children. In the case
|
||||
* of `ReactDOMComponent`, a mount image is a string of markup.
|
||||
*
|
||||
* @param {?object} nestedChildNodes Nested child maps.
|
||||
* @return {?object} A set of child instances.
|
||||
* @internal
|
||||
*/
|
||||
instantiateChildren: function (nestedChildNodes, transaction, context) {
|
||||
if (nestedChildNodes == null) {
|
||||
return null;
|
||||
}
|
||||
var childInstances = {};
|
||||
traverseAllChildren(nestedChildNodes, instantiateChild, childInstances);
|
||||
return childInstances;
|
||||
},
|
||||
|
||||
/**
|
||||
* Updates the rendered children and returns a new set of children.
|
||||
*
|
||||
* @param {?object} prevChildren Previously initialized set of children.
|
||||
* @param {?object} nextChildren Flat child element maps.
|
||||
* @param {ReactReconcileTransaction} transaction
|
||||
* @param {object} context
|
||||
* @return {?object} A new set of child instances.
|
||||
* @internal
|
||||
*/
|
||||
updateChildren: function (prevChildren, nextChildren, transaction, context) {
|
||||
// We currently don't have a way to track moves here but if we use iterators
|
||||
// instead of for..in we can zip the iterators and check if an item has
|
||||
// moved.
|
||||
// TODO: If nothing has changed, return the prevChildren object so that we
|
||||
// can quickly bailout if nothing has changed.
|
||||
if (!nextChildren && !prevChildren) {
|
||||
return null;
|
||||
}
|
||||
var name;
|
||||
for (name in nextChildren) {
|
||||
if (!nextChildren.hasOwnProperty(name)) {
|
||||
continue;
|
||||
}
|
||||
var prevChild = prevChildren && prevChildren[name];
|
||||
var prevElement = prevChild && prevChild._currentElement;
|
||||
var nextElement = nextChildren[name];
|
||||
if (prevChild != null && shouldUpdateReactComponent(prevElement, nextElement)) {
|
||||
ReactReconciler.receiveComponent(prevChild, nextElement, transaction, context);
|
||||
nextChildren[name] = prevChild;
|
||||
} else {
|
||||
if (prevChild) {
|
||||
ReactReconciler.unmountComponent(prevChild, name);
|
||||
}
|
||||
// The child must be instantiated before it's mounted.
|
||||
var nextChildInstance = instantiateReactComponent(nextElement, null);
|
||||
nextChildren[name] = nextChildInstance;
|
||||
}
|
||||
}
|
||||
// Unmount children that are no longer present.
|
||||
for (name in prevChildren) {
|
||||
if (prevChildren.hasOwnProperty(name) && !(nextChildren && nextChildren.hasOwnProperty(name))) {
|
||||
ReactReconciler.unmountComponent(prevChildren[name]);
|
||||
}
|
||||
}
|
||||
return nextChildren;
|
||||
},
|
||||
|
||||
/**
|
||||
* Unmounts all rendered children. This should be used to clean up children
|
||||
* when this component is unmounted.
|
||||
*
|
||||
* @param {?object} renderedChildren Previously initialized set of children.
|
||||
* @internal
|
||||
*/
|
||||
unmountChildren: function (renderedChildren) {
|
||||
for (var name in renderedChildren) {
|
||||
if (renderedChildren.hasOwnProperty(name)) {
|
||||
var renderedChild = renderedChildren[name];
|
||||
ReactReconciler.unmountComponent(renderedChild);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
module.exports = ReactChildReconciler;
|
||||
182
old_major_packages/14/react/lib/ReactChildren.js
Normal file
182
old_major_packages/14/react/lib/ReactChildren.js
Normal file
@@ -0,0 +1,182 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactChildren
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var PooledClass = require('./PooledClass');
|
||||
var ReactElement = require('./ReactElement');
|
||||
|
||||
var emptyFunction = require('fbjs/lib/emptyFunction');
|
||||
var traverseAllChildren = require('./traverseAllChildren');
|
||||
|
||||
var twoArgumentPooler = PooledClass.twoArgumentPooler;
|
||||
var fourArgumentPooler = PooledClass.fourArgumentPooler;
|
||||
|
||||
var userProvidedKeyEscapeRegex = /\/(?!\/)/g;
|
||||
function escapeUserProvidedKey(text) {
|
||||
return ('' + text).replace(userProvidedKeyEscapeRegex, '//');
|
||||
}
|
||||
|
||||
/**
|
||||
* PooledClass representing the bookkeeping associated with performing a child
|
||||
* traversal. Allows avoiding binding callbacks.
|
||||
*
|
||||
* @constructor ForEachBookKeeping
|
||||
* @param {!function} forEachFunction Function to perform traversal with.
|
||||
* @param {?*} forEachContext Context to perform context with.
|
||||
*/
|
||||
function ForEachBookKeeping(forEachFunction, forEachContext) {
|
||||
this.func = forEachFunction;
|
||||
this.context = forEachContext;
|
||||
this.count = 0;
|
||||
}
|
||||
ForEachBookKeeping.prototype.destructor = function () {
|
||||
this.func = null;
|
||||
this.context = null;
|
||||
this.count = 0;
|
||||
};
|
||||
PooledClass.addPoolingTo(ForEachBookKeeping, twoArgumentPooler);
|
||||
|
||||
function forEachSingleChild(bookKeeping, child, name) {
|
||||
var func = bookKeeping.func;
|
||||
var context = bookKeeping.context;
|
||||
|
||||
func.call(context, child, bookKeeping.count++);
|
||||
}
|
||||
|
||||
/**
|
||||
* Iterates through children that are typically specified as `props.children`.
|
||||
*
|
||||
* The provided forEachFunc(child, index) will be called for each
|
||||
* leaf child.
|
||||
*
|
||||
* @param {?*} children Children tree container.
|
||||
* @param {function(*, int)} forEachFunc
|
||||
* @param {*} forEachContext Context for forEachContext.
|
||||
*/
|
||||
function forEachChildren(children, forEachFunc, forEachContext) {
|
||||
if (children == null) {
|
||||
return children;
|
||||
}
|
||||
var traverseContext = ForEachBookKeeping.getPooled(forEachFunc, forEachContext);
|
||||
traverseAllChildren(children, forEachSingleChild, traverseContext);
|
||||
ForEachBookKeeping.release(traverseContext);
|
||||
}
|
||||
|
||||
/**
|
||||
* PooledClass representing the bookkeeping associated with performing a child
|
||||
* mapping. Allows avoiding binding callbacks.
|
||||
*
|
||||
* @constructor MapBookKeeping
|
||||
* @param {!*} mapResult Object containing the ordered map of results.
|
||||
* @param {!function} mapFunction Function to perform mapping with.
|
||||
* @param {?*} mapContext Context to perform mapping with.
|
||||
*/
|
||||
function MapBookKeeping(mapResult, keyPrefix, mapFunction, mapContext) {
|
||||
this.result = mapResult;
|
||||
this.keyPrefix = keyPrefix;
|
||||
this.func = mapFunction;
|
||||
this.context = mapContext;
|
||||
this.count = 0;
|
||||
}
|
||||
MapBookKeeping.prototype.destructor = function () {
|
||||
this.result = null;
|
||||
this.keyPrefix = null;
|
||||
this.func = null;
|
||||
this.context = null;
|
||||
this.count = 0;
|
||||
};
|
||||
PooledClass.addPoolingTo(MapBookKeeping, fourArgumentPooler);
|
||||
|
||||
function mapSingleChildIntoContext(bookKeeping, child, childKey) {
|
||||
var result = bookKeeping.result;
|
||||
var keyPrefix = bookKeeping.keyPrefix;
|
||||
var func = bookKeeping.func;
|
||||
var context = bookKeeping.context;
|
||||
|
||||
var mappedChild = func.call(context, child, bookKeeping.count++);
|
||||
if (Array.isArray(mappedChild)) {
|
||||
mapIntoWithKeyPrefixInternal(mappedChild, result, childKey, emptyFunction.thatReturnsArgument);
|
||||
} else if (mappedChild != null) {
|
||||
if (ReactElement.isValidElement(mappedChild)) {
|
||||
mappedChild = ReactElement.cloneAndReplaceKey(mappedChild,
|
||||
// Keep both the (mapped) and old keys if they differ, just as
|
||||
// traverseAllChildren used to do for objects as children
|
||||
keyPrefix + (mappedChild !== child ? escapeUserProvidedKey(mappedChild.key || '') + '/' : '') + childKey);
|
||||
}
|
||||
result.push(mappedChild);
|
||||
}
|
||||
}
|
||||
|
||||
function mapIntoWithKeyPrefixInternal(children, array, prefix, func, context) {
|
||||
var escapedPrefix = '';
|
||||
if (prefix != null) {
|
||||
escapedPrefix = escapeUserProvidedKey(prefix) + '/';
|
||||
}
|
||||
var traverseContext = MapBookKeeping.getPooled(array, escapedPrefix, func, context);
|
||||
traverseAllChildren(children, mapSingleChildIntoContext, traverseContext);
|
||||
MapBookKeeping.release(traverseContext);
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps children that are typically specified as `props.children`.
|
||||
*
|
||||
* The provided mapFunction(child, key, index) will be called for each
|
||||
* leaf child.
|
||||
*
|
||||
* @param {?*} children Children tree container.
|
||||
* @param {function(*, int)} func The map function.
|
||||
* @param {*} context Context for mapFunction.
|
||||
* @return {object} Object containing the ordered map of results.
|
||||
*/
|
||||
function mapChildren(children, func, context) {
|
||||
if (children == null) {
|
||||
return children;
|
||||
}
|
||||
var result = [];
|
||||
mapIntoWithKeyPrefixInternal(children, result, null, func, context);
|
||||
return result;
|
||||
}
|
||||
|
||||
function forEachSingleChildDummy(traverseContext, child, name) {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Count the number of children that are typically specified as
|
||||
* `props.children`.
|
||||
*
|
||||
* @param {?*} children Children tree container.
|
||||
* @return {number} The number of children.
|
||||
*/
|
||||
function countChildren(children, context) {
|
||||
return traverseAllChildren(children, forEachSingleChildDummy, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Flatten a children object (typically specified as `props.children`) and
|
||||
* return an array with appropriately re-keyed children.
|
||||
*/
|
||||
function toArray(children) {
|
||||
var result = [];
|
||||
mapIntoWithKeyPrefixInternal(children, result, null, emptyFunction.thatReturnsArgument);
|
||||
return result;
|
||||
}
|
||||
|
||||
var ReactChildren = {
|
||||
forEach: forEachChildren,
|
||||
map: mapChildren,
|
||||
mapIntoWithKeyPrefixInternal: mapIntoWithKeyPrefixInternal,
|
||||
count: countChildren,
|
||||
toArray: toArray
|
||||
};
|
||||
|
||||
module.exports = ReactChildren;
|
||||
771
old_major_packages/14/react/lib/ReactClass.js
Normal file
771
old_major_packages/14/react/lib/ReactClass.js
Normal file
@@ -0,0 +1,771 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactClass
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ReactComponent = require('./ReactComponent');
|
||||
var ReactElement = require('./ReactElement');
|
||||
var ReactPropTypeLocations = require('./ReactPropTypeLocations');
|
||||
var ReactPropTypeLocationNames = require('./ReactPropTypeLocationNames');
|
||||
var ReactNoopUpdateQueue = require('./ReactNoopUpdateQueue');
|
||||
|
||||
var assign = require('./Object.assign');
|
||||
var emptyObject = require('fbjs/lib/emptyObject');
|
||||
var invariant = require('fbjs/lib/invariant');
|
||||
var keyMirror = require('fbjs/lib/keyMirror');
|
||||
var keyOf = require('fbjs/lib/keyOf');
|
||||
var warning = require('fbjs/lib/warning');
|
||||
|
||||
var MIXINS_KEY = keyOf({ mixins: null });
|
||||
|
||||
/**
|
||||
* Policies that describe methods in `ReactClassInterface`.
|
||||
*/
|
||||
var SpecPolicy = keyMirror({
|
||||
/**
|
||||
* These methods may be defined only once by the class specification or mixin.
|
||||
*/
|
||||
DEFINE_ONCE: null,
|
||||
/**
|
||||
* These methods may be defined by both the class specification and mixins.
|
||||
* Subsequent definitions will be chained. These methods must return void.
|
||||
*/
|
||||
DEFINE_MANY: null,
|
||||
/**
|
||||
* These methods are overriding the base class.
|
||||
*/
|
||||
OVERRIDE_BASE: null,
|
||||
/**
|
||||
* These methods are similar to DEFINE_MANY, except we assume they return
|
||||
* objects. We try to merge the keys of the return values of all the mixed in
|
||||
* functions. If there is a key conflict we throw.
|
||||
*/
|
||||
DEFINE_MANY_MERGED: null
|
||||
});
|
||||
|
||||
var injectedMixins = [];
|
||||
|
||||
var warnedSetProps = false;
|
||||
function warnSetProps() {
|
||||
if (!warnedSetProps) {
|
||||
warnedSetProps = true;
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'setProps(...) and replaceProps(...) are deprecated. ' + 'Instead, call render again at the top level.') : undefined;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Composite components are higher-level components that compose other composite
|
||||
* or native components.
|
||||
*
|
||||
* To create a new type of `ReactClass`, pass a specification of
|
||||
* your new class to `React.createClass`. The only requirement of your class
|
||||
* specification is that you implement a `render` method.
|
||||
*
|
||||
* var MyComponent = React.createClass({
|
||||
* render: function() {
|
||||
* return <div>Hello World</div>;
|
||||
* }
|
||||
* });
|
||||
*
|
||||
* The class specification supports a specific protocol of methods that have
|
||||
* special meaning (e.g. `render`). See `ReactClassInterface` for
|
||||
* more the comprehensive protocol. Any other properties and methods in the
|
||||
* class specification will be available on the prototype.
|
||||
*
|
||||
* @interface ReactClassInterface
|
||||
* @internal
|
||||
*/
|
||||
var ReactClassInterface = {
|
||||
|
||||
/**
|
||||
* An array of Mixin objects to include when defining your component.
|
||||
*
|
||||
* @type {array}
|
||||
* @optional
|
||||
*/
|
||||
mixins: SpecPolicy.DEFINE_MANY,
|
||||
|
||||
/**
|
||||
* An object containing properties and methods that should be defined on
|
||||
* the component's constructor instead of its prototype (static methods).
|
||||
*
|
||||
* @type {object}
|
||||
* @optional
|
||||
*/
|
||||
statics: SpecPolicy.DEFINE_MANY,
|
||||
|
||||
/**
|
||||
* Definition of prop types for this component.
|
||||
*
|
||||
* @type {object}
|
||||
* @optional
|
||||
*/
|
||||
propTypes: SpecPolicy.DEFINE_MANY,
|
||||
|
||||
/**
|
||||
* Definition of context types for this component.
|
||||
*
|
||||
* @type {object}
|
||||
* @optional
|
||||
*/
|
||||
contextTypes: SpecPolicy.DEFINE_MANY,
|
||||
|
||||
/**
|
||||
* Definition of context types this component sets for its children.
|
||||
*
|
||||
* @type {object}
|
||||
* @optional
|
||||
*/
|
||||
childContextTypes: SpecPolicy.DEFINE_MANY,
|
||||
|
||||
// ==== Definition methods ====
|
||||
|
||||
/**
|
||||
* Invoked when the component is mounted. Values in the mapping will be set on
|
||||
* `this.props` if that prop is not specified (i.e. using an `in` check).
|
||||
*
|
||||
* This method is invoked before `getInitialState` and therefore cannot rely
|
||||
* on `this.state` or use `this.setState`.
|
||||
*
|
||||
* @return {object}
|
||||
* @optional
|
||||
*/
|
||||
getDefaultProps: SpecPolicy.DEFINE_MANY_MERGED,
|
||||
|
||||
/**
|
||||
* Invoked once before the component is mounted. The return value will be used
|
||||
* as the initial value of `this.state`.
|
||||
*
|
||||
* getInitialState: function() {
|
||||
* return {
|
||||
* isOn: false,
|
||||
* fooBaz: new BazFoo()
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* @return {object}
|
||||
* @optional
|
||||
*/
|
||||
getInitialState: SpecPolicy.DEFINE_MANY_MERGED,
|
||||
|
||||
/**
|
||||
* @return {object}
|
||||
* @optional
|
||||
*/
|
||||
getChildContext: SpecPolicy.DEFINE_MANY_MERGED,
|
||||
|
||||
/**
|
||||
* Uses props from `this.props` and state from `this.state` to render the
|
||||
* structure of the component.
|
||||
*
|
||||
* No guarantees are made about when or how often this method is invoked, so
|
||||
* it must not have side effects.
|
||||
*
|
||||
* render: function() {
|
||||
* var name = this.props.name;
|
||||
* return <div>Hello, {name}!</div>;
|
||||
* }
|
||||
*
|
||||
* @return {ReactComponent}
|
||||
* @nosideeffects
|
||||
* @required
|
||||
*/
|
||||
render: SpecPolicy.DEFINE_ONCE,
|
||||
|
||||
// ==== Delegate methods ====
|
||||
|
||||
/**
|
||||
* Invoked when the component is initially created and about to be mounted.
|
||||
* This may have side effects, but any external subscriptions or data created
|
||||
* by this method must be cleaned up in `componentWillUnmount`.
|
||||
*
|
||||
* @optional
|
||||
*/
|
||||
componentWillMount: SpecPolicy.DEFINE_MANY,
|
||||
|
||||
/**
|
||||
* Invoked when the component has been mounted and has a DOM representation.
|
||||
* However, there is no guarantee that the DOM node is in the document.
|
||||
*
|
||||
* Use this as an opportunity to operate on the DOM when the component has
|
||||
* been mounted (initialized and rendered) for the first time.
|
||||
*
|
||||
* @param {DOMElement} rootNode DOM element representing the component.
|
||||
* @optional
|
||||
*/
|
||||
componentDidMount: SpecPolicy.DEFINE_MANY,
|
||||
|
||||
/**
|
||||
* Invoked before the component receives new props.
|
||||
*
|
||||
* Use this as an opportunity to react to a prop transition by updating the
|
||||
* state using `this.setState`. Current props are accessed via `this.props`.
|
||||
*
|
||||
* componentWillReceiveProps: function(nextProps, nextContext) {
|
||||
* this.setState({
|
||||
* likesIncreasing: nextProps.likeCount > this.props.likeCount
|
||||
* });
|
||||
* }
|
||||
*
|
||||
* NOTE: There is no equivalent `componentWillReceiveState`. An incoming prop
|
||||
* transition may cause a state change, but the opposite is not true. If you
|
||||
* need it, you are probably looking for `componentWillUpdate`.
|
||||
*
|
||||
* @param {object} nextProps
|
||||
* @optional
|
||||
*/
|
||||
componentWillReceiveProps: SpecPolicy.DEFINE_MANY,
|
||||
|
||||
/**
|
||||
* Invoked while deciding if the component should be updated as a result of
|
||||
* receiving new props, state and/or context.
|
||||
*
|
||||
* Use this as an opportunity to `return false` when you're certain that the
|
||||
* transition to the new props/state/context will not require a component
|
||||
* update.
|
||||
*
|
||||
* shouldComponentUpdate: function(nextProps, nextState, nextContext) {
|
||||
* return !equal(nextProps, this.props) ||
|
||||
* !equal(nextState, this.state) ||
|
||||
* !equal(nextContext, this.context);
|
||||
* }
|
||||
*
|
||||
* @param {object} nextProps
|
||||
* @param {?object} nextState
|
||||
* @param {?object} nextContext
|
||||
* @return {boolean} True if the component should update.
|
||||
* @optional
|
||||
*/
|
||||
shouldComponentUpdate: SpecPolicy.DEFINE_ONCE,
|
||||
|
||||
/**
|
||||
* Invoked when the component is about to update due to a transition from
|
||||
* `this.props`, `this.state` and `this.context` to `nextProps`, `nextState`
|
||||
* and `nextContext`.
|
||||
*
|
||||
* Use this as an opportunity to perform preparation before an update occurs.
|
||||
*
|
||||
* NOTE: You **cannot** use `this.setState()` in this method.
|
||||
*
|
||||
* @param {object} nextProps
|
||||
* @param {?object} nextState
|
||||
* @param {?object} nextContext
|
||||
* @param {ReactReconcileTransaction} transaction
|
||||
* @optional
|
||||
*/
|
||||
componentWillUpdate: SpecPolicy.DEFINE_MANY,
|
||||
|
||||
/**
|
||||
* Invoked when the component's DOM representation has been updated.
|
||||
*
|
||||
* Use this as an opportunity to operate on the DOM when the component has
|
||||
* been updated.
|
||||
*
|
||||
* @param {object} prevProps
|
||||
* @param {?object} prevState
|
||||
* @param {?object} prevContext
|
||||
* @param {DOMElement} rootNode DOM element representing the component.
|
||||
* @optional
|
||||
*/
|
||||
componentDidUpdate: SpecPolicy.DEFINE_MANY,
|
||||
|
||||
/**
|
||||
* Invoked when the component is about to be removed from its parent and have
|
||||
* its DOM representation destroyed.
|
||||
*
|
||||
* Use this as an opportunity to deallocate any external resources.
|
||||
*
|
||||
* NOTE: There is no `componentDidUnmount` since your component will have been
|
||||
* destroyed by that point.
|
||||
*
|
||||
* @optional
|
||||
*/
|
||||
componentWillUnmount: SpecPolicy.DEFINE_MANY,
|
||||
|
||||
// ==== Advanced methods ====
|
||||
|
||||
/**
|
||||
* Updates the component's currently mounted DOM representation.
|
||||
*
|
||||
* By default, this implements React's rendering and reconciliation algorithm.
|
||||
* Sophisticated clients may wish to override this.
|
||||
*
|
||||
* @param {ReactReconcileTransaction} transaction
|
||||
* @internal
|
||||
* @overridable
|
||||
*/
|
||||
updateComponent: SpecPolicy.OVERRIDE_BASE
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* Mapping from class specification keys to special processing functions.
|
||||
*
|
||||
* Although these are declared like instance properties in the specification
|
||||
* when defining classes using `React.createClass`, they are actually static
|
||||
* and are accessible on the constructor instead of the prototype. Despite
|
||||
* being static, they must be defined outside of the "statics" key under
|
||||
* which all other static methods are defined.
|
||||
*/
|
||||
var RESERVED_SPEC_KEYS = {
|
||||
displayName: function (Constructor, displayName) {
|
||||
Constructor.displayName = displayName;
|
||||
},
|
||||
mixins: function (Constructor, mixins) {
|
||||
if (mixins) {
|
||||
for (var i = 0; i < mixins.length; i++) {
|
||||
mixSpecIntoComponent(Constructor, mixins[i]);
|
||||
}
|
||||
}
|
||||
},
|
||||
childContextTypes: function (Constructor, childContextTypes) {
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
validateTypeDef(Constructor, childContextTypes, ReactPropTypeLocations.childContext);
|
||||
}
|
||||
Constructor.childContextTypes = assign({}, Constructor.childContextTypes, childContextTypes);
|
||||
},
|
||||
contextTypes: function (Constructor, contextTypes) {
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
validateTypeDef(Constructor, contextTypes, ReactPropTypeLocations.context);
|
||||
}
|
||||
Constructor.contextTypes = assign({}, Constructor.contextTypes, contextTypes);
|
||||
},
|
||||
/**
|
||||
* Special case getDefaultProps which should move into statics but requires
|
||||
* automatic merging.
|
||||
*/
|
||||
getDefaultProps: function (Constructor, getDefaultProps) {
|
||||
if (Constructor.getDefaultProps) {
|
||||
Constructor.getDefaultProps = createMergedResultFunction(Constructor.getDefaultProps, getDefaultProps);
|
||||
} else {
|
||||
Constructor.getDefaultProps = getDefaultProps;
|
||||
}
|
||||
},
|
||||
propTypes: function (Constructor, propTypes) {
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
validateTypeDef(Constructor, propTypes, ReactPropTypeLocations.prop);
|
||||
}
|
||||
Constructor.propTypes = assign({}, Constructor.propTypes, propTypes);
|
||||
},
|
||||
statics: function (Constructor, statics) {
|
||||
mixStaticSpecIntoComponent(Constructor, statics);
|
||||
},
|
||||
autobind: function () {} };
|
||||
|
||||
// noop
|
||||
function validateTypeDef(Constructor, typeDef, location) {
|
||||
for (var propName in typeDef) {
|
||||
if (typeDef.hasOwnProperty(propName)) {
|
||||
// use a warning instead of an invariant so components
|
||||
// don't show up in prod but not in __DEV__
|
||||
process.env.NODE_ENV !== 'production' ? warning(typeof typeDef[propName] === 'function', '%s: %s type `%s` is invalid; it must be a function, usually from ' + 'React.PropTypes.', Constructor.displayName || 'ReactClass', ReactPropTypeLocationNames[location], propName) : undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function validateMethodOverride(proto, name) {
|
||||
var specPolicy = ReactClassInterface.hasOwnProperty(name) ? ReactClassInterface[name] : null;
|
||||
|
||||
// Disallow overriding of base class methods unless explicitly allowed.
|
||||
if (ReactClassMixin.hasOwnProperty(name)) {
|
||||
!(specPolicy === SpecPolicy.OVERRIDE_BASE) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClassInterface: You are attempting to override ' + '`%s` from your class specification. Ensure that your method names ' + 'do not overlap with React methods.', name) : invariant(false) : undefined;
|
||||
}
|
||||
|
||||
// Disallow defining methods more than once unless explicitly allowed.
|
||||
if (proto.hasOwnProperty(name)) {
|
||||
!(specPolicy === SpecPolicy.DEFINE_MANY || specPolicy === SpecPolicy.DEFINE_MANY_MERGED) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClassInterface: You are attempting to define ' + '`%s` on your component more than once. This conflict may be due ' + 'to a mixin.', name) : invariant(false) : undefined;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Mixin helper which handles policy validation and reserved
|
||||
* specification keys when building React classses.
|
||||
*/
|
||||
function mixSpecIntoComponent(Constructor, spec) {
|
||||
if (!spec) {
|
||||
return;
|
||||
}
|
||||
|
||||
!(typeof spec !== 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: You\'re attempting to ' + 'use a component class as a mixin. Instead, just use a regular object.') : invariant(false) : undefined;
|
||||
!!ReactElement.isValidElement(spec) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: You\'re attempting to ' + 'use a component as a mixin. Instead, just use a regular object.') : invariant(false) : undefined;
|
||||
|
||||
var proto = Constructor.prototype;
|
||||
|
||||
// By handling mixins before any other properties, we ensure the same
|
||||
// chaining order is applied to methods with DEFINE_MANY policy, whether
|
||||
// mixins are listed before or after these methods in the spec.
|
||||
if (spec.hasOwnProperty(MIXINS_KEY)) {
|
||||
RESERVED_SPEC_KEYS.mixins(Constructor, spec.mixins);
|
||||
}
|
||||
|
||||
for (var name in spec) {
|
||||
if (!spec.hasOwnProperty(name)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (name === MIXINS_KEY) {
|
||||
// We have already handled mixins in a special case above.
|
||||
continue;
|
||||
}
|
||||
|
||||
var property = spec[name];
|
||||
validateMethodOverride(proto, name);
|
||||
|
||||
if (RESERVED_SPEC_KEYS.hasOwnProperty(name)) {
|
||||
RESERVED_SPEC_KEYS[name](Constructor, property);
|
||||
} else {
|
||||
// Setup methods on prototype:
|
||||
// The following member methods should not be automatically bound:
|
||||
// 1. Expected ReactClass methods (in the "interface").
|
||||
// 2. Overridden methods (that were mixed in).
|
||||
var isReactClassMethod = ReactClassInterface.hasOwnProperty(name);
|
||||
var isAlreadyDefined = proto.hasOwnProperty(name);
|
||||
var isFunction = typeof property === 'function';
|
||||
var shouldAutoBind = isFunction && !isReactClassMethod && !isAlreadyDefined && spec.autobind !== false;
|
||||
|
||||
if (shouldAutoBind) {
|
||||
if (!proto.__reactAutoBindMap) {
|
||||
proto.__reactAutoBindMap = {};
|
||||
}
|
||||
proto.__reactAutoBindMap[name] = property;
|
||||
proto[name] = property;
|
||||
} else {
|
||||
if (isAlreadyDefined) {
|
||||
var specPolicy = ReactClassInterface[name];
|
||||
|
||||
// These cases should already be caught by validateMethodOverride.
|
||||
!(isReactClassMethod && (specPolicy === SpecPolicy.DEFINE_MANY_MERGED || specPolicy === SpecPolicy.DEFINE_MANY)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: Unexpected spec policy %s for key %s ' + 'when mixing in component specs.', specPolicy, name) : invariant(false) : undefined;
|
||||
|
||||
// For methods which are defined more than once, call the existing
|
||||
// methods before calling the new property, merging if appropriate.
|
||||
if (specPolicy === SpecPolicy.DEFINE_MANY_MERGED) {
|
||||
proto[name] = createMergedResultFunction(proto[name], property);
|
||||
} else if (specPolicy === SpecPolicy.DEFINE_MANY) {
|
||||
proto[name] = createChainedFunction(proto[name], property);
|
||||
}
|
||||
} else {
|
||||
proto[name] = property;
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
// Add verbose displayName to the function, which helps when looking
|
||||
// at profiling tools.
|
||||
if (typeof property === 'function' && spec.displayName) {
|
||||
proto[name].displayName = spec.displayName + '_' + name;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function mixStaticSpecIntoComponent(Constructor, statics) {
|
||||
if (!statics) {
|
||||
return;
|
||||
}
|
||||
for (var name in statics) {
|
||||
var property = statics[name];
|
||||
if (!statics.hasOwnProperty(name)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
var isReserved = (name in RESERVED_SPEC_KEYS);
|
||||
!!isReserved ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: You are attempting to define a reserved ' + 'property, `%s`, that shouldn\'t be on the "statics" key. Define it ' + 'as an instance property instead; it will still be accessible on the ' + 'constructor.', name) : invariant(false) : undefined;
|
||||
|
||||
var isInherited = (name in Constructor);
|
||||
!!isInherited ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: You are attempting to define ' + '`%s` on your component more than once. This conflict may be ' + 'due to a mixin.', name) : invariant(false) : undefined;
|
||||
Constructor[name] = property;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge two objects, but throw if both contain the same key.
|
||||
*
|
||||
* @param {object} one The first object, which is mutated.
|
||||
* @param {object} two The second object
|
||||
* @return {object} one after it has been mutated to contain everything in two.
|
||||
*/
|
||||
function mergeIntoWithNoDuplicateKeys(one, two) {
|
||||
!(one && two && typeof one === 'object' && typeof two === 'object') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.') : invariant(false) : undefined;
|
||||
|
||||
for (var key in two) {
|
||||
if (two.hasOwnProperty(key)) {
|
||||
!(one[key] === undefined) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'mergeIntoWithNoDuplicateKeys(): ' + 'Tried to merge two objects with the same key: `%s`. This conflict ' + 'may be due to a mixin; in particular, this may be caused by two ' + 'getInitialState() or getDefaultProps() methods returning objects ' + 'with clashing keys.', key) : invariant(false) : undefined;
|
||||
one[key] = two[key];
|
||||
}
|
||||
}
|
||||
return one;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a function that invokes two functions and merges their return values.
|
||||
*
|
||||
* @param {function} one Function to invoke first.
|
||||
* @param {function} two Function to invoke second.
|
||||
* @return {function} Function that invokes the two argument functions.
|
||||
* @private
|
||||
*/
|
||||
function createMergedResultFunction(one, two) {
|
||||
return function mergedResult() {
|
||||
var a = one.apply(this, arguments);
|
||||
var b = two.apply(this, arguments);
|
||||
if (a == null) {
|
||||
return b;
|
||||
} else if (b == null) {
|
||||
return a;
|
||||
}
|
||||
var c = {};
|
||||
mergeIntoWithNoDuplicateKeys(c, a);
|
||||
mergeIntoWithNoDuplicateKeys(c, b);
|
||||
return c;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a function that invokes two functions and ignores their return vales.
|
||||
*
|
||||
* @param {function} one Function to invoke first.
|
||||
* @param {function} two Function to invoke second.
|
||||
* @return {function} Function that invokes the two argument functions.
|
||||
* @private
|
||||
*/
|
||||
function createChainedFunction(one, two) {
|
||||
return function chainedFunction() {
|
||||
one.apply(this, arguments);
|
||||
two.apply(this, arguments);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Binds a method to the component.
|
||||
*
|
||||
* @param {object} component Component whose method is going to be bound.
|
||||
* @param {function} method Method to be bound.
|
||||
* @return {function} The bound method.
|
||||
*/
|
||||
function bindAutoBindMethod(component, method) {
|
||||
var boundMethod = method.bind(component);
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
boundMethod.__reactBoundContext = component;
|
||||
boundMethod.__reactBoundMethod = method;
|
||||
boundMethod.__reactBoundArguments = null;
|
||||
var componentName = component.constructor.displayName;
|
||||
var _bind = boundMethod.bind;
|
||||
/* eslint-disable block-scoped-var, no-undef */
|
||||
boundMethod.bind = function (newThis) {
|
||||
for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
||||
args[_key - 1] = arguments[_key];
|
||||
}
|
||||
|
||||
// User is trying to bind() an autobound method; we effectively will
|
||||
// ignore the value of "this" that the user is trying to use, so
|
||||
// let's warn.
|
||||
if (newThis !== component && newThis !== null) {
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'bind(): React component methods may only be bound to the ' + 'component instance. See %s', componentName) : undefined;
|
||||
} else if (!args.length) {
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'bind(): You are binding a component method to the component. ' + 'React does this for you automatically in a high-performance ' + 'way, so you can safely remove this call. See %s', componentName) : undefined;
|
||||
return boundMethod;
|
||||
}
|
||||
var reboundMethod = _bind.apply(boundMethod, arguments);
|
||||
reboundMethod.__reactBoundContext = component;
|
||||
reboundMethod.__reactBoundMethod = method;
|
||||
reboundMethod.__reactBoundArguments = args;
|
||||
return reboundMethod;
|
||||
/* eslint-enable */
|
||||
};
|
||||
}
|
||||
return boundMethod;
|
||||
}
|
||||
|
||||
/**
|
||||
* Binds all auto-bound methods in a component.
|
||||
*
|
||||
* @param {object} component Component whose method is going to be bound.
|
||||
*/
|
||||
function bindAutoBindMethods(component) {
|
||||
for (var autoBindKey in component.__reactAutoBindMap) {
|
||||
if (component.__reactAutoBindMap.hasOwnProperty(autoBindKey)) {
|
||||
var method = component.__reactAutoBindMap[autoBindKey];
|
||||
component[autoBindKey] = bindAutoBindMethod(component, method);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add more to the ReactClass base class. These are all legacy features and
|
||||
* therefore not already part of the modern ReactComponent.
|
||||
*/
|
||||
var ReactClassMixin = {
|
||||
|
||||
/**
|
||||
* TODO: This will be deprecated because state should always keep a consistent
|
||||
* type signature and the only use case for this, is to avoid that.
|
||||
*/
|
||||
replaceState: function (newState, callback) {
|
||||
this.updater.enqueueReplaceState(this, newState);
|
||||
if (callback) {
|
||||
this.updater.enqueueCallback(this, callback);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Checks whether or not this composite component is mounted.
|
||||
* @return {boolean} True if mounted, false otherwise.
|
||||
* @protected
|
||||
* @final
|
||||
*/
|
||||
isMounted: function () {
|
||||
return this.updater.isMounted(this);
|
||||
},
|
||||
|
||||
/**
|
||||
* Sets a subset of the props.
|
||||
*
|
||||
* @param {object} partialProps Subset of the next props.
|
||||
* @param {?function} callback Called after props are updated.
|
||||
* @final
|
||||
* @public
|
||||
* @deprecated
|
||||
*/
|
||||
setProps: function (partialProps, callback) {
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
warnSetProps();
|
||||
}
|
||||
this.updater.enqueueSetProps(this, partialProps);
|
||||
if (callback) {
|
||||
this.updater.enqueueCallback(this, callback);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Replace all the props.
|
||||
*
|
||||
* @param {object} newProps Subset of the next props.
|
||||
* @param {?function} callback Called after props are updated.
|
||||
* @final
|
||||
* @public
|
||||
* @deprecated
|
||||
*/
|
||||
replaceProps: function (newProps, callback) {
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
warnSetProps();
|
||||
}
|
||||
this.updater.enqueueReplaceProps(this, newProps);
|
||||
if (callback) {
|
||||
this.updater.enqueueCallback(this, callback);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var ReactClassComponent = function () {};
|
||||
assign(ReactClassComponent.prototype, ReactComponent.prototype, ReactClassMixin);
|
||||
|
||||
/**
|
||||
* Module for creating composite components.
|
||||
*
|
||||
* @class ReactClass
|
||||
*/
|
||||
var ReactClass = {
|
||||
|
||||
/**
|
||||
* Creates a composite component class given a class specification.
|
||||
*
|
||||
* @param {object} spec Class specification (which must define `render`).
|
||||
* @return {function} Component constructor function.
|
||||
* @public
|
||||
*/
|
||||
createClass: function (spec) {
|
||||
var Constructor = function (props, context, updater) {
|
||||
// This constructor is overridden by mocks. The argument is used
|
||||
// by mocks to assert on what gets mounted.
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
process.env.NODE_ENV !== 'production' ? warning(this instanceof Constructor, 'Something is calling a React component directly. Use a factory or ' + 'JSX instead. See: https://fb.me/react-legacyfactory') : undefined;
|
||||
}
|
||||
|
||||
// Wire up auto-binding
|
||||
if (this.__reactAutoBindMap) {
|
||||
bindAutoBindMethods(this);
|
||||
}
|
||||
|
||||
this.props = props;
|
||||
this.context = context;
|
||||
this.refs = emptyObject;
|
||||
this.updater = updater || ReactNoopUpdateQueue;
|
||||
|
||||
this.state = null;
|
||||
|
||||
// ReactClasses doesn't have constructors. Instead, they use the
|
||||
// getInitialState and componentWillMount methods for initialization.
|
||||
|
||||
var initialState = this.getInitialState ? this.getInitialState() : null;
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
// We allow auto-mocks to proceed as if they're returning null.
|
||||
if (typeof initialState === 'undefined' && this.getInitialState._isMockFunction) {
|
||||
// This is probably bad practice. Consider warning here and
|
||||
// deprecating this convenience.
|
||||
initialState = null;
|
||||
}
|
||||
}
|
||||
!(typeof initialState === 'object' && !Array.isArray(initialState)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.getInitialState(): must return an object or null', Constructor.displayName || 'ReactCompositeComponent') : invariant(false) : undefined;
|
||||
|
||||
this.state = initialState;
|
||||
};
|
||||
Constructor.prototype = new ReactClassComponent();
|
||||
Constructor.prototype.constructor = Constructor;
|
||||
|
||||
injectedMixins.forEach(mixSpecIntoComponent.bind(null, Constructor));
|
||||
|
||||
mixSpecIntoComponent(Constructor, spec);
|
||||
|
||||
// Initialize the defaultProps property after all mixins have been merged.
|
||||
if (Constructor.getDefaultProps) {
|
||||
Constructor.defaultProps = Constructor.getDefaultProps();
|
||||
}
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
// This is a tag to indicate that the use of these method names is ok,
|
||||
// since it's used with createClass. If it's not, then it's likely a
|
||||
// mistake so we'll warn you to use the static property, property
|
||||
// initializer or constructor respectively.
|
||||
if (Constructor.getDefaultProps) {
|
||||
Constructor.getDefaultProps.isReactClassApproved = {};
|
||||
}
|
||||
if (Constructor.prototype.getInitialState) {
|
||||
Constructor.prototype.getInitialState.isReactClassApproved = {};
|
||||
}
|
||||
}
|
||||
|
||||
!Constructor.prototype.render ? process.env.NODE_ENV !== 'production' ? invariant(false, 'createClass(...): Class specification must implement a `render` method.') : invariant(false) : undefined;
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
process.env.NODE_ENV !== 'production' ? warning(!Constructor.prototype.componentShouldUpdate, '%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', spec.displayName || 'A component') : undefined;
|
||||
process.env.NODE_ENV !== 'production' ? warning(!Constructor.prototype.componentWillRecieveProps, '%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', spec.displayName || 'A component') : undefined;
|
||||
}
|
||||
|
||||
// Reduce time spent doing lookups by setting these on the prototype.
|
||||
for (var methodName in ReactClassInterface) {
|
||||
if (!Constructor.prototype[methodName]) {
|
||||
Constructor.prototype[methodName] = null;
|
||||
}
|
||||
}
|
||||
|
||||
return Constructor;
|
||||
},
|
||||
|
||||
injection: {
|
||||
injectMixin: function (mixin) {
|
||||
injectedMixins.push(mixin);
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
module.exports = ReactClass;
|
||||
122
old_major_packages/14/react/lib/ReactComponent.js
Normal file
122
old_major_packages/14/react/lib/ReactComponent.js
Normal file
@@ -0,0 +1,122 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactComponent
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ReactNoopUpdateQueue = require('./ReactNoopUpdateQueue');
|
||||
|
||||
var canDefineProperty = require('./canDefineProperty');
|
||||
var emptyObject = require('fbjs/lib/emptyObject');
|
||||
var invariant = require('fbjs/lib/invariant');
|
||||
var warning = require('fbjs/lib/warning');
|
||||
|
||||
/**
|
||||
* Base class helpers for the updating state of a component.
|
||||
*/
|
||||
function ReactComponent(props, context, updater) {
|
||||
this.props = props;
|
||||
this.context = context;
|
||||
this.refs = emptyObject;
|
||||
// We initialize the default updater but the real one gets injected by the
|
||||
// renderer.
|
||||
this.updater = updater || ReactNoopUpdateQueue;
|
||||
}
|
||||
|
||||
ReactComponent.prototype.isReactComponent = {};
|
||||
|
||||
/**
|
||||
* Sets a subset of the state. Always use this to mutate
|
||||
* state. You should treat `this.state` as immutable.
|
||||
*
|
||||
* There is no guarantee that `this.state` will be immediately updated, so
|
||||
* accessing `this.state` after calling this method may return the old value.
|
||||
*
|
||||
* There is no guarantee that calls to `setState` will run synchronously,
|
||||
* as they may eventually be batched together. You can provide an optional
|
||||
* callback that will be executed when the call to setState is actually
|
||||
* completed.
|
||||
*
|
||||
* When a function is provided to setState, it will be called at some point in
|
||||
* the future (not synchronously). It will be called with the up to date
|
||||
* component arguments (state, props, context). These values can be different
|
||||
* from this.* because your function may be called after receiveProps but before
|
||||
* shouldComponentUpdate, and this new state, props, and context will not yet be
|
||||
* assigned to this.
|
||||
*
|
||||
* @param {object|function} partialState Next partial state or function to
|
||||
* produce next partial state to be merged with current state.
|
||||
* @param {?function} callback Called after state is updated.
|
||||
* @final
|
||||
* @protected
|
||||
*/
|
||||
ReactComponent.prototype.setState = function (partialState, callback) {
|
||||
!(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'setState(...): takes an object of state variables to update or a ' + 'function which returns an object of state variables.') : invariant(false) : undefined;
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
process.env.NODE_ENV !== 'production' ? warning(partialState != null, 'setState(...): You passed an undefined or null state object; ' + 'instead, use forceUpdate().') : undefined;
|
||||
}
|
||||
this.updater.enqueueSetState(this, partialState);
|
||||
if (callback) {
|
||||
this.updater.enqueueCallback(this, callback);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Forces an update. This should only be invoked when it is known with
|
||||
* certainty that we are **not** in a DOM transaction.
|
||||
*
|
||||
* You may want to call this when you know that some deeper aspect of the
|
||||
* component's state has changed but `setState` was not called.
|
||||
*
|
||||
* This will not invoke `shouldComponentUpdate`, but it will invoke
|
||||
* `componentWillUpdate` and `componentDidUpdate`.
|
||||
*
|
||||
* @param {?function} callback Called after update is complete.
|
||||
* @final
|
||||
* @protected
|
||||
*/
|
||||
ReactComponent.prototype.forceUpdate = function (callback) {
|
||||
this.updater.enqueueForceUpdate(this);
|
||||
if (callback) {
|
||||
this.updater.enqueueCallback(this, callback);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Deprecated APIs. These APIs used to exist on classic React classes but since
|
||||
* we would like to deprecate them, we're not going to move them over to this
|
||||
* modern base class. Instead, we define a getter that warns if it's accessed.
|
||||
*/
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
var deprecatedAPIs = {
|
||||
getDOMNode: ['getDOMNode', 'Use ReactDOM.findDOMNode(component) instead.'],
|
||||
isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'],
|
||||
replaceProps: ['replaceProps', 'Instead, call render again at the top level.'],
|
||||
replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).'],
|
||||
setProps: ['setProps', 'Instead, call render again at the top level.']
|
||||
};
|
||||
var defineDeprecationWarning = function (methodName, info) {
|
||||
if (canDefineProperty) {
|
||||
Object.defineProperty(ReactComponent.prototype, methodName, {
|
||||
get: function () {
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, '%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]) : undefined;
|
||||
return undefined;
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
for (var fnName in deprecatedAPIs) {
|
||||
if (deprecatedAPIs.hasOwnProperty(fnName)) {
|
||||
defineDeprecationWarning(fnName, deprecatedAPIs[fnName]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = ReactComponent;
|
||||
@@ -0,0 +1,41 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactComponentBrowserEnvironment
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ReactDOMIDOperations = require('./ReactDOMIDOperations');
|
||||
var ReactMount = require('./ReactMount');
|
||||
|
||||
/**
|
||||
* Abstracts away all functionality of the reconciler that requires knowledge of
|
||||
* the browser context. TODO: These callers should be refactored to avoid the
|
||||
* need for this injection.
|
||||
*/
|
||||
var ReactComponentBrowserEnvironment = {
|
||||
|
||||
processChildrenUpdates: ReactDOMIDOperations.dangerouslyProcessChildrenUpdates,
|
||||
|
||||
replaceNodeWithMarkupByID: ReactDOMIDOperations.dangerouslyReplaceNodeWithMarkupByID,
|
||||
|
||||
/**
|
||||
* If a particular environment requires that some resources be cleaned up,
|
||||
* specify this in the injected Mixin. In the DOM, we would likely want to
|
||||
* purge any cached node ID lookups.
|
||||
*
|
||||
* @private
|
||||
*/
|
||||
unmountIDFromEnvironment: function (rootNodeID) {
|
||||
ReactMount.purgeID(rootNodeID);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
module.exports = ReactComponentBrowserEnvironment;
|
||||
51
old_major_packages/14/react/lib/ReactComponentEnvironment.js
Normal file
51
old_major_packages/14/react/lib/ReactComponentEnvironment.js
Normal file
@@ -0,0 +1,51 @@
|
||||
/**
|
||||
* Copyright 2014-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactComponentEnvironment
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var invariant = require('fbjs/lib/invariant');
|
||||
|
||||
var injected = false;
|
||||
|
||||
var ReactComponentEnvironment = {
|
||||
|
||||
/**
|
||||
* Optionally injectable environment dependent cleanup hook. (server vs.
|
||||
* browser etc). Example: A browser system caches DOM nodes based on component
|
||||
* ID and must remove that cache entry when this instance is unmounted.
|
||||
*/
|
||||
unmountIDFromEnvironment: null,
|
||||
|
||||
/**
|
||||
* Optionally injectable hook for swapping out mount images in the middle of
|
||||
* the tree.
|
||||
*/
|
||||
replaceNodeWithMarkupByID: null,
|
||||
|
||||
/**
|
||||
* Optionally injectable hook for processing a queue of child updates. Will
|
||||
* later move into MultiChildComponents.
|
||||
*/
|
||||
processChildrenUpdates: null,
|
||||
|
||||
injection: {
|
||||
injectEnvironment: function (environment) {
|
||||
!!injected ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactCompositeComponent: injectEnvironment() can only be called once.') : invariant(false) : undefined;
|
||||
ReactComponentEnvironment.unmountIDFromEnvironment = environment.unmountIDFromEnvironment;
|
||||
ReactComponentEnvironment.replaceNodeWithMarkupByID = environment.replaceNodeWithMarkupByID;
|
||||
ReactComponentEnvironment.processChildrenUpdates = environment.processChildrenUpdates;
|
||||
injected = true;
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
module.exports = ReactComponentEnvironment;
|
||||
@@ -0,0 +1,46 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactComponentWithPureRenderMixin
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var shallowCompare = require('./shallowCompare');
|
||||
|
||||
/**
|
||||
* If your React component's render function is "pure", e.g. it will render the
|
||||
* same result given the same props and state, provide this Mixin for a
|
||||
* considerable performance boost.
|
||||
*
|
||||
* Most React components have pure render functions.
|
||||
*
|
||||
* Example:
|
||||
*
|
||||
* var ReactComponentWithPureRenderMixin =
|
||||
* require('ReactComponentWithPureRenderMixin');
|
||||
* React.createClass({
|
||||
* mixins: [ReactComponentWithPureRenderMixin],
|
||||
*
|
||||
* render: function() {
|
||||
* return <div className={this.props.className}>foo</div>;
|
||||
* }
|
||||
* });
|
||||
*
|
||||
* Note: This only checks shallow equality for props and state. If these contain
|
||||
* complex data structures this mixin may have false-negatives for deeper
|
||||
* differences. Only mixin to components which have simple props and state, or
|
||||
* use `forceUpdate()` when you know deep data structures have changed.
|
||||
*/
|
||||
var ReactComponentWithPureRenderMixin = {
|
||||
shouldComponentUpdate: function (nextProps, nextState) {
|
||||
return shallowCompare(this, nextProps, nextState);
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = ReactComponentWithPureRenderMixin;
|
||||
694
old_major_packages/14/react/lib/ReactCompositeComponent.js
Normal file
694
old_major_packages/14/react/lib/ReactCompositeComponent.js
Normal file
@@ -0,0 +1,694 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactCompositeComponent
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ReactComponentEnvironment = require('./ReactComponentEnvironment');
|
||||
var ReactCurrentOwner = require('./ReactCurrentOwner');
|
||||
var ReactElement = require('./ReactElement');
|
||||
var ReactInstanceMap = require('./ReactInstanceMap');
|
||||
var ReactPerf = require('./ReactPerf');
|
||||
var ReactPropTypeLocations = require('./ReactPropTypeLocations');
|
||||
var ReactPropTypeLocationNames = require('./ReactPropTypeLocationNames');
|
||||
var ReactReconciler = require('./ReactReconciler');
|
||||
var ReactUpdateQueue = require('./ReactUpdateQueue');
|
||||
|
||||
var assign = require('./Object.assign');
|
||||
var emptyObject = require('fbjs/lib/emptyObject');
|
||||
var invariant = require('fbjs/lib/invariant');
|
||||
var shouldUpdateReactComponent = require('./shouldUpdateReactComponent');
|
||||
var warning = require('fbjs/lib/warning');
|
||||
|
||||
function getDeclarationErrorAddendum(component) {
|
||||
var owner = component._currentElement._owner || null;
|
||||
if (owner) {
|
||||
var name = owner.getName();
|
||||
if (name) {
|
||||
return ' Check the render method of `' + name + '`.';
|
||||
}
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
function StatelessComponent(Component) {}
|
||||
StatelessComponent.prototype.render = function () {
|
||||
var Component = ReactInstanceMap.get(this)._currentElement.type;
|
||||
return Component(this.props, this.context, this.updater);
|
||||
};
|
||||
|
||||
/**
|
||||
* ------------------ The Life-Cycle of a Composite Component ------------------
|
||||
*
|
||||
* - constructor: Initialization of state. The instance is now retained.
|
||||
* - componentWillMount
|
||||
* - render
|
||||
* - [children's constructors]
|
||||
* - [children's componentWillMount and render]
|
||||
* - [children's componentDidMount]
|
||||
* - componentDidMount
|
||||
*
|
||||
* Update Phases:
|
||||
* - componentWillReceiveProps (only called if parent updated)
|
||||
* - shouldComponentUpdate
|
||||
* - componentWillUpdate
|
||||
* - render
|
||||
* - [children's constructors or receive props phases]
|
||||
* - componentDidUpdate
|
||||
*
|
||||
* - componentWillUnmount
|
||||
* - [children's componentWillUnmount]
|
||||
* - [children destroyed]
|
||||
* - (destroyed): The instance is now blank, released by React and ready for GC.
|
||||
*
|
||||
* -----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* An incrementing ID assigned to each component when it is mounted. This is
|
||||
* used to enforce the order in which `ReactUpdates` updates dirty components.
|
||||
*
|
||||
* @private
|
||||
*/
|
||||
var nextMountID = 1;
|
||||
|
||||
/**
|
||||
* @lends {ReactCompositeComponent.prototype}
|
||||
*/
|
||||
var ReactCompositeComponentMixin = {
|
||||
|
||||
/**
|
||||
* Base constructor for all composite component.
|
||||
*
|
||||
* @param {ReactElement} element
|
||||
* @final
|
||||
* @internal
|
||||
*/
|
||||
construct: function (element) {
|
||||
this._currentElement = element;
|
||||
this._rootNodeID = null;
|
||||
this._instance = null;
|
||||
|
||||
// See ReactUpdateQueue
|
||||
this._pendingElement = null;
|
||||
this._pendingStateQueue = null;
|
||||
this._pendingReplaceState = false;
|
||||
this._pendingForceUpdate = false;
|
||||
|
||||
this._renderedComponent = null;
|
||||
|
||||
this._context = null;
|
||||
this._mountOrder = 0;
|
||||
this._topLevelWrapper = null;
|
||||
|
||||
// See ReactUpdates and ReactUpdateQueue.
|
||||
this._pendingCallbacks = null;
|
||||
},
|
||||
|
||||
/**
|
||||
* Initializes the component, renders markup, and registers event listeners.
|
||||
*
|
||||
* @param {string} rootID DOM ID of the root node.
|
||||
* @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction
|
||||
* @return {?string} Rendered markup to be inserted into the DOM.
|
||||
* @final
|
||||
* @internal
|
||||
*/
|
||||
mountComponent: function (rootID, transaction, context) {
|
||||
this._context = context;
|
||||
this._mountOrder = nextMountID++;
|
||||
this._rootNodeID = rootID;
|
||||
|
||||
var publicProps = this._processProps(this._currentElement.props);
|
||||
var publicContext = this._processContext(context);
|
||||
|
||||
var Component = this._currentElement.type;
|
||||
|
||||
// Initialize the public class
|
||||
var inst;
|
||||
var renderedElement;
|
||||
|
||||
// This is a way to detect if Component is a stateless arrow function
|
||||
// component, which is not newable. It might not be 100% reliable but is
|
||||
// something we can do until we start detecting that Component extends
|
||||
// React.Component. We already assume that typeof Component === 'function'.
|
||||
var canInstantiate = ('prototype' in Component);
|
||||
|
||||
if (canInstantiate) {
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
ReactCurrentOwner.current = this;
|
||||
try {
|
||||
inst = new Component(publicProps, publicContext, ReactUpdateQueue);
|
||||
} finally {
|
||||
ReactCurrentOwner.current = null;
|
||||
}
|
||||
} else {
|
||||
inst = new Component(publicProps, publicContext, ReactUpdateQueue);
|
||||
}
|
||||
}
|
||||
|
||||
if (!canInstantiate || inst === null || inst === false || ReactElement.isValidElement(inst)) {
|
||||
renderedElement = inst;
|
||||
inst = new StatelessComponent(Component);
|
||||
}
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
// This will throw later in _renderValidatedComponent, but add an early
|
||||
// warning now to help debugging
|
||||
if (inst.render == null) {
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, '%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`, returned ' + 'null/false from a stateless component, or tried to render an ' + 'element whose type is a function that isn\'t a React component.', Component.displayName || Component.name || 'Component') : undefined;
|
||||
} else {
|
||||
// We support ES6 inheriting from React.Component, the module pattern,
|
||||
// and stateless components, but not ES6 classes that don't extend
|
||||
process.env.NODE_ENV !== 'production' ? warning(Component.prototype && Component.prototype.isReactComponent || !canInstantiate || !(inst instanceof Component), '%s(...): React component classes must extend React.Component.', Component.displayName || Component.name || 'Component') : undefined;
|
||||
}
|
||||
}
|
||||
|
||||
// These should be set up in the constructor, but as a convenience for
|
||||
// simpler class abstractions, we set them up after the fact.
|
||||
inst.props = publicProps;
|
||||
inst.context = publicContext;
|
||||
inst.refs = emptyObject;
|
||||
inst.updater = ReactUpdateQueue;
|
||||
|
||||
this._instance = inst;
|
||||
|
||||
// Store a reference from the instance back to the internal representation
|
||||
ReactInstanceMap.set(inst, this);
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
// Since plain JS classes are defined without any special initialization
|
||||
// logic, we can not catch common errors early. Therefore, we have to
|
||||
// catch them here, at initialization time, instead.
|
||||
process.env.NODE_ENV !== 'production' ? warning(!inst.getInitialState || inst.getInitialState.isReactClassApproved, 'getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?', this.getName() || 'a component') : undefined;
|
||||
process.env.NODE_ENV !== 'production' ? warning(!inst.getDefaultProps || inst.getDefaultProps.isReactClassApproved, 'getDefaultProps was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Use a static property to define defaultProps instead.', this.getName() || 'a component') : undefined;
|
||||
process.env.NODE_ENV !== 'production' ? warning(!inst.propTypes, 'propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', this.getName() || 'a component') : undefined;
|
||||
process.env.NODE_ENV !== 'production' ? warning(!inst.contextTypes, 'contextTypes was defined as an instance property on %s. Use a ' + 'static property to define contextTypes instead.', this.getName() || 'a component') : undefined;
|
||||
process.env.NODE_ENV !== 'production' ? warning(typeof inst.componentShouldUpdate !== 'function', '%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', this.getName() || 'A component') : undefined;
|
||||
process.env.NODE_ENV !== 'production' ? warning(typeof inst.componentDidUnmount !== 'function', '%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', this.getName() || 'A component') : undefined;
|
||||
process.env.NODE_ENV !== 'production' ? warning(typeof inst.componentWillRecieveProps !== 'function', '%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', this.getName() || 'A component') : undefined;
|
||||
}
|
||||
|
||||
var initialState = inst.state;
|
||||
if (initialState === undefined) {
|
||||
inst.state = initialState = null;
|
||||
}
|
||||
!(typeof initialState === 'object' && !Array.isArray(initialState)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.state: must be set to an object or null', this.getName() || 'ReactCompositeComponent') : invariant(false) : undefined;
|
||||
|
||||
this._pendingStateQueue = null;
|
||||
this._pendingReplaceState = false;
|
||||
this._pendingForceUpdate = false;
|
||||
|
||||
if (inst.componentWillMount) {
|
||||
inst.componentWillMount();
|
||||
// When mounting, calls to `setState` by `componentWillMount` will set
|
||||
// `this._pendingStateQueue` without triggering a re-render.
|
||||
if (this._pendingStateQueue) {
|
||||
inst.state = this._processPendingState(inst.props, inst.context);
|
||||
}
|
||||
}
|
||||
|
||||
// If not a stateless component, we now render
|
||||
if (renderedElement === undefined) {
|
||||
renderedElement = this._renderValidatedComponent();
|
||||
}
|
||||
|
||||
this._renderedComponent = this._instantiateReactComponent(renderedElement);
|
||||
|
||||
var markup = ReactReconciler.mountComponent(this._renderedComponent, rootID, transaction, this._processChildContext(context));
|
||||
if (inst.componentDidMount) {
|
||||
transaction.getReactMountReady().enqueue(inst.componentDidMount, inst);
|
||||
}
|
||||
|
||||
return markup;
|
||||
},
|
||||
|
||||
/**
|
||||
* Releases any resources allocated by `mountComponent`.
|
||||
*
|
||||
* @final
|
||||
* @internal
|
||||
*/
|
||||
unmountComponent: function () {
|
||||
var inst = this._instance;
|
||||
|
||||
if (inst.componentWillUnmount) {
|
||||
inst.componentWillUnmount();
|
||||
}
|
||||
|
||||
ReactReconciler.unmountComponent(this._renderedComponent);
|
||||
this._renderedComponent = null;
|
||||
this._instance = null;
|
||||
|
||||
// Reset pending fields
|
||||
// Even if this component is scheduled for another update in ReactUpdates,
|
||||
// it would still be ignored because these fields are reset.
|
||||
this._pendingStateQueue = null;
|
||||
this._pendingReplaceState = false;
|
||||
this._pendingForceUpdate = false;
|
||||
this._pendingCallbacks = null;
|
||||
this._pendingElement = null;
|
||||
|
||||
// These fields do not really need to be reset since this object is no
|
||||
// longer accessible.
|
||||
this._context = null;
|
||||
this._rootNodeID = null;
|
||||
this._topLevelWrapper = null;
|
||||
|
||||
// Delete the reference from the instance to this internal representation
|
||||
// which allow the internals to be properly cleaned up even if the user
|
||||
// leaks a reference to the public instance.
|
||||
ReactInstanceMap.remove(inst);
|
||||
|
||||
// Some existing components rely on inst.props even after they've been
|
||||
// destroyed (in event handlers).
|
||||
// TODO: inst.props = null;
|
||||
// TODO: inst.state = null;
|
||||
// TODO: inst.context = null;
|
||||
},
|
||||
|
||||
/**
|
||||
* Filters the context object to only contain keys specified in
|
||||
* `contextTypes`
|
||||
*
|
||||
* @param {object} context
|
||||
* @return {?object}
|
||||
* @private
|
||||
*/
|
||||
_maskContext: function (context) {
|
||||
var maskedContext = null;
|
||||
var Component = this._currentElement.type;
|
||||
var contextTypes = Component.contextTypes;
|
||||
if (!contextTypes) {
|
||||
return emptyObject;
|
||||
}
|
||||
maskedContext = {};
|
||||
for (var contextName in contextTypes) {
|
||||
maskedContext[contextName] = context[contextName];
|
||||
}
|
||||
return maskedContext;
|
||||
},
|
||||
|
||||
/**
|
||||
* Filters the context object to only contain keys specified in
|
||||
* `contextTypes`, and asserts that they are valid.
|
||||
*
|
||||
* @param {object} context
|
||||
* @return {?object}
|
||||
* @private
|
||||
*/
|
||||
_processContext: function (context) {
|
||||
var maskedContext = this._maskContext(context);
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
var Component = this._currentElement.type;
|
||||
if (Component.contextTypes) {
|
||||
this._checkPropTypes(Component.contextTypes, maskedContext, ReactPropTypeLocations.context);
|
||||
}
|
||||
}
|
||||
return maskedContext;
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {object} currentContext
|
||||
* @return {object}
|
||||
* @private
|
||||
*/
|
||||
_processChildContext: function (currentContext) {
|
||||
var Component = this._currentElement.type;
|
||||
var inst = this._instance;
|
||||
var childContext = inst.getChildContext && inst.getChildContext();
|
||||
if (childContext) {
|
||||
!(typeof Component.childContextTypes === 'object') ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', this.getName() || 'ReactCompositeComponent') : invariant(false) : undefined;
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
this._checkPropTypes(Component.childContextTypes, childContext, ReactPropTypeLocations.childContext);
|
||||
}
|
||||
for (var name in childContext) {
|
||||
!(name in Component.childContextTypes) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.getChildContext(): key "%s" is not defined in childContextTypes.', this.getName() || 'ReactCompositeComponent', name) : invariant(false) : undefined;
|
||||
}
|
||||
return assign({}, currentContext, childContext);
|
||||
}
|
||||
return currentContext;
|
||||
},
|
||||
|
||||
/**
|
||||
* Processes props by setting default values for unspecified props and
|
||||
* asserting that the props are valid. Does not mutate its argument; returns
|
||||
* a new props object with defaults merged in.
|
||||
*
|
||||
* @param {object} newProps
|
||||
* @return {object}
|
||||
* @private
|
||||
*/
|
||||
_processProps: function (newProps) {
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
var Component = this._currentElement.type;
|
||||
if (Component.propTypes) {
|
||||
this._checkPropTypes(Component.propTypes, newProps, ReactPropTypeLocations.prop);
|
||||
}
|
||||
}
|
||||
return newProps;
|
||||
},
|
||||
|
||||
/**
|
||||
* Assert that the props are valid
|
||||
*
|
||||
* @param {object} propTypes Map of prop name to a ReactPropType
|
||||
* @param {object} props
|
||||
* @param {string} location e.g. "prop", "context", "child context"
|
||||
* @private
|
||||
*/
|
||||
_checkPropTypes: function (propTypes, props, location) {
|
||||
// TODO: Stop validating prop types here and only use the element
|
||||
// validation.
|
||||
var componentName = this.getName();
|
||||
for (var propName in propTypes) {
|
||||
if (propTypes.hasOwnProperty(propName)) {
|
||||
var error;
|
||||
try {
|
||||
// This is intentionally an invariant that gets caught. It's the same
|
||||
// behavior as without this statement except with a better message.
|
||||
!(typeof propTypes[propName] === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s: %s type `%s` is invalid; it must be a function, usually ' + 'from React.PropTypes.', componentName || 'React class', ReactPropTypeLocationNames[location], propName) : invariant(false) : undefined;
|
||||
error = propTypes[propName](props, propName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');
|
||||
} catch (ex) {
|
||||
error = ex;
|
||||
}
|
||||
if (error instanceof Error) {
|
||||
// We may want to extend this logic for similar errors in
|
||||
// top-level render calls, so I'm abstracting it away into
|
||||
// a function to minimize refactoring in the future
|
||||
var addendum = getDeclarationErrorAddendum(this);
|
||||
|
||||
if (location === ReactPropTypeLocations.prop) {
|
||||
// Preface gives us something to blacklist in warning module
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'Failed Composite propType: %s%s', error.message, addendum) : undefined;
|
||||
} else {
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'Failed Context Types: %s%s', error.message, addendum) : undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
receiveComponent: function (nextElement, transaction, nextContext) {
|
||||
var prevElement = this._currentElement;
|
||||
var prevContext = this._context;
|
||||
|
||||
this._pendingElement = null;
|
||||
|
||||
this.updateComponent(transaction, prevElement, nextElement, prevContext, nextContext);
|
||||
},
|
||||
|
||||
/**
|
||||
* If any of `_pendingElement`, `_pendingStateQueue`, or `_pendingForceUpdate`
|
||||
* is set, update the component.
|
||||
*
|
||||
* @param {ReactReconcileTransaction} transaction
|
||||
* @internal
|
||||
*/
|
||||
performUpdateIfNecessary: function (transaction) {
|
||||
if (this._pendingElement != null) {
|
||||
ReactReconciler.receiveComponent(this, this._pendingElement || this._currentElement, transaction, this._context);
|
||||
}
|
||||
|
||||
if (this._pendingStateQueue !== null || this._pendingForceUpdate) {
|
||||
this.updateComponent(transaction, this._currentElement, this._currentElement, this._context, this._context);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Perform an update to a mounted component. The componentWillReceiveProps and
|
||||
* shouldComponentUpdate methods are called, then (assuming the update isn't
|
||||
* skipped) the remaining update lifecycle methods are called and the DOM
|
||||
* representation is updated.
|
||||
*
|
||||
* By default, this implements React's rendering and reconciliation algorithm.
|
||||
* Sophisticated clients may wish to override this.
|
||||
*
|
||||
* @param {ReactReconcileTransaction} transaction
|
||||
* @param {ReactElement} prevParentElement
|
||||
* @param {ReactElement} nextParentElement
|
||||
* @internal
|
||||
* @overridable
|
||||
*/
|
||||
updateComponent: function (transaction, prevParentElement, nextParentElement, prevUnmaskedContext, nextUnmaskedContext) {
|
||||
var inst = this._instance;
|
||||
|
||||
var nextContext = this._context === nextUnmaskedContext ? inst.context : this._processContext(nextUnmaskedContext);
|
||||
var nextProps;
|
||||
|
||||
// Distinguish between a props update versus a simple state update
|
||||
if (prevParentElement === nextParentElement) {
|
||||
// Skip checking prop types again -- we don't read inst.props to avoid
|
||||
// warning for DOM component props in this upgrade
|
||||
nextProps = nextParentElement.props;
|
||||
} else {
|
||||
nextProps = this._processProps(nextParentElement.props);
|
||||
// An update here will schedule an update but immediately set
|
||||
// _pendingStateQueue which will ensure that any state updates gets
|
||||
// immediately reconciled instead of waiting for the next batch.
|
||||
|
||||
if (inst.componentWillReceiveProps) {
|
||||
inst.componentWillReceiveProps(nextProps, nextContext);
|
||||
}
|
||||
}
|
||||
|
||||
var nextState = this._processPendingState(nextProps, nextContext);
|
||||
|
||||
var shouldUpdate = this._pendingForceUpdate || !inst.shouldComponentUpdate || inst.shouldComponentUpdate(nextProps, nextState, nextContext);
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
process.env.NODE_ENV !== 'production' ? warning(typeof shouldUpdate !== 'undefined', '%s.shouldComponentUpdate(): Returned undefined instead of a ' + 'boolean value. Make sure to return true or false.', this.getName() || 'ReactCompositeComponent') : undefined;
|
||||
}
|
||||
|
||||
if (shouldUpdate) {
|
||||
this._pendingForceUpdate = false;
|
||||
// Will set `this.props`, `this.state` and `this.context`.
|
||||
this._performComponentUpdate(nextParentElement, nextProps, nextState, nextContext, transaction, nextUnmaskedContext);
|
||||
} else {
|
||||
// If it's determined that a component should not update, we still want
|
||||
// to set props and state but we shortcut the rest of the update.
|
||||
this._currentElement = nextParentElement;
|
||||
this._context = nextUnmaskedContext;
|
||||
inst.props = nextProps;
|
||||
inst.state = nextState;
|
||||
inst.context = nextContext;
|
||||
}
|
||||
},
|
||||
|
||||
_processPendingState: function (props, context) {
|
||||
var inst = this._instance;
|
||||
var queue = this._pendingStateQueue;
|
||||
var replace = this._pendingReplaceState;
|
||||
this._pendingReplaceState = false;
|
||||
this._pendingStateQueue = null;
|
||||
|
||||
if (!queue) {
|
||||
return inst.state;
|
||||
}
|
||||
|
||||
if (replace && queue.length === 1) {
|
||||
return queue[0];
|
||||
}
|
||||
|
||||
var nextState = assign({}, replace ? queue[0] : inst.state);
|
||||
for (var i = replace ? 1 : 0; i < queue.length; i++) {
|
||||
var partial = queue[i];
|
||||
assign(nextState, typeof partial === 'function' ? partial.call(inst, nextState, props, context) : partial);
|
||||
}
|
||||
|
||||
return nextState;
|
||||
},
|
||||
|
||||
/**
|
||||
* Merges new props and state, notifies delegate methods of update and
|
||||
* performs update.
|
||||
*
|
||||
* @param {ReactElement} nextElement Next element
|
||||
* @param {object} nextProps Next public object to set as properties.
|
||||
* @param {?object} nextState Next object to set as state.
|
||||
* @param {?object} nextContext Next public object to set as context.
|
||||
* @param {ReactReconcileTransaction} transaction
|
||||
* @param {?object} unmaskedContext
|
||||
* @private
|
||||
*/
|
||||
_performComponentUpdate: function (nextElement, nextProps, nextState, nextContext, transaction, unmaskedContext) {
|
||||
var inst = this._instance;
|
||||
|
||||
var hasComponentDidUpdate = Boolean(inst.componentDidUpdate);
|
||||
var prevProps;
|
||||
var prevState;
|
||||
var prevContext;
|
||||
if (hasComponentDidUpdate) {
|
||||
prevProps = inst.props;
|
||||
prevState = inst.state;
|
||||
prevContext = inst.context;
|
||||
}
|
||||
|
||||
if (inst.componentWillUpdate) {
|
||||
inst.componentWillUpdate(nextProps, nextState, nextContext);
|
||||
}
|
||||
|
||||
this._currentElement = nextElement;
|
||||
this._context = unmaskedContext;
|
||||
inst.props = nextProps;
|
||||
inst.state = nextState;
|
||||
inst.context = nextContext;
|
||||
|
||||
this._updateRenderedComponent(transaction, unmaskedContext);
|
||||
|
||||
if (hasComponentDidUpdate) {
|
||||
transaction.getReactMountReady().enqueue(inst.componentDidUpdate.bind(inst, prevProps, prevState, prevContext), inst);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Call the component's `render` method and update the DOM accordingly.
|
||||
*
|
||||
* @param {ReactReconcileTransaction} transaction
|
||||
* @internal
|
||||
*/
|
||||
_updateRenderedComponent: function (transaction, context) {
|
||||
var prevComponentInstance = this._renderedComponent;
|
||||
var prevRenderedElement = prevComponentInstance._currentElement;
|
||||
var nextRenderedElement = this._renderValidatedComponent();
|
||||
if (shouldUpdateReactComponent(prevRenderedElement, nextRenderedElement)) {
|
||||
ReactReconciler.receiveComponent(prevComponentInstance, nextRenderedElement, transaction, this._processChildContext(context));
|
||||
} else {
|
||||
// These two IDs are actually the same! But nothing should rely on that.
|
||||
var thisID = this._rootNodeID;
|
||||
var prevComponentID = prevComponentInstance._rootNodeID;
|
||||
ReactReconciler.unmountComponent(prevComponentInstance);
|
||||
|
||||
this._renderedComponent = this._instantiateReactComponent(nextRenderedElement);
|
||||
var nextMarkup = ReactReconciler.mountComponent(this._renderedComponent, thisID, transaction, this._processChildContext(context));
|
||||
this._replaceNodeWithMarkupByID(prevComponentID, nextMarkup);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* @protected
|
||||
*/
|
||||
_replaceNodeWithMarkupByID: function (prevComponentID, nextMarkup) {
|
||||
ReactComponentEnvironment.replaceNodeWithMarkupByID(prevComponentID, nextMarkup);
|
||||
},
|
||||
|
||||
/**
|
||||
* @protected
|
||||
*/
|
||||
_renderValidatedComponentWithoutOwnerOrContext: function () {
|
||||
var inst = this._instance;
|
||||
var renderedComponent = inst.render();
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
// We allow auto-mocks to proceed as if they're returning null.
|
||||
if (typeof renderedComponent === 'undefined' && inst.render._isMockFunction) {
|
||||
// This is probably bad practice. Consider warning here and
|
||||
// deprecating this convenience.
|
||||
renderedComponent = null;
|
||||
}
|
||||
}
|
||||
|
||||
return renderedComponent;
|
||||
},
|
||||
|
||||
/**
|
||||
* @private
|
||||
*/
|
||||
_renderValidatedComponent: function () {
|
||||
var renderedComponent;
|
||||
ReactCurrentOwner.current = this;
|
||||
try {
|
||||
renderedComponent = this._renderValidatedComponentWithoutOwnerOrContext();
|
||||
} finally {
|
||||
ReactCurrentOwner.current = null;
|
||||
}
|
||||
!(
|
||||
// TODO: An `isValidNode` function would probably be more appropriate
|
||||
renderedComponent === null || renderedComponent === false || ReactElement.isValidElement(renderedComponent)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.render(): A valid ReactComponent must be returned. You may have ' + 'returned undefined, an array or some other invalid object.', this.getName() || 'ReactCompositeComponent') : invariant(false) : undefined;
|
||||
return renderedComponent;
|
||||
},
|
||||
|
||||
/**
|
||||
* Lazily allocates the refs object and stores `component` as `ref`.
|
||||
*
|
||||
* @param {string} ref Reference name.
|
||||
* @param {component} component Component to store as `ref`.
|
||||
* @final
|
||||
* @private
|
||||
*/
|
||||
attachRef: function (ref, component) {
|
||||
var inst = this.getPublicInstance();
|
||||
!(inst != null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Stateless function components cannot have refs.') : invariant(false) : undefined;
|
||||
var publicComponentInstance = component.getPublicInstance();
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
var componentName = component && component.getName ? component.getName() : 'a component';
|
||||
process.env.NODE_ENV !== 'production' ? warning(publicComponentInstance != null, 'Stateless function components cannot be given refs ' + '(See ref "%s" in %s created by %s). ' + 'Attempts to access this ref will fail.', ref, componentName, this.getName()) : undefined;
|
||||
}
|
||||
var refs = inst.refs === emptyObject ? inst.refs = {} : inst.refs;
|
||||
refs[ref] = publicComponentInstance;
|
||||
},
|
||||
|
||||
/**
|
||||
* Detaches a reference name.
|
||||
*
|
||||
* @param {string} ref Name to dereference.
|
||||
* @final
|
||||
* @private
|
||||
*/
|
||||
detachRef: function (ref) {
|
||||
var refs = this.getPublicInstance().refs;
|
||||
delete refs[ref];
|
||||
},
|
||||
|
||||
/**
|
||||
* Get a text description of the component that can be used to identify it
|
||||
* in error messages.
|
||||
* @return {string} The name or null.
|
||||
* @internal
|
||||
*/
|
||||
getName: function () {
|
||||
var type = this._currentElement.type;
|
||||
var constructor = this._instance && this._instance.constructor;
|
||||
return type.displayName || constructor && constructor.displayName || type.name || constructor && constructor.name || null;
|
||||
},
|
||||
|
||||
/**
|
||||
* Get the publicly accessible representation of this component - i.e. what
|
||||
* is exposed by refs and returned by render. Can be null for stateless
|
||||
* components.
|
||||
*
|
||||
* @return {ReactComponent} the public component instance.
|
||||
* @internal
|
||||
*/
|
||||
getPublicInstance: function () {
|
||||
var inst = this._instance;
|
||||
if (inst instanceof StatelessComponent) {
|
||||
return null;
|
||||
}
|
||||
return inst;
|
||||
},
|
||||
|
||||
// Stub
|
||||
_instantiateReactComponent: null
|
||||
|
||||
};
|
||||
|
||||
ReactPerf.measureMethods(ReactCompositeComponentMixin, 'ReactCompositeComponent', {
|
||||
mountComponent: 'mountComponent',
|
||||
updateComponent: 'updateComponent',
|
||||
_renderValidatedComponent: '_renderValidatedComponent'
|
||||
});
|
||||
|
||||
var ReactCompositeComponent = {
|
||||
|
||||
Mixin: ReactCompositeComponentMixin
|
||||
|
||||
};
|
||||
|
||||
module.exports = ReactCompositeComponent;
|
||||
30
old_major_packages/14/react/lib/ReactCurrentOwner.js
Normal file
30
old_major_packages/14/react/lib/ReactCurrentOwner.js
Normal file
@@ -0,0 +1,30 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactCurrentOwner
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Keeps track of the current owner.
|
||||
*
|
||||
* The current owner is the component who should own any components that are
|
||||
* currently being constructed.
|
||||
*/
|
||||
var ReactCurrentOwner = {
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* @type {ReactComponent}
|
||||
*/
|
||||
current: null
|
||||
|
||||
};
|
||||
|
||||
module.exports = ReactCurrentOwner;
|
||||
92
old_major_packages/14/react/lib/ReactDOM.js
Normal file
92
old_major_packages/14/react/lib/ReactDOM.js
Normal file
@@ -0,0 +1,92 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactDOM
|
||||
*/
|
||||
|
||||
/* globals __REACT_DEVTOOLS_GLOBAL_HOOK__*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ReactCurrentOwner = require('./ReactCurrentOwner');
|
||||
var ReactDOMTextComponent = require('./ReactDOMTextComponent');
|
||||
var ReactDefaultInjection = require('./ReactDefaultInjection');
|
||||
var ReactInstanceHandles = require('./ReactInstanceHandles');
|
||||
var ReactMount = require('./ReactMount');
|
||||
var ReactPerf = require('./ReactPerf');
|
||||
var ReactReconciler = require('./ReactReconciler');
|
||||
var ReactUpdates = require('./ReactUpdates');
|
||||
var ReactVersion = require('./ReactVersion');
|
||||
|
||||
var findDOMNode = require('./findDOMNode');
|
||||
var renderSubtreeIntoContainer = require('./renderSubtreeIntoContainer');
|
||||
var warning = require('fbjs/lib/warning');
|
||||
|
||||
ReactDefaultInjection.inject();
|
||||
|
||||
var render = ReactPerf.measure('React', 'render', ReactMount.render);
|
||||
|
||||
var React = {
|
||||
findDOMNode: findDOMNode,
|
||||
render: render,
|
||||
unmountComponentAtNode: ReactMount.unmountComponentAtNode,
|
||||
version: ReactVersion,
|
||||
|
||||
/* eslint-disable camelcase */
|
||||
unstable_batchedUpdates: ReactUpdates.batchedUpdates,
|
||||
unstable_renderSubtreeIntoContainer: renderSubtreeIntoContainer
|
||||
};
|
||||
|
||||
// Inject the runtime into a devtools global hook regardless of browser.
|
||||
// Allows for debugging when the hook is injected on the page.
|
||||
/* eslint-enable camelcase */
|
||||
if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject === 'function') {
|
||||
__REACT_DEVTOOLS_GLOBAL_HOOK__.inject({
|
||||
CurrentOwner: ReactCurrentOwner,
|
||||
InstanceHandles: ReactInstanceHandles,
|
||||
Mount: ReactMount,
|
||||
Reconciler: ReactReconciler,
|
||||
TextComponent: ReactDOMTextComponent
|
||||
});
|
||||
}
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
var ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');
|
||||
if (ExecutionEnvironment.canUseDOM && window.top === window.self) {
|
||||
|
||||
// First check if devtools is not installed
|
||||
if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') {
|
||||
// If we're in Chrome or Firefox, provide a download link if not installed.
|
||||
if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) {
|
||||
console.debug('Download the React DevTools for a better development experience: ' + 'https://fb.me/react-devtools');
|
||||
}
|
||||
}
|
||||
|
||||
// If we're in IE8, check to see if we are in compatibility mode and provide
|
||||
// information on preventing compatibility mode
|
||||
var ieCompatibilityMode = document.documentMode && document.documentMode < 8;
|
||||
|
||||
process.env.NODE_ENV !== 'production' ? warning(!ieCompatibilityMode, 'Internet Explorer is running in compatibility mode; please add the ' + 'following tag to your HTML to prevent this from happening: ' + '<meta http-equiv="X-UA-Compatible" content="IE=edge" />') : undefined;
|
||||
|
||||
var expectedFeatures = [
|
||||
// shims
|
||||
Array.isArray, Array.prototype.every, Array.prototype.forEach, Array.prototype.indexOf, Array.prototype.map, Date.now, Function.prototype.bind, Object.keys, String.prototype.split, String.prototype.trim,
|
||||
|
||||
// shams
|
||||
Object.create, Object.freeze];
|
||||
|
||||
for (var i = 0; i < expectedFeatures.length; i++) {
|
||||
if (!expectedFeatures[i]) {
|
||||
console.error('One or more ES5 shim/shams expected by React are not available: ' + 'https://fb.me/react-warning-polyfills');
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = React;
|
||||
12
old_major_packages/14/react/lib/ReactDOM.native.js
Normal file
12
old_major_packages/14/react/lib/ReactDOM.native.js
Normal file
@@ -0,0 +1,12 @@
|
||||
'use strict';
|
||||
|
||||
var ReactUpdates = require('./ReactUpdates');
|
||||
|
||||
// TODO: In React Native, ReactTestUtils depends on ./ReactDOM (for
|
||||
// renderIntoDocument, which should never be called) and Relay depends on
|
||||
// react-dom (for batching). Once those are fixed, nothing in RN should import
|
||||
// this module and this file can go away.
|
||||
|
||||
module.exports = {
|
||||
unstable_batchedUpdates: ReactUpdates.batchedUpdates,
|
||||
};
|
||||
50
old_major_packages/14/react/lib/ReactDOMButton.js
Normal file
50
old_major_packages/14/react/lib/ReactDOMButton.js
Normal file
@@ -0,0 +1,50 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactDOMButton
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var mouseListenerNames = {
|
||||
onClick: true,
|
||||
onDoubleClick: true,
|
||||
onMouseDown: true,
|
||||
onMouseMove: true,
|
||||
onMouseUp: true,
|
||||
|
||||
onClickCapture: true,
|
||||
onDoubleClickCapture: true,
|
||||
onMouseDownCapture: true,
|
||||
onMouseMoveCapture: true,
|
||||
onMouseUpCapture: true
|
||||
};
|
||||
|
||||
/**
|
||||
* Implements a <button> native component that does not receive mouse events
|
||||
* when `disabled` is set.
|
||||
*/
|
||||
var ReactDOMButton = {
|
||||
getNativeProps: function (inst, props, context) {
|
||||
if (!props.disabled) {
|
||||
return props;
|
||||
}
|
||||
|
||||
// Copy the props, except the mouse listeners
|
||||
var nativeProps = {};
|
||||
for (var key in props) {
|
||||
if (props.hasOwnProperty(key) && !mouseListenerNames[key]) {
|
||||
nativeProps[key] = props[key];
|
||||
}
|
||||
}
|
||||
|
||||
return nativeProps;
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = ReactDOMButton;
|
||||
962
old_major_packages/14/react/lib/ReactDOMComponent.js
Normal file
962
old_major_packages/14/react/lib/ReactDOMComponent.js
Normal file
@@ -0,0 +1,962 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactDOMComponent
|
||||
* @typechecks static-only
|
||||
*/
|
||||
|
||||
/* global hasOwnProperty:true */
|
||||
|
||||
'use strict';
|
||||
|
||||
var AutoFocusUtils = require('./AutoFocusUtils');
|
||||
var CSSPropertyOperations = require('./CSSPropertyOperations');
|
||||
var DOMProperty = require('./DOMProperty');
|
||||
var DOMPropertyOperations = require('./DOMPropertyOperations');
|
||||
var EventConstants = require('./EventConstants');
|
||||
var ReactBrowserEventEmitter = require('./ReactBrowserEventEmitter');
|
||||
var ReactComponentBrowserEnvironment = require('./ReactComponentBrowserEnvironment');
|
||||
var ReactDOMButton = require('./ReactDOMButton');
|
||||
var ReactDOMInput = require('./ReactDOMInput');
|
||||
var ReactDOMOption = require('./ReactDOMOption');
|
||||
var ReactDOMSelect = require('./ReactDOMSelect');
|
||||
var ReactDOMTextarea = require('./ReactDOMTextarea');
|
||||
var ReactMount = require('./ReactMount');
|
||||
var ReactMultiChild = require('./ReactMultiChild');
|
||||
var ReactPerf = require('./ReactPerf');
|
||||
var ReactUpdateQueue = require('./ReactUpdateQueue');
|
||||
|
||||
var assign = require('./Object.assign');
|
||||
var canDefineProperty = require('./canDefineProperty');
|
||||
var escapeTextContentForBrowser = require('./escapeTextContentForBrowser');
|
||||
var invariant = require('fbjs/lib/invariant');
|
||||
var isEventSupported = require('./isEventSupported');
|
||||
var keyOf = require('fbjs/lib/keyOf');
|
||||
var setInnerHTML = require('./setInnerHTML');
|
||||
var setTextContent = require('./setTextContent');
|
||||
var shallowEqual = require('fbjs/lib/shallowEqual');
|
||||
var validateDOMNesting = require('./validateDOMNesting');
|
||||
var warning = require('fbjs/lib/warning');
|
||||
|
||||
var deleteListener = ReactBrowserEventEmitter.deleteListener;
|
||||
var listenTo = ReactBrowserEventEmitter.listenTo;
|
||||
var registrationNameModules = ReactBrowserEventEmitter.registrationNameModules;
|
||||
|
||||
// For quickly matching children type, to test if can be treated as content.
|
||||
var CONTENT_TYPES = { 'string': true, 'number': true };
|
||||
|
||||
var CHILDREN = keyOf({ children: null });
|
||||
var STYLE = keyOf({ style: null });
|
||||
var HTML = keyOf({ __html: null });
|
||||
|
||||
var ELEMENT_NODE_TYPE = 1;
|
||||
|
||||
function getDeclarationErrorAddendum(internalInstance) {
|
||||
if (internalInstance) {
|
||||
var owner = internalInstance._currentElement._owner || null;
|
||||
if (owner) {
|
||||
var name = owner.getName();
|
||||
if (name) {
|
||||
return ' This DOM node was rendered by `' + name + '`.';
|
||||
}
|
||||
}
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
var legacyPropsDescriptor;
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
legacyPropsDescriptor = {
|
||||
props: {
|
||||
enumerable: false,
|
||||
get: function () {
|
||||
var component = this._reactInternalComponent;
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .props of a DOM node; instead, ' + 'recreate the props as `render` did originally or read the DOM ' + 'properties/attributes directly from this node (e.g., ' + 'this.refs.box.className).%s', getDeclarationErrorAddendum(component)) : undefined;
|
||||
return component._currentElement.props;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function legacyGetDOMNode() {
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
var component = this._reactInternalComponent;
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .getDOMNode() of a DOM node; ' + 'instead, use the node directly.%s', getDeclarationErrorAddendum(component)) : undefined;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
function legacyIsMounted() {
|
||||
var component = this._reactInternalComponent;
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .isMounted() of a DOM node.%s', getDeclarationErrorAddendum(component)) : undefined;
|
||||
}
|
||||
return !!component;
|
||||
}
|
||||
|
||||
function legacySetStateEtc() {
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
var component = this._reactInternalComponent;
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .setState(), .replaceState(), or ' + '.forceUpdate() of a DOM node. This is a no-op.%s', getDeclarationErrorAddendum(component)) : undefined;
|
||||
}
|
||||
}
|
||||
|
||||
function legacySetProps(partialProps, callback) {
|
||||
var component = this._reactInternalComponent;
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .setProps() of a DOM node. ' + 'Instead, call ReactDOM.render again at the top level.%s', getDeclarationErrorAddendum(component)) : undefined;
|
||||
}
|
||||
if (!component) {
|
||||
return;
|
||||
}
|
||||
ReactUpdateQueue.enqueueSetPropsInternal(component, partialProps);
|
||||
if (callback) {
|
||||
ReactUpdateQueue.enqueueCallbackInternal(component, callback);
|
||||
}
|
||||
}
|
||||
|
||||
function legacyReplaceProps(partialProps, callback) {
|
||||
var component = this._reactInternalComponent;
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .replaceProps() of a DOM node. ' + 'Instead, call ReactDOM.render again at the top level.%s', getDeclarationErrorAddendum(component)) : undefined;
|
||||
}
|
||||
if (!component) {
|
||||
return;
|
||||
}
|
||||
ReactUpdateQueue.enqueueReplacePropsInternal(component, partialProps);
|
||||
if (callback) {
|
||||
ReactUpdateQueue.enqueueCallbackInternal(component, callback);
|
||||
}
|
||||
}
|
||||
|
||||
function friendlyStringify(obj) {
|
||||
if (typeof obj === 'object') {
|
||||
if (Array.isArray(obj)) {
|
||||
return '[' + obj.map(friendlyStringify).join(', ') + ']';
|
||||
} else {
|
||||
var pairs = [];
|
||||
for (var key in obj) {
|
||||
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
||||
var keyEscaped = /^[a-z$_][\w$_]*$/i.test(key) ? key : JSON.stringify(key);
|
||||
pairs.push(keyEscaped + ': ' + friendlyStringify(obj[key]));
|
||||
}
|
||||
}
|
||||
return '{' + pairs.join(', ') + '}';
|
||||
}
|
||||
} else if (typeof obj === 'string') {
|
||||
return JSON.stringify(obj);
|
||||
} else if (typeof obj === 'function') {
|
||||
return '[function object]';
|
||||
}
|
||||
// Differs from JSON.stringify in that undefined becauses undefined and that
|
||||
// inf and nan don't become null
|
||||
return String(obj);
|
||||
}
|
||||
|
||||
var styleMutationWarning = {};
|
||||
|
||||
function checkAndWarnForMutatedStyle(style1, style2, component) {
|
||||
if (style1 == null || style2 == null) {
|
||||
return;
|
||||
}
|
||||
if (shallowEqual(style1, style2)) {
|
||||
return;
|
||||
}
|
||||
|
||||
var componentName = component._tag;
|
||||
var owner = component._currentElement._owner;
|
||||
var ownerName;
|
||||
if (owner) {
|
||||
ownerName = owner.getName();
|
||||
}
|
||||
|
||||
var hash = ownerName + '|' + componentName;
|
||||
|
||||
if (styleMutationWarning.hasOwnProperty(hash)) {
|
||||
return;
|
||||
}
|
||||
|
||||
styleMutationWarning[hash] = true;
|
||||
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, '`%s` was passed a style object that has previously been mutated. ' + 'Mutating `style` is deprecated. Consider cloning it beforehand. Check ' + 'the `render` %s. Previous style: %s. Mutated style: %s.', componentName, owner ? 'of `' + ownerName + '`' : 'using <' + componentName + '>', friendlyStringify(style1), friendlyStringify(style2)) : undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {object} component
|
||||
* @param {?object} props
|
||||
*/
|
||||
function assertValidProps(component, props) {
|
||||
if (!props) {
|
||||
return;
|
||||
}
|
||||
// Note the use of `==` which checks for null or undefined.
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
if (voidElementTags[component._tag]) {
|
||||
process.env.NODE_ENV !== 'production' ? warning(props.children == null && props.dangerouslySetInnerHTML == null, '%s is a void element tag and must not have `children` or ' + 'use `props.dangerouslySetInnerHTML`.%s', component._tag, component._currentElement._owner ? ' Check the render method of ' + component._currentElement._owner.getName() + '.' : '') : undefined;
|
||||
}
|
||||
}
|
||||
if (props.dangerouslySetInnerHTML != null) {
|
||||
!(props.children == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Can only set one of `children` or `props.dangerouslySetInnerHTML`.') : invariant(false) : undefined;
|
||||
!(typeof props.dangerouslySetInnerHTML === 'object' && HTML in props.dangerouslySetInnerHTML) ? process.env.NODE_ENV !== 'production' ? invariant(false, '`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. ' + 'Please visit https://fb.me/react-invariant-dangerously-set-inner-html ' + 'for more information.') : invariant(false) : undefined;
|
||||
}
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
process.env.NODE_ENV !== 'production' ? warning(props.innerHTML == null, 'Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.') : undefined;
|
||||
process.env.NODE_ENV !== 'production' ? warning(!props.contentEditable || props.children == null, 'A component is `contentEditable` and contains `children` managed by ' + 'React. It is now your responsibility to guarantee that none of ' + 'those nodes are unexpectedly modified or duplicated. This is ' + 'probably not intentional.') : undefined;
|
||||
}
|
||||
!(props.style == null || typeof props.style === 'object') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'The `style` prop expects a mapping from style properties to values, ' + 'not a string. For example, style={{marginRight: spacing + \'em\'}} when ' + 'using JSX.%s', getDeclarationErrorAddendum(component)) : invariant(false) : undefined;
|
||||
}
|
||||
|
||||
function enqueuePutListener(id, registrationName, listener, transaction) {
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
// IE8 has no API for event capturing and the `onScroll` event doesn't
|
||||
// bubble.
|
||||
process.env.NODE_ENV !== 'production' ? warning(registrationName !== 'onScroll' || isEventSupported('scroll', true), 'This browser doesn\'t support the `onScroll` event') : undefined;
|
||||
}
|
||||
var container = ReactMount.findReactContainerForID(id);
|
||||
if (container) {
|
||||
var doc = container.nodeType === ELEMENT_NODE_TYPE ? container.ownerDocument : container;
|
||||
listenTo(registrationName, doc);
|
||||
}
|
||||
transaction.getReactMountReady().enqueue(putListener, {
|
||||
id: id,
|
||||
registrationName: registrationName,
|
||||
listener: listener
|
||||
});
|
||||
}
|
||||
|
||||
function putListener() {
|
||||
var listenerToPut = this;
|
||||
ReactBrowserEventEmitter.putListener(listenerToPut.id, listenerToPut.registrationName, listenerToPut.listener);
|
||||
}
|
||||
|
||||
// There are so many media events, it makes sense to just
|
||||
// maintain a list rather than create a `trapBubbledEvent` for each
|
||||
var mediaEvents = {
|
||||
topAbort: 'abort',
|
||||
topCanPlay: 'canplay',
|
||||
topCanPlayThrough: 'canplaythrough',
|
||||
topDurationChange: 'durationchange',
|
||||
topEmptied: 'emptied',
|
||||
topEncrypted: 'encrypted',
|
||||
topEnded: 'ended',
|
||||
topError: 'error',
|
||||
topLoadedData: 'loadeddata',
|
||||
topLoadedMetadata: 'loadedmetadata',
|
||||
topLoadStart: 'loadstart',
|
||||
topPause: 'pause',
|
||||
topPlay: 'play',
|
||||
topPlaying: 'playing',
|
||||
topProgress: 'progress',
|
||||
topRateChange: 'ratechange',
|
||||
topSeeked: 'seeked',
|
||||
topSeeking: 'seeking',
|
||||
topStalled: 'stalled',
|
||||
topSuspend: 'suspend',
|
||||
topTimeUpdate: 'timeupdate',
|
||||
topVolumeChange: 'volumechange',
|
||||
topWaiting: 'waiting'
|
||||
};
|
||||
|
||||
function trapBubbledEventsLocal() {
|
||||
var inst = this;
|
||||
// If a component renders to null or if another component fatals and causes
|
||||
// the state of the tree to be corrupted, `node` here can be null.
|
||||
!inst._rootNodeID ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Must be mounted to trap events') : invariant(false) : undefined;
|
||||
var node = ReactMount.getNode(inst._rootNodeID);
|
||||
!node ? process.env.NODE_ENV !== 'production' ? invariant(false, 'trapBubbledEvent(...): Requires node to be rendered.') : invariant(false) : undefined;
|
||||
|
||||
switch (inst._tag) {
|
||||
case 'iframe':
|
||||
inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topLoad, 'load', node)];
|
||||
break;
|
||||
case 'video':
|
||||
case 'audio':
|
||||
|
||||
inst._wrapperState.listeners = [];
|
||||
// create listener for each media event
|
||||
for (var event in mediaEvents) {
|
||||
if (mediaEvents.hasOwnProperty(event)) {
|
||||
inst._wrapperState.listeners.push(ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes[event], mediaEvents[event], node));
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
case 'img':
|
||||
inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topError, 'error', node), ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topLoad, 'load', node)];
|
||||
break;
|
||||
case 'form':
|
||||
inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topReset, 'reset', node), ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topSubmit, 'submit', node)];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function mountReadyInputWrapper() {
|
||||
ReactDOMInput.mountReadyWrapper(this);
|
||||
}
|
||||
|
||||
function postUpdateSelectWrapper() {
|
||||
ReactDOMSelect.postUpdateWrapper(this);
|
||||
}
|
||||
|
||||
// For HTML, certain tags should omit their close tag. We keep a whitelist for
|
||||
// those special cased tags.
|
||||
|
||||
var omittedCloseTags = {
|
||||
'area': true,
|
||||
'base': true,
|
||||
'br': true,
|
||||
'col': true,
|
||||
'embed': true,
|
||||
'hr': true,
|
||||
'img': true,
|
||||
'input': true,
|
||||
'keygen': true,
|
||||
'link': true,
|
||||
'meta': true,
|
||||
'param': true,
|
||||
'source': true,
|
||||
'track': true,
|
||||
'wbr': true
|
||||
};
|
||||
|
||||
// NOTE: menuitem's close tag should be omitted, but that causes problems.
|
||||
var newlineEatingTags = {
|
||||
'listing': true,
|
||||
'pre': true,
|
||||
'textarea': true
|
||||
};
|
||||
|
||||
// For HTML, certain tags cannot have children. This has the same purpose as
|
||||
// `omittedCloseTags` except that `menuitem` should still have its closing tag.
|
||||
|
||||
var voidElementTags = assign({
|
||||
'menuitem': true
|
||||
}, omittedCloseTags);
|
||||
|
||||
// We accept any tag to be rendered but since this gets injected into arbitrary
|
||||
// HTML, we want to make sure that it's a safe tag.
|
||||
// http://www.w3.org/TR/REC-xml/#NT-Name
|
||||
|
||||
var VALID_TAG_REGEX = /^[a-zA-Z][a-zA-Z:_\.\-\d]*$/; // Simplified subset
|
||||
var validatedTagCache = {};
|
||||
var hasOwnProperty = ({}).hasOwnProperty;
|
||||
|
||||
function validateDangerousTag(tag) {
|
||||
if (!hasOwnProperty.call(validatedTagCache, tag)) {
|
||||
!VALID_TAG_REGEX.test(tag) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Invalid tag: %s', tag) : invariant(false) : undefined;
|
||||
validatedTagCache[tag] = true;
|
||||
}
|
||||
}
|
||||
|
||||
function processChildContextDev(context, inst) {
|
||||
// Pass down our tag name to child components for validation purposes
|
||||
context = assign({}, context);
|
||||
var info = context[validateDOMNesting.ancestorInfoContextKey];
|
||||
context[validateDOMNesting.ancestorInfoContextKey] = validateDOMNesting.updatedAncestorInfo(info, inst._tag, inst);
|
||||
return context;
|
||||
}
|
||||
|
||||
function isCustomComponent(tagName, props) {
|
||||
return tagName.indexOf('-') >= 0 || props.is != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new React class that is idempotent and capable of containing other
|
||||
* React components. It accepts event listeners and DOM properties that are
|
||||
* valid according to `DOMProperty`.
|
||||
*
|
||||
* - Event listeners: `onClick`, `onMouseDown`, etc.
|
||||
* - DOM properties: `className`, `name`, `title`, etc.
|
||||
*
|
||||
* The `style` property functions differently from the DOM API. It accepts an
|
||||
* object mapping of style properties to values.
|
||||
*
|
||||
* @constructor ReactDOMComponent
|
||||
* @extends ReactMultiChild
|
||||
*/
|
||||
function ReactDOMComponent(tag) {
|
||||
validateDangerousTag(tag);
|
||||
this._tag = tag.toLowerCase();
|
||||
this._renderedChildren = null;
|
||||
this._previousStyle = null;
|
||||
this._previousStyleCopy = null;
|
||||
this._rootNodeID = null;
|
||||
this._wrapperState = null;
|
||||
this._topLevelWrapper = null;
|
||||
this._nodeWithLegacyProperties = null;
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
this._unprocessedContextDev = null;
|
||||
this._processedContextDev = null;
|
||||
}
|
||||
}
|
||||
|
||||
ReactDOMComponent.displayName = 'ReactDOMComponent';
|
||||
|
||||
ReactDOMComponent.Mixin = {
|
||||
|
||||
construct: function (element) {
|
||||
this._currentElement = element;
|
||||
},
|
||||
|
||||
/**
|
||||
* Generates root tag markup then recurses. This method has side effects and
|
||||
* is not idempotent.
|
||||
*
|
||||
* @internal
|
||||
* @param {string} rootID The root DOM ID for this node.
|
||||
* @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction
|
||||
* @param {object} context
|
||||
* @return {string} The computed markup.
|
||||
*/
|
||||
mountComponent: function (rootID, transaction, context) {
|
||||
this._rootNodeID = rootID;
|
||||
|
||||
var props = this._currentElement.props;
|
||||
|
||||
switch (this._tag) {
|
||||
case 'iframe':
|
||||
case 'img':
|
||||
case 'form':
|
||||
case 'video':
|
||||
case 'audio':
|
||||
this._wrapperState = {
|
||||
listeners: null
|
||||
};
|
||||
transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this);
|
||||
break;
|
||||
case 'button':
|
||||
props = ReactDOMButton.getNativeProps(this, props, context);
|
||||
break;
|
||||
case 'input':
|
||||
ReactDOMInput.mountWrapper(this, props, context);
|
||||
props = ReactDOMInput.getNativeProps(this, props, context);
|
||||
break;
|
||||
case 'option':
|
||||
ReactDOMOption.mountWrapper(this, props, context);
|
||||
props = ReactDOMOption.getNativeProps(this, props, context);
|
||||
break;
|
||||
case 'select':
|
||||
ReactDOMSelect.mountWrapper(this, props, context);
|
||||
props = ReactDOMSelect.getNativeProps(this, props, context);
|
||||
context = ReactDOMSelect.processChildContext(this, props, context);
|
||||
break;
|
||||
case 'textarea':
|
||||
ReactDOMTextarea.mountWrapper(this, props, context);
|
||||
props = ReactDOMTextarea.getNativeProps(this, props, context);
|
||||
break;
|
||||
}
|
||||
|
||||
assertValidProps(this, props);
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
if (context[validateDOMNesting.ancestorInfoContextKey]) {
|
||||
validateDOMNesting(this._tag, this, context[validateDOMNesting.ancestorInfoContextKey]);
|
||||
}
|
||||
}
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
this._unprocessedContextDev = context;
|
||||
this._processedContextDev = processChildContextDev(context, this);
|
||||
context = this._processedContextDev;
|
||||
}
|
||||
|
||||
var mountImage;
|
||||
if (transaction.useCreateElement) {
|
||||
var ownerDocument = context[ReactMount.ownerDocumentContextKey];
|
||||
var el = ownerDocument.createElement(this._currentElement.type);
|
||||
DOMPropertyOperations.setAttributeForID(el, this._rootNodeID);
|
||||
// Populate node cache
|
||||
ReactMount.getID(el);
|
||||
this._updateDOMProperties({}, props, transaction, el);
|
||||
this._createInitialChildren(transaction, props, context, el);
|
||||
mountImage = el;
|
||||
} else {
|
||||
var tagOpen = this._createOpenTagMarkupAndPutListeners(transaction, props);
|
||||
var tagContent = this._createContentMarkup(transaction, props, context);
|
||||
if (!tagContent && omittedCloseTags[this._tag]) {
|
||||
mountImage = tagOpen + '/>';
|
||||
} else {
|
||||
mountImage = tagOpen + '>' + tagContent + '</' + this._currentElement.type + '>';
|
||||
}
|
||||
}
|
||||
|
||||
switch (this._tag) {
|
||||
case 'input':
|
||||
transaction.getReactMountReady().enqueue(mountReadyInputWrapper, this);
|
||||
// falls through
|
||||
case 'button':
|
||||
case 'select':
|
||||
case 'textarea':
|
||||
if (props.autoFocus) {
|
||||
transaction.getReactMountReady().enqueue(AutoFocusUtils.focusDOMComponent, this);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return mountImage;
|
||||
},
|
||||
|
||||
/**
|
||||
* Creates markup for the open tag and all attributes.
|
||||
*
|
||||
* This method has side effects because events get registered.
|
||||
*
|
||||
* Iterating over object properties is faster than iterating over arrays.
|
||||
* @see http://jsperf.com/obj-vs-arr-iteration
|
||||
*
|
||||
* @private
|
||||
* @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction
|
||||
* @param {object} props
|
||||
* @return {string} Markup of opening tag.
|
||||
*/
|
||||
_createOpenTagMarkupAndPutListeners: function (transaction, props) {
|
||||
var ret = '<' + this._currentElement.type;
|
||||
|
||||
for (var propKey in props) {
|
||||
if (!props.hasOwnProperty(propKey)) {
|
||||
continue;
|
||||
}
|
||||
var propValue = props[propKey];
|
||||
if (propValue == null) {
|
||||
continue;
|
||||
}
|
||||
if (registrationNameModules.hasOwnProperty(propKey)) {
|
||||
if (propValue) {
|
||||
enqueuePutListener(this._rootNodeID, propKey, propValue, transaction);
|
||||
}
|
||||
} else {
|
||||
if (propKey === STYLE) {
|
||||
if (propValue) {
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
// See `_updateDOMProperties`. style block
|
||||
this._previousStyle = propValue;
|
||||
}
|
||||
propValue = this._previousStyleCopy = assign({}, props.style);
|
||||
}
|
||||
propValue = CSSPropertyOperations.createMarkupForStyles(propValue);
|
||||
}
|
||||
var markup = null;
|
||||
if (this._tag != null && isCustomComponent(this._tag, props)) {
|
||||
if (propKey !== CHILDREN) {
|
||||
markup = DOMPropertyOperations.createMarkupForCustomAttribute(propKey, propValue);
|
||||
}
|
||||
} else {
|
||||
markup = DOMPropertyOperations.createMarkupForProperty(propKey, propValue);
|
||||
}
|
||||
if (markup) {
|
||||
ret += ' ' + markup;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// For static pages, no need to put React ID and checksum. Saves lots of
|
||||
// bytes.
|
||||
if (transaction.renderToStaticMarkup) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
var markupForID = DOMPropertyOperations.createMarkupForID(this._rootNodeID);
|
||||
return ret + ' ' + markupForID;
|
||||
},
|
||||
|
||||
/**
|
||||
* Creates markup for the content between the tags.
|
||||
*
|
||||
* @private
|
||||
* @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction
|
||||
* @param {object} props
|
||||
* @param {object} context
|
||||
* @return {string} Content markup.
|
||||
*/
|
||||
_createContentMarkup: function (transaction, props, context) {
|
||||
var ret = '';
|
||||
|
||||
// Intentional use of != to avoid catching zero/false.
|
||||
var innerHTML = props.dangerouslySetInnerHTML;
|
||||
if (innerHTML != null) {
|
||||
if (innerHTML.__html != null) {
|
||||
ret = innerHTML.__html;
|
||||
}
|
||||
} else {
|
||||
var contentToUse = CONTENT_TYPES[typeof props.children] ? props.children : null;
|
||||
var childrenToUse = contentToUse != null ? null : props.children;
|
||||
if (contentToUse != null) {
|
||||
// TODO: Validate that text is allowed as a child of this node
|
||||
ret = escapeTextContentForBrowser(contentToUse);
|
||||
} else if (childrenToUse != null) {
|
||||
var mountImages = this.mountChildren(childrenToUse, transaction, context);
|
||||
ret = mountImages.join('');
|
||||
}
|
||||
}
|
||||
if (newlineEatingTags[this._tag] && ret.charAt(0) === '\n') {
|
||||
// text/html ignores the first character in these tags if it's a newline
|
||||
// Prefer to break application/xml over text/html (for now) by adding
|
||||
// a newline specifically to get eaten by the parser. (Alternately for
|
||||
// textareas, replacing "^\n" with "\r\n" doesn't get eaten, and the first
|
||||
// \r is normalized out by HTMLTextAreaElement#value.)
|
||||
// See: <http://www.w3.org/TR/html-polyglot/#newlines-in-textarea-and-pre>
|
||||
// See: <http://www.w3.org/TR/html5/syntax.html#element-restrictions>
|
||||
// See: <http://www.w3.org/TR/html5/syntax.html#newlines>
|
||||
// See: Parsing of "textarea" "listing" and "pre" elements
|
||||
// from <http://www.w3.org/TR/html5/syntax.html#parsing-main-inbody>
|
||||
return '\n' + ret;
|
||||
} else {
|
||||
return ret;
|
||||
}
|
||||
},
|
||||
|
||||
_createInitialChildren: function (transaction, props, context, el) {
|
||||
// Intentional use of != to avoid catching zero/false.
|
||||
var innerHTML = props.dangerouslySetInnerHTML;
|
||||
if (innerHTML != null) {
|
||||
if (innerHTML.__html != null) {
|
||||
setInnerHTML(el, innerHTML.__html);
|
||||
}
|
||||
} else {
|
||||
var contentToUse = CONTENT_TYPES[typeof props.children] ? props.children : null;
|
||||
var childrenToUse = contentToUse != null ? null : props.children;
|
||||
if (contentToUse != null) {
|
||||
// TODO: Validate that text is allowed as a child of this node
|
||||
setTextContent(el, contentToUse);
|
||||
} else if (childrenToUse != null) {
|
||||
var mountImages = this.mountChildren(childrenToUse, transaction, context);
|
||||
for (var i = 0; i < mountImages.length; i++) {
|
||||
el.appendChild(mountImages[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Receives a next element and updates the component.
|
||||
*
|
||||
* @internal
|
||||
* @param {ReactElement} nextElement
|
||||
* @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction
|
||||
* @param {object} context
|
||||
*/
|
||||
receiveComponent: function (nextElement, transaction, context) {
|
||||
var prevElement = this._currentElement;
|
||||
this._currentElement = nextElement;
|
||||
this.updateComponent(transaction, prevElement, nextElement, context);
|
||||
},
|
||||
|
||||
/**
|
||||
* Updates a native DOM component after it has already been allocated and
|
||||
* attached to the DOM. Reconciles the root DOM node, then recurses.
|
||||
*
|
||||
* @param {ReactReconcileTransaction} transaction
|
||||
* @param {ReactElement} prevElement
|
||||
* @param {ReactElement} nextElement
|
||||
* @internal
|
||||
* @overridable
|
||||
*/
|
||||
updateComponent: function (transaction, prevElement, nextElement, context) {
|
||||
var lastProps = prevElement.props;
|
||||
var nextProps = this._currentElement.props;
|
||||
|
||||
switch (this._tag) {
|
||||
case 'button':
|
||||
lastProps = ReactDOMButton.getNativeProps(this, lastProps);
|
||||
nextProps = ReactDOMButton.getNativeProps(this, nextProps);
|
||||
break;
|
||||
case 'input':
|
||||
ReactDOMInput.updateWrapper(this);
|
||||
lastProps = ReactDOMInput.getNativeProps(this, lastProps);
|
||||
nextProps = ReactDOMInput.getNativeProps(this, nextProps);
|
||||
break;
|
||||
case 'option':
|
||||
lastProps = ReactDOMOption.getNativeProps(this, lastProps);
|
||||
nextProps = ReactDOMOption.getNativeProps(this, nextProps);
|
||||
break;
|
||||
case 'select':
|
||||
lastProps = ReactDOMSelect.getNativeProps(this, lastProps);
|
||||
nextProps = ReactDOMSelect.getNativeProps(this, nextProps);
|
||||
break;
|
||||
case 'textarea':
|
||||
ReactDOMTextarea.updateWrapper(this);
|
||||
lastProps = ReactDOMTextarea.getNativeProps(this, lastProps);
|
||||
nextProps = ReactDOMTextarea.getNativeProps(this, nextProps);
|
||||
break;
|
||||
}
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
// If the context is reference-equal to the old one, pass down the same
|
||||
// processed object so the update bailout in ReactReconciler behaves
|
||||
// correctly (and identically in dev and prod). See #5005.
|
||||
if (this._unprocessedContextDev !== context) {
|
||||
this._unprocessedContextDev = context;
|
||||
this._processedContextDev = processChildContextDev(context, this);
|
||||
}
|
||||
context = this._processedContextDev;
|
||||
}
|
||||
|
||||
assertValidProps(this, nextProps);
|
||||
this._updateDOMProperties(lastProps, nextProps, transaction, null);
|
||||
this._updateDOMChildren(lastProps, nextProps, transaction, context);
|
||||
|
||||
if (!canDefineProperty && this._nodeWithLegacyProperties) {
|
||||
this._nodeWithLegacyProperties.props = nextProps;
|
||||
}
|
||||
|
||||
if (this._tag === 'select') {
|
||||
// <select> value update needs to occur after <option> children
|
||||
// reconciliation
|
||||
transaction.getReactMountReady().enqueue(postUpdateSelectWrapper, this);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Reconciles the properties by detecting differences in property values and
|
||||
* updating the DOM as necessary. This function is probably the single most
|
||||
* critical path for performance optimization.
|
||||
*
|
||||
* TODO: Benchmark whether checking for changed values in memory actually
|
||||
* improves performance (especially statically positioned elements).
|
||||
* TODO: Benchmark the effects of putting this at the top since 99% of props
|
||||
* do not change for a given reconciliation.
|
||||
* TODO: Benchmark areas that can be improved with caching.
|
||||
*
|
||||
* @private
|
||||
* @param {object} lastProps
|
||||
* @param {object} nextProps
|
||||
* @param {ReactReconcileTransaction} transaction
|
||||
* @param {?DOMElement} node
|
||||
*/
|
||||
_updateDOMProperties: function (lastProps, nextProps, transaction, node) {
|
||||
var propKey;
|
||||
var styleName;
|
||||
var styleUpdates;
|
||||
for (propKey in lastProps) {
|
||||
if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey)) {
|
||||
continue;
|
||||
}
|
||||
if (propKey === STYLE) {
|
||||
var lastStyle = this._previousStyleCopy;
|
||||
for (styleName in lastStyle) {
|
||||
if (lastStyle.hasOwnProperty(styleName)) {
|
||||
styleUpdates = styleUpdates || {};
|
||||
styleUpdates[styleName] = '';
|
||||
}
|
||||
}
|
||||
this._previousStyleCopy = null;
|
||||
} else if (registrationNameModules.hasOwnProperty(propKey)) {
|
||||
if (lastProps[propKey]) {
|
||||
// Only call deleteListener if there was a listener previously or
|
||||
// else willDeleteListener gets called when there wasn't actually a
|
||||
// listener (e.g., onClick={null})
|
||||
deleteListener(this._rootNodeID, propKey);
|
||||
}
|
||||
} else if (DOMProperty.properties[propKey] || DOMProperty.isCustomAttribute(propKey)) {
|
||||
if (!node) {
|
||||
node = ReactMount.getNode(this._rootNodeID);
|
||||
}
|
||||
DOMPropertyOperations.deleteValueForProperty(node, propKey);
|
||||
}
|
||||
}
|
||||
for (propKey in nextProps) {
|
||||
var nextProp = nextProps[propKey];
|
||||
var lastProp = propKey === STYLE ? this._previousStyleCopy : lastProps[propKey];
|
||||
if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp) {
|
||||
continue;
|
||||
}
|
||||
if (propKey === STYLE) {
|
||||
if (nextProp) {
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
checkAndWarnForMutatedStyle(this._previousStyleCopy, this._previousStyle, this);
|
||||
this._previousStyle = nextProp;
|
||||
}
|
||||
nextProp = this._previousStyleCopy = assign({}, nextProp);
|
||||
} else {
|
||||
this._previousStyleCopy = null;
|
||||
}
|
||||
if (lastProp) {
|
||||
// Unset styles on `lastProp` but not on `nextProp`.
|
||||
for (styleName in lastProp) {
|
||||
if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) {
|
||||
styleUpdates = styleUpdates || {};
|
||||
styleUpdates[styleName] = '';
|
||||
}
|
||||
}
|
||||
// Update styles that changed since `lastProp`.
|
||||
for (styleName in nextProp) {
|
||||
if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) {
|
||||
styleUpdates = styleUpdates || {};
|
||||
styleUpdates[styleName] = nextProp[styleName];
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Relies on `updateStylesByID` not mutating `styleUpdates`.
|
||||
styleUpdates = nextProp;
|
||||
}
|
||||
} else if (registrationNameModules.hasOwnProperty(propKey)) {
|
||||
if (nextProp) {
|
||||
enqueuePutListener(this._rootNodeID, propKey, nextProp, transaction);
|
||||
} else if (lastProp) {
|
||||
deleteListener(this._rootNodeID, propKey);
|
||||
}
|
||||
} else if (isCustomComponent(this._tag, nextProps)) {
|
||||
if (!node) {
|
||||
node = ReactMount.getNode(this._rootNodeID);
|
||||
}
|
||||
if (propKey === CHILDREN) {
|
||||
nextProp = null;
|
||||
}
|
||||
DOMPropertyOperations.setValueForAttribute(node, propKey, nextProp);
|
||||
} else if (DOMProperty.properties[propKey] || DOMProperty.isCustomAttribute(propKey)) {
|
||||
if (!node) {
|
||||
node = ReactMount.getNode(this._rootNodeID);
|
||||
}
|
||||
// If we're updating to null or undefined, we should remove the property
|
||||
// from the DOM node instead of inadvertantly setting to a string. This
|
||||
// brings us in line with the same behavior we have on initial render.
|
||||
if (nextProp != null) {
|
||||
DOMPropertyOperations.setValueForProperty(node, propKey, nextProp);
|
||||
} else {
|
||||
DOMPropertyOperations.deleteValueForProperty(node, propKey);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (styleUpdates) {
|
||||
if (!node) {
|
||||
node = ReactMount.getNode(this._rootNodeID);
|
||||
}
|
||||
CSSPropertyOperations.setValueForStyles(node, styleUpdates);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Reconciles the children with the various properties that affect the
|
||||
* children content.
|
||||
*
|
||||
* @param {object} lastProps
|
||||
* @param {object} nextProps
|
||||
* @param {ReactReconcileTransaction} transaction
|
||||
* @param {object} context
|
||||
*/
|
||||
_updateDOMChildren: function (lastProps, nextProps, transaction, context) {
|
||||
var lastContent = CONTENT_TYPES[typeof lastProps.children] ? lastProps.children : null;
|
||||
var nextContent = CONTENT_TYPES[typeof nextProps.children] ? nextProps.children : null;
|
||||
|
||||
var lastHtml = lastProps.dangerouslySetInnerHTML && lastProps.dangerouslySetInnerHTML.__html;
|
||||
var nextHtml = nextProps.dangerouslySetInnerHTML && nextProps.dangerouslySetInnerHTML.__html;
|
||||
|
||||
// Note the use of `!=` which checks for null or undefined.
|
||||
var lastChildren = lastContent != null ? null : lastProps.children;
|
||||
var nextChildren = nextContent != null ? null : nextProps.children;
|
||||
|
||||
// If we're switching from children to content/html or vice versa, remove
|
||||
// the old content
|
||||
var lastHasContentOrHtml = lastContent != null || lastHtml != null;
|
||||
var nextHasContentOrHtml = nextContent != null || nextHtml != null;
|
||||
if (lastChildren != null && nextChildren == null) {
|
||||
this.updateChildren(null, transaction, context);
|
||||
} else if (lastHasContentOrHtml && !nextHasContentOrHtml) {
|
||||
this.updateTextContent('');
|
||||
}
|
||||
|
||||
if (nextContent != null) {
|
||||
if (lastContent !== nextContent) {
|
||||
this.updateTextContent('' + nextContent);
|
||||
}
|
||||
} else if (nextHtml != null) {
|
||||
if (lastHtml !== nextHtml) {
|
||||
this.updateMarkup('' + nextHtml);
|
||||
}
|
||||
} else if (nextChildren != null) {
|
||||
this.updateChildren(nextChildren, transaction, context);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Destroys all event registrations for this instance. Does not remove from
|
||||
* the DOM. That must be done by the parent.
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
unmountComponent: function () {
|
||||
switch (this._tag) {
|
||||
case 'iframe':
|
||||
case 'img':
|
||||
case 'form':
|
||||
case 'video':
|
||||
case 'audio':
|
||||
var listeners = this._wrapperState.listeners;
|
||||
if (listeners) {
|
||||
for (var i = 0; i < listeners.length; i++) {
|
||||
listeners[i].remove();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'input':
|
||||
ReactDOMInput.unmountWrapper(this);
|
||||
break;
|
||||
case 'html':
|
||||
case 'head':
|
||||
case 'body':
|
||||
/**
|
||||
* Components like <html> <head> and <body> can't be removed or added
|
||||
* easily in a cross-browser way, however it's valuable to be able to
|
||||
* take advantage of React's reconciliation for styling and <title>
|
||||
* management. So we just document it and throw in dangerous cases.
|
||||
*/
|
||||
!false ? process.env.NODE_ENV !== 'production' ? invariant(false, '<%s> tried to unmount. Because of cross-browser quirks it is ' + 'impossible to unmount some top-level components (eg <html>, ' + '<head>, and <body>) reliably and efficiently. To fix this, have a ' + 'single top-level component that never unmounts render these ' + 'elements.', this._tag) : invariant(false) : undefined;
|
||||
break;
|
||||
}
|
||||
|
||||
this.unmountChildren();
|
||||
ReactBrowserEventEmitter.deleteAllListeners(this._rootNodeID);
|
||||
ReactComponentBrowserEnvironment.unmountIDFromEnvironment(this._rootNodeID);
|
||||
this._rootNodeID = null;
|
||||
this._wrapperState = null;
|
||||
if (this._nodeWithLegacyProperties) {
|
||||
var node = this._nodeWithLegacyProperties;
|
||||
node._reactInternalComponent = null;
|
||||
this._nodeWithLegacyProperties = null;
|
||||
}
|
||||
},
|
||||
|
||||
getPublicInstance: function () {
|
||||
if (!this._nodeWithLegacyProperties) {
|
||||
var node = ReactMount.getNode(this._rootNodeID);
|
||||
|
||||
node._reactInternalComponent = this;
|
||||
node.getDOMNode = legacyGetDOMNode;
|
||||
node.isMounted = legacyIsMounted;
|
||||
node.setState = legacySetStateEtc;
|
||||
node.replaceState = legacySetStateEtc;
|
||||
node.forceUpdate = legacySetStateEtc;
|
||||
node.setProps = legacySetProps;
|
||||
node.replaceProps = legacyReplaceProps;
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
if (canDefineProperty) {
|
||||
Object.defineProperties(node, legacyPropsDescriptor);
|
||||
} else {
|
||||
// updateComponent will update this property on subsequent renders
|
||||
node.props = this._currentElement.props;
|
||||
}
|
||||
} else {
|
||||
// updateComponent will update this property on subsequent renders
|
||||
node.props = this._currentElement.props;
|
||||
}
|
||||
|
||||
this._nodeWithLegacyProperties = node;
|
||||
}
|
||||
return this._nodeWithLegacyProperties;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
ReactPerf.measureMethods(ReactDOMComponent, 'ReactDOMComponent', {
|
||||
mountComponent: 'mountComponent',
|
||||
updateComponent: 'updateComponent'
|
||||
});
|
||||
|
||||
assign(ReactDOMComponent.prototype, ReactDOMComponent.Mixin, ReactMultiChild.Mixin);
|
||||
|
||||
module.exports = ReactDOMComponent;
|
||||
177
old_major_packages/14/react/lib/ReactDOMFactories.js
Normal file
177
old_major_packages/14/react/lib/ReactDOMFactories.js
Normal file
@@ -0,0 +1,177 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactDOMFactories
|
||||
* @typechecks static-only
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ReactElement = require('./ReactElement');
|
||||
var ReactElementValidator = require('./ReactElementValidator');
|
||||
|
||||
var mapObject = require('fbjs/lib/mapObject');
|
||||
|
||||
/**
|
||||
* Create a factory that creates HTML tag elements.
|
||||
*
|
||||
* @param {string} tag Tag name (e.g. `div`).
|
||||
* @private
|
||||
*/
|
||||
function createDOMFactory(tag) {
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
return ReactElementValidator.createFactory(tag);
|
||||
}
|
||||
return ReactElement.createFactory(tag);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a mapping from supported HTML tags to `ReactDOMComponent` classes.
|
||||
* This is also accessible via `React.DOM`.
|
||||
*
|
||||
* @public
|
||||
*/
|
||||
var ReactDOMFactories = mapObject({
|
||||
a: 'a',
|
||||
abbr: 'abbr',
|
||||
address: 'address',
|
||||
area: 'area',
|
||||
article: 'article',
|
||||
aside: 'aside',
|
||||
audio: 'audio',
|
||||
b: 'b',
|
||||
base: 'base',
|
||||
bdi: 'bdi',
|
||||
bdo: 'bdo',
|
||||
big: 'big',
|
||||
blockquote: 'blockquote',
|
||||
body: 'body',
|
||||
br: 'br',
|
||||
button: 'button',
|
||||
canvas: 'canvas',
|
||||
caption: 'caption',
|
||||
cite: 'cite',
|
||||
code: 'code',
|
||||
col: 'col',
|
||||
colgroup: 'colgroup',
|
||||
data: 'data',
|
||||
datalist: 'datalist',
|
||||
dd: 'dd',
|
||||
del: 'del',
|
||||
details: 'details',
|
||||
dfn: 'dfn',
|
||||
dialog: 'dialog',
|
||||
div: 'div',
|
||||
dl: 'dl',
|
||||
dt: 'dt',
|
||||
em: 'em',
|
||||
embed: 'embed',
|
||||
fieldset: 'fieldset',
|
||||
figcaption: 'figcaption',
|
||||
figure: 'figure',
|
||||
footer: 'footer',
|
||||
form: 'form',
|
||||
h1: 'h1',
|
||||
h2: 'h2',
|
||||
h3: 'h3',
|
||||
h4: 'h4',
|
||||
h5: 'h5',
|
||||
h6: 'h6',
|
||||
head: 'head',
|
||||
header: 'header',
|
||||
hgroup: 'hgroup',
|
||||
hr: 'hr',
|
||||
html: 'html',
|
||||
i: 'i',
|
||||
iframe: 'iframe',
|
||||
img: 'img',
|
||||
input: 'input',
|
||||
ins: 'ins',
|
||||
kbd: 'kbd',
|
||||
keygen: 'keygen',
|
||||
label: 'label',
|
||||
legend: 'legend',
|
||||
li: 'li',
|
||||
link: 'link',
|
||||
main: 'main',
|
||||
map: 'map',
|
||||
mark: 'mark',
|
||||
menu: 'menu',
|
||||
menuitem: 'menuitem',
|
||||
meta: 'meta',
|
||||
meter: 'meter',
|
||||
nav: 'nav',
|
||||
noscript: 'noscript',
|
||||
object: 'object',
|
||||
ol: 'ol',
|
||||
optgroup: 'optgroup',
|
||||
option: 'option',
|
||||
output: 'output',
|
||||
p: 'p',
|
||||
param: 'param',
|
||||
picture: 'picture',
|
||||
pre: 'pre',
|
||||
progress: 'progress',
|
||||
q: 'q',
|
||||
rp: 'rp',
|
||||
rt: 'rt',
|
||||
ruby: 'ruby',
|
||||
s: 's',
|
||||
samp: 'samp',
|
||||
script: 'script',
|
||||
section: 'section',
|
||||
select: 'select',
|
||||
small: 'small',
|
||||
source: 'source',
|
||||
span: 'span',
|
||||
strong: 'strong',
|
||||
style: 'style',
|
||||
sub: 'sub',
|
||||
summary: 'summary',
|
||||
sup: 'sup',
|
||||
table: 'table',
|
||||
tbody: 'tbody',
|
||||
td: 'td',
|
||||
textarea: 'textarea',
|
||||
tfoot: 'tfoot',
|
||||
th: 'th',
|
||||
thead: 'thead',
|
||||
time: 'time',
|
||||
title: 'title',
|
||||
tr: 'tr',
|
||||
track: 'track',
|
||||
u: 'u',
|
||||
ul: 'ul',
|
||||
'var': 'var',
|
||||
video: 'video',
|
||||
wbr: 'wbr',
|
||||
|
||||
// SVG
|
||||
circle: 'circle',
|
||||
clipPath: 'clipPath',
|
||||
defs: 'defs',
|
||||
ellipse: 'ellipse',
|
||||
g: 'g',
|
||||
image: 'image',
|
||||
line: 'line',
|
||||
linearGradient: 'linearGradient',
|
||||
mask: 'mask',
|
||||
path: 'path',
|
||||
pattern: 'pattern',
|
||||
polygon: 'polygon',
|
||||
polyline: 'polyline',
|
||||
radialGradient: 'radialGradient',
|
||||
rect: 'rect',
|
||||
stop: 'stop',
|
||||
svg: 'svg',
|
||||
text: 'text',
|
||||
tspan: 'tspan'
|
||||
|
||||
}, createDOMFactory);
|
||||
|
||||
module.exports = ReactDOMFactories;
|
||||
18
old_major_packages/14/react/lib/ReactDOMFeatureFlags.js
Normal file
18
old_major_packages/14/react/lib/ReactDOMFeatureFlags.js
Normal file
@@ -0,0 +1,18 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactDOMFeatureFlags
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ReactDOMFeatureFlags = {
|
||||
useCreateElement: false
|
||||
};
|
||||
|
||||
module.exports = ReactDOMFeatureFlags;
|
||||
94
old_major_packages/14/react/lib/ReactDOMIDOperations.js
Normal file
94
old_major_packages/14/react/lib/ReactDOMIDOperations.js
Normal file
@@ -0,0 +1,94 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactDOMIDOperations
|
||||
* @typechecks static-only
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var DOMChildrenOperations = require('./DOMChildrenOperations');
|
||||
var DOMPropertyOperations = require('./DOMPropertyOperations');
|
||||
var ReactMount = require('./ReactMount');
|
||||
var ReactPerf = require('./ReactPerf');
|
||||
|
||||
var invariant = require('fbjs/lib/invariant');
|
||||
|
||||
/**
|
||||
* Errors for properties that should not be updated with `updatePropertyByID()`.
|
||||
*
|
||||
* @type {object}
|
||||
* @private
|
||||
*/
|
||||
var INVALID_PROPERTY_ERRORS = {
|
||||
dangerouslySetInnerHTML: '`dangerouslySetInnerHTML` must be set using `updateInnerHTMLByID()`.',
|
||||
style: '`style` must be set using `updateStylesByID()`.'
|
||||
};
|
||||
|
||||
/**
|
||||
* Operations used to process updates to DOM nodes.
|
||||
*/
|
||||
var ReactDOMIDOperations = {
|
||||
|
||||
/**
|
||||
* Updates a DOM node with new property values. This should only be used to
|
||||
* update DOM properties in `DOMProperty`.
|
||||
*
|
||||
* @param {string} id ID of the node to update.
|
||||
* @param {string} name A valid property name, see `DOMProperty`.
|
||||
* @param {*} value New value of the property.
|
||||
* @internal
|
||||
*/
|
||||
updatePropertyByID: function (id, name, value) {
|
||||
var node = ReactMount.getNode(id);
|
||||
!!INVALID_PROPERTY_ERRORS.hasOwnProperty(name) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'updatePropertyByID(...): %s', INVALID_PROPERTY_ERRORS[name]) : invariant(false) : undefined;
|
||||
|
||||
// If we're updating to null or undefined, we should remove the property
|
||||
// from the DOM node instead of inadvertantly setting to a string. This
|
||||
// brings us in line with the same behavior we have on initial render.
|
||||
if (value != null) {
|
||||
DOMPropertyOperations.setValueForProperty(node, name, value);
|
||||
} else {
|
||||
DOMPropertyOperations.deleteValueForProperty(node, name);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Replaces a DOM node that exists in the document with markup.
|
||||
*
|
||||
* @param {string} id ID of child to be replaced.
|
||||
* @param {string} markup Dangerous markup to inject in place of child.
|
||||
* @internal
|
||||
* @see {Danger.dangerouslyReplaceNodeWithMarkup}
|
||||
*/
|
||||
dangerouslyReplaceNodeWithMarkupByID: function (id, markup) {
|
||||
var node = ReactMount.getNode(id);
|
||||
DOMChildrenOperations.dangerouslyReplaceNodeWithMarkup(node, markup);
|
||||
},
|
||||
|
||||
/**
|
||||
* Updates a component's children by processing a series of updates.
|
||||
*
|
||||
* @param {array<object>} updates List of update configurations.
|
||||
* @param {array<string>} markup List of markup strings.
|
||||
* @internal
|
||||
*/
|
||||
dangerouslyProcessChildrenUpdates: function (updates, markup) {
|
||||
for (var i = 0; i < updates.length; i++) {
|
||||
updates[i].parentNode = ReactMount.getNode(updates[i].parentID);
|
||||
}
|
||||
DOMChildrenOperations.processUpdates(updates, markup);
|
||||
}
|
||||
};
|
||||
|
||||
ReactPerf.measureMethods(ReactDOMIDOperations, 'ReactDOMIDOperations', {
|
||||
dangerouslyReplaceNodeWithMarkupByID: 'dangerouslyReplaceNodeWithMarkupByID',
|
||||
dangerouslyProcessChildrenUpdates: 'dangerouslyProcessChildrenUpdates'
|
||||
});
|
||||
|
||||
module.exports = ReactDOMIDOperations;
|
||||
153
old_major_packages/14/react/lib/ReactDOMInput.js
Normal file
153
old_major_packages/14/react/lib/ReactDOMInput.js
Normal file
@@ -0,0 +1,153 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactDOMInput
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ReactDOMIDOperations = require('./ReactDOMIDOperations');
|
||||
var LinkedValueUtils = require('./LinkedValueUtils');
|
||||
var ReactMount = require('./ReactMount');
|
||||
var ReactUpdates = require('./ReactUpdates');
|
||||
|
||||
var assign = require('./Object.assign');
|
||||
var invariant = require('fbjs/lib/invariant');
|
||||
|
||||
var instancesByReactID = {};
|
||||
|
||||
function forceUpdateIfMounted() {
|
||||
if (this._rootNodeID) {
|
||||
// DOM component is still mounted; update
|
||||
ReactDOMInput.updateWrapper(this);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements an <input> native component that allows setting these optional
|
||||
* props: `checked`, `value`, `defaultChecked`, and `defaultValue`.
|
||||
*
|
||||
* If `checked` or `value` are not supplied (or null/undefined), user actions
|
||||
* that affect the checked state or value will trigger updates to the element.
|
||||
*
|
||||
* If they are supplied (and not null/undefined), the rendered element will not
|
||||
* trigger updates to the element. Instead, the props must change in order for
|
||||
* the rendered element to be updated.
|
||||
*
|
||||
* The rendered element will be initialized as unchecked (or `defaultChecked`)
|
||||
* with an empty value (or `defaultValue`).
|
||||
*
|
||||
* @see http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html
|
||||
*/
|
||||
var ReactDOMInput = {
|
||||
getNativeProps: function (inst, props, context) {
|
||||
var value = LinkedValueUtils.getValue(props);
|
||||
var checked = LinkedValueUtils.getChecked(props);
|
||||
|
||||
var nativeProps = assign({}, props, {
|
||||
defaultChecked: undefined,
|
||||
defaultValue: undefined,
|
||||
value: value != null ? value : inst._wrapperState.initialValue,
|
||||
checked: checked != null ? checked : inst._wrapperState.initialChecked,
|
||||
onChange: inst._wrapperState.onChange
|
||||
});
|
||||
|
||||
return nativeProps;
|
||||
},
|
||||
|
||||
mountWrapper: function (inst, props) {
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
LinkedValueUtils.checkPropTypes('input', props, inst._currentElement._owner);
|
||||
}
|
||||
|
||||
var defaultValue = props.defaultValue;
|
||||
inst._wrapperState = {
|
||||
initialChecked: props.defaultChecked || false,
|
||||
initialValue: defaultValue != null ? defaultValue : null,
|
||||
onChange: _handleChange.bind(inst)
|
||||
};
|
||||
},
|
||||
|
||||
mountReadyWrapper: function (inst) {
|
||||
// Can't be in mountWrapper or else server rendering leaks.
|
||||
instancesByReactID[inst._rootNodeID] = inst;
|
||||
},
|
||||
|
||||
unmountWrapper: function (inst) {
|
||||
delete instancesByReactID[inst._rootNodeID];
|
||||
},
|
||||
|
||||
updateWrapper: function (inst) {
|
||||
var props = inst._currentElement.props;
|
||||
|
||||
// TODO: Shouldn't this be getChecked(props)?
|
||||
var checked = props.checked;
|
||||
if (checked != null) {
|
||||
ReactDOMIDOperations.updatePropertyByID(inst._rootNodeID, 'checked', checked || false);
|
||||
}
|
||||
|
||||
var value = LinkedValueUtils.getValue(props);
|
||||
if (value != null) {
|
||||
// Cast `value` to a string to ensure the value is set correctly. While
|
||||
// browsers typically do this as necessary, jsdom doesn't.
|
||||
ReactDOMIDOperations.updatePropertyByID(inst._rootNodeID, 'value', '' + value);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function _handleChange(event) {
|
||||
var props = this._currentElement.props;
|
||||
|
||||
var returnValue = LinkedValueUtils.executeOnChange(props, event);
|
||||
|
||||
// Here we use asap to wait until all updates have propagated, which
|
||||
// is important when using controlled components within layers:
|
||||
// https://github.com/facebook/react/issues/1698
|
||||
ReactUpdates.asap(forceUpdateIfMounted, this);
|
||||
|
||||
var name = props.name;
|
||||
if (props.type === 'radio' && name != null) {
|
||||
var rootNode = ReactMount.getNode(this._rootNodeID);
|
||||
var queryRoot = rootNode;
|
||||
|
||||
while (queryRoot.parentNode) {
|
||||
queryRoot = queryRoot.parentNode;
|
||||
}
|
||||
|
||||
// If `rootNode.form` was non-null, then we could try `form.elements`,
|
||||
// but that sometimes behaves strangely in IE8. We could also try using
|
||||
// `form.getElementsByName`, but that will only return direct children
|
||||
// and won't include inputs that use the HTML5 `form=` attribute. Since
|
||||
// the input might not even be in a form, let's just use the global
|
||||
// `querySelectorAll` to ensure we don't miss anything.
|
||||
var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type="radio"]');
|
||||
|
||||
for (var i = 0; i < group.length; i++) {
|
||||
var otherNode = group[i];
|
||||
if (otherNode === rootNode || otherNode.form !== rootNode.form) {
|
||||
continue;
|
||||
}
|
||||
// This will throw if radio buttons rendered by different copies of React
|
||||
// and the same name are rendered into the same form (same as #1939).
|
||||
// That's probably okay; we don't support it just as we don't support
|
||||
// mixing React with non-React.
|
||||
var otherID = ReactMount.getID(otherNode);
|
||||
!otherID ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactDOMInput: Mixing React and non-React radio inputs with the ' + 'same `name` is not supported.') : invariant(false) : undefined;
|
||||
var otherInstance = instancesByReactID[otherID];
|
||||
!otherInstance ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactDOMInput: Unknown radio button ID %s.', otherID) : invariant(false) : undefined;
|
||||
// If this is a controlled radio button group, forcing the input that
|
||||
// was previously checked to update will cause it to be come re-checked
|
||||
// as appropriate.
|
||||
ReactUpdates.asap(forceUpdateIfMounted, otherInstance);
|
||||
}
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
module.exports = ReactDOMInput;
|
||||
89
old_major_packages/14/react/lib/ReactDOMOption.js
Normal file
89
old_major_packages/14/react/lib/ReactDOMOption.js
Normal file
@@ -0,0 +1,89 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactDOMOption
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ReactChildren = require('./ReactChildren');
|
||||
var ReactDOMSelect = require('./ReactDOMSelect');
|
||||
|
||||
var assign = require('./Object.assign');
|
||||
var warning = require('fbjs/lib/warning');
|
||||
|
||||
var valueContextKey = ReactDOMSelect.valueContextKey;
|
||||
|
||||
/**
|
||||
* Implements an <option> native component that warns when `selected` is set.
|
||||
*/
|
||||
var ReactDOMOption = {
|
||||
mountWrapper: function (inst, props, context) {
|
||||
// TODO (yungsters): Remove support for `selected` in <option>.
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
process.env.NODE_ENV !== 'production' ? warning(props.selected == null, 'Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.') : undefined;
|
||||
}
|
||||
|
||||
// Look up whether this option is 'selected' via context
|
||||
var selectValue = context[valueContextKey];
|
||||
|
||||
// If context key is null (e.g., no specified value or after initial mount)
|
||||
// or missing (e.g., for <datalist>), we don't change props.selected
|
||||
var selected = null;
|
||||
if (selectValue != null) {
|
||||
selected = false;
|
||||
if (Array.isArray(selectValue)) {
|
||||
// multiple
|
||||
for (var i = 0; i < selectValue.length; i++) {
|
||||
if ('' + selectValue[i] === '' + props.value) {
|
||||
selected = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
selected = '' + selectValue === '' + props.value;
|
||||
}
|
||||
}
|
||||
|
||||
inst._wrapperState = { selected: selected };
|
||||
},
|
||||
|
||||
getNativeProps: function (inst, props, context) {
|
||||
var nativeProps = assign({ selected: undefined, children: undefined }, props);
|
||||
|
||||
// Read state only from initial mount because <select> updates value
|
||||
// manually; we need the initial state only for server rendering
|
||||
if (inst._wrapperState.selected != null) {
|
||||
nativeProps.selected = inst._wrapperState.selected;
|
||||
}
|
||||
|
||||
var content = '';
|
||||
|
||||
// Flatten children and warn if they aren't strings or numbers;
|
||||
// invalid types are ignored.
|
||||
ReactChildren.forEach(props.children, function (child) {
|
||||
if (child == null) {
|
||||
return;
|
||||
}
|
||||
if (typeof child === 'string' || typeof child === 'number') {
|
||||
content += child;
|
||||
} else {
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'Only strings and numbers are supported as <option> children.') : undefined;
|
||||
}
|
||||
});
|
||||
|
||||
if (content) {
|
||||
nativeProps.children = content;
|
||||
}
|
||||
|
||||
return nativeProps;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
module.exports = ReactDOMOption;
|
||||
188
old_major_packages/14/react/lib/ReactDOMSelect.js
Normal file
188
old_major_packages/14/react/lib/ReactDOMSelect.js
Normal file
@@ -0,0 +1,188 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactDOMSelect
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var LinkedValueUtils = require('./LinkedValueUtils');
|
||||
var ReactMount = require('./ReactMount');
|
||||
var ReactUpdates = require('./ReactUpdates');
|
||||
|
||||
var assign = require('./Object.assign');
|
||||
var warning = require('fbjs/lib/warning');
|
||||
|
||||
var valueContextKey = '__ReactDOMSelect_value$' + Math.random().toString(36).slice(2);
|
||||
|
||||
function updateOptionsIfPendingUpdateAndMounted() {
|
||||
if (this._rootNodeID && this._wrapperState.pendingUpdate) {
|
||||
this._wrapperState.pendingUpdate = false;
|
||||
|
||||
var props = this._currentElement.props;
|
||||
var value = LinkedValueUtils.getValue(props);
|
||||
|
||||
if (value != null) {
|
||||
updateOptions(this, Boolean(props.multiple), value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getDeclarationErrorAddendum(owner) {
|
||||
if (owner) {
|
||||
var name = owner.getName();
|
||||
if (name) {
|
||||
return ' Check the render method of `' + name + '`.';
|
||||
}
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
var valuePropNames = ['value', 'defaultValue'];
|
||||
|
||||
/**
|
||||
* Validation function for `value` and `defaultValue`.
|
||||
* @private
|
||||
*/
|
||||
function checkSelectPropTypes(inst, props) {
|
||||
var owner = inst._currentElement._owner;
|
||||
LinkedValueUtils.checkPropTypes('select', props, owner);
|
||||
|
||||
for (var i = 0; i < valuePropNames.length; i++) {
|
||||
var propName = valuePropNames[i];
|
||||
if (props[propName] == null) {
|
||||
continue;
|
||||
}
|
||||
if (props.multiple) {
|
||||
process.env.NODE_ENV !== 'production' ? warning(Array.isArray(props[propName]), 'The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.%s', propName, getDeclarationErrorAddendum(owner)) : undefined;
|
||||
} else {
|
||||
process.env.NODE_ENV !== 'production' ? warning(!Array.isArray(props[propName]), 'The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.%s', propName, getDeclarationErrorAddendum(owner)) : undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {ReactDOMComponent} inst
|
||||
* @param {boolean} multiple
|
||||
* @param {*} propValue A stringable (with `multiple`, a list of stringables).
|
||||
* @private
|
||||
*/
|
||||
function updateOptions(inst, multiple, propValue) {
|
||||
var selectedValue, i;
|
||||
var options = ReactMount.getNode(inst._rootNodeID).options;
|
||||
|
||||
if (multiple) {
|
||||
selectedValue = {};
|
||||
for (i = 0; i < propValue.length; i++) {
|
||||
selectedValue['' + propValue[i]] = true;
|
||||
}
|
||||
for (i = 0; i < options.length; i++) {
|
||||
var selected = selectedValue.hasOwnProperty(options[i].value);
|
||||
if (options[i].selected !== selected) {
|
||||
options[i].selected = selected;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Do not set `select.value` as exact behavior isn't consistent across all
|
||||
// browsers for all cases.
|
||||
selectedValue = '' + propValue;
|
||||
for (i = 0; i < options.length; i++) {
|
||||
if (options[i].value === selectedValue) {
|
||||
options[i].selected = true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (options.length) {
|
||||
options[0].selected = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements a <select> native component that allows optionally setting the
|
||||
* props `value` and `defaultValue`. If `multiple` is false, the prop must be a
|
||||
* stringable. If `multiple` is true, the prop must be an array of stringables.
|
||||
*
|
||||
* If `value` is not supplied (or null/undefined), user actions that change the
|
||||
* selected option will trigger updates to the rendered options.
|
||||
*
|
||||
* If it is supplied (and not null/undefined), the rendered options will not
|
||||
* update in response to user actions. Instead, the `value` prop must change in
|
||||
* order for the rendered options to update.
|
||||
*
|
||||
* If `defaultValue` is provided, any options with the supplied values will be
|
||||
* selected.
|
||||
*/
|
||||
var ReactDOMSelect = {
|
||||
valueContextKey: valueContextKey,
|
||||
|
||||
getNativeProps: function (inst, props, context) {
|
||||
return assign({}, props, {
|
||||
onChange: inst._wrapperState.onChange,
|
||||
value: undefined
|
||||
});
|
||||
},
|
||||
|
||||
mountWrapper: function (inst, props) {
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
checkSelectPropTypes(inst, props);
|
||||
}
|
||||
|
||||
var value = LinkedValueUtils.getValue(props);
|
||||
inst._wrapperState = {
|
||||
pendingUpdate: false,
|
||||
initialValue: value != null ? value : props.defaultValue,
|
||||
onChange: _handleChange.bind(inst),
|
||||
wasMultiple: Boolean(props.multiple)
|
||||
};
|
||||
},
|
||||
|
||||
processChildContext: function (inst, props, context) {
|
||||
// Pass down initial value so initial generated markup has correct
|
||||
// `selected` attributes
|
||||
var childContext = assign({}, context);
|
||||
childContext[valueContextKey] = inst._wrapperState.initialValue;
|
||||
return childContext;
|
||||
},
|
||||
|
||||
postUpdateWrapper: function (inst) {
|
||||
var props = inst._currentElement.props;
|
||||
|
||||
// After the initial mount, we control selected-ness manually so don't pass
|
||||
// the context value down
|
||||
inst._wrapperState.initialValue = undefined;
|
||||
|
||||
var wasMultiple = inst._wrapperState.wasMultiple;
|
||||
inst._wrapperState.wasMultiple = Boolean(props.multiple);
|
||||
|
||||
var value = LinkedValueUtils.getValue(props);
|
||||
if (value != null) {
|
||||
inst._wrapperState.pendingUpdate = false;
|
||||
updateOptions(inst, Boolean(props.multiple), value);
|
||||
} else if (wasMultiple !== Boolean(props.multiple)) {
|
||||
// For simplicity, reapply `defaultValue` if `multiple` is toggled.
|
||||
if (props.defaultValue != null) {
|
||||
updateOptions(inst, Boolean(props.multiple), props.defaultValue);
|
||||
} else {
|
||||
// Revert the select back to its default unselected state.
|
||||
updateOptions(inst, Boolean(props.multiple), props.multiple ? [] : '');
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function _handleChange(event) {
|
||||
var props = this._currentElement.props;
|
||||
var returnValue = LinkedValueUtils.executeOnChange(props, event);
|
||||
|
||||
this._wrapperState.pendingUpdate = true;
|
||||
ReactUpdates.asap(updateOptionsIfPendingUpdateAndMounted, this);
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
module.exports = ReactDOMSelect;
|
||||
212
old_major_packages/14/react/lib/ReactDOMSelection.js
Normal file
212
old_major_packages/14/react/lib/ReactDOMSelection.js
Normal file
@@ -0,0 +1,212 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactDOMSelection
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');
|
||||
|
||||
var getNodeForCharacterOffset = require('./getNodeForCharacterOffset');
|
||||
var getTextContentAccessor = require('./getTextContentAccessor');
|
||||
|
||||
/**
|
||||
* While `isCollapsed` is available on the Selection object and `collapsed`
|
||||
* is available on the Range object, IE11 sometimes gets them wrong.
|
||||
* If the anchor/focus nodes and offsets are the same, the range is collapsed.
|
||||
*/
|
||||
function isCollapsed(anchorNode, anchorOffset, focusNode, focusOffset) {
|
||||
return anchorNode === focusNode && anchorOffset === focusOffset;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the appropriate anchor and focus node/offset pairs for IE.
|
||||
*
|
||||
* The catch here is that IE's selection API doesn't provide information
|
||||
* about whether the selection is forward or backward, so we have to
|
||||
* behave as though it's always forward.
|
||||
*
|
||||
* IE text differs from modern selection in that it behaves as though
|
||||
* block elements end with a new line. This means character offsets will
|
||||
* differ between the two APIs.
|
||||
*
|
||||
* @param {DOMElement} node
|
||||
* @return {object}
|
||||
*/
|
||||
function getIEOffsets(node) {
|
||||
var selection = document.selection;
|
||||
var selectedRange = selection.createRange();
|
||||
var selectedLength = selectedRange.text.length;
|
||||
|
||||
// Duplicate selection so we can move range without breaking user selection.
|
||||
var fromStart = selectedRange.duplicate();
|
||||
fromStart.moveToElementText(node);
|
||||
fromStart.setEndPoint('EndToStart', selectedRange);
|
||||
|
||||
var startOffset = fromStart.text.length;
|
||||
var endOffset = startOffset + selectedLength;
|
||||
|
||||
return {
|
||||
start: startOffset,
|
||||
end: endOffset
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {DOMElement} node
|
||||
* @return {?object}
|
||||
*/
|
||||
function getModernOffsets(node) {
|
||||
var selection = window.getSelection && window.getSelection();
|
||||
|
||||
if (!selection || selection.rangeCount === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
var anchorNode = selection.anchorNode;
|
||||
var anchorOffset = selection.anchorOffset;
|
||||
var focusNode = selection.focusNode;
|
||||
var focusOffset = selection.focusOffset;
|
||||
|
||||
var currentRange = selection.getRangeAt(0);
|
||||
|
||||
// In Firefox, range.startContainer and range.endContainer can be "anonymous
|
||||
// divs", e.g. the up/down buttons on an <input type="number">. Anonymous
|
||||
// divs do not seem to expose properties, triggering a "Permission denied
|
||||
// error" if any of its properties are accessed. The only seemingly possible
|
||||
// way to avoid erroring is to access a property that typically works for
|
||||
// non-anonymous divs and catch any error that may otherwise arise. See
|
||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=208427
|
||||
try {
|
||||
/* eslint-disable no-unused-expressions */
|
||||
currentRange.startContainer.nodeType;
|
||||
currentRange.endContainer.nodeType;
|
||||
/* eslint-enable no-unused-expressions */
|
||||
} catch (e) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// If the node and offset values are the same, the selection is collapsed.
|
||||
// `Selection.isCollapsed` is available natively, but IE sometimes gets
|
||||
// this value wrong.
|
||||
var isSelectionCollapsed = isCollapsed(selection.anchorNode, selection.anchorOffset, selection.focusNode, selection.focusOffset);
|
||||
|
||||
var rangeLength = isSelectionCollapsed ? 0 : currentRange.toString().length;
|
||||
|
||||
var tempRange = currentRange.cloneRange();
|
||||
tempRange.selectNodeContents(node);
|
||||
tempRange.setEnd(currentRange.startContainer, currentRange.startOffset);
|
||||
|
||||
var isTempRangeCollapsed = isCollapsed(tempRange.startContainer, tempRange.startOffset, tempRange.endContainer, tempRange.endOffset);
|
||||
|
||||
var start = isTempRangeCollapsed ? 0 : tempRange.toString().length;
|
||||
var end = start + rangeLength;
|
||||
|
||||
// Detect whether the selection is backward.
|
||||
var detectionRange = document.createRange();
|
||||
detectionRange.setStart(anchorNode, anchorOffset);
|
||||
detectionRange.setEnd(focusNode, focusOffset);
|
||||
var isBackward = detectionRange.collapsed;
|
||||
|
||||
return {
|
||||
start: isBackward ? end : start,
|
||||
end: isBackward ? start : end
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {DOMElement|DOMTextNode} node
|
||||
* @param {object} offsets
|
||||
*/
|
||||
function setIEOffsets(node, offsets) {
|
||||
var range = document.selection.createRange().duplicate();
|
||||
var start, end;
|
||||
|
||||
if (typeof offsets.end === 'undefined') {
|
||||
start = offsets.start;
|
||||
end = start;
|
||||
} else if (offsets.start > offsets.end) {
|
||||
start = offsets.end;
|
||||
end = offsets.start;
|
||||
} else {
|
||||
start = offsets.start;
|
||||
end = offsets.end;
|
||||
}
|
||||
|
||||
range.moveToElementText(node);
|
||||
range.moveStart('character', start);
|
||||
range.setEndPoint('EndToStart', range);
|
||||
range.moveEnd('character', end - start);
|
||||
range.select();
|
||||
}
|
||||
|
||||
/**
|
||||
* In modern non-IE browsers, we can support both forward and backward
|
||||
* selections.
|
||||
*
|
||||
* Note: IE10+ supports the Selection object, but it does not support
|
||||
* the `extend` method, which means that even in modern IE, it's not possible
|
||||
* to programatically create a backward selection. Thus, for all IE
|
||||
* versions, we use the old IE API to create our selections.
|
||||
*
|
||||
* @param {DOMElement|DOMTextNode} node
|
||||
* @param {object} offsets
|
||||
*/
|
||||
function setModernOffsets(node, offsets) {
|
||||
if (!window.getSelection) {
|
||||
return;
|
||||
}
|
||||
|
||||
var selection = window.getSelection();
|
||||
var length = node[getTextContentAccessor()].length;
|
||||
var start = Math.min(offsets.start, length);
|
||||
var end = typeof offsets.end === 'undefined' ? start : Math.min(offsets.end, length);
|
||||
|
||||
// IE 11 uses modern selection, but doesn't support the extend method.
|
||||
// Flip backward selections, so we can set with a single range.
|
||||
if (!selection.extend && start > end) {
|
||||
var temp = end;
|
||||
end = start;
|
||||
start = temp;
|
||||
}
|
||||
|
||||
var startMarker = getNodeForCharacterOffset(node, start);
|
||||
var endMarker = getNodeForCharacterOffset(node, end);
|
||||
|
||||
if (startMarker && endMarker) {
|
||||
var range = document.createRange();
|
||||
range.setStart(startMarker.node, startMarker.offset);
|
||||
selection.removeAllRanges();
|
||||
|
||||
if (start > end) {
|
||||
selection.addRange(range);
|
||||
selection.extend(endMarker.node, endMarker.offset);
|
||||
} else {
|
||||
range.setEnd(endMarker.node, endMarker.offset);
|
||||
selection.addRange(range);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var useIEOffsets = ExecutionEnvironment.canUseDOM && 'selection' in document && !('getSelection' in window);
|
||||
|
||||
var ReactDOMSelection = {
|
||||
/**
|
||||
* @param {DOMElement} node
|
||||
*/
|
||||
getOffsets: useIEOffsets ? getIEOffsets : getModernOffsets,
|
||||
|
||||
/**
|
||||
* @param {DOMElement|DOMTextNode} node
|
||||
* @param {object} offsets
|
||||
*/
|
||||
setOffsets: useIEOffsets ? setIEOffsets : setModernOffsets
|
||||
};
|
||||
|
||||
module.exports = ReactDOMSelection;
|
||||
26
old_major_packages/14/react/lib/ReactDOMServer.js
Normal file
26
old_major_packages/14/react/lib/ReactDOMServer.js
Normal file
@@ -0,0 +1,26 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactDOMServer
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ReactDefaultInjection = require('./ReactDefaultInjection');
|
||||
var ReactServerRendering = require('./ReactServerRendering');
|
||||
var ReactVersion = require('./ReactVersion');
|
||||
|
||||
ReactDefaultInjection.inject();
|
||||
|
||||
var ReactDOMServer = {
|
||||
renderToString: ReactServerRendering.renderToString,
|
||||
renderToStaticMarkup: ReactServerRendering.renderToStaticMarkup,
|
||||
version: ReactVersion
|
||||
};
|
||||
|
||||
module.exports = ReactDOMServer;
|
||||
127
old_major_packages/14/react/lib/ReactDOMTextComponent.js
Normal file
127
old_major_packages/14/react/lib/ReactDOMTextComponent.js
Normal file
@@ -0,0 +1,127 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactDOMTextComponent
|
||||
* @typechecks static-only
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var DOMChildrenOperations = require('./DOMChildrenOperations');
|
||||
var DOMPropertyOperations = require('./DOMPropertyOperations');
|
||||
var ReactComponentBrowserEnvironment = require('./ReactComponentBrowserEnvironment');
|
||||
var ReactMount = require('./ReactMount');
|
||||
|
||||
var assign = require('./Object.assign');
|
||||
var escapeTextContentForBrowser = require('./escapeTextContentForBrowser');
|
||||
var setTextContent = require('./setTextContent');
|
||||
var validateDOMNesting = require('./validateDOMNesting');
|
||||
|
||||
/**
|
||||
* Text nodes violate a couple assumptions that React makes about components:
|
||||
*
|
||||
* - When mounting text into the DOM, adjacent text nodes are merged.
|
||||
* - Text nodes cannot be assigned a React root ID.
|
||||
*
|
||||
* This component is used to wrap strings in elements so that they can undergo
|
||||
* the same reconciliation that is applied to elements.
|
||||
*
|
||||
* TODO: Investigate representing React components in the DOM with text nodes.
|
||||
*
|
||||
* @class ReactDOMTextComponent
|
||||
* @extends ReactComponent
|
||||
* @internal
|
||||
*/
|
||||
var ReactDOMTextComponent = function (props) {
|
||||
// This constructor and its argument is currently used by mocks.
|
||||
};
|
||||
|
||||
assign(ReactDOMTextComponent.prototype, {
|
||||
|
||||
/**
|
||||
* @param {ReactText} text
|
||||
* @internal
|
||||
*/
|
||||
construct: function (text) {
|
||||
// TODO: This is really a ReactText (ReactNode), not a ReactElement
|
||||
this._currentElement = text;
|
||||
this._stringText = '' + text;
|
||||
|
||||
// Properties
|
||||
this._rootNodeID = null;
|
||||
this._mountIndex = 0;
|
||||
},
|
||||
|
||||
/**
|
||||
* Creates the markup for this text node. This node is not intended to have
|
||||
* any features besides containing text content.
|
||||
*
|
||||
* @param {string} rootID DOM ID of the root node.
|
||||
* @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction
|
||||
* @return {string} Markup for this text node.
|
||||
* @internal
|
||||
*/
|
||||
mountComponent: function (rootID, transaction, context) {
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
if (context[validateDOMNesting.ancestorInfoContextKey]) {
|
||||
validateDOMNesting('span', null, context[validateDOMNesting.ancestorInfoContextKey]);
|
||||
}
|
||||
}
|
||||
|
||||
this._rootNodeID = rootID;
|
||||
if (transaction.useCreateElement) {
|
||||
var ownerDocument = context[ReactMount.ownerDocumentContextKey];
|
||||
var el = ownerDocument.createElement('span');
|
||||
DOMPropertyOperations.setAttributeForID(el, rootID);
|
||||
// Populate node cache
|
||||
ReactMount.getID(el);
|
||||
setTextContent(el, this._stringText);
|
||||
return el;
|
||||
} else {
|
||||
var escapedText = escapeTextContentForBrowser(this._stringText);
|
||||
|
||||
if (transaction.renderToStaticMarkup) {
|
||||
// Normally we'd wrap this in a `span` for the reasons stated above, but
|
||||
// since this is a situation where React won't take over (static pages),
|
||||
// we can simply return the text as it is.
|
||||
return escapedText;
|
||||
}
|
||||
|
||||
return '<span ' + DOMPropertyOperations.createMarkupForID(rootID) + '>' + escapedText + '</span>';
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Updates this component by updating the text content.
|
||||
*
|
||||
* @param {ReactText} nextText The next text content
|
||||
* @param {ReactReconcileTransaction} transaction
|
||||
* @internal
|
||||
*/
|
||||
receiveComponent: function (nextText, transaction) {
|
||||
if (nextText !== this._currentElement) {
|
||||
this._currentElement = nextText;
|
||||
var nextStringText = '' + nextText;
|
||||
if (nextStringText !== this._stringText) {
|
||||
// TODO: Save this as pending props and use performUpdateIfNecessary
|
||||
// and/or updateComponent to do the actual update for consistency with
|
||||
// other component types?
|
||||
this._stringText = nextStringText;
|
||||
var node = ReactMount.getNode(this._rootNodeID);
|
||||
DOMChildrenOperations.updateTextContent(node, nextStringText);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
unmountComponent: function () {
|
||||
ReactComponentBrowserEnvironment.unmountIDFromEnvironment(this._rootNodeID);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
module.exports = ReactDOMTextComponent;
|
||||
113
old_major_packages/14/react/lib/ReactDOMTextarea.js
Normal file
113
old_major_packages/14/react/lib/ReactDOMTextarea.js
Normal file
@@ -0,0 +1,113 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactDOMTextarea
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var LinkedValueUtils = require('./LinkedValueUtils');
|
||||
var ReactDOMIDOperations = require('./ReactDOMIDOperations');
|
||||
var ReactUpdates = require('./ReactUpdates');
|
||||
|
||||
var assign = require('./Object.assign');
|
||||
var invariant = require('fbjs/lib/invariant');
|
||||
var warning = require('fbjs/lib/warning');
|
||||
|
||||
function forceUpdateIfMounted() {
|
||||
if (this._rootNodeID) {
|
||||
// DOM component is still mounted; update
|
||||
ReactDOMTextarea.updateWrapper(this);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements a <textarea> native component that allows setting `value`, and
|
||||
* `defaultValue`. This differs from the traditional DOM API because value is
|
||||
* usually set as PCDATA children.
|
||||
*
|
||||
* If `value` is not supplied (or null/undefined), user actions that affect the
|
||||
* value will trigger updates to the element.
|
||||
*
|
||||
* If `value` is supplied (and not null/undefined), the rendered element will
|
||||
* not trigger updates to the element. Instead, the `value` prop must change in
|
||||
* order for the rendered element to be updated.
|
||||
*
|
||||
* The rendered element will be initialized with an empty value, the prop
|
||||
* `defaultValue` if specified, or the children content (deprecated).
|
||||
*/
|
||||
var ReactDOMTextarea = {
|
||||
getNativeProps: function (inst, props, context) {
|
||||
!(props.dangerouslySetInnerHTML == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, '`dangerouslySetInnerHTML` does not make sense on <textarea>.') : invariant(false) : undefined;
|
||||
|
||||
// Always set children to the same thing. In IE9, the selection range will
|
||||
// get reset if `textContent` is mutated.
|
||||
var nativeProps = assign({}, props, {
|
||||
defaultValue: undefined,
|
||||
value: undefined,
|
||||
children: inst._wrapperState.initialValue,
|
||||
onChange: inst._wrapperState.onChange
|
||||
});
|
||||
|
||||
return nativeProps;
|
||||
},
|
||||
|
||||
mountWrapper: function (inst, props) {
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
LinkedValueUtils.checkPropTypes('textarea', props, inst._currentElement._owner);
|
||||
}
|
||||
|
||||
var defaultValue = props.defaultValue;
|
||||
// TODO (yungsters): Remove support for children content in <textarea>.
|
||||
var children = props.children;
|
||||
if (children != null) {
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.') : undefined;
|
||||
}
|
||||
!(defaultValue == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'If you supply `defaultValue` on a <textarea>, do not pass children.') : invariant(false) : undefined;
|
||||
if (Array.isArray(children)) {
|
||||
!(children.length <= 1) ? process.env.NODE_ENV !== 'production' ? invariant(false, '<textarea> can only have at most one child.') : invariant(false) : undefined;
|
||||
children = children[0];
|
||||
}
|
||||
|
||||
defaultValue = '' + children;
|
||||
}
|
||||
if (defaultValue == null) {
|
||||
defaultValue = '';
|
||||
}
|
||||
var value = LinkedValueUtils.getValue(props);
|
||||
|
||||
inst._wrapperState = {
|
||||
// We save the initial value so that `ReactDOMComponent` doesn't update
|
||||
// `textContent` (unnecessary since we update value).
|
||||
// The initial value can be a boolean or object so that's why it's
|
||||
// forced to be a string.
|
||||
initialValue: '' + (value != null ? value : defaultValue),
|
||||
onChange: _handleChange.bind(inst)
|
||||
};
|
||||
},
|
||||
|
||||
updateWrapper: function (inst) {
|
||||
var props = inst._currentElement.props;
|
||||
var value = LinkedValueUtils.getValue(props);
|
||||
if (value != null) {
|
||||
// Cast `value` to a string to ensure the value is set correctly. While
|
||||
// browsers typically do this as necessary, jsdom doesn't.
|
||||
ReactDOMIDOperations.updatePropertyByID(inst._rootNodeID, 'value', '' + value);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function _handleChange(event) {
|
||||
var props = this._currentElement.props;
|
||||
var returnValue = LinkedValueUtils.executeOnChange(props, event);
|
||||
ReactUpdates.asap(forceUpdateIfMounted, this);
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
module.exports = ReactDOMTextarea;
|
||||
@@ -0,0 +1,67 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactDefaultBatchingStrategy
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ReactUpdates = require('./ReactUpdates');
|
||||
var Transaction = require('./Transaction');
|
||||
|
||||
var assign = require('./Object.assign');
|
||||
var emptyFunction = require('fbjs/lib/emptyFunction');
|
||||
|
||||
var RESET_BATCHED_UPDATES = {
|
||||
initialize: emptyFunction,
|
||||
close: function () {
|
||||
ReactDefaultBatchingStrategy.isBatchingUpdates = false;
|
||||
}
|
||||
};
|
||||
|
||||
var FLUSH_BATCHED_UPDATES = {
|
||||
initialize: emptyFunction,
|
||||
close: ReactUpdates.flushBatchedUpdates.bind(ReactUpdates)
|
||||
};
|
||||
|
||||
var TRANSACTION_WRAPPERS = [FLUSH_BATCHED_UPDATES, RESET_BATCHED_UPDATES];
|
||||
|
||||
function ReactDefaultBatchingStrategyTransaction() {
|
||||
this.reinitializeTransaction();
|
||||
}
|
||||
|
||||
assign(ReactDefaultBatchingStrategyTransaction.prototype, Transaction.Mixin, {
|
||||
getTransactionWrappers: function () {
|
||||
return TRANSACTION_WRAPPERS;
|
||||
}
|
||||
});
|
||||
|
||||
var transaction = new ReactDefaultBatchingStrategyTransaction();
|
||||
|
||||
var ReactDefaultBatchingStrategy = {
|
||||
isBatchingUpdates: false,
|
||||
|
||||
/**
|
||||
* Call the provided function in a context within which calls to `setState`
|
||||
* and friends are batched such that components aren't updated unnecessarily.
|
||||
*/
|
||||
batchedUpdates: function (callback, a, b, c, d, e) {
|
||||
var alreadyBatchingUpdates = ReactDefaultBatchingStrategy.isBatchingUpdates;
|
||||
|
||||
ReactDefaultBatchingStrategy.isBatchingUpdates = true;
|
||||
|
||||
// The code is written this way to avoid extra allocations
|
||||
if (alreadyBatchingUpdates) {
|
||||
callback(a, b, c, d, e);
|
||||
} else {
|
||||
transaction.perform(callback, null, a, b, c, d, e);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = ReactDefaultBatchingStrategy;
|
||||
97
old_major_packages/14/react/lib/ReactDefaultInjection.js
Normal file
97
old_major_packages/14/react/lib/ReactDefaultInjection.js
Normal file
@@ -0,0 +1,97 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactDefaultInjection
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var BeforeInputEventPlugin = require('./BeforeInputEventPlugin');
|
||||
var ChangeEventPlugin = require('./ChangeEventPlugin');
|
||||
var ClientReactRootIndex = require('./ClientReactRootIndex');
|
||||
var DefaultEventPluginOrder = require('./DefaultEventPluginOrder');
|
||||
var EnterLeaveEventPlugin = require('./EnterLeaveEventPlugin');
|
||||
var ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');
|
||||
var HTMLDOMPropertyConfig = require('./HTMLDOMPropertyConfig');
|
||||
var ReactBrowserComponentMixin = require('./ReactBrowserComponentMixin');
|
||||
var ReactComponentBrowserEnvironment = require('./ReactComponentBrowserEnvironment');
|
||||
var ReactDefaultBatchingStrategy = require('./ReactDefaultBatchingStrategy');
|
||||
var ReactDOMComponent = require('./ReactDOMComponent');
|
||||
var ReactDOMTextComponent = require('./ReactDOMTextComponent');
|
||||
var ReactEventListener = require('./ReactEventListener');
|
||||
var ReactInjection = require('./ReactInjection');
|
||||
var ReactInstanceHandles = require('./ReactInstanceHandles');
|
||||
var ReactMount = require('./ReactMount');
|
||||
var ReactReconcileTransaction = require('./ReactReconcileTransaction');
|
||||
var SelectEventPlugin = require('./SelectEventPlugin');
|
||||
var ServerReactRootIndex = require('./ServerReactRootIndex');
|
||||
var SimpleEventPlugin = require('./SimpleEventPlugin');
|
||||
var SVGDOMPropertyConfig = require('./SVGDOMPropertyConfig');
|
||||
|
||||
var alreadyInjected = false;
|
||||
|
||||
function inject() {
|
||||
if (alreadyInjected) {
|
||||
// TODO: This is currently true because these injections are shared between
|
||||
// the client and the server package. They should be built independently
|
||||
// and not share any injection state. Then this problem will be solved.
|
||||
return;
|
||||
}
|
||||
alreadyInjected = true;
|
||||
|
||||
ReactInjection.EventEmitter.injectReactEventListener(ReactEventListener);
|
||||
|
||||
/**
|
||||
* Inject modules for resolving DOM hierarchy and plugin ordering.
|
||||
*/
|
||||
ReactInjection.EventPluginHub.injectEventPluginOrder(DefaultEventPluginOrder);
|
||||
ReactInjection.EventPluginHub.injectInstanceHandle(ReactInstanceHandles);
|
||||
ReactInjection.EventPluginHub.injectMount(ReactMount);
|
||||
|
||||
/**
|
||||
* Some important event plugins included by default (without having to require
|
||||
* them).
|
||||
*/
|
||||
ReactInjection.EventPluginHub.injectEventPluginsByName({
|
||||
SimpleEventPlugin: SimpleEventPlugin,
|
||||
EnterLeaveEventPlugin: EnterLeaveEventPlugin,
|
||||
ChangeEventPlugin: ChangeEventPlugin,
|
||||
SelectEventPlugin: SelectEventPlugin,
|
||||
BeforeInputEventPlugin: BeforeInputEventPlugin
|
||||
});
|
||||
|
||||
ReactInjection.NativeComponent.injectGenericComponentClass(ReactDOMComponent);
|
||||
|
||||
ReactInjection.NativeComponent.injectTextComponentClass(ReactDOMTextComponent);
|
||||
|
||||
ReactInjection.Class.injectMixin(ReactBrowserComponentMixin);
|
||||
|
||||
ReactInjection.DOMProperty.injectDOMPropertyConfig(HTMLDOMPropertyConfig);
|
||||
ReactInjection.DOMProperty.injectDOMPropertyConfig(SVGDOMPropertyConfig);
|
||||
|
||||
ReactInjection.EmptyComponent.injectEmptyComponent('noscript');
|
||||
|
||||
ReactInjection.Updates.injectReconcileTransaction(ReactReconcileTransaction);
|
||||
ReactInjection.Updates.injectBatchingStrategy(ReactDefaultBatchingStrategy);
|
||||
|
||||
ReactInjection.RootIndex.injectCreateReactRootIndex(ExecutionEnvironment.canUseDOM ? ClientReactRootIndex.createReactRootIndex : ServerReactRootIndex.createReactRootIndex);
|
||||
|
||||
ReactInjection.Component.injectEnvironment(ReactComponentBrowserEnvironment);
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
var url = ExecutionEnvironment.canUseDOM && window.location.href || '';
|
||||
if (/[?&]react_perf\b/.test(url)) {
|
||||
var ReactDefaultPerf = require('./ReactDefaultPerf');
|
||||
ReactDefaultPerf.start();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
inject: inject
|
||||
};
|
||||
237
old_major_packages/14/react/lib/ReactDefaultPerf.js
Normal file
237
old_major_packages/14/react/lib/ReactDefaultPerf.js
Normal file
@@ -0,0 +1,237 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactDefaultPerf
|
||||
* @typechecks static-only
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var DOMProperty = require('./DOMProperty');
|
||||
var ReactDefaultPerfAnalysis = require('./ReactDefaultPerfAnalysis');
|
||||
var ReactMount = require('./ReactMount');
|
||||
var ReactPerf = require('./ReactPerf');
|
||||
|
||||
var performanceNow = require('fbjs/lib/performanceNow');
|
||||
|
||||
function roundFloat(val) {
|
||||
return Math.floor(val * 100) / 100;
|
||||
}
|
||||
|
||||
function addValue(obj, key, val) {
|
||||
obj[key] = (obj[key] || 0) + val;
|
||||
}
|
||||
|
||||
var ReactDefaultPerf = {
|
||||
_allMeasurements: [], // last item in the list is the current one
|
||||
_mountStack: [0],
|
||||
_injected: false,
|
||||
|
||||
start: function () {
|
||||
if (!ReactDefaultPerf._injected) {
|
||||
ReactPerf.injection.injectMeasure(ReactDefaultPerf.measure);
|
||||
}
|
||||
|
||||
ReactDefaultPerf._allMeasurements.length = 0;
|
||||
ReactPerf.enableMeasure = true;
|
||||
},
|
||||
|
||||
stop: function () {
|
||||
ReactPerf.enableMeasure = false;
|
||||
},
|
||||
|
||||
getLastMeasurements: function () {
|
||||
return ReactDefaultPerf._allMeasurements;
|
||||
},
|
||||
|
||||
printExclusive: function (measurements) {
|
||||
measurements = measurements || ReactDefaultPerf._allMeasurements;
|
||||
var summary = ReactDefaultPerfAnalysis.getExclusiveSummary(measurements);
|
||||
console.table(summary.map(function (item) {
|
||||
return {
|
||||
'Component class name': item.componentName,
|
||||
'Total inclusive time (ms)': roundFloat(item.inclusive),
|
||||
'Exclusive mount time (ms)': roundFloat(item.exclusive),
|
||||
'Exclusive render time (ms)': roundFloat(item.render),
|
||||
'Mount time per instance (ms)': roundFloat(item.exclusive / item.count),
|
||||
'Render time per instance (ms)': roundFloat(item.render / item.count),
|
||||
'Instances': item.count
|
||||
};
|
||||
}));
|
||||
// TODO: ReactDefaultPerfAnalysis.getTotalTime() does not return the correct
|
||||
// number.
|
||||
},
|
||||
|
||||
printInclusive: function (measurements) {
|
||||
measurements = measurements || ReactDefaultPerf._allMeasurements;
|
||||
var summary = ReactDefaultPerfAnalysis.getInclusiveSummary(measurements);
|
||||
console.table(summary.map(function (item) {
|
||||
return {
|
||||
'Owner > component': item.componentName,
|
||||
'Inclusive time (ms)': roundFloat(item.time),
|
||||
'Instances': item.count
|
||||
};
|
||||
}));
|
||||
console.log('Total time:', ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms');
|
||||
},
|
||||
|
||||
getMeasurementsSummaryMap: function (measurements) {
|
||||
var summary = ReactDefaultPerfAnalysis.getInclusiveSummary(measurements, true);
|
||||
return summary.map(function (item) {
|
||||
return {
|
||||
'Owner > component': item.componentName,
|
||||
'Wasted time (ms)': item.time,
|
||||
'Instances': item.count
|
||||
};
|
||||
});
|
||||
},
|
||||
|
||||
printWasted: function (measurements) {
|
||||
measurements = measurements || ReactDefaultPerf._allMeasurements;
|
||||
console.table(ReactDefaultPerf.getMeasurementsSummaryMap(measurements));
|
||||
console.log('Total time:', ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms');
|
||||
},
|
||||
|
||||
printDOM: function (measurements) {
|
||||
measurements = measurements || ReactDefaultPerf._allMeasurements;
|
||||
var summary = ReactDefaultPerfAnalysis.getDOMSummary(measurements);
|
||||
console.table(summary.map(function (item) {
|
||||
var result = {};
|
||||
result[DOMProperty.ID_ATTRIBUTE_NAME] = item.id;
|
||||
result.type = item.type;
|
||||
result.args = JSON.stringify(item.args);
|
||||
return result;
|
||||
}));
|
||||
console.log('Total time:', ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms');
|
||||
},
|
||||
|
||||
_recordWrite: function (id, fnName, totalTime, args) {
|
||||
// TODO: totalTime isn't that useful since it doesn't count paints/reflows
|
||||
var writes = ReactDefaultPerf._allMeasurements[ReactDefaultPerf._allMeasurements.length - 1].writes;
|
||||
writes[id] = writes[id] || [];
|
||||
writes[id].push({
|
||||
type: fnName,
|
||||
time: totalTime,
|
||||
args: args
|
||||
});
|
||||
},
|
||||
|
||||
measure: function (moduleName, fnName, func) {
|
||||
return function () {
|
||||
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
||||
args[_key] = arguments[_key];
|
||||
}
|
||||
|
||||
var totalTime;
|
||||
var rv;
|
||||
var start;
|
||||
|
||||
if (fnName === '_renderNewRootComponent' || fnName === 'flushBatchedUpdates') {
|
||||
// A "measurement" is a set of metrics recorded for each flush. We want
|
||||
// to group the metrics for a given flush together so we can look at the
|
||||
// components that rendered and the DOM operations that actually
|
||||
// happened to determine the amount of "wasted work" performed.
|
||||
ReactDefaultPerf._allMeasurements.push({
|
||||
exclusive: {},
|
||||
inclusive: {},
|
||||
render: {},
|
||||
counts: {},
|
||||
writes: {},
|
||||
displayNames: {},
|
||||
totalTime: 0,
|
||||
created: {}
|
||||
});
|
||||
start = performanceNow();
|
||||
rv = func.apply(this, args);
|
||||
ReactDefaultPerf._allMeasurements[ReactDefaultPerf._allMeasurements.length - 1].totalTime = performanceNow() - start;
|
||||
return rv;
|
||||
} else if (fnName === '_mountImageIntoNode' || moduleName === 'ReactBrowserEventEmitter' || moduleName === 'ReactDOMIDOperations' || moduleName === 'CSSPropertyOperations' || moduleName === 'DOMChildrenOperations' || moduleName === 'DOMPropertyOperations') {
|
||||
start = performanceNow();
|
||||
rv = func.apply(this, args);
|
||||
totalTime = performanceNow() - start;
|
||||
|
||||
if (fnName === '_mountImageIntoNode') {
|
||||
var mountID = ReactMount.getID(args[1]);
|
||||
ReactDefaultPerf._recordWrite(mountID, fnName, totalTime, args[0]);
|
||||
} else if (fnName === 'dangerouslyProcessChildrenUpdates') {
|
||||
// special format
|
||||
args[0].forEach(function (update) {
|
||||
var writeArgs = {};
|
||||
if (update.fromIndex !== null) {
|
||||
writeArgs.fromIndex = update.fromIndex;
|
||||
}
|
||||
if (update.toIndex !== null) {
|
||||
writeArgs.toIndex = update.toIndex;
|
||||
}
|
||||
if (update.textContent !== null) {
|
||||
writeArgs.textContent = update.textContent;
|
||||
}
|
||||
if (update.markupIndex !== null) {
|
||||
writeArgs.markup = args[1][update.markupIndex];
|
||||
}
|
||||
ReactDefaultPerf._recordWrite(update.parentID, update.type, totalTime, writeArgs);
|
||||
});
|
||||
} else {
|
||||
// basic format
|
||||
var id = args[0];
|
||||
if (typeof id === 'object') {
|
||||
id = ReactMount.getID(args[0]);
|
||||
}
|
||||
ReactDefaultPerf._recordWrite(id, fnName, totalTime, Array.prototype.slice.call(args, 1));
|
||||
}
|
||||
return rv;
|
||||
} else if (moduleName === 'ReactCompositeComponent' && (fnName === 'mountComponent' || fnName === 'updateComponent' || // TODO: receiveComponent()?
|
||||
fnName === '_renderValidatedComponent')) {
|
||||
|
||||
if (this._currentElement.type === ReactMount.TopLevelWrapper) {
|
||||
return func.apply(this, args);
|
||||
}
|
||||
|
||||
var rootNodeID = fnName === 'mountComponent' ? args[0] : this._rootNodeID;
|
||||
var isRender = fnName === '_renderValidatedComponent';
|
||||
var isMount = fnName === 'mountComponent';
|
||||
|
||||
var mountStack = ReactDefaultPerf._mountStack;
|
||||
var entry = ReactDefaultPerf._allMeasurements[ReactDefaultPerf._allMeasurements.length - 1];
|
||||
|
||||
if (isRender) {
|
||||
addValue(entry.counts, rootNodeID, 1);
|
||||
} else if (isMount) {
|
||||
entry.created[rootNodeID] = true;
|
||||
mountStack.push(0);
|
||||
}
|
||||
|
||||
start = performanceNow();
|
||||
rv = func.apply(this, args);
|
||||
totalTime = performanceNow() - start;
|
||||
|
||||
if (isRender) {
|
||||
addValue(entry.render, rootNodeID, totalTime);
|
||||
} else if (isMount) {
|
||||
var subMountTime = mountStack.pop();
|
||||
mountStack[mountStack.length - 1] += totalTime;
|
||||
addValue(entry.exclusive, rootNodeID, totalTime - subMountTime);
|
||||
addValue(entry.inclusive, rootNodeID, totalTime);
|
||||
} else {
|
||||
addValue(entry.inclusive, rootNodeID, totalTime);
|
||||
}
|
||||
|
||||
entry.displayNames[rootNodeID] = {
|
||||
current: this.getName(),
|
||||
owner: this._currentElement._owner ? this._currentElement._owner.getName() : '<root>'
|
||||
};
|
||||
|
||||
return rv;
|
||||
} else {
|
||||
return func.apply(this, args);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = ReactDefaultPerf;
|
||||
201
old_major_packages/14/react/lib/ReactDefaultPerfAnalysis.js
Normal file
201
old_major_packages/14/react/lib/ReactDefaultPerfAnalysis.js
Normal file
@@ -0,0 +1,201 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactDefaultPerfAnalysis
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var assign = require('./Object.assign');
|
||||
|
||||
// Don't try to save users less than 1.2ms (a number I made up)
|
||||
var DONT_CARE_THRESHOLD = 1.2;
|
||||
var DOM_OPERATION_TYPES = {
|
||||
'_mountImageIntoNode': 'set innerHTML',
|
||||
INSERT_MARKUP: 'set innerHTML',
|
||||
MOVE_EXISTING: 'move',
|
||||
REMOVE_NODE: 'remove',
|
||||
SET_MARKUP: 'set innerHTML',
|
||||
TEXT_CONTENT: 'set textContent',
|
||||
'setValueForProperty': 'update attribute',
|
||||
'setValueForAttribute': 'update attribute',
|
||||
'deleteValueForProperty': 'remove attribute',
|
||||
'setValueForStyles': 'update styles',
|
||||
'replaceNodeWithMarkup': 'replace',
|
||||
'updateTextContent': 'set textContent'
|
||||
};
|
||||
|
||||
function getTotalTime(measurements) {
|
||||
// TODO: return number of DOM ops? could be misleading.
|
||||
// TODO: measure dropped frames after reconcile?
|
||||
// TODO: log total time of each reconcile and the top-level component
|
||||
// class that triggered it.
|
||||
var totalTime = 0;
|
||||
for (var i = 0; i < measurements.length; i++) {
|
||||
var measurement = measurements[i];
|
||||
totalTime += measurement.totalTime;
|
||||
}
|
||||
return totalTime;
|
||||
}
|
||||
|
||||
function getDOMSummary(measurements) {
|
||||
var items = [];
|
||||
measurements.forEach(function (measurement) {
|
||||
Object.keys(measurement.writes).forEach(function (id) {
|
||||
measurement.writes[id].forEach(function (write) {
|
||||
items.push({
|
||||
id: id,
|
||||
type: DOM_OPERATION_TYPES[write.type] || write.type,
|
||||
args: write.args
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
return items;
|
||||
}
|
||||
|
||||
function getExclusiveSummary(measurements) {
|
||||
var candidates = {};
|
||||
var displayName;
|
||||
|
||||
for (var i = 0; i < measurements.length; i++) {
|
||||
var measurement = measurements[i];
|
||||
var allIDs = assign({}, measurement.exclusive, measurement.inclusive);
|
||||
|
||||
for (var id in allIDs) {
|
||||
displayName = measurement.displayNames[id].current;
|
||||
|
||||
candidates[displayName] = candidates[displayName] || {
|
||||
componentName: displayName,
|
||||
inclusive: 0,
|
||||
exclusive: 0,
|
||||
render: 0,
|
||||
count: 0
|
||||
};
|
||||
if (measurement.render[id]) {
|
||||
candidates[displayName].render += measurement.render[id];
|
||||
}
|
||||
if (measurement.exclusive[id]) {
|
||||
candidates[displayName].exclusive += measurement.exclusive[id];
|
||||
}
|
||||
if (measurement.inclusive[id]) {
|
||||
candidates[displayName].inclusive += measurement.inclusive[id];
|
||||
}
|
||||
if (measurement.counts[id]) {
|
||||
candidates[displayName].count += measurement.counts[id];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Now make a sorted array with the results.
|
||||
var arr = [];
|
||||
for (displayName in candidates) {
|
||||
if (candidates[displayName].exclusive >= DONT_CARE_THRESHOLD) {
|
||||
arr.push(candidates[displayName]);
|
||||
}
|
||||
}
|
||||
|
||||
arr.sort(function (a, b) {
|
||||
return b.exclusive - a.exclusive;
|
||||
});
|
||||
|
||||
return arr;
|
||||
}
|
||||
|
||||
function getInclusiveSummary(measurements, onlyClean) {
|
||||
var candidates = {};
|
||||
var inclusiveKey;
|
||||
|
||||
for (var i = 0; i < measurements.length; i++) {
|
||||
var measurement = measurements[i];
|
||||
var allIDs = assign({}, measurement.exclusive, measurement.inclusive);
|
||||
var cleanComponents;
|
||||
|
||||
if (onlyClean) {
|
||||
cleanComponents = getUnchangedComponents(measurement);
|
||||
}
|
||||
|
||||
for (var id in allIDs) {
|
||||
if (onlyClean && !cleanComponents[id]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
var displayName = measurement.displayNames[id];
|
||||
|
||||
// Inclusive time is not useful for many components without knowing where
|
||||
// they are instantiated. So we aggregate inclusive time with both the
|
||||
// owner and current displayName as the key.
|
||||
inclusiveKey = displayName.owner + ' > ' + displayName.current;
|
||||
|
||||
candidates[inclusiveKey] = candidates[inclusiveKey] || {
|
||||
componentName: inclusiveKey,
|
||||
time: 0,
|
||||
count: 0
|
||||
};
|
||||
|
||||
if (measurement.inclusive[id]) {
|
||||
candidates[inclusiveKey].time += measurement.inclusive[id];
|
||||
}
|
||||
if (measurement.counts[id]) {
|
||||
candidates[inclusiveKey].count += measurement.counts[id];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Now make a sorted array with the results.
|
||||
var arr = [];
|
||||
for (inclusiveKey in candidates) {
|
||||
if (candidates[inclusiveKey].time >= DONT_CARE_THRESHOLD) {
|
||||
arr.push(candidates[inclusiveKey]);
|
||||
}
|
||||
}
|
||||
|
||||
arr.sort(function (a, b) {
|
||||
return b.time - a.time;
|
||||
});
|
||||
|
||||
return arr;
|
||||
}
|
||||
|
||||
function getUnchangedComponents(measurement) {
|
||||
// For a given reconcile, look at which components did not actually
|
||||
// render anything to the DOM and return a mapping of their ID to
|
||||
// the amount of time it took to render the entire subtree.
|
||||
var cleanComponents = {};
|
||||
var dirtyLeafIDs = Object.keys(measurement.writes);
|
||||
var allIDs = assign({}, measurement.exclusive, measurement.inclusive);
|
||||
|
||||
for (var id in allIDs) {
|
||||
var isDirty = false;
|
||||
// For each component that rendered, see if a component that triggered
|
||||
// a DOM op is in its subtree.
|
||||
for (var i = 0; i < dirtyLeafIDs.length; i++) {
|
||||
if (dirtyLeafIDs[i].indexOf(id) === 0) {
|
||||
isDirty = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// check if component newly created
|
||||
if (measurement.created[id]) {
|
||||
isDirty = true;
|
||||
}
|
||||
if (!isDirty && measurement.counts[id] > 0) {
|
||||
cleanComponents[id] = true;
|
||||
}
|
||||
}
|
||||
return cleanComponents;
|
||||
}
|
||||
|
||||
var ReactDefaultPerfAnalysis = {
|
||||
getExclusiveSummary: getExclusiveSummary,
|
||||
getInclusiveSummary: getInclusiveSummary,
|
||||
getDOMSummary: getDOMSummary,
|
||||
getTotalTime: getTotalTime
|
||||
};
|
||||
|
||||
module.exports = ReactDefaultPerfAnalysis;
|
||||
247
old_major_packages/14/react/lib/ReactElement.js
Normal file
247
old_major_packages/14/react/lib/ReactElement.js
Normal file
@@ -0,0 +1,247 @@
|
||||
/**
|
||||
* Copyright 2014-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactElement
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ReactCurrentOwner = require('./ReactCurrentOwner');
|
||||
|
||||
var assign = require('./Object.assign');
|
||||
var canDefineProperty = require('./canDefineProperty');
|
||||
|
||||
// The Symbol used to tag the ReactElement type. If there is no native Symbol
|
||||
// nor polyfill, then a plain number is used for performance.
|
||||
var REACT_ELEMENT_TYPE = typeof Symbol === 'function' && Symbol['for'] && Symbol['for']('react.element') || 0xeac7;
|
||||
|
||||
var RESERVED_PROPS = {
|
||||
key: true,
|
||||
ref: true,
|
||||
__self: true,
|
||||
__source: true
|
||||
};
|
||||
|
||||
/**
|
||||
* Base constructor for all React elements. This is only used to make this
|
||||
* work with a dynamic instanceof check. Nothing should live on this prototype.
|
||||
*
|
||||
* @param {*} type
|
||||
* @param {*} key
|
||||
* @param {string|object} ref
|
||||
* @param {*} self A *temporary* helper to detect places where `this` is
|
||||
* different from the `owner` when React.createElement is called, so that we
|
||||
* can warn. We want to get rid of owner and replace string `ref`s with arrow
|
||||
* functions, and as long as `this` and owner are the same, there will be no
|
||||
* change in behavior.
|
||||
* @param {*} source An annotation object (added by a transpiler or otherwise)
|
||||
* indicating filename, line number, and/or other information.
|
||||
* @param {*} owner
|
||||
* @param {*} props
|
||||
* @internal
|
||||
*/
|
||||
var ReactElement = function (type, key, ref, self, source, owner, props) {
|
||||
var element = {
|
||||
// This tag allow us to uniquely identify this as a React Element
|
||||
$$typeof: REACT_ELEMENT_TYPE,
|
||||
|
||||
// Built-in properties that belong on the element
|
||||
type: type,
|
||||
key: key,
|
||||
ref: ref,
|
||||
props: props,
|
||||
|
||||
// Record the component responsible for creating this element.
|
||||
_owner: owner
|
||||
};
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
// The validation flag is currently mutative. We put it on
|
||||
// an external backing store so that we can freeze the whole object.
|
||||
// This can be replaced with a WeakMap once they are implemented in
|
||||
// commonly used development environments.
|
||||
element._store = {};
|
||||
|
||||
// To make comparing ReactElements easier for testing purposes, we make
|
||||
// the validation flag non-enumerable (where possible, which should
|
||||
// include every environment we run tests in), so the test framework
|
||||
// ignores it.
|
||||
if (canDefineProperty) {
|
||||
Object.defineProperty(element._store, 'validated', {
|
||||
configurable: false,
|
||||
enumerable: false,
|
||||
writable: true,
|
||||
value: false
|
||||
});
|
||||
// self and source are DEV only properties.
|
||||
Object.defineProperty(element, '_self', {
|
||||
configurable: false,
|
||||
enumerable: false,
|
||||
writable: false,
|
||||
value: self
|
||||
});
|
||||
// Two elements created in two different places should be considered
|
||||
// equal for testing purposes and therefore we hide it from enumeration.
|
||||
Object.defineProperty(element, '_source', {
|
||||
configurable: false,
|
||||
enumerable: false,
|
||||
writable: false,
|
||||
value: source
|
||||
});
|
||||
} else {
|
||||
element._store.validated = false;
|
||||
element._self = self;
|
||||
element._source = source;
|
||||
}
|
||||
Object.freeze(element.props);
|
||||
Object.freeze(element);
|
||||
}
|
||||
|
||||
return element;
|
||||
};
|
||||
|
||||
ReactElement.createElement = function (type, config, children) {
|
||||
var propName;
|
||||
|
||||
// Reserved names are extracted
|
||||
var props = {};
|
||||
|
||||
var key = null;
|
||||
var ref = null;
|
||||
var self = null;
|
||||
var source = null;
|
||||
|
||||
if (config != null) {
|
||||
ref = config.ref === undefined ? null : config.ref;
|
||||
key = config.key === undefined ? null : '' + config.key;
|
||||
self = config.__self === undefined ? null : config.__self;
|
||||
source = config.__source === undefined ? null : config.__source;
|
||||
// Remaining properties are added to a new props object
|
||||
for (propName in config) {
|
||||
if (config.hasOwnProperty(propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {
|
||||
props[propName] = config[propName];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Children can be more than one argument, and those are transferred onto
|
||||
// the newly allocated props object.
|
||||
var childrenLength = arguments.length - 2;
|
||||
if (childrenLength === 1) {
|
||||
props.children = children;
|
||||
} else if (childrenLength > 1) {
|
||||
var childArray = Array(childrenLength);
|
||||
for (var i = 0; i < childrenLength; i++) {
|
||||
childArray[i] = arguments[i + 2];
|
||||
}
|
||||
props.children = childArray;
|
||||
}
|
||||
|
||||
// Resolve default props
|
||||
if (type && type.defaultProps) {
|
||||
var defaultProps = type.defaultProps;
|
||||
for (propName in defaultProps) {
|
||||
if (typeof props[propName] === 'undefined') {
|
||||
props[propName] = defaultProps[propName];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);
|
||||
};
|
||||
|
||||
ReactElement.createFactory = function (type) {
|
||||
var factory = ReactElement.createElement.bind(null, type);
|
||||
// Expose the type on the factory and the prototype so that it can be
|
||||
// easily accessed on elements. E.g. `<Foo />.type === Foo`.
|
||||
// This should not be named `constructor` since this may not be the function
|
||||
// that created the element, and it may not even be a constructor.
|
||||
// Legacy hook TODO: Warn if this is accessed
|
||||
factory.type = type;
|
||||
return factory;
|
||||
};
|
||||
|
||||
ReactElement.cloneAndReplaceKey = function (oldElement, newKey) {
|
||||
var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props);
|
||||
|
||||
return newElement;
|
||||
};
|
||||
|
||||
ReactElement.cloneAndReplaceProps = function (oldElement, newProps) {
|
||||
var newElement = ReactElement(oldElement.type, oldElement.key, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, newProps);
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
// If the key on the original is valid, then the clone is valid
|
||||
newElement._store.validated = oldElement._store.validated;
|
||||
}
|
||||
|
||||
return newElement;
|
||||
};
|
||||
|
||||
ReactElement.cloneElement = function (element, config, children) {
|
||||
var propName;
|
||||
|
||||
// Original props are copied
|
||||
var props = assign({}, element.props);
|
||||
|
||||
// Reserved names are extracted
|
||||
var key = element.key;
|
||||
var ref = element.ref;
|
||||
// Self is preserved since the owner is preserved.
|
||||
var self = element._self;
|
||||
// Source is preserved since cloneElement is unlikely to be targeted by a
|
||||
// transpiler, and the original source is probably a better indicator of the
|
||||
// true owner.
|
||||
var source = element._source;
|
||||
|
||||
// Owner will be preserved, unless ref is overridden
|
||||
var owner = element._owner;
|
||||
|
||||
if (config != null) {
|
||||
if (config.ref !== undefined) {
|
||||
// Silently steal the ref from the parent.
|
||||
ref = config.ref;
|
||||
owner = ReactCurrentOwner.current;
|
||||
}
|
||||
if (config.key !== undefined) {
|
||||
key = '' + config.key;
|
||||
}
|
||||
// Remaining properties override existing props
|
||||
for (propName in config) {
|
||||
if (config.hasOwnProperty(propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {
|
||||
props[propName] = config[propName];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Children can be more than one argument, and those are transferred onto
|
||||
// the newly allocated props object.
|
||||
var childrenLength = arguments.length - 2;
|
||||
if (childrenLength === 1) {
|
||||
props.children = children;
|
||||
} else if (childrenLength > 1) {
|
||||
var childArray = Array(childrenLength);
|
||||
for (var i = 0; i < childrenLength; i++) {
|
||||
childArray[i] = arguments[i + 2];
|
||||
}
|
||||
props.children = childArray;
|
||||
}
|
||||
|
||||
return ReactElement(element.type, key, ref, self, source, owner, props);
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {?object} object
|
||||
* @return {boolean} True if `object` is a valid component.
|
||||
* @final
|
||||
*/
|
||||
ReactElement.isValidElement = function (object) {
|
||||
return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
|
||||
};
|
||||
|
||||
module.exports = ReactElement;
|
||||
281
old_major_packages/14/react/lib/ReactElementValidator.js
Normal file
281
old_major_packages/14/react/lib/ReactElementValidator.js
Normal file
@@ -0,0 +1,281 @@
|
||||
/**
|
||||
* Copyright 2014-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactElementValidator
|
||||
*/
|
||||
|
||||
/**
|
||||
* ReactElementValidator provides a wrapper around a element factory
|
||||
* which validates the props passed to the element. This is intended to be
|
||||
* used only in DEV and could be replaced by a static type checker for languages
|
||||
* that support it.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ReactElement = require('./ReactElement');
|
||||
var ReactPropTypeLocations = require('./ReactPropTypeLocations');
|
||||
var ReactPropTypeLocationNames = require('./ReactPropTypeLocationNames');
|
||||
var ReactCurrentOwner = require('./ReactCurrentOwner');
|
||||
|
||||
var canDefineProperty = require('./canDefineProperty');
|
||||
var getIteratorFn = require('./getIteratorFn');
|
||||
var invariant = require('fbjs/lib/invariant');
|
||||
var warning = require('fbjs/lib/warning');
|
||||
|
||||
function getDeclarationErrorAddendum() {
|
||||
if (ReactCurrentOwner.current) {
|
||||
var name = ReactCurrentOwner.current.getName();
|
||||
if (name) {
|
||||
return ' Check the render method of `' + name + '`.';
|
||||
}
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Warn if there's no key explicitly set on dynamic arrays of children or
|
||||
* object keys are not valid. This allows us to keep track of children between
|
||||
* updates.
|
||||
*/
|
||||
var ownerHasKeyUseWarning = {};
|
||||
|
||||
var loggedTypeFailures = {};
|
||||
|
||||
/**
|
||||
* Warn if the element doesn't have an explicit key assigned to it.
|
||||
* This element is in an array. The array could grow and shrink or be
|
||||
* reordered. All children that haven't already been validated are required to
|
||||
* have a "key" property assigned to it.
|
||||
*
|
||||
* @internal
|
||||
* @param {ReactElement} element Element that requires a key.
|
||||
* @param {*} parentType element's parent's type.
|
||||
*/
|
||||
function validateExplicitKey(element, parentType) {
|
||||
if (!element._store || element._store.validated || element.key != null) {
|
||||
return;
|
||||
}
|
||||
element._store.validated = true;
|
||||
|
||||
var addenda = getAddendaForKeyUse('uniqueKey', element, parentType);
|
||||
if (addenda === null) {
|
||||
// we already showed the warning
|
||||
return;
|
||||
}
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'Each child in an array or iterator should have a unique "key" prop.' + '%s%s%s', addenda.parentOrOwner || '', addenda.childOwner || '', addenda.url || '') : undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Shared warning and monitoring code for the key warnings.
|
||||
*
|
||||
* @internal
|
||||
* @param {string} messageType A key used for de-duping warnings.
|
||||
* @param {ReactElement} element Component that requires a key.
|
||||
* @param {*} parentType element's parent's type.
|
||||
* @returns {?object} A set of addenda to use in the warning message, or null
|
||||
* if the warning has already been shown before (and shouldn't be shown again).
|
||||
*/
|
||||
function getAddendaForKeyUse(messageType, element, parentType) {
|
||||
var addendum = getDeclarationErrorAddendum();
|
||||
if (!addendum) {
|
||||
var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;
|
||||
if (parentName) {
|
||||
addendum = ' Check the top-level render call using <' + parentName + '>.';
|
||||
}
|
||||
}
|
||||
|
||||
var memoizer = ownerHasKeyUseWarning[messageType] || (ownerHasKeyUseWarning[messageType] = {});
|
||||
if (memoizer[addendum]) {
|
||||
return null;
|
||||
}
|
||||
memoizer[addendum] = true;
|
||||
|
||||
var addenda = {
|
||||
parentOrOwner: addendum,
|
||||
url: ' See https://fb.me/react-warning-keys for more information.',
|
||||
childOwner: null
|
||||
};
|
||||
|
||||
// Usually the current owner is the offender, but if it accepts children as a
|
||||
// property, it may be the creator of the child that's responsible for
|
||||
// assigning it a key.
|
||||
if (element && element._owner && element._owner !== ReactCurrentOwner.current) {
|
||||
// Give the component that originally created this child.
|
||||
addenda.childOwner = ' It was passed a child from ' + element._owner.getName() + '.';
|
||||
}
|
||||
|
||||
return addenda;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure that every element either is passed in a static location, in an
|
||||
* array with an explicit keys property defined, or in an object literal
|
||||
* with valid key property.
|
||||
*
|
||||
* @internal
|
||||
* @param {ReactNode} node Statically passed child of any type.
|
||||
* @param {*} parentType node's parent's type.
|
||||
*/
|
||||
function validateChildKeys(node, parentType) {
|
||||
if (typeof node !== 'object') {
|
||||
return;
|
||||
}
|
||||
if (Array.isArray(node)) {
|
||||
for (var i = 0; i < node.length; i++) {
|
||||
var child = node[i];
|
||||
if (ReactElement.isValidElement(child)) {
|
||||
validateExplicitKey(child, parentType);
|
||||
}
|
||||
}
|
||||
} else if (ReactElement.isValidElement(node)) {
|
||||
// This element was passed in a valid location.
|
||||
if (node._store) {
|
||||
node._store.validated = true;
|
||||
}
|
||||
} else if (node) {
|
||||
var iteratorFn = getIteratorFn(node);
|
||||
// Entry iterators provide implicit keys.
|
||||
if (iteratorFn) {
|
||||
if (iteratorFn !== node.entries) {
|
||||
var iterator = iteratorFn.call(node);
|
||||
var step;
|
||||
while (!(step = iterator.next()).done) {
|
||||
if (ReactElement.isValidElement(step.value)) {
|
||||
validateExplicitKey(step.value, parentType);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Assert that the props are valid
|
||||
*
|
||||
* @param {string} componentName Name of the component for error messages.
|
||||
* @param {object} propTypes Map of prop name to a ReactPropType
|
||||
* @param {object} props
|
||||
* @param {string} location e.g. "prop", "context", "child context"
|
||||
* @private
|
||||
*/
|
||||
function checkPropTypes(componentName, propTypes, props, location) {
|
||||
for (var propName in propTypes) {
|
||||
if (propTypes.hasOwnProperty(propName)) {
|
||||
var error;
|
||||
// Prop type validation may throw. In case they do, we don't want to
|
||||
// fail the render phase where it didn't fail before. So we log it.
|
||||
// After these have been cleaned up, we'll let them throw.
|
||||
try {
|
||||
// This is intentionally an invariant that gets caught. It's the same
|
||||
// behavior as without this statement except with a better message.
|
||||
!(typeof propTypes[propName] === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s: %s type `%s` is invalid; it must be a function, usually from ' + 'React.PropTypes.', componentName || 'React class', ReactPropTypeLocationNames[location], propName) : invariant(false) : undefined;
|
||||
error = propTypes[propName](props, propName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');
|
||||
} catch (ex) {
|
||||
error = ex;
|
||||
}
|
||||
process.env.NODE_ENV !== 'production' ? warning(!error || error instanceof Error, '%s: type specification of %s `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', ReactPropTypeLocationNames[location], propName, typeof error) : undefined;
|
||||
if (error instanceof Error && !(error.message in loggedTypeFailures)) {
|
||||
// Only monitor this failure once because there tends to be a lot of the
|
||||
// same error.
|
||||
loggedTypeFailures[error.message] = true;
|
||||
|
||||
var addendum = getDeclarationErrorAddendum();
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'Failed propType: %s%s', error.message, addendum) : undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Given an element, validate that its props follow the propTypes definition,
|
||||
* provided by the type.
|
||||
*
|
||||
* @param {ReactElement} element
|
||||
*/
|
||||
function validatePropTypes(element) {
|
||||
var componentClass = element.type;
|
||||
if (typeof componentClass !== 'function') {
|
||||
return;
|
||||
}
|
||||
var name = componentClass.displayName || componentClass.name;
|
||||
if (componentClass.propTypes) {
|
||||
checkPropTypes(name, componentClass.propTypes, element.props, ReactPropTypeLocations.prop);
|
||||
}
|
||||
if (typeof componentClass.getDefaultProps === 'function') {
|
||||
process.env.NODE_ENV !== 'production' ? warning(componentClass.getDefaultProps.isReactClassApproved, 'getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.') : undefined;
|
||||
}
|
||||
}
|
||||
|
||||
var ReactElementValidator = {
|
||||
|
||||
createElement: function (type, props, children) {
|
||||
var validType = typeof type === 'string' || typeof type === 'function';
|
||||
// We warn in this case but don't throw. We expect the element creation to
|
||||
// succeed and there will likely be errors in render.
|
||||
process.env.NODE_ENV !== 'production' ? warning(validType, 'React.createElement: type should not be null, undefined, boolean, or ' + 'number. It should be a string (for DOM elements) or a ReactClass ' + '(for composite components).%s', getDeclarationErrorAddendum()) : undefined;
|
||||
|
||||
var element = ReactElement.createElement.apply(this, arguments);
|
||||
|
||||
// The result can be nullish if a mock or a custom function is used.
|
||||
// TODO: Drop this when these are no longer allowed as the type argument.
|
||||
if (element == null) {
|
||||
return element;
|
||||
}
|
||||
|
||||
// Skip key warning if the type isn't valid since our key validation logic
|
||||
// doesn't expect a non-string/function type and can throw confusing errors.
|
||||
// We don't want exception behavior to differ between dev and prod.
|
||||
// (Rendering will throw with a helpful message and as soon as the type is
|
||||
// fixed, the key warnings will appear.)
|
||||
if (validType) {
|
||||
for (var i = 2; i < arguments.length; i++) {
|
||||
validateChildKeys(arguments[i], type);
|
||||
}
|
||||
}
|
||||
|
||||
validatePropTypes(element);
|
||||
|
||||
return element;
|
||||
},
|
||||
|
||||
createFactory: function (type) {
|
||||
var validatedFactory = ReactElementValidator.createElement.bind(null, type);
|
||||
// Legacy hook TODO: Warn if this is accessed
|
||||
validatedFactory.type = type;
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
if (canDefineProperty) {
|
||||
Object.defineProperty(validatedFactory, 'type', {
|
||||
enumerable: false,
|
||||
get: function () {
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.') : undefined;
|
||||
Object.defineProperty(this, 'type', {
|
||||
value: type
|
||||
});
|
||||
return type;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return validatedFactory;
|
||||
},
|
||||
|
||||
cloneElement: function (element, props, children) {
|
||||
var newElement = ReactElement.cloneElement.apply(this, arguments);
|
||||
for (var i = 2; i < arguments.length; i++) {
|
||||
validateChildKeys(arguments[i], newElement.type);
|
||||
}
|
||||
validatePropTypes(newElement);
|
||||
return newElement;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
module.exports = ReactElementValidator;
|
||||
55
old_major_packages/14/react/lib/ReactEmptyComponent.js
Normal file
55
old_major_packages/14/react/lib/ReactEmptyComponent.js
Normal file
@@ -0,0 +1,55 @@
|
||||
/**
|
||||
* Copyright 2014-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactEmptyComponent
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ReactElement = require('./ReactElement');
|
||||
var ReactEmptyComponentRegistry = require('./ReactEmptyComponentRegistry');
|
||||
var ReactReconciler = require('./ReactReconciler');
|
||||
|
||||
var assign = require('./Object.assign');
|
||||
|
||||
var placeholderElement;
|
||||
|
||||
var ReactEmptyComponentInjection = {
|
||||
injectEmptyComponent: function (component) {
|
||||
placeholderElement = ReactElement.createElement(component);
|
||||
}
|
||||
};
|
||||
|
||||
function registerNullComponentID() {
|
||||
ReactEmptyComponentRegistry.registerNullComponentID(this._rootNodeID);
|
||||
}
|
||||
|
||||
var ReactEmptyComponent = function (instantiate) {
|
||||
this._currentElement = null;
|
||||
this._rootNodeID = null;
|
||||
this._renderedComponent = instantiate(placeholderElement);
|
||||
};
|
||||
assign(ReactEmptyComponent.prototype, {
|
||||
construct: function (element) {},
|
||||
mountComponent: function (rootID, transaction, context) {
|
||||
transaction.getReactMountReady().enqueue(registerNullComponentID, this);
|
||||
this._rootNodeID = rootID;
|
||||
return ReactReconciler.mountComponent(this._renderedComponent, rootID, transaction, context);
|
||||
},
|
||||
receiveComponent: function () {},
|
||||
unmountComponent: function (rootID, transaction, context) {
|
||||
ReactReconciler.unmountComponent(this._renderedComponent);
|
||||
ReactEmptyComponentRegistry.deregisterNullComponentID(this._rootNodeID);
|
||||
this._rootNodeID = null;
|
||||
this._renderedComponent = null;
|
||||
}
|
||||
});
|
||||
|
||||
ReactEmptyComponent.injection = ReactEmptyComponentInjection;
|
||||
|
||||
module.exports = ReactEmptyComponent;
|
||||
@@ -0,0 +1,48 @@
|
||||
/**
|
||||
* Copyright 2014-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactEmptyComponentRegistry
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
// This registry keeps track of the React IDs of the components that rendered to
|
||||
// `null` (in reality a placeholder such as `noscript`)
|
||||
var nullComponentIDsRegistry = {};
|
||||
|
||||
/**
|
||||
* @param {string} id Component's `_rootNodeID`.
|
||||
* @return {boolean} True if the component is rendered to null.
|
||||
*/
|
||||
function isNullComponentID(id) {
|
||||
return !!nullComponentIDsRegistry[id];
|
||||
}
|
||||
|
||||
/**
|
||||
* Mark the component as having rendered to null.
|
||||
* @param {string} id Component's `_rootNodeID`.
|
||||
*/
|
||||
function registerNullComponentID(id) {
|
||||
nullComponentIDsRegistry[id] = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unmark the component as having rendered to null: it renders to something now.
|
||||
* @param {string} id Component's `_rootNodeID`.
|
||||
*/
|
||||
function deregisterNullComponentID(id) {
|
||||
delete nullComponentIDsRegistry[id];
|
||||
}
|
||||
|
||||
var ReactEmptyComponentRegistry = {
|
||||
isNullComponentID: isNullComponentID,
|
||||
registerNullComponentID: registerNullComponentID,
|
||||
deregisterNullComponentID: deregisterNullComponentID
|
||||
};
|
||||
|
||||
module.exports = ReactEmptyComponentRegistry;
|
||||
77
old_major_packages/14/react/lib/ReactErrorUtils.js
Normal file
77
old_major_packages/14/react/lib/ReactErrorUtils.js
Normal file
@@ -0,0 +1,77 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactErrorUtils
|
||||
* @typechecks
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var caughtError = null;
|
||||
|
||||
/**
|
||||
* Call a function while guarding against errors that happens within it.
|
||||
*
|
||||
* @param {?String} name of the guard to use for logging or debugging
|
||||
* @param {Function} func The function to invoke
|
||||
* @param {*} a First argument
|
||||
* @param {*} b Second argument
|
||||
*/
|
||||
function invokeGuardedCallback(name, func, a, b) {
|
||||
try {
|
||||
return func(a, b);
|
||||
} catch (x) {
|
||||
if (caughtError === null) {
|
||||
caughtError = x;
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
var ReactErrorUtils = {
|
||||
invokeGuardedCallback: invokeGuardedCallback,
|
||||
|
||||
/**
|
||||
* Invoked by ReactTestUtils.Simulate so that any errors thrown by the event
|
||||
* handler are sure to be rethrown by rethrowCaughtError.
|
||||
*/
|
||||
invokeGuardedCallbackWithCatch: invokeGuardedCallback,
|
||||
|
||||
/**
|
||||
* During execution of guarded functions we will capture the first error which
|
||||
* we will rethrow to be handled by the top level error handler.
|
||||
*/
|
||||
rethrowCaughtError: function () {
|
||||
if (caughtError) {
|
||||
var error = caughtError;
|
||||
caughtError = null;
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
/**
|
||||
* To help development we can get better devtools integration by simulating a
|
||||
* real browser event.
|
||||
*/
|
||||
if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') {
|
||||
var fakeNode = document.createElement('react');
|
||||
ReactErrorUtils.invokeGuardedCallback = function (name, func, a, b) {
|
||||
var boundFunc = func.bind(null, a, b);
|
||||
var evtType = 'react-' + name;
|
||||
fakeNode.addEventListener(evtType, boundFunc, false);
|
||||
var evt = document.createEvent('Event');
|
||||
evt.initEvent(evtType, false, false);
|
||||
fakeNode.dispatchEvent(evt);
|
||||
fakeNode.removeEventListener(evtType, boundFunc, false);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = ReactErrorUtils;
|
||||
38
old_major_packages/14/react/lib/ReactEventEmitterMixin.js
Normal file
38
old_major_packages/14/react/lib/ReactEventEmitterMixin.js
Normal file
@@ -0,0 +1,38 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactEventEmitterMixin
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var EventPluginHub = require('./EventPluginHub');
|
||||
|
||||
function runEventQueueInBatch(events) {
|
||||
EventPluginHub.enqueueEvents(events);
|
||||
EventPluginHub.processEventQueue(false);
|
||||
}
|
||||
|
||||
var ReactEventEmitterMixin = {
|
||||
|
||||
/**
|
||||
* Streams a fired top-level event to `EventPluginHub` where plugins have the
|
||||
* opportunity to create `ReactEvent`s to be dispatched.
|
||||
*
|
||||
* @param {string} topLevelType Record from `EventConstants`.
|
||||
* @param {object} topLevelTarget The listening component root node.
|
||||
* @param {string} topLevelTargetID ID of `topLevelTarget`.
|
||||
* @param {object} nativeEvent Native environment event.
|
||||
*/
|
||||
handleTopLevel: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {
|
||||
var events = EventPluginHub.extractEvents(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget);
|
||||
runEventQueueInBatch(events);
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = ReactEventEmitterMixin;
|
||||
211
old_major_packages/14/react/lib/ReactEventListener.js
Normal file
211
old_major_packages/14/react/lib/ReactEventListener.js
Normal file
@@ -0,0 +1,211 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactEventListener
|
||||
* @typechecks static-only
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var EventListener = require('fbjs/lib/EventListener');
|
||||
var ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');
|
||||
var PooledClass = require('./PooledClass');
|
||||
var ReactInstanceHandles = require('./ReactInstanceHandles');
|
||||
var ReactMount = require('./ReactMount');
|
||||
var ReactUpdates = require('./ReactUpdates');
|
||||
|
||||
var assign = require('./Object.assign');
|
||||
var getEventTarget = require('./getEventTarget');
|
||||
var getUnboundedScrollPosition = require('fbjs/lib/getUnboundedScrollPosition');
|
||||
|
||||
var DOCUMENT_FRAGMENT_NODE_TYPE = 11;
|
||||
|
||||
/**
|
||||
* Finds the parent React component of `node`.
|
||||
*
|
||||
* @param {*} node
|
||||
* @return {?DOMEventTarget} Parent container, or `null` if the specified node
|
||||
* is not nested.
|
||||
*/
|
||||
function findParent(node) {
|
||||
// TODO: It may be a good idea to cache this to prevent unnecessary DOM
|
||||
// traversal, but caching is difficult to do correctly without using a
|
||||
// mutation observer to listen for all DOM changes.
|
||||
var nodeID = ReactMount.getID(node);
|
||||
var rootID = ReactInstanceHandles.getReactRootIDFromNodeID(nodeID);
|
||||
var container = ReactMount.findReactContainerForID(rootID);
|
||||
var parent = ReactMount.getFirstReactDOM(container);
|
||||
return parent;
|
||||
}
|
||||
|
||||
// Used to store ancestor hierarchy in top level callback
|
||||
function TopLevelCallbackBookKeeping(topLevelType, nativeEvent) {
|
||||
this.topLevelType = topLevelType;
|
||||
this.nativeEvent = nativeEvent;
|
||||
this.ancestors = [];
|
||||
}
|
||||
assign(TopLevelCallbackBookKeeping.prototype, {
|
||||
destructor: function () {
|
||||
this.topLevelType = null;
|
||||
this.nativeEvent = null;
|
||||
this.ancestors.length = 0;
|
||||
}
|
||||
});
|
||||
PooledClass.addPoolingTo(TopLevelCallbackBookKeeping, PooledClass.twoArgumentPooler);
|
||||
|
||||
function handleTopLevelImpl(bookKeeping) {
|
||||
// TODO: Re-enable event.path handling
|
||||
//
|
||||
// if (bookKeeping.nativeEvent.path && bookKeeping.nativeEvent.path.length > 1) {
|
||||
// // New browsers have a path attribute on native events
|
||||
// handleTopLevelWithPath(bookKeeping);
|
||||
// } else {
|
||||
// // Legacy browsers don't have a path attribute on native events
|
||||
// handleTopLevelWithoutPath(bookKeeping);
|
||||
// }
|
||||
|
||||
void handleTopLevelWithPath; // temporarily unused
|
||||
handleTopLevelWithoutPath(bookKeeping);
|
||||
}
|
||||
|
||||
// Legacy browsers don't have a path attribute on native events
|
||||
function handleTopLevelWithoutPath(bookKeeping) {
|
||||
var topLevelTarget = ReactMount.getFirstReactDOM(getEventTarget(bookKeeping.nativeEvent)) || window;
|
||||
|
||||
// Loop through the hierarchy, in case there's any nested components.
|
||||
// It's important that we build the array of ancestors before calling any
|
||||
// event handlers, because event handlers can modify the DOM, leading to
|
||||
// inconsistencies with ReactMount's node cache. See #1105.
|
||||
var ancestor = topLevelTarget;
|
||||
while (ancestor) {
|
||||
bookKeeping.ancestors.push(ancestor);
|
||||
ancestor = findParent(ancestor);
|
||||
}
|
||||
|
||||
for (var i = 0; i < bookKeeping.ancestors.length; i++) {
|
||||
topLevelTarget = bookKeeping.ancestors[i];
|
||||
var topLevelTargetID = ReactMount.getID(topLevelTarget) || '';
|
||||
ReactEventListener._handleTopLevel(bookKeeping.topLevelType, topLevelTarget, topLevelTargetID, bookKeeping.nativeEvent, getEventTarget(bookKeeping.nativeEvent));
|
||||
}
|
||||
}
|
||||
|
||||
// New browsers have a path attribute on native events
|
||||
function handleTopLevelWithPath(bookKeeping) {
|
||||
var path = bookKeeping.nativeEvent.path;
|
||||
var currentNativeTarget = path[0];
|
||||
var eventsFired = 0;
|
||||
for (var i = 0; i < path.length; i++) {
|
||||
var currentPathElement = path[i];
|
||||
if (currentPathElement.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE) {
|
||||
currentNativeTarget = path[i + 1];
|
||||
}
|
||||
// TODO: slow
|
||||
var reactParent = ReactMount.getFirstReactDOM(currentPathElement);
|
||||
if (reactParent === currentPathElement) {
|
||||
var currentPathElementID = ReactMount.getID(currentPathElement);
|
||||
var newRootID = ReactInstanceHandles.getReactRootIDFromNodeID(currentPathElementID);
|
||||
bookKeeping.ancestors.push(currentPathElement);
|
||||
|
||||
var topLevelTargetID = ReactMount.getID(currentPathElement) || '';
|
||||
eventsFired++;
|
||||
ReactEventListener._handleTopLevel(bookKeeping.topLevelType, currentPathElement, topLevelTargetID, bookKeeping.nativeEvent, currentNativeTarget);
|
||||
|
||||
// Jump to the root of this React render tree
|
||||
while (currentPathElementID !== newRootID) {
|
||||
i++;
|
||||
currentPathElement = path[i];
|
||||
currentPathElementID = ReactMount.getID(currentPathElement);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (eventsFired === 0) {
|
||||
ReactEventListener._handleTopLevel(bookKeeping.topLevelType, window, '', bookKeeping.nativeEvent, getEventTarget(bookKeeping.nativeEvent));
|
||||
}
|
||||
}
|
||||
|
||||
function scrollValueMonitor(cb) {
|
||||
var scrollPosition = getUnboundedScrollPosition(window);
|
||||
cb(scrollPosition);
|
||||
}
|
||||
|
||||
var ReactEventListener = {
|
||||
_enabled: true,
|
||||
_handleTopLevel: null,
|
||||
|
||||
WINDOW_HANDLE: ExecutionEnvironment.canUseDOM ? window : null,
|
||||
|
||||
setHandleTopLevel: function (handleTopLevel) {
|
||||
ReactEventListener._handleTopLevel = handleTopLevel;
|
||||
},
|
||||
|
||||
setEnabled: function (enabled) {
|
||||
ReactEventListener._enabled = !!enabled;
|
||||
},
|
||||
|
||||
isEnabled: function () {
|
||||
return ReactEventListener._enabled;
|
||||
},
|
||||
|
||||
/**
|
||||
* Traps top-level events by using event bubbling.
|
||||
*
|
||||
* @param {string} topLevelType Record from `EventConstants`.
|
||||
* @param {string} handlerBaseName Event name (e.g. "click").
|
||||
* @param {object} handle Element on which to attach listener.
|
||||
* @return {?object} An object with a remove function which will forcefully
|
||||
* remove the listener.
|
||||
* @internal
|
||||
*/
|
||||
trapBubbledEvent: function (topLevelType, handlerBaseName, handle) {
|
||||
var element = handle;
|
||||
if (!element) {
|
||||
return null;
|
||||
}
|
||||
return EventListener.listen(element, handlerBaseName, ReactEventListener.dispatchEvent.bind(null, topLevelType));
|
||||
},
|
||||
|
||||
/**
|
||||
* Traps a top-level event by using event capturing.
|
||||
*
|
||||
* @param {string} topLevelType Record from `EventConstants`.
|
||||
* @param {string} handlerBaseName Event name (e.g. "click").
|
||||
* @param {object} handle Element on which to attach listener.
|
||||
* @return {?object} An object with a remove function which will forcefully
|
||||
* remove the listener.
|
||||
* @internal
|
||||
*/
|
||||
trapCapturedEvent: function (topLevelType, handlerBaseName, handle) {
|
||||
var element = handle;
|
||||
if (!element) {
|
||||
return null;
|
||||
}
|
||||
return EventListener.capture(element, handlerBaseName, ReactEventListener.dispatchEvent.bind(null, topLevelType));
|
||||
},
|
||||
|
||||
monitorScrollValue: function (refresh) {
|
||||
var callback = scrollValueMonitor.bind(null, refresh);
|
||||
EventListener.listen(window, 'scroll', callback);
|
||||
},
|
||||
|
||||
dispatchEvent: function (topLevelType, nativeEvent) {
|
||||
if (!ReactEventListener._enabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
var bookKeeping = TopLevelCallbackBookKeeping.getPooled(topLevelType, nativeEvent);
|
||||
try {
|
||||
// Event queue being processed in the same cycle allows
|
||||
// `preventDefault`.
|
||||
ReactUpdates.batchedUpdates(handleTopLevelImpl, bookKeeping);
|
||||
} finally {
|
||||
TopLevelCallbackBookKeeping.release(bookKeeping);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = ReactEventListener;
|
||||
64
old_major_packages/14/react/lib/ReactFragment.js
Normal file
64
old_major_packages/14/react/lib/ReactFragment.js
Normal file
@@ -0,0 +1,64 @@
|
||||
/**
|
||||
* Copyright 2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactFragment
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ReactChildren = require('./ReactChildren');
|
||||
var ReactElement = require('./ReactElement');
|
||||
|
||||
var emptyFunction = require('fbjs/lib/emptyFunction');
|
||||
var invariant = require('fbjs/lib/invariant');
|
||||
var warning = require('fbjs/lib/warning');
|
||||
|
||||
/**
|
||||
* We used to allow keyed objects to serve as a collection of ReactElements,
|
||||
* or nested sets. This allowed us a way to explicitly key a set a fragment of
|
||||
* components. This is now being replaced with an opaque data structure.
|
||||
* The upgrade path is to call React.addons.createFragment({ key: value }) to
|
||||
* create a keyed fragment. The resulting data structure is an array.
|
||||
*/
|
||||
|
||||
var numericPropertyRegex = /^\d+$/;
|
||||
|
||||
var warnedAboutNumeric = false;
|
||||
|
||||
var ReactFragment = {
|
||||
// Wrap a keyed object in an opaque proxy that warns you if you access any
|
||||
// of its properties.
|
||||
create: function (object) {
|
||||
if (typeof object !== 'object' || !object || Array.isArray(object)) {
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'React.addons.createFragment only accepts a single object. Got: %s', object) : undefined;
|
||||
return object;
|
||||
}
|
||||
if (ReactElement.isValidElement(object)) {
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'React.addons.createFragment does not accept a ReactElement ' + 'without a wrapper object.') : undefined;
|
||||
return object;
|
||||
}
|
||||
|
||||
!(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;
|
||||
|
||||
var result = [];
|
||||
|
||||
for (var key in object) {
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
if (!warnedAboutNumeric && numericPropertyRegex.test(key)) {
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'React.addons.createFragment(...): Child objects should have ' + 'non-numeric keys so ordering is preserved.') : undefined;
|
||||
warnedAboutNumeric = true;
|
||||
}
|
||||
}
|
||||
ReactChildren.mapIntoWithKeyPrefixInternal(object[key], result, key, emptyFunction.thatReturnsArgument);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = ReactFragment;
|
||||
38
old_major_packages/14/react/lib/ReactInjection.js
Normal file
38
old_major_packages/14/react/lib/ReactInjection.js
Normal file
@@ -0,0 +1,38 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactInjection
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var DOMProperty = require('./DOMProperty');
|
||||
var EventPluginHub = require('./EventPluginHub');
|
||||
var ReactComponentEnvironment = require('./ReactComponentEnvironment');
|
||||
var ReactClass = require('./ReactClass');
|
||||
var ReactEmptyComponent = require('./ReactEmptyComponent');
|
||||
var ReactBrowserEventEmitter = require('./ReactBrowserEventEmitter');
|
||||
var ReactNativeComponent = require('./ReactNativeComponent');
|
||||
var ReactPerf = require('./ReactPerf');
|
||||
var ReactRootIndex = require('./ReactRootIndex');
|
||||
var ReactUpdates = require('./ReactUpdates');
|
||||
|
||||
var ReactInjection = {
|
||||
Component: ReactComponentEnvironment.injection,
|
||||
Class: ReactClass.injection,
|
||||
DOMProperty: DOMProperty.injection,
|
||||
EmptyComponent: ReactEmptyComponent.injection,
|
||||
EventPluginHub: EventPluginHub.injection,
|
||||
EventEmitter: ReactBrowserEventEmitter.injection,
|
||||
NativeComponent: ReactNativeComponent.injection,
|
||||
Perf: ReactPerf.injection,
|
||||
RootIndex: ReactRootIndex.injection,
|
||||
Updates: ReactUpdates.injection
|
||||
};
|
||||
|
||||
module.exports = ReactInjection;
|
||||
124
old_major_packages/14/react/lib/ReactInputSelection.js
Normal file
124
old_major_packages/14/react/lib/ReactInputSelection.js
Normal file
@@ -0,0 +1,124 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactInputSelection
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ReactDOMSelection = require('./ReactDOMSelection');
|
||||
|
||||
var containsNode = require('fbjs/lib/containsNode');
|
||||
var focusNode = require('fbjs/lib/focusNode');
|
||||
var getActiveElement = require('fbjs/lib/getActiveElement');
|
||||
|
||||
function isInDocument(node) {
|
||||
return containsNode(document.documentElement, node);
|
||||
}
|
||||
|
||||
/**
|
||||
* @ReactInputSelection: React input selection module. Based on Selection.js,
|
||||
* but modified to be suitable for react and has a couple of bug fixes (doesn't
|
||||
* assume buttons have range selections allowed).
|
||||
* Input selection module for React.
|
||||
*/
|
||||
var ReactInputSelection = {
|
||||
|
||||
hasSelectionCapabilities: function (elem) {
|
||||
var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
|
||||
return nodeName && (nodeName === 'input' && elem.type === 'text' || nodeName === 'textarea' || elem.contentEditable === 'true');
|
||||
},
|
||||
|
||||
getSelectionInformation: function () {
|
||||
var focusedElem = getActiveElement();
|
||||
return {
|
||||
focusedElem: focusedElem,
|
||||
selectionRange: ReactInputSelection.hasSelectionCapabilities(focusedElem) ? ReactInputSelection.getSelection(focusedElem) : null
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* @restoreSelection: If any selection information was potentially lost,
|
||||
* restore it. This is useful when performing operations that could remove dom
|
||||
* nodes and place them back in, resulting in focus being lost.
|
||||
*/
|
||||
restoreSelection: function (priorSelectionInformation) {
|
||||
var curFocusedElem = getActiveElement();
|
||||
var priorFocusedElem = priorSelectionInformation.focusedElem;
|
||||
var priorSelectionRange = priorSelectionInformation.selectionRange;
|
||||
if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) {
|
||||
if (ReactInputSelection.hasSelectionCapabilities(priorFocusedElem)) {
|
||||
ReactInputSelection.setSelection(priorFocusedElem, priorSelectionRange);
|
||||
}
|
||||
focusNode(priorFocusedElem);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* @getSelection: Gets the selection bounds of a focused textarea, input or
|
||||
* contentEditable node.
|
||||
* -@input: Look up selection bounds of this input
|
||||
* -@return {start: selectionStart, end: selectionEnd}
|
||||
*/
|
||||
getSelection: function (input) {
|
||||
var selection;
|
||||
|
||||
if ('selectionStart' in input) {
|
||||
// Modern browser with input or textarea.
|
||||
selection = {
|
||||
start: input.selectionStart,
|
||||
end: input.selectionEnd
|
||||
};
|
||||
} else if (document.selection && (input.nodeName && input.nodeName.toLowerCase() === 'input')) {
|
||||
// IE8 input.
|
||||
var range = document.selection.createRange();
|
||||
// There can only be one selection per document in IE, so it must
|
||||
// be in our element.
|
||||
if (range.parentElement() === input) {
|
||||
selection = {
|
||||
start: -range.moveStart('character', -input.value.length),
|
||||
end: -range.moveEnd('character', -input.value.length)
|
||||
};
|
||||
}
|
||||
} else {
|
||||
// Content editable or old IE textarea.
|
||||
selection = ReactDOMSelection.getOffsets(input);
|
||||
}
|
||||
|
||||
return selection || { start: 0, end: 0 };
|
||||
},
|
||||
|
||||
/**
|
||||
* @setSelection: Sets the selection bounds of a textarea or input and focuses
|
||||
* the input.
|
||||
* -@input Set selection bounds of this input or textarea
|
||||
* -@offsets Object of same form that is returned from get*
|
||||
*/
|
||||
setSelection: function (input, offsets) {
|
||||
var start = offsets.start;
|
||||
var end = offsets.end;
|
||||
if (typeof end === 'undefined') {
|
||||
end = start;
|
||||
}
|
||||
|
||||
if ('selectionStart' in input) {
|
||||
input.selectionStart = start;
|
||||
input.selectionEnd = Math.min(end, input.value.length);
|
||||
} else if (document.selection && (input.nodeName && input.nodeName.toLowerCase() === 'input')) {
|
||||
var range = input.createTextRange();
|
||||
range.collapse(true);
|
||||
range.moveStart('character', start);
|
||||
range.moveEnd('character', end - start);
|
||||
range.select();
|
||||
} else {
|
||||
ReactDOMSelection.setOffsets(input, offsets);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = ReactInputSelection;
|
||||
302
old_major_packages/14/react/lib/ReactInstanceHandles.js
Normal file
302
old_major_packages/14/react/lib/ReactInstanceHandles.js
Normal file
@@ -0,0 +1,302 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactInstanceHandles
|
||||
* @typechecks static-only
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ReactRootIndex = require('./ReactRootIndex');
|
||||
|
||||
var invariant = require('fbjs/lib/invariant');
|
||||
|
||||
var SEPARATOR = '.';
|
||||
var SEPARATOR_LENGTH = SEPARATOR.length;
|
||||
|
||||
/**
|
||||
* Maximum depth of traversals before we consider the possibility of a bad ID.
|
||||
*/
|
||||
var MAX_TREE_DEPTH = 10000;
|
||||
|
||||
/**
|
||||
* Creates a DOM ID prefix to use when mounting React components.
|
||||
*
|
||||
* @param {number} index A unique integer
|
||||
* @return {string} React root ID.
|
||||
* @internal
|
||||
*/
|
||||
function getReactRootIDString(index) {
|
||||
return SEPARATOR + index.toString(36);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a character in the supplied ID is a separator or the end.
|
||||
*
|
||||
* @param {string} id A React DOM ID.
|
||||
* @param {number} index Index of the character to check.
|
||||
* @return {boolean} True if the character is a separator or end of the ID.
|
||||
* @private
|
||||
*/
|
||||
function isBoundary(id, index) {
|
||||
return id.charAt(index) === SEPARATOR || index === id.length;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the supplied string is a valid React DOM ID.
|
||||
*
|
||||
* @param {string} id A React DOM ID, maybe.
|
||||
* @return {boolean} True if the string is a valid React DOM ID.
|
||||
* @private
|
||||
*/
|
||||
function isValidID(id) {
|
||||
return id === '' || id.charAt(0) === SEPARATOR && id.charAt(id.length - 1) !== SEPARATOR;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the first ID is an ancestor of or equal to the second ID.
|
||||
*
|
||||
* @param {string} ancestorID
|
||||
* @param {string} descendantID
|
||||
* @return {boolean} True if `ancestorID` is an ancestor of `descendantID`.
|
||||
* @internal
|
||||
*/
|
||||
function isAncestorIDOf(ancestorID, descendantID) {
|
||||
return descendantID.indexOf(ancestorID) === 0 && isBoundary(descendantID, ancestorID.length);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the parent ID of the supplied React DOM ID, `id`.
|
||||
*
|
||||
* @param {string} id ID of a component.
|
||||
* @return {string} ID of the parent, or an empty string.
|
||||
* @private
|
||||
*/
|
||||
function getParentID(id) {
|
||||
return id ? id.substr(0, id.lastIndexOf(SEPARATOR)) : '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the next DOM ID on the tree path from the supplied `ancestorID` to the
|
||||
* supplied `destinationID`. If they are equal, the ID is returned.
|
||||
*
|
||||
* @param {string} ancestorID ID of an ancestor node of `destinationID`.
|
||||
* @param {string} destinationID ID of the destination node.
|
||||
* @return {string} Next ID on the path from `ancestorID` to `destinationID`.
|
||||
* @private
|
||||
*/
|
||||
function getNextDescendantID(ancestorID, destinationID) {
|
||||
!(isValidID(ancestorID) && isValidID(destinationID)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'getNextDescendantID(%s, %s): Received an invalid React DOM ID.', ancestorID, destinationID) : invariant(false) : undefined;
|
||||
!isAncestorIDOf(ancestorID, destinationID) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'getNextDescendantID(...): React has made an invalid assumption about ' + 'the DOM hierarchy. Expected `%s` to be an ancestor of `%s`.', ancestorID, destinationID) : invariant(false) : undefined;
|
||||
if (ancestorID === destinationID) {
|
||||
return ancestorID;
|
||||
}
|
||||
// Skip over the ancestor and the immediate separator. Traverse until we hit
|
||||
// another separator or we reach the end of `destinationID`.
|
||||
var start = ancestorID.length + SEPARATOR_LENGTH;
|
||||
var i;
|
||||
for (i = start; i < destinationID.length; i++) {
|
||||
if (isBoundary(destinationID, i)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return destinationID.substr(0, i);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the nearest common ancestor ID of two IDs.
|
||||
*
|
||||
* Using this ID scheme, the nearest common ancestor ID is the longest common
|
||||
* prefix of the two IDs that immediately preceded a "marker" in both strings.
|
||||
*
|
||||
* @param {string} oneID
|
||||
* @param {string} twoID
|
||||
* @return {string} Nearest common ancestor ID, or the empty string if none.
|
||||
* @private
|
||||
*/
|
||||
function getFirstCommonAncestorID(oneID, twoID) {
|
||||
var minLength = Math.min(oneID.length, twoID.length);
|
||||
if (minLength === 0) {
|
||||
return '';
|
||||
}
|
||||
var lastCommonMarkerIndex = 0;
|
||||
// Use `<=` to traverse until the "EOL" of the shorter string.
|
||||
for (var i = 0; i <= minLength; i++) {
|
||||
if (isBoundary(oneID, i) && isBoundary(twoID, i)) {
|
||||
lastCommonMarkerIndex = i;
|
||||
} else if (oneID.charAt(i) !== twoID.charAt(i)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
var longestCommonID = oneID.substr(0, lastCommonMarkerIndex);
|
||||
!isValidID(longestCommonID) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'getFirstCommonAncestorID(%s, %s): Expected a valid React DOM ID: %s', oneID, twoID, longestCommonID) : invariant(false) : undefined;
|
||||
return longestCommonID;
|
||||
}
|
||||
|
||||
/**
|
||||
* Traverses the parent path between two IDs (either up or down). The IDs must
|
||||
* not be the same, and there must exist a parent path between them. If the
|
||||
* callback returns `false`, traversal is stopped.
|
||||
*
|
||||
* @param {?string} start ID at which to start traversal.
|
||||
* @param {?string} stop ID at which to end traversal.
|
||||
* @param {function} cb Callback to invoke each ID with.
|
||||
* @param {*} arg Argument to invoke the callback with.
|
||||
* @param {?boolean} skipFirst Whether or not to skip the first node.
|
||||
* @param {?boolean} skipLast Whether or not to skip the last node.
|
||||
* @private
|
||||
*/
|
||||
function traverseParentPath(start, stop, cb, arg, skipFirst, skipLast) {
|
||||
start = start || '';
|
||||
stop = stop || '';
|
||||
!(start !== stop) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'traverseParentPath(...): Cannot traverse from and to the same ID, `%s`.', start) : invariant(false) : undefined;
|
||||
var traverseUp = isAncestorIDOf(stop, start);
|
||||
!(traverseUp || isAncestorIDOf(start, stop)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'traverseParentPath(%s, %s, ...): Cannot traverse from two IDs that do ' + 'not have a parent path.', start, stop) : invariant(false) : undefined;
|
||||
// Traverse from `start` to `stop` one depth at a time.
|
||||
var depth = 0;
|
||||
var traverse = traverseUp ? getParentID : getNextDescendantID;
|
||||
for (var id = start;; /* until break */id = traverse(id, stop)) {
|
||||
var ret;
|
||||
if ((!skipFirst || id !== start) && (!skipLast || id !== stop)) {
|
||||
ret = cb(id, traverseUp, arg);
|
||||
}
|
||||
if (ret === false || id === stop) {
|
||||
// Only break //after// visiting `stop`.
|
||||
break;
|
||||
}
|
||||
!(depth++ < MAX_TREE_DEPTH) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'traverseParentPath(%s, %s, ...): Detected an infinite loop while ' + 'traversing the React DOM ID tree. This may be due to malformed IDs: %s', start, stop, id) : invariant(false) : undefined;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Manages the IDs assigned to DOM representations of React components. This
|
||||
* uses a specific scheme in order to traverse the DOM efficiently (e.g. in
|
||||
* order to simulate events).
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
var ReactInstanceHandles = {
|
||||
|
||||
/**
|
||||
* Constructs a React root ID
|
||||
* @return {string} A React root ID.
|
||||
*/
|
||||
createReactRootID: function () {
|
||||
return getReactRootIDString(ReactRootIndex.createReactRootIndex());
|
||||
},
|
||||
|
||||
/**
|
||||
* Constructs a React ID by joining a root ID with a name.
|
||||
*
|
||||
* @param {string} rootID Root ID of a parent component.
|
||||
* @param {string} name A component's name (as flattened children).
|
||||
* @return {string} A React ID.
|
||||
* @internal
|
||||
*/
|
||||
createReactID: function (rootID, name) {
|
||||
return rootID + name;
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets the DOM ID of the React component that is the root of the tree that
|
||||
* contains the React component with the supplied DOM ID.
|
||||
*
|
||||
* @param {string} id DOM ID of a React component.
|
||||
* @return {?string} DOM ID of the React component that is the root.
|
||||
* @internal
|
||||
*/
|
||||
getReactRootIDFromNodeID: function (id) {
|
||||
if (id && id.charAt(0) === SEPARATOR && id.length > 1) {
|
||||
var index = id.indexOf(SEPARATOR, 1);
|
||||
return index > -1 ? id.substr(0, index) : id;
|
||||
}
|
||||
return null;
|
||||
},
|
||||
|
||||
/**
|
||||
* Traverses the ID hierarchy and invokes the supplied `cb` on any IDs that
|
||||
* should would receive a `mouseEnter` or `mouseLeave` event.
|
||||
*
|
||||
* NOTE: Does not invoke the callback on the nearest common ancestor because
|
||||
* nothing "entered" or "left" that element.
|
||||
*
|
||||
* @param {string} leaveID ID being left.
|
||||
* @param {string} enterID ID being entered.
|
||||
* @param {function} cb Callback to invoke on each entered/left ID.
|
||||
* @param {*} upArg Argument to invoke the callback with on left IDs.
|
||||
* @param {*} downArg Argument to invoke the callback with on entered IDs.
|
||||
* @internal
|
||||
*/
|
||||
traverseEnterLeave: function (leaveID, enterID, cb, upArg, downArg) {
|
||||
var ancestorID = getFirstCommonAncestorID(leaveID, enterID);
|
||||
if (ancestorID !== leaveID) {
|
||||
traverseParentPath(leaveID, ancestorID, cb, upArg, false, true);
|
||||
}
|
||||
if (ancestorID !== enterID) {
|
||||
traverseParentPath(ancestorID, enterID, cb, downArg, true, false);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Simulates the traversal of a two-phase, capture/bubble event dispatch.
|
||||
*
|
||||
* NOTE: This traversal happens on IDs without touching the DOM.
|
||||
*
|
||||
* @param {string} targetID ID of the target node.
|
||||
* @param {function} cb Callback to invoke.
|
||||
* @param {*} arg Argument to invoke the callback with.
|
||||
* @internal
|
||||
*/
|
||||
traverseTwoPhase: function (targetID, cb, arg) {
|
||||
if (targetID) {
|
||||
traverseParentPath('', targetID, cb, arg, true, false);
|
||||
traverseParentPath(targetID, '', cb, arg, false, true);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Same as `traverseTwoPhase` but skips the `targetID`.
|
||||
*/
|
||||
traverseTwoPhaseSkipTarget: function (targetID, cb, arg) {
|
||||
if (targetID) {
|
||||
traverseParentPath('', targetID, cb, arg, true, true);
|
||||
traverseParentPath(targetID, '', cb, arg, true, true);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Traverse a node ID, calling the supplied `cb` for each ancestor ID. For
|
||||
* example, passing `.0.$row-0.1` would result in `cb` getting called
|
||||
* with `.0`, `.0.$row-0`, and `.0.$row-0.1`.
|
||||
*
|
||||
* NOTE: This traversal happens on IDs without touching the DOM.
|
||||
*
|
||||
* @param {string} targetID ID of the target node.
|
||||
* @param {function} cb Callback to invoke.
|
||||
* @param {*} arg Argument to invoke the callback with.
|
||||
* @internal
|
||||
*/
|
||||
traverseAncestors: function (targetID, cb, arg) {
|
||||
traverseParentPath('', targetID, cb, arg, true, false);
|
||||
},
|
||||
|
||||
getFirstCommonAncestorID: getFirstCommonAncestorID,
|
||||
|
||||
/**
|
||||
* Exposed for unit testing.
|
||||
* @private
|
||||
*/
|
||||
_getNextDescendantID: getNextDescendantID,
|
||||
|
||||
isAncestorIDOf: isAncestorIDOf,
|
||||
|
||||
SEPARATOR: SEPARATOR
|
||||
|
||||
};
|
||||
|
||||
module.exports = ReactInstanceHandles;
|
||||
47
old_major_packages/14/react/lib/ReactInstanceMap.js
Normal file
47
old_major_packages/14/react/lib/ReactInstanceMap.js
Normal file
@@ -0,0 +1,47 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactInstanceMap
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* `ReactInstanceMap` maintains a mapping from a public facing stateful
|
||||
* instance (key) and the internal representation (value). This allows public
|
||||
* methods to accept the user facing instance as an argument and map them back
|
||||
* to internal methods.
|
||||
*/
|
||||
|
||||
// TODO: Replace this with ES6: var ReactInstanceMap = new Map();
|
||||
var ReactInstanceMap = {
|
||||
|
||||
/**
|
||||
* This API should be called `delete` but we'd have to make sure to always
|
||||
* transform these to strings for IE support. When this transform is fully
|
||||
* supported we can rename it.
|
||||
*/
|
||||
remove: function (key) {
|
||||
key._reactInternalInstance = undefined;
|
||||
},
|
||||
|
||||
get: function (key) {
|
||||
return key._reactInternalInstance;
|
||||
},
|
||||
|
||||
has: function (key) {
|
||||
return key._reactInternalInstance !== undefined;
|
||||
},
|
||||
|
||||
set: function (key, value) {
|
||||
key._reactInternalInstance = value;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
module.exports = ReactInstanceMap;
|
||||
74
old_major_packages/14/react/lib/ReactIsomorphic.js
Normal file
74
old_major_packages/14/react/lib/ReactIsomorphic.js
Normal file
@@ -0,0 +1,74 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactIsomorphic
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var ReactChildren = require('./ReactChildren');
|
||||
var ReactComponent = require('./ReactComponent');
|
||||
var ReactClass = require('./ReactClass');
|
||||
var ReactDOMFactories = require('./ReactDOMFactories');
|
||||
var ReactElement = require('./ReactElement');
|
||||
var ReactElementValidator = require('./ReactElementValidator');
|
||||
var ReactPropTypes = require('./ReactPropTypes');
|
||||
var ReactVersion = require('./ReactVersion');
|
||||
|
||||
var assign = require('./Object.assign');
|
||||
var onlyChild = require('./onlyChild');
|
||||
|
||||
var createElement = ReactElement.createElement;
|
||||
var createFactory = ReactElement.createFactory;
|
||||
var cloneElement = ReactElement.cloneElement;
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
createElement = ReactElementValidator.createElement;
|
||||
createFactory = ReactElementValidator.createFactory;
|
||||
cloneElement = ReactElementValidator.cloneElement;
|
||||
}
|
||||
|
||||
var React = {
|
||||
|
||||
// Modern
|
||||
|
||||
Children: {
|
||||
map: ReactChildren.map,
|
||||
forEach: ReactChildren.forEach,
|
||||
count: ReactChildren.count,
|
||||
toArray: ReactChildren.toArray,
|
||||
only: onlyChild
|
||||
},
|
||||
|
||||
Component: ReactComponent,
|
||||
|
||||
createElement: createElement,
|
||||
cloneElement: cloneElement,
|
||||
isValidElement: ReactElement.isValidElement,
|
||||
|
||||
// Classic
|
||||
|
||||
PropTypes: ReactPropTypes,
|
||||
createClass: ReactClass.createClass,
|
||||
createFactory: createFactory,
|
||||
createMixin: function (mixin) {
|
||||
// Currently a noop. Will be used to validate and trace mixins.
|
||||
return mixin;
|
||||
},
|
||||
|
||||
// This looks DOM specific but these are actually isomorphic helpers
|
||||
// since they are just generating DOM strings.
|
||||
DOM: ReactDOMFactories,
|
||||
|
||||
version: ReactVersion,
|
||||
|
||||
// Hook for JSX spread, don't use this for anything else.
|
||||
__spread: assign
|
||||
};
|
||||
|
||||
module.exports = React;
|
||||
69
old_major_packages/14/react/lib/ReactLink.js
Normal file
69
old_major_packages/14/react/lib/ReactLink.js
Normal file
@@ -0,0 +1,69 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactLink
|
||||
* @typechecks static-only
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* ReactLink encapsulates a common pattern in which a component wants to modify
|
||||
* a prop received from its parent. ReactLink allows the parent to pass down a
|
||||
* value coupled with a callback that, when invoked, expresses an intent to
|
||||
* modify that value. For example:
|
||||
*
|
||||
* React.createClass({
|
||||
* getInitialState: function() {
|
||||
* return {value: ''};
|
||||
* },
|
||||
* render: function() {
|
||||
* var valueLink = new ReactLink(this.state.value, this._handleValueChange);
|
||||
* return <input valueLink={valueLink} />;
|
||||
* },
|
||||
* _handleValueChange: function(newValue) {
|
||||
* this.setState({value: newValue});
|
||||
* }
|
||||
* });
|
||||
*
|
||||
* We have provided some sugary mixins to make the creation and
|
||||
* consumption of ReactLink easier; see LinkedValueUtils and LinkedStateMixin.
|
||||
*/
|
||||
|
||||
var React = require('./React');
|
||||
|
||||
/**
|
||||
* @param {*} value current value of the link
|
||||
* @param {function} requestChange callback to request a change
|
||||
*/
|
||||
function ReactLink(value, requestChange) {
|
||||
this.value = value;
|
||||
this.requestChange = requestChange;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a PropType that enforces the ReactLink API and optionally checks the
|
||||
* type of the value being passed inside the link. Example:
|
||||
*
|
||||
* MyComponent.propTypes = {
|
||||
* tabIndexLink: ReactLink.PropTypes.link(React.PropTypes.number)
|
||||
* }
|
||||
*/
|
||||
function createLinkTypeChecker(linkType) {
|
||||
var shapes = {
|
||||
value: typeof linkType === 'undefined' ? React.PropTypes.any.isRequired : linkType.isRequired,
|
||||
requestChange: React.PropTypes.func.isRequired
|
||||
};
|
||||
return React.PropTypes.shape(shapes);
|
||||
}
|
||||
|
||||
ReactLink.PropTypes = {
|
||||
link: createLinkTypeChecker
|
||||
};
|
||||
|
||||
module.exports = ReactLink;
|
||||
45
old_major_packages/14/react/lib/ReactMarkupChecksum.js
Normal file
45
old_major_packages/14/react/lib/ReactMarkupChecksum.js
Normal file
@@ -0,0 +1,45 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactMarkupChecksum
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var adler32 = require('./adler32');
|
||||
|
||||
var TAG_END = /\/?>/;
|
||||
|
||||
var ReactMarkupChecksum = {
|
||||
CHECKSUM_ATTR_NAME: 'data-react-checksum',
|
||||
|
||||
/**
|
||||
* @param {string} markup Markup string
|
||||
* @return {string} Markup string with checksum attribute attached
|
||||
*/
|
||||
addChecksumToMarkup: function (markup) {
|
||||
var checksum = adler32(markup);
|
||||
|
||||
// Add checksum (handle both parent tags and self-closing tags)
|
||||
return markup.replace(TAG_END, ' ' + ReactMarkupChecksum.CHECKSUM_ATTR_NAME + '="' + checksum + '"$&');
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {string} markup to use
|
||||
* @param {DOMElement} element root React element
|
||||
* @returns {boolean} whether or not the markup is the same
|
||||
*/
|
||||
canReuseMarkup: function (markup, element) {
|
||||
var existingChecksum = element.getAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME);
|
||||
existingChecksum = existingChecksum && parseInt(existingChecksum, 10);
|
||||
var markupChecksum = adler32(markup);
|
||||
return markupChecksum === existingChecksum;
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = ReactMarkupChecksum;
|
||||
850
old_major_packages/14/react/lib/ReactMount.js
Normal file
850
old_major_packages/14/react/lib/ReactMount.js
Normal file
@@ -0,0 +1,850 @@
|
||||
/**
|
||||
* Copyright 2013-2015, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @providesModule ReactMount
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var DOMProperty = require('./DOMProperty');
|
||||
var ReactBrowserEventEmitter = require('./ReactBrowserEventEmitter');
|
||||
var ReactCurrentOwner = require('./ReactCurrentOwner');
|
||||
var ReactDOMFeatureFlags = require('./ReactDOMFeatureFlags');
|
||||
var ReactElement = require('./ReactElement');
|
||||
var ReactEmptyComponentRegistry = require('./ReactEmptyComponentRegistry');
|
||||
var ReactInstanceHandles = require('./ReactInstanceHandles');
|
||||
var ReactInstanceMap = require('./ReactInstanceMap');
|
||||
var ReactMarkupChecksum = require('./ReactMarkupChecksum');
|
||||
var ReactPerf = require('./ReactPerf');
|
||||
var ReactReconciler = require('./ReactReconciler');
|
||||
var ReactUpdateQueue = require('./ReactUpdateQueue');
|
||||
var ReactUpdates = require('./ReactUpdates');
|
||||
|
||||
var assign = require('./Object.assign');
|
||||
var emptyObject = require('fbjs/lib/emptyObject');
|
||||
var containsNode = require('fbjs/lib/containsNode');
|
||||
var instantiateReactComponent = require('./instantiateReactComponent');
|
||||
var invariant = require('fbjs/lib/invariant');
|
||||
var setInnerHTML = require('./setInnerHTML');
|
||||
var shouldUpdateReactComponent = require('./shouldUpdateReactComponent');
|
||||
var validateDOMNesting = require('./validateDOMNesting');
|
||||
var warning = require('fbjs/lib/warning');
|
||||
|
||||
var ATTR_NAME = DOMProperty.ID_ATTRIBUTE_NAME;
|
||||
var nodeCache = {};
|
||||
|
||||
var ELEMENT_NODE_TYPE = 1;
|
||||
var DOC_NODE_TYPE = 9;
|
||||
var DOCUMENT_FRAGMENT_NODE_TYPE = 11;
|
||||
|
||||
var ownerDocumentContextKey = '__ReactMount_ownerDocument$' + Math.random().toString(36).slice(2);
|
||||
|
||||
/** Mapping from reactRootID to React component instance. */
|
||||
var instancesByReactRootID = {};
|
||||
|
||||
/** Mapping from reactRootID to `container` nodes. */
|
||||
var containersByReactRootID = {};
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
/** __DEV__-only mapping from reactRootID to root elements. */
|
||||
var rootElementsByReactRootID = {};
|
||||
}
|
||||
|
||||
// Used to store breadth-first search state in findComponentRoot.
|
||||
var findComponentRootReusableArray = [];
|
||||
|
||||
/**
|
||||
* Finds the index of the first character
|
||||
* that's not common between the two given strings.
|
||||
*
|
||||
* @return {number} the index of the character where the strings diverge
|
||||
*/
|
||||
function firstDifferenceIndex(string1, string2) {
|
||||
var minLen = Math.min(string1.length, string2.length);
|
||||
for (var i = 0; i < minLen; i++) {
|
||||
if (string1.charAt(i) !== string2.charAt(i)) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return string1.length === string2.length ? -1 : minLen;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {DOMElement|DOMDocument} container DOM element that may contain
|
||||
* a React component
|
||||
* @return {?*} DOM element that may have the reactRoot ID, or null.
|
||||
*/
|
||||
function getReactRootElementInContainer(container) {
|
||||
if (!container) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (container.nodeType === DOC_NODE_TYPE) {
|
||||
return container.documentElement;
|
||||
} else {
|
||||
return container.firstChild;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {DOMElement} container DOM element that may contain a React component.
|
||||
* @return {?string} A "reactRoot" ID, if a React component is rendered.
|
||||
*/
|
||||
function getReactRootID(container) {
|
||||
var rootElement = getReactRootElementInContainer(container);
|
||||
return rootElement && ReactMount.getID(rootElement);
|
||||
}
|
||||
|
||||
/**
|
||||
* Accessing node[ATTR_NAME] or calling getAttribute(ATTR_NAME) on a form
|
||||
* element can return its control whose name or ID equals ATTR_NAME. All
|
||||
* DOM nodes support `getAttributeNode` but this can also get called on
|
||||
* other objects so just return '' if we're given something other than a
|
||||
* DOM node (such as window).
|
||||
*
|
||||
* @param {?DOMElement|DOMWindow|DOMDocument|DOMTextNode} node DOM node.
|
||||
* @return {string} ID of the supplied `domNode`.
|
||||
*/
|
||||
function getID(node) {
|
||||
var id = internalGetID(node);
|
||||
if (id) {
|
||||
if (nodeCache.hasOwnProperty(id)) {
|
||||
var cached = nodeCache[id];
|
||||
if (cached !== node) {
|
||||
!!isValid(cached, id) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactMount: Two valid but unequal nodes with the same `%s`: %s', ATTR_NAME, id) : invariant(false) : undefined;
|
||||
|
||||
nodeCache[id] = node;
|
||||
}
|
||||
} else {
|
||||
nodeCache[id] = node;
|
||||
}
|
||||
}
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
function internalGetID(node) {
|
||||
// If node is something like a window, document, or text node, none of
|
||||
// which support attributes or a .getAttribute method, gracefully return
|
||||
// the empty string, as if the attribute were missing.
|
||||
return node && node.getAttribute && node.getAttribute(ATTR_NAME) || '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the React-specific ID of the given node.
|
||||
*
|
||||
* @param {DOMElement} node The DOM node whose ID will be set.
|
||||
* @param {string} id The value of the ID attribute.
|
||||
*/
|
||||
function setID(node, id) {
|
||||
var oldID = internalGetID(node);
|
||||
if (oldID !== id) {
|
||||
delete nodeCache[oldID];
|
||||
}
|
||||
node.setAttribute(ATTR_NAME, id);
|
||||
nodeCache[id] = node;
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds the node with the supplied React-generated DOM ID.
|
||||
*
|
||||
* @param {string} id A React-generated DOM ID.
|
||||
* @return {DOMElement} DOM node with the suppled `id`.
|
||||
* @internal
|
||||
*/
|
||||
function getNode(id) {
|
||||
if (!nodeCache.hasOwnProperty(id) || !isValid(nodeCache[id], id)) {
|
||||
nodeCache[id] = ReactMount.findReactNodeByID(id);
|
||||
}
|
||||
return nodeCache[id];
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds the node with the supplied public React instance.
|
||||
*
|
||||
* @param {*} instance A public React instance.
|
||||
* @return {?DOMElement} DOM node with the suppled `id`.
|
||||
* @internal
|
||||
*/
|
||||
function getNodeFromInstance(instance) {
|
||||
var id = ReactInstanceMap.get(instance)._rootNodeID;
|
||||
if (ReactEmptyComponentRegistry.isNullComponentID(id)) {
|
||||
return null;
|
||||
}
|
||||
if (!nodeCache.hasOwnProperty(id) || !isValid(nodeCache[id], id)) {
|
||||
nodeCache[id] = ReactMount.findReactNodeByID(id);
|
||||
}
|
||||
return nodeCache[id];
|
||||
}
|
||||
|
||||
/**
|
||||
* A node is "valid" if it is contained by a currently mounted container.
|
||||
*
|
||||
* This means that the node does not have to be contained by a document in
|
||||
* order to be considered valid.
|
||||
*
|
||||
* @param {?DOMElement} node The candidate DOM node.
|
||||
* @param {string} id The expected ID of the node.
|
||||
* @return {boolean} Whether the node is contained by a mounted container.
|
||||
*/
|
||||
function isValid(node, id) {
|
||||
if (node) {
|
||||
!(internalGetID(node) === id) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactMount: Unexpected modification of `%s`', ATTR_NAME) : invariant(false) : undefined;
|
||||
|
||||
var container = ReactMount.findReactContainerForID(id);
|
||||
if (container && containsNode(container, node)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Causes the cache to forget about one React-specific ID.
|
||||
*
|
||||
* @param {string} id The ID to forget.
|
||||
*/
|
||||
function purgeID(id) {
|
||||
delete nodeCache[id];
|
||||
}
|
||||
|
||||
var deepestNodeSoFar = null;
|
||||
function findDeepestCachedAncestorImpl(ancestorID) {
|
||||
var ancestor = nodeCache[ancestorID];
|
||||
if (ancestor && isValid(ancestor, ancestorID)) {
|
||||
deepestNodeSoFar = ancestor;
|
||||
} else {
|
||||
// This node isn't populated in the cache, so presumably none of its
|
||||
// descendants are. Break out of the loop.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the deepest cached node whose ID is a prefix of `targetID`.
|
||||
*/
|
||||
function findDeepestCachedAncestor(targetID) {
|
||||
deepestNodeSoFar = null;
|
||||
ReactInstanceHandles.traverseAncestors(targetID, findDeepestCachedAncestorImpl);
|
||||
|
||||
var foundNode = deepestNodeSoFar;
|
||||
deepestNodeSoFar = null;
|
||||
return foundNode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mounts this component and inserts it into the DOM.
|
||||
*
|
||||
* @param {ReactComponent} componentInstance The instance to mount.
|
||||
* @param {string} rootID DOM ID of the root node.
|
||||
* @param {DOMElement} container DOM element to mount into.
|
||||
* @param {ReactReconcileTransaction} transaction
|
||||
* @param {boolean} shouldReuseMarkup If true, do not insert markup
|
||||
*/
|
||||
function mountComponentIntoNode(componentInstance, rootID, container, transaction, shouldReuseMarkup, context) {
|
||||
if (ReactDOMFeatureFlags.useCreateElement) {
|
||||
context = assign({}, context);
|
||||
if (container.nodeType === DOC_NODE_TYPE) {
|
||||
context[ownerDocumentContextKey] = container;
|
||||
} else {
|
||||
context[ownerDocumentContextKey] = container.ownerDocument;
|
||||
}
|
||||
}
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
if (context === emptyObject) {
|
||||
context = {};
|
||||
}
|
||||
var tag = container.nodeName.toLowerCase();
|
||||
context[validateDOMNesting.ancestorInfoContextKey] = validateDOMNesting.updatedAncestorInfo(null, tag, null);
|
||||
}
|
||||
var markup = ReactReconciler.mountComponent(componentInstance, rootID, transaction, context);
|
||||
componentInstance._renderedComponent._topLevelWrapper = componentInstance;
|
||||
ReactMount._mountImageIntoNode(markup, container, shouldReuseMarkup, transaction);
|
||||
}
|
||||
|
||||
/**
|
||||
* Batched mount.
|
||||
*
|
||||
* @param {ReactComponent} componentInstance The instance to mount.
|
||||
* @param {string} rootID DOM ID of the root node.
|
||||
* @param {DOMElement} container DOM element to mount into.
|
||||
* @param {boolean} shouldReuseMarkup If true, do not insert markup
|
||||
*/
|
||||
function batchedMountComponentIntoNode(componentInstance, rootID, container, shouldReuseMarkup, context) {
|
||||
var transaction = ReactUpdates.ReactReconcileTransaction.getPooled(
|
||||
/* forceHTML */shouldReuseMarkup);
|
||||
transaction.perform(mountComponentIntoNode, null, componentInstance, rootID, container, transaction, shouldReuseMarkup, context);
|
||||
ReactUpdates.ReactReconcileTransaction.release(transaction);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unmounts a component and removes it from the DOM.
|
||||
*
|
||||
* @param {ReactComponent} instance React component instance.
|
||||
* @param {DOMElement} container DOM element to unmount from.
|
||||
* @final
|
||||
* @internal
|
||||
* @see {ReactMount.unmountComponentAtNode}
|
||||
*/
|
||||
function unmountComponentFromNode(instance, container) {
|
||||
ReactReconciler.unmountComponent(instance);
|
||||
|
||||
if (container.nodeType === DOC_NODE_TYPE) {
|
||||
container = container.documentElement;
|
||||
}
|
||||
|
||||
// http://jsperf.com/emptying-a-node
|
||||
while (container.lastChild) {
|
||||
container.removeChild(container.lastChild);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* True if the supplied DOM node has a direct React-rendered child that is
|
||||
* not a React root element. Useful for warning in `render`,
|
||||
* `unmountComponentAtNode`, etc.
|
||||
*
|
||||
* @param {?DOMElement} node The candidate DOM node.
|
||||
* @return {boolean} True if the DOM element contains a direct child that was
|
||||
* rendered by React but is not a root element.
|
||||
* @internal
|
||||
*/
|
||||
function hasNonRootReactChild(node) {
|
||||
var reactRootID = getReactRootID(node);
|
||||
return reactRootID ? reactRootID !== ReactInstanceHandles.getReactRootIDFromNodeID(reactRootID) : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the first (deepest) ancestor of a node which is rendered by this copy
|
||||
* of React.
|
||||
*/
|
||||
function findFirstReactDOMImpl(node) {
|
||||
// This node might be from another React instance, so we make sure not to
|
||||
// examine the node cache here
|
||||
for (; node && node.parentNode !== node; node = node.parentNode) {
|
||||
if (node.nodeType !== 1) {
|
||||
// Not a DOMElement, therefore not a React component
|
||||
continue;
|
||||
}
|
||||
var nodeID = internalGetID(node);
|
||||
if (!nodeID) {
|
||||
continue;
|
||||
}
|
||||
var reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(nodeID);
|
||||
|
||||
// If containersByReactRootID contains the container we find by crawling up
|
||||
// the tree, we know that this instance of React rendered the node.
|
||||
// nb. isValid's strategy (with containsNode) does not work because render
|
||||
// trees may be nested and we don't want a false positive in that case.
|
||||
var current = node;
|
||||
var lastID;
|
||||
do {
|
||||
lastID = internalGetID(current);
|
||||
current = current.parentNode;
|
||||
if (current == null) {
|
||||
// The passed-in node has been detached from the container it was
|
||||
// originally rendered into.
|
||||
return null;
|
||||
}
|
||||
} while (lastID !== reactRootID);
|
||||
|
||||
if (current === containersByReactRootID[reactRootID]) {
|
||||
return node;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Temporary (?) hack so that we can store all top-level pending updates on
|
||||
* composites instead of having to worry about different types of components
|
||||
* here.
|
||||
*/
|
||||
var TopLevelWrapper = function () {};
|
||||
TopLevelWrapper.prototype.isReactComponent = {};
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
TopLevelWrapper.displayName = 'TopLevelWrapper';
|
||||
}
|
||||
TopLevelWrapper.prototype.render = function () {
|
||||
// this.props is actually a ReactElement
|
||||
return this.props;
|
||||
};
|
||||
|
||||
/**
|
||||
* Mounting is the process of initializing a React component by creating its
|
||||
* representative DOM elements and inserting them into a supplied `container`.
|
||||
* Any prior content inside `container` is destroyed in the process.
|
||||
*
|
||||
* ReactMount.render(
|
||||
* component,
|
||||
* document.getElementById('container')
|
||||
* );
|
||||
*
|
||||
* <div id="container"> <-- Supplied `container`.
|
||||
* <div data-reactid=".3"> <-- Rendered reactRoot of React
|
||||
* // ... component.
|
||||
* </div>
|
||||
* </div>
|
||||
*
|
||||
* Inside of `container`, the first element rendered is the "reactRoot".
|
||||
*/
|
||||
var ReactMount = {
|
||||
|
||||
TopLevelWrapper: TopLevelWrapper,
|
||||
|
||||
/** Exposed for debugging purposes **/
|
||||
_instancesByReactRootID: instancesByReactRootID,
|
||||
|
||||
/**
|
||||
* This is a hook provided to support rendering React components while
|
||||
* ensuring that the apparent scroll position of its `container` does not
|
||||
* change.
|
||||
*
|
||||
* @param {DOMElement} container The `container` being rendered into.
|
||||
* @param {function} renderCallback This must be called once to do the render.
|
||||
*/
|
||||
scrollMonitor: function (container, renderCallback) {
|
||||
renderCallback();
|
||||
},
|
||||
|
||||
/**
|
||||
* Take a component that's already mounted into the DOM and replace its props
|
||||
* @param {ReactComponent} prevComponent component instance already in the DOM
|
||||
* @param {ReactElement} nextElement component instance to render
|
||||
* @param {DOMElement} container container to render into
|
||||
* @param {?function} callback function triggered on completion
|
||||
*/
|
||||
_updateRootComponent: function (prevComponent, nextElement, container, callback) {
|
||||
ReactMount.scrollMonitor(container, function () {
|
||||
ReactUpdateQueue.enqueueElementInternal(prevComponent, nextElement);
|
||||
if (callback) {
|
||||
ReactUpdateQueue.enqueueCallbackInternal(prevComponent, callback);
|
||||
}
|
||||
});
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
// Record the root element in case it later gets transplanted.
|
||||
rootElementsByReactRootID[getReactRootID(container)] = getReactRootElementInContainer(container);
|
||||
}
|
||||
|
||||
return prevComponent;
|
||||
},
|
||||
|
||||
/**
|
||||
* Register a component into the instance map and starts scroll value
|
||||
* monitoring
|
||||
* @param {ReactComponent} nextComponent component instance to render
|
||||
* @param {DOMElement} container container to render into
|
||||
* @return {string} reactRoot ID prefix
|
||||
*/
|
||||
_registerComponent: function (nextComponent, container) {
|
||||
!(container && (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE || container.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '_registerComponent(...): Target container is not a DOM element.') : invariant(false) : undefined;
|
||||
|
||||
ReactBrowserEventEmitter.ensureScrollValueMonitoring();
|
||||
|
||||
var reactRootID = ReactMount.registerContainer(container);
|
||||
instancesByReactRootID[reactRootID] = nextComponent;
|
||||
return reactRootID;
|
||||
},
|
||||
|
||||
/**
|
||||
* Render a new component into the DOM.
|
||||
* @param {ReactElement} nextElement element to render
|
||||
* @param {DOMElement} container container to render into
|
||||
* @param {boolean} shouldReuseMarkup if we should skip the markup insertion
|
||||
* @return {ReactComponent} nextComponent
|
||||
*/
|
||||
_renderNewRootComponent: function (nextElement, container, shouldReuseMarkup, context) {
|
||||
// Various parts of our code (such as ReactCompositeComponent's
|
||||
// _renderValidatedComponent) assume that calls to render aren't nested;
|
||||
// verify that that's the case.
|
||||
process.env.NODE_ENV !== 'production' ? warning(ReactCurrentOwner.current == null, '_renderNewRootComponent(): Render methods should be a pure function ' + 'of props and state; triggering nested component updates from ' + 'render is not allowed. If necessary, trigger nested updates in ' + 'componentDidUpdate. Check the render method of %s.', ReactCurrentOwner.current && ReactCurrentOwner.current.getName() || 'ReactCompositeComponent') : undefined;
|
||||
|
||||
var componentInstance = instantiateReactComponent(nextElement, null);
|
||||
var reactRootID = ReactMount._registerComponent(componentInstance, container);
|
||||
|
||||
// The initial render is synchronous but any updates that happen during
|
||||
// rendering, in componentWillMount or componentDidMount, will be batched
|
||||
// according to the current batching strategy.
|
||||
|
||||
ReactUpdates.batchedUpdates(batchedMountComponentIntoNode, componentInstance, reactRootID, container, shouldReuseMarkup, context);
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
// Record the root element in case it later gets transplanted.
|
||||
rootElementsByReactRootID[reactRootID] = getReactRootElementInContainer(container);
|
||||
}
|
||||
|
||||
return componentInstance;
|
||||
},
|
||||
|
||||
/**
|
||||
* Renders a React component into the DOM in the supplied `container`.
|
||||
*
|
||||
* If the React component was previously rendered into `container`, this will
|
||||
* perform an update on it and only mutate the DOM as necessary to reflect the
|
||||
* latest React component.
|
||||
*
|
||||
* @param {ReactComponent} parentComponent The conceptual parent of this render tree.
|
||||
* @param {ReactElement} nextElement Component element to render.
|
||||
* @param {DOMElement} container DOM element to render into.
|
||||
* @param {?function} callback function triggered on completion
|
||||
* @return {ReactComponent} Component instance rendered in `container`.
|
||||
*/
|
||||
renderSubtreeIntoContainer: function (parentComponent, nextElement, container, callback) {
|
||||
!(parentComponent != null && parentComponent._reactInternalInstance != null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'parentComponent must be a valid React Component') : invariant(false) : undefined;
|
||||
return ReactMount._renderSubtreeIntoContainer(parentComponent, nextElement, container, callback);
|
||||
},
|
||||
|
||||
_renderSubtreeIntoContainer: function (parentComponent, nextElement, container, callback) {
|
||||
!ReactElement.isValidElement(nextElement) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactDOM.render(): Invalid component element.%s', typeof nextElement === 'string' ? ' Instead of passing an element string, make sure to instantiate ' + 'it by passing it to React.createElement.' : typeof nextElement === 'function' ? ' Instead of passing a component class, make sure to instantiate ' + 'it by passing it to React.createElement.' :
|
||||
// Check if it quacks like an element
|
||||
nextElement != null && nextElement.props !== undefined ? ' This may be caused by unintentionally loading two independent ' + 'copies of React.' : '') : invariant(false) : undefined;
|
||||
|
||||
process.env.NODE_ENV !== 'production' ? warning(!container || !container.tagName || container.tagName.toUpperCase() !== 'BODY', 'render(): Rendering components directly into document.body is ' + 'discouraged, since its children are often manipulated by third-party ' + 'scripts and browser extensions. This may lead to subtle ' + 'reconciliation issues. Try rendering into a container element created ' + 'for your app.') : undefined;
|
||||
|
||||
var nextWrappedElement = new ReactElement(TopLevelWrapper, null, null, null, null, null, nextElement);
|
||||
|
||||
var prevComponent = instancesByReactRootID[getReactRootID(container)];
|
||||
|
||||
if (prevComponent) {
|
||||
var prevWrappedElement = prevComponent._currentElement;
|
||||
var prevElement = prevWrappedElement.props;
|
||||
if (shouldUpdateReactComponent(prevElement, nextElement)) {
|
||||
var publicInst = prevComponent._renderedComponent.getPublicInstance();
|
||||
var updatedCallback = callback && function () {
|
||||
callback.call(publicInst);
|
||||
};
|
||||
ReactMount._updateRootComponent(prevComponent, nextWrappedElement, container, updatedCallback);
|
||||
return publicInst;
|
||||
} else {
|
||||
ReactMount.unmountComponentAtNode(container);
|
||||
}
|
||||
}
|
||||
|
||||
var reactRootElement = getReactRootElementInContainer(container);
|
||||
var containerHasReactMarkup = reactRootElement && !!internalGetID(reactRootElement);
|
||||
var containerHasNonRootReactChild = hasNonRootReactChild(container);
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
process.env.NODE_ENV !== 'production' ? warning(!containerHasNonRootReactChild, 'render(...): Replacing React-rendered children with a new root ' + 'component. If you intended to update the children of this node, ' + 'you should instead have the existing children update their state ' + 'and render the new components instead of calling ReactDOM.render.') : undefined;
|
||||
|
||||
if (!containerHasReactMarkup || reactRootElement.nextSibling) {
|
||||
var rootElementSibling = reactRootElement;
|
||||
while (rootElementSibling) {
|
||||
if (internalGetID(rootElementSibling)) {
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'render(): Target node has markup rendered by React, but there ' + 'are unrelated nodes as well. This is most commonly caused by ' + 'white-space inserted around server-rendered markup.') : undefined;
|
||||
break;
|
||||
}
|
||||
rootElementSibling = rootElementSibling.nextSibling;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var shouldReuseMarkup = containerHasReactMarkup && !prevComponent && !containerHasNonRootReactChild;
|
||||
var component = ReactMount._renderNewRootComponent(nextWrappedElement, container, shouldReuseMarkup, parentComponent != null ? parentComponent._reactInternalInstance._processChildContext(parentComponent._reactInternalInstance._context) : emptyObject)._renderedComponent.getPublicInstance();
|
||||
if (callback) {
|
||||
callback.call(component);
|
||||
}
|
||||
return component;
|
||||
},
|
||||
|
||||
/**
|
||||
* Renders a React component into the DOM in the supplied `container`.
|
||||
*
|
||||
* If the React component was previously rendered into `container`, this will
|
||||
* perform an update on it and only mutate the DOM as necessary to reflect the
|
||||
* latest React component.
|
||||
*
|
||||
* @param {ReactElement} nextElement Component element to render.
|
||||
* @param {DOMElement} container DOM element to render into.
|
||||
* @param {?function} callback function triggered on completion
|
||||
* @return {ReactComponent} Component instance rendered in `container`.
|
||||
*/
|
||||
render: function (nextElement, container, callback) {
|
||||
return ReactMount._renderSubtreeIntoContainer(null, nextElement, container, callback);
|
||||
},
|
||||
|
||||
/**
|
||||
* Registers a container node into which React components will be rendered.
|
||||
* This also creates the "reactRoot" ID that will be assigned to the element
|
||||
* rendered within.
|
||||
*
|
||||
* @param {DOMElement} container DOM element to register as a container.
|
||||
* @return {string} The "reactRoot" ID of elements rendered within.
|
||||
*/
|
||||
registerContainer: function (container) {
|
||||
var reactRootID = getReactRootID(container);
|
||||
if (reactRootID) {
|
||||
// If one exists, make sure it is a valid "reactRoot" ID.
|
||||
reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(reactRootID);
|
||||
}
|
||||
if (!reactRootID) {
|
||||
// No valid "reactRoot" ID found, create one.
|
||||
reactRootID = ReactInstanceHandles.createReactRootID();
|
||||
}
|
||||
containersByReactRootID[reactRootID] = container;
|
||||
return reactRootID;
|
||||
},
|
||||
|
||||
/**
|
||||
* Unmounts and destroys the React component rendered in the `container`.
|
||||
*
|
||||
* @param {DOMElement} container DOM element containing a React component.
|
||||
* @return {boolean} True if a component was found in and unmounted from
|
||||
* `container`
|
||||
*/
|
||||
unmountComponentAtNode: function (container) {
|
||||
// Various parts of our code (such as ReactCompositeComponent's
|
||||
// _renderValidatedComponent) assume that calls to render aren't nested;
|
||||
// verify that that's the case. (Strictly speaking, unmounting won't cause a
|
||||
// render but we still don't expect to be in a render call here.)
|
||||
process.env.NODE_ENV !== 'production' ? warning(ReactCurrentOwner.current == null, 'unmountComponentAtNode(): Render methods should be a pure function ' + 'of props and state; triggering nested component updates from render ' + 'is not allowed. If necessary, trigger nested updates in ' + 'componentDidUpdate. Check the render method of %s.', ReactCurrentOwner.current && ReactCurrentOwner.current.getName() || 'ReactCompositeComponent') : undefined;
|
||||
|
||||
!(container && (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE || container.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'unmountComponentAtNode(...): Target container is not a DOM element.') : invariant(false) : undefined;
|
||||
|
||||
var reactRootID = getReactRootID(container);
|
||||
var component = instancesByReactRootID[reactRootID];
|
||||
if (!component) {
|
||||
// Check if the node being unmounted was rendered by React, but isn't a
|
||||
// root node.
|
||||
var containerHasNonRootReactChild = hasNonRootReactChild(container);
|
||||
|
||||
// Check if the container itself is a React root node.
|
||||
var containerID = internalGetID(container);
|
||||
var isContainerReactRoot = containerID && containerID === ReactInstanceHandles.getReactRootIDFromNodeID(containerID);
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
process.env.NODE_ENV !== 'production' ? warning(!containerHasNonRootReactChild, 'unmountComponentAtNode(): The node you\'re attempting to unmount ' + 'was rendered by React and is not a top-level container. %s', isContainerReactRoot ? 'You may have accidentally passed in a React root node instead ' + 'of its container.' : 'Instead, have the parent component update its state and ' + 'rerender in order to remove this component.') : undefined;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
ReactUpdates.batchedUpdates(unmountComponentFromNode, component, container);
|
||||
delete instancesByReactRootID[reactRootID];
|
||||
delete containersByReactRootID[reactRootID];
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
delete rootElementsByReactRootID[reactRootID];
|
||||
}
|
||||
return true;
|
||||
},
|
||||
|
||||
/**
|
||||
* Finds the container DOM element that contains React component to which the
|
||||
* supplied DOM `id` belongs.
|
||||
*
|
||||
* @param {string} id The ID of an element rendered by a React component.
|
||||
* @return {?DOMElement} DOM element that contains the `id`.
|
||||
*/
|
||||
findReactContainerForID: function (id) {
|
||||
var reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(id);
|
||||
var container = containersByReactRootID[reactRootID];
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
var rootElement = rootElementsByReactRootID[reactRootID];
|
||||
if (rootElement && rootElement.parentNode !== container) {
|
||||
process.env.NODE_ENV !== 'production' ? warning(
|
||||
// Call internalGetID here because getID calls isValid which calls
|
||||
// findReactContainerForID (this function).
|
||||
internalGetID(rootElement) === reactRootID, 'ReactMount: Root element ID differed from reactRootID.') : undefined;
|
||||
var containerChild = container.firstChild;
|
||||
if (containerChild && reactRootID === internalGetID(containerChild)) {
|
||||
// If the container has a new child with the same ID as the old
|
||||
// root element, then rootElementsByReactRootID[reactRootID] is
|
||||
// just stale and needs to be updated. The case that deserves a
|
||||
// warning is when the container is empty.
|
||||
rootElementsByReactRootID[reactRootID] = containerChild;
|
||||
} else {
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'ReactMount: Root element has been removed from its original ' + 'container. New container: %s', rootElement.parentNode) : undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return container;
|
||||
},
|
||||
|
||||
/**
|
||||
* Finds an element rendered by React with the supplied ID.
|
||||
*
|
||||
* @param {string} id ID of a DOM node in the React component.
|
||||
* @return {DOMElement} Root DOM node of the React component.
|
||||
*/
|
||||
findReactNodeByID: function (id) {
|
||||
var reactRoot = ReactMount.findReactContainerForID(id);
|
||||
return ReactMount.findComponentRoot(reactRoot, id);
|
||||
},
|
||||
|
||||
/**
|
||||
* Traverses up the ancestors of the supplied node to find a node that is a
|
||||
* DOM representation of a React component rendered by this copy of React.
|
||||
*
|
||||
* @param {*} node
|
||||
* @return {?DOMEventTarget}
|
||||
* @internal
|
||||
*/
|
||||
getFirstReactDOM: function (node) {
|
||||
return findFirstReactDOMImpl(node);
|
||||
},
|
||||
|
||||
/**
|
||||
* Finds a node with the supplied `targetID` inside of the supplied
|
||||
* `ancestorNode`. Exploits the ID naming scheme to perform the search
|
||||
* quickly.
|
||||
*
|
||||
* @param {DOMEventTarget} ancestorNode Search from this root.
|
||||
* @pararm {string} targetID ID of the DOM representation of the component.
|
||||
* @return {DOMEventTarget} DOM node with the supplied `targetID`.
|
||||
* @internal
|
||||
*/
|
||||
findComponentRoot: function (ancestorNode, targetID) {
|
||||
var firstChildren = findComponentRootReusableArray;
|
||||
var childIndex = 0;
|
||||
|
||||
var deepestAncestor = findDeepestCachedAncestor(targetID) || ancestorNode;
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
// This will throw on the next line; give an early warning
|
||||
process.env.NODE_ENV !== 'production' ? warning(deepestAncestor != null, 'React can\'t find the root component node for data-reactid value ' + '`%s`. If you\'re seeing this message, it probably means that ' + 'you\'ve loaded two copies of React on the page. At this time, only ' + 'a single copy of React can be loaded at a time.', targetID) : undefined;
|
||||
}
|
||||
|
||||
firstChildren[0] = deepestAncestor.firstChild;
|
||||
firstChildren.length = 1;
|
||||
|
||||
while (childIndex < firstChildren.length) {
|
||||
var child = firstChildren[childIndex++];
|
||||
var targetChild;
|
||||
|
||||
while (child) {
|
||||
var childID = ReactMount.getID(child);
|
||||
if (childID) {
|
||||
// Even if we find the node we're looking for, we finish looping
|
||||
// through its siblings to ensure they're cached so that we don't have
|
||||
// to revisit this node again. Otherwise, we make n^2 calls to getID
|
||||
// when visiting the many children of a single node in order.
|
||||
|
||||
if (targetID === childID) {
|
||||
targetChild = child;
|
||||
} else if (ReactInstanceHandles.isAncestorIDOf(childID, targetID)) {
|
||||
// If we find a child whose ID is an ancestor of the given ID,
|
||||
// then we can be sure that we only want to search the subtree
|
||||
// rooted at this child, so we can throw out the rest of the
|
||||
// search state.
|
||||
firstChildren.length = childIndex = 0;
|
||||
firstChildren.push(child.firstChild);
|
||||
}
|
||||
} else {
|
||||
// If this child had no ID, then there's a chance that it was
|
||||
// injected automatically by the browser, as when a `<table>`
|
||||
// element sprouts an extra `<tbody>` child as a side effect of
|
||||
// `.innerHTML` parsing. Optimistically continue down this
|
||||
// branch, but not before examining the other siblings.
|
||||
firstChildren.push(child.firstChild);
|
||||
}
|
||||
|
||||
child = child.nextSibling;
|
||||
}
|
||||
|
||||
if (targetChild) {
|
||||
// Emptying firstChildren/findComponentRootReusableArray is
|
||||
// not necessary for correctness, but it helps the GC reclaim
|
||||
// any nodes that were left at the end of the search.
|
||||
firstChildren.length = 0;
|
||||
|
||||
return targetChild;
|
||||
}
|
||||
}
|
||||
|
||||
firstChildren.length = 0;
|
||||
|
||||
!false ? process.env.NODE_ENV !== 'production' ? invariant(false, 'findComponentRoot(..., %s): Unable to find element. This probably ' + 'means the DOM was unexpectedly mutated (e.g., by the browser), ' + 'usually due to forgetting a <tbody> when using tables, nesting tags ' + 'like <form>, <p>, or <a>, or using non-SVG elements in an <svg> ' + 'parent. ' + 'Try inspecting the child nodes of the element with React ID `%s`.', targetID, ReactMount.getID(ancestorNode)) : invariant(false) : undefined;
|
||||
},
|
||||
|
||||
_mountImageIntoNode: function (markup, container, shouldReuseMarkup, transaction) {
|
||||
!(container && (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE || container.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'mountComponentIntoNode(...): Target container is not valid.') : invariant(false) : undefined;
|
||||
|
||||
if (shouldReuseMarkup) {
|
||||
var rootElement = getReactRootElementInContainer(container);
|
||||
if (ReactMarkupChecksum.canReuseMarkup(markup, rootElement)) {
|
||||
return;
|
||||
} else {
|
||||
var checksum = rootElement.getAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME);
|
||||
rootElement.removeAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME);
|
||||
|
||||
var rootMarkup = rootElement.outerHTML;
|
||||
rootElement.setAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME, checksum);
|
||||
|
||||
var normalizedMarkup = markup;
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
// because rootMarkup is retrieved from the DOM, various normalizations
|
||||
// will have occurred which will not be present in `markup`. Here,
|
||||
// insert markup into a <div> or <iframe> depending on the container
|
||||
// type to perform the same normalizations before comparing.
|
||||
var normalizer;
|
||||
if (container.nodeType === ELEMENT_NODE_TYPE) {
|
||||
normalizer = document.createElement('div');
|
||||
normalizer.innerHTML = markup;
|
||||
normalizedMarkup = normalizer.innerHTML;
|
||||
} else {
|
||||
normalizer = document.createElement('iframe');
|
||||
document.body.appendChild(normalizer);
|
||||
normalizer.contentDocument.write(markup);
|
||||
normalizedMarkup = normalizer.contentDocument.documentElement.outerHTML;
|
||||
document.body.removeChild(normalizer);
|
||||
}
|
||||
}
|
||||
|
||||
var diffIndex = firstDifferenceIndex(normalizedMarkup, rootMarkup);
|
||||
var difference = ' (client) ' + normalizedMarkup.substring(diffIndex - 20, diffIndex + 20) + '\n (server) ' + rootMarkup.substring(diffIndex - 20, diffIndex + 20);
|
||||
|
||||
!(container.nodeType !== DOC_NODE_TYPE) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'You\'re trying to render a component to the document using ' + 'server rendering but the checksum was invalid. This usually ' + 'means you rendered a different component type or props on ' + 'the client from the one on the server, or your render() ' + 'methods are impure. React cannot handle this case due to ' + 'cross-browser quirks by rendering at the document root. You ' + 'should look for environment dependent code in your components ' + 'and ensure the props are the same client and server side:\n%s', difference) : invariant(false) : undefined;
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
process.env.NODE_ENV !== 'production' ? warning(false, 'React attempted to reuse markup in a container but the ' + 'checksum was invalid. This generally means that you are ' + 'using server rendering and the markup generated on the ' + 'server was not what the client was expecting. React injected ' + 'new markup to compensate which works but you have lost many ' + 'of the benefits of server rendering. Instead, figure out ' + 'why the markup being generated is different on the client ' + 'or server:\n%s', difference) : undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
!(container.nodeType !== DOC_NODE_TYPE) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'You\'re trying to render a component to the document but ' + 'you didn\'t use server rendering. We can\'t do this ' + 'without using server rendering due to cross-browser quirks. ' + 'See ReactDOMServer.renderToString() for server rendering.') : invariant(false) : undefined;
|
||||
|
||||
if (transaction.useCreateElement) {
|
||||
while (container.lastChild) {
|
||||
container.removeChild(container.lastChild);
|
||||
}
|
||||
container.appendChild(markup);
|
||||
} else {
|
||||
setInnerHTML(container, markup);
|
||||
}
|
||||
},
|
||||
|
||||
ownerDocumentContextKey: ownerDocumentContextKey,
|
||||
|
||||
/**
|
||||
* React ID utilities.
|
||||
*/
|
||||
|
||||
getReactRootID: getReactRootID,
|
||||
|
||||
getID: getID,
|
||||
|
||||
setID: setID,
|
||||
|
||||
getNode: getNode,
|
||||
|
||||
getNodeFromInstance: getNodeFromInstance,
|
||||
|
||||
isValid: isValid,
|
||||
|
||||
purgeID: purgeID
|
||||
};
|
||||
|
||||
ReactPerf.measureMethods(ReactMount, 'ReactMount', {
|
||||
_renderNewRootComponent: '_renderNewRootComponent',
|
||||
_mountImageIntoNode: '_mountImageIntoNode'
|
||||
});
|
||||
|
||||
module.exports = ReactMount;
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user