import babel from 'rollup-plugin-babel' import commonjs from 'rollup-plugin-commonjs' import nodeResolve from 'rollup-plugin-node-resolve' import replace from 'rollup-plugin-replace' import { sizeSnapshot } from 'rollup-plugin-size-snapshot' import sourcemaps from 'rollup-plugin-sourcemaps' import { terser } from 'rollup-plugin-terser' import pkg from './package.json' const CJS_DEV = 'CJS_DEV' const CJS_PROD = 'CJS_PROD' const ES = 'ES' const UMD_DEV = 'UMD_DEV' const UMD_PROD = 'UMD_PROD' const input = './compiled/index.js' const getGlobals = bundleType => { const baseGlobals = { 'react-dom': 'ReactDOM', react: 'React' } switch (bundleType) { case UMD_DEV: return { ...baseGlobals, 'prop-types': 'PropTypes' } case UMD_PROD: return baseGlobals default: return {} } } const getExternal = bundleType => { const peerDependencies = Object.keys(pkg.peerDependencies) const dependencies = Object.keys(pkg.dependencies) // Hat-tip: https://github.com/rollup/rollup-plugin-babel/issues/148#issuecomment-399696316. const makeExternalPredicate = externals => { if (externals.length === 0) { return () => false } const pattern = new RegExp(`^(${externals.join('|')})($|/)`) return id => pattern.test(id) } switch (bundleType) { case CJS_DEV: case CJS_PROD: case ES: return makeExternalPredicate([...peerDependencies, ...dependencies]) case UMD_DEV: return makeExternalPredicate([...peerDependencies, 'prop-types']) default: return makeExternalPredicate(peerDependencies) } } const isProduction = bundleType => bundleType === CJS_PROD || bundleType === UMD_PROD const getBabelConfig = bundleType => { const options = { babelrc: false, exclude: 'node_modules/**', presets: [['@babel/env', { loose: true, modules: false }], '@babel/react'], plugins: ['@babel/transform-runtime'], runtimeHelpers: true } switch (bundleType) { case ES: return { ...options, plugins: [ ...options.plugins, ['transform-react-remove-prop-types', { mode: 'wrap' }] ] } case UMD_PROD: case CJS_PROD: return { ...options, plugins: [ ...options.plugins, ['transform-react-remove-prop-types', { removeImport: true }] ] } default: return options } } const getPlugins = bundleType => [ nodeResolve(), commonjs({ include: 'node_modules/**', namedExports: { 'node_modules/prop-types/index.js': [ 'any', 'array', 'arrayOf', 'bool', 'element', 'exact', 'func', 'instanceOf', 'node', 'number', 'object', 'objectOf', 'oneOf', 'oneOfType', 'shape', 'string', 'symbol' ] } }), babel(getBabelConfig(bundleType)), replace({ 'process.env.NODE_ENV': JSON.stringify( isProduction(bundleType) ? 'production' : 'development' ) }), sourcemaps(), sizeSnapshot(), isProduction(bundleType) && terser({ sourcemap: true, output: { comments: false }, compress: { keep_infinity: true, // eslint-disable-line @typescript-eslint/camelcase pure_getters: true // eslint-disable-line @typescript-eslint/camelcase }, warnings: true, ecma: 5, toplevel: false }) ] const getCjsConfig = bundleType => ({ input, external: getExternal(bundleType), output: { file: `dist/react-fiber-traverse.cjs.${ isProduction(bundleType) ? 'production' : 'development' }.js`, format: 'cjs', sourcemap: true }, plugins: getPlugins(bundleType) }) const getEsConfig = () => ({ input, external: getExternal(ES), output: { file: pkg.module, format: 'es', sourcemap: true }, plugins: getPlugins(ES) }) const getUmdConfig = bundleType => ({ input, external: getExternal(bundleType), output: { file: `dist/react-fiber-traverse.umd.${ isProduction(bundleType) ? 'production' : 'development' }.js`, format: 'umd', globals: getGlobals(bundleType), name: 'reactFiberTraverse', sourcemap: true }, plugins: getPlugins(bundleType) }) export default [ getCjsConfig(CJS_DEV), getCjsConfig(CJS_PROD), getEsConfig(), getUmdConfig(UMD_DEV), getUmdConfig(UMD_PROD) ]