UNPKG

3.15 kBJavaScriptView Raw
1/** @typedef {import('./types').BasicOptions} BasicOptions */
2
3/* eslint-disable no-param-reassign */
4const resolve = require('@rollup/plugin-node-resolve');
5const { terser } = require('rollup-plugin-terser');
6const { babel, getBabelOutputPlugin } = require('@rollup/plugin-babel');
7const merge = require('deepmerge');
8const {
9 createBabelConfigRollupBuild,
10 babelConfigRollupGenerate,
11 babelConfigLegacyRollupGenerate,
12 babelConfigSystemJs,
13} = require('./babel/babel-configs');
14const { bundledBabelHelpers } = require('./babel/rollup-plugin-bundled-babel-helpers');
15const { isFalsy, pluginWithOptions, dedupedBabelPlugin } = require('./utils');
16
17/**
18 * @param {BasicOptions} userOptions
19 */
20function createBasicConfig(userOptions = {}) {
21 const opts = merge(
22 {
23 developmentMode: !!process.env.ROLLUP_WATCH,
24 outputDir: 'dist',
25 nodeResolve: true,
26 babel: true,
27 terser: true,
28 },
29 userOptions,
30 );
31 const { developmentMode, rootDir } = userOptions;
32 const fileName = `[${developmentMode ? 'name' : 'hash'}].js`;
33 const assetName = `[${developmentMode ? 'name' : 'hash'}][extname]`;
34
35 const config = {
36 preserveEntrySignatures: false,
37 treeshake: !developmentMode,
38
39 output: {
40 entryFileNames: fileName,
41 chunkFileNames: fileName,
42 assetFileNames: assetName,
43 format: 'es',
44 dir: opts.outputDir,
45 plugins: [
46 // build to js supported by modern browsers
47 getBabelOutputPlugin(babelConfigRollupGenerate),
48 // create babel-helpers chunk based on es5 build
49 bundledBabelHelpers({ minify: !developmentMode }),
50 ],
51 },
52
53 plugins: [
54 // resolve bare module imports
55 pluginWithOptions(resolve, opts.nodeResolve, {
56 customResolveOptions: {
57 moduleDirectory: ['node_modules', 'web_modules'],
58 },
59 }),
60
61 // build non-standard syntax to standard syntax and other babel optimization plugins
62 // user plugins are deduped to allow overriding
63 dedupedBabelPlugin(
64 babel,
65 opts.babel,
66 createBabelConfigRollupBuild({ developmentMode, rootDir }),
67 ),
68
69 // minify js code
70 !developmentMode && pluginWithOptions(terser, opts.terser, { output: { comments: false } }),
71 ].filter(isFalsy),
72 };
73
74 // when we need to add an additional legacy build, we turn the output option into an array
75 // of output configs
76 if (opts.legacyBuild) {
77 // @ts-ignore
78 config.output = [
79 config.output,
80 {
81 ...config.output,
82 entryFileNames: `nomodule-${fileName}`,
83 chunkFileNames: `nomodule-${fileName}`,
84 assetFileNames: `nomodule-${assetName}`,
85 plugins: [
86 // buid to es5
87 getBabelOutputPlugin(babelConfigLegacyRollupGenerate),
88 // create babel-helpers chunk based on es5 build
89 bundledBabelHelpers({ format: 'system', minify: !developmentMode }),
90 // build to systemjs after helpers, so that helpers can be statically analyzed
91 getBabelOutputPlugin(babelConfigSystemJs),
92 ],
93 },
94 ];
95 }
96 return config;
97}
98
99module.exports = { createBasicConfig };