@tuzki/cli
Version:
🐇 lowcode-cli is an efficient cli tool for Rabbitpre plugin component secondary development. ❤️
195 lines (194 loc) • 5.86 kB
JavaScript
/*
* cli 配置相关
*
* @Author: xu.jin
* @Date: 2023-08-15 19:21:16
*
* Copyright © 2014-2023 Rabbitpre.com. All Rights Reserved.
*/
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());
});
};
import fs from 'fs';
import os from 'os';
import path from 'path';
import dotenv from 'dotenv';
import Logger from '@tuzki/scaffold-logger';
import { parse } from './comment-json.js';
const logger = Logger.get('cli:utils:config');
const defaultConfig = {
apiHost: 'https://dev.rabbitpre.com.cn',
cliCheckUpdateTag: 'latest',
logLevel: 'info',
editorHost: 'https://dev.rabbitpre.com.cn/content/editor',
rendererHost: 'https://dev.rabbitpre.com.cn/content/renderer/preview',
lowcodeEditorHost: 'https://dev.rabbitpre.com.cn/lowcode/lowcodeEditor',
};
/**
* 获取配置,主要包含本地配置和 .env 配置
* 优先级:.env > local > default
*
* @export
* @return {*} {Promise<CliConfig>}
*/
export function getConfig() {
const envConfig = getDotenvConfig();
const localConfig = getLocalConfig();
return Object.assign(Object.assign(Object.assign({}, defaultConfig), localConfig), envConfig);
}
/**
* 获取 .env 环境配置
*
* @export
* @param {ENV} env
* @return {*}
*/
export function getDotenvConfig() {
const cwd = process.cwd();
// 获取 .env p配置
const { parsed: envConfig } = dotenv.config({
path: path.resolve(cwd, '.env'),
});
return envConfig;
}
/**
* 获取本地配置
* @returns
*/
export function getLocalConfig() {
try {
const localConfigPath = path.resolve(os.homedir(), './.tuzki.jsonc');
if (!fs.existsSync(localConfigPath)) {
return {};
}
const configJsonc = fs.readFileSync(localConfigPath, 'utf8');
const config = parse(configJsonc);
return config || {};
}
catch (err) {
logger.error('获取本地配置失败:', err);
}
}
/**
* 查看某一配置
* @param name 配置名称
* @returns
*/
export function getConfigByName(name) {
try {
return configCache[name];
}
catch (err) {
logger.error(`获取本地配置${name}失败:`, err);
}
}
/**
* 设置配置到本地文件
* @param localConfig 需要写到本地的配置
* @returns
*/
export function setLocalConfig(localConfig) {
return __awaiter(this, void 0, void 0, function* () {
return new Promise((resolve, reject) => {
const homedir = os.homedir();
const writeStream = fs.createWriteStream(`${homedir}/.tuzki.jsonc`, {
encoding: 'utf8',
});
writeStream.on('error', err => {
reject(err);
});
writeStream.write(JSON.stringify(localConfig));
writeStream.end();
writeStream.on('finish', () => {
resolve(true);
});
}).catch(err => {
logger.error('写入本地配置失败:', err);
});
});
}
/**
* 根据name value设置本地配置
*
* @export
* @param {string} name 配置名称
* @param {string} value 配置值
*/
export function setLocalConfigByName(name, value) {
return __awaiter(this, void 0, void 0, function* () {
const curConfig = getLocalConfig();
yield setLocalConfig(Object.assign(Object.assign({}, curConfig), { [name]: value === 'false' ? false : value }));
});
}
/**
* 删除本地配置
*
* @export
* @param {(string | string[])} name 删除配置名称, 不传则删除所有
*/
export function unsetLocalConfig(name) {
return __awaiter(this, void 0, void 0, function* () {
try {
const config = getLocalConfig();
if (!name) {
yield setLocalConfig({});
}
else {
if (typeof name === 'string') {
delete config[name];
}
else {
name.forEach(e => {
delete config[e];
});
}
yield setLocalConfig(Object.assign({}, config));
}
}
catch (err) {
logger.error('删除本地配置出错', err);
}
});
}
// 前端判断是否已登录
export const isLogin = () => __awaiter(void 0, void 0, void 0, function* () {
const config = yield getConfig();
return !!config.token;
});
// 在注入环境配置之前没有数据, 不然会在日志级别生效前就输出日志
let configCache = {};
/**
* 根据传入的环境字符串, 更新当前配置
* @param inputEnv
*/
export const injectConfigEnv = () => __awaiter(void 0, void 0, void 0, function* () {
configCache = yield getConfig();
});
/**
* 更新配置
* @param configOpt
*/
export const updateConfig = (configOpt) => {
configCache = Object.assign(configCache, configOpt);
};
/**
* 获取所有配置,包含 cli option 对配置的修改,优先级最高
* @returns
*/
export const getCliConfig = () => {
return configCache;
};
/**
* 暴露出代理配置对象, 目前不支持直接打印
*/
export default new Proxy({}, {
get(_, key, receiver) {
return Reflect.get(configCache, key, receiver);
},
});