SOURCE

let res = {
    res_body: '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"data":{"type":"object","properties":{"modifyPassword":{"type":"object","properties":{"messages":{"type":"string"},"field_3":{"type":"object","properties":{"field_4":{"type":"string"}}},"field_5":{"type":"array","items":{"type":"string"}},"field_11":{"type":"array","items":{"type":"object","properties":{"field_12":{"type":"string"}},"required":["field_12"]}}},"required":["field_2","field_5","field_11"]}}}}}',
    res_body_is_json_schema: true,
    res_body_type: "json"
}

let req = {
    req_body_is_json_schema: true,
    req_body_other: '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"config":{"type":"object","properties":{"field_1":{"type":"string"}},"description":"@Config@","required":["field_1"]},"password":{"type":"string"},"user":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]},"description":"@User@"}},"required":["config","user","password"]}',
    req_body_type: "json"
}
let schema = {res, req}
let data = {
  a1: 'a1',
  a2: 'a2',
  a3: {
    a31: {
      a311: 'a311'
    },
    a32: 'a32'
  },
  a4:{
    a41: 'a41'
  }, 
  a5: 'a5'
}
let name = '/api/v1/graphql/test'

/**
 * schema:{res, req} 请求和响应的schema
 * interfaceName: 接口名字
 * opera: 操作类型
 */
const JSONSchema2Graphql = (schema, interfaceName, opera) => {
    opera = opera || 'query';
    let queryStr = '';
    queryStr = `${opera} ${interfaceName}`;

    const genReqStr = (param) => {
        const keys = Object.keys(param);
        keys.forEach(key => {
            let reg = /@(.*)@/;
            let graphqlType, baseType, finType;
            if(param[key].type === 'object' || param[key].type === 'array'){
                if(!param[key].description){
                    throw new Error(`请在字段描述中给字段${key}设置graphql类型!`);
                }
                if(!reg.test(param[key].description)){
                    throw new Error(`请在字段描述中按照@className@的格式为字段${key}设置graphql类型!`);
                }
                graphqlType = reg.exec(param[key].description)[1];
            }
            baseType = param[key].type;
            finType = baseType === 'object' ? graphqlType : baseType;
            if(baseType !== 'array'){
                queryStr = `${queryStr} $${key}: ${finType}, `;
            }else{
                queryStr = `${queryStr} $${key}: [${graphqlType}], `;
            }
        });
        queryStr = queryStr.substring(0, queryStr.length - 2);
    }

    const genInterfaceStr = (params) => {
        const keys = Object.keys(params);
        keys.forEach(key => {
            queryStr = `${queryStr} ${key}: $${key}, `;
        });
        queryStr = queryStr.substring(0, queryStr.length - 2);
    }

    const genResStr = (res) => {
        const keys = Object.keys(res);
        keys.forEach(key => {
            if(res[key].type !== 'object' && res[key].type !== 'array'){
                queryStr = `${queryStr}${key} `;
            }
            if(res[key].type === 'object'){
                queryStr = `${queryStr} ${key}{`;
                if(res[key].properties && Object.keys(res[key].properties).length > 0){
                genResStr(res[key].properties);
            }
                queryStr = `${queryStr}}`;
            }
            if(res[key].type === 'array'){
                queryStr = `${queryStr} ${key}`;
                if(res[key].items && res[key].items.type === 'object'){
                    queryStr = `${queryStr}{`;
                    genResStr(res[key].items.properties);
                    queryStr = `${queryStr}}`;
                }
                //多维数组-暂不考虑
                /*else if(res[key].items && res[key].items.type === 'array'){
                    queryStr = `${queryStr}{`;
                    //genResStr(res[key].items.properties);
                    queryStr = `${queryStr}}`;
                }*/
            }
        });
    }
    let reqObject = JSON.parse(schema.req.req_body_other);
    let resObject = JSON.parse(schema.res.res_body);
    //如果有请求参数
    if(schema.req.req_body_is_json_schema && schema.req.req_body_type === 'json' && reqObject.properties && Object.keys(reqObject.properties).length > 0){
        //生成自接口别名字符串部分+形参
        queryStr = `${queryStr}(`;
        genReqStr(reqObject.properties);
        queryStr = `${queryStr})`;
        //生成真实接口字符串部分
        queryStr = `${queryStr}{`;
        queryStr = `${queryStr} ${interfaceName}`;
        //生成真实接口形参字符串
        queryStr = `${queryStr}(`;
        genInterfaceStr(reqObject.properties);
        queryStr = `${queryStr})`;
        //queryStr = `${queryStr}}`;
    }
    //如果有返回参数
    if(schema.res.res_body_is_json_schema && schema.res.res_body_type === 'json' && resObject.properties && Object.keys(resObject.properties).length > 0){
        if(!resObject.properties.data){
             throw new Error(`graphq类型接口必须在返回参数的第一级设置data字段!`);
        }
        if(!resObject.properties.data.properties['modifyPassword']){
            throw new Error(`graphq类型接口返回参数data下面必须要有以接口名作为key的字段!`);
        }
        queryStr = `${queryStr}{`;
        genResStr(resObject.properties.data.properties['modifyPassword'].properties);
        queryStr = `${queryStr}}`;
    }
    return queryStr;
}
console.log(JSONSchema2Graphql(schema, 'testAPI', 'mutation'));
//console.log(JSON2Graphql(data, schema, name, 'mutation'));



console 命令行工具 X clear

                    
>
console