index.js 2.16 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
/**
 requestLibPath
 schemaPath
 mock
 projectName
 */

const node_fetch = require('node-fetch');
const swagger2openapi = require('swagger2openapi');
const serviceGenerators = require('./serviceGenerator');
const mockGenerator = require('./mockGenerator');
const log = require('./log');
const getImportStatement = (requestLibPath) => {
    if (requestLibPath && requestLibPath.startsWith('import')) {
        return requestLibPath;
    }
    if (requestLibPath) {
        return `import request from '${requestLibPath}'`;
    }
    return `import { request } from "umi"`;
}

const converterSwaggerToOpenApi = (swagger) => {
    if (!swagger.swagger) {
        return swagger;
    }
    return new Promise((resolve, reject) => {
        swagger2openapi.convertObj(swagger, {}, (err, options) => {
            log(['💺 将 Swagger 转化为 openAPI']);
            if (err) {
                reject(err);
                return;
            }
            resolve(options.openapi);
        });
    });
};

const getSchema = async (schemaPath) => {
    if (schemaPath.startsWith('http')) {
        const json = await node_fetch(schemaPath).then((rest) => rest.json());
        return json;
    }
    const schema = require(schemaPath);
    return schema;
};

const getOpenAPIConfig = async (schemaPath) => {
    const schema = await getSchema(schemaPath);
    const openAPI = await converterSwaggerToOpenApi(schema);
    if (!schema) {
        return null;
    }
    return openAPI;
};

// 从 appName 生成 service 数据
const generateService = async ({ requestLibPath, schemaPath, mockFolder, ...rest }) => {
    const openAPI = await getOpenAPIConfig(schemaPath);
    const requestImportStatement = getImportStatement(requestLibPath);
    const serviceGenerator = new serviceGenerators.ServiceGenerator({
        namespace: 'API',
邓晓峰's avatar
邓晓峰 committed
63
        basePath: openAPI.servers[0].url,
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
        requestImportStatement,
        ...rest,
    }, openAPI);
    serviceGenerator.genFile();
    if (mockFolder) {
        await mockGenerator.mockGenerator({
            openAPI,
            mockFolder: mockFolder || './mocks/',
        });
    }
    process.exit();
};


module.exports = {
    generateService,
    getSchema
邓晓峰's avatar
邓晓峰 committed
81
}