Fix npm task resolving to include task group

Fixes #142615
This commit is contained in:
Alex Ross 2022-02-09 13:33:41 +01:00
parent f826e82591
commit 6a9c6c2ff9
No known key found for this signature in database
GPG key ID: 89DDDBA66CBA7840

View file

@ -105,23 +105,21 @@ function isTestTask(name: string): boolean {
return false;
}
function getPrePostScripts(scripts: any): Set<string> {
function isPrePostScript(name: string): boolean {
const prePostScripts: Set<string> = new Set([
'preuninstall', 'postuninstall', 'prepack', 'postpack', 'preinstall', 'postinstall',
'prepack', 'postpack', 'prepublish', 'postpublish', 'preversion', 'postversion',
'prestop', 'poststop', 'prerestart', 'postrestart', 'preshrinkwrap', 'postshrinkwrap',
'pretest', 'postest', 'prepublishOnly'
]);
let keys = Object.keys(scripts);
for (const script of keys) {
const prepost = ['pre' + script, 'post' + script];
prepost.forEach(each => {
if (scripts[each] !== undefined) {
prePostScripts.add(each);
}
});
const prepost = ['pre' + name, 'post' + name];
for (const knownScript of prePostScripts) {
if (knownScript === prepost[0] || knownScript === prepost[1]) {
return true;
}
}
return prePostScripts;
return false;
}
export function isWorkspaceFolder(value: any): value is WorkspaceFolder {
@ -277,26 +275,10 @@ async function provideNpmScriptsForFolder(context: ExtensionContext, packageJson
const result: TaskWithLocation[] = [];
const prePostScripts = getPrePostScripts(scripts);
const packageManager = await getPackageManager(context, folder.uri, showWarning);
for (const { name, value, nameRange } of scripts.scripts) {
const task = await createTask(packageManager, name, ['run', name], folder!, packageJsonUri, value);
const lowerCaseTaskName = name.toLowerCase();
if (isBuildTask(lowerCaseTaskName)) {
task.group = TaskGroup.Build;
} else if (isTestTask(lowerCaseTaskName)) {
task.group = TaskGroup.Test;
}
if (prePostScripts.has(name)) {
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(value)) {
task.group = TaskGroup.Rebuild; // hack: use Rebuild group to tag debug scripts
}
const task = await createTask(packageManager, name, ['run', name], folder!, packageJsonUri, value, undefined);
result.push({ task, location: new Location(packageJsonUri, nameRange) });
}
@ -312,7 +294,7 @@ export function getTaskName(script: string, relativePath: string | undefined) {
return script;
}
export async function createTask(packageManager: string, script: NpmTaskDefinition | string, cmd: string[], folder: WorkspaceFolder, packageJsonUri: Uri, detail?: string, matcher?: any): Promise<Task> {
export async function createTask(packageManager: string, script: NpmTaskDefinition | string, cmd: string[], folder: WorkspaceFolder, packageJsonUri: Uri, scriptValue?: string, matcher?: any): Promise<Task> {
let kind: NpmTaskDefinition;
if (typeof script === 'string') {
kind = { type: 'npm', script: script };
@ -348,7 +330,19 @@ export async function createTask(packageManager: string, script: NpmTaskDefiniti
let taskName = getTaskName(kind.script, relativePackageJson);
let cwd = path.dirname(packageJsonUri.fsPath);
const task = new Task(kind, folder, taskName, 'npm', new ShellExecution(packageManager, getCommandLine(cmd), { cwd: cwd }), matcher);
task.detail = detail;
task.detail = scriptValue;
const lowerCaseTaskName = kind.script.toLowerCase();
if (isBuildTask(lowerCaseTaskName)) {
task.group = TaskGroup.Build;
} else if (isTestTask(lowerCaseTaskName)) {
task.group = TaskGroup.Test;
} else if (isPrePostScript(lowerCaseTaskName)) {
task.group = TaskGroup.Clean; // hack: use Clean group to tag pre/post scripts
} else if (scriptValue && isDebugScript(scriptValue)) {
// todo@connor4312: all scripts are now debuggable, what is a 'debug script'?
task.group = TaskGroup.Rebuild; // hack: use Rebuild group to tag debug scripts
}
return task;
}