Skip to content

Commit d51fdcb

Browse files
committed
fix(package-order): fix package memoization issue when searching
1 parent 487de80 commit d51fdcb

File tree

5 files changed

+62
-34
lines changed

5 files changed

+62
-34
lines changed

.babelrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"plugins": [
66
"@babel/transform-runtime",
77
"@babel/transform-async-to-generator",
8-
"@babel/plugin-proposal-object-rest-spread",
8+
"@babel/plugin-proposal-object-rest-spread"
99
],
1010
"env": {
1111
"production": {

package-lock.json

Lines changed: 37 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
"@babel/runtime": "^7.0.0-beta.46",
4444
"axios": "^0.18.0",
4545
"chalk": "^2.3.2",
46+
"child-process-promise": "^2.2.1",
4647
"commander": "^2.15.1",
4748
"inquirer": "^6.0.0",
4849
"inquirer-autocomplete-prompt": "^0.12.2",

src/PackageSearchPrompter.js

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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
]);

src/install.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { spawn } from 'child_process';
1+
import { spawn } from 'child-process-promise';
22

33
const install = ({
44
packages,

0 commit comments

Comments
 (0)