ttk-app-core
Version:
@ttk/recat enterprise develop framework
113 lines (100 loc) • 3.19 kB
JavaScript
const chokidar = require('chokidar')
const bodyParser = require('body-parser')
const chalk = require('chalk')
const path = require('path')
const fs = require('fs')
const Mock = require('mockjs')
const responseFake = (url, type, respond) => {
return {
url: new RegExp(`/mock${url}`),
type: type || 'get',
async response(req, res, next) {
res.json(Mock.mock(respond instanceof Function ? await respond(req, res, next) : respond))
}
}
}
function readFileList(dir, filesFileName = null) {
let filesList = []
fs.readdirSync(dir).filter(file => {
let fullPath = path.join(dir, file)
if (fs.statSync(fullPath).isDirectory()) {
filesList = filesList.concat(readFileList(path.join(dir, file), filesFileName))
} else {
if (filesFileName && file === filesFileName) {
filesList = filesList.concat(require(fullPath).default)
return true
}
if (!filesFileName) {
filesList = filesList.concat(require(fullPath).default)
return true
}
return false
}
})
return filesList;
}
const mockDir = path.join(process.cwd(), 'src/mock/mockFiles')
const appDir = path.join(process.cwd(), 'src/apps')
function registerRoutes(app) {
let mockLastIndex
let mocks = readFileList(appDir, 'mock.js')
mocks = mocks.concat(readFileList(mockDir))
let mocksRoutes = mocks.map(route => {
return responseFake(route.url, route.type, route.response)
})
for (const mock of mocksRoutes) {
app[mock.type](mock.url, mock.response)
mockLastIndex = app._router.stack.length
}
const mockRoutesLength = Object.keys(mocksRoutes).length
return {
mockRoutesLength: mockRoutesLength,
mockStartIndex: mockLastIndex - mockRoutesLength
}
}
function unregisterRoutes() {
Object.keys(require.cache).forEach(i => {
if (i.includes(mockDir) || i.includes(appDir)) {
delete require.cache[require.resolve(i)]
}
})
}
module.exports = app => {
// es6 polyfill
require('@babel/register')({
presets: ['@babel/preset-env', 'react-app']
})
// parse app.body
// https://expressjs.com/en/4x/api.html#req.body
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({
extended: true
}))
const mockRoutes = registerRoutes(app)
var mockRoutesLength = mockRoutes.mockRoutesLength
var mockStartIndex = mockRoutes.mockStartIndex
// watch files, hot reload mock server
chokidar.watch(appDir, {
ignored: /[^mock]\.js$|\.jsx$/,
ignoreInitial: true
}).on('all', onEvent)
chokidar.watch(mockDir, {
ignoreInitial: true
}).on('all', onEvent)
function onEvent(event, path) {
if (event === 'change' || event === 'add') {
try {
// remove mock routes stack
app._router.stack.splice(mockStartIndex, mockRoutesLength)
// clear routes cache
unregisterRoutes()
const mockRoutes = registerRoutes(app)
mockRoutesLength = mockRoutes.mockRoutesLength
mockStartIndex = mockRoutes.mockStartIndex
console.log(chalk.magentaBright(`\n > Mock Server 重载成功! \n > 已修改:${path}`))
} catch (error) {
console.log(chalk.redBright(error))
}
}
}
}