diff --git a/extensions/npm/src/npmView.ts b/extensions/npm/src/npmView.ts index 8617b7f7f8d..c4f3bc3495b 100644 --- a/extensions/npm/src/npmView.ts +++ b/extensions/npm/src/npmView.ts @@ -14,7 +14,7 @@ import { } from 'vscode'; import * as nls from 'vscode-nls'; import { - createTask, getTaskName, isAutoDetectionEnabled, isWorkspaceFolder, NpmTaskDefinition, + createTask, getPackageManager, getTaskName, isAutoDetectionEnabled, isWorkspaceFolder, NpmTaskDefinition, NpmTaskProvider, startDebugging, TaskLocation, @@ -132,7 +132,7 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { private _onDidChangeTreeData: EventEmitter = new EventEmitter(); readonly onDidChangeTreeData: Event = this._onDidChangeTreeData.event; - constructor(context: ExtensionContext, public taskProvider: NpmTaskProvider) { + constructor(private context: ExtensionContext, public taskProvider: NpmTaskProvider) { const subscriptions = context.subscriptions; this.extensionContext = context; subscriptions.push(commands.registerCommand('npm.runScript', this.runScript, this)); @@ -142,6 +142,8 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { } private async runScript(script: NpmScript) { + // Call getPackageManager to trigger the multiple lock files warning. + await getPackageManager(this.context, script.getFolder().uri); tasks.executeTask(script.task); } @@ -190,7 +192,7 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { if (!uri) { return; } - let task = await createTask(this.extensionContext, 'install', 'install', selection.folder.workspaceFolder, uri, undefined, []); + let task = await createTask(this.extensionContext, 'install', 'install', selection.folder.workspaceFolder, uri, true, undefined, []); tasks.executeTask(task); } diff --git a/extensions/npm/src/tasks.ts b/extensions/npm/src/tasks.ts index fac16a3960d..509cef08317 100644 --- a/extensions/npm/src/tasks.ts +++ b/extensions/npm/src/tasks.ts @@ -48,11 +48,11 @@ export class NpmTaskProvider implements TaskProvider { } get tasksWithLocation(): Promise { - return provideNpmScripts(this.context); + return provideNpmScripts(this.context, false); } public async provideTasks() { - const tasks = await provideNpmScripts(this.context); + const tasks = await provideNpmScripts(this.context, true); return tasks.map(task => task.task); } @@ -123,14 +123,14 @@ export function isWorkspaceFolder(value: any): value is WorkspaceFolder { return value && typeof value !== 'number'; } -export async function getPackageManager(extensionContext: ExtensionContext, folder: Uri): Promise { +export async function getPackageManager(extensionContext: ExtensionContext, folder: Uri, showWarning: boolean = true): Promise { let packageManagerName = workspace.getConfiguration('npm', folder).get('packageManager', 'npm'); if (packageManagerName === 'auto') { const { name, multiplePMDetected } = await findPreferredPM(folder.fsPath); packageManagerName = name; const neverShowWarning = 'npm.multiplePMWarning.neverShow'; - if (multiplePMDetected && !extensionContext.globalState.get(neverShowWarning)) { + if (showWarning && multiplePMDetected && !extensionContext.globalState.get(neverShowWarning)) { const multiplePMWarning = localize('npm.multiplePMWarning', 'Using {0} as the preferred package manager. Found multiple lockfiles for {1}.', packageManagerName, folder.fsPath); const neverShowAgain = localize('npm.multiplePMWarning.doNotShow', "Do not show again"); const learnMore = localize('npm.multiplePMWarning.learnMore', "Learn more"); @@ -167,7 +167,7 @@ export async function hasNpmScripts(): Promise { } } -async function detectNpmScripts(context: ExtensionContext): Promise { +async function detectNpmScripts(context: ExtensionContext, showWarning: boolean): Promise { let emptyTasks: TaskWithLocation[] = []; let allTasks: TaskWithLocation[] = []; @@ -184,7 +184,7 @@ async function detectNpmScripts(context: ExtensionContext): Promise = new Set(); for (const path of paths) { if (!visitedPackageJsonFiles.has(path.fsPath)) { - let tasks = await provideNpmScriptsForFolder(context, path); + let tasks = await provideNpmScriptsForFolder(context, path, true); visitedPackageJsonFiles.add(path.fsPath); folderTasks.push(...tasks.map(t => ({ label: t.task.name, task: t.task }))); } @@ -220,9 +220,9 @@ export async function detectNpmScriptsForFolder(context: ExtensionContext, folde } } -export async function provideNpmScripts(context: ExtensionContext): Promise { +export async function provideNpmScripts(context: ExtensionContext, showWarning: boolean): Promise { if (!cachedTasks) { - cachedTasks = await detectNpmScripts(context); + cachedTasks = await detectNpmScripts(context, showWarning); } return cachedTasks; } @@ -258,7 +258,7 @@ function isDebugScript(script: string): boolean { return match !== null; } -async function provideNpmScriptsForFolder(context: ExtensionContext, packageJsonUri: Uri): Promise { +async function provideNpmScriptsForFolder(context: ExtensionContext, packageJsonUri: Uri, showWarning: boolean): Promise { let emptyTasks: TaskWithLocation[] = []; let folder = workspace.getWorkspaceFolder(packageJsonUri); @@ -276,7 +276,7 @@ async function provideNpmScriptsForFolder(context: ExtensionContext, packageJson for (const each of scripts.keys()) { const scriptValue = scripts.get(each)!; - const task = await createTask(context, each, `run ${each}`, folder!, packageJsonUri, scriptValue.script); + const task = await createTask(context, each, `run ${each}`, folder!, packageJsonUri, showWarning, scriptValue.script); const lowerCaseTaskName = each.toLowerCase(); if (isBuildTask(lowerCaseTaskName)) { task.group = TaskGroup.Build; @@ -295,7 +295,7 @@ async function provideNpmScriptsForFolder(context: ExtensionContext, packageJson } // always add npm install (without a problem matcher) - result.push({ task: await createTask(context, INSTALL_SCRIPT, INSTALL_SCRIPT, folder, packageJsonUri, 'install dependencies from package', []) }); + result.push({ task: await createTask(context, INSTALL_SCRIPT, INSTALL_SCRIPT, folder, packageJsonUri, showWarning, 'install dependencies from package', []) }); return result; } @@ -306,7 +306,7 @@ export function getTaskName(script: string, relativePath: string | undefined) { return script; } -export async function createTask(context: ExtensionContext, script: NpmTaskDefinition | string, cmd: string, folder: WorkspaceFolder, packageJsonUri: Uri, detail?: string, matcher?: any): Promise { +export async function createTask(context: ExtensionContext, script: NpmTaskDefinition | string, cmd: string, folder: WorkspaceFolder, packageJsonUri: Uri, showWarning: boolean = true, detail?: string, matcher?: any): Promise { let kind: NpmTaskDefinition; if (typeof script === 'string') { kind = { type: 'npm', script: script }; @@ -314,7 +314,7 @@ export async function createTask(context: ExtensionContext, script: NpmTaskDefin kind = script; } - const packageManager = await getPackageManager(context, folder.uri); + const packageManager = await getPackageManager(context, folder.uri, showWarning); async function getCommandLine(cmd: string): Promise { if (workspace.getConfiguration('npm', folder.uri).get('runSilent')) { return `${packageManager} --silent ${cmd}`;