vscode extension: use new debug terminal provider (#15801)

Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
This commit is contained in:
Michael H
2024-12-17 12:29:12 +11:00
committed by GitHub
parent e8b85cff40
commit f2d955f686
2 changed files with 79 additions and 4 deletions

View File

@@ -64,8 +64,11 @@ export function registerDebugger(context: vscode.ExtensionContext, factory?: vsc
vscode.DebugConfigurationProviderTriggerKind.Dynamic,
),
vscode.debug.registerDebugAdapterDescriptorFactory("bun", factory ?? new InlineDebugAdapterFactory()),
vscode.window.onDidOpenTerminal(injectDebugTerminal),
);
if (getConfig("debugTerminal.enabled")) {
injectDebugTerminal2().then(context.subscriptions.push)
}
}
function runFileCommand(resource?: vscode.Uri): void {
@@ -94,8 +97,6 @@ function debugFileCommand(resource?: vscode.Uri) {
}
async function injectDebugTerminal(terminal: vscode.Terminal): Promise<void> {
if (!getConfig("debugTerminal.enabled")) return;
const { name, creationOptions } = terminal;
if (name !== "JavaScript Debug Terminal") {
return;
@@ -134,6 +135,41 @@ async function injectDebugTerminal(terminal: vscode.Terminal): Promise<void> {
setTimeout(() => terminal.dispose(), 100);
}
async function injectDebugTerminal2() {
const jsDebugExt = vscode.extensions.getExtension('ms-vscode.js-debug-nightly') || vscode.extensions.getExtension('ms-vscode.js-debug');
if (!jsDebugExt) {
return vscode.window.onDidOpenTerminal(injectDebugTerminal)
}
await jsDebugExt.activate()
const jsDebug: import('@vscode/js-debug').IExports = jsDebugExt.exports;
if (!jsDebug) {
return vscode.window.onDidOpenTerminal(injectDebugTerminal)
}
return jsDebug.registerDebugTerminalOptionsProvider({
async provideTerminalOptions(options) {
const session = new TerminalDebugSession();
await session.initialize();
const { adapter, signal } = session;
const stopOnEntry = getConfig("debugTerminal.stopOnEntry") === true;
const query = stopOnEntry ? "break=1" : "wait=1";
return {
...options,
env: {
...options.env,
"BUN_INSPECT": `${adapter.url}?${query}`,
"BUN_INSPECT_NOTIFY": signal.url,
BUN_INSPECT_CONNECT_TO: " ",
},
};
},
});
}
class DebugConfigurationProvider implements vscode.DebugConfigurationProvider {
provideDebugConfigurations(folder?: vscode.WorkspaceFolder): vscode.ProviderResult<vscode.DebugConfiguration[]> {
return [DEBUG_CONFIGURATION, RUN_CONFIGURATION, ATTACH_CONFIGURATION];
@@ -295,7 +331,7 @@ class FileDebugSession extends DebugSession {
}
this.adapter.on("Adapter.reverseRequest", ({ command, arguments: args }) =>
this.sendRequest(command, args, 5000, () => {}),
this.sendRequest(command, args, 5000, () => { }),
);
adapters.set(url, this);

View File

@@ -0,0 +1,39 @@
/*---------------------------------------------------------
* Copyright (C) Microsoft Corporation. All rights reserved.
*--------------------------------------------------------*/
declare module '@vscode/js-debug' {
import type * as vscode from 'vscode';
/** @see {IExports.registerDebugTerminalOptionsProvider} */
export interface IDebugTerminalOptionsProvider {
/**
* Called when the user creates a JavaScript Debug Terminal. It's called
* with the options js-debug wants to use to create the terminal. It should
* modify and return the options to use in the terminal.
*
* In order to avoid conflicting with existing logic, participants should
* try to modify options in a additive way. For example prefer appending
* to rather than reading and overwriting `options.env.PATH`.
*/
provideTerminalOptions(options: vscode.TerminalOptions): vscode.ProviderResult<vscode.TerminalOptions>;
}
/**
* Defines the exports of the `js-debug` extension. Once you have this typings
* file, these can be acquired in your extension using the following code:
*
* ```
* const jsDebugExt = vscode.extensions.getExtension('ms-vscode.js-debug-nightly')
* || vscode.extensions.getExtension('ms-vscode.js-debug');
* await jsDebugExt.activate()
* const jsDebug: import('@vscode/js-debug').IExports = jsDebug.exports;
* ```
*/
export interface IExports {
/**
* Registers a participant used when the user creates a JavaScript Debug Terminal.
*/
registerDebugTerminalOptionsProvider(provider: IDebugTerminalOptionsProvider): vscode.Disposable;
}
}