From 237bd06440d8ad78a112e4f4f99c60a5b546ac58 Mon Sep 17 00:00:00 2001 From: xuhongbin Date: Sun, 28 Sep 2025 16:03:45 +0800 Subject: [PATCH 1/7] =?UTF-8?q?feat(cli):=20=E6=B7=BB=E5=8A=A0=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6=E7=83=AD=E6=9B=B4=E6=96=B0=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=B9=B6=E4=BC=98=E5=8C=96=E5=BC=80=E5=8F=91=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增对emp.config.ts文件变更的监听,自动重启开发服务器 - 优化开发服务器启动逻辑,支持重启模式 - 添加chokidar依赖用于文件监听 - 调整日志级别根据环境变量动态设置 - 清理无用代码并优化类型定义 --- packages/cli/package.json | 22 ++++- packages/cli/src/helper/logger.ts | 5 +- packages/cli/src/script/base.ts | 21 ++--- packages/cli/src/script/dev.ts | 115 +++++++++++++++++++----- packages/cli/src/server/connect/dev.ts | 22 ++++- packages/cli/src/server/index.ts | 5 +- packages/cli/src/store/index.ts | 17 ++-- packages/cli/src/store/rspack/plugin.ts | 20 +++++ packages/cli/src/types/env.ts | 1 + pnpm-lock.yaml | 3 + projects/demo/emp.config.ts | 3 + 11 files changed, 187 insertions(+), 47 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 1f40da1d..40c12bfb 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -4,8 +4,19 @@ "description": "emp", "license": "MIT", "type": "module", - "files": ["dist", "bin", "resource", "template", "types", "tsconfig"], - "maintainers": ["xuhongbin", "ckken", "doerme"], + "files": [ + "dist", + "bin", + "resource", + "template", + "types", + "tsconfig" + ], + "maintainers": [ + "xuhongbin", + "ckken", + "doerme" + ], "repository": { "type": "git", "url": "git+https://github.com/empjs/emp.git", @@ -15,7 +26,11 @@ "access": "public", "registry": "https://registry.npmjs.org/" }, - "keywords": ["rspack", "rust", "typescript"], + "keywords": [ + "rspack", + "rust", + "typescript" + ], "bin": { "emp": "./bin/emp.js" }, @@ -83,6 +98,7 @@ "@types/webpack": "^5.28.4", "@types/webpack-bundle-analyzer": "^4.6.2", "@types/webpack-sources": "^3.2.2", + "chokidar": "^4.0.3", "vue": "^3.5.21" }, "dependencies": { diff --git a/packages/cli/src/helper/logger.ts b/packages/cli/src/helper/logger.ts index fec6c52a..70208cf1 100644 --- a/packages/cli/src/helper/logger.ts +++ b/packages/cli/src/helper/logger.ts @@ -2,11 +2,12 @@ import color from 'src/helper/color' export type LoggerType = 'debug' | 'info' | 'warn' | 'error' export {color} // +const isDev = process.env.ENV === 'dev' export class Logger { public brandName = '' public fullName = '' - public logLevel = 'debug' - public isLogTime = process.env.ENV === 'dev' + public logLevel = isDev ? 'debug' : 'info' + public isLogTime = isDev setup({brandName, logLevel, fullName}: any) { //` EMP v${store.empPkg.version} ` this.brandName = ` [${brandName}] ` diff --git a/packages/cli/src/script/base.ts b/packages/cli/src/script/base.ts index 0eacbb15..5f618d2c 100644 --- a/packages/cli/src/script/base.ts +++ b/packages/cli/src/script/base.ts @@ -1,23 +1,24 @@ import logger from 'src/helper/logger' import {clearConsole} from 'src/helper/utils' import store from 'src/store' +import {CliActionType, CliOptionsType} from 'src/types/env' // export class BaseScript { // 实现整体生命周期运转 - async setup(cliName: string, o: any) { - logger.time(`[${cliName}]Setup`) + async setup(cliAction?: CliActionType, cliOptions?: CliOptionsType) { + logger.time(`[${cliAction}]Setup`) //实例化 store - await store.setup(cliName as any, o) + await store.setup(cliAction, cliOptions) // 是否清除上一个日志 - if (store.debug.clearLog) { - clearConsole() - } - logger.title(`${cliName}`) - logger.time(`[${cliName}]Run`) + // if (store.debug.clearLog) { + // clearConsole() + // } + logger.title(`${cliAction}`) + logger.time(`[${cliAction}]Run`) await this.run() this.processExit() - logger.timeEnd(`[${cliName}]Run`) - logger.timeEnd(`[${cliName}]Setup`) + logger.timeEnd(`[${cliAction}]Run`) + logger.timeEnd(`[${cliAction}]Setup`) } async run() {} processExit() { diff --git a/packages/cli/src/script/dev.ts b/packages/cli/src/script/dev.ts index cba48d30..76f1f6a1 100644 --- a/packages/cli/src/script/dev.ts +++ b/packages/cli/src/script/dev.ts @@ -1,4 +1,8 @@ import {type RspackOptions, rspack} from '@rspack/core' +import chokidar from 'chokidar' +import fs from 'fs' +import path from 'path' +import {logger} from 'src/helper' import {timeDone} from 'src/helper/buildPrint' import {deepAssign} from 'src/helper/utils' import {BaseScript} from 'src/script/base' @@ -10,7 +14,6 @@ class DevScript extends BaseScript { get stats() { return { all: store.empConfig.debug.devShowAllLog, - // all: true, colors: true, assets: false, chunks: false, @@ -21,56 +24,120 @@ class DevScript extends BaseScript { warnings: true, } } + private async getRspackDevConfig() { const cf: RspackOptions = deepAssign(store.rsConfig, { stats: this.stats, devServer: { - open: false, //避免 打开多tab!!! + open: false, // 避免打开多tab setupExitSignals: true, port: store.server.port, }, }) const {devServer}: any = cf + + // 处理HTTPS配置 if (store.server.isHttps) { - /** - * 弃置options - */ if (!devServer.server || (devServer.server.type === 'https' && !devServer.server.options)) { const {key, cert} = await store.server.getcert() devServer.server = { type: 'https', - options: { - key, - cert, - }, + options: {key, cert}, } } } - // + + // 移除旧的https配置 if (Object.hasOwn(devServer, 'https')) { delete devServer.https } + return cf } - override async run() { - const {server} = store - let rspackConfig = await this.getRspackDevConfig() - rspackConfig = await empDevServer.beforeCompiler(rspackConfig) - // - const compiler = rspack(rspackConfig) - await store.empConfig.lifeCycle.beforeDevServe() - server.startOpen() - await empDevServer.setup(compiler, rspackConfig, store as GlobalStore, async (o: any) => { - this.showTimeDone(o) - await store.empConfig.lifeCycle.afterDevServe() - }) - if (store.debug.showPerformance) { - compiler.hooks.afterDone.tap('done', this.showTimeDone) + + /** + * 启动或重启开发服务器 + * @param isRestart 是否为重启操作 + */ + private async startDevServer(isRestart = false) { + try { + const {server} = store + let rspackConfig = await this.getRspackDevConfig() + rspackConfig = await empDevServer.beforeCompiler(rspackConfig) + + const compiler = rspack(rspackConfig) + await store.empConfig.lifeCycle.beforeDevServe() + server.startOpen() + + await empDevServer.setup(compiler, rspackConfig, store as GlobalStore, async (o: any) => { + // showPerformance 为false 时 只显示一次 + if (!isRestart && !store.debug.showPerformance) this.showTimeDone(o) + await store.empConfig.lifeCycle.afterDevServe() + }) + + if (store.debug.showPerformance) { + compiler.hooks.afterDone.tap('done', this.showTimeDone) + } + + if (isRestart) { + logger.debug(`[EMP] Dev server restarted successfully`) + } + } catch (error) { + logger.error(`[EMP] Failed to ${isRestart ? 'restart' : 'start'} dev server:`, error) } } + + private watchConfigFile() { + const configPath = path.resolve(process.cwd(), 'emp.config.ts') + if (!fs.existsSync(configPath)) return + + logger.debug(`[EMP] Watching for changes in emp.config.ts...`) + let previousContent = fs.readFileSync(configPath, 'utf-8') + + chokidar + .watch(configPath, { + ignored: /(^|[/\\])\../, // ignore dotfiles + persistent: true, + }) + .on('change', async filePath => { + // 检查文件内容是否有实际变化(避免空保存触发重启) + const currentContent = fs.readFileSync(configPath, 'utf-8') + if (previousContent === currentContent) { + logger.debug(`[EMP] 配置文件无实际变更(空保存),跳过重启`) + return + } + + previousContent = currentContent + logger.debug(`[EMP] Config file changed: ${filePath}`) + + // 清除require缓存,确保重新加载配置文件 + Object.keys(require.cache).forEach(id => { + if (id.includes('emp.config')) { + delete require.cache[id] + } + }) + + // 重启服务 + logger.debug(`[EMP] 配置文件已变更,正在重启服务...`) + await empDevServer.close() + await store.setup() + logger.debug('[EMP] 重启服务完成,新配置如下:', store.empConfig.debug) + await this.startDevServer(true) // 以重启模式启动服务器 + }) + } + + override async run() { + // 首次启动开发服务器 + await this.startDevServer(false) + + // 启动配置文件监听 + this.watchConfigFile() + } + private showTimeDone = (s: any) => { const d = s?.toJson({all: false, colors: false, assets: false, chunks: false, timings: true}) timeDone(d.time) } } + export default new DevScript() diff --git a/packages/cli/src/server/connect/dev.ts b/packages/cli/src/server/connect/dev.ts index c9631a5e..315c1dd0 100644 --- a/packages/cli/src/server/connect/dev.ts +++ b/packages/cli/src/server/connect/dev.ts @@ -1,17 +1,22 @@ // import RspackDevServer from 'webpack-dev-server' import {RspackDevServer} from '@rspack/dev-server' import connect from 'connect' +import logger from 'src/helper/logger' import type {Compiler, GlobalStore, RspackOptions} from 'src/index' import type {DevServerType} from 'src/server/types' export class DevServer implements DevServerType { + private server: any = null + async setup(compiler: Compiler, rspackConfig: RspackOptions, store: GlobalStore, onReady: any = () => {}) { - if (!rspackConfig.devServer) return console.warn('rspackConfig.devServer need!') + if (!rspackConfig.devServer) return logger.warn('rspackConfig.devServer need!') const app = new RspackDevServer(rspackConfig.devServer, compiler) await app.start() app.middleware?.waitUntilValid(onReady) + this.server = app return app } + async beforeCompiler(rspackConfig: any) { rspackConfig.devServer.app = () => connect() if (rspackConfig.devServer.server && rspackConfig.devServer.server.type === 'https') { @@ -20,4 +25,19 @@ export class DevServer implements DevServerType { // console.log('rspackConfig', rspackConfig.devServer) return rspackConfig } + + async close() { + logger.debug('close dev server') + if (this.server) { + try { + await this.server.stop() + this.server = null + return true + } catch (error) { + logger.error('Error closing dev server:', error) + return false + } + } + return true + } } diff --git a/packages/cli/src/server/index.ts b/packages/cli/src/server/index.ts index f49f579d..4a3798a4 100644 --- a/packages/cli/src/server/index.ts +++ b/packages/cli/src/server/index.ts @@ -1,5 +1,6 @@ -export {DevServer} from './connect/dev' -export {ProdServer} from './connect/prod' +import {DevServer} from './connect/dev' +import {ProdServer} from './connect/prod' +export {DevServer, ProdServer} // export {ProdServer} from './hono/prod' // export {DevServer} from './hono/dev' diff --git a/packages/cli/src/store/index.ts b/packages/cli/src/store/index.ts index e35e898b..63a4fcef 100644 --- a/packages/cli/src/store/index.ts +++ b/packages/cli/src/store/index.ts @@ -5,13 +5,13 @@ import type {Configuration as RsConfig, RspackOptions} from '@rspack/core' import {rspack} from '@rspack/core' import {getEmpConfigPath, getTsConfig} from 'src/helper/loadConfig' import logger from 'src/helper/logger' -import {deepAssign, getLanIp, vCompare} from 'src/helper/utils' +import {clearConsole, deepAssign, getLanIp, vCompare} from 'src/helper/utils' import {Chain} from 'src/store/chain' import empConfig, {type EmpConfig} from 'src/store/empConfig' import rspackStore from 'src/store/rspack' import {StoreServer} from 'src/store/server' import type {EmpOptions, InjectTagsType, StoreRootPaths} from 'src/types/config' -import type {CliActionType, EMPModeType} from 'src/types/env' +import type {CliActionType, CliOptionsType, EMPModeType} from 'src/types/env' import {chainName} from './chain' import {HtmlEmpInjectPlugin} from './rspack/builtInPlugin' export class GlobalStore { @@ -27,6 +27,7 @@ export class GlobalStore { * 项目pkg信息 */ public pkg: any = {dependencies: {}, devDependencies: {}, version: '0.0.0', name: ''} + /** * 项目根目录绝对路径 * @default process.cwd() @@ -94,7 +95,6 @@ export class GlobalStore { /** * 项目配置 */ - public cliOptions: any public chain!: Chain public rsConfig!: RsConfig public empOptions: EmpOptions = {} @@ -103,13 +103,16 @@ export class GlobalStore { public entries: {[chunkName: string]: RspackOptions['entry']} = {} // 获取所有入口名称 public debug!: EmpConfig['debug'] public cliAction!: CliActionType + public cliOptions: CliOptionsType // 获取 emp-config路径 以及 tsconfig 路径 public rootPaths: StoreRootPaths = { empConfig: undefined, tsConfig: undefined, pkg: undefined, } - public async setup(cliAction: CliActionType, cliOptions: any) { + public async setup(cliAction?: CliActionType, cliOptions?: any) { + this.cliAction = cliAction ? cliAction : this.cliAction + this.cliOptions = cliOptions ? cliOptions : this.cliOptions logger.time('[store]Setup') // const [epath, tpath] = await Promise.all([getEmpConfigPath(), getTsConfig()]) @@ -119,7 +122,7 @@ export class GlobalStore { // console.log('this.rootPaths', this.rootPaths) // // 初始化 store 基础变量 - await this.initVars(cliAction, cliOptions) + await this.initVars(this.cliAction, this.cliOptions) // 设置 empConfig this.empConfig = empConfig await this.empConfig.setup(this) @@ -138,6 +141,10 @@ export class GlobalStore { await this.server.setupOnStore() // logger.timeEnd('[store]Setup') + // 是否清除上一个日志 + if (this.debug.clearLog) { + clearConsole() + } } /** * 初始化 基础变量 diff --git a/packages/cli/src/store/rspack/plugin.ts b/packages/cli/src/store/rspack/plugin.ts index 3e8e45ad..75d8ba1d 100644 --- a/packages/cli/src/store/rspack/plugin.ts +++ b/packages/cli/src/store/rspack/plugin.ts @@ -98,6 +98,26 @@ class RspackPlugin { * Default: ━━ */ progressChars: `▩▩`, + // 使用自定义handler来控制进度条输出 + // handler(percentage: number, message: any, ...args: any[]) { + // // 清除当前行 + // process.stdout.clearLine(0) + // process.stdout.cursorTo(0) + + // // 只在非100%时显示进度,避免多次显示100%完成信息 + // if (percentage < 1) { + // const percentStr = Math.floor(percentage * 100) + '%' + // const barLength = 25 + // const completeLength = Math.floor(barLength * percentage) + // const restLength = barLength - completeLength + + // const bar = '▩'.repeat(completeLength) + ' '.repeat(restLength) + // process.stdout.write(`${bar} ${percentStr} ${message}`) + // } else if (percentage === 1) { + // // 100%完成时只显示一次 + // process.stdout.write(`▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩ 100% ${message}\n`) + // } + // }, } } // diff --git a/packages/cli/src/types/env.ts b/packages/cli/src/types/env.ts index 200be94b..6d3b7ab4 100644 --- a/packages/cli/src/types/env.ts +++ b/packages/cli/src/types/env.ts @@ -1,2 +1,3 @@ export type EMPModeType = 'development' | 'production' export type CliActionType = 'dev' | 'build' | 'serve' +export type CliOptionsType = any diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1bd1b467..0f40086b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -308,6 +308,9 @@ importers: '@types/webpack-sources': specifier: ^3.2.2 version: 3.2.3 + chokidar: + specifier: ^4.0.3 + version: 4.0.3 vue: specifier: ^3.5.21 version: 3.5.21(typescript@5.9.2) diff --git a/projects/demo/emp.config.ts b/projects/demo/emp.config.ts index 8642602a..faf1c029 100644 --- a/projects/demo/emp.config.ts +++ b/projects/demo/emp.config.ts @@ -38,7 +38,10 @@ export default defineConfig(store => { debug: { // showPerformance: true, // showRsconfig: 'wp.json', + + loggerLevel: 'debug', // clearLog: false, + // progress: false, // infrastructureLogging: { // level: 'verbose', // 或 'log',verbose 会输出更详细的日志 // colors: true, // 启用彩色日志,便于区分 From 727f96e8b041ff9d0f8d1c7a872c1089f40836f7 Mon Sep 17 00:00:00 2001 From: xuhongbin Date: Sun, 28 Sep 2025 16:22:01 +0800 Subject: [PATCH 2/7] =?UTF-8?q?fix(cli):=20=E4=BF=AE=E5=A4=8D=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E6=A8=A1=E5=BC=8F=E4=B8=8B=E8=BF=9B=E5=BA=A6=E6=9D=A1?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 禁用开发模式下的进度条显示以避免干扰 调整构建完成信息显示逻辑 移除冗余的进度条处理代码 --- packages/cli/src/helper/buildPrint.ts | 4 +++- packages/cli/src/script/dev.ts | 2 +- packages/cli/src/store/rspack/plugin.ts | 23 ++--------------------- projects/demo/emp.config.ts | 2 +- 4 files changed, 7 insertions(+), 24 deletions(-) diff --git a/packages/cli/src/helper/buildPrint.ts b/packages/cli/src/helper/buildPrint.ts index 18962fae..c5d4c5fb 100644 --- a/packages/cli/src/helper/buildPrint.ts +++ b/packages/cli/src/helper/buildPrint.ts @@ -99,6 +99,8 @@ export async function printFileSizes(stats: Stats) { const longestLabelLength = Math.max(...assets.map(a => a.sizeLabel.length)) const longestFileLength = Math.max(...assets.map(a => (a.folder + path.sep + a.name).length)) // + logger.info(`${green('✓')} Ready built in ${timeFormat(Number(origin.time))}\n`) + // printHeader(longestFileLength, longestLabelLength) // let totalSize = 0 @@ -130,7 +132,7 @@ export async function printFileSizes(stats: Stats) { const totalSizeLabel = `${blue.bold('Total size:')} ${calcFileSize(totalSize)}` const gzippedSizeLabel = `${blue.bold('Gzipped size:')} ${calcFileSize(totalGzipSize)}` logger.info(`\n ${totalSizeLabel}\n ${gzippedSizeLabel}\n`) - logger.info(`${green('✓')} Ready in ${timeFormat(Number(origin.time))}\n`) + // logger.info(`${green('✓')} Ready in ${timeFormat(Number(origin.time))}\n`) } export function timeDone(mis: number | string = 0) { logger.info(`${green('✓')} Ready in ${timeFormat(Number(mis))}`) diff --git a/packages/cli/src/script/dev.ts b/packages/cli/src/script/dev.ts index 76f1f6a1..d3443b25 100644 --- a/packages/cli/src/script/dev.ts +++ b/packages/cli/src/script/dev.ts @@ -71,7 +71,7 @@ class DevScript extends BaseScript { await empDevServer.setup(compiler, rspackConfig, store as GlobalStore, async (o: any) => { // showPerformance 为false 时 只显示一次 - if (!isRestart && !store.debug.showPerformance) this.showTimeDone(o) + if (!store.debug.showPerformance) this.showTimeDone(o) await store.empConfig.lifeCycle.afterDevServe() }) diff --git a/packages/cli/src/store/rspack/plugin.ts b/packages/cli/src/store/rspack/plugin.ts index 75d8ba1d..c3de9762 100644 --- a/packages/cli/src/store/rspack/plugin.ts +++ b/packages/cli/src/store/rspack/plugin.ts @@ -77,7 +77,8 @@ class RspackPlugin { ]) } async progress() { - if (!this.store.empConfig.debug.progress) return + // if (!this.store.empConfig.debug.progress) return + if (this.store.mode === 'development') return // let op: any = {} if (this.store.isOldRspack) { @@ -98,26 +99,6 @@ class RspackPlugin { * Default: ━━ */ progressChars: `▩▩`, - // 使用自定义handler来控制进度条输出 - // handler(percentage: number, message: any, ...args: any[]) { - // // 清除当前行 - // process.stdout.clearLine(0) - // process.stdout.cursorTo(0) - - // // 只在非100%时显示进度,避免多次显示100%完成信息 - // if (percentage < 1) { - // const percentStr = Math.floor(percentage * 100) + '%' - // const barLength = 25 - // const completeLength = Math.floor(barLength * percentage) - // const restLength = barLength - completeLength - - // const bar = '▩'.repeat(completeLength) + ' '.repeat(restLength) - // process.stdout.write(`${bar} ${percentStr} ${message}`) - // } else if (percentage === 1) { - // // 100%完成时只显示一次 - // process.stdout.write(`▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩ 100% ${message}\n`) - // } - // }, } } // diff --git a/projects/demo/emp.config.ts b/projects/demo/emp.config.ts index faf1c029..4896147e 100644 --- a/projects/demo/emp.config.ts +++ b/projects/demo/emp.config.ts @@ -41,7 +41,7 @@ export default defineConfig(store => { loggerLevel: 'debug', // clearLog: false, - // progress: false, + progress: false, // infrastructureLogging: { // level: 'verbose', // 或 'log',verbose 会输出更详细的日志 // colors: true, // 启用彩色日志,便于区分 From ed811247825170f6e6f6c56ac6416d402af5a5f3 Mon Sep 17 00:00:00 2001 From: xuhongbin Date: Sun, 28 Sep 2025 16:23:04 +0800 Subject: [PATCH 3/7] =?UTF-8?q?fix(cli):=20=E7=A7=BB=E9=99=A4=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E7=9A=84=E6=9E=84=E5=BB=BA=E5=AE=8C=E6=88=90=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E5=B9=B6=E4=BF=AE=E6=AD=A3=E6=9C=80=E7=BB=88=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/cli/src/helper/buildPrint.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/cli/src/helper/buildPrint.ts b/packages/cli/src/helper/buildPrint.ts index c5d4c5fb..f1b003d9 100644 --- a/packages/cli/src/helper/buildPrint.ts +++ b/packages/cli/src/helper/buildPrint.ts @@ -99,8 +99,6 @@ export async function printFileSizes(stats: Stats) { const longestLabelLength = Math.max(...assets.map(a => a.sizeLabel.length)) const longestFileLength = Math.max(...assets.map(a => (a.folder + path.sep + a.name).length)) // - logger.info(`${green('✓')} Ready built in ${timeFormat(Number(origin.time))}\n`) - // printHeader(longestFileLength, longestLabelLength) // let totalSize = 0 @@ -132,7 +130,7 @@ export async function printFileSizes(stats: Stats) { const totalSizeLabel = `${blue.bold('Total size:')} ${calcFileSize(totalSize)}` const gzippedSizeLabel = `${blue.bold('Gzipped size:')} ${calcFileSize(totalGzipSize)}` logger.info(`\n ${totalSizeLabel}\n ${gzippedSizeLabel}\n`) - // logger.info(`${green('✓')} Ready in ${timeFormat(Number(origin.time))}\n`) + logger.info(`${green('✓')} Built in ${timeFormat(Number(origin.time))}\n`) } export function timeDone(mis: number | string = 0) { logger.info(`${green('✓')} Ready in ${timeFormat(Number(mis))}`) From 35770dd4fb101c50559590b6f2ebe09aa6cd7329 Mon Sep 17 00:00:00 2001 From: xuhongbin Date: Sun, 28 Sep 2025 20:43:53 +0800 Subject: [PATCH 4/7] =?UTF-8?q?feat(cli):=20=E6=94=B9=E8=BF=9B=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E8=BE=93=E5=87=BA=E5=92=8C=E6=96=87=E4=BB=B6=E7=9B=91?= =?UTF-8?q?=E5=90=AC=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加构建开始和完成的彩色输出提示 引入文件修改监听功能,优化开发体验 添加服务器状态标志防止重复输出 --- packages/cli/src/helper/buildPrint.ts | 75 +++++++- packages/cli/src/helper/compilerWatcher.ts | 205 +++++++++++++++++++++ packages/cli/src/script/dev.ts | 25 +-- packages/cli/src/script/serve.ts | 2 +- packages/cli/src/server/connect/dev.ts | 2 + projects/demo/emp.config.ts | 3 +- projects/demo/src/react/App.tsx | 2 +- 7 files changed, 297 insertions(+), 17 deletions(-) create mode 100644 packages/cli/src/helper/compilerWatcher.ts diff --git a/packages/cli/src/helper/buildPrint.ts b/packages/cli/src/helper/buildPrint.ts index f1b003d9..7b5f7459 100644 --- a/packages/cli/src/helper/buildPrint.ts +++ b/packages/cli/src/helper/buildPrint.ts @@ -1,6 +1,7 @@ import fs from 'node:fs' import path from 'node:path' import type {Stats, StatsAsset} from '@rspack/core' +import chalk from 'chalk' import {gzipSizeSync} from 'gzip-size' import {blue, gray, green, magenta, red, white, yellow} from 'src/helper/color' import store from 'src/store' @@ -130,8 +131,76 @@ export async function printFileSizes(stats: Stats) { const totalSizeLabel = `${blue.bold('Total size:')} ${calcFileSize(totalSize)}` const gzippedSizeLabel = `${blue.bold('Gzipped size:')} ${calcFileSize(totalGzipSize)}` logger.info(`\n ${totalSizeLabel}\n ${gzippedSizeLabel}\n`) - logger.info(`${green('✓')} Built in ${timeFormat(Number(origin.time))}\n`) + logger.info(`${chalk.green('ready ')}Built in ${timeFormat(Number(origin.time))}\n`) } -export function timeDone(mis: number | string = 0) { - logger.info(`${green('✓')} Ready in ${timeFormat(Number(mis))}`) +/** + * 统一的打印函数,用于显示不同类型的构建消息 + * @param type 消息类型: 'start' | 'ready' + * @param message 要显示的消息 + */ +function printMessage(type: 'start' | 'ready', message: string) { + const prefix = type === 'start' ? chalk.cyan('start ') : chalk.green('ready ') + console.log(prefix + chalk.white(message)) +} + +export function timeDone(mis: number | string = 0, tips = 'Ready') { + logger.info(`${chalk.green('ready ')}${tips} in ${timeFormat(Number(mis))}`) +} + +/** + * 显示构建开始提示 + */ +export function printBuildStart() { + printMessage('start', 'build started...') +} + +/** + * 显示构建完成提示 + * @param stats 构建统计信息 + */ +export function printBuildDone(stats: any) { + const data = stats?.toJson({all: false, colors: false, assets: false, chunks: false, timings: true}) + printMessage('ready', `built in ${chalk.bold((data.time / 1000).toFixed(2))} s`) +} + +/** + * 显示模块构建开始提示 + * @param moduleId 模块ID + * @param moduleCache 可选的模块缓存 + */ +export function printModuleBuildStart(moduleId: string, moduleCache?: Map) { + if (moduleId.includes('/src/') && !moduleId.includes('node_modules')) { + const relativePath = moduleId.split('/src/').pop() || '' + if (relativePath) { + printMessage('start', 'building ' + chalk.dim('src/' + relativePath)) + } + } +} + +/** + * 记录构建开始 + * @param message 可选的自定义消息 + */ +export function logStart(message = 'build started...') { + printMessage('start', message) +} + +/** + * 记录构建完成 + * @param stats 构建统计信息或构建时间(毫秒) + * @param message 可选的自定义消息前缀 + */ +export function logDone(stats: any | number, message = 'built') { + let timeInSeconds: string + + if (typeof stats === 'number') { + // 如果传入的是毫秒数 + timeInSeconds = (stats / 1000).toFixed(2) + } else { + // 如果传入的是stats对象 + const data = stats?.toJson({all: false, colors: false, assets: false, chunks: false, timings: true}) + timeInSeconds = (data.time / 1000).toFixed(2) + } + + printMessage('ready', `${message} in ${chalk.bold(timeInSeconds)} s`) } diff --git a/packages/cli/src/helper/compilerWatcher.ts b/packages/cli/src/helper/compilerWatcher.ts new file mode 100644 index 00000000..116426d8 --- /dev/null +++ b/packages/cli/src/helper/compilerWatcher.ts @@ -0,0 +1,205 @@ +import type {Compiler} from '@rspack/core' +import chalk from 'chalk' +import path from 'path' +import type {DevServer} from '../server/connect/dev' +import {logDone, logStart} from './buildPrint' + +// 源文件过滤条件 +const SRC_FILE_REGEX = /\/src\// +const NODE_MODULES_REGEX = /node_modules/ + +/** + * 格式化文件路径,使其更易读 + */ +function formatFileList(files: string[], context: string): string[] { + return files.map(file => { + // 将绝对路径转换为相对于项目根目录的路径 + const relativePath = path.relative(context, file) + return chalk.dim(path.dirname(relativePath) + path.sep) + chalk.cyan(path.basename(relativePath)) + }) +} + +export function setupCompilerWatcher(compiler: Compiler, devServer: DevServer) { + const HOOK_NAME = 'emp:compiler' + + // 用于跟踪当前构建周期中已处理的模块 + const processedModules = new Set() + + // 用于存储文件的最后修改时间 + const fileTimestamps = new Map() + + // 是否有文件被修改的标志 + let hasModifiedFiles = false + + // 用于存储懒加载的模块 + const lazyModules = new Set() + + // 编译状态 + let isCompiling = false + + // 项目根目录 + const context = compiler.options.context || process.cwd() + + /** + * 检测文件是否为源代码文件 + */ + const isSourceFile = (filePath: string): boolean => { + return SRC_FILE_REGEX.test(filePath) && !NODE_MODULES_REGEX.test(filePath) + } + + /** + * 获取变更的文件列表,避免重复处理同一个文件 + */ + const getChangedFiles = (compiler: any): {changed: Set; removed: Set} => { + const changed = new Set() + const removed = new Set() + + // 使用Rspack/Webpack 5的modifiedFiles和removedFiles API + if (compiler.modifiedFiles || compiler.removedFiles) { + // 处理修改的文件 + if (compiler.modifiedFiles) { + for (const file of compiler.modifiedFiles) { + // 只处理源代码文件 + if (isSourceFile(file)) { + // 检查文件是否已经在当前编译周期中处理过 + const lastProcessedTime = fileTimestamps.get(file) || 0 + const currentTime = Date.now() + + // 如果文件在短时间内被多次修改,只处理一次 + // 使用300ms作为防抖时间 + if (currentTime - lastProcessedTime > 300) { + changed.add(file) + fileTimestamps.set(file, currentTime) + } + } + } + } + + // 处理删除的文件 + if (compiler.removedFiles) { + for (const file of compiler.removedFiles) { + if (isSourceFile(file)) { + removed.add(file) + // 从时间戳记录中删除 + fileTimestamps.delete(file) + } + } + } + + return {changed, removed} + } + + // 兼容旧版本 + if (compiler.watchFileSystem?.watcher) { + const watcher = compiler.watchFileSystem.watcher + const mtimes = watcher.mtimes || {} + + for (const filePath of Object.keys(mtimes)) { + if (!isSourceFile(filePath)) continue + + const mtime = mtimes[filePath] + const oldTime = fileTimestamps.get(filePath) || 0 + const currentTime = Date.now() + + // 防抖处理 + if (oldTime < mtime && currentTime - oldTime > 300) { + changed.add(filePath) + fileTimestamps.set(filePath, currentTime) + } + } + } + + return {changed, removed} + } + + /** + * 打印构建日志 + */ + function printBuildLog(changedFiles: Set, removedFiles: Set) { + if (!devServer.isServerStarted) return + + const changedList = Array.from(changedFiles) + const removedList = Array.from(removedFiles) + const lazyList = Array.from(lazyModules) + + // 如果没有文件变更,不打印日志 + if (changedList.length === 0 && removedList.length === 0 && lazyList.length === 0) { + return + } + + let message = '' + + // 格式化并添加修改的文件 + if (changedList.length > 0) { + const formattedFiles = formatFileList(changedList, context) + message += `modified ${formattedFiles.join(', ')}` + } + + // 格式化并添加懒加载的模块 + if (lazyList.length > 0) { + const formattedLazy = formatFileList(lazyList, context) + message += `lazyLoaded ${formattedLazy.join(', ')}` + } + + // 格式化并添加删除的文件 + if (removedList.length > 0) { + const formattedRemoved = formatFileList(removedList, context) + message += `removed ${formattedRemoved.join(', ')}` + } + + // 打印构建开始信息 + logStart(message) + } + + // 监听编译开始,重置状态 + compiler.hooks.watchRun.tap(HOOK_NAME, (compiler: any) => { + // 避免重复触发 + if (isCompiling) return + isCompiling = true + + // 清空当前构建周期的处理记录 + processedModules.clear() + lazyModules.clear() + + // 获取变更的文件 + const {changed, removed} = getChangedFiles(compiler) + hasModifiedFiles = changed.size > 0 || removed.size > 0 + + // 打印构建日志 + if (hasModifiedFiles) { + printBuildLog(changed, removed) + } + + // 将变更的文件添加到处理列表 + changed.forEach(filePath => processedModules.add(filePath)) + }) + + // 监听构建完成 + compiler.hooks.done.tap(HOOK_NAME, stats => { + // 只有在服务器启动完成且有文件被修改时才处理 + if (!devServer.isServerStarted || !hasModifiedFiles) { + isCompiling = false + return + } + + // 确保每次构建只打印一次完成信息 + if (processedModules.size > 0 || lazyModules.size > 0) { + logDone(stats) + // 重置标志 + hasModifiedFiles = false + } + + // 重置编译状态 + isCompiling = false + }) + + return { + cleanup: () => { + processedModules.clear() + fileTimestamps.clear() + lazyModules.clear() + hasModifiedFiles = false + isCompiling = false + }, + } +} diff --git a/packages/cli/src/script/dev.ts b/packages/cli/src/script/dev.ts index d3443b25..93b6c237 100644 --- a/packages/cli/src/script/dev.ts +++ b/packages/cli/src/script/dev.ts @@ -1,9 +1,11 @@ import {type RspackOptions, rspack} from '@rspack/core' +import chalk from 'chalk' import chokidar from 'chokidar' import fs from 'fs' import path from 'path' import {logger} from 'src/helper' -import {timeDone} from 'src/helper/buildPrint' +import {printBuildDone, printBuildStart, timeDone} from 'src/helper/buildPrint' +import {setupCompilerWatcher} from 'src/helper/compilerWatcher' import {deepAssign} from 'src/helper/utils' import {BaseScript} from 'src/script/base' import {DevServer} from 'src/server' @@ -68,16 +70,19 @@ class DevScript extends BaseScript { const compiler = rspack(rspackConfig) await store.empConfig.lifeCycle.beforeDevServe() server.startOpen() + // 显示构建开始提示 + printBuildStart() await empDevServer.setup(compiler, rspackConfig, store as GlobalStore, async (o: any) => { - // showPerformance 为false 时 只显示一次 - if (!store.debug.showPerformance) this.showTimeDone(o) + empDevServer.isServerStarted = true + printBuildDone(o) await store.empConfig.lifeCycle.afterDevServe() }) - - if (store.debug.showPerformance) { - compiler.hooks.afterDone.tap('done', this.showTimeDone) - } + // compiler.hooks.afterDone.tap('done', stats => { + // this.lastBuildTime = printBuildDone(stats, this.lastBuildTime) + // }) + // 设置编译器监听器,监听文件修改后的全流程 + setupCompilerWatcher(compiler, empDevServer) if (isRestart) { logger.debug(`[EMP] Dev server restarted successfully`) @@ -134,10 +139,8 @@ class DevScript extends BaseScript { this.watchConfigFile() } - private showTimeDone = (s: any) => { - const d = s?.toJson({all: false, colors: false, assets: false, chunks: false, timings: true}) - timeDone(d.time) - } + // 记录上次构建完成时间,避免重复输出 + private lastBuildTime = 0 } export default new DevScript() diff --git a/packages/cli/src/script/serve.ts b/packages/cli/src/script/serve.ts index f07c29f5..00b11688 100644 --- a/packages/cli/src/script/serve.ts +++ b/packages/cli/src/script/serve.ts @@ -13,7 +13,7 @@ export class ServeScript extends BaseScript { } onReady = async () => { store.server.startOpen() - timeDone(Date.now() - timing) + timeDone(Date.now() - timing, 'Server Started') await store.empConfig.lifeCycle.afterServe() } } diff --git a/packages/cli/src/server/connect/dev.ts b/packages/cli/src/server/connect/dev.ts index 315c1dd0..16d29c77 100644 --- a/packages/cli/src/server/connect/dev.ts +++ b/packages/cli/src/server/connect/dev.ts @@ -7,6 +7,7 @@ import type {DevServerType} from 'src/server/types' export class DevServer implements DevServerType { private server: any = null + public isServerStarted = false async setup(compiler: Compiler, rspackConfig: RspackOptions, store: GlobalStore, onReady: any = () => {}) { if (!rspackConfig.devServer) return logger.warn('rspackConfig.devServer need!') @@ -31,6 +32,7 @@ export class DevServer implements DevServerType { if (this.server) { try { await this.server.stop() + this.isServerStarted = false this.server = null return true } catch (error) { diff --git a/projects/demo/emp.config.ts b/projects/demo/emp.config.ts index 4896147e..507f85fe 100644 --- a/projects/demo/emp.config.ts +++ b/projects/demo/emp.config.ts @@ -39,7 +39,7 @@ export default defineConfig(store => { // showPerformance: true, // showRsconfig: 'wp.json', - loggerLevel: 'debug', + // loggerLevel: 'debug', // clearLog: false, progress: false, // infrastructureLogging: { @@ -79,6 +79,7 @@ export default defineConfig(store => { prifixName: 'v1', }, // tsCheckerRspackPlugin: true, + // cache: false, } }) // diff --git a/projects/demo/src/react/App.tsx b/projects/demo/src/react/App.tsx index 908fee19..94ab1ce6 100644 --- a/projects/demo/src/react/App.tsx +++ b/projects/demo/src/react/App.tsx @@ -22,7 +22,7 @@ function App() { <>

-

EMP 3.0

+

EMP 3.0 fsssl

Image Text

From 9d1bf26ce584d82404c94da661e092be4043b746 Mon Sep 17 00:00:00 2001 From: xuhongbin Date: Sun, 28 Sep 2025 20:46:45 +0800 Subject: [PATCH 5/7] =?UTF-8?q?fix:=20=E4=BF=AE=E6=AD=A3=E6=96=87=E6=9C=AC?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=92=8C=E6=96=87=E4=BB=B6=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将App.tsx中的banner文本从"EMP 3.0 fsssl"改为"EMP 3.0" 将compilerWatcher.ts中的文件列表名称颜色从cyan改为dim --- packages/cli/src/helper/compilerWatcher.ts | 2 +- projects/demo/src/react/App.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/helper/compilerWatcher.ts b/packages/cli/src/helper/compilerWatcher.ts index 116426d8..5b42b7c1 100644 --- a/packages/cli/src/helper/compilerWatcher.ts +++ b/packages/cli/src/helper/compilerWatcher.ts @@ -15,7 +15,7 @@ function formatFileList(files: string[], context: string): string[] { return files.map(file => { // 将绝对路径转换为相对于项目根目录的路径 const relativePath = path.relative(context, file) - return chalk.dim(path.dirname(relativePath) + path.sep) + chalk.cyan(path.basename(relativePath)) + return chalk.dim(path.dirname(relativePath) + path.sep) + chalk.dim(path.basename(relativePath)) }) } diff --git a/projects/demo/src/react/App.tsx b/projects/demo/src/react/App.tsx index 94ab1ce6..908fee19 100644 --- a/projects/demo/src/react/App.tsx +++ b/projects/demo/src/react/App.tsx @@ -22,7 +22,7 @@ function App() { <>

-

EMP 3.0 fsssl

+

EMP 3.0

Image Text

From 279195b22b34c5e9d43527210e9395c3ffb5a868 Mon Sep 17 00:00:00 2001 From: xuhongbin Date: Sun, 28 Sep 2025 20:52:39 +0800 Subject: [PATCH 6/7] =?UTF-8?q?refactor(cli):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=B8=85=E7=90=86=E9=92=A9=E5=AD=90=E4=BB=A5=E7=A1=AE=E4=BF=9D?= =?UTF-8?q?=E8=B5=84=E6=BA=90=E6=AD=A3=E7=A1=AE=E9=87=8A=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 closeHooks 数组来存储清理函数,在服务重启时执行所有清理钩子 确保 watcher 等资源被正确释放,避免内存泄漏 --- packages/cli/src/script/dev.ts | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/script/dev.ts b/packages/cli/src/script/dev.ts index 93b6c237..40902d98 100644 --- a/packages/cli/src/script/dev.ts +++ b/packages/cli/src/script/dev.ts @@ -13,6 +13,9 @@ import store, {type GlobalStore} from 'src/store' const empDevServer = new DevServer() class DevScript extends BaseScript { + // 用于存储关闭时需要执行的清理函数 + private closeHooks: Array<() => void> = [] + get stats() { return { all: store.empConfig.debug.devShowAllLog, @@ -82,7 +85,10 @@ class DevScript extends BaseScript { // this.lastBuildTime = printBuildDone(stats, this.lastBuildTime) // }) // 设置编译器监听器,监听文件修改后的全流程 - setupCompilerWatcher(compiler, empDevServer) + const watcher = setupCompilerWatcher(compiler, empDevServer) + + // 添加到关闭钩子中,确保资源被正确清理 + this.closeHooks.push(() => watcher.cleanup()) if (isRestart) { logger.debug(`[EMP] Dev server restarted successfully`) @@ -124,6 +130,8 @@ class DevScript extends BaseScript { // 重启服务 logger.debug(`[EMP] 配置文件已变更,正在重启服务...`) + // 执行所有清理钩子 + this.executeCloseHooks() await empDevServer.close() await store.setup() logger.debug('[EMP] 重启服务完成,新配置如下:', store.empConfig.debug) @@ -141,6 +149,24 @@ class DevScript extends BaseScript { // 记录上次构建完成时间,避免重复输出 private lastBuildTime = 0 + + /** + * 执行所有关闭钩子函数 + */ + private executeCloseHooks() { + if (this.closeHooks.length > 0) { + logger.debug(`[EMP] 执行 ${this.closeHooks.length} 个清理钩子...`) + for (const hook of this.closeHooks) { + try { + hook() + } catch (error) { + logger.error('[EMP] 执行清理钩子时出错:', error) + } + } + // 清空钩子列表 + this.closeHooks = [] + } + } } export default new DevScript() From b51e632bfbbf4ad74c266e6404025ca997a08e99 Mon Sep 17 00:00:00 2001 From: xuhongbin Date: Sun, 28 Sep 2025 21:46:16 +0800 Subject: [PATCH 7/7] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E7=89=88=E6=9C=AC=E5=B9=B6=E6=B7=BB=E5=8A=A0rslib?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 更新@rslib/core至0.14.0版本 - 添加.rslib到.gitignore - 为cli包添加rslib构建脚本和配置文件 - 清理package.json格式并更新相关依赖 --- .gitignore | 2 + package.json | 2 +- packages/cli/package.json | 23 +--- packages/cli/rslib.config.ts | 48 +++++++ packages/cli/src/helper/logger.ts | 1 + pnpm-lock.yaml | 204 +++++++++++++++--------------- 6 files changed, 157 insertions(+), 123 deletions(-) create mode 100644 packages/cli/rslib.config.ts diff --git a/.gitignore b/.gitignore index 0300c483..2a047635 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,5 @@ projects/e-svga* @mf-types .output doc_build + +.rslib \ No newline at end of file diff --git a/package.json b/package.json index 2f789410..654115fa 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "@commitlint/cli": "^17.8.0", "@commitlint/config-conventional": "^17.8.0", "@empjs/biome-config": "workspace:^", - "@rslib/core": "^0.13.2", + "@rslib/core": "^0.14.0", "cross-env": "^7.0.3", "serve": "14.2.5", "tsup": "8.5.0", diff --git a/packages/cli/package.json b/packages/cli/package.json index 40c12bfb..e83f7b76 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -4,19 +4,8 @@ "description": "emp", "license": "MIT", "type": "module", - "files": [ - "dist", - "bin", - "resource", - "template", - "types", - "tsconfig" - ], - "maintainers": [ - "xuhongbin", - "ckken", - "doerme" - ], + "files": ["dist", "bin", "resource", "template", "types", "tsconfig"], + "maintainers": ["xuhongbin", "ckken", "doerme"], "repository": { "type": "git", "url": "git+https://github.com/empjs/emp.git", @@ -26,11 +15,7 @@ "access": "public", "registry": "https://registry.npmjs.org/" }, - "keywords": [ - "rspack", - "rust", - "typescript" - ], + "keywords": ["rspack", "rust", "typescript"], "bin": { "emp": "./bin/emp.js" }, @@ -79,6 +64,8 @@ "scripts": { "dev": "tsup --watch --env.ENV dev", "build": "tsup --env.ENV prod", + "dev-rs": "rslib build --watch --env-mode development", + "build-rs": "rslib build --env-mode production", "ph": "pnpm publish --no-git-checks" }, "engines": { diff --git a/packages/cli/rslib.config.ts b/packages/cli/rslib.config.ts new file mode 100644 index 00000000..76e89621 --- /dev/null +++ b/packages/cli/rslib.config.ts @@ -0,0 +1,48 @@ +import {defineConfig, type RslibConfig} from '@rslib/core' + +export default defineConfig(({envMode}): RslibConfig => { + const isDev = envMode === 'development' + // console.log('isDev', isDev, envMode) + return { + lib: [ + { + bundle: true, + format: 'esm', + shims: { + esm: { + __filename: true, + __dirname: true, + require: true, + }, + }, + dts: true, + }, + { + bundle: true, + format: 'cjs', + shims: { + cjs: { + 'import.meta.url': true, + }, + }, + }, + ], + source: { + tsconfigPath: './tsconfig.json', + define: { + 'process.env.ENV': JSON.stringify(isDev ? 'dev' : 'prod'), + }, + entry: { + index: 'src/index.ts', + }, + }, + output: { + target: 'node', + sourceMap: isDev, + minify: !isDev, + externals: { + '@rsdoctor/rspack-plugin': 'commonjs @rsdoctor/rspack-plugin', + }, + }, + } +}) diff --git a/packages/cli/src/helper/logger.ts b/packages/cli/src/helper/logger.ts index 70208cf1..e1c470a8 100644 --- a/packages/cli/src/helper/logger.ts +++ b/packages/cli/src/helper/logger.ts @@ -3,6 +3,7 @@ export type LoggerType = 'debug' | 'info' | 'warn' | 'error' export {color} // const isDev = process.env.ENV === 'dev' +// console.log('process.env.ENV', process.env.ENV) export class Logger { public brandName = '' public fullName = '' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0f40086b..69164db6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,8 +18,8 @@ importers: specifier: workspace:^ version: link:packages/biome-config '@rslib/core': - specifier: ^0.13.2 - version: 0.13.2(typescript@5.9.2) + specifier: ^0.14.0 + version: 0.14.0(typescript@5.9.2) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -195,7 +195,7 @@ importers: version: link:../emp-chain '@rsdoctor/rspack-plugin': specifier: 1.2.3 - version: 1.2.3(@rsbuild/core@1.5.4)(@rspack/core@1.5.5)(webpack@5.101.3) + version: 1.2.3(@rsbuild/core@1.5.12)(@rspack/core@1.5.5)(webpack@5.101.3) '@rspack/core': specifier: 1.5.5 version: 1.5.5(@swc/helpers@0.5.17) @@ -5395,18 +5395,18 @@ packages: jiti: 2.5.1 dev: false - /@rsbuild/core@1.5.4: - resolution: {integrity: sha512-iRzq4hEXawL4MVkPKhfGMJxS45XIfwkweAZXEHeaboq6vxbpg0dLRgkbaIuuFyF9hCwI0y3ant/xVXOqDghJNw==} + /@rsbuild/core@1.5.12: + resolution: {integrity: sha512-DpinE1If6WRTwQYqH+PRtJo3zshkDYHfIcWq4lTtfsPfPLrXshmRXBam3BS1RRu4v2gGT+LCNiUefftsmcmL0A==} engines: {node: '>=18.12.0'} hasBin: true dependencies: - '@rspack/core': 1.5.2(@swc/helpers@0.5.17) + '@rspack/core': 1.5.7(@swc/helpers@0.5.17) '@rspack/lite-tapable': 1.0.1 '@swc/helpers': 0.5.17 core-js: 3.45.1 - jiti: 2.5.1 + jiti: 2.6.0 - /@rsbuild/plugin-check-syntax@1.3.0(@rsbuild/core@1.5.4): + /@rsbuild/plugin-check-syntax@1.3.0(@rsbuild/core@1.5.12): resolution: {integrity: sha512-lHrd6hToPFVOGWr0U/Ox7pudHWdhPSFsr2riWpjNRlUuwiXdU2SYMROaVUCrLJvYFzJyEMsFOi1w59rBQCG2HQ==} peerDependencies: '@rsbuild/core': 1.x @@ -5414,7 +5414,7 @@ packages: '@rsbuild/core': optional: true dependencies: - '@rsbuild/core': 1.5.4 + '@rsbuild/core': 1.5.12 acorn: 8.15.0 browserslist-to-es-version: 1.1.1 htmlparser2: 10.0.0 @@ -5461,10 +5461,10 @@ packages: resolution: {integrity: sha512-KzfRONtUFMOhgyd9Kur9C/eqh+qPE0UDQEwp/uCMIQHwmompGgChuGniVENd2mGgkZX4MDHubFSvjoeI7j4UBg==} dev: false - /@rsdoctor/core@1.2.3(@rsbuild/core@1.5.4)(@rspack/core@1.5.5)(webpack@5.101.3): + /@rsdoctor/core@1.2.3(@rsbuild/core@1.5.12)(@rspack/core@1.5.5)(webpack@5.101.3): resolution: {integrity: sha512-7o+SoN0JVwvxi0LSToA9G5PvSDag9ri0pQ/krlsJdkg2aVCRSR1xVjS8pzaKR9F+Q5Mnj6RixYOhIkWqWoMWFw==} dependencies: - '@rsbuild/plugin-check-syntax': 1.3.0(@rsbuild/core@1.5.4) + '@rsbuild/plugin-check-syntax': 1.3.0(@rsbuild/core@1.5.12) '@rsdoctor/graph': 1.2.3(@rspack/core@1.5.5)(webpack@5.101.3) '@rsdoctor/sdk': 1.2.3(@rspack/core@1.5.5)(webpack@5.101.3) '@rsdoctor/types': 1.2.3(@rspack/core@1.5.5)(webpack@5.101.3) @@ -5501,7 +5501,7 @@ packages: - webpack dev: false - /@rsdoctor/rspack-plugin@1.2.3(@rsbuild/core@1.5.4)(@rspack/core@1.5.5)(webpack@5.101.3): + /@rsdoctor/rspack-plugin@1.2.3(@rsbuild/core@1.5.12)(@rspack/core@1.5.5)(webpack@5.101.3): resolution: {integrity: sha512-IW0dyCmEC9Sxz7pHpUPDIjUTpFdxPocIGrcw04J5CgD5hYbyDrJ6ubDRAY4W6jm4CGvr0524s4xfW2pfsKY1Ew==} peerDependencies: '@rspack/core': '*' @@ -5509,7 +5509,7 @@ packages: '@rspack/core': optional: true dependencies: - '@rsdoctor/core': 1.2.3(@rsbuild/core@1.5.4)(@rspack/core@1.5.5)(webpack@5.101.3) + '@rsdoctor/core': 1.2.3(@rsbuild/core@1.5.12)(@rspack/core@1.5.5)(webpack@5.101.3) '@rsdoctor/graph': 1.2.3(@rspack/core@1.5.5)(webpack@5.101.3) '@rsdoctor/sdk': 1.2.3(@rspack/core@1.5.5)(webpack@5.101.3) '@rsdoctor/types': 1.2.3(@rspack/core@1.5.5)(webpack@5.101.3) @@ -5596,8 +5596,8 @@ packages: - webpack dev: false - /@rslib/core@0.13.2(typescript@5.9.2): - resolution: {integrity: sha512-Npb27X+kjh4fJoCVMvemfgS1F/gBW4VwHndYlQSmP5pdtqbfOLEj66YNIk0thu/1Z4dh0m2KppM7O3cFiJpqMQ==} + /@rslib/core@0.14.0(typescript@5.9.2): + resolution: {integrity: sha512-N8FP813mteNeWVo0HrwOXfy0gaz222chu3ZMEaqR1AKxH7HD3i3rRvm8sQ7yQXQ27wyLHl1/Fttxa9MG/dnHeA==} engines: {node: '>=18.12.0'} hasBin: true peerDependencies: @@ -5609,9 +5609,8 @@ packages: typescript: optional: true dependencies: - '@rsbuild/core': 1.5.4 - rsbuild-plugin-dts: 0.13.2(@rsbuild/core@1.5.4)(typescript@5.9.2) - tinyglobby: 0.2.15 + '@rsbuild/core': 1.5.12 + rsbuild-plugin-dts: 0.14.0(@rsbuild/core@1.5.12)(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: - '@typescript/native-preview' @@ -5625,19 +5624,19 @@ packages: dev: false optional: true - /@rspack/binding-darwin-arm64@1.5.2: - resolution: {integrity: sha512-aO76T6VQvAFt1LJNRA5aPOJ+szeTLlzC5wubsnxgWWjG53goP+Te35kFjDIDe+9VhKE/XqRId6iNAymaEsN+Uw==} + /@rspack/binding-darwin-arm64@1.5.5: + resolution: {integrity: sha512-Kg3ywEZHLX+aROfTQ5tMOv+Ud+8b4jk8ruUgsi0W8oBkEkR5xBdhFa9vcf6pzy+gfoLCnEI68U9i8ttm+G0csA==} cpu: [arm64] os: [darwin] requiresBuild: true + dev: false optional: true - /@rspack/binding-darwin-arm64@1.5.5: - resolution: {integrity: sha512-Kg3ywEZHLX+aROfTQ5tMOv+Ud+8b4jk8ruUgsi0W8oBkEkR5xBdhFa9vcf6pzy+gfoLCnEI68U9i8ttm+G0csA==} + /@rspack/binding-darwin-arm64@1.5.7: + resolution: {integrity: sha512-prQ/vgJxOPdlYiR4gVeOEKofTCEOu70JQIQApqFnw8lKM7rd9ag8ogDNqmc2L/GGXGHLAqds28oeKXRlzYf7+Q==} cpu: [arm64] os: [darwin] requiresBuild: true - dev: false optional: true /@rspack/binding-darwin-x64@1.3.12: @@ -5648,19 +5647,19 @@ packages: dev: false optional: true - /@rspack/binding-darwin-x64@1.5.2: - resolution: {integrity: sha512-XNSmUOwdGs2PEdCKTFCC0/vu/7U9nMhAlbHJKlmdt0V4iPvFyaNWxkNdFqzLc05jlJOfgDdwbwRb91y9IcIIFQ==} + /@rspack/binding-darwin-x64@1.5.5: + resolution: {integrity: sha512-uoGTYnlYW8m47yiDCKvXOehhAOH12wlePJq4sbUbBoHmG07vbDw7fUqnvy2k8319NTVEpMJWGoKyisgI09/uMQ==} cpu: [x64] os: [darwin] requiresBuild: true + dev: false optional: true - /@rspack/binding-darwin-x64@1.5.5: - resolution: {integrity: sha512-uoGTYnlYW8m47yiDCKvXOehhAOH12wlePJq4sbUbBoHmG07vbDw7fUqnvy2k8319NTVEpMJWGoKyisgI09/uMQ==} + /@rspack/binding-darwin-x64@1.5.7: + resolution: {integrity: sha512-FPqiWSbEEerqfJrGnYe68svvl6NyuQFAb3qqFe/Q0MqFhBYmAZwa0R2/ylugCdgFLZxmkFuWqpDgItpvJb/E3Q==} cpu: [x64] os: [darwin] requiresBuild: true - dev: false optional: true /@rspack/binding-linux-arm64-gnu@1.3.12: @@ -5671,19 +5670,19 @@ packages: dev: false optional: true - /@rspack/binding-linux-arm64-gnu@1.5.2: - resolution: {integrity: sha512-rNxRfgC5khlrhyEP6y93+45uQ4TI7CdtWqh5PKsaR6lPepG1rH4L8VE+etejSdhzXH6wQ76Rw4wzb96Hx+5vuQ==} + /@rspack/binding-linux-arm64-gnu@1.5.5: + resolution: {integrity: sha512-KgVN3TeUJ3iNwwOX3JGY4arvoLHX94eItJ4TeOSyetRiSJUrQI0evP16i5kIh+n+p7mVnXmfUS944Gl+uNsJmg==} cpu: [arm64] os: [linux] requiresBuild: true + dev: false optional: true - /@rspack/binding-linux-arm64-gnu@1.5.5: - resolution: {integrity: sha512-KgVN3TeUJ3iNwwOX3JGY4arvoLHX94eItJ4TeOSyetRiSJUrQI0evP16i5kIh+n+p7mVnXmfUS944Gl+uNsJmg==} + /@rspack/binding-linux-arm64-gnu@1.5.7: + resolution: {integrity: sha512-fwy+NY+0CHrZqqzDrjPBlTuK53W4dG5EEg/QQFAE7KVM+okRqPk8tg45bJ5628rCNLe13GDmPIE107LmgspNqA==} cpu: [arm64] os: [linux] requiresBuild: true - dev: false optional: true /@rspack/binding-linux-arm64-musl@1.3.12: @@ -5694,19 +5693,19 @@ packages: dev: false optional: true - /@rspack/binding-linux-arm64-musl@1.5.2: - resolution: {integrity: sha512-kTFX+KsGgArWC5q+jJWz0K/8rfVqZOn1ojv1xpCCcz/ogWRC/qhDGSOva6Wandh157BiR93Vfoe1gMvgjpLe5g==} + /@rspack/binding-linux-arm64-musl@1.5.5: + resolution: {integrity: sha512-1gKthlCQinXtWar6Hl9Il6BQ/NgYBH0NVuUsjjf85ejD/cTPQENKyIpGvVa1rSIHSfnG/XujUbruHAeY9mEHCA==} cpu: [arm64] os: [linux] requiresBuild: true + dev: false optional: true - /@rspack/binding-linux-arm64-musl@1.5.5: - resolution: {integrity: sha512-1gKthlCQinXtWar6Hl9Il6BQ/NgYBH0NVuUsjjf85ejD/cTPQENKyIpGvVa1rSIHSfnG/XujUbruHAeY9mEHCA==} + /@rspack/binding-linux-arm64-musl@1.5.7: + resolution: {integrity: sha512-576u/0F4ZUzpHckFme4vQ0sSxjE+B/gVP4tNJ+P6bJaclXLFXV4icbjTUQwOIgmA1EQz/JFeKGGJZ4p6mowpBQ==} cpu: [arm64] os: [linux] requiresBuild: true - dev: false optional: true /@rspack/binding-linux-x64-gnu@1.3.12: @@ -5717,19 +5716,19 @@ packages: dev: false optional: true - /@rspack/binding-linux-x64-gnu@1.5.2: - resolution: {integrity: sha512-Lh/6WZGq30lDV6RteQQu7Phw0RH2Z1f4kGR+MsplJ6X4JpnziDow+9oxKdu6FvFHWxHByncpveVeInusQPmL7Q==} + /@rspack/binding-linux-x64-gnu@1.5.5: + resolution: {integrity: sha512-haPFg4M9GwpSI5g9BQhKUNdzCKDvFexIUkLiAHBjFU9iWQTEcI9VfYPixestOIwzUv7E34rHM+jAsmRGWdgmXw==} cpu: [x64] os: [linux] requiresBuild: true + dev: false optional: true - /@rspack/binding-linux-x64-gnu@1.5.5: - resolution: {integrity: sha512-haPFg4M9GwpSI5g9BQhKUNdzCKDvFexIUkLiAHBjFU9iWQTEcI9VfYPixestOIwzUv7E34rHM+jAsmRGWdgmXw==} + /@rspack/binding-linux-x64-gnu@1.5.7: + resolution: {integrity: sha512-brSHywXjjeuWkv0ywgxS4VgDgquarEb4XGr+eXhOaPcc8x2rNefyc4hErplrI7+oxPXVuGK5VE4ZH5bj3Yknvg==} cpu: [x64] os: [linux] requiresBuild: true - dev: false optional: true /@rspack/binding-linux-x64-musl@1.3.12: @@ -5740,36 +5739,36 @@ packages: dev: false optional: true - /@rspack/binding-linux-x64-musl@1.5.2: - resolution: {integrity: sha512-CsLC/SIOIFs6CBmusSAF0FECB62+J36alMdwl7j6TgN6nX3UQQapnL1aVWuQaxU6un/1Vpim0V/EZbUYIdJQ4g==} + /@rspack/binding-linux-x64-musl@1.5.5: + resolution: {integrity: sha512-oUny56JEkCZvIu4n8/P7IPLPNtJnL89EDhxHINH87XLBY3OOgo8JHELR11Zj9SFWiGNsRcLqi+Q78tWa0ligBQ==} cpu: [x64] os: [linux] requiresBuild: true + dev: false optional: true - /@rspack/binding-linux-x64-musl@1.5.5: - resolution: {integrity: sha512-oUny56JEkCZvIu4n8/P7IPLPNtJnL89EDhxHINH87XLBY3OOgo8JHELR11Zj9SFWiGNsRcLqi+Q78tWa0ligBQ==} + /@rspack/binding-linux-x64-musl@1.5.7: + resolution: {integrity: sha512-HcS0DzbLlWCwVfYcWMbTgILh4GELD6m4CZoFEhIr4fJCJi0p8NgLYycy1QtDhaUjs8TKalmyMwHrJwGnD141JA==} cpu: [x64] os: [linux] requiresBuild: true - dev: false optional: true - /@rspack/binding-wasm32-wasi@1.5.2: - resolution: {integrity: sha512-cuVbGr1b4q0Z6AtEraI3becZraPMMgZtZPRaIsVLeDXCmxup/maSAR3T6UaGf4Q2SNcFfjw4neGz5UJxPK8uvA==} + /@rspack/binding-wasm32-wasi@1.5.5: + resolution: {integrity: sha512-tRgxBgIXaBKBH/0KlwvyqbIMqQrg8jKOyFOEQseEE7Oqs2M9KkJ7Vp5QN11u3NvZ9nz5GbZxmVGBMkdj9Gth1w==} cpu: [wasm32] requiresBuild: true dependencies: '@napi-rs/wasm-runtime': 1.0.5 + dev: false optional: true - /@rspack/binding-wasm32-wasi@1.5.5: - resolution: {integrity: sha512-tRgxBgIXaBKBH/0KlwvyqbIMqQrg8jKOyFOEQseEE7Oqs2M9KkJ7Vp5QN11u3NvZ9nz5GbZxmVGBMkdj9Gth1w==} + /@rspack/binding-wasm32-wasi@1.5.7: + resolution: {integrity: sha512-uTRUEuK+TVlvUBSWXVoxD+6JTN+rvtRqVlO+A7I7VnOY7p9Rpvk1sXcHtEwg/XuDCq4DALnvlzbFLh7G3zILvw==} cpu: [wasm32] requiresBuild: true dependencies: '@napi-rs/wasm-runtime': 1.0.5 - dev: false optional: true /@rspack/binding-win32-arm64-msvc@1.3.12: @@ -5780,19 +5779,19 @@ packages: dev: false optional: true - /@rspack/binding-win32-arm64-msvc@1.5.2: - resolution: {integrity: sha512-4vJQdzRTSuvmvL3vrOPuiA7f9v9frNc2RFWDxqg+GYt0YAjDStssp+lkVbRYyXnTYVJkARSuO6N+BOiI+kLdsQ==} + /@rspack/binding-win32-arm64-msvc@1.5.5: + resolution: {integrity: sha512-wGWd2yluoFdQgtkIbny6FoHnzahTk+o9RzrptjeS1u/NV1lKrWzmWhwZojMGOUqPiaukZKaziOEo7gpRn2XbEQ==} cpu: [arm64] os: [win32] requiresBuild: true + dev: false optional: true - /@rspack/binding-win32-arm64-msvc@1.5.5: - resolution: {integrity: sha512-wGWd2yluoFdQgtkIbny6FoHnzahTk+o9RzrptjeS1u/NV1lKrWzmWhwZojMGOUqPiaukZKaziOEo7gpRn2XbEQ==} + /@rspack/binding-win32-arm64-msvc@1.5.7: + resolution: {integrity: sha512-dFHrXRUmMTkxEn/Uw2RLbIckKfi0Zmn2NnEXwedWdyRgZW4Vhk7+VBxM22O/CHZmAGt12Ol25yTuVv58ANLEKA==} cpu: [arm64] os: [win32] requiresBuild: true - dev: false optional: true /@rspack/binding-win32-ia32-msvc@1.3.12: @@ -5803,19 +5802,19 @@ packages: dev: false optional: true - /@rspack/binding-win32-ia32-msvc@1.5.2: - resolution: {integrity: sha512-zPbu3lx/NrNxdjZzTIjwD0mILUOpfhuPdUdXIFiOAO8RiWSeQpYOvyI061s/+bNOmr4A+Z0uM0dEoOClfkhUFg==} + /@rspack/binding-win32-ia32-msvc@1.5.5: + resolution: {integrity: sha512-Ikml8AQkzjPCG24vTO4pG2bpJ8vp93jVEgo9X9uYjO2vQbIp5QSOmeZOTM7tXCf8AfTfHEF/yAdE/pR/+tXXGQ==} cpu: [ia32] os: [win32] requiresBuild: true + dev: false optional: true - /@rspack/binding-win32-ia32-msvc@1.5.5: - resolution: {integrity: sha512-Ikml8AQkzjPCG24vTO4pG2bpJ8vp93jVEgo9X9uYjO2vQbIp5QSOmeZOTM7tXCf8AfTfHEF/yAdE/pR/+tXXGQ==} + /@rspack/binding-win32-ia32-msvc@1.5.7: + resolution: {integrity: sha512-PNtnOIUzE9p/Fbl6l/1Zs7bhn8ccTlaHTgZgQq0sO/QxjLlbU0WPjRl+YLo27cAningSOAbANuYlN8vAcuimrw==} cpu: [ia32] os: [win32] requiresBuild: true - dev: false optional: true /@rspack/binding-win32-x64-msvc@1.3.12: @@ -5826,19 +5825,19 @@ packages: dev: false optional: true - /@rspack/binding-win32-x64-msvc@1.5.2: - resolution: {integrity: sha512-duLNUTshX38xhC10/W9tpkPca7rOifP2begZjdb1ikw7C4AI0I7VnBnYt8qPSxGISoclmhOBxU/LuAhS8jMMlg==} + /@rspack/binding-win32-x64-msvc@1.5.5: + resolution: {integrity: sha512-m2059ms0i/GIQGWTlZ5GI6SWpuMFAPMsWlhXLk2LZRIydhi+N/YPkmc33lFRTlDA3QpKDCvowvCvIIA7g6WSlg==} cpu: [x64] os: [win32] requiresBuild: true + dev: false optional: true - /@rspack/binding-win32-x64-msvc@1.5.5: - resolution: {integrity: sha512-m2059ms0i/GIQGWTlZ5GI6SWpuMFAPMsWlhXLk2LZRIydhi+N/YPkmc33lFRTlDA3QpKDCvowvCvIIA7g6WSlg==} + /@rspack/binding-win32-x64-msvc@1.5.7: + resolution: {integrity: sha512-22gTaYkwaIUvyXRxf1RVnFTJPqF2hD1pgAQNBIz7kYybe6vvSZ6KInW4WyG4vjYKrJg/cbS4QvtlLn0lYXrdIw==} cpu: [x64] os: [win32] requiresBuild: true - dev: false optional: true /@rspack/binding@1.3.12: @@ -5855,20 +5854,6 @@ packages: '@rspack/binding-win32-x64-msvc': 1.3.12 dev: false - /@rspack/binding@1.5.2: - resolution: {integrity: sha512-NKiBcsxmAzFDYRnK2ZHWbTtDFVT5/704eK4OfpgsDXPMkaMnBKijMKNgP5pbe18X4rUlz+8HnGm4+Xllo9EESw==} - optionalDependencies: - '@rspack/binding-darwin-arm64': 1.5.2 - '@rspack/binding-darwin-x64': 1.5.2 - '@rspack/binding-linux-arm64-gnu': 1.5.2 - '@rspack/binding-linux-arm64-musl': 1.5.2 - '@rspack/binding-linux-x64-gnu': 1.5.2 - '@rspack/binding-linux-x64-musl': 1.5.2 - '@rspack/binding-wasm32-wasi': 1.5.2 - '@rspack/binding-win32-arm64-msvc': 1.5.2 - '@rspack/binding-win32-ia32-msvc': 1.5.2 - '@rspack/binding-win32-x64-msvc': 1.5.2 - /@rspack/binding@1.5.5: resolution: {integrity: sha512-JkB943uBU0lABnKG/jdO+gg3/eeO9CEQMR/1dL6jSU9GTxaNf3XIVc05RhRC7qoVsiXuhSMMFxWyV0hyHxp2bA==} optionalDependencies: @@ -5884,6 +5869,20 @@ packages: '@rspack/binding-win32-x64-msvc': 1.5.5 dev: false + /@rspack/binding@1.5.7: + resolution: {integrity: sha512-/fFrf4Yu8Tc0yXBw33g2++turdld1MDphLiLg05bx92fOVI1MafocwPvm35e3y1z7CtlQJ2Bmvzhi6APJShKxg==} + optionalDependencies: + '@rspack/binding-darwin-arm64': 1.5.7 + '@rspack/binding-darwin-x64': 1.5.7 + '@rspack/binding-linux-arm64-gnu': 1.5.7 + '@rspack/binding-linux-arm64-musl': 1.5.7 + '@rspack/binding-linux-x64-gnu': 1.5.7 + '@rspack/binding-linux-x64-musl': 1.5.7 + '@rspack/binding-wasm32-wasi': 1.5.7 + '@rspack/binding-win32-arm64-msvc': 1.5.7 + '@rspack/binding-win32-ia32-msvc': 1.5.7 + '@rspack/binding-win32-x64-msvc': 1.5.7 + /@rspack/core@1.3.12(@swc/helpers@0.5.17): resolution: {integrity: sha512-mAPmV4LPPRgxpouUrGmAE4kpF1NEWJGyM5coebsjK/zaCMSjw3mkdxiU2b5cO44oIi0Ifv5iGkvwbdrZOvMyFA==} engines: {node: '>=16.0.0'} @@ -5900,8 +5899,8 @@ packages: caniuse-lite: 1.0.30001736 dev: false - /@rspack/core@1.5.2(@swc/helpers@0.5.17): - resolution: {integrity: sha512-ifjHqLczC81d1xjXPXCzxTFKNOFsEzuuLN44cMnyzQ/GWi4B48fyX7JHndWE7Lxd54cW1O9Ik7AdBN3Gq891EA==} + /@rspack/core@1.5.5(@swc/helpers@0.5.17): + resolution: {integrity: sha512-AOIuMktK6X/xHAjJ/0QJ2kbSkILXj641GCPE+EOfWO27ODA8fHPArKbyz5AVGVePV3aUfEo2VFcsNzP67VBEPA==} engines: {node: '>=18.12.0'} peerDependencies: '@swc/helpers': '>=0.5.1' @@ -5910,12 +5909,13 @@ packages: optional: true dependencies: '@module-federation/runtime-tools': 0.18.0 - '@rspack/binding': 1.5.2 + '@rspack/binding': 1.5.5 '@rspack/lite-tapable': 1.0.1 '@swc/helpers': 0.5.17 + dev: false - /@rspack/core@1.5.5(@swc/helpers@0.5.17): - resolution: {integrity: sha512-AOIuMktK6X/xHAjJ/0QJ2kbSkILXj641GCPE+EOfWO27ODA8fHPArKbyz5AVGVePV3aUfEo2VFcsNzP67VBEPA==} + /@rspack/core@1.5.7(@swc/helpers@0.5.17): + resolution: {integrity: sha512-57ey3wafK/g+B9zLdCiIrX3eTK8rFEM3yvxBUb2ro3ZtAaCGm4y7xERcXZJNn4D01pjzzCJ/u1ezpQmsZYLP7A==} engines: {node: '>=18.12.0'} peerDependencies: '@swc/helpers': '>=0.5.1' @@ -5924,10 +5924,9 @@ packages: optional: true dependencies: '@module-federation/runtime-tools': 0.18.0 - '@rspack/binding': 1.5.5 + '@rspack/binding': 1.5.7 '@rspack/lite-tapable': 1.0.1 '@swc/helpers': 0.5.17 - dev: false /@rspack/dev-server@1.1.4(@rspack/core@1.5.5)(webpack@5.101.3): resolution: {integrity: sha512-kGHYX2jYf3ZiHwVl0aUEPBOBEIG1aWleCDCAi+Jg32KUu3qr/zDUpCEd0wPuHfLEgk0X0xAEYCS6JMO7nBStNQ==} @@ -13304,6 +13303,11 @@ packages: /jiti@2.5.1: resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} hasBin: true + dev: false + + /jiti@2.6.0: + resolution: {integrity: sha512-VXe6RjJkBPj0ohtqaO8vSWP3ZhAKo66fKrFNCll4BTcwljPLz03pCbaNKfzGP5MbrCYcbJ7v0nOYYwUzTEIdXQ==} + hasBin: true /joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} @@ -13391,6 +13395,7 @@ packages: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true + dev: false /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -13879,6 +13884,7 @@ packages: resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + dev: false /make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} @@ -17645,8 +17651,8 @@ packages: fsevents: 2.3.3 dev: true - /rsbuild-plugin-dts@0.13.2(@rsbuild/core@1.5.4)(typescript@5.9.2): - resolution: {integrity: sha512-Tw88Jl6eqhUcI9JLFXGCaw4Oiqe1IfD7rbLWvV9OPJwsRdV129WJ4ccnI0x7tDpnLDV0xhW/+b/9wGyK28jSgg==} + /rsbuild-plugin-dts@0.14.0(@rsbuild/core@1.5.12)(typescript@5.9.2): + resolution: {integrity: sha512-PHnixNk1mLYEa5VFz3cx9AvqCuU8I+FlENpl2AY2X0E9kND7ZIAmZKhzArIT6KLSJLpiYp3ZNnXyBGpGP7KJmQ==} engines: {node: '>=18.12.0'} peerDependencies: '@microsoft/api-extractor': ^7 @@ -17662,11 +17668,7 @@ packages: optional: true dependencies: '@ast-grep/napi': 0.37.0 - '@rsbuild/core': 1.5.4 - magic-string: 0.30.19 - picocolors: 1.1.1 - tinyglobby: 0.2.15 - tsconfig-paths: 4.2.0 + '@rsbuild/core': 1.5.12 typescript: 5.9.2 dev: true @@ -18866,6 +18868,7 @@ packages: /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + dev: false /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} @@ -19337,14 +19340,6 @@ packages: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - /tinyglobby@0.2.15: - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} - engines: {node: '>=12.0.0'} - dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - dev: true - /tmp@0.2.5: resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} engines: {node: '>=14.14'} @@ -19511,6 +19506,7 @@ packages: json5: 2.2.3 minimist: 1.2.8 strip-bom: 3.0.0 + dev: false /tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}