npm: enable debugging all scripts

Fixes https://github.com/microsoft/vscode/issues/104403
Fixes https://github.com/microsoft/vscode/issues/102847
This commit is contained in:
Connor Peet 2020-08-10 16:24:39 -07:00
parent e421728150
commit 85b70cc872
No known key found for this signature in database
GPG key ID: CF8FD2EA0DBC61BD
4 changed files with 21 additions and 81 deletions

View file

@ -166,14 +166,9 @@
"when": "view == npm && viewItem == script",
"group": "inline"
},
{
"command": "npm.runScript",
"when": "view == npm && viewItem == debugScript",
"group": "inline"
},
{
"command": "npm.debugScript",
"when": "view == npm && viewItem == debugScript",
"when": "view == npm && viewItem == script",
"group": "inline"
},
{

View file

@ -3,18 +3,19 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { JSONVisitor, visit } from 'jsonc-parser';
import * as path from 'path';
import {
Event, EventEmitter, ExtensionContext, Task2 as Task,
TextDocument, ThemeIcon, TreeDataProvider, TreeItem, TreeItemCollapsibleState, Uri,
WorkspaceFolder, commands, window, workspace, tasks, Selection, TaskGroup
commands, Event, EventEmitter, ExtensionContext,
Selection, Task2 as Task,
TaskGroup, tasks, TextDocument, ThemeIcon, TreeDataProvider, TreeItem, TreeItemCollapsibleState, Uri,
window, workspace, WorkspaceFolder
} from 'vscode';
import { visit, JSONVisitor } from 'jsonc-parser';
import {
NpmTaskDefinition, getPackageJsonUriFromTask, getScripts,
isWorkspaceFolder, getTaskName, createTask, extractDebugArgFromScript, startDebugging, isAutoDetectionEnabled
} from './tasks';
import * as nls from 'vscode-nls';
import {
createTask, getTaskName, isAutoDetectionEnabled, isWorkspaceFolder, NpmTaskDefinition,
startDebugging
} from './tasks';
const localize = nls.loadMessageBundle();
@ -90,9 +91,6 @@ class NpmScript extends TreeItem {
}
};
this.contextValue = 'script';
if (task.group && task.group === TaskGroup.Rebuild) {
this.contextValue = 'debugScript';
}
this.package = packageJson;
this.task = task;
this.command = commandList[command];
@ -139,27 +137,8 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider<TreeItem> {
tasks.executeTask(script.task);
}
private extractDebugArg(scripts: any, task: Task): [string, number] | undefined {
return extractDebugArgFromScript(scripts[task.name]);
}
private async debugScript(script: NpmScript) {
let task = script.task;
let uri = getPackageJsonUriFromTask(task);
let scripts = await getScripts(uri!);
let debugArg = this.extractDebugArg(scripts, task);
if (!debugArg) {
let message = localize('noDebugOptions', 'Could not launch "{0}" for debugging because the scripts lacks a node debug option, e.g. "--inspect-brk".', task.name);
let learnMore = localize('learnMore', 'Learn More');
let ok = localize('ok', 'OK');
let result = await window.showErrorMessage(message, { modal: true }, ok, learnMore);
if (result === learnMore) {
commands.executeCommand('vscode.open', Uri.parse('https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_launch-configuration-support-for-npm-and-other-tools'));
}
return;
}
startDebugging(task.name, debugArg[0], debugArg[1], script.getFolder());
startDebugging(script.task.name, script.getFolder());
}
private findScript(document: TextDocument, script?: NpmScript): number {

View file

@ -8,7 +8,7 @@ import {
workspace, tasks, Range, HoverProvider, Hover, Position, MarkdownString, Uri
} from 'vscode';
import {
createTask, startDebugging, findAllScriptRanges, extractDebugArgFromScript
createTask, startDebugging, findAllScriptRanges
} from './tasks';
import * as nls from 'vscode-nls';
@ -54,11 +54,7 @@ export class NpmScriptHoverProvider implements HoverProvider {
let contents: MarkdownString = new MarkdownString();
contents.isTrusted = true;
contents.appendMarkdown(this.createRunScriptMarkdown(key, document.uri));
let debugArgs = extractDebugArgFromScript(value[2]);
if (debugArgs) {
contents.appendMarkdown(this.createDebugScriptMarkdown(key, document.uri, debugArgs[0], debugArgs[1]));
}
contents.appendMarkdown(this.createDebugScriptMarkdown(key, document.uri));
hover = new Hover(contents);
}
});
@ -78,12 +74,10 @@ export class NpmScriptHoverProvider implements HoverProvider {
);
}
private createDebugScriptMarkdown(script: string, documentUri: Uri, protocol: string, port: number): string {
let args = {
private createDebugScriptMarkdown(script: string, documentUri: Uri): string {
const args = {
documentUri: documentUri,
script: script,
protocol: protocol,
port: port
};
return this.createMarkdownLink(
localize('debugScript', 'Debug Script'),
@ -116,11 +110,9 @@ export class NpmScriptHoverProvider implements HoverProvider {
public debugScriptFromHover(args: any) {
let script = args.script;
let documentUri = args.documentUri;
let protocol = args.protocol;
let port = args.port;
let folder = workspace.getWorkspaceFolder(documentUri);
if (folder) {
startDebugging(script, protocol, port, folder);
startDebugging(script, folder);
}
}
}

View file

@ -249,6 +249,8 @@ async function provideNpmScriptsForFolder(packageJsonUri: Uri): Promise<Task[]>
if (prePostScripts.has(each)) {
task.group = TaskGroup.Clean; // hack: use Clean group to tag pre/post scripts
}
// todo@connor4312: all scripts are now debuggable, what is a 'debug script'?
if (isDebugScript(scripts![each])) {
task.group = TaskGroup.Rebuild; // hack: use Rebuild group to tag debug scripts
}
@ -355,44 +357,16 @@ export function runScript(script: string, document: TextDocument) {
}
}
export function extractDebugArgFromScript(scriptValue: string): [string, number] | undefined {
// matches --debug, --debug=1234, --debug-brk, debug-brk=1234, --inspect,
// --inspect=1234, --inspect-brk, --inspect-brk=1234,
// --inspect=localhost:1245, --inspect=127.0.0.1:1234, --inspect=[aa:1:0:0:0]:1234, --inspect=:1234
let match = scriptValue.match(/--(inspect|debug)(-brk)?(=((\[[0-9a-fA-F:]*\]|[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+|[a-zA-Z0-9\.]*):)?(\d+))?/);
if (match) {
if (match[6]) {
return [match[1], parseInt(match[6])];
}
if (match[1] === 'inspect') {
return [match[1], 9229];
}
if (match[1] === 'debug') {
return [match[1], 5858];
}
}
return undefined;
}
export function startDebugging(scriptName: string, protocol: string, port: number, folder: WorkspaceFolder) {
let p = 'inspector';
if (protocol === 'debug') {
p = 'legacy';
}
let packageManager = getPackageManager(folder);
export function startDebugging(scriptName: string, folder: WorkspaceFolder) {
const config: DebugConfiguration = {
type: 'node',
type: 'pwa-node',
request: 'launch',
name: `Debug ${scriptName}`,
runtimeExecutable: packageManager,
runtimeExecutable: getPackageManager(folder),
runtimeArgs: [
'run',
scriptName,
],
port: port,
protocol: p
};
if (folder) {