blob: 8941ec0f8035485e9c432ae7789ffd817e96ef42 [file] [log] [blame]
sijun.li96462302020-07-24 10:08:05 +08001const chokidar = require('chokidar')
2const bodyParser = require('body-parser')
3const chalk = require('chalk')
4const path = require('path')
5const Mock = require('mockjs')
6
7const mockDir = path.join(process.cwd(), 'mock')
8
9function registerRoutes(app) {
10 let mockLastIndex
11 const { mocks } = require('./index.js')
12 const mocksForServer = mocks.map(route => {
13 return responseFake(route.url, route.type, route.response)
14 })
15 for (const mock of mocksForServer) {
16 app[mock.type](mock.url, mock.response)
17 mockLastIndex = app._router.stack.length
18 }
19 const mockRoutesLength = Object.keys(mocksForServer).length
20 return {
21 mockRoutesLength: mockRoutesLength,
22 mockStartIndex: mockLastIndex - mockRoutesLength
23 }
24}
25
26function unregisterRoutes() {
27 Object.keys(require.cache).forEach(i => {
28 if (i.includes(mockDir)) {
29 delete require.cache[require.resolve(i)]
30 }
31 })
32}
33
34// for mock server
35const responseFake = (url, type, respond) => {
36 return {
37 url: new RegExp(`${process.env.VUE_APP_BASE_API}${url}`),
38 type: type || 'get',
39 response(req, res) {
40 console.log('request invoke:' + req.path)
41 res.json(Mock.mock(respond instanceof Function ? respond(req, res) : respond))
42 }
43 }
44}
45
46module.exports = app => {
47 // parse app.body
48 // https://expressjs.com/en/4x/api.html#req.body
49 app.use(bodyParser.json())
50 app.use(bodyParser.urlencoded({
51 extended: true
52 }))
53
54 const mockRoutes = registerRoutes(app)
55 var mockRoutesLength = mockRoutes.mockRoutesLength
56 var mockStartIndex = mockRoutes.mockStartIndex
57
58 // watch files, hot reload mock server
59 chokidar.watch(mockDir, {
60 ignored: /mock-server/,
61 ignoreInitial: true
62 }).on('all', (event, path) => {
63 if (event === 'change' || event === 'add') {
64 try {
65 // remove mock routes stack
66 app._router.stack.splice(mockStartIndex, mockRoutesLength)
67
68 // clear routes cache
69 unregisterRoutes()
70
71 const mockRoutes = registerRoutes(app)
72 mockRoutesLength = mockRoutes.mockRoutesLength
73 mockStartIndex = mockRoutes.mockStartIndex
74
75 console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`))
76 } catch (error) {
77 console.log(chalk.redBright(error))
78 }
79 }
80 })
81}