bia
Version:
a tool for download git repository
113 lines (105 loc) • 3.06 kB
JavaScript
/*
* @Author: hzxulin@yeah.net
* @Date: 2018-12-19 17:45:38
* @Last Modified by: hzxulin@yeah.net
* @Last Modified time: 2018-12-19 20:03:37
*/
const path = require('path')
const fse = require('fs-extra')
const ip = require('ip')
const express = require('express')
const opn = require('opn')
const detectPort = require('detect-port')
const MOCK_CONFIG = require('../../config/mock.json')
/**
* 查询 mock 文件是否存在
*/
const checkMockFile = () => {
return new Promise((resolve, reject) => {
try {
let file = path.resolve(process.cwd(), 'biaMock/mock.json')
fse.exists(file, exists => {
resolve(exists)
})
} catch (err) {
reject(err)
}
})
}
/**
* 创建 mock.json 文件
*/
const createMockFile = () => {
return new Promise((resolve, reject) => {
try {
let dist = path.resolve(process.cwd(), 'biaMock')
fse.ensureDirSync(dist)
fse.outputFileSync(path.resolve(dist, 'mock.json'), JSON.stringify(MOCK_CONFIG, null, 4))
resolve()
} catch (err) {
reject(err)
}
})
}
/**
* 从数据对象中按照路由数组获取子数据
* @param {object} data mock.json 中的数据对象
* @param {array} pathArray 路由的数组
*/
const getDataFromObjByArray = (data, pathArray) => {
if (pathArray.length) {
let newData = data[pathArray[0]]
if (newData == null) {
return {}
} else {
return getDataFromObjByArray(newData, pathArray.slice(1))
}
} else {
return data
}
}
/**
* 启动数据 mock 服务
* @param {boolean} corsFlag 是否开启跨域模式
*/
const startMockServer = (corsFlag) => {
return new Promise((resolve, reject) => {
const mockApp = express()
mockApp.all(/^\//, (req, res) => {
let reqPath = req.path
let reqQuery = req.query
let pathArr = []
if (reqPath == '/') {
pathArr = []
} else {
pathArr = reqPath.split('/').slice(1)
}
if (corsFlag) {
res.header('Access-Control-Allow-Origin', '*')
}
fse.readJson(path.resolve(process.cwd(), 'biaMock/mock.json'), (err, obj) => {
if (err) console.log('some error in mock.json, Check the file format')
let newData = getDataFromObjByArray(obj, pathArr)
if (reqQuery.callback) {
res.jsonp(newData)
} else {
res.send(newData)
}
})
})
detectPort(3000).then((port) => {
return mockApp.listen(port, () => {
const url = `http://${ip.address()}:${port}`
opn(url)
resolve(url)
})
}).catch(err => {
reject(err)
})
})
}
module.exports = {
checkMockFile,
createMockFile,
startMockServer,
}