babel-plugin-transform-react-remove-prop-types
Advanced tools
Comparing version
@@ -16,4 +16,6 @@ "use strict"; | ||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } | ||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } | ||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } | ||
function isPathReactClass(path, globalOptions) { | ||
@@ -66,6 +68,6 @@ var node = path.node; | ||
function _default(_ref) { | ||
var template = _ref.template, | ||
types = _ref.types, | ||
traverse = _ref.traverse; | ||
function _default(api) { | ||
var template = api.template, | ||
types = api.types, | ||
traverse = api.traverse; | ||
return { | ||
@@ -111,3 +113,3 @@ visitor: { | ||
if (typeof pluginOpts !== 'string') { | ||
pluginsState.opts = _extends({}, pluginsState.opts, pluginOpts[1]); | ||
pluginsState.opts = _objectSpread({}, pluginsState.opts, pluginOpts[1]); | ||
} | ||
@@ -121,6 +123,3 @@ | ||
return plugin({ | ||
template: template, | ||
types: types | ||
}).visitor; | ||
return plugin(api).visitor; | ||
}); | ||
@@ -239,3 +238,3 @@ traverse(programPath.parent, traverse.visitors.merge(pluginsVisitors), programPath.scope, pluginsState, programPath.parentPath); | ||
} else { | ||
throw new Error('react-remove-prop-types: removeImport and mode=remove can not be used at the same time.'); | ||
throw new Error('transform-react-remove-prop-type: removeImport = true and mode != "remove" can not be used at the same time.'); | ||
} | ||
@@ -242,0 +241,0 @@ } |
@@ -7,4 +7,5 @@ "use strict"; | ||
exports.default = isStatelessComponent; | ||
// weak | ||
var traversed = Symbol('traversed'); | ||
// weak | ||
function isJSXElementOrReactCreateElement(path) { | ||
@@ -16,3 +17,3 @@ var visited = false; | ||
if (callee.matchesPattern('React.createElement') || callee.matchesPattern('React.cloneElement')) { | ||
if (callee.matchesPattern('React.createElement') || callee.matchesPattern('React.cloneElement') || callee.node.name === 'cloneElement') { | ||
visited = true; | ||
@@ -29,2 +30,4 @@ } | ||
function isReturningJSXElement(path) { | ||
var iteration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; | ||
// Early exit for ArrowFunctionExpressions, there is no ReturnStatement node. | ||
@@ -35,2 +38,6 @@ if (path.node.init && path.node.init.body && isJSXElementOrReactCreateElement(path)) { | ||
if (iteration > 20) { | ||
throw new Error('transform-react-remove-prop-type: infinite loop detected.'); | ||
} | ||
var visited = false; | ||
@@ -61,5 +68,12 @@ path.traverse({ | ||
return; | ||
} // Prevents infinite traverse loop. | ||
if (binding.path[traversed]) { | ||
return; | ||
} | ||
if (isReturningJSXElement(binding.path)) { | ||
binding.path[traversed] = true; | ||
if (isReturningJSXElement(binding.path, iteration + 1)) { | ||
visited = true; | ||
@@ -66,0 +80,0 @@ } |
{ | ||
"name": "babel-plugin-transform-react-remove-prop-types", | ||
"version": "0.4.13", | ||
"version": "0.4.14", | ||
"description": "Remove unnecessary React propTypes from the production build", | ||
@@ -34,13 +34,13 @@ "main": "lib/index.js", | ||
"devDependencies": { | ||
"@babel/cli": "^7.0.0-beta.35", | ||
"@babel/core": "^7.0.0-beta.35", | ||
"@babel/generator": "^7.0.0-beta.35", | ||
"@babel/plugin-external-helpers": "^7.0.0-beta.35", | ||
"@babel/plugin-proposal-class-properties": "^7.0.0-beta.35", | ||
"@babel/plugin-transform-flow-strip-types": "^7.0.0-beta.35", | ||
"@babel/preset-env": "^7.0.0-beta.35", | ||
"@babel/preset-flow": "^7.0.0-beta.35", | ||
"@babel/preset-react": "^7.0.0-beta.35", | ||
"@babel/preset-stage-1": "^7.0.0-beta.35", | ||
"@babel/register": "^7.0.0-beta.35", | ||
"@babel/cli": "7.0.0-beta.42", | ||
"@babel/core": "7.0.0-beta.42", | ||
"@babel/generator": "7.0.0-beta.42", | ||
"@babel/plugin-external-helpers": "7.0.0-beta.42", | ||
"@babel/plugin-proposal-class-properties": "7.0.0-beta.42", | ||
"@babel/plugin-transform-flow-strip-types": "7.0.0-beta.42", | ||
"@babel/preset-env": "7.0.0-beta.42", | ||
"@babel/preset-flow": "7.0.0-beta.42", | ||
"@babel/preset-react": "7.0.0-beta.42", | ||
"@babel/preset-stage-1": "7.0.0-beta.42", | ||
"@babel/register": "7.0.0-beta.42", | ||
"babel-eslint": "^8.0.2", | ||
@@ -47,0 +47,0 @@ "babel-plugin-flow-react-proptypes": "^6.1.0", |
@@ -56,3 +56,5 @@ // @flow weak | ||
export default function({ template, types, traverse }) { | ||
export default function(api) { | ||
const { template, types, traverse } = api | ||
return { | ||
@@ -117,3 +119,3 @@ visitor: { | ||
return plugin({ template, types }).visitor | ||
return plugin(api).visitor | ||
}) | ||
@@ -230,3 +232,3 @@ | ||
throw new Error( | ||
'react-remove-prop-types: removeImport and mode=remove can not be used at the same time.' | ||
'transform-react-remove-prop-type: removeImport = true and mode != "remove" can not be used at the same time.' | ||
) | ||
@@ -233,0 +235,0 @@ } |
// @flow weak | ||
const traversed = Symbol('traversed') | ||
function isJSXElementOrReactCreateElement(path) { | ||
@@ -12,3 +14,4 @@ let visited = false | ||
callee.matchesPattern('React.createElement') || | ||
callee.matchesPattern('React.cloneElement') | ||
callee.matchesPattern('React.cloneElement') || | ||
callee.node.name === 'cloneElement' | ||
) { | ||
@@ -26,3 +29,3 @@ visited = true | ||
function isReturningJSXElement(path) { | ||
function isReturningJSXElement(path, iteration = 0) { | ||
// Early exit for ArrowFunctionExpressions, there is no ReturnStatement node. | ||
@@ -33,2 +36,6 @@ if (path.node.init && path.node.init.body && isJSXElementOrReactCreateElement(path)) { | ||
if (iteration > 20) { | ||
throw new Error('transform-react-remove-prop-type: infinite loop detected.') | ||
} | ||
let visited = false | ||
@@ -63,3 +70,10 @@ | ||
if (isReturningJSXElement(binding.path)) { | ||
// Prevents infinite traverse loop. | ||
if (binding.path[traversed]) { | ||
return | ||
} | ||
binding.path[traversed] = true | ||
if (isReturningJSXElement(binding.path, iteration + 1)) { | ||
visited = true | ||
@@ -66,0 +80,0 @@ } |
35492
-8.7%12
-29.41%732
-11.38%