UNPKG

@szzbmy/lowcode-cli

Version:

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

278 lines (277 loc) 9.2 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getCliPackageJson = exports.updateConfig = exports.injectConfigEnv = exports.setCliConfigToFile = exports.getCliConfigFromFile = void 0; const fs_1 = __importDefault(require("fs")); const ip_1 = __importDefault(require("ip")); const os_1 = __importDefault(require("os")); const path_1 = __importDefault(require("path")); const environment_1 = require("../constants/environment"); const json_1 = require("../utils/json"); const logger_1 = __importDefault(require("../utils/logger")); const shell_1 = require("../utils/shell"); const fs_2 = require("./fs"); /** * 获取用户与系统信息 * @returns InfoForToken */ const getSystemInfo = () => { try { const username = (0, shell_1.execCommand)({ cmd: 'git config --get user.name', }); const email = (0, shell_1.execCommand)({ cmd: 'git config --get user.email', }); const localIp = ip_1.default.address(); const deviceName = os_1.default.hostname(); return { devUser: username.trim(), deviceName, email: email.trim(), ip: localIp, }; } catch (err) { logger_1.default.error(err.message || '获取 git 或系统配置失败!'); return { devUser: '', deviceName: '', email: '', ip: '', }; } }; /** * 判断是否已登录 * @returns boolean */ function isLogined() { try { const homePath = path_1.default.resolve(os_1.default.homedir(), './.rp-lowcode.jsonc'); const lowcodeJsonc = fs_1.default.readFileSync(homePath, 'utf8'); const cliLocalConfig = (0, json_1.parse)(lowcodeJsonc); if (cliLocalConfig && cliLocalConfig.token) return true; return false; } catch (err) { /** 未登录 */ return false; } } /** * API 请求接口 */ const API_HOST_MAPPING = { [environment_1.ENV.DEV]: 'https://bws.dev.rabbitpre.com', [environment_1.ENV.TEST]: 'https://bws.test.rabbitpre.com', [environment_1.ENV.PROD]: 'https://bws.rabbitpre.com', }; /** * 开发者中心登录接口 */ const DEVELOPER_CENTER_HOST_MAPPING = { [environment_1.ENV.DEV]: 'https://home.dev.rabbitpre.com', [environment_1.ENV.TEST]: 'https://home.test.rabbitpre.com', [environment_1.ENV.PROD]: 'https://home.rabbitpre.com', }; /** * 编辑器调试接口 */ const EDITOR_HOST_MAPPING = { [environment_1.ENV.DEV]: 'https://editor.dev.rabbitpre.com', [environment_1.ENV.TEST]: 'https://editor.test.rabbitpre.com', [environment_1.ENV.PROD]: 'https://editor.rabbitpre.com', }; /** * 渲染引擎调试接口 */ const RENDERER_HOST_MAPPING = { [environment_1.ENV.DEV]: 'https://renderer.dev.rabbitpre.com', [environment_1.ENV.TEST]: 'https://renderer.test.rabbitpre.com', [environment_1.ENV.PROD]: 'https://renderer.rabbitpre.com', }; async function getConfig(inputEnv) { /** 项目本地路径 */ const cwd = process.cwd(); const { env: cmpEnv, schemaType, schemaVersion, port, appid, shortUrl, isValid = false, validateErrorMessage, debugComponentList = [], bindPluginName = '', } = await (0, fs_2.getDebugConfig)(); const packageConfig = await (0, fs_2.getPackageConfig)(); const { name: packageName } = packageConfig; const { paths = {} } = (0, fs_2.getComponentConfig)(); const { distPath: relativeDistPath, compressPath: relativeCompressPath } = paths; const { devUser, deviceName, email, ip } = getSystemInfo(); const cliPkgJson = (0, exports.getCliPackageJson)(); // 当前用户输入的环境配置优先级较高 // 当前开发组件环境配置优先级较低 let env; if (inputEnv) { env = getValidEnv(inputEnv); logger_1.default.debug(`使用命令行输入的环境配置, 命令行输入: ${inputEnv}, 实际使用: ${env}`); } else if (cmpEnv) { env = getValidEnv(cmpEnv); logger_1.default.debug(`使用命令行输入的环境配置, 组件配置: ${cmpEnv}, 实际使用: ${env}`); } else { env = getValidEnv(); logger_1.default.debug(`使用默认环境配置: ${env}`); } const apiHost = API_HOST_MAPPING[env]; const developerCenterHost = DEVELOPER_CENTER_HOST_MAPPING[env]; const editorHost = EDITOR_HOST_MAPPING[env]; const rendererHost = RENDERER_HOST_MAPPING[env]; const distPath = path_1.default.resolve(cwd, relativeDistPath || 'dist'); const zipPath = path_1.default.resolve(cwd, relativeCompressPath || 'dist/deploy.zip'); return { // 环境相关配置 apiHost, developerCenterHost, editorHost, rendererHost, env, // 文件路径相关配置 paths: { distPath, zipPath, }, // 调试相关配置 debugConfig: { schemaType, schemaVersion, appid, shortUrl, isValid, validateErrorMessage, debugComponentList, debugPluginCDN: `http://127.0.0.1:${port}`, packageName, bindPluginName, }, // 系统/用户信息相关配置 systemInfo: { ip, deviceName, }, userInfo: new Proxy({ devUser, email, logined: isLogined(), token: '', userName: '', organizeName: '', }, { get(target, key, receiver) { if (key === 'token') { return getCliConfigFromFile().token; } return Reflect.get(target, key, receiver); }, }), gitlab: { accessToken: '_sMm2zd7r2SfnVBCpzus', accessTokenName: 'lowcode', psdTemplatesRegistryUrl: 'gitlab.szzbmy.com/fe-template/psd-templates.git', }, cliPkgJson, }; } /** 从配置文件中读取 token */ function getCliConfigFromFile() { try { const homePath = path_1.default.resolve(os_1.default.homedir(), './.rp-lowcode.jsonc'); const lowcodeJsonc = fs_1.default.readFileSync(homePath, 'utf8'); const cliLocalConfig = (0, json_1.parse)(lowcodeJsonc); if (cliLocalConfig) return cliLocalConfig; return { token: '', }; } catch (err) { /** 未登录 */ return { token: '', }; } } exports.getCliConfigFromFile = getCliConfigFromFile; /** * 设置 Cli token,并将 token 存入本地文件,设置 config 的 token 一定要使用此方法, * 不可直接 config.userInfo.token = xxx * @param cliLocalConfig * @returns */ function setCliConfigToFile(cliLocalConfig) { return new Promise((resolve, reject) => { const cliConfig = getCliConfigFromFile(); const homedir = os_1.default.homedir(); const writeStream = fs_1.default.createWriteStream(`${homedir}/.rp-lowcode.jsonc`, { encoding: 'utf8', }); writeStream.on('error', err => { reject(err); }); writeStream.write(JSON.stringify({ ...cliConfig, ...cliLocalConfig })); writeStream.end(); writeStream.on('finish', () => { resolve(true); }); }); } exports.setCliConfigToFile = setCliConfigToFile; /** * 根据传入的字符串, 获取有效的 ENV * 默认 prod 环境 * @param env * @returns */ function getValidEnv(inputEnv) { return Object.values(environment_1.ENV).includes(inputEnv || '') ? inputEnv : environment_1.ENV.PROD; } // 配置缓存,可动态更新 // 在注入环境配置之前没有数据, 不然会在日志级别生效前就输出日志 let configCache = {}; /** * 根据传入的环境字符串, 更新当前配置 * @param inputEnv */ const injectConfigEnv = async (inputEnv) => { configCache = await getConfig(inputEnv); // schema校验需要调接口,故在拿到config后才进行 await (0, fs_2.validateSchema)(); }; exports.injectConfigEnv = injectConfigEnv; /** * 更新配置 * @param configOpt */ const updateConfig = (configOpt) => { configCache = Object.assign(configCache, configOpt); }; exports.updateConfig = updateConfig; /** 读取cli package.json */ const getCliPackageJson = () => { try { // 获取当前 cli 版本 const pkgJson = (0, json_1.parse)(fs_1.default.readFileSync(path_1.default.resolve(__dirname, '../../package.json'), 'utf8')); return pkgJson || {}; } catch (error) { logger_1.default.error(`获取package.json失败: ${error.message}`); return {}; } }; exports.getCliPackageJson = getCliPackageJson; /** * 暴露出代理配置对象, 目前不支持直接打印 */ exports.default = new Proxy({}, { get(_, key, receiver) { return Reflect.get(configCache, key, receiver); }, });