fix: clean up ChildProcess type workaround in CLI

Replace ugly `as unknown as EventEmitter` casts with a proper
type alias `Process = ChildProcess & NodeJS.EventEmitter`.
@types/node@25 removed .on() from ChildProcess class declaration
even though it extends EventEmitter at runtime.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Yunfei He
2026-05-25 23:34:49 +08:00
parent 5e54e5742d
commit 3565c5dfb5
4 changed files with 32 additions and 25 deletions
+1
View File
@@ -25,6 +25,7 @@
"vite": "catalog:"
},
"devDependencies": {
"@types/node": "catalog:",
"vite-plus": "catalog:"
}
}
+9 -6
View File
@@ -1,5 +1,4 @@
import { spawn, type ChildProcess } from "node:child_process";
import type { EventEmitter } from "node:events";
import type { Logger } from "./logger.ts";
export interface ProcessManagerOptions {
@@ -27,8 +26,12 @@ for (const method of ["log", "info", "warn", "error", "debug"]) {
}
`)}`;
// @types/node@25 removed .on() from the ChildProcess class declaration
// even though it extends EventEmitter at runtime. This wrapper restores it.
type Process = ChildProcess & NodeJS.EventEmitter;
export function createProcessManager(options: ProcessManagerOptions) {
let child: ChildProcess | null = null;
let child: Process | null = null;
let currentBundlePath = options.bundlePath;
function doSpawn() {
@@ -41,22 +44,22 @@ export function createProcessManager(options: ProcessManagerOptions) {
VUE_TUI_DEV: "1",
VUE_TUI_HMR_PORT: String(options.hmrPort),
},
});
}) as Process;
child = proc;
(proc as unknown as EventEmitter).on("exit", (code: number | null) => {
proc.on("exit", (code: number | null) => {
options.logger.mode = "stdout";
child = null;
options.onExit?.(code);
});
}
function waitForExit(proc: ChildProcess, timeout: number): Promise<void> {
function waitForExit(proc: Process, timeout: number): Promise<void> {
return new Promise((resolve) => {
const timer = setTimeout(() => {
resolve();
}, timeout);
(proc as unknown as EventEmitter).on("exit", () => {
proc.on("exit", () => {
clearTimeout(timer);
resolve();
});
+21 -18
View File
@@ -7,7 +7,7 @@ settings:
catalogs:
default:
'@types/node':
specifier: ^24
specifier: ^24.12.4
version: 24.12.4
'@vitejs/plugin-vue-jsx':
specifier: ^5.1.5
@@ -129,11 +129,14 @@ importers:
dependencies:
vite:
specifier: npm:@voidzero-dev/vite-plus-core@latest
version: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(typescript@6.0.3)'
version: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@24.12.4)(typescript@6.0.3)'
devDependencies:
'@types/node':
specifier: 'catalog:'
version: 24.12.4
vite-plus:
specifier: 'catalog:'
version: 0.1.22(@types/node@25.9.1)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(typescript@6.0.3))(typescript@6.0.3)
version: 0.1.22(@types/node@24.12.4)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@24.12.4)(typescript@6.0.3))(typescript@6.0.3)
packages/runtime:
dependencies:
@@ -2163,7 +2166,7 @@ snapshots:
'@types/node-fetch@2.6.13':
dependencies:
'@types/node': 24.12.4
'@types/node': 25.9.1
form-data: 4.0.5
'@types/node@18.19.130':
@@ -2344,11 +2347,11 @@ snapshots:
- utf-8-validate
- yaml
'@voidzero-dev/vite-plus-test@0.1.22(@types/node@25.8.0)(typescript@6.0.3)(vite@8.0.13(@types/node@25.8.0))':
'@voidzero-dev/vite-plus-test@0.1.22(@types/node@24.12.4)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@24.12.4)(typescript@6.0.3))(typescript@6.0.3)':
dependencies:
'@standard-schema/spec': 1.1.0
'@types/chai': 5.2.3
'@voidzero-dev/vite-plus-core': 0.1.22(@types/node@25.8.0)(typescript@6.0.3)
'@voidzero-dev/vite-plus-core': 0.1.22(@types/node@24.12.4)(typescript@6.0.3)
es-module-lexer: 1.7.0
obug: 2.1.1
pixelmatch: 7.2.0
@@ -2358,10 +2361,10 @@ snapshots:
tinybench: 2.9.0
tinyexec: 1.2.2
tinyglobby: 0.2.16
vite: 8.0.13(@types/node@25.8.0)
vite: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@24.12.4)(typescript@6.0.3)'
ws: 8.21.0
optionalDependencies:
'@types/node': 25.8.0
'@types/node': 24.12.4
transitivePeerDependencies:
- '@arethetypeswrong/core'
- '@tsdown/css'
@@ -2384,11 +2387,11 @@ snapshots:
- utf-8-validate
- yaml
'@voidzero-dev/vite-plus-test@0.1.22(@types/node@25.9.1)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(typescript@6.0.3))(typescript@6.0.3)':
'@voidzero-dev/vite-plus-test@0.1.22(@types/node@25.8.0)(typescript@6.0.3)(vite@8.0.13(@types/node@25.8.0))':
dependencies:
'@standard-schema/spec': 1.1.0
'@types/chai': 5.2.3
'@voidzero-dev/vite-plus-core': 0.1.22(@types/node@25.9.1)(typescript@6.0.3)
'@voidzero-dev/vite-plus-core': 0.1.22(@types/node@25.8.0)(typescript@6.0.3)
es-module-lexer: 1.7.0
obug: 2.1.1
pixelmatch: 7.2.0
@@ -2398,10 +2401,10 @@ snapshots:
tinybench: 2.9.0
tinyexec: 1.2.2
tinyglobby: 0.2.16
vite: '@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(typescript@6.0.3)'
vite: 8.0.13(@types/node@25.8.0)
ws: 8.21.0
optionalDependencies:
'@types/node': 25.9.1
'@types/node': 25.8.0
transitivePeerDependencies:
- '@arethetypeswrong/core'
- '@tsdown/css'
@@ -3053,12 +3056,12 @@ snapshots:
- vite
- yaml
vite-plus@0.1.22(@types/node@25.8.0)(typescript@6.0.3)(vite@8.0.13(@types/node@25.8.0)):
vite-plus@0.1.22(@types/node@24.12.4)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@24.12.4)(typescript@6.0.3))(typescript@6.0.3):
dependencies:
'@oxc-project/types': 0.129.0
'@oxlint/plugins': 1.61.0
'@voidzero-dev/vite-plus-core': 0.1.22(@types/node@25.8.0)(typescript@6.0.3)
'@voidzero-dev/vite-plus-test': 0.1.22(@types/node@25.8.0)(typescript@6.0.3)(vite@8.0.13(@types/node@25.8.0))
'@voidzero-dev/vite-plus-core': 0.1.22(@types/node@24.12.4)(typescript@6.0.3)
'@voidzero-dev/vite-plus-test': 0.1.22(@types/node@24.12.4)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@24.12.4)(typescript@6.0.3))(typescript@6.0.3)
oxfmt: 0.48.0
oxlint: 1.63.0(oxlint-tsgolint@0.22.1)
oxlint-tsgolint: 0.22.1
@@ -3102,12 +3105,12 @@ snapshots:
- vite
- yaml
vite-plus@0.1.22(@types/node@25.9.1)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(typescript@6.0.3))(typescript@6.0.3):
vite-plus@0.1.22(@types/node@25.8.0)(typescript@6.0.3)(vite@8.0.13(@types/node@25.8.0)):
dependencies:
'@oxc-project/types': 0.129.0
'@oxlint/plugins': 1.61.0
'@voidzero-dev/vite-plus-core': 0.1.22(@types/node@25.9.1)(typescript@6.0.3)
'@voidzero-dev/vite-plus-test': 0.1.22(@types/node@25.9.1)(@voidzero-dev/vite-plus-core@0.1.22(@types/node@25.9.1)(typescript@6.0.3))(typescript@6.0.3)
'@voidzero-dev/vite-plus-core': 0.1.22(@types/node@25.8.0)(typescript@6.0.3)
'@voidzero-dev/vite-plus-test': 0.1.22(@types/node@25.8.0)(typescript@6.0.3)(vite@8.0.13(@types/node@25.8.0))
oxfmt: 0.48.0
oxlint: 1.63.0(oxlint-tsgolint@0.22.1)
oxlint-tsgolint: 0.22.1
+1 -1
View File
@@ -7,7 +7,7 @@ packages:
catalogMode: prefer
catalog:
"@types/node": ^24
"@types/node": ^24.12.4
typescript: ^5
vite: npm:@voidzero-dev/vite-plus-core@latest
vitest: npm:@voidzero-dev/vite-plus-test@latest