From a5b6ead43eaf84cefe56eade815062044b50242a Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Thu, 13 Aug 2026 21:19:32 -0400 Subject: [PATCH] perf(util): load npm config lazily (#42458) --- packages/util/src/npm-config.ts | 9 +++++---- packages/workerd-spike/vitest.config.ts | 6 ++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/util/src/npm-config.ts b/packages/util/src/npm-config.ts index 9976348ed7..e0ef886d48 100644 --- a/packages/util/src/npm-config.ts +++ b/packages/util/src/npm-config.ts @@ -1,15 +1,16 @@ export * as NpmConfig from "./npm-config.js" import { fileURLToPath } from "url" -// @ts-expect-error npm does not publish types for this internal config API. -import Config from "@npmcli/config" -// @ts-expect-error npm does not publish types for this internal config API. -import { definitions, flatten, nerfDarts, shorthands } from "@npmcli/config/lib/definitions/index.js" import { Effect } from "effect" export const load = (dir: string) => Effect.tryPromise({ try: async () => { + // @ts-expect-error npm does not publish types for this internal config API. + const { default: Config } = await import("@npmcli/config") + // @ts-expect-error npm does not publish types for this internal config API. + const { default: npmDefinitions } = await import("@npmcli/config/lib/definitions/index.js") + const { definitions, flatten, nerfDarts, shorthands } = npmDefinitions const config = new Config({ // Resolved per call: on workerd import.meta.url is undefined and building // this URL at module scope fails startup validation; npm config never runs there. diff --git a/packages/workerd-spike/vitest.config.ts b/packages/workerd-spike/vitest.config.ts index a924bf18a6..044a057938 100644 --- a/packages/workerd-spike/vitest.config.ts +++ b/packages/workerd-spike/vitest.config.ts @@ -51,10 +51,8 @@ export default defineWorkersConfig({ // mime-types requires mime-db's JSON database at require time; keep the // lookup surface but back it with a static shim. { find: /^mime-types$/, replacement: new URL("./test/shims/mime-types.mjs", import.meta.url).pathname }, - // util/npm.ts imports the npm toolchain at module scope; plugin installs - // never happen in the workerd profile (plugin discovery is precompiled-only), - // and @npmcli/config touches process.stdout.isTTY during module init. - { find: /^@npmcli\/config(\/.*)?$/, replacement: mockProxy }, + // Plugin installs never happen in the workerd profile (plugin discovery + // is precompiled-only), so mock the package installation toolchain. { find: /^@npmcli\/arborist(\/.*)?$/, replacement: mockProxy }, { find: /^pacote(\/.*)?$/, replacement: mockProxy }, ],