milady
Version:
Generate the front-end code by parsing the interface document
146 lines (111 loc) • 3.63 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = _default;
var _nodeFetch = _interopRequireDefault(require("node-fetch"));
var _path = require("path");
var _fsExtra = require("fs-extra");
var _signale = _interopRequireDefault(require("signale"));
var _common = require("./utils/common");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const loadPlugins = [];
// eslint-disable-next-line space-before-function-paren
async function _default({
dataSource,
plugins = [],
defaultPlugins = {
mock: {
enabled: true
},
serviceJs: {
enabled: false
},
serviceTs: {
enabled: true
},
serviceT: {
enabled: false
}
}
}) {
_signale.default.time('milady');
if (!dataSource) {
_signale.default.log('必须携带URL地址,如milady https://xx.x.x/abc/v2/api-docs#/');
return;
}
/* 获取数据 */
let data;
if ((0, _common.isUrl)(dataSource)) {
data = await getData(dataSource);
} else {
const str = (0, _path.join)(process.cwd(), dataSource); // eslint-disable-next-line global-require,import/no-dynamic-require
data = require(str);
}
/* 处理数据 */
const files = handleData(data, defaultPlugins, plugins);
/* 生成代码 */
codeGen(files);
_signale.default.timeEnd('milady');
}
async function getData(dataSource) {
const res = await (0, _nodeFetch.default)(dataSource);
const data = await res.json();
const error = await data.catch;
if (error) {
_signale.default.error(error);
}
return data;
}
function handleData(SwaggerData, defaultPlugins, plugins) {
const directory = [];
/* 加载默认插件 */
const defaultPluginsName = (0, _fsExtra.readdirSync)((0, _path.join)(__dirname, '/plugins'));
defaultPluginsName.forEach(item => {
const defaultPlugin = defaultPlugins[item];
const str = (0, _path.join)(__dirname, '/plugins', item); // eslint-disable-next-line global-require,import/no-dynamic-require
const defaultPluginFile = require(str).default;
if (defaultPlugin.enabled) {
directory.push({
outPath: defaultPluginFile.outPath,
file: defaultPluginFile.handelData(SwaggerData)
});
loadPlugins.push(item);
}
});
/* 加载配置插件 */
if (Object.prototype.toString.call(plugins) === '[object Array]') {
if (plugins.length !== 0) {
plugins.forEach(element => {
if (element.hasOwnProperty('url')) {
const str = (0, _path.join)(process.cwd(), element.url); // eslint-disable-next-line global-require,import/no-dynamic-require
const pluginsFile = require(str).default;
directory.push({
outPath: pluginsFile.outPath,
file: pluginsFile.handelData(SwaggerData)
});
loadPlugins.push(element.url.split('/').pop());
} else {
_signale.default.error('插件字段类型有误!');
}
});
}
} else {
_signale.default.error('请检查插件格式是否为数组!');
} // 检查插件类型
return directory;
}
function generate(outPath, fileArr) {
fileArr.forEach(element => {
let paths = outPath || 'out/';
paths = (0, _path.join)(paths, element.fileName);
(0, _fsExtra.outputFileSync)(paths, element.fileStr, 'utf-8');
});
}
function codeGen(files) {
files.forEach(element => {
generate(element.outPath, element.file);
});
_signale.default.complete('文件创建完成');
_signale.default.complete(`加载插件列表:${loadPlugins.join('、')}`);
}