From 0c2e1f2fb87b53fe206203196f5161a2b9c48c41 Mon Sep 17 00:00:00 2001 From: Shivang Tripathi Date: Tue, 14 Jul 2020 18:28:03 +0530 Subject: [PATCH 1/7] feat: Autodetect npm.packageManager #102050 --- extensions/npm/README.md | 2 +- extensions/npm/package.json | 4 +- extensions/npm/src/npmView.ts | 2 +- extensions/npm/src/scriptHover.ts | 5 +- extensions/npm/src/tasks.ts | 37 ++++--- extensions/npm/tsconfig.json | 5 +- extensions/npm/yarn.lock | 161 ++++++++++++++++++++++++++++++ 7 files changed, 195 insertions(+), 21 deletions(-) diff --git a/extensions/npm/README.md b/extensions/npm/README.md index 144cdd275384f3..51e6645c2cbb4e 100644 --- a/extensions/npm/README.md +++ b/extensions/npm/README.md @@ -34,7 +34,7 @@ The extension fetches data from https://registry.npmjs.org and https://registry. - `npm.autoDetect` - Enable detecting scripts as tasks, the default is `on`. - `npm.runSilent` - Run npm script with the `--silent` option, the default is `false`. -- `npm.packageManager` - The package manager used to run the scripts: `npm`, `yarn` or `pnpm`, the default is `npm`. +- `npm.packageManager` - The package manager used to run the scripts: `auto`, `npm`, `yarn` or `pnpm`, the default is `auto`. - `npm.exclude` - Glob patterns for folders that should be excluded from automatic script detection. The pattern is matched against the **absolute path** of the package.json. For example, to exclude all test folders use '**/test/**'. - `npm.enableScriptExplorer` - Enable an explorer view for npm scripts. - `npm.scriptExplorerAction` - The default click action: `open` or `run`, the default is `open`. diff --git a/extensions/npm/package.json b/extensions/npm/package.json index aa478b26c9b45a..901b460b329f19 100644 --- a/extensions/npm/package.json +++ b/extensions/npm/package.json @@ -20,6 +20,7 @@ "dependencies": { "jsonc-parser": "^2.2.1", "minimatch": "^3.0.4", + "preferred-pm": "^3.0.1", "request-light": "^0.4.0", "vscode-nls": "^4.1.1" }, @@ -209,11 +210,12 @@ "scope": "resource", "type": "string", "enum": [ + "auto", "npm", "yarn", "pnpm" ], - "default": "npm", + "default": "auto", "description": "%config.npm.packageManager%" }, "npm.exclude": { diff --git a/extensions/npm/src/npmView.ts b/extensions/npm/src/npmView.ts index c7c7835fa04705..a7682290b3cf82 100644 --- a/extensions/npm/src/npmView.ts +++ b/extensions/npm/src/npmView.ts @@ -182,7 +182,7 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { if (!uri) { return; } - let task = createTask('install', 'install', selection.folder.workspaceFolder, uri, undefined, []); + let task = await createTask('install', 'install', selection.folder.workspaceFolder, uri, undefined, []); tasks.executeTask(task); } diff --git a/extensions/npm/src/scriptHover.ts b/extensions/npm/src/scriptHover.ts index f8a5482bef85ad..82783de410c490 100644 --- a/extensions/npm/src/scriptHover.ts +++ b/extensions/npm/src/scriptHover.ts @@ -102,8 +102,9 @@ export class NpmScriptHoverProvider implements HoverProvider { let documentUri = args.documentUri; let folder = workspace.getWorkspaceFolder(documentUri); if (folder) { - let task = createTask(script, `run ${script}`, folder, documentUri); - tasks.executeTask(task); + createTask(script, `run ${script}`, folder, documentUri).then((task) => { + tasks.executeTask(task); + }); } } diff --git a/extensions/npm/src/tasks.ts b/extensions/npm/src/tasks.ts index f7def2f8876fba..a583f843f8b05b 100644 --- a/extensions/npm/src/tasks.ts +++ b/extensions/npm/src/tasks.ts @@ -12,6 +12,7 @@ import * as fs from 'fs'; import * as minimatch from 'minimatch'; import * as nls from 'vscode-nls'; import { JSONVisitor, visit, ParseErrorCode } from 'jsonc-parser'; +import preferredPM from 'preferred-pm'; const localize = nls.loadMessageBundle(); @@ -40,7 +41,7 @@ export class NpmTaskProvider implements TaskProvider { return provideNpmScripts(); } - public resolveTask(_task: Task): Task | undefined { + public resolveTask(_task: Task): Promise | undefined { const npmTask = (_task.definition).script; if (npmTask) { const kind: NpmTaskDefinition = (_task.definition); @@ -107,8 +108,16 @@ export function isWorkspaceFolder(value: any): value is WorkspaceFolder { return value && typeof value !== 'number'; } -export function getPackageManager(folder: WorkspaceFolder): string { - return workspace.getConfiguration('npm', folder.uri).get('packageManager', 'npm'); +export async function getPackageManager(folder: WorkspaceFolder): Promise { + let packageManagerName = workspace.getConfiguration('npm', folder.uri).get('packageManager', 'npm'); + + if (packageManagerName === 'auto') { + packageManagerName = (await preferredPM(folder.uri.fsPath) || { name: 'npm' }).name; + } + + // TODO: Warn if multiple lock files present AND auto + + return packageManagerName; } export async function hasNpmScripts(): Promise { @@ -238,8 +247,8 @@ async function provideNpmScriptsForFolder(packageJsonUri: Uri): Promise const result: Task[] = []; const prePostScripts = getPrePostScripts(scripts); - Object.keys(scripts).forEach(each => { - const task = createTask(each, `run ${each}`, folder!, packageJsonUri, scripts![each]); + Object.keys(scripts).forEach(async (each) => { + const task = await createTask(each, `run ${each}`, folder!, packageJsonUri, scripts![each]); const lowerCaseTaskName = each.toLowerCase(); if (isBuildTask(lowerCaseTaskName)) { task.group = TaskGroup.Build; @@ -257,7 +266,7 @@ async function provideNpmScriptsForFolder(packageJsonUri: Uri): Promise result.push(task); }); // always add npm install (without a problem matcher) - result.push(createTask(INSTALL_SCRIPT, INSTALL_SCRIPT, folder, packageJsonUri, 'install dependencies from package', [])); + result.push(await createTask(INSTALL_SCRIPT, INSTALL_SCRIPT, folder, packageJsonUri, 'install dependencies from package', [])); return result; } @@ -268,7 +277,7 @@ export function getTaskName(script: string, relativePath: string | undefined) { return script; } -export function createTask(script: NpmTaskDefinition | string, cmd: string, folder: WorkspaceFolder, packageJsonUri: Uri, detail?: string, matcher?: any): Task { +export async function createTask(script: NpmTaskDefinition | string, cmd: string, folder: WorkspaceFolder, packageJsonUri: Uri, detail?: string, matcher?: any): Promise { let kind: NpmTaskDefinition; if (typeof script === 'string') { kind = { type: 'npm', script: script }; @@ -276,8 +285,8 @@ export function createTask(script: NpmTaskDefinition | string, cmd: string, fold kind = script; } - function getCommandLine(folder: WorkspaceFolder, cmd: string): string { - let packageManager = getPackageManager(folder); + async function getCommandLine(folder: WorkspaceFolder, cmd: string): Promise { + let packageManager = await getPackageManager(folder); if (workspace.getConfiguration('npm', folder.uri).get('runSilent')) { return `${packageManager} --silent ${cmd}`; } @@ -296,7 +305,7 @@ export function createTask(script: NpmTaskDefinition | string, cmd: string, fold } let taskName = getTaskName(kind.script, relativePackageJson); let cwd = path.dirname(packageJsonUri.fsPath); - const task = new Task(kind, folder, taskName, 'npm', new ShellExecution(getCommandLine(folder, cmd), { cwd: cwd }), matcher); + const task = new Task(kind, folder, taskName, 'npm', new ShellExecution(await getCommandLine(folder, cmd), { cwd: cwd }), matcher); task.detail = detail; return task; } @@ -348,21 +357,21 @@ async function readFile(file: string): Promise { }); } -export function runScript(script: string, document: TextDocument) { +export async function runScript(script: string, document: TextDocument) { let uri = document.uri; let folder = workspace.getWorkspaceFolder(uri); if (folder) { - let task = createTask(script, `run ${script}`, folder, uri); + let task = await createTask(script, `run ${script}`, folder, uri); tasks.executeTask(task); } } -export function startDebugging(scriptName: string, folder: WorkspaceFolder) { +export async function startDebugging(scriptName: string, folder: WorkspaceFolder) { const config: DebugConfiguration = { type: 'pwa-node', request: 'launch', name: `Debug ${scriptName}`, - runtimeExecutable: getPackageManager(folder), + runtimeExecutable: await getPackageManager(folder), runtimeArgs: [ 'run', scriptName, diff --git a/extensions/npm/tsconfig.json b/extensions/npm/tsconfig.json index 296ddb38fcb304..17eda67c541ad1 100644 --- a/extensions/npm/tsconfig.json +++ b/extensions/npm/tsconfig.json @@ -1,9 +1,10 @@ { "extends": "../shared.tsconfig.json", "compilerOptions": { - "outDir": "./out" + "outDir": "./out", + "esModuleInterop": true, }, "include": [ "src/**/*" ] -} \ No newline at end of file +} diff --git a/extensions/npm/yarn.lock b/extensions/npm/yarn.lock index 5e85de9297e7c8..cad49c831e7619 100644 --- a/extensions/npm/yarn.lock +++ b/extensions/npm/yarn.lock @@ -26,6 +26,13 @@ agent-base@^4.3.0: dependencies: es6-promisify "^5.0.0" +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -39,6 +46,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -63,6 +77,39 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-yarn-workspace-root2@1.2.16: + version "1.2.16" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz#60287009dd2f324f59646bdb4b7610a6b301c2a9" + integrity sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA== + dependencies: + micromatch "^4.0.2" + pkg-dir "^4.2.0" + +graceful-fs@^4.1.5: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + http-proxy-agent@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" @@ -79,11 +126,49 @@ https-proxy-agent@^2.2.4: agent-base "^4.3.0" debug "^3.1.0" +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +js-yaml@^3.13.0: + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + jsonc-parser@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-2.2.1.tgz#db73cd59d78cce28723199466b2a03d1be1df2bc" integrity sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w== +load-yaml-file@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/load-yaml-file/-/load-yaml-file-0.2.0.tgz#af854edaf2bea89346c07549122753c07372f64d" + integrity sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw== + dependencies: + graceful-fs "^4.1.5" + js-yaml "^3.13.0" + pify "^4.0.1" + strip-bom "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -96,6 +181,57 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +picomatch@^2.0.5: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +preferred-pm@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/preferred-pm/-/preferred-pm-3.0.1.tgz#2629d17d9dea60aadcad23a605d13cd77a919342" + integrity sha512-EQhezof37TcW/kI2asQIzrL9X1X4pmgQiQfcwohFlSYmD3g8lKHtUYfpWgKW1+PKDK+l476b4JkhjhfDBhpX7Q== + dependencies: + find-up "^4.1.0" + find-yarn-workspace-root2 "1.2.16" + path-exists "^4.0.0" + which-pm "2.0.0" + request-light@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/request-light/-/request-light-0.4.0.tgz#c6b91ef00b18cb0de75d2127e55b3a2c9f7f90f9" @@ -105,6 +241,23 @@ request-light@^0.4.0: https-proxy-agent "^2.2.4" vscode-nls "^4.1.2" +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + vscode-nls@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.1.1.tgz#f9916b64e4947b20322defb1e676a495861f133c" @@ -114,3 +267,11 @@ vscode-nls@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.1.2.tgz#ca8bf8bb82a0987b32801f9fddfdd2fb9fd3c167" integrity sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw== + +which-pm@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-pm/-/which-pm-2.0.0.tgz#8245609ecfe64bf751d0eef2f376d83bf1ddb7ae" + integrity sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w== + dependencies: + load-yaml-file "^0.2.0" + path-exists "^4.0.0" From 79571a9ffdf97e4871fc799753914b9691863026 Mon Sep 17 00:00:00 2001 From: Shivang Tripathi Date: Mon, 20 Jul 2020 03:25:18 +0530 Subject: [PATCH 2/7] use default import for minimatch Using default import for minimatch to resolve `esModuleInterop` conflict --- extensions/npm/src/tasks.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/npm/src/tasks.ts b/extensions/npm/src/tasks.ts index a583f843f8b05b..afd1e2f37e106d 100644 --- a/extensions/npm/src/tasks.ts +++ b/extensions/npm/src/tasks.ts @@ -9,8 +9,8 @@ import { } from 'vscode'; import * as path from 'path'; import * as fs from 'fs'; -import * as minimatch from 'minimatch'; import * as nls from 'vscode-nls'; +import minimatch from 'minimatch'; import { JSONVisitor, visit, ParseErrorCode } from 'jsonc-parser'; import preferredPM from 'preferred-pm'; From 8e8a105fa173ad9e2d5f940fb7d535995b451c7e Mon Sep 17 00:00:00 2001 From: Shivang Tripathi Date: Sat, 25 Jul 2020 15:36:40 +0530 Subject: [PATCH 3/7] find preferred pm with multiple pm detected flag Detects the preferred package manager and if multiple are present, warns and uses in priority order: npm => yarn => pnpm --- extensions/npm/package.json | 7 ++- extensions/npm/src/preferred-pm.ts | 73 ++++++++++++++++++++++++++++++ extensions/npm/src/tasks.ts | 14 ++++-- extensions/npm/yarn.lock | 45 ++++++++++++------ 4 files changed, 117 insertions(+), 22 deletions(-) create mode 100644 extensions/npm/src/preferred-pm.ts diff --git a/extensions/npm/package.json b/extensions/npm/package.json index 901b460b329f19..631cc3c5d7a6ff 100644 --- a/extensions/npm/package.json +++ b/extensions/npm/package.json @@ -18,11 +18,14 @@ "watch": "gulp watch-extension:npm" }, "dependencies": { + "find-up": "^4.1.0", + "find-yarn-workspace-root2": "^1.2.22", "jsonc-parser": "^2.2.1", "minimatch": "^3.0.4", - "preferred-pm": "^3.0.1", + "path-exists": "^4.0.0", "request-light": "^0.4.0", - "vscode-nls": "^4.1.1" + "vscode-nls": "^4.1.1", + "which-pm": "^2.0.0" }, "devDependencies": { "@types/minimatch": "^3.0.3", diff --git a/extensions/npm/src/preferred-pm.ts b/extensions/npm/src/preferred-pm.ts new file mode 100644 index 00000000000000..c33bc1ab4231ed --- /dev/null +++ b/extensions/npm/src/preferred-pm.ts @@ -0,0 +1,73 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { findWorkspaceRoot } from 'find-yarn-workspace-root2'; +import findUp from 'find-up'; +import path from 'path'; +import pathExists from 'path-exists'; +import whichPM from 'which-pm'; + +const isPNPMPreferred = async (pkgPath: string) => { + if (await pathExists(path.join(pkgPath, 'pnpm-lock.yaml'))) { + return true; + } + if (await pathExists(path.join(pkgPath, 'shrinkwrap.yaml'))) { + return true; + } + if (await findUp('pnpm-lock.yaml', { cwd: pkgPath })) { + return true; + } + + return false; +}; + +const isYarnPreferred = async (pkgPath: string) => { + if (await pathExists(path.join(pkgPath, 'yarn.lock'))) { + return true; + } + + try { + if (typeof findWorkspaceRoot(pkgPath) === 'string') { + return true; + } + } catch (err) { } + + return false; +}; + +const isNPMPreferred = (pkgPath: string) => { + return pathExists(path.join(pkgPath, 'package-lock.json')); +}; + +const findPreferredPM = async (pkgPath: string) => { + const detectedPackageManagers = []; + + if (await isNPMPreferred(pkgPath)) { + detectedPackageManagers.push('npm'); + } + + if (await isYarnPreferred(pkgPath)) { + detectedPackageManagers.push('yarn'); + } + + if (await isPNPMPreferred(pkgPath)) { + detectedPackageManagers.push('pnpm'); + } + + const { name: pmUsedForInstallation } = await whichPM(pkgPath); + + if (!detectedPackageManagers.includes(pmUsedForInstallation)) { + detectedPackageManagers.push(pmUsedForInstallation); + } + + const multiplePMDetected = detectedPackageManagers.length > 1; + + return { + name: detectedPackageManagers[0] || 'npm', + multiplePMDetected + }; +}; + +export default findPreferredPM; diff --git a/extensions/npm/src/tasks.ts b/extensions/npm/src/tasks.ts index afd1e2f37e106d..bb691000e4e8fc 100644 --- a/extensions/npm/src/tasks.ts +++ b/extensions/npm/src/tasks.ts @@ -5,14 +5,14 @@ import { TaskDefinition, Task, TaskGroup, WorkspaceFolder, RelativePattern, ShellExecution, Uri, workspace, - DebugConfiguration, debug, TaskProvider, TextDocument, tasks, TaskScope, QuickPickItem + DebugConfiguration, debug, TaskProvider, TextDocument, tasks, TaskScope, QuickPickItem, window } from 'vscode'; import * as path from 'path'; import * as fs from 'fs'; import * as nls from 'vscode-nls'; import minimatch from 'minimatch'; import { JSONVisitor, visit, ParseErrorCode } from 'jsonc-parser'; -import preferredPM from 'preferred-pm'; +import findPreferredPM from './preferred-pm'; const localize = nls.loadMessageBundle(); @@ -112,10 +112,14 @@ export async function getPackageManager(folder: WorkspaceFolder): Promise('packageManager', 'npm'); if (packageManagerName === 'auto') { - packageManagerName = (await preferredPM(folder.uri.fsPath) || { name: 'npm' }).name; - } + const { name, multiplePMDetected } = await findPreferredPM(folder.uri.fsPath); + packageManagerName = name; - // TODO: Warn if multiple lock files present AND auto + // TODO: localize warning text + if (multiplePMDetected) { + window.showWarningMessage(`Found multiple lockfiles. Using ${name} as the preferred package manager`); + } + } return packageManagerName; } diff --git a/extensions/npm/yarn.lock b/extensions/npm/yarn.lock index cad49c831e7619..479afa248bc2d2 100644 --- a/extensions/npm/yarn.lock +++ b/extensions/npm/yarn.lock @@ -97,13 +97,14 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -find-yarn-workspace-root2@1.2.16: - version "1.2.16" - resolved "https://registry.yarnpkg.com/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz#60287009dd2f324f59646bdb4b7610a6b301c2a9" - integrity sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA== +find-yarn-workspace-root2@^1.2.22: + version "1.2.22" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.22.tgz#c177793625fd54f1b26dfb4b9e1c17fe83e48ca6" + integrity sha512-+xwg2xnum+nHrl9SfRMm2ln4fvH8bBxoAlBztEgSdDy33kXSTDGJdWWy8Lb+GOtqbzvMi//n+AKodimD0cPR5A== dependencies: micromatch "^4.0.2" pkg-dir "^4.2.0" + upath2 "^3.1.5" graceful-fs@^4.1.5: version "4.2.4" @@ -161,6 +162,11 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +lodash@^4.17.15: + version "4.17.19" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" + integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== + micromatch@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" @@ -205,6 +211,16 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-is-network-drive@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/path-is-network-drive/-/path-is-network-drive-1.0.4.tgz#d61af60d5f03e821d7e304f5d3717c7bd5f562c7" + integrity sha512-fhiOCcDSSl+cE/a5dhDX55IxYRWoP38roOK3z6/VOiYYLO1s6SqHMqy4jX7/3IJlsvoM6YpILhGhcMiqx7KvoQ== + +path-strip-sep@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-strip-sep/-/path-strip-sep-1.0.1.tgz#f858f4f4aa80fc771e1ebb661d809b8fda649a74" + integrity sha512-EnlkhWt5ASwc0BePbQN5kdaIBSGdEu7JiyIrnPHwlvMKywtfQiAGRtIScz5or3pxV49F+qSJ7EqGhv6aKP2MBA== + picomatch@^2.0.5: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" @@ -222,16 +238,6 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -preferred-pm@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/preferred-pm/-/preferred-pm-3.0.1.tgz#2629d17d9dea60aadcad23a605d13cd77a919342" - integrity sha512-EQhezof37TcW/kI2asQIzrL9X1X4pmgQiQfcwohFlSYmD3g8lKHtUYfpWgKW1+PKDK+l476b4JkhjhfDBhpX7Q== - dependencies: - find-up "^4.1.0" - find-yarn-workspace-root2 "1.2.16" - path-exists "^4.0.0" - which-pm "2.0.0" - request-light@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/request-light/-/request-light-0.4.0.tgz#c6b91ef00b18cb0de75d2127e55b3a2c9f7f90f9" @@ -258,6 +264,15 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +upath2@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/upath2/-/upath2-3.1.5.tgz#5e964f2b6794d735601a0b868790ae9a0b8448b6" + integrity sha512-vNcjhJHKdmcX8SgGQ/Ey3iZE8MQKc+OwhSCbsw/qAtW0wO99Arl02xKFE+ipnVaG0Zakt1ZCLaQGSWUTqSNQ+Q== + dependencies: + lodash "^4.17.15" + path-is-network-drive "^1.0.4" + path-strip-sep "^1.0.1" + vscode-nls@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.1.1.tgz#f9916b64e4947b20322defb1e676a495861f133c" @@ -268,7 +283,7 @@ vscode-nls@^4.1.2: resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.1.2.tgz#ca8bf8bb82a0987b32801f9fddfdd2fb9fd3c167" integrity sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw== -which-pm@2.0.0: +which-pm@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-pm/-/which-pm-2.0.0.tgz#8245609ecfe64bf751d0eef2f376d83bf1ddb7ae" integrity sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w== From c196998a09084126e854d08e193b9a4f2f4405fe Mon Sep 17 00:00:00 2001 From: Shivang Tripathi Date: Mon, 31 Aug 2020 01:11:53 +0530 Subject: [PATCH 4/7] add localized warning when multiple PM detected --- extensions/npm/package.nls.json | 1 + extensions/npm/src/tasks.ts | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/extensions/npm/package.nls.json b/extensions/npm/package.nls.json index 51756d241f14a4..3f39cfc3173e1c 100644 --- a/extensions/npm/package.nls.json +++ b/extensions/npm/package.nls.json @@ -9,6 +9,7 @@ "config.npm.scriptExplorerAction": "The default click action used in the npm scripts explorer: `open` or `run`, the default is `open`.", "config.npm.enableRunFromFolder": "Enable running npm scripts contained in a folder from the Explorer context menu.", "config.npm.fetchOnlinePackageInfo": "Fetch data from https://registry.npmjs.org and https://registry.bower.io to provide auto-completion and information on hover features on npm dependencies.", + "npm.multiplePMWarning": "Found multiple lockfiles. Using {0} as the preferred package manager.", "npm.parseError": "Npm task detection: failed to parse the file {0}", "taskdef.script": "The npm script to customize.", "taskdef.path": "The path to the folder of the package.json file that provides the script. Can be omitted.", diff --git a/extensions/npm/src/tasks.ts b/extensions/npm/src/tasks.ts index bb691000e4e8fc..4ce575e1878273 100644 --- a/extensions/npm/src/tasks.ts +++ b/extensions/npm/src/tasks.ts @@ -115,9 +115,9 @@ export async function getPackageManager(folder: WorkspaceFolder): Promise Date: Wed, 5 Aug 2020 07:15:50 +0530 Subject: [PATCH 5/7] fix: Correct async iteration of scripts --- extensions/npm/src/tasks.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/extensions/npm/src/tasks.ts b/extensions/npm/src/tasks.ts index 4ce575e1878273..cc7a385a2c7801 100644 --- a/extensions/npm/src/tasks.ts +++ b/extensions/npm/src/tasks.ts @@ -251,7 +251,8 @@ async function provideNpmScriptsForFolder(packageJsonUri: Uri): Promise const result: Task[] = []; const prePostScripts = getPrePostScripts(scripts); - Object.keys(scripts).forEach(async (each) => { + + for (const each of Object.keys(scripts)) { const task = await createTask(each, `run ${each}`, folder!, packageJsonUri, scripts![each]); const lowerCaseTaskName = each.toLowerCase(); if (isBuildTask(lowerCaseTaskName)) { @@ -268,7 +269,8 @@ async function provideNpmScriptsForFolder(packageJsonUri: Uri): Promise task.group = TaskGroup.Rebuild; // hack: use Rebuild group to tag debug scripts } result.push(task); - }); + } + // always add npm install (without a problem matcher) result.push(await createTask(INSTALL_SCRIPT, INSTALL_SCRIPT, folder, packageJsonUri, 'install dependencies from package', [])); return result; From 92178247e9a2dd9b1be3d7c09dcd56c9b04f1171 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Thu, 24 Sep 2020 17:02:17 +0200 Subject: [PATCH 6/7] Some reveiw changes --- extensions/npm/README.md | 2 +- extensions/npm/package.json | 1 - extensions/npm/package.nls.json | 1 - extensions/npm/src/preferred-pm.ts | 31 ++++++++++++++++++------------ extensions/npm/src/scriptHover.ts | 7 +++---- extensions/npm/src/tasks.ts | 4 ++-- extensions/npm/tsconfig.json | 3 +-- 7 files changed, 26 insertions(+), 23 deletions(-) diff --git a/extensions/npm/README.md b/extensions/npm/README.md index 51e6645c2cbb4e..82730c7e82a674 100644 --- a/extensions/npm/README.md +++ b/extensions/npm/README.md @@ -34,7 +34,7 @@ The extension fetches data from https://registry.npmjs.org and https://registry. - `npm.autoDetect` - Enable detecting scripts as tasks, the default is `on`. - `npm.runSilent` - Run npm script with the `--silent` option, the default is `false`. -- `npm.packageManager` - The package manager used to run the scripts: `auto`, `npm`, `yarn` or `pnpm`, the default is `auto`. +- `npm.packageManager` - The package manager used to run the scripts: `auto`, `npm`, `yarn` or `pnpm`, the default is `auto`, which detects your package manager based on your files. - `npm.exclude` - Glob patterns for folders that should be excluded from automatic script detection. The pattern is matched against the **absolute path** of the package.json. For example, to exclude all test folders use '**/test/**'. - `npm.enableScriptExplorer` - Enable an explorer view for npm scripts. - `npm.scriptExplorerAction` - The default click action: `open` or `run`, the default is `open`. diff --git a/extensions/npm/package.json b/extensions/npm/package.json index 631cc3c5d7a6ff..85d7d9b0b64d59 100644 --- a/extensions/npm/package.json +++ b/extensions/npm/package.json @@ -22,7 +22,6 @@ "find-yarn-workspace-root2": "^1.2.22", "jsonc-parser": "^2.2.1", "minimatch": "^3.0.4", - "path-exists": "^4.0.0", "request-light": "^0.4.0", "vscode-nls": "^4.1.1", "which-pm": "^2.0.0" diff --git a/extensions/npm/package.nls.json b/extensions/npm/package.nls.json index 3f39cfc3173e1c..51756d241f14a4 100644 --- a/extensions/npm/package.nls.json +++ b/extensions/npm/package.nls.json @@ -9,7 +9,6 @@ "config.npm.scriptExplorerAction": "The default click action used in the npm scripts explorer: `open` or `run`, the default is `open`.", "config.npm.enableRunFromFolder": "Enable running npm scripts contained in a folder from the Explorer context menu.", "config.npm.fetchOnlinePackageInfo": "Fetch data from https://registry.npmjs.org and https://registry.bower.io to provide auto-completion and information on hover features on npm dependencies.", - "npm.multiplePMWarning": "Found multiple lockfiles. Using {0} as the preferred package manager.", "npm.parseError": "Npm task detection: failed to parse the file {0}", "taskdef.script": "The npm script to customize.", "taskdef.path": "The path to the folder of the package.json file that provides the script. Can be omitted.", diff --git a/extensions/npm/src/preferred-pm.ts b/extensions/npm/src/preferred-pm.ts index c33bc1ab4231ed..40a91c893f02b8 100644 --- a/extensions/npm/src/preferred-pm.ts +++ b/extensions/npm/src/preferred-pm.ts @@ -4,12 +4,21 @@ *--------------------------------------------------------------------------------------------*/ import { findWorkspaceRoot } from 'find-yarn-workspace-root2'; -import findUp from 'find-up'; -import path from 'path'; -import pathExists from 'path-exists'; -import whichPM from 'which-pm'; +import findUp = require('find-up'); +import * as path from 'path'; +import whichPM = require('which-pm'); +import { Uri, workspace } from 'vscode'; -const isPNPMPreferred = async (pkgPath: string) => { +async function pathExists(filePath: string) { + try { + await workspace.fs.stat(Uri.file(filePath)); + } catch { + return false; + } + return true; +} + +async function isPNPMPreferred(pkgPath: string) { if (await pathExists(path.join(pkgPath, 'pnpm-lock.yaml'))) { return true; } @@ -21,9 +30,9 @@ const isPNPMPreferred = async (pkgPath: string) => { } return false; -}; +} -const isYarnPreferred = async (pkgPath: string) => { +async function isYarnPreferred(pkgPath: string) { if (await pathExists(path.join(pkgPath, 'yarn.lock'))) { return true; } @@ -35,13 +44,13 @@ const isYarnPreferred = async (pkgPath: string) => { } catch (err) { } return false; -}; +} const isNPMPreferred = (pkgPath: string) => { return pathExists(path.join(pkgPath, 'package-lock.json')); }; -const findPreferredPM = async (pkgPath: string) => { +export async function findPreferredPM(pkgPath: string): Promise<{ name: string, multiplePMDetected: boolean }> { const detectedPackageManagers = []; if (await isNPMPreferred(pkgPath)) { @@ -68,6 +77,4 @@ const findPreferredPM = async (pkgPath: string) => { name: detectedPackageManagers[0] || 'npm', multiplePMDetected }; -}; - -export default findPreferredPM; +} diff --git a/extensions/npm/src/scriptHover.ts b/extensions/npm/src/scriptHover.ts index 82783de410c490..6dc0891aa73c98 100644 --- a/extensions/npm/src/scriptHover.ts +++ b/extensions/npm/src/scriptHover.ts @@ -97,14 +97,13 @@ export class NpmScriptHoverProvider implements HoverProvider { return `${prefix}[${label}](command:${cmd}?${encodedArgs} "${tooltip}")`; } - public runScriptFromHover(args: any) { + public async runScriptFromHover(args: any) { let script = args.script; let documentUri = args.documentUri; let folder = workspace.getWorkspaceFolder(documentUri); if (folder) { - createTask(script, `run ${script}`, folder, documentUri).then((task) => { - tasks.executeTask(task); - }); + let task = await createTask(script, `run ${script}`, folder, documentUri); + tasks.executeTask(task); } } diff --git a/extensions/npm/src/tasks.ts b/extensions/npm/src/tasks.ts index cc7a385a2c7801..318bc70624a426 100644 --- a/extensions/npm/src/tasks.ts +++ b/extensions/npm/src/tasks.ts @@ -9,10 +9,10 @@ import { } from 'vscode'; import * as path from 'path'; import * as fs from 'fs'; +import * as minimatch from 'minimatch'; import * as nls from 'vscode-nls'; -import minimatch from 'minimatch'; import { JSONVisitor, visit, ParseErrorCode } from 'jsonc-parser'; -import findPreferredPM from './preferred-pm'; +import { findPreferredPM } from './preferred-pm'; const localize = nls.loadMessageBundle(); diff --git a/extensions/npm/tsconfig.json b/extensions/npm/tsconfig.json index 17eda67c541ad1..a50348dc223085 100644 --- a/extensions/npm/tsconfig.json +++ b/extensions/npm/tsconfig.json @@ -1,8 +1,7 @@ { "extends": "../shared.tsconfig.json", "compilerOptions": { - "outDir": "./out", - "esModuleInterop": true, + "outDir": "./out" }, "include": [ "src/**/*" From 49fde806b2f5d6017266f6301883ed98f2d0fdc0 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Fri, 9 Oct 2020 10:58:49 +0200 Subject: [PATCH 7/7] Address review changes --- extensions/npm/src/scriptHover.ts | 2 +- extensions/npm/src/tasks.ts | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/extensions/npm/src/scriptHover.ts b/extensions/npm/src/scriptHover.ts index 4e89b735e3fa3d..01c0c4b8c63906 100644 --- a/extensions/npm/src/scriptHover.ts +++ b/extensions/npm/src/scriptHover.ts @@ -104,7 +104,7 @@ export class NpmScriptHoverProvider implements HoverProvider { let folder = workspace.getWorkspaceFolder(documentUri); if (folder) { let task = await createTask(script, `run ${script}`, folder, documentUri); - tasks.executeTask(task); + await tasks.executeTask(task); } } diff --git a/extensions/npm/src/tasks.ts b/extensions/npm/src/tasks.ts index ac131bf576060f..f0681b489c6abd 100644 --- a/extensions/npm/src/tasks.ts +++ b/extensions/npm/src/tasks.ts @@ -116,7 +116,7 @@ export async function getPackageManager(folder: WorkspaceFolder): Promise { - let packageManager = await getPackageManager(folder); + const packageManager = await getPackageManager(folder); + async function getCommandLine(cmd: string): Promise { if (workspace.getConfiguration('npm', folder.uri).get('runSilent')) { return `${packageManager} --silent ${cmd}`; } return `${packageManager} ${cmd}`; } - function getRelativePath(folder: WorkspaceFolder, packageJsonUri: Uri): string { + function getRelativePath(packageJsonUri: Uri): string { let rootUri = folder.uri; let absolutePath = packageJsonUri.path.substring(0, packageJsonUri.path.length - 'package.json'.length); return absolutePath.substring(rootUri.path.length + 1); } - let relativePackageJson = getRelativePath(folder, packageJsonUri); + let relativePackageJson = getRelativePath(packageJsonUri); if (relativePackageJson.length) { - kind.path = getRelativePath(folder, packageJsonUri); + kind.path = relativePackageJson; } let taskName = getTaskName(kind.script, relativePackageJson); let cwd = path.dirname(packageJsonUri.fsPath); - const task = new Task(kind, folder, taskName, 'npm', new ShellExecution(await getCommandLine(folder, cmd), { cwd: cwd }), matcher); + const task = new Task(kind, folder, taskName, 'npm', new ShellExecution(await getCommandLine(cmd), { cwd: cwd }), matcher); task.detail = detail; return task; }