@szzbmy/lowcode-cli
Version:
🐇 lowcode-cli is an efficient cli tool for Rabbitpre plugin component secondary development. ❤️
278 lines (277 loc) • 9.2 kB
JavaScript
"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);
},
});