@@ -11,26 +11,22 @@ class PackageSearchPrompter {
1111  constructor ( )  { 
1212    // goddamn hacky memoization 
1313    this . packageDetailsMapping  =  { } ; 
14+     this . searchTerm  =  null ; 
1415  } 
1516
16-   async  getPackageDetails ( searchTerm )  { 
17-     const  packageResults  =  await  getSuggestions ( {  terms : [ searchTerm ]  } ) ; 
18- 
19-     const  packageDetailsMapping  =  { } ; 
17+   getPackageDetails ( results )  { 
18+     const  choices  =  [ ] ; 
2019    this . packageDetailsMapping  =  { } ; 
21-     // ensures that done searching option is selectable 
22-     const  formattedPackageDetails  =  [ DONE_SEARCHING ] ; 
23-     this . packageDetailsMapping [ DONE_SEARCHING ]  =  DONE_SEARCHING ; 
2420
25-     packageResults . forEach ( ( result )  =>  { 
21+     results . forEach ( ( result )  =>  { 
2622      const  { 
2723        name, 
2824        version, 
2925        description, 
3026        publisher, 
3127      }  =  result . package ; 
3228
33-       const  author  =  publisher  ? publisher . username  : '' ; 
29+       const  author  =  publisher  &&   publisher . username   ? publisher . username  : '' ; 
3430      const  score  =  result  &&  result . score  ? result . score . final  : null ; 
3531
3632      const  formattedDetails  =  formatPackageDetails ( { 
@@ -41,13 +37,14 @@ class PackageSearchPrompter {
4137        score, 
4238      } ) ; 
4339
44-       formattedPackageDetails . push ( formattedDetails ) ; 
45- 
46-       packageDetailsMapping [ formattedDetails ]  =  {  name,  version } ; 
40+       this . packageDetailsMapping [ formattedDetails ]  =  {  name,  version } ; 
41+       choices . push ( formattedDetails ) ; 
4742    } ) ; 
4843
49-     this . packageDetailsMapping  =  packageDetailsMapping ; 
50-     return  formattedPackageDetails ; 
44+     choices . push ( DONE_SEARCHING ) ; 
45+     this . packageDetailsMapping [ DONE_SEARCHING ]  =  DONE_SEARCHING ; 
46+ 
47+     return  choices ; 
5148  } 
5249
5350  async  prompt ( )  { 
@@ -56,14 +53,18 @@ class PackageSearchPrompter {
5653        type : 'autocomplete' , 
5754        name : 'npmPackage' , 
5855        message : 'Search for npm package' , 
59-         source : async  ( answersSoFar ,  searchTerm )  =>  { 
60-           if  ( ! searchTerm )  { 
61-             // ensures that done searching option is selectable 
62-             this . packageDetailsMapping [ DONE_SEARCHING ]  =  DONE_SEARCHING ; 
63-             return  [ DONE_SEARCHING ] ; 
64-           } 
56+         // eslint-disable-next-line consistent-return 
57+         source : async  ( _ ,  searchTerm )  =>  { 
58+           this . searchTerm  =  searchTerm ; 
59+           const  suggestions  =  searchTerm  ? await  getSuggestions ( {  terms : [ searchTerm ] ,  size : 10  } )  : [ ] ; 
6560
66-           return  this . getPackageDetails ( searchTerm ) ; 
61+           // first search will often return last 
62+           // so in order for memoization to work correctly, need to make sure 
63+           // only update package details when latest search term is equal to to searchTerm 
64+           // variable in the Promise 
65+           if  ( this . searchTerm  ===  searchTerm )  { 
66+             return  Promise . resolve ( this . getPackageDetails ( suggestions ) ) ; 
67+           } 
6768        } , 
6869      } , 
6970    ] ) ; 
0 commit comments