diff --git a/extensions/debug-server-ready/package.json b/extensions/debug-server-ready/package.json index fdfe45b73b8..65efcdc09f3 100644 --- a/extensions/debug-server-ready/package.json +++ b/extensions/debug-server-ready/package.json @@ -158,6 +158,50 @@ "default": false } } + }, + { + "type": "object", + "additionalProperties": false, + "markdownDescription": "%debug.server.ready.serverReadyAction.description%", + "default": { + "action": "startDebugging", + "config": { + "type": "node", + "request": "launch" + }, + "killOnServerStop": false + }, + "required": [ + "config" + ], + "properties": { + "action": { + "type": "string", + "enum": [ + "startDebugging" + ], + "enumDescriptions": [ + "%debug.server.ready.action.startDebugging.description%" + ], + "markdownDescription": "%debug.server.ready.action.description%", + "default": "startDebugging" + }, + "pattern": { + "type": "string", + "markdownDescription": "%debug.server.ready.pattern.description%", + "default": "listening on port ([0-9]+)" + }, + "config": { + "type": "object", + "markdownDescription": "%debug.server.ready.debugConfig.description%", + "default": {} + }, + "killOnServerStop": { + "type": "boolean", + "markdownDescription": "%debug.server.ready.killOnServerStop.description%", + "default": false + } + } } ] } diff --git a/extensions/debug-server-ready/package.nls.json b/extensions/debug-server-ready/package.nls.json index 45169b0095b..6fa9d3a7630 100644 --- a/extensions/debug-server-ready/package.nls.json +++ b/extensions/debug-server-ready/package.nls.json @@ -8,6 +8,7 @@ "debug.server.ready.action.debugWithChrome.description": "Start debugging with the 'Debugger for Chrome'.", "debug.server.ready.action.startDebugging.description": "Run another launch configuration.", "debug.server.ready.pattern.description": "Server is ready if this pattern appears on the debug console. The first capture group must include a URI or a port number.", + "debug.server.ready.debugConfig.description": "The debug configuration to run.", "debug.server.ready.uriFormat.description": "A format string used when constructing the URI from a port number. The first '%s' is substituted with the port number.", "debug.server.ready.webRoot.description": "Value passed to the debug configuration for the 'Debugger for Chrome'.", "debug.server.ready.killOnServerStop.description": "Stop the child session when the parent session stopped.", diff --git a/extensions/debug-server-ready/src/extension.ts b/extensions/debug-server-ready/src/extension.ts index df5c8521c09..b3525281111 100644 --- a/extensions/debug-server-ready/src/extension.ts +++ b/extensions/debug-server-ready/src/extension.ts @@ -18,6 +18,7 @@ interface ServerReadyAction { uriFormat?: string; webRoot?: string; name?: string; + config?: vscode.DebugConfiguration; killOnServerStop?: boolean; } @@ -194,7 +195,11 @@ class ServerReadyDetector extends vscode.Disposable { break; case 'startDebugging': - await this.startNamedDebugSession(session, args.name || 'unspecified'); + if (args.config) { + await this.startDebugSession(session, args.config.name, args.config); + } else { + await this.startDebugSession(session, args.name || 'unspecified'); + } break; default: @@ -246,17 +251,24 @@ class ServerReadyDetector extends vscode.Disposable { }); } - private async startNamedDebugSession(session: vscode.DebugSession, name: string) { + /** + * Starts a debug session given a debug configuration name (saved in launch.json) or a debug configuration object. + * + * @param session The parent debugSession + * @param name The name of the configuration to launch. If config it set, it assumes it is the same as config.name. + * @param config [Optional] Instead of starting a debug session by debug configuration name, use a debug configuration object instead. + */ + private async startDebugSession(session: vscode.DebugSession, name: string, config?: vscode.DebugConfiguration) { const args = session.configuration.serverReadyAction as ServerReadyAction; if (!args.killOnServerStop) { - await vscode.debug.startDebugging(session.workspaceFolder, name); + await vscode.debug.startDebugging(session.workspaceFolder, config ?? name); return; } const cts = new vscode.CancellationTokenSource(); const newSessionPromise = this.catchStartedDebugSession(x => x.name === name, cts.token); - if (!await vscode.debug.startDebugging(session.workspaceFolder, name)) { + if (!await vscode.debug.startDebugging(session.workspaceFolder, config ?? name)) { cts.cancel(); cts.dispose(); return;