-
Notifications
You must be signed in to change notification settings - Fork 52
/
index.js
76 lines (65 loc) · 2.21 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
71
72
73
74
75
76
const errorOverlayMiddleware = require('react-dev-utils/errorOverlayMiddleware')
const chunkPathBasic = require.resolve('./entries/basic')
const chunkPathDevServer = require.resolve('./entries/devserver')
class ErrorOverlayPlugin {
apply(compiler) {
const className = this.constructor.name
if (compiler.options.mode !== 'development') return
const devServerEnabled = !!compiler.options.devServer
const sockOptions = {}
if (devServerEnabled) {
sockOptions.sockHost = compiler.options.devServer.sockHost
sockOptions.sockPath = compiler.options.devServer.sockPath
sockOptions.sockPort = compiler.options.devServer.sockPort
}
compiler.hooks.entryOption.tap(className, (context, entry) => {
adjustEntry(entry, devServerEnabled, sockOptions)
})
compiler.hooks.afterResolvers.tap(className, ({ options }) => {
if (devServerEnabled) {
const originalBefore = options.devServer.before
options.devServer.before = (app, server) => {
if (originalBefore) {
originalBefore(app, server, compiler)
}
app.use(errorOverlayMiddleware())
}
}
})
}
}
function adjustEntry(entry, enableDevServer, sockOptions) {
if (typeof entry === 'string') {
entry = [entry] // for anonymous single entry points
}
if (Array.isArray(entry)) {
if (enableDevServer) {
const sockHost = sockOptions.sockHost
? `&sockHost=${sockOptions.sockHost}`
: ''
const sockPath = sockOptions.sockPath
? `&sockPath=${sockOptions.sockPath}`
: ''
const sockPort = sockOptions.sockPort
? `&sockPort=${sockOptions.sockPort}`
: ''
const chunkPathDevServerWithParams = `${chunkPathDevServer}?${sockHost}${sockPath}${sockPort}`
if (!entry.includes(chunkPathDevServerWithParams)) {
entry.unshift(chunkPathDevServerWithParams)
}
}
if (!entry.includes(chunkPathBasic)) {
entry.unshift(chunkPathBasic)
}
} else {
Object.keys(entry).forEach((entryName) => {
entry[entryName] = adjustEntry(
entry[entryName],
enableDevServer,
sockOptions,
)
})
}
return entry
}
module.exports = ErrorOverlayPlugin