UNPKG

react-pivot

Version:

React-Pivot is a data-grid component with pivot-table-like functionality for data display, filtering, and exploration.

244 lines (217 loc) 8.13 kB
/** * Copyright 2014, 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 ReactLegacyElement */ "use strict"; var ReactCurrentOwner = require("./ReactCurrentOwner"); var invariant = require("./invariant"); var monitorCodeUse = require("./monitorCodeUse"); var warning = require("./warning"); var legacyFactoryLogs = {}; function warnForLegacyFactoryCall() { if (!ReactLegacyElementFactory._isLegacyCallWarningEnabled) { return; } var owner = ReactCurrentOwner.current; var name = owner && owner.constructor ? owner.constructor.displayName : ''; if (!name) { name = 'Something'; } if (legacyFactoryLogs.hasOwnProperty(name)) { return; } legacyFactoryLogs[name] = true; ("production" !== process.env.NODE_ENV ? warning( false, name + ' is calling a React component directly. ' + 'Use a factory or JSX instead. See: http://fb.me/react-legacyfactory' ) : null); monitorCodeUse('react_legacy_factory_call', { version: 3, name: name }); } function warnForPlainFunctionType(type) { var isReactClass = type.prototype && typeof type.prototype.mountComponent === 'function' && typeof type.prototype.receiveComponent === 'function'; if (isReactClass) { ("production" !== process.env.NODE_ENV ? warning( false, 'Did not expect to get a React class here. Use `Component` instead ' + 'of `Component.type` or `this.constructor`.' ) : null); } else { if (!type._reactWarnedForThisType) { try { type._reactWarnedForThisType = true; } catch (x) { // just incase this is a frozen object or some special object } monitorCodeUse( 'react_non_component_in_jsx', { version: 3, name: type.name } ); } ("production" !== process.env.NODE_ENV ? warning( false, 'This JSX uses a plain function. Only React components are ' + 'valid in React\'s JSX transform.' ) : null); } } function warnForNonLegacyFactory(type) { ("production" !== process.env.NODE_ENV ? warning( false, 'Do not pass React.DOM.' + type.type + ' to JSX or createFactory. ' + 'Use the string "' + type.type + '" instead.' ) : null); } /** * Transfer static properties from the source to the target. Functions are * rebound to have this reflect the original source. */ function proxyStaticMethods(target, source) { if (typeof source !== 'function') { return; } for (var key in source) { if (source.hasOwnProperty(key)) { var value = source[key]; if (typeof value === 'function') { var bound = value.bind(source); // Copy any properties defined on the function, such as `isRequired` on // a PropTypes validator. for (var k in value) { if (value.hasOwnProperty(k)) { bound[k] = value[k]; } } target[key] = bound; } else { target[key] = value; } } } } // We use an object instead of a boolean because booleans are ignored by our // mocking libraries when these factories gets mocked. var LEGACY_MARKER = {}; var NON_LEGACY_MARKER = {}; var ReactLegacyElementFactory = {}; ReactLegacyElementFactory.wrapCreateFactory = function(createFactory) { var legacyCreateFactory = function(type) { if (typeof type !== 'function') { // Non-function types cannot be legacy factories return createFactory(type); } if (type.isReactNonLegacyFactory) { // This is probably a factory created by ReactDOM we unwrap it to get to // the underlying string type. It shouldn't have been passed here so we // warn. if ("production" !== process.env.NODE_ENV) { warnForNonLegacyFactory(type); } return createFactory(type.type); } if (type.isReactLegacyFactory) { // This is probably a legacy factory created by ReactCompositeComponent. // We unwrap it to get to the underlying class. return createFactory(type.type); } if ("production" !== process.env.NODE_ENV) { warnForPlainFunctionType(type); } // Unless it's a legacy factory, then this is probably a plain function, // that is expecting to be invoked by JSX. We can just return it as is. return type; }; return legacyCreateFactory; }; ReactLegacyElementFactory.wrapCreateElement = function(createElement) { var legacyCreateElement = function(type, props, children) { if (typeof type !== 'function') { // Non-function types cannot be legacy factories return createElement.apply(this, arguments); } var args; if (type.isReactNonLegacyFactory) { // This is probably a factory created by ReactDOM we unwrap it to get to // the underlying string type. It shouldn't have been passed here so we // warn. if ("production" !== process.env.NODE_ENV) { warnForNonLegacyFactory(type); } args = Array.prototype.slice.call(arguments, 0); args[0] = type.type; return createElement.apply(this, args); } if (type.isReactLegacyFactory) { // This is probably a legacy factory created by ReactCompositeComponent. // We unwrap it to get to the underlying class. if (type._isMockFunction) { // If this is a mock function, people will expect it to be called. We // will actually call the original mock factory function instead. This // future proofs unit testing that assume that these are classes. type.type._mockedReactClassConstructor = type; } args = Array.prototype.slice.call(arguments, 0); args[0] = type.type; return createElement.apply(this, args); } if ("production" !== process.env.NODE_ENV) { warnForPlainFunctionType(type); } // This is being called with a plain function we should invoke it // immediately as if this was used with legacy JSX. return type.apply(null, Array.prototype.slice.call(arguments, 1)); }; return legacyCreateElement; }; ReactLegacyElementFactory.wrapFactory = function(factory) { ("production" !== process.env.NODE_ENV ? invariant( typeof factory === 'function', 'This is suppose to accept a element factory' ) : invariant(typeof factory === 'function')); var legacyElementFactory = function(config, children) { // This factory should not be called when JSX is used. Use JSX instead. if ("production" !== process.env.NODE_ENV) { warnForLegacyFactoryCall(); } return factory.apply(this, arguments); }; proxyStaticMethods(legacyElementFactory, factory.type); legacyElementFactory.isReactLegacyFactory = LEGACY_MARKER; legacyElementFactory.type = factory.type; return legacyElementFactory; }; // This is used to mark a factory that will remain. E.g. we're allowed to call // it as a function. However, you're not suppose to pass it to createElement // or createFactory, so it will warn you if you do. ReactLegacyElementFactory.markNonLegacyFactory = function(factory) { factory.isReactNonLegacyFactory = NON_LEGACY_MARKER; return factory; }; // Checks if a factory function is actually a legacy factory pretending to // be a class. ReactLegacyElementFactory.isValidFactory = function(factory) { // TODO: This will be removed and moved into a class validator or something. return typeof factory === 'function' && factory.isReactLegacyFactory === LEGACY_MARKER; }; ReactLegacyElementFactory.isValidClass = function(factory) { if ("production" !== process.env.NODE_ENV) { ("production" !== process.env.NODE_ENV ? warning( false, 'isValidClass is deprecated and will be removed in a future release. ' + 'Use a more specific validator instead.' ) : null); } return ReactLegacyElementFactory.isValidFactory(factory); }; ReactLegacyElementFactory._isLegacyCallWarningEnabled = true; module.exports = ReactLegacyElementFactory;