rollup.config.js (143 lines of code) (raw):
import alias from '@rollup/plugin-alias';
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 path from 'path';
import {terser} from 'rollup-plugin-terser';
const inputFile = 'packages/recoil/Recoil_index.js';
const externalLibs = ['react', 'react-dom'];
const projectRootDir = path.resolve(__dirname);
const defaultNodeResolveConfig = {};
const nodeResolvePlugin = nodeResolve(defaultNodeResolveConfig);
const commonPlugins = [
babel({
presets: ['@babel/preset-react', '@babel/preset-flow'],
plugins: [
'babel-preset-fbjs/plugins/dev-expression',
'@babel/plugin-proposal-class-properties',
'@babel/plugin-proposal-nullish-coalescing-operator',
'@babel/plugin-proposal-optional-chaining',
'@babel/transform-flow-strip-types',
],
babelHelpers: 'bundled',
}),
{
resolveId: source => {
if (source === 'React') {
return {id: 'react', external: true};
}
if (source === 'ReactDOMLegacy_DEPRECATED') {
return {id: 'react-dom', external: true};
}
if (source === 'ReactNative') {
return {id: 'react-native', external: true};
}
return null;
},
},
alias({
entries: [
{
find: 'recoil-shared',
replacement: path.resolve(projectRootDir, 'packages/shared'),
},
],
}),
nodeResolvePlugin,
commonjs(),
];
const developmentPlugins = [
...commonPlugins,
replace({
'process.env.NODE_ENV': JSON.stringify('development'),
}),
];
const productionPlugins = [
...commonPlugins,
replace({
'process.env.NODE_ENV': JSON.stringify('production'),
}),
terser({mangle: false}),
];
const configs = [
// CommonJS
{
input: inputFile,
output: {
file: `cjs/recoil.js`,
format: 'cjs',
exports: 'named',
},
external: externalLibs,
plugins: commonPlugins,
},
// ES
{
input: inputFile,
output: {
file: `es/recoil.js`,
format: 'es',
exports: 'named',
},
external: externalLibs,
plugins: commonPlugins,
},
// React Native
{
input: inputFile,
output: {
file: `native/recoil.js`,
format: 'es',
exports: 'named',
},
external: [...externalLibs, 'react-native'],
plugins: commonPlugins.map(plugin => {
// Replace the default nodeResolve plugin
if (plugin === nodeResolvePlugin) {
return nodeResolve({
...defaultNodeResolveConfig,
extensions: ['.native.js', '.js'],
});
}
return plugin;
}),
},
// ES for Browsers
{
input: inputFile,
output: {
file: `es/recoil.mjs`,
format: 'es',
exports: 'named',
},
external: externalLibs,
plugins: productionPlugins,
},
// UMD Development
{
input: inputFile,
output: {
file: `umd/recoil.js`,
format: 'umd',
name: 'Recoil',
exports: 'named',
globals: {
react: 'React',
'react-dom': 'ReactDOM',
},
},
external: externalLibs,
plugins: developmentPlugins,
},
// UMD Production
{
input: inputFile,
output: {
file: `umd/recoil.min.js`,
format: 'umd',
name: 'Recoil',
exports: 'named',
globals: {
react: 'React',
'react-dom': 'ReactDOM',
},
},
external: externalLibs,
plugins: productionPlugins,
},
];
export default configs;