rap2itf
Version:
rapper接口转换为typescirpt interface
482 lines (481 loc) • 15.5 kB
JavaScript
'use strict'
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 }
}
}
var __asyncValues =
(this && this.__asyncValues) ||
function (o) {
if (!Symbol.asyncIterator) throw new TypeError('Symbol.asyncIterator is not defined.')
var m = o[Symbol.asyncIterator],
i
return m
? m.call(o)
: ((o = typeof __values === 'function' ? __values(o) : o[Symbol.iterator]()),
(i = {}),
verb('next'),
verb('throw'),
verb('return'),
(i[Symbol.asyncIterator] = function () {
return this
}),
i)
function verb(n) {
i[n] =
o[n] &&
function (v) {
return new Promise(function (resolve, reject) {
;(v = o[n](v)), settle(resolve, reject, v.done, v.value)
})
}
}
function settle(resolve, reject, d, v) {
Promise.resolve(v).then(function (v) {
resolve({ value: v, done: d })
}, reject)
}
}
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 ora = require('ora')
var packageJson = require('../package.json')
var path = require('path')
var getWriteFile = function (existFileList, outputFiles) {
var outputFiles_1, outputFiles_1_1
return __awaiter(void 0, void 0, void 0, function () {
var tempoutfiles,
cmdPath,
handleOverWrite,
_a,
pathname,
content,
rePath,
confirm_1,
fun,
goOn,
e_1_1
var e_1, _b
return __generator(this, function (_c) {
switch (_c.label) {
case 0:
tempoutfiles = []
cmdPath = process.cwd()
handleOverWrite = {
yes: function (it) {
tempoutfiles.push(it)
return true
},
no: function (it) {
return true
},
allYes: function (it) {
tempoutfiles.length = 0
tempoutfiles.push.apply(tempoutfiles, outputFiles)
return false
},
allNo: function (it) {
return false
},
}
_c.label = 1
case 1:
_c.trys.push([1, 8, 9, 14])
outputFiles_1 = __asyncValues(outputFiles)
_c.label = 2
case 2:
return [4 /*yield*/, outputFiles_1.next()]
case 3:
if (!((outputFiles_1_1 = _c.sent()), !outputFiles_1_1.done)) return [3 /*break*/, 7]
;(_a = outputFiles_1_1.value), (pathname = _a.path), (content = _a.content)
if (!(existFileList.length && existFileList.includes(pathname))) return [3 /*break*/, 5]
rePath = path.relative(cmdPath, pathname)
return [
4 /*yield*/,
(0, utils_1.fileOverWiriteconfirm)(
'\u786E\u5B9A\u8981\u8986\u76D6\u6587\u4EF6: ' + rePath + ' \u5417\uFF1F',
),
]
case 4:
confirm_1 = _c.sent().confirm
fun = handleOverWrite[confirm_1]
if (typeof fun === 'function') {
goOn = fun({ path: pathname, content: content })
if (goOn) {
return [3 /*break*/, 6]
} else {
return [3 /*break*/, 7]
}
}
return [3 /*break*/, 6]
case 5:
// 清空
tempoutfiles.length = 0
// 添加所有的文件
tempoutfiles.push.apply(tempoutfiles, outputFiles)
return [3 /*break*/, 7]
case 6:
return [3 /*break*/, 2]
case 7:
return [3 /*break*/, 14]
case 8:
e_1_1 = _c.sent()
e_1 = { error: e_1_1 }
return [3 /*break*/, 14]
case 9:
_c.trys.push([9, , 12, 13])
if (!(outputFiles_1_1 && !outputFiles_1_1.done && (_b = outputFiles_1['return'])))
return [3 /*break*/, 11]
return [4 /*yield*/, _b.call(outputFiles_1)]
case 10:
_c.sent()
_c.label = 11
case 11:
return [3 /*break*/, 13]
case 12:
if (e_1) throw e_1.error
return [7 /*endfinally*/]
case 13:
return [7 /*endfinally*/]
case 14:
return [2 /*return*/, tempoutfiles]
}
})
})
}
function default_1(_a) {
var // type,
_b = _a.rapUrl,
// type,
rapUrl = _b === void 0 ? 'http://rap2.taobao.org' : _b,
_c = _a.apiUrl,
apiUrl = _c === void 0 ? 'http://rap2api.taobao.org' : _c,
_d = _a.rapperPath,
rapperPath = _d === void 0 ? './src/rapper' : _d,
// urlMapper = (t) => t,
codeStyle = _a.codeStyle,
interfaceId = _a.interfaceId,
_e = _a.split,
split = _e === void 0 ? 2 : _e,
token = _a.token,
projectId = _a.projectId
return __awaiter(this, void 0, void 0, function () {
var spinner,
rapperVersion,
flag,
outputFiles,
interfaces,
e_2,
interfaceModels,
err_1,
existFileList,
tempoutfiles
var _this = this
return __generator(this, function (_f) {
switch (_f.label) {
case 0:
spinner = ora(chalk_1['default'].grey('rapper: 开始检查版本'))
rapperVersion = packageJson.version
console.log('\u5F53\u524Drapper\u7248\u672C: ' + chalk_1['default'].grey(rapperVersion))
// spinner.start();
/** 参数校验 */
spinner.start(chalk_1['default'].grey('rapper: 开始校验参数'))
flag = [
{ id: 'projectId', value: projectId },
{ id: 'token', value: token },
].every(function (it) {
if (!it.value) {
spinner.warn(
chalk_1['default'].yellow(
'\u5C1A\u672A\u914D\u7F6E' +
it.id +
',\u8BF7\u5728\u914D\u7F6E\u6587\u4EF6\u4E2D\u914D\u7F6E\u6216\u8005\u4F7F\u7528\u547D\u4EE4\u884C\u8BBE\u7F6E\u53C2\u6570',
),
)
return false
}
return true
})
if (!flag) {
process.exit(1)
}
if (!interfaceId) {
spinner.warn(
chalk_1['default'].gray('rapper: interfaceId 没有配置,将会获取项目下所有接口 '),
)
}
spinner.succeed(chalk_1['default'].grey('rapper: 参数校验成功'))
// spinner.succeed(chalk.grey('rapper: 参数校验成功'));
json_schema_to_typescript_1.DEFAULT_OPTIONS.style = __assign(
__assign({}, json_schema_to_typescript_1.DEFAULT_OPTIONS.style),
{ singleQuote: true, semi: true, 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(/\/$/, '')
outputFiles = []
interfaces = []
spinner.start(chalk_1['default'].grey('rapper: 正在从 Rap 平台获取接口信息...'))
_f.label = 1
case 1:
_f.trys.push([1, 3, , 4])
return [4 /*yield*/, (0, tools_1.getInterfaces)(apiUrl)]
case 2:
// interfaces = await getInterfaces(apiUrl);
interfaces = _f.sent()
spinner.succeed(chalk_1['default'].grey('rapper: 获取接口信息成功'))
return [3 /*break*/, 4]
case 3:
e_2 = _f.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_2,
),
)
}),
]
case 4:
if (typeof interfaceId !== 'undefined' && interfaceId !== '') {
interfaces = interfaces.filter(function (it) {
return String(it.id) === String(interfaceId)
})
}
if (interfaces.length === 0) {
console.log(
chalk_1['default'].grey(
'rapper: \u6CA1\u6709\u627E\u5230interfaceId\u662F' +
interfaceId +
'\u7684\u63A5\u53E3',
),
)
process.exit(0)
}
/** Rap 接口引用扫描,如果 projectId 更改了就不再扫描,避免过多的报错信息展现在Terminal */
spinner.start(chalk_1['default'].grey('rapper: 正在生成模板代码...'))
_f.label = 5
case 5:
_f.trys.push([5, 7, , 8])
return [
4 /*yield*/,
(0, base_creator_1.createInterfaceModel)(interfaces, { rapUrl: rapUrl }, Number(split)),
]
case 6:
interfaceModels = _f.sent()
interfaceModels.forEach(function (it) {
outputFiles.push({
path: path.resolve(rapperPath, it.fileName + '.ts'),
content: (0, formatter_1.format)(
'\n ' +
(0, tools_1.creatHeadHelpStr)(rapperVersion) +
'\n ' +
it.body +
'\n ',
json_schema_to_typescript_1.DEFAULT_OPTIONS,
),
})
})
/** 生成的模板文件第一行增加MD5 */
outputFiles = outputFiles.map(function (item) {
return __assign(__assign({}, item), {
content: '/* md5: ' + (0, utils_1.getMd5)(item.content) + ' */\n' + item.content,
})
})
return [3 /*break*/, 8]
case 7:
err_1 = _f.sent()
spinner.fail(chalk_1['default'].red('rapper: \u5931\u8D25\uFF01' + err_1.message))
return [2 /*return*/]
case 8:
/** 扫描找出生成的模板文件是否被手动修改过 */
spinner.start(chalk_1['default'].grey('rapper: 检查文件是否被修改'))
existFileList = (0, scanFile_1.getFiles)(rapperPath)
// const changeFiles = findChangeFiles(existFileList);
spinner.succeed(chalk_1['default'].grey('rapper: 检查文件成功'))
return [4 /*yield*/, getWriteFile(existFileList, outputFiles)]
case 9:
tempoutfiles = _f.sent()
return [
2 /*return*/,
Promise.all(
tempoutfiles.map(function (_a) {
var path = _a.path,
content = _a.content
return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_b) {
;(0, utils_1.writeFile)(path, content).then(function () {
spinner.succeed(chalk_1['default'].green('\u5199\u5165\u6210\u529F: ' + path))
})
return [2 /*return*/]
})
})
}),
)
.then(function () {
spinner.succeed(
chalk_1['default'].green(
'\u5171\u540C\u6B65\u4E86 ' + tempoutfiles.length + ' \u4E2A\u63A5\u53E3',
),
)
})
['catch'](function (err) {
spinner.fail(chalk_1['default'].red('rapper: \u5931\u8D25\uFF01' + err.message))
}),
]
}
})
})
}
exports['default'] = default_1