UNPKG

bia

Version:

a tool for download git repository

113 lines (105 loc) 3.06 kB
/* * @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, }