/
index.js
70 lines (58 loc) · 1.98 KB
/
index.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
const { resolve } = require('path');
const rr = require('require-relative');
const toConfig = require('./webpack');
const $ = require('./util');
module.exports = function (src, opts) {
const webpack = require('webpack');
let cwd = opts.cwd = resolve(opts.cwd || '.');
let logger = opts.log ? opts.log.logger : console.log;
opts.production = !!opts.production;
delete opts._; // useless
// Load default configs
let config = require('./config');
let tmp, customs=[], handlers=[];
// Share parsed `browserslist` globally
opts.browsers = require('browserslist')();
// Parse configs from local "package.json"
if (tmp = $.load('package.json', cwd)) {
let devs = Object.keys(tmp.devDependencies || {});
// apply any presets first, then plugins
['preset', 'plugin'].forEach(type => {
devs.filter(x => x.indexOf(`@pwa/${type}`) == 0).forEach(str => {
logger(`Applying ${type}: ${str}`);
customs.push( require(rr.resolve(str, cwd)) ); // allow throw
});
});
}
// Determine if custom config exists (always last)
if (tmp = $.load('pwa.config.js', cwd)) {
logger('Loading custom config');
customs.push(tmp);
}
// use root if "/src" is missing
src = resolve(cwd, src || 'src');
src = $.isDir(src) ? src : cwd;
opts.src = src; // share this
// Mutate config w/ custom values
// ~> defer webpack-related changes for later
customs.forEach(mix => {
if (typeof mix === 'function') {
handlers.push(mix); // is webpack only
} else {
$.merge(config, mix, opts); //~> mutate
mix.webpack && handlers.push(mix.webpack);
}
});
// Build Webpack's Config for 1st time
opts.webpack = webpack; // pass it down
let wconfig = toConfig(src, config, opts);
// Apply presets' & custom webpack changes
handlers.forEach(fn => fn(wconfig, opts, config));
if (opts.production && opts.analyze) {
let { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer')
wconfig.plugins.push( new BundleAnalyzerPlugin() );
}
let ctx = webpack(wconfig);
ctx.PWA_CONFIG = tmp;
return ctx;
}