Make React.__spread warn

This commit is contained in:
Paul O’Shannessy
2016-04-07 16:24:20 -07:00
parent f02d87bdb5
commit fc1cfb6225
2 changed files with 43 additions and 13 deletions

View File

@@ -12,6 +12,20 @@
module.exports = function autoImporter(babel) {
const t = babel.types;
function getAssignIdent(path, file, state) {
if (!state.id) {
state.id = path.scope.generateUidIdentifier('assign');
path.scope.getProgramParent().push({
id: state.id,
init: t.callExpression(
t.identifier('require'),
[t.stringLiteral('object-assign')]
),
});
}
return state.id;
}
return {
pre: function() {
// map from module to generated identifier
@@ -22,17 +36,15 @@ module.exports = function autoImporter(babel) {
CallExpression: function(path, file) {
if (path.get('callee').matchesPattern('Object.assign')) {
// generate identifier and require if it hasn't been already
if (!this.id) {
this.id = path.scope.generateUidIdentifier('assign');
path.scope.getProgramParent().push({
id: this.id,
init: t.callExpression(
t.identifier('require'),
[t.stringLiteral('object-assign')]
),
});
}
path.node.callee = this.id;
var id = getAssignIdent(path, file, this);
path.node.callee = id;
}
},
MemberExpression: function(path, file) {
if (path.matchesPattern('Object.assign')) {
var id = getAssignIdent(path, file, this);
path.replaceWith(id);
}
},
},

View File

@@ -21,6 +21,7 @@ var ReactPropTypes = require('ReactPropTypes');
var ReactVersion = require('ReactVersion');
var onlyChild = require('onlyChild');
var warning = require('warning');
var createElement = ReactElement.createElement;
var createFactory = ReactElement.createFactory;
@@ -32,6 +33,23 @@ if (__DEV__) {
cloneElement = ReactElementValidator.cloneElement;
}
var __spread = Object.assign;
if (__DEV__) {
var warned = false;
__spread = function() {
warning(
warned,
'React.__spread is deprecated and should not be used. Use ' +
'Object.assign directly or another helper function with similar ' +
'semantics. You may be seeing this warning due to your compiler. ' +
'See https://fb.me/react-spread-deprecation for more details.'
);
warned = true;
return Object.assign.apply(null, arguments);
};
}
var React = {
// Modern
@@ -66,8 +84,8 @@ var React = {
version: ReactVersion,
// Hook for JSX spread, don't use this for anything else.
__spread: Object.assign,
// Deprecated hook for JSX spread, don't use this for anything.
__spread: __spread,
};
module.exports = React;