Skip to content

Commit 6b4b794

Browse files
authored
feat: detect package manager automatically with the vscode command (#76)
* refactor: detect package manager automatically with the vscode command * update * typo * coderabbit
1 parent efbbab7 commit 6b4b794

17 files changed

Lines changed: 19 additions & 141 deletions

File tree

src/core/workspace.ts

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,38 @@ import type { DependencyInfo, PackageManifestInfo, WorkspaceCatalogInfo } from '
33
import type { CacheOptions } from 'ocache'
44
import type { WorkspaceFolder } from 'vscode'
55
import { getPackageInfo } from '#api/package'
6+
import { PNPM_WORKSPACE_BASENAME, YARN_WORKSPACE_BASENAME } from '#constants'
67
import { logger } from '#state'
78
import { isOffsetInRange } from '#utils/ast'
89
import { resolveDependencySpec } from '#utils/dependency'
910
import { getDocumentText, isPackageManifestPath, isWorkspaceFilePath } from '#utils/file'
1011
import { resolveExactVersion } from '#utils/package'
11-
import { detectPackageManager, workspaceFileMapping } from '#utils/package-manager'
1212
import { lazyInit } from '#utils/shared'
1313
import { defineCachedFunction } from 'ocache'
14-
import { Uri, workspace } from 'vscode'
14+
import { commands, Uri, window, workspace } from 'vscode'
1515
import { accessOk } from 'vscode-find-up'
1616
import { getExtractor } from './extractors'
1717

1818
type WithResolvedDependencyInfo<T> = Omit<T, 'dependencies'> & {
1919
dependencies: ResolvedDependencyInfo[]
2020
}
2121

22+
export const workspaceFileMapping: Record<Exclude<PackageManager, 'npm'>, string> = {
23+
pnpm: PNPM_WORKSPACE_BASENAME,
24+
yarn: YARN_WORKSPACE_BASENAME,
25+
}
26+
27+
async function getPackageManager(uri: Uri): Promise<PackageManager> {
28+
try {
29+
const result = await commands.executeCommand<PackageManager>('npm.packageManager', uri)
30+
return result || 'npm'
31+
} catch (error) {
32+
console.error('Error getting package manager:', error)
33+
window.showErrorMessage('Failed to detect package manager. Defaulting to npm.')
34+
return 'npm'
35+
}
36+
}
37+
2238
class WorkspaceContext {
2339
folder: WorkspaceFolder
2440
packageManager: PackageManager = 'npm'
@@ -38,7 +54,7 @@ class WorkspaceContext {
3854

3955
async loadWorkspace() {
4056
this.#catalogs = undefined
41-
this.packageManager = await detectPackageManager(this.folder)
57+
this.packageManager = await getPackageManager(this.folder.uri)
4258

4359
logger.info(`[workspace-context] detect package manager: ${this.packageManager}`)
4460

src/utils/package-manager.ts

Lines changed: 0 additions & 32 deletions
This file was deleted.

tests/fixtures/workspace/dirty-doc/package.json

Lines changed: 0 additions & 4 deletions
This file was deleted.

tests/fixtures/workspace/dirty-doc/packages/app/package.json

Lines changed: 0 additions & 7 deletions
This file was deleted.

tests/fixtures/workspace/minimal/package.json

Lines changed: 0 additions & 4 deletions
This file was deleted.

tests/fixtures/workspace/package-manager-npm/.yarnrc.yml

Lines changed: 0 additions & 2 deletions
This file was deleted.

tests/fixtures/workspace/package-manager-npm/package.json

Lines changed: 0 additions & 5 deletions
This file was deleted.

tests/fixtures/workspace/package-manager-npm/pnpm-workspace.yaml

Lines changed: 0 additions & 2 deletions
This file was deleted.

tests/fixtures/workspace/package-manager-pnpm/package.json

Lines changed: 0 additions & 4 deletions
This file was deleted.

tests/fixtures/workspace/package-manager-pnpm/pnpm-workspace.yaml

Lines changed: 0 additions & 2 deletions
This file was deleted.

0 commit comments

Comments
 (0)