11import { exec } from 'node:child_process' ;
2- import { workspace , commands , window , type ExtensionContext , QuickPickItemKind , env , Uri } from 'vscode' ;
2+ import { commands , env , type ExtensionContext , QuickPickItemKind , Uri , window , workspace } from 'vscode' ;
33
44import { detectPackageManager } from './detectPackageManager' ;
55import { DirectoryEntry } from './types' ;
66import {
7+ deduplicateSearchTokens ,
78 ENTRY_OPTION ,
89 fetchData ,
910 getCommandToRun ,
11+ getCompatibilityList ,
12+ getPlatformsList ,
1013 KEYWORD_REGEX ,
1114 numberFormatter ,
15+ openListWithSearch ,
1216 STRINGS ,
1317 VALID_KEYWORDS_MAP ,
1418 ValidKeyword
@@ -77,6 +81,9 @@ export async function activate(context: ExtensionContext) {
7781 ]
7882 : [ ] ;
7983
84+ const platformsList = getPlatformsList ( selectedEntry ) ;
85+ const compatibilityList = getCompatibilityList ( selectedEntry ) ;
86+
8087 const possibleActions = [
8188 workspacePath && {
8289 label : ENTRY_OPTION . INSTALL ,
@@ -106,6 +113,15 @@ export async function activate(context: ExtensionContext) {
106113 description : selectedEntry . github . license . name
107114 } ,
108115 { label : ENTRY_OPTION . VIEW_BUNDLEPHOBIA } ,
116+ { label : 'details' , kind : QuickPickItemKind . Separator } ,
117+ {
118+ label : ENTRY_OPTION . PLATFORMS ,
119+ description : platformsList . join ( ', ' )
120+ } ,
121+ compatibilityList . length > 0 && {
122+ label : ENTRY_OPTION . COMPATIBILITY ,
123+ description : compatibilityList . join ( ', ' )
124+ } ,
109125 ...examplesActions ,
110126 { label : 'copy data' , kind : QuickPickItemKind . Separator } ,
111127 { label : ENTRY_OPTION . COPY_NAME } ,
@@ -141,7 +157,9 @@ export async function activate(context: ExtensionContext) {
141157 break ;
142158 }
143159 case ENTRY_OPTION . VISIT_HOMEPAGE : {
144- env . openExternal ( Uri . parse ( selectedEntry . github . urls . homepage ! ) ) ;
160+ if ( selectedEntry . github . urls . homepage ) {
161+ env . openExternal ( Uri . parse ( selectedEntry . github . urls . homepage ) ) ;
162+ }
145163 break ;
146164 }
147165 case ENTRY_OPTION . VISIT_REPO : {
@@ -152,12 +170,22 @@ export async function activate(context: ExtensionContext) {
152170 env . openExternal ( Uri . parse ( `https://www.npmjs.com/package/${ selectedEntry . npmPkg } ` ) ) ;
153171 break ;
154172 }
173+ case ENTRY_OPTION . VIEW_LICENSE : {
174+ env . openExternal ( Uri . parse ( selectedEntry . github . license . url ) ) ;
175+ break ;
176+ }
155177 case ENTRY_OPTION . VIEW_BUNDLEPHOBIA : {
156178 env . openExternal ( Uri . parse ( `https://bundlephobia.com/package/${ selectedEntry . npmPkg } ` ) ) ;
157179 break ;
158180 }
159- case ENTRY_OPTION . VIEW_LICENSE : {
160- env . openExternal ( Uri . parse ( selectedEntry . github . license . url ) ) ;
181+ case ENTRY_OPTION . PLATFORMS : {
182+ const searchValue = deduplicateSearchTokens ( packagesPick . value , platformsList ) ;
183+ await openListWithSearch ( packagesPick , searchValue ) ;
184+ break ;
185+ }
186+ case ENTRY_OPTION . COMPATIBILITY : {
187+ const searchValue = deduplicateSearchTokens ( packagesPick . value , compatibilityList ) ;
188+ await openListWithSearch ( packagesPick , searchValue ) ;
161189 break ;
162190 }
163191 case ENTRY_OPTION . COPY_NAME : {
@@ -176,14 +204,7 @@ export async function activate(context: ExtensionContext) {
176204 break ;
177205 }
178206 case ENTRY_OPTION . GO_BACK : {
179- packagesPick . placeholder = STRINGS . PLACEHOLDER_BUSY ;
180- packagesPick . busy = true ;
181-
182- packagesPick . show ( ) ;
183- packagesPick . items = await fetchData ( packagesPick . value ) ;
184-
185- packagesPick . placeholder = STRINGS . PLACEHOLDER ;
186- packagesPick . busy = false ;
207+ await openListWithSearch ( packagesPick ) ;
187208 break ;
188209 }
189210 }
0 commit comments