mockGenerator.js 5.2 KB
const mockjs = require('mockjs');
const fs = require('fs');
const path = require('path');
const util = require('./util');
const openAPIParserMock = require('./openAPIParserMock/index');
const log = require('./log');
mockjs.Random.extend({
  country() {
    const data = [
      '阿根廷',
      '澳大利亚',
      '巴西',
      '加拿大',
      '中国',
      '法国',
      '德国',
      '印度',
      '印度尼西亚',
      '意大利',
      '日本',
      '韩国',
      '墨西哥',
      '俄罗斯',
      '沙特阿拉伯',
      '南非',
      '土耳其',
      '英国',
      '美国',
    ];
    const id = (Math.random() * data.length).toFixed();
    return data[id];
  },
  phone() {
    const phonepreFix = ['111', '112', '114']; // 自己写前缀哈
    return this.pick(phonepreFix) + mockjs.mock(/\d{8}/); // Number()
  },
  status() {
    const status = ['success', 'error', 'default', 'processing', 'warning'];
    return status[(Math.random() * 4).toFixed(0)];
  },
  authority() {
    const status = ['admin', 'user', 'guest'];
    return status[(Math.random() * status.length).toFixed(0)];
  },
  avatar() {
    const avatar = [
      'https://gw.alipayobjects.com/zos/rmsportal/KDpgvguMpGfqaHPjicRK.svg',
      'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
      'https://gw.alipayobjects.com/zos/antfincdn/XAosXuNZyF/BiazfanxmamNRoxxVxka.png',
      'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png',
      'https://gw.alipayobjects.com/zos/rmsportal/OKJXDXrmkNshAMvwtvhu.png',
      'https://avatars0.githubusercontent.com/u/507615?s=40&v=4',
      'https://avatars1.githubusercontent.com/u/8186664?s=40&v=4',
    ];
    const id = (Math.random() * avatar.length).toFixed();
    return avatar[id];
  },
  group() {
    const data = [
      '体验技术部',
      '创新科技组',
      '前端 6 组',
      '区块链平台部',
      '服务技术部',
    ];
    const id = (Math.random() * data.length).toFixed();
    return data[id];
  },
  label() {
    const label = [
      '很有想法的',
      '小清新',
      '傻白甜',
      '阳光少年',
      '大咖',
      '健身达人',
      '程序员',
      '算法工程师',
      '川妹子',
      '名望程序员',
      '大长腿',
      '海纳百川',
      '专注设计',
      '爱好广泛',
      'IT 互联网',
    ];
    const id = (Math.random() * label.length).toFixed();
    return label[id];
  },
  href() {
    const href = [
      'https://preview.pro.ant.design/dashboard/analysis',
      'https://ant.design',
      'https://procomponents.ant.design/',
      'https://umijs.org/',
      'https://github.com/umijs/dumi',
    ];
    const id = (Math.random() * href.length).toFixed();
    return href[id];
  },
});
const genMockData = example => {
  if (!example) {
    return {};
  }
  if (typeof example === 'string') {
    return mockjs.mock(example);
  }
  if (Array.isArray(example)) {
    return mockjs.mock(example);
  }
  return Object.keys(example)
    .map(name => ({
      [name]: mockjs.mock(example[name]),
    }))
    .reduce(
      (pre, next) => ({
        ...pre,
        ...next,
      }),
      {},
    );
};
// eslint-disable-next-line no-shadow
const genByTemp = ({ method, path, status, data }) => {
  if (
    !['get', 'put', 'post', 'delete', 'patch'].includes(
      method.toLocaleLowerCase(),
    )
  ) {
    return '';
  }
  return `'${method.toUpperCase()} ${path}': (req, res) => {
    res.status(${status}).send(${data});
  }`;
};
const genMockFiles = mockFunction =>
  util.prettierFile(`
// @ts-ignore
//import { Request, Response } from 'express';

module.exports = {
${mockFunction.join('\n,')}
    }`)[0];
const mockGenerator = async ({ openAPI, mockFolder }) => {
  // eslint-disable-next-line new-cap
  const openAPParse = new openAPIParserMock(openAPI);
  const docs = openAPParse.parser();
  const pathList = Object.keys(docs.paths);
  const { paths } = docs;
  const mockActionsObj = {};
  // eslint-disable-next-line no-shadow
  pathList.forEach(path => {
    const pathConfig = paths[path];
    Object.keys(pathConfig).forEach(method => {
      const methodConfig = pathConfig[method];
      if (methodConfig) {
        const conte =
          (methodConfig && methodConfig.tags && methodConfig.tags.join('/')) ||
          path.replace('/', '').split('/')[1] ||
          methodConfig.operationId;
        const data = genMockData(
          methodConfig &&
            methodConfig.responses &&
            methodConfig.responses['200'] &&
            methodConfig.responses['200'].example,
        );
        if (!mockActionsObj[conte]) {
          mockActionsObj[conte] = [];
        }
        const tempFile = genByTemp({
          method,
          path,
          status: '200',
          data: JSON.stringify(data),
        });
        if (tempFile) {
          mockActionsObj[conte].push(tempFile);
        }
      }
    });
  });
  Object.keys(mockActionsObj).forEach(file => {
    if (!file || file === 'undefined') {
      return;
    }
    fs.writeFileSync(
      path.join(mockFolder, `${file}.mock.js`),
      genMockFiles(mockActionsObj[file]),
      {
        encoding: 'utf8',
      },
    );
  });
  log('✅ 生成 mock 文件成功');
};

module.exports = {
  mockGenerator,
};