@@ -3,80 +3,92 @@ import * as vscode from 'vscode';
3
3
import { QuickPickItemKind } from 'vscode' ;
4
4
import preferredPM from 'preferred-pm' ;
5
5
import { DirectoryEntry } from './types' ;
6
- import { ENTRY_OPTION , fetchData } from './utils' ;
6
+ import { ENTRY_OPTION , fetchData , getCommandToRun , STRINGS } from './utils' ;
7
+
8
+ export async function activate ( context : vscode . ExtensionContext ) {
9
+ const workspacePath = vscode . workspace . workspaceFolders ?. [ 0 ] . uri . fsPath ?? vscode . workspace . rootPath ;
10
+ const manager = vscode . workspace . getConfiguration ( 'npm' ) . get < string > ( 'packageManager' , 'npm' ) ;
11
+
12
+ const shouldCheckPreferred = workspacePath && ( ! manager || manager === 'auto' ) ;
13
+ const preferredManager = shouldCheckPreferred ? ( ( await preferredPM ( workspacePath ) ) ?. name ?? 'npm' ) : manager ;
7
14
8
- export function activate ( context : vscode . ExtensionContext ) {
9
15
const disposable = vscode . commands . registerCommand ( 'extension.showQuickPick' , async ( ) => {
10
16
const packagesPick = vscode . window . createQuickPick < DirectoryEntry > ( ) ;
11
17
12
- packagesPick . placeholder = 'Loading directory data...' ;
18
+ packagesPick . placeholder = STRINGS . PLACEHOLDER_BUSY ;
13
19
packagesPick . title = 'Search in React Native Directory' ;
14
20
packagesPick . matchOnDescription = false ;
15
21
packagesPick . matchOnDetail = false ;
16
-
17
22
packagesPick . busy = true ;
18
- packagesPick . show ( ) ;
19
23
24
+ packagesPick . show ( ) ;
20
25
packagesPick . items = await fetchData ( ) ;
26
+
21
27
packagesPick . busy = false ;
22
- packagesPick . placeholder = 'Search for a package' ;
28
+ packagesPick . placeholder = STRINGS . PLACEHOLDER ;
23
29
24
30
packagesPick . onDidChangeValue ( async ( value ) => {
25
31
packagesPick . busy = true ;
26
32
packagesPick . title = 'Search in React Native Directory' ;
27
33
packagesPick . items = await fetchData ( value ) ;
28
-
29
34
packagesPick . busy = false ;
30
35
} ) ;
31
36
32
37
packagesPick . onDidAccept ( ( ) => {
33
38
const selectedEntry = packagesPick . selectedItems [ 0 ] ;
34
39
35
- const optionPick = vscode . window . createQuickPick ( ) ;
36
- optionPick . title = `"${ selectedEntry . label } " options` ;
37
- optionPick . items = [
38
- { label : ENTRY_OPTION . INSTALL , alwaysShow : true } ,
39
- { label : `Open URLs` , kind : QuickPickItemKind . Separator } ,
40
- { label : ENTRY_OPTION . VISIT_REPO , alwaysShow : true } ,
41
- { label : ENTRY_OPTION . VISIT_NPM , alwaysShow : true } ,
42
- { label : 'Copy data' , kind : QuickPickItemKind . Separator } ,
43
- { label : ENTRY_OPTION . COPY_NAME , alwaysShow : true } ,
44
- { label : ENTRY_OPTION . COPY_REPO_URL , alwaysShow : true } ,
45
- { label : ENTRY_OPTION . COPY_NPM_URL , alwaysShow : true } ,
40
+ const possibleActions = [
41
+ workspacePath && {
42
+ label : ENTRY_OPTION . INSTALL ,
43
+ description : `with ${ preferredManager } ${ selectedEntry . dev ? ' as devDependency' : '' } `
44
+ } ,
45
+ { label : `open URLs` , kind : QuickPickItemKind . Separator } ,
46
+ selectedEntry . github . urls . homepage && {
47
+ label : ENTRY_OPTION . VISIT_HOMEPAGE ,
48
+ description : selectedEntry . github . urls . homepage
49
+ } ,
50
+ { label : ENTRY_OPTION . VISIT_REPO } ,
51
+ { label : ENTRY_OPTION . VISIT_NPM } ,
52
+ { label : ENTRY_OPTION . VIEW_BUNDLEPHOBIA } ,
53
+ selectedEntry . github . license && {
54
+ label : ENTRY_OPTION . VIEW_LICENSE ,
55
+ description : selectedEntry . github . license . name
56
+ } ,
57
+ { label : 'copy data' , kind : QuickPickItemKind . Separator } ,
58
+ { label : ENTRY_OPTION . COPY_NAME } ,
59
+ { label : ENTRY_OPTION . COPY_REPO_URL } ,
60
+ { label : ENTRY_OPTION . COPY_NPM_URL } ,
46
61
{ label : '' , kind : QuickPickItemKind . Separator } ,
47
- { label : ENTRY_OPTION . GO_BACK , alwaysShow : true }
48
- ] ;
62
+ { label : ENTRY_OPTION . GO_BACK }
63
+ ] . filter ( ( option ) => ! ! option && typeof option === 'object' ) ;
64
+
65
+ const optionPick = vscode . window . createQuickPick ( ) ;
66
+ optionPick . title = `Actions for "${ selectedEntry . label } "` ;
67
+ optionPick . placeholder = 'Select an action' ;
68
+ optionPick . items = possibleActions ;
49
69
optionPick . show ( ) ;
50
70
51
71
optionPick . onDidAccept ( async ( ) => {
52
- const actionOption = optionPick . selectedItems [ 0 ] ;
72
+ const selectedAction = optionPick . selectedItems [ 0 ] ;
53
73
54
- switch ( actionOption . label ) {
74
+ switch ( selectedAction . label ) {
55
75
case ENTRY_OPTION . INSTALL : {
56
- const workspacePath =
57
- vscode . workspace . workspaceFolders ?. [ 0 ] . uri . fsPath ?? vscode . env . appRoot ?? vscode . workspace . rootPath ;
58
-
59
- const manager = vscode . workspace . getConfiguration ( 'npm' ) . get ( 'packageManager' ) ;
60
-
61
- if ( workspacePath ) {
62
- const preferredManager =
63
- ! manager || manager === 'auto' ? ( ( await preferredPM ( workspacePath ) ) ?. name ?? 'npm' ) : manager ;
64
-
65
- exec ( `${ preferredManager } install ${ selectedEntry . label } ` , { cwd : workspacePath } , ( error , stout ) => {
66
- if ( error ) {
67
- vscode . window . showErrorMessage (
68
- `An error occurred while trying to install the package: ${ error . message } `
69
- ) ;
70
- return ;
71
- }
72
- vscode . window . showInformationMessage (
73
- `\`${ selectedEntry . npmPkg } \` package has been installed in current workspace using \`${ preferredManager } \`: ${ stout } `
76
+ exec ( getCommandToRun ( selectedEntry , preferredManager ) , { cwd : workspacePath } , ( error , stout ) => {
77
+ if ( error ) {
78
+ vscode . window . showErrorMessage (
79
+ `An error occurred while trying to install the \`${ selectedEntry . npmPkg } \` package: ${ error . message } `
74
80
) ;
75
- optionPick . hide ( ) ;
76
- } ) ;
77
- } else {
78
- vscode . window . showErrorMessage ( `Cannot determine current workspace path` ) ;
79
- }
81
+ return ;
82
+ }
83
+ vscode . window . showInformationMessage (
84
+ `\`${ selectedEntry . npmPkg } \` package has been installed${ selectedEntry . dev ? ' as `devDependency`' : '' } in current workspace using \`${ preferredManager } \`: ${ stout } `
85
+ ) ;
86
+ optionPick . hide ( ) ;
87
+ } ) ;
88
+ break ;
89
+ }
90
+ case ENTRY_OPTION . VISIT_HOMEPAGE : {
91
+ vscode . env . openExternal ( vscode . Uri . parse ( selectedEntry . github . urls . homepage ! ) ) ;
80
92
break ;
81
93
}
82
94
case ENTRY_OPTION . VISIT_REPO : {
@@ -87,6 +99,14 @@ export function activate(context: vscode.ExtensionContext) {
87
99
vscode . env . openExternal ( vscode . Uri . parse ( `https://www.npmjs.com/package/${ selectedEntry . npmPkg } ` ) ) ;
88
100
break ;
89
101
}
102
+ case ENTRY_OPTION . VIEW_BUNDLEPHOBIA : {
103
+ vscode . env . openExternal ( vscode . Uri . parse ( `https://bundlephobia.com/package/${ selectedEntry . npmPkg } ` ) ) ;
104
+ break ;
105
+ }
106
+ case ENTRY_OPTION . VIEW_LICENSE : {
107
+ vscode . env . openExternal ( vscode . Uri . parse ( selectedEntry . github . license . url ) ) ;
108
+ break ;
109
+ }
90
110
case ENTRY_OPTION . COPY_NAME : {
91
111
vscode . env . clipboard . writeText ( selectedEntry . npmPkg ) ;
92
112
vscode . window . showInformationMessage ( 'Package name copied to clipboard' ) ;
@@ -103,8 +123,14 @@ export function activate(context: vscode.ExtensionContext) {
103
123
break ;
104
124
}
105
125
case ENTRY_OPTION . GO_BACK : {
106
- packagesPick . items = await fetchData ( packagesPick . value ) ;
126
+ packagesPick . placeholder = STRINGS . PLACEHOLDER_BUSY ;
127
+ packagesPick . busy = true ;
128
+
107
129
packagesPick . show ( ) ;
130
+ packagesPick . items = await fetchData ( packagesPick . value ) ;
131
+
132
+ packagesPick . placeholder = STRINGS . PLACEHOLDER ;
133
+ packagesPick . busy = false ;
108
134
break ;
109
135
}
110
136
}
0 commit comments