-
-
Notifications
You must be signed in to change notification settings - Fork 418
/
modern-and-legacy-config.js
141 lines (129 loc) · 4.65 KB
/
modern-and-legacy-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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
// @ts-nocheck
const { findSupportedBrowsers, defaultFileExtensions } = require('@open-wc/building-utils');
const customMinifyCss = require('@open-wc/building-utils/custom-minify-css');
const path = require('path');
const resolve = require('rollup-plugin-node-resolve');
const { terser } = require('rollup-plugin-terser');
const babel = require('rollup-plugin-babel');
const indexHTML = require('rollup-plugin-index-html');
const { generateSW } = require('rollup-plugin-workbox');
const getWorkboxConfig = require('@open-wc/building-utils/get-workbox-config');
const production = !process.env.ROLLUP_WATCH;
const prefix = '[owc-building-rollup]';
/**
* Function which creates a config so that we can create a modern and a legacy config
* with small alterations.
* @param {object} _options
* @param {boolean} legacy
*/
function createConfig(_options, legacy) {
const options = {
outputDir: 'dist',
extensions: defaultFileExtensions,
indexHTMLPlugin: {},
..._options,
plugins: {
indexHTML: _options.input.endsWith('.html'),
workbox: true,
babel: true,
...(_options.plugins || {}),
},
};
return {
input: options.input,
treeshake: !!production,
output: {
// output into given folder or default /dist. Output legacy into a /legacy subfolder
dir: path.join(options.outputDir, legacy ? '/legacy' : ''),
format: legacy ? 'system' : 'esm',
sourcemap: true,
dynamicImportFunction: !legacy && 'importShim',
entryFileNames: '[name]-[hash].js',
chunkFileNames: '[name]-[hash].js',
},
plugins: [
options.plugins.indexHTML &&
indexHTML({
...(options.indexHTMLPlugin || {}),
// tell index-html-plugin that we are creating two builds
multiBuild: true,
// tell index-html-plugin whether this is the legacy config
legacy,
polyfills: {
...((options.indexHTMLPlugin && options.indexHTMLPlugin.polyfills) || {}),
dynamicImport: true,
coreJs: true,
regeneratorRuntime: true,
webcomponents: true,
systemJs: true,
fetch: true,
},
}),
// resolve bare import specifiers
resolve({
extensions: options.extensions,
}),
// run code through babel
options.plugins.babel &&
babel({
extensions: options.extensions,
plugins: [
'@babel/plugin-syntax-dynamic-import',
'@babel/plugin-syntax-import-meta',
/**
* This can be removed when https://github.com/babel/babel/pull/10811 is released
*/
[
require.resolve('@babel/plugin-proposal-nullish-coalescing-operator'),
{ loose: true },
],
[require.resolve('@babel/plugin-proposal-optional-chaining'), { loose: true }],
// rollup rewrites import.meta.url, but makes them point to the file location after bundling
// we want the location before bundling
['bundled-import-meta', { importStyle: 'baseURI' }],
production && [
'template-html-minifier',
{
modules: {
'lit-html': ['html'],
'lit-element': ['html', { name: 'css', encapsulation: 'style' }],
},
htmlMinifier: {
collapseWhitespace: true,
conservativeCollapse: true,
removeComments: true,
caseSensitive: true,
minifyCSS: customMinifyCss,
},
},
],
].filter(_ => !!_),
presets: [
[
'@babel/preset-env',
{
targets: legacy ? ['ie 11'] : findSupportedBrowsers(),
// preset-env compiles template literals for safari 12 due to a small bug which
// doesn't affect most use cases. for example lit-html handles it: (https://github.com/Polymer/lit-html/issues/575)
exclude: legacy ? undefined : ['@babel/plugin-transform-template-literals'],
useBuiltIns: false,
modules: false,
},
],
],
}),
// only minify if in production
production && terser(),
production &&
options.plugins.workbox &&
!legacy &&
generateSW(getWorkboxConfig(options.outputDir)),
],
};
}
module.exports = function createDefaultConfig(options) {
if (!options.input) {
throw new Error(`${prefix}: missing option 'input'.`);
}
return [createConfig(options, true), createConfig(options, false)];
};