From c2796233bb9242f4480079a8b0f308552955c4da Mon Sep 17 00:00:00 2001 From: Nicolas Hedger Date: Thu, 2 Nov 2023 11:32:19 +0100 Subject: [PATCH] chore: port biomejs/biome#492 --- src/main.ts | 40 +++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/src/main.ts b/src/main.ts index ef86f698..7048d93a 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,6 +1,6 @@ import { type ChildProcess, spawn } from "child_process"; import { type Socket, connect } from "net"; -import { isAbsolute } from "path"; +import { dirname, isAbsolute } from "path"; import { TextDecoder, promisify } from "util"; import { ExtensionContext, @@ -25,6 +25,7 @@ import { StatusBar } from "./statusBar"; import { setContextValue } from "./utils"; import resolveImpl = require("resolve/async"); +import { createRequire } from "module"; import type * as resolve from "resolve"; const resolveAsync = promisify( @@ -243,16 +244,34 @@ async function getWorkspaceDependency( outputChannel: OutputChannel, ): Promise { for (const workspaceFolder of workspace.workspaceFolders) { - const path = Uri.joinPath( - workspaceFolder.uri, - "node_modules", - ".bin", - "biome", - ); + // To resolve the @biomejs/cli-*, which is a transitive dependency of the + // @biomejs/biome package, we need to create a custom require function that + // is scoped to @biomejs/biome. This allows us to reliably resolve the + // package regardless of the package manager used by the user. + try { + const requireFromBiome = createRequire( + require.resolve("@biomejs/biome/package.json", { + paths: [workspaceFolder.uri.fsPath], + }), + ); + const binaryPackage = dirname( + requireFromBiome.resolve( + `@biomejs/cli-${process.platform}-${process.arch}/package.json`, + ), + ); + + const biomePath = Uri.file( + `${binaryPackage}/biome${process.platform === "win32" ? ".exe" : ""}`, + ); - if (await fileExists(path)) { - return path.fsPath; + if (await fileExists(biomePath)) { + return biomePath.fsPath; + } + } catch { + return undefined; } + + return undefined; } window.showWarningMessage( @@ -353,7 +372,6 @@ async function getSocket( ): Promise { const process = spawn(command, ["__print_socket"], { stdio: [null, "pipe", "pipe"], - shell: true, }); const stdout = { content: "" }; @@ -430,4 +448,4 @@ export function deactivate(): Thenable | undefined { return undefined; } return client.stop(); -} +} \ No newline at end of file