@@ -3,7 +3,16 @@ 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 , 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' ;
7
16
8
17
export async function activate ( context : vscode . ExtensionContext ) {
9
18
const workspacePath = vscode . workspace . workspaceFolders ?. [ 0 ] . uri . fsPath ?? vscode . workspace . rootPath ;
@@ -16,7 +25,7 @@ export async function activate(context: vscode.ExtensionContext) {
16
25
const packagesPick = vscode . window . createQuickPick < DirectoryEntry > ( ) ;
17
26
18
27
packagesPick . placeholder = STRINGS . PLACEHOLDER_BUSY ;
19
- packagesPick . title = 'Search in React Native Directory' ;
28
+ packagesPick . title = STRINGS . DEFAULT_TITLE ;
20
29
packagesPick . matchOnDescription = false ;
21
30
packagesPick . matchOnDetail = false ;
22
31
packagesPick . busy = true ;
@@ -29,31 +38,72 @@ export async function activate(context: vscode.ExtensionContext) {
29
38
30
39
packagesPick . onDidChangeValue ( async ( value ) => {
31
40
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
+
34
61
packagesPick . busy = false ;
35
62
} ) ;
36
63
37
64
packagesPick . onDidAccept ( ( ) => {
38
65
const selectedEntry = packagesPick . selectedItems [ 0 ] ;
39
66
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
+
40
78
const possibleActions = [
41
79
workspacePath && {
42
80
label : ENTRY_OPTION . INSTALL ,
43
81
description : `with ${ preferredManager } ${ selectedEntry . dev ? ' as devDependency' : '' } `
44
82
} ,
45
83
{ 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
+ } ,
46
97
selectedEntry . github . urls . homepage && {
47
98
label : ENTRY_OPTION . VISIT_HOMEPAGE ,
48
99
description : selectedEntry . github . urls . homepage
49
100
} ,
50
- { label : ENTRY_OPTION . VISIT_REPO } ,
51
- { label : ENTRY_OPTION . VISIT_NPM } ,
52
- { label : ENTRY_OPTION . VIEW_BUNDLEPHOBIA } ,
53
101
selectedEntry . github . license && {
54
102
label : ENTRY_OPTION . VIEW_LICENSE ,
55
103
description : selectedEntry . github . license . name
56
104
} ,
105
+ { label : ENTRY_OPTION . VIEW_BUNDLEPHOBIA } ,
106
+ ...examplesActions ,
57
107
{ label : 'copy data' , kind : QuickPickItemKind . Separator } ,
58
108
{ label : ENTRY_OPTION . COPY_NAME } ,
59
109
{ label : ENTRY_OPTION . COPY_REPO_URL } ,
0 commit comments