rapplus
Version:
rapper, use http api as a function
274 lines (273 loc) • 17.1 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
exports.__esModule = true;
var chalk_1 = require("chalk");
var formatter_1 = require("json-schema-to-typescript/dist/src/formatter");
var json_schema_to_typescript_1 = require("json-schema-to-typescript");
var types_1 = require("./types");
var base_creator_1 = require("./core/base-creator");
var utils_1 = require("./utils");
var tools_1 = require("./core/tools");
var scanFile_1 = require("./core/scanFile");
var url = require("url");
var ora = require("ora");
var packageJson = require('../package.json');
// 扫描被删除的接口
function sanDeleteInterfaces(interfaces, rapperPath, projectId, spinner) {
return __awaiter(this, void 0, void 0, function () {
var scanResult, confirmed;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
/** Rap 接口引用扫描,如果 projectId 更改了就不再扫描,避免过多的报错信息展现在Terminal */
spinner.start(chalk_1["default"].grey('rapper: 正在扫描接口依赖'));
if (!(utils_1.getOldProjectId(rapperPath) === String(projectId))) return [3 /*break*/, 4];
scanResult = scanFile_1.findDeleteFiles(interfaces, [rapperPath]);
if (!(scanResult.length && scanResult.length < 5)) return [3 /*break*/, 2];
spinner.warn(chalk_1["default"].yellow('rapper: 如下文件使用了已被 Rap 删除或修改的接口'));
scanResult.forEach(function (_a) {
var key = _a.key, filePath = _a.filePath, start = _a.start, line = _a.line;
console.log(chalk_1["default"].yellow(" \u63A5\u53E3: " + key + ", \u6240\u5728\u6587\u4EF6: " + filePath + ":" + line + ":" + start));
});
return [4 /*yield*/, utils_1.templateFilesRelyConfirm()];
case 1:
confirmed = (_a.sent()).confirmed;
if (!confirmed) {
console.log(chalk_1["default"].red('更新操作已终止'));
process.exit(0);
return [2 /*return*/];
}
return [3 /*break*/, 3];
case 2:
spinner.succeed(chalk_1["default"].grey('rapper: 未发现不合法依赖'));
_a.label = 3;
case 3: return [3 /*break*/, 5];
case 4:
spinner.succeed(chalk_1["default"].grey('rapper: 未发现不合法依赖'));
_a.label = 5;
case 5: return [2 /*return*/];
}
});
});
}
// type: 'normal',
// apiUrl: 'https://rap-api.xiaodiankeji.net/repository/get?id=23&token=K8qm31HyAoGopAu7kE3TIVWTMX0EOENf',
// /** rap 前端地址,默认是 http://rap2.taobao.org */
// rapUrl: 'https://rap.xiaodiankeji.net',
// /** 输出文件的目录,默认是 ./src/rapper */
// rapperPath: './test/src/models/rapper',
// rapper({});
function rapper(config) {
return __awaiter(this, void 0, void 0, function () {
var type, urlMapper, codeStyle, resSelector, _a, apiUrl, rapUrl, rapperPath, spinner, apiParams, projectId, changeFiles, confirmed, outputFiles, modules, e_1, allInterfaces, err_1;
var _this = this;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
type = 'normal';
urlMapper = function (t) { return t; };
codeStyle = undefined;
resSelector = 'type ResSelector<T> = T';
_a = config.rapper, apiUrl = _a.apiUrl, rapUrl = _a.rapUrl, rapperPath = _a.matchDir;
spinner = ora(chalk_1["default"].grey('rapper: 开始检查版本'));
spinner.start();
/** 检查版本,给出升级提示 */
// try {
// const newVersion = await latestVersion('rap', rapperVersion.indexOf('beta') > -1);
// if (semver.lt(rapperVersion, newVersion)) {
// spinner.warn(chalk.yellow('rapper 升级提示: '));
// console.log(` 当前版本: ${chalk.grey(rapperVersion)}`);
// console.log(` 最新版本: ${chalk.cyan(newVersion)}`);
// // console.log(
// // ` 运行 ${chalk.green(`npm i -D ${packageJson.name}@latest && npm run rapper`)} 即可升级`,
// // );
// }
// } catch (err) {
// spinner.warn(`rapper 版本检查失败,${err.message}`);
// }
/** 参数校验 */
spinner.start(chalk_1["default"].grey('rapper: 开始校验参数'));
if (!type) {
return [2 /*return*/, new Promise(function () { return spinner.fail(chalk_1["default"].red('rapper: 请配置 type 参数')); })];
}
else if (!['normal', 'redux'].includes(type)) {
return [2 /*return*/, new Promise(function () { return spinner.fail(chalk_1["default"].red('rapper: type 参数配置错误,请重新配置')); })];
}
spinner.succeed(chalk_1["default"].grey('rapper: 参数校验成功'));
apiParams = url.parse(apiUrl, true).query;
projectId = parseInt(Array.isArray(apiParams.id) ? apiParams.id[0] : apiParams.id);
json_schema_to_typescript_1.DEFAULT_OPTIONS.style = __assign(__assign({}, json_schema_to_typescript_1.DEFAULT_OPTIONS.style), { singleQuote: true, semi: false, trailingComma: types_1.TRAILING_COMMA.ES5 });
if (codeStyle && typeof codeStyle === 'object') {
json_schema_to_typescript_1.DEFAULT_OPTIONS.style = __assign({}, codeStyle);
}
rapperPath = rapperPath.replace(/\/$/, '');
rapUrl = rapUrl.replace(/\/$/, '');
apiUrl = apiUrl.replace(/\/$/, '');
/** 校验当前 rapper 的版本是否比旧模板代码版本低,强制升级 */
// const oldFilesRapperVersion = findRapperVersion(rapperPath);
// if (oldFilesRapperVersion && semver.lt(rapperVersion, oldFilesRapperVersion)) {
// return new Promise(() => {
// spinner.fail(
// chalk.red(
// 'rapper 执行失败: 当前环境 rapper 版本低于已经生成的模板文件版本,为避免低版本覆盖高版本,请您升级',
// ),
// );
// console.log(` 当前版本: ${chalk.grey(rapperVersion)}`);
// console.log(` 当前模板文件版本: ${chalk.cyan(oldFilesRapperVersion)}`);
// });
// }
/** 扫描找出生成的模板文件是否被手动修改过 */
spinner.start(chalk_1["default"].grey('rapper: 检测模板代码是否被修改'));
changeFiles = scanFile_1.findChangeFiles(rapperPath);
if (!changeFiles.length) return [3 /*break*/, 2];
spinner.warn(chalk_1["default"].yellow('rapper: 检测到如下模板代码被修改'));
changeFiles.forEach(function (str) {
console.log(chalk_1["default"].yellow(" " + str));
});
return [4 /*yield*/, utils_1.templateFilesOverwriteConfirm()];
case 1:
confirmed = (_b.sent()).confirmed;
if (!confirmed) {
console.log(chalk_1["default"].red('更新操作已终止'));
process.exit(0);
return [2 /*return*/];
}
return [3 /*break*/, 3];
case 2:
spinner.succeed(chalk_1["default"].grey('rapper: 模板代码未被修改'));
_b.label = 3;
case 3:
outputFiles = [];
/** 所有接口集合 */
// const interfaces: Array<Intf> = [];
spinner.start(chalk_1["default"].grey('rapper: 正在从 Rap 平台获取接口信息...'));
modules = [];
_b.label = 4;
case 4:
_b.trys.push([4, 6, , 7]);
return [4 /*yield*/, tools_1.getModules(apiUrl)];
case 5:
modules = _b.sent();
// modules = [modules[0]]
// 模块
// outputFiles.push()
// const _interfaces = modules[0].interfaces
// interfaces = await getInterfaces(_interfaces);
spinner.succeed(chalk_1["default"].grey('rapper: 获取接口信息成功'));
return [3 /*break*/, 7];
case 6:
e_1 = _b.sent();
return [2 /*return*/, new Promise(function () { return spinner.fail(chalk_1["default"].red("rapper: \u83B7\u53D6\u63A5\u53E3\u4FE1\u606F\u5931\u8D25\uFF0C" + e_1)); })];
case 7:
//--
// interfaces = uniqueItfs(getIntfWithModelName(rapUrl, interfaces, urlMapper));
// 下载 modId
if (config.download.moduleId) {
modules = modules.filter(function (e) { return e.id === config.download.moduleId; });
}
allInterfaces = modules.map(function (e) { return e.interfaces; });
sanDeleteInterfaces(allInterfaces, rapperPath, projectId, spinner);
spinner.start(chalk_1["default"].grey('rapper: 正在生成模板代码...'));
_b.label = 8;
case 8:
_b.trys.push([8, 10, , 11]);
/** 生成基础的 request.ts 请求函数和类型声明 */
return [4 /*yield*/, Promise.all(modules.map(function (m) { return __awaiter(_this, void 0, void 0, function () {
var interfaces, _a, tsInterfaceStr, tsCodeStr, tsInterfaceNames, _b, fileName, moduleHeader, requestStr;
return __generator(this, function (_c) {
switch (_c.label) {
case 0:
interfaces = m.interfaces;
return [4 /*yield*/, base_creator_1.createBaseRequestStr(interfaces, {
rapUrl: rapUrl,
resSelector: resSelector
}, config)];
case 1:
_a = _c.sent(), tsInterfaceStr = _a.tsInterfaceStr, tsCodeStr = _a.tsCodeStr, tsInterfaceNames = _a.tsInterfaceNames;
_b = config.download.requestModule({
repositoryId: m.priority,
moduleId: m.id,
moduleRapUrl: rapUrl,
moduleDescription: m.description
}), fileName = _b.fileName, moduleHeader = _b.moduleHeader;
requestStr = "\n " + tools_1.creatHeadHelpStr(rapUrl, projectId, m.id) + "\n import type {\n " + tsInterfaceNames.join(',') + "\n } from './types/" + fileName + "'\n " + moduleHeader + "\n " + tsCodeStr + "\n ";
outputFiles.push({
path: rapperPath + "/types/" + fileName + ".ts",
content: formatter_1.format(tsInterfaceStr, json_schema_to_typescript_1.DEFAULT_OPTIONS)
}, {
path: rapperPath + "/" + fileName + ".ts",
content: formatter_1.format(requestStr, json_schema_to_typescript_1.DEFAULT_OPTIONS)
});
return [2 /*return*/];
}
});
}); }))];
case 9:
/** 生成基础的 request.ts 请求函数和类型声明 */
_b.sent();
outputFiles = outputFiles.map(function (item) { return (__assign(__assign({}, item), { content: "/* md5: " + utils_1.getMd5(item.content) + " */\n" + item.content })); });
return [3 /*break*/, 11];
case 10:
err_1 = _b.sent();
spinner.fail(chalk_1["default"].red("rapper: \u5931\u8D25\uFF01" + err_1.message));
return [2 /*return*/];
case 11: return [2 /*return*/, Promise.all(outputFiles.map(function (_a) {
var path = _a.path, content = _a.content;
return utils_1.writeFile(path, content);
}))
.then(function () {
spinner.succeed(chalk_1["default"].green("rapper: \u6210\u529F\uFF01\u5171\u540C\u6B65\u4E86 " + modules.length + " \u4E2A\u6A21\u5757, " + allInterfaces.length + " \u4E2A\u63A5\u53E3"));
})["catch"](function (err) {
spinner.fail(chalk_1["default"].red("rapper: \u5931\u8D25\uFF01" + err.message));
})];
}
});
});
}
exports["default"] = rapper;