packages/babel-preset-react/src/index.js
import { declare } from "@babel/helper-plugin-utils";
import transformReactJSX from "@babel/plugin-transform-react-jsx";
import transformReactJSXDevelopment from "@babel/plugin-transform-react-jsx-development";
import transformReactDisplayName from "@babel/plugin-transform-react-display-name";
import transformReactJSXSource from "@babel/plugin-transform-react-jsx-source";
import transformReactJSXSelf from "@babel/plugin-transform-react-jsx-self";
import transformReactPure from "@babel/plugin-transform-react-pure-annotations";
export default declare((api, opts) => {
api.assertVersion(7);
let { pragma, pragmaFrag } = opts;
const {
pure,
throwIfNamespace = true,
useSpread,
runtime = "classic",
importSource,
} = opts;
// TODO: (Babel 8) Remove setting these defaults
if (runtime === "classic") {
pragma = pragma || "React.createElement";
pragmaFrag = pragmaFrag || "React.Fragment";
}
// TODO: (Babel 8) Don't cast these options but validate it
const development = !!opts.development;
const useBuiltIns = !!opts.useBuiltIns;
if (typeof development !== "boolean") {
throw new Error(
"@babel/preset-react 'development' option must be a boolean.",
);
}
const transformReactJSXPlugin =
runtime === "automatic" && development
? transformReactJSXDevelopment
: transformReactJSX;
return {
plugins: [
[
transformReactJSXPlugin,
{
importSource,
pragma,
pragmaFrag,
runtime,
throwIfNamespace,
useBuiltIns,
useSpread,
pure,
},
],
transformReactDisplayName,
pure !== false && transformReactPure,
development && runtime === "classic" && transformReactJSXSource,
development && runtime === "classic" && transformReactJSXSelf,
].filter(Boolean),
};
});