diff --git a/mock/mock-server.js b/mock/mock-server.js new file mode 100644 index 00000000..9b4638d2 --- /dev/null +++ b/mock/mock-server.js @@ -0,0 +1,69 @@ + +const chokidar = require('chokidar') +const bodyParser = require('body-parser') + +function getPath(path) { + var match = path.toString() + .replace('\\/?', '') + .replace('(?=\\/|$)', '$') + .match(/^\/\^((?:\\[.*+?^${}()|[\]\\\/]|[^.*+?^${}()|[\]\\\/])*)\$\//) + return match + ? match[1].replace(/\\(.)/g, '$1').split('/') + : path.toString() +} + +function registerRoutes(app) { + const { default: mocks } = require('./index.js') + for (const mock of mocks) { + app[mock.type](mock.url, mock.response) + } + return { + mockRoutesLength: Object.keys(mocks).length, + caches: require.cache + } +} + +function unregisterRoutes(caches) { + Object.keys(caches).forEach(i => { + if (i.includes('/mock')) { + delete caches[require.resolve(i)] + } + }) +} + +function getMockRoutesIndex(app) { + for (let index = 0; index <= app._router.stack.length; index++) { + const r = app._router.stack[index] + if (r.route && r.route.path) { + const path = getPath(r.route.path) + if (path.includes('mock')) { + return index + } + } + } +} + +module.exports = app => { + require('@babel/register') + + app.use(bodyParser.json()) + app.use(bodyParser.urlencoded({ + extended: true + })) + + const { mockRoutesLength, caches } = registerRoutes(app) + + chokidar.watch(('./mock'), { ignored: 'mock/mock-server.js', persistent: true, ignoreInitial: false }).on('all', (event, path) => { + if (event === 'change' || event === 'add') { + const index = getMockRoutesIndex(app) + + app._router.stack.splice(index, mockRoutesLength) + console.log('caches') + console.log(index) + // console.log(path) + unregisterRoutes(caches) + // console.log(app) + registerRoutes(app) + } + }) +} diff --git a/package.json b/package.json index 12bf3ffc..f8f98543 100644 --- a/package.json +++ b/package.json @@ -82,6 +82,7 @@ "babel-eslint": "10.0.1", "babel-jest": "23.6.0", "chalk": "2.4.2", + "chokidar": "2.1.5", "connect": "3.6.6", "eslint": "5.15.3", "eslint-plugin-vue": "5.2.2", diff --git a/vue.config.js b/vue.config.js index 7b9d2dbb..d3a08991 100644 --- a/vue.config.js +++ b/vue.config.js @@ -41,22 +41,7 @@ module.exports = { } } }, - after(app) { - require('@babel/register') - const bodyParser = require('body-parser') - - // parse app.body - // http://expressjs.com/en/4x/api.html#req.body - app.use(bodyParser.json()) - app.use(bodyParser.urlencoded({ - extended: true - })) - - const { default: mocks } = require('./mock') - for (const mock of mocks) { - app[mock.type](mock.url, mock.response) - } - } + after: require('./mock/mock-server.js') }, configureWebpack: { // provide the app's title in webpack's name field, so that