UNPKG

@szzbmy/lowcode-cli

Version:

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

248 lines (247 loc) 10.8 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 }); /* * - 创建 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;