UNPKG

3.66 kBJavaScriptView Raw
1const
2 createChain = require('./create-chain'),
3 log = require('../helpers/logger')('app:webpack'),
4 extensionRunner = require('../app-extension/extensions-runner')
5
6async function getWebpackConfig (chain, cfg, {
7 name,
8 hot,
9 cfgExtendBase = cfg.build,
10 hookSuffix = '',
11 invokeParams
12}) {
13 await extensionRunner.runHook('chainWebpack' + hookSuffix, async hook => {
14 log(`Extension(${hook.api.extId}): Chaining ${name ? name + ' ' : ''}Webpack config`)
15 await hook.fn(chain, invokeParams, hook.api)
16 })
17
18 if (typeof cfgExtendBase.chainWebpack === 'function') {
19 log(`Chaining ${name ? name + ' ' : ''}Webpack config`)
20 await cfgExtendBase.chainWebpack(chain, invokeParams)
21 }
22
23 const webpackConfig = chain.toConfig()
24
25 await extensionRunner.runHook('extendWebpack' + hookSuffix, async hook => {
26 log(`Extension(${hook.api.extId}): Extending ${name ? name + ' ' : ''}Webpack config`)
27 await hook.fn(webpackConfig, invokeParams, hook.api)
28 })
29
30 if (typeof cfgExtendBase.extendWebpack === 'function') {
31 log(`Extending ${name ? name + ' ' : ''}Webpack config`)
32 await cfgExtendBase.extendWebpack(webpackConfig, invokeParams)
33 }
34
35 if (hot && cfg.ctx.dev && cfg.devServer.hot) {
36 // tap entries for HMR
37 require('webpack-dev-server').addDevServerEntrypoints(webpackConfig, cfg.devServer)
38 }
39
40 return webpackConfig
41}
42
43async function getSPA (cfg) {
44 const chain = createChain(cfg, 'SPA')
45 require('./spa')(chain, cfg)
46 return await getWebpackConfig(chain, cfg, {
47 name: 'SPA',
48 hot: true,
49 invokeParams: { isClient: true, isServer: false }
50 })
51}
52
53async function getPWA (cfg) {
54 const chain = createChain(cfg, 'PWA')
55 require('./spa')(chain, cfg) // extending a SPA
56 require('./pwa')(chain, cfg)
57 return await getWebpackConfig(chain, cfg, {
58 name: 'PWA',
59 hot: true,
60 invokeParams: { isClient: true, isServer: false }
61 })
62}
63
64async function getCordova (cfg) {
65 const chain = createChain(cfg, 'Cordova')
66 require('./cordova')(chain, cfg)
67 return await getWebpackConfig(chain, cfg, {
68 name: 'Cordova',
69 hot: true,
70 invokeParams: { isClient: true, isServer: false }
71 })
72}
73
74async function getElectron (cfg) {
75 const
76 rendererChain = createChain(cfg, 'Renderer process'),
77 mainChain = require('./electron/main')(cfg, 'Main process')
78
79 require('./electron/renderer')(rendererChain, cfg)
80
81 return {
82 renderer: await getWebpackConfig(rendererChain, cfg, {
83 name: 'Renderer process',
84 hot: true,
85 invokeParams: { isClient: true, isServer: false }
86 }),
87 main: await getWebpackConfig(mainChain, cfg, {
88 name: 'Main process',
89 cfgExtendBase: cfg.electron,
90 hookSuffix: 'MainElectronProcess'
91 })
92 }
93}
94
95async function getSSR (cfg) {
96 const
97 client = createChain(cfg, 'Client'),
98 server = createChain(cfg, 'Server')
99
100 require('./ssr/client')(client, cfg)
101 if (cfg.ctx.mode.pwa) {
102 require('./pwa')(client, cfg) // extending a PWA
103 }
104
105 require('./ssr/server')(server, cfg)
106
107 return {
108 client: await getWebpackConfig(client, cfg, {
109 name: 'Client',
110 hot: true,
111 invokeParams: { isClient: true, isServer: false }
112 }),
113 server: await getWebpackConfig(server, cfg, {
114 name: 'Server',
115 invokeParams: { isClient: false, isServer: true }
116 })
117 }
118}
119
120module.exports = async function (cfg) {
121 const mode = cfg.ctx.mode
122
123 if (mode.ssr) {
124 return await getSSR(cfg)
125 }
126 else if (mode.electron) {
127 return await getElectron(cfg)
128 }
129 else if (mode.cordova) {
130 return await getCordova(cfg)
131 }
132 else if (mode.pwa) {
133 return await getPWA(cfg)
134 }
135 else {
136 return await getSPA(cfg)
137 }
138}