@szzbmy/lowcode-cli
Version:
🐇 lowcode-cli is an efficient cli tool for Rabbitpre plugin component secondary development. ❤️
260 lines (259 loc) • 11.1 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const ink_1 = require("ink");
const open_1 = __importDefault(require("open"));
const react_1 = __importStar(require("react"));
const url_1 = __importDefault(require("url"));
const components_1 = require("../../components");
const index_1 = require("../../components/index");
const config_1 = __importStar(require("../../config"));
const logger_1 = __importDefault(require("../../utils/logger"));
const server_helper_1 = require("../../utils/server-helper");
var LOGIN_STEP;
(function (LOGIN_STEP) {
/** 初始化 */
LOGIN_STEP[LOGIN_STEP["INIT"] = 0] = "INIT";
/** 校验git config username */
LOGIN_STEP[LOGIN_STEP["CHECK_USERNAME"] = 1] = "CHECK_USERNAME";
/** 校验git config email */
LOGIN_STEP[LOGIN_STEP["CHECK_EMAIL"] = 2] = "CHECK_EMAIL";
/** 校验是否重新登录 */
LOGIN_STEP[LOGIN_STEP["CHECK_RELOGIN"] = 3] = "CHECK_RELOGIN";
/** 登录 */
LOGIN_STEP[LOGIN_STEP["LOGIN"] = 4] = "LOGIN";
/** 消息 */
LOGIN_STEP[LOGIN_STEP["MESSAGE"] = 5] = "MESSAGE";
})(LOGIN_STEP || (LOGIN_STEP = {}));
var MESSAGE_COLOR;
(function (MESSAGE_COLOR) {
MESSAGE_COLOR["info"] = "white";
MESSAGE_COLOR["success"] = "green";
MESSAGE_COLOR["error"] = "#cb3837";
})(MESSAGE_COLOR || (MESSAGE_COLOR = {}));
const selectLoginItems = [
{
label: 'Yes',
value: true,
},
{
label: 'No',
value: false,
},
];
/**
* 拼接获取 token 的链接
* @returns
*/
const generateTokenUrl = (port) => {
const { developerCenterHost, systemInfo: { ip, deviceName }, userInfo: { devUser, email }, } = config_1.default;
const api = `${developerCenterHost}/api/workbench/lowcode/token/getCLIToken`;
const callbackUrl = `http://127.0.0.1:${port}/getToken`;
const loginData = {
devUser,
deviceName,
email,
ip,
callbackUrl,
};
const loginDataEncode = Buffer.from(encodeURIComponent(JSON.stringify(loginData))).toString('base64');
return `${api}?loginData=${loginDataEncode}`;
};
function Login() {
const [username, setUsername] = (0, react_1.useState)('');
const [email, setEmail] = (0, react_1.useState)('');
const [stepState, setStepStateOriginal] = (0, react_1.useState)({
step: LOGIN_STEP.INIT,
});
const setStepState = (0, react_1.useCallback)((step, options) => {
setStepStateOriginal({ step, options });
}, []);
const init = (0, react_1.useCallback)(async () => {
const { userInfo: { logined }, } = config_1.default;
// 登录成功过,判断是否需要重新登录
// 需要重新登录,跳转重新登录步骤
if (logined) {
setStepState(LOGIN_STEP.CHECK_RELOGIN);
// 不需要重新登录,跳转登录步骤
}
else {
setStepState(LOGIN_STEP.LOGIN);
}
}, [setStepState]);
/** 去登录 */
const toLogin = (0, react_1.useCallback)(async () => {
try {
const randomPort = await (0, server_helper_1.getRandomPort)();
const tokenUrl = generateTokenUrl(randomPort);
await (0, open_1.default)(tokenUrl);
setStepState(LOGIN_STEP.MESSAGE, {
loading: true,
msg: '开始生成 token',
});
(0, server_helper_1.createLowCodeServer)({
randomPort,
routers: [
{
path: '/getToken',
func: async function getLoginToken(req, res) {
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf8' });
const urlInfo = url_1.default.parse(req.url || '', true);
const params = urlInfo.query;
setStepState(LOGIN_STEP.MESSAGE, {
msg: `token 生成${params.token ? '成功' : '失败'}`,
});
logger_1.default.info(`登录${params.token ? '成功' : '失败'}`);
if (params.token) {
/** 请求接口完成后,立马关闭网页 */
res.write('<span>登录成功,3s 后关闭页面...</span>');
res.write('<script>setTimeout(() => { window.close(); }, 3000)</script>');
res.end();
const isSuccess = await (0, config_1.setCliConfigToFile)({
token: params.token,
});
if (isSuccess) {
logger_1.default.info('配置文件生成成功');
process.exit(0);
}
}
else {
/** 请求接口完成后,立马关闭网页 */
res.write('<span>登录失败,3s 后关闭页面...</span>');
res.write('<script>setTimeout(() => { window.close(); }, 3000)</script>');
res.end();
}
},
},
],
});
}
catch (err) {
logger_1.default.error(err.message || '登录失败');
process.exit(1);
}
}, [setStepState]);
/** 登录 */
const login = (0, react_1.useCallback)(() => {
const { userInfo: { devUser, email }, } = config_1.default;
// 没有配置username,跳转设置username步骤
if (!devUser) {
setStepState(LOGIN_STEP.CHECK_USERNAME);
// 没有配置email,跳转设置username步骤
}
else if (!email) {
setStepState(LOGIN_STEP.CHECK_EMAIL);
}
else {
toLogin();
}
}, [setStepState, toLogin]);
/** 用户名输入确定 */
const onHandleUsername = (0, react_1.useCallback)(async (value) => {
// 更新 config
(0, config_1.updateConfig)({
userInfo: {
...config_1.default.userInfo,
devUser: value,
},
});
const { userInfo } = config_1.default;
// 输入了 username,才允许走下一步
if (userInfo.devUser) {
// 没有设置邮箱,跳转设置邮箱步骤
if (!userInfo.email) {
setStepState(LOGIN_STEP.CHECK_EMAIL);
// 如果需要重新登录,跳转重新登录步骤
}
else {
// 不需要重新登录,跳转登录步骤
setStepState(LOGIN_STEP.LOGIN);
}
}
}, [setStepState]);
/** email输入确定 */
const onHandleEmail = (0, react_1.useCallback)(async (value) => {
// 更新 config
(0, config_1.updateConfig)({
userInfo: {
...config_1.default.userInfo,
email: value,
},
});
const { userInfo } = config_1.default;
// 输入了 email, 才允许走下一步
if (userInfo.email) {
// 不需要重新登录,跳转登录步骤
setStepState(LOGIN_STEP.LOGIN);
}
}, [setStepState]);
/** 重新登录确定 */
const onHandleRelogin = (0, react_1.useCallback)((item) => {
if (!item?.value) {
process.exit(1);
}
else {
setStepState(LOGIN_STEP.LOGIN);
}
}, [setStepState]);
(0, react_1.useEffect)(() => {
const func = {
[LOGIN_STEP.INIT]: init,
[LOGIN_STEP.LOGIN]: login,
}[stepState.step];
func && func();
}, [stepState.step, init, login]);
let renderer = null;
// @ts-ignore
const color = MESSAGE_COLOR[stepState.options?.type];
switch (stepState.step) {
case LOGIN_STEP.MESSAGE:
renderer = (react_1.default.createElement(react_1.default.Fragment, null,
stepState.options?.loading ? (react_1.default.createElement(ink_1.Text, { color: "green" },
react_1.default.createElement(components_1.Spinner, { type: "dots" }),
stepState.options?.msg && (react_1.default.createElement(ink_1.Text, { color: color }, stepState.options?.msg)))) : null,
react_1.default.createElement(ink_1.Text, { color: color }, stepState.options?.msg)));
break;
case LOGIN_STEP.CHECK_USERNAME:
renderer = (react_1.default.createElement(ink_1.Box, null,
react_1.default.createElement(ink_1.Box, { marginRight: 1 },
react_1.default.createElement(ink_1.Text, null, "\u8BF7\u8BBE\u7F6Egit usename\uFF1A")),
react_1.default.createElement(index_1.TextInput, { value: username, onChange: setUsername, onSubmit: onHandleUsername })));
break;
case LOGIN_STEP.CHECK_EMAIL:
renderer = (react_1.default.createElement(ink_1.Box, null,
react_1.default.createElement(ink_1.Box, { marginRight: 1 },
react_1.default.createElement(ink_1.Text, null, "\u8BF7\u8BBE\u7F6Egit email\uFF1A")),
react_1.default.createElement(index_1.TextInput, { value: email, onChange: setEmail, onSubmit: onHandleEmail })));
break;
case LOGIN_STEP.CHECK_RELOGIN:
renderer = (react_1.default.createElement(react_1.default.Fragment, null,
react_1.default.createElement(ink_1.Text, { color: "yellow" }, "\u60A8\u5DF2\u767B\u5F55\uFF0C\u662F\u5426\u91CD\u65B0\u767B\u5F55\uFF1F"),
react_1.default.createElement(components_1.SelectInput, { items: selectLoginItems, onSelect: onHandleRelogin })));
break;
default:
renderer = null;
}
return renderer;
}
exports.default = Login;