-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
104 lines (92 loc) · 2.64 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
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
/**
* A better http-proxy-middleware with hot update config and cli
* @author imcuttle
*/
const nps = require('path')
const fs = require('fs')
const findUp = require('find-up')
const proxy = require('http-proxy-middleware')
const hotModuleRequire = require('hot-module-require')(__dirname)
function hotProxy(configFile, commonConfig) {
if (!configFile) {
configFile = inferConfigFile()
}
if (!configFile) {
throw new Error(`hotproxy config file is not found.`)
}
const resolvedConfigFile = nps.resolve(configFile)
configFile = fs.existsSync(resolvedConfigFile) ? resolvedConfigFile : configFile
const moduleGetter = hotModuleRequire(require.resolve(configFile))
return Object.assign(
function() {
createMiddleware(moduleGetter(), commonConfig).apply(this, arguments)
},
{ hotModuleGetter: moduleGetter }
)
}
function createMiddleware(configs, commonConfig) {
return function(req, res, next) {
const handleConfigs = configs => {
configs = normalizeConfig(configs)
if (!configs) {
return next && next()
}
const middlewareList = configs.map(config => {
config = Object.assign({}, commonConfig, config)
const clonedConfig = Object.assign({}, config)
delete clonedConfig.context
if (!config.context) {
return proxy(config).bind(this, req, res)
}
return proxy(config.context, clonedConfig).bind(this, req, res)
})
return runTasks(middlewareList, next)
}
if (configs && typeof configs.then === 'function' && typeof configs.catch === 'function') {
return Promise.resolve(configs).then(configs => {
return handleConfigs(configs)
})
}
return handleConfigs(configs)
}
}
function runTasks(tasks, next) {
tasks = tasks.slice()
let head = tasks.shift()
if (head) {
head(function() {
runTasks(tasks, next)
})
} else {
next && next()
}
}
function inferConfigFile(cwd = process.cwd(), options) {
return findUp.sync('hotproxy.config.js', Object.assign({ cwd }, options))
}
function normalizeContext(context) {
if (context.indexOf('|') >= 0) {
return context.split('|')
}
return context
}
function normalizeConfig(config) {
if (config && !Array.isArray(config)) {
config = Object.keys(config).reduce((list, context) => {
list.push(
Object.assign(typeof config[context] === 'string' ? { target: config[context] } : config[context], {
context: normalizeContext(context)
})
)
return list
}, [])
}
return config
}
module.exports = {
hotProxy,
normalizeConfig,
normalizeContext,
createMiddleware,
inferConfigFile
}