@@ -3,7 +3,16 @@ import * as vscode from 'vscode';
33import { QuickPickItemKind } from 'vscode' ;
44import preferredPM from 'preferred-pm' ;
55import { DirectoryEntry } from './types' ;
6- import { ENTRY_OPTION , fetchData , getCommandToRun , STRINGS } from './utils' ;
6+ import {
7+ ENTRY_OPTION ,
8+ fetchData ,
9+ getCommandToRun ,
10+ KEYWORD_REGEX ,
11+ numberFormatter ,
12+ STRINGS ,
13+ VALID_KEYWORDS_MAP ,
14+ ValidKeyword
15+ } from './utils' ;
716
817export async function activate ( context : vscode . ExtensionContext ) {
918 const workspacePath = vscode . workspace . workspaceFolders ?. [ 0 ] . uri . fsPath ?? vscode . workspace . rootPath ;
@@ -16,7 +25,7 @@ export async function activate(context: vscode.ExtensionContext) {
1625 const packagesPick = vscode . window . createQuickPick < DirectoryEntry > ( ) ;
1726
1827 packagesPick . placeholder = STRINGS . PLACEHOLDER_BUSY ;
19- packagesPick . title = 'Search in React Native Directory' ;
28+ packagesPick . title = STRINGS . DEFAULT_TITLE ;
2029 packagesPick . matchOnDescription = false ;
2130 packagesPick . matchOnDetail = false ;
2231 packagesPick . busy = true ;
@@ -29,31 +38,72 @@ export async function activate(context: vscode.ExtensionContext) {
2938
3039 packagesPick . onDidChangeValue ( async ( value ) => {
3140 packagesPick . busy = true ;
32- packagesPick . title = 'Search in React Native Directory' ;
33- packagesPick . items = await fetchData ( value ) ;
41+
42+ if ( value . includes ( ':' ) ) {
43+ const keywords = ( value . match ( KEYWORD_REGEX ) ?? [ ] ) . map ( ( token ) => token . slice ( 1 ) ) ;
44+ const searchString = value . replace ( KEYWORD_REGEX , '' ) . trim ( ) ;
45+
46+ const validKeywords = keywords
47+ . map ( ( keyword ) => keyword . toLowerCase ( ) )
48+ . filter ( ( keyword ) : keyword is ValidKeyword => keyword in VALID_KEYWORDS_MAP )
49+ . map ( ( keyword ) => VALID_KEYWORDS_MAP [ keyword ] as ValidKeyword ) ;
50+
51+ if ( validKeywords . length > 0 ) {
52+ packagesPick . title = `Active filters: ${ validKeywords . join ( ', ' ) } ` ;
53+ } else {
54+ packagesPick . title = STRINGS . DEFAULT_TITLE ;
55+ }
56+ packagesPick . items = await fetchData ( searchString , validKeywords ) ;
57+ } else {
58+ packagesPick . items = await fetchData ( value ) ;
59+ }
60+
3461 packagesPick . busy = false ;
3562 } ) ;
3663
3764 packagesPick . onDidAccept ( ( ) => {
3865 const selectedEntry = packagesPick . selectedItems [ 0 ] ;
3966
67+ const examplesActions =
68+ selectedEntry . examples && selectedEntry . examples . length > 0
69+ ? [
70+ { label : 'view examples' , kind : QuickPickItemKind . Separator } ,
71+ ...selectedEntry . examples . map ( ( example , index ) => ( {
72+ label : `Example #${ index + 1 } ` ,
73+ description : example
74+ } ) )
75+ ]
76+ : [ ] ;
77+
4078 const possibleActions = [
4179 workspacePath && {
4280 label : ENTRY_OPTION . INSTALL ,
4381 description : `with ${ preferredManager } ${ selectedEntry . dev ? ' as devDependency' : '' } `
4482 } ,
4583 { label : `open URLs` , kind : QuickPickItemKind . Separator } ,
84+ {
85+ label : ENTRY_OPTION . VISIT_REPO ,
86+ description : [
87+ `$(star) ${ numberFormatter . format ( selectedEntry . github . stats . stars ) } ` ,
88+ `$(gist-fork) ${ numberFormatter . format ( selectedEntry . github . stats . forks ) } `
89+ ] . join ( ' ' )
90+ } ,
91+ {
92+ label : ENTRY_OPTION . VISIT_NPM ,
93+ description : selectedEntry . npm ?. downloads
94+ ? `$(arrow-circle-down) ${ numberFormatter . format ( selectedEntry . npm . downloads ) } `
95+ : ''
96+ } ,
4697 selectedEntry . github . urls . homepage && {
4798 label : ENTRY_OPTION . VISIT_HOMEPAGE ,
4899 description : selectedEntry . github . urls . homepage
49100 } ,
50- { label : ENTRY_OPTION . VISIT_REPO } ,
51- { label : ENTRY_OPTION . VISIT_NPM } ,
52- { label : ENTRY_OPTION . VIEW_BUNDLEPHOBIA } ,
53101 selectedEntry . github . license && {
54102 label : ENTRY_OPTION . VIEW_LICENSE ,
55103 description : selectedEntry . github . license . name
56104 } ,
105+ { label : ENTRY_OPTION . VIEW_BUNDLEPHOBIA } ,
106+ ...examplesActions ,
57107 { label : 'copy data' , kind : QuickPickItemKind . Separator } ,
58108 { label : ENTRY_OPTION . COPY_NAME } ,
59109 { label : ENTRY_OPTION . COPY_REPO_URL } ,
0 commit comments