add Debug script command

This commit is contained in:
Erich Gamma
2018-03-30 16:51:05 +02:00
parent a765cafa61
commit 2ce1f53e36
4 changed files with 167 additions and 108 deletions

View File

@@ -5,7 +5,6 @@
'use strict';
import * as path from 'path';
import * as fs from 'fs';
import * as httpRequest from 'request-light';
import * as vscode from 'vscode';
import * as nls from 'vscode-nls';
@@ -15,40 +14,11 @@ const localize = nls.loadMessageBundle();
import { addJSONProviders } from './features/jsonContributions';
import { NpmScriptsTreeDataProvider } from './npmView';
import { NpmTaskDefinition, ScriptValidator, isWorkspaceFolder } from './tasks';
import { NpmTaskDefinition, getScripts } from './tasks';
type AutoDetect = 'on' | 'off';
let taskProvider: vscode.Disposable | undefined;
class Validator implements ScriptValidator {
async scriptIsValid(task: vscode.Task): Promise<boolean> {
let uri: vscode.Uri | null = this.getPackageJsonUri(task);
if (uri) {
let tasks = await provideNpmScriptsForFolder(uri);
for (let i = 0; i < tasks.length; i++) {
const t = tasks[i];
if (isWorkspaceFolder(task.scope) && isWorkspaceFolder(task.scope)) {
if (t.name === task.name && t.scope === task.scope && (<vscode.ShellExecution>(t.execution)).commandLine === (<vscode.ShellExecution>(task.execution)).commandLine) {
return true;
}
}
}
}
return false;
}
getPackageJsonUri(task: vscode.Task): vscode.Uri | null {
if (isWorkspaceFolder(task.scope)) {
if (task.definition.path) {
return vscode.Uri.file(path.join(task.scope.uri.fsPath, task.definition.path, 'package.json'));
} else {
return vscode.Uri.file(path.join(task.scope.uri.fsPath, 'package.json'));
}
}
return null;
}
}
export function activate(context: vscode.ExtensionContext): void {
let provider: vscode.TaskProvider = {
provideTasks: () => {
@@ -60,7 +30,7 @@ export function activate(context: vscode.ExtensionContext): void {
};
taskProvider = vscode.workspace.registerTaskProvider('npm', provider);
vscode.window.registerTreeDataProvider('npm', new NpmScriptsTreeDataProvider(context, provider, new Validator()));
vscode.window.registerTreeDataProvider('npm', new NpmScriptsTreeDataProvider(context, provider, localize));
if (!vscode.workspace.workspaceFolders) {
return;
@@ -83,25 +53,6 @@ export function deactivate(): void {
}
}
async function exists(file: string): Promise<boolean> {
return new Promise<boolean>((resolve, _reject) => {
fs.exists(file, (value) => {
resolve(value);
});
});
}
async function readFile(file: string): Promise<string> {
return new Promise<string>((resolve, reject) => {
fs.readFile(file, (err, data) => {
if (err) {
reject(err);
}
resolve(data.toString());
});
});
}
const buildNames: string[] = ['build', 'compile', 'watch'];
function isBuildTask(name: string): boolean {
for (let buildName of buildNames) {
@@ -182,46 +133,29 @@ function isExcluded(folder: vscode.WorkspaceFolder, packageJsonUri: vscode.Uri)
async function provideNpmScriptsForFolder(packageJsonUri: vscode.Uri): Promise<vscode.Task[]> {
let emptyTasks: vscode.Task[] = [];
if (packageJsonUri.scheme !== 'file') {
return emptyTasks;
}
let packageJson = packageJsonUri.fsPath;
if (!await exists(packageJson)) {
return emptyTasks;
}
let folder = vscode.workspace.getWorkspaceFolder(packageJsonUri);
if (!folder) {
return emptyTasks;
}
try {
var contents = await readFile(packageJson);
var json = JSON.parse(contents);
if (!json.scripts) {
return emptyTasks;
}
const result: vscode.Task[] = [];
Object.keys(json.scripts).filter(isNotPreOrPostScript).forEach(each => {
const task = createTask(each, `run ${each}`, folder!, packageJsonUri);
const lowerCaseTaskName = each.toLowerCase();
if (isBuildTask(lowerCaseTaskName)) {
task.group = vscode.TaskGroup.Build;
} else if (isTestTask(lowerCaseTaskName)) {
task.group = vscode.TaskGroup.Test;
}
result.push(task);
});
// always add npm install (without a problem matcher)
// result.push(createTask('install', 'install', rootPath, folder, []));
return result;
} catch (e) {
let localizedParseError = localize('npm.parseError', 'Npm task detection: failed to parse the file {0}', packageJsonUri);
throw new Error(localizedParseError);
let scripts = await getScripts(packageJsonUri, localize);
if (!scripts) {
return emptyTasks;
}
const result: vscode.Task[] = [];
Object.keys(scripts).filter(isNotPreOrPostScript).forEach(each => {
const task = createTask(each, `run ${each}`, folder!, packageJsonUri);
const lowerCaseTaskName = each.toLowerCase();
if (isBuildTask(lowerCaseTaskName)) {
task.group = vscode.TaskGroup.Build;
} else if (isTestTask(lowerCaseTaskName)) {
task.group = vscode.TaskGroup.Test;
}
result.push(task);
});
// always add npm install (without a problem matcher)
// result.push(createTask('install', 'install', rootPath, folder, []));
return result;
}
function createTask(script: string, cmd: string, folder: vscode.WorkspaceFolder, packageJsonUri: vscode.Uri, matcher?: any): vscode.Task {