UNPKG

@szzbmy/lowcode-cli

Version:

🐇 lowcode-cli is an efficient cli tool for Rabbitpre plugin component secondary development. ❤️

260 lines (259 loc) 11.1 kB
"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;