@szzbmy/lowcode-cli
Version:
🐇 lowcode-cli is an efficient cli tool for Rabbitpre plugin component secondary development. ❤️
248 lines (247 loc) • 10.8 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 });
/*
* - 创建 launch.json 文件
* - 选择启动配置
* - 启动 launch.json
* - 启动调试服务
* @Author: Xu Jin
* @Date: 2022-06-20 10:05:19
* @Last Modified by: Xu Jin
* @Last Modified time: 2022-07-01 15:54:02
*/
const react_1 = __importStar(require("react"));
const ink_1 = require("ink");
const lowcode_schema_1 = require("@szzbmy/lowcode-schema");
const json_1 = require("../../utils/json");
const shell_1 = require("../../utils/shell");
const helper_1 = require("./helper");
const type_1 = require("./type");
const components_1 = require("../../components");
const logger_1 = __importDefault(require("../../utils/logger"));
const schema_1 = require("../../apis/schema");
const SELECT_LIST_LIMIT = 20;
function DebugV2(props) {
const [debugStep, setDebugStepOriginal] = (0, react_1.useState)({
type: type_1.DEBUG_STEP.INIT,
options: {},
});
// 启动配置列表
const [configList, setConfigList] = (0, react_1.useState)([]);
// 选择的启动配置
const [selectConfig, setSelectConfig] = (0, react_1.useState)();
const setDebugStep = (0, react_1.useCallback)((type, options) => {
setDebugStepOriginal({
type,
options,
});
}, []);
// 结束进程
const finished = (0, react_1.useCallback)(() => {
const code = debugStep.options?.code;
const _code = typeof code === 'undefined' ? 0 : 1;
process.exit(_code);
}, [debugStep.options?.code]);
// 创建 launch.json 文件
const createLaunchConfig = (0, react_1.useCallback)(async () => {
await (0, helper_1.createLaunchJson)();
const configList = (0, helper_1.getLaunchConfigList)();
const selectConfig = (0, helper_1.getLaunchConfigByDebugId)(configList[0].value);
// 设置选择的启动配置
setSelectConfig(selectConfig);
// 启动配置
setDebugStep(type_1.DEBUG_STEP.START_LAUNCH);
}, [setDebugStep]);
// 确认创建 launch.json
const confirmCreateLaunch = (0, react_1.useCallback)(async (isCreate) => {
if (!isCreate.value) {
setDebugStep(type_1.DEBUG_STEP.FINISHED);
}
else {
await createLaunchConfig();
}
}, [createLaunchConfig, setDebugStep]);
// 选择配置文件回调
const onSelectConfig = (0, react_1.useCallback)((launchInfo) => {
const { value } = launchInfo;
const selectConfig = (0, helper_1.getLaunchConfigByDebugId)(value);
if (selectConfig) {
setSelectConfig(selectConfig);
setDebugStep(type_1.DEBUG_STEP.START_LAUNCH);
}
}, [setDebugStep]);
/** 校验启动配置 */
const validateLaunchSchema = (0, react_1.useCallback)(async () => {
try {
const schemaRes = await (0, schema_1.fetchSchemaData)({
type: 'debugLaunch',
version: '1.0.0',
});
const launchJson = (0, helper_1.getLaunchJson)();
const { success, errorMsg } = await (0, lowcode_schema_1.validate)({
schema: (0, json_1.parse)(schemaRes.schemaData || '{}'),
data: launchJson,
});
if (!success) {
logger_1.default.error(`schema校验启动配置文件失败:${errorMsg}`);
setDebugStep(type_1.DEBUG_STEP.FINISHED);
}
else {
// 选择启动配置
setDebugStep(type_1.DEBUG_STEP.SELECT_CONFIG);
}
}
catch (error) {
logger_1.default.error(`schema校验启动配置文件失败:${error?.message}`);
setDebugStep(type_1.DEBUG_STEP.FINISHED);
}
}, [setDebugStep]);
/**
* 根据命令行参数或用户输入参数执行初始化逻辑
*/
const init = (0, react_1.useCallback)(async () => {
if (props.pure) {
logger_1.default.warn('组件库纯净调试已不支持');
setDebugStep(type_1.DEBUG_STEP.FINISHED);
}
// 调试配置列表
const configList = (0, helper_1.getLaunchConfigList)();
setConfigList(configList);
// 启动配置文件是否存在
const isLaunchJsonExist = (0, helper_1.isFileExisted)('./.lowcode/launch.json');
// 如果启动文件不存在,提示是否自动创建启动文件
if (!isLaunchJsonExist) {
// 创建启动文件
setDebugStep(type_1.DEBUG_STEP.CREATE_LAUNCH);
}
else {
// schema 校验
await validateLaunchSchema();
}
}, [props.pure, setDebugStep, validateLaunchSchema]);
/** 启动组件库静态资源服务 */
const startCmpLibServer = (0, react_1.useCallback)(async () => {
try {
/** 编译需要的环境变量 */
const lowcodeCompileEnv = {
openDebugUrl: `${selectConfig?.debugServerDomain}/openDebugUrl`,
};
// 传入环境变量并开始构建
const code = await (0, shell_1.execCommandPromise)({
cmd: 'npm start',
silent: false,
env: {
LOWCODE_COMPILE_ENV: JSON.stringify(lowcodeCompileEnv),
},
});
if (code !== 0) {
logger_1.default.error('组件库静态资源编译失败');
}
}
catch (_) {
logger_1.default.error('编译代码失败: ', _);
}
}, [selectConfig?.debugServerDomain]);
const startLaunch = (0, react_1.useCallback)(() => {
// 根据启动配置获取调试配置信息
const debugConfigs = (0, helper_1.getDebugConfigsByLaunchConfig)(selectConfig);
if (!debugConfigs.length) {
logger_1.default.error('启动配置文件中调试路径错误,请修改之后重新启动调试');
setDebugStep(type_1.DEBUG_STEP.FINISHED);
}
else {
setDebugStep(type_1.DEBUG_STEP.START_DEBUG_SERVER);
}
}, [selectConfig, setDebugStep]);
const startDebugServer = (0, react_1.useCallback)(async () => {
if (selectConfig) {
const { debugServerDomain, debugServerPort } = selectConfig;
// 如果调试服务启动端口存在
if (debugServerPort) {
// 检查端口是否可用
const isPortAvailable = await (0, helper_1.checkPortAvailable)(debugServerPort);
// 如果不可用,终止调试
if (!isPortAvailable) {
setDebugStep(type_1.DEBUG_STEP.FINISHED);
}
}
// 创建低码调试服务
const server = await (0, helper_1.createLowcodeDebugServer)(selectConfig);
if (!server) {
// 如果服务不可用,终止调试
setDebugStep(type_1.DEBUG_STEP.FINISHED);
}
// 多组件库调试时,需保证多个组件库 devServer 启动
if (selectConfig.workspaces.length > 1) {
// 检验多个组件库
const isServersStarted = await (0, helper_1.checkServersStarted)(selectConfig);
if (isServersStarted) {
const debugUrl = `${debugServerDomain}/openDebugUrl`;
(0, helper_1.openDebugUrl)(debugUrl);
}
else {
// 如果多组件库调试非所有devServer均启动,或者配置的端口号重复,进行提示
logger_1.default.error('多个组件库静态服务未全部启动或者配置的端口号重复');
setDebugStep(type_1.DEBUG_STEP.FINISHED);
}
}
else {
// 单组件调试时,启动组件库静态资源服务,编译组件库成功后,通过环境变量打开组件库
startCmpLibServer();
}
}
}, [selectConfig, setDebugStep, startCmpLibServer]);
(0, react_1.useEffect)(() => {
const func = {
[type_1.DEBUG_STEP.INIT]: init,
[type_1.DEBUG_STEP.FINISHED]: finished,
[type_1.DEBUG_STEP.START_LAUNCH]: startLaunch,
[type_1.DEBUG_STEP.START_DEBUG_SERVER]: startDebugServer,
}[debugStep.type];
func && func();
}, [debugStep.type, finished, init, startDebugServer, startLaunch]);
let renderer = null;
switch (debugStep.type) {
case type_1.DEBUG_STEP.CREATE_LAUNCH:
// 询问是否创建 launch.json
renderer = (react_1.default.createElement(react_1.default.Fragment, null,
react_1.default.createElement(ink_1.Text, { color: "yellow" }, "\u542F\u52A8\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728,\u662F\u5426\u521B\u5EFA \uFF1F"),
react_1.default.createElement(components_1.SelectInput, { items: type_1.selectItems, onSelect: confirmCreateLaunch })));
break;
case type_1.DEBUG_STEP.SELECT_CONFIG:
renderer = (react_1.default.createElement(react_1.default.Fragment, null,
react_1.default.createElement(ink_1.Text, { color: "green" },
"\u8BF7\u9009\u62E9\u542F\u52A8\u914D\u7F6E(\u5171",
configList.length,
"\u4E2A):"),
react_1.default.createElement(ink_1.Box, { borderStyle: "single" },
react_1.default.createElement(components_1.SelectInput, { items: configList, limit: SELECT_LIST_LIMIT, onSelect: onSelectConfig }))));
break;
default:
renderer = null;
}
return renderer;
}
exports.default = DebugV2;