-
Notifications
You must be signed in to change notification settings - Fork 10
/
rollup.config.js
126 lines (110 loc) · 3.36 KB
/
rollup.config.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import lodashMerge from 'lodash/merge';
import commonjs from '@rollup/plugin-commonjs';
import typescript from 'rollup-plugin-typescript2';
import { terser } from 'rollup-plugin-terser';
import nodeResolve from '@rollup/plugin-node-resolve';
import replace from '@rollup/plugin-replace';
import bundleSize from 'rollup-plugin-bundle-size';
import pkg from './package.json';
const merge = (...args) => lodashMerge({}, ...args);
const EXTERNALS = {
ALL: Object.keys(merge(pkg.peerDependencies, pkg.dependencies)),
PEERS: Object.keys(pkg.peerDependencies),
};
const GLOBALS = {
react: 'React',
'react-dom': 'ReactDOM',
};
const FORMATS = {
CJS: 'cjs',
ESM: 'esm',
UMD: 'umd',
};
const ENVIRONMENTS = {
DEV: 'development',
PRD: 'production',
};
// These are settings we don't want in tsconfig.json
// because they interfere with tests/linting
const tsConfigBase = {
check: false,
tsconfigOverride: {
compilerOptions: {
module: 'ES2015',
},
include: ['src'],
},
};
// These options are slow and only need to be executed for one of the configs
const tsConfigExtended = {
check: true,
useTsconfigDeclarationDir: true,
tsconfigOverride: {
compilerOptions: {
declaration: true,
declarationDir: 'dist/types',
},
},
};
export default (flags) => {
const configs = [];
// We loop over the 3 formats and 2 environments
Object.values(FORMATS).forEach((format) => {
Object.values(ENVIRONMENTS).forEach((env) => {
// Only one of the configs needs to run checks and output TS declarations
// For performance, we'll pick one that doesn't run in watch mode
const tsConfig =
format === FORMATS.UMD && env === ENVIRONMENTS.PRD
? merge(tsConfigBase, tsConfigExtended)
: tsConfigBase;
// Shared options for all configs
const config = {
cache: true,
input: 'src/index.ts',
output: {
format,
},
plugins: [
commonjs(),
nodeResolve(),
typescript(tsConfig), // must be after nodeResolve
replace({ 'process.env.NODE_ENV': `'${env}'` }), // must be after typescript
// terser will be added after this for minified bundles
],
};
// We don't concatenate for ESM
if (format === FORMATS.ESM) {
config.preserveModules = true;
config.output.dir = `dist/${format}/${env}`;
} else {
config.output.file = `dist/${format}/index.${env}.js`;
}
// UMD files only externalise peers
if (format === FORMATS.UMD) {
config.external = EXTERNALS.PEERS;
config.output.name = 'ReactRecollect';
config.output.globals = GLOBALS;
} else {
// Other formats externalise everything
config.external = EXTERNALS.ALL;
}
// We minify for UMD production
if (format === FORMATS.UMD && env === ENVIRONMENTS.PRD) {
config.plugins.push(terser());
config.plugins.push(bundleSize());
}
// We only build some configs in watch mode
// Further down we filter based on config.watch
if (
env === ENVIRONMENTS.DEV &&
(format === FORMATS.CJS || format === FORMATS.ESM)
) {
config.watch = {
include: 'src/**/*',
};
}
configs.push(config);
});
});
return flags.watch ? configs.filter((config) => config.watch) : configs;
};