@@ -3,80 +3,92 @@ import * as vscode from 'vscode';
33import { QuickPickItemKind } from 'vscode' ;
44import preferredPM from 'preferred-pm' ;
55import { 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 ;
714
8- export function activate ( context : vscode . ExtensionContext ) {
915 const disposable = vscode . commands . registerCommand ( 'extension.showQuickPick' , async ( ) => {
1016 const packagesPick = vscode . window . createQuickPick < DirectoryEntry > ( ) ;
1117
12- packagesPick . placeholder = 'Loading directory data...' ;
18+ packagesPick . placeholder = STRINGS . PLACEHOLDER_BUSY ;
1319 packagesPick . title = 'Search in React Native Directory' ;
1420 packagesPick . matchOnDescription = false ;
1521 packagesPick . matchOnDetail = false ;
16-
1722 packagesPick . busy = true ;
18- packagesPick . show ( ) ;
1923
24+ packagesPick . show ( ) ;
2025 packagesPick . items = await fetchData ( ) ;
26+
2127 packagesPick . busy = false ;
22- packagesPick . placeholder = 'Search for a package' ;
28+ packagesPick . placeholder = STRINGS . PLACEHOLDER ;
2329
2430 packagesPick . onDidChangeValue ( async ( value ) => {
2531 packagesPick . busy = true ;
2632 packagesPick . title = 'Search in React Native Directory' ;
2733 packagesPick . items = await fetchData ( value ) ;
28-
2934 packagesPick . busy = false ;
3035 } ) ;
3136
3237 packagesPick . onDidAccept ( ( ) => {
3338 const selectedEntry = packagesPick . selectedItems [ 0 ] ;
3439
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 } ,
4661 { 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 ;
4969 optionPick . show ( ) ;
5070
5171 optionPick . onDidAccept ( async ( ) => {
52- const actionOption = optionPick . selectedItems [ 0 ] ;
72+ const selectedAction = optionPick . selectedItems [ 0 ] ;
5373
54- switch ( actionOption . label ) {
74+ switch ( selectedAction . label ) {
5575 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 } `
7480 ) ;
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 ! ) ) ;
8092 break ;
8193 }
8294 case ENTRY_OPTION . VISIT_REPO : {
@@ -87,6 +99,14 @@ export function activate(context: vscode.ExtensionContext) {
8799 vscode . env . openExternal ( vscode . Uri . parse ( `https://www.npmjs.com/package/${ selectedEntry . npmPkg } ` ) ) ;
88100 break ;
89101 }
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+ }
90110 case ENTRY_OPTION . COPY_NAME : {
91111 vscode . env . clipboard . writeText ( selectedEntry . npmPkg ) ;
92112 vscode . window . showInformationMessage ( 'Package name copied to clipboard' ) ;
@@ -103,8 +123,14 @@ export function activate(context: vscode.ExtensionContext) {
103123 break ;
104124 }
105125 case ENTRY_OPTION . GO_BACK : {
106- packagesPick . items = await fetchData ( packagesPick . value ) ;
126+ packagesPick . placeholder = STRINGS . PLACEHOLDER_BUSY ;
127+ packagesPick . busy = true ;
128+
107129 packagesPick . show ( ) ;
130+ packagesPick . items = await fetchData ( packagesPick . value ) ;
131+
132+ packagesPick . placeholder = STRINGS . PLACEHOLDER ;
133+ packagesPick . busy = false ;
108134 break ;
109135 }
110136 }
0 commit comments