#!/usr/bin/env node const { execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); const readline = require('readline'); function loadEnv(filePath) { if (!fs.existsSync(filePath)) return {}; const content = fs.readFileSync(filePath, 'utf8'); const env = {}; content.split('\n').forEach((line) => { const match = line.match(/^([^=:#]+?)=(.*)$/); if (match) { env[match[1].trim()] = match[2].trim().replace(/^['"](.*)['"]$/, '$1'); } }); return env; } function getComponentLibs(env) { const libs = []; libs.push({ name: 'cpms_web_component (默认)', path: path.resolve(__dirname, '../cpms_web_component'), useKey: null, usePath: null, }); for (const key in env) { if (key.startsWith('COMPONENT_LIB_') && key !== 'COMPONENT_LIB_PATH') { libs.push({ name: key.replace('COMPONENT_LIB_', ''), path: path.resolve(__dirname, env[key]), useKey: key.replace('COMPONENT_LIB_', ''), usePath: null, }); } } if (env.COMPONENT_LIB_PATH) { libs.push({ name: '自定义路径', path: path.resolve(__dirname, env.COMPONENT_LIB_PATH), useKey: null, usePath: env.COMPONENT_LIB_PATH, }); } return libs; } async function selectLib(libs) { if (libs.length === 1) return libs[0]; console.log('📦 请选择要使用的组件库:'); libs.forEach((lib, i) => { const exists = fs.existsSync(lib.path) ? '✅' : '❌'; console.log(` ${i + 1}. ${lib.name} ${exists}`); console.log(` ${lib.path}`); }); console.log(' 0. 使用 npm 版本'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); return new Promise((resolve) => { rl.question(`\n请输入选项 (0-${libs.length},回车默认): `, (answer) => { rl.close(); if (answer === '0') resolve(null); else if (answer && /^\d+$/.test(answer)) { const idx = parseInt(answer) - 1; resolve(idx >= 0 && idx < libs.length ? libs[idx] : libs[0]); } else { resolve(libs[0]); } }); }); } async function main() { const localEnv = loadEnv(path.resolve(__dirname, '.env.local')); const libs = getComponentLibs(localEnv); console.log('🚀 启动本地调试模式...\n'); const selected = await selectLib(libs); const mergedEnv = { ...process.env, ...localEnv, LOCAL_DEBUG: 'true' }; if (!selected) { console.log('\n📦 使用 npm 版本'); delete mergedEnv.COMPONENT_LIB; delete mergedEnv.COMPONENT_LIB_PATH; } else { const exists = fs.existsSync(selected.path); if (!exists) { console.warn(`\n⚠️ 组件库不存在: ${selected.name}`); console.warn(` ${selected.path}`); console.warn(' 将使用 npm 版本'); delete mergedEnv.COMPONENT_LIB; delete mergedEnv.COMPONENT_LIB_PATH; } else { console.log(`\n📦 ${selected.name}`); console.log(`📍 ${selected.path}`); if (selected.useKey) { mergedEnv.COMPONENT_LIB = selected.useKey; delete mergedEnv.COMPONENT_LIB_PATH; } else if (selected.usePath) { mergedEnv.COMPONENT_LIB_PATH = selected.usePath; delete mergedEnv.COMPONENT_LIB; } else { delete mergedEnv.COMPONENT_LIB; delete mergedEnv.COMPONENT_LIB_PATH; } } } console.log('\n⏳ 启动 Vite...\n'); try { execSync('npx vite --port 3000 --open --strictPort false', { stdio: 'inherit', cwd: process.cwd(), env: mergedEnv, }); } catch (error) { console.error('❌ 启动失败:', error.message); process.exit(1); } } main();