oliviertassinari / babel-plugin-transform-react-remove-prop-types

Remove unnecessary React propTypes from the production build. :balloon:
MIT License
897 stars 61 forks source link

Avoid removing variable assignments that are functions #154

Closed lencioni closed 5 years ago

lencioni commented 6 years ago

Starting with 0.4.15, incorrect code is generated when using the mode: "wrap" setting for a prop-type like this

const generateType = (x) => {
  return PropTypes.oneOf([x-1, x, x+1]);
};

Component.propTypes = {
  prop: generateType(1)
};

The code generated for the prop-type is

const generateType = process.env.NODE_ENV !== "production" ? x => {
  return PropTypes.oneOf([x - 1, x, x + 1]);
} : {};;

which will result in an error when NODE_ENV === "production" because {} is not a function.

A working example of the bug can be found here: https://github.com/dirkholsopple/prop-type-removal-bug-reproduction

Since the minifier will remove any unused function expressions for us, we don't need to jump through that hoop. There is a possibility that there are some references inside that function that could be further cleaned up by us that then minifier won't catch, but I'm not really sure it's worth worrying about since this seems pretty edge-casey. If we want to go down that path, instead of skipping over these nodes, we would probably want to remove them but in the wrap mode replace it with a function that returns an object instead of an object.

Fixes #153

cc @dirkholsopple