UNPKG

easy-mock-client

Version:
184 lines (165 loc) 6.41 kB
var BaseCommand = require('./command') var logger = require('../utils/logger') var generalUtils = require('../utils/general') var colors = require('colors/safe') var projectModule = require('./modules/project') class CommandInvoker { constructor(rawArgv) { this.argv = rawArgv.slice(2) this.command = this.__parseCommand(this.argv) } __parseCommand(argvParams) { var command = new BaseCommand() if (argvParams[0] === 'help') { command.register(argvParams, this.help) } else if (argvParams[0] === 'ls' && argvParams[1]) { command.register(argvParams, this.getSingleProject) } else if (argvParams[0] === 'ls') { command.register(argvParams, this.listProjects) } else if (argvParams[0] === 'inspect' && argvParams[1] && argvParams[2]) { command.register(argvParams, projectModule.showMockData) } else if (argvParams[0] === 'mock' && argvParams[1] === 'create') { command.register(argvParams, projectModule.createMock) } else if (argvParams[0] === 'create' && argvParams[1] === 'mock') { command.register(argvParams, projectModule.createMock) } else if (argvParams[0] === 'mock' && argvParams[1] === 'update') { command.register(argvParams, projectModule.updateMock) } else if (argvParams[0] === 'project' && argvParams[1] === 'create') { command.register(argvParams, projectModule.createProject) } else if (argvParams[0] === 'project' && argvParams[1] === 'update') { command.register(argvParams, projectModule.updateProject) } else { command.register({}, function () { logger.error('找不到命令') return Promise.resolve(1) }) } return command } getCommand() { return this.command } help() { logger.info(`> Read more here: https://github.com/easy-tools/easy-mock-client`) logger.info('', 'easy-mock-client <command>', '\n') logger.info('', colors.gray('Commands:')) const commands = [{ name: 'ls', options: [], description: 'List all projects', example: '$ easy-mock-client ls', }, { name: 'ls', options: ['projectId'], description: 'Display single project with mocks', example: '$ easy-mock-client ls project1', }, { name: 'inspect', options: ['projectId', 'mockId'], description: 'Display single project with mocks', example: '$ easy-mock-client inspect project1 mock1', }, { name: 'mock create', options: [], description: 'Create mock api', example: '$ easy-mock-client mock create', }, { name: 'mock update', options: [], description: 'update mock api', example: '$ easy-mock-client mock update', }, { name: 'project create', options: [], description: 'Create project', example: '$ easy-mock-client project create', }, { name: 'project update', options: [], description: 'update project', example: '$ easy-mock-client project update', }] const maxLength = [] const contentList = [] for (let comm of commands) { let content = [comm['name']] content.push(comm['options'].map(item => `[${item}]`).join(' ')) content.push(comm['description']) for (let i in content) { if (!maxLength[i] || maxLength[i] < content[i].length) { maxLength[i] = content[i].length } } contentList.push(content) } for (let content of contentList) { const printContent = content.map((item, index) => { return generalUtils.paddingRight(item, maxLength[index], ' ') }) logger.info(' ', printContent.join(' ')) } logger.info('') logger.info('', colors.gray('Examples:'), '\n') for (let comm of commands) { logger.info('', colors.gray('-'), comm.description, '\n') logger.info(' ', colors.cyan(comm.example), '\n') } logger.info('') return Promise.resolve(commands) } getSingleProject(client, context) { var startTimestamp = Date.now() return client.getMock(context[1]).then(response => { var finishTimeStamp = Date.now() var runTime = finishTimeStamp - startTimestamp var projectData = response.data logger.info(`> Fetched Project "${projectData.project._id}" ${projectData.project.name}`, colors.gray(`[${runTime}s]`), '\n') logger.info(' Project Information') logger.info(' ', colors.gray(generalUtils.paddingRight('user', 12, ' ')), projectData.project.user.name) var infoFields = ['_id', 'name', 'url', 'description'] for (var key of infoFields) { logger.info(' ', colors.gray(generalUtils.paddingRight(key, 12, ' ')), projectData.project[key]) } logger.info('\n', ' Mocks') var projectMocks = projectData.mocks for (var mockData of projectMocks) { logger.info(' ', colors.gray(mockData._id), mockData.url, colors.green(`(${mockData.method})`), mockData.description) } logger.info('') }) } listProjects(client, context) { var startTimestamp = Date.now() return client.listProjects().then(response => { var finishTimeStamp = Date.now() var runTime = finishTimeStamp - startTimestamp var projectList = response.data logger.info('>', `${projectList.length} total projects found`, colors.gray(`[${runTime}ms]`)) logger.info('> To list mocks for an project run `' + colors.cyan('easy-mock-client ls [app]') + '`', '\n') var itemList = [] var maxLength = [] for (var project of projectList) { var item = [project._id, project.name, project.url, project.description.substr(0, 15) + '...'] itemList.push(item) for (var i in item) { var meta = item[i] if (meta.length > maxLength[i] || !maxLength[i]) { maxLength[i] = meta.length } } } var titleLine = ['_id', 'name', 'url', 'description'].map((word, index) => { return word.padEnd(maxLength[index], ' ') }) logger.info(' ', colors.gray(titleLine.join(' '))) for (var element of itemList) { var target = element.map((word, index) => { return generalUtils.paddingRight(word, maxLength[index], ' ') }).join(' ') logger.info(' ', target) } logger.info('\n') }) } } module.exports = CommandInvoker