From d70e74afdee6db05980763680420cb46540028ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=A2=A8?= Date: Mon, 27 Apr 2026 08:17:52 +0000 Subject: [PATCH] fix: suppress ExperimentalWarning for node:sqlite (#179) Add side-effect module in @uncaged/nerve-core that filters ExperimentalWarning from process.emit. Imported at all entry points: CLI, daemon bootstrap, sense-worker, and workflow-worker. --- packages/cli/src/cli.ts | 2 ++ packages/cli/src/daemon-bootstrap.ts | 2 ++ packages/core/package.json | 11 +++++++++ packages/core/rslib.config.ts | 1 + .../src/experimental-warning-suppression.ts | 23 +++++++++++++++++++ packages/daemon/src/sense-worker.ts | 2 ++ packages/daemon/src/workflow-worker.ts | 2 ++ pnpm-lock.yaml | 5 +++- 8 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 packages/core/src/experimental-warning-suppression.ts diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index 1d68e5b..714e7d4 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -1,3 +1,5 @@ +import "@uncaged/nerve-core/experimental-warning-suppression.js"; + import { defineCommand, runMain } from "citty"; import { consumeGlobalDaemonCliFlags } from "./cli-global.js"; diff --git a/packages/cli/src/daemon-bootstrap.ts b/packages/cli/src/daemon-bootstrap.ts index 042d568..d9d8278 100644 --- a/packages/cli/src/daemon-bootstrap.ts +++ b/packages/cli/src/daemon-bootstrap.ts @@ -1,3 +1,5 @@ +import "@uncaged/nerve-core/experimental-warning-suppression.js"; + import { runForegroundKernelSession } from "./run-foreground-kernel.js"; import { loadDaemonModule } from "./workspace-daemon.js"; diff --git a/packages/core/package.json b/packages/core/package.json index d767b0e..ae462bf 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -3,6 +3,16 @@ "version": "0.4.0", "type": "module", "main": "dist/index.js", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "./experimental-warning-suppression.js": { + "types": "./dist/experimental-warning-suppression.d.ts", + "default": "./dist/experimental-warning-suppression.js" + } + }, "files": ["dist"], "publishConfig": { "access": "public" @@ -18,6 +28,7 @@ }, "devDependencies": { "@rslib/core": "^0.21.3", + "@types/node": "^22.0.0", "vitest": "^4.1.5" } } diff --git a/packages/core/rslib.config.ts b/packages/core/rslib.config.ts index 87bb8a3..df90ec7 100644 --- a/packages/core/rslib.config.ts +++ b/packages/core/rslib.config.ts @@ -10,6 +10,7 @@ export default defineConfig({ source: { entry: { index: "src/index.ts", + "experimental-warning-suppression": "src/experimental-warning-suppression.ts", }, }, output: { diff --git a/packages/core/src/experimental-warning-suppression.ts b/packages/core/src/experimental-warning-suppression.ts new file mode 100644 index 0000000..f33086d --- /dev/null +++ b/packages/core/src/experimental-warning-suppression.ts @@ -0,0 +1,23 @@ +/** + * Patches `process.emit` so `ExperimentalWarning` (e.g. from `node:sqlite`) is not + * forwarded to the default handler. Other warning types are unchanged. + * + * Import this module before any code that loads `node:sqlite`. + */ + +const WARNING_EVENT = "warning"; +const EXPERIMENTAL_WARNING_NAME = "ExperimentalWarning"; + +type EmitFn = typeof process.emit; + +const originalEmit = process.emit.bind(process) as EmitFn; + +process.emit = ((event: string | symbol, ...args: unknown[]): boolean => { + if (event === WARNING_EVENT) { + const w = args[0]; + if (w instanceof Error && w.name === EXPERIMENTAL_WARNING_NAME) { + return false; + } + } + return Reflect.apply(originalEmit, process, [event, ...args]) as boolean; +}) as EmitFn; diff --git a/packages/daemon/src/sense-worker.ts b/packages/daemon/src/sense-worker.ts index 191cc78..7beb4cb 100644 --- a/packages/daemon/src/sense-worker.ts +++ b/packages/daemon/src/sense-worker.ts @@ -14,6 +14,8 @@ * nerve.yaml ← config */ +import "@uncaged/nerve-core/experimental-warning-suppression.js"; + import { readFileSync } from "node:fs"; import { join, resolve } from "node:path"; diff --git a/packages/daemon/src/workflow-worker.ts b/packages/daemon/src/workflow-worker.ts index a9ef414..1299800 100644 --- a/packages/daemon/src/workflow-worker.ts +++ b/packages/daemon/src/workflow-worker.ts @@ -9,6 +9,8 @@ * workflows//index.ts (or .js) ← user workflow definition */ +import "@uncaged/nerve-core/experimental-warning-suppression.js"; + import { existsSync } from "node:fs"; import { join, resolve } from "node:path"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8e02bdf..82a7e15 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -58,9 +58,12 @@ importers: '@rslib/core': specifier: ^0.21.3 version: 0.21.3(typescript@5.9.3) + '@types/node': + specifier: ^22.0.0 + version: 22.19.17 vitest: specifier: ^4.1.5 - version: 4.1.5(@types/node@25.6.0)(vite@8.0.9(@types/node@25.6.0)(esbuild@0.27.7)(yaml@2.8.3)) + version: 4.1.5(@types/node@22.19.17)(vite@8.0.9(@types/node@22.19.17)(esbuild@0.27.7)(yaml@2.8.3)) packages/daemon: dependencies: -- 2.43.0