From 47bbea4fe6a8d03b3c2863883a52b07ee83d5710 Mon Sep 17 00:00:00 2001 From: Indrek Ardel Date: Sun, 29 Oct 2017 19:30:41 +0200 Subject: [PATCH 1/9] Remove underscore requirement from install-panel --- lib/install-panel.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/install-panel.js b/lib/install-panel.js index ffcfed5c..7d2abde3 100644 --- a/lib/install-panel.js +++ b/lib/install-panel.js @@ -3,7 +3,6 @@ import path from 'path' import electron from 'electron' -import _ from 'underscore-plus' import {CompositeDisposable, TextEditor} from 'atom' import etch from 'etch' @@ -233,7 +232,7 @@ export default class InstallPanel { } highlightExactMatch (container, query, packages) { - const exactMatch = _.filter(packages, pkg => pkg.name === query)[0] + const exactMatch = packages.filter(pkg => pkg.name === query)[0] if (exactMatch) { this.addPackageCardView(container, this.getPackageCardView(exactMatch)) @@ -242,7 +241,7 @@ export default class InstallPanel { } addCloseMatches (container, query, packages) { - const matches = _.filter(packages, pkg => pkg.name.indexOf(query) >= 0) + const matches = packages.filter(pkg => pkg.name.indexOf(query) >= 0) for (let pack of matches) { this.addPackageCardView(container, this.getPackageCardView(pack)) From 4239b94047b1a77a82160c73cdcc92a430d2c7c0 Mon Sep 17 00:00:00 2001 From: Indrek Ardel Date: Sun, 29 Oct 2017 19:32:01 +0200 Subject: [PATCH 2/9] Speed up search by avoiding apm overhead --- lib/atom-io-client.coffee | 30 ++++++++++++++++++++++++++++++ lib/install-panel.js | 6 +----- spec/install-panel-spec.coffee | 4 ++-- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/lib/atom-io-client.coffee b/lib/atom-io-client.coffee index f5ce0da1..6aa27d26 100644 --- a/lib/atom-io-client.coffee +++ b/lib/atom-io-client.coffee @@ -187,3 +187,33 @@ class AtomIoClient getCachePath: -> @cachePath ?= path.join(remote.app.getPath('userData'), 'Cache', 'settings-view') + + search: (query, type, callback) -> + qs = {q: query} + + if type is 'packages' + qs.filter = 'package' + else if type is 'themes' + qs.filter = 'theme' + + options = { + url: "#{@baseURL}packages/search" + headers: {'User-Agent': navigator.userAgent} + qs: qs + } + + new Promise (resolve, reject) -> + request options, (err, res, body) -> + if err + reject err + else + try + resolve ( + JSON.parse body + .filter (pack) -> pack.releases?.latest? + .map ({readme, metadata, downloads, stargazers_count}) -> + Object.assign metadata, {readme, downloads, stargazers_count} + .sort (a, b) -> b.downloads - a.downloads + ) + catch error + reject error diff --git a/lib/install-panel.js b/lib/install-panel.js index 7d2abde3..f4ddc5ec 100644 --- a/lib/install-panel.js +++ b/lib/install-panel.js @@ -206,12 +206,8 @@ export default class InstallPanel { this.refs.searchMessage.textContent = `Searching ${this.searchType} for \u201C${query}\u201D\u2026` this.refs.searchMessage.style.display = '' - const opts = {} - opts[this.searchType] = true - opts['sortBy'] = 'downloads' - try { - let packages = (await this.packageManager.search(query, opts)) || [] + const packages = (await this.client.search(query, this.searchType)) || [] this.refs.resultsContainer.innerHTML = '' this.refs.searchMessage.style.display = 'none' if (packages.length === 0) { diff --git a/spec/install-panel-spec.coffee b/spec/install-panel-spec.coffee index 138feaba..1a987852 100644 --- a/spec/install-panel-spec.coffee +++ b/spec/install-panel-spec.coffee @@ -60,7 +60,7 @@ describe 'InstallPanel', -> describe "searching packages", -> it "highlights exact name matches", -> - spyOn(@packageManager, 'search').andCallFake -> + spyOn(@panel.client, 'search').andCallFake -> new Promise (resolve, reject) -> resolve([ {name: 'not-first'}, {name: 'first'} ]) spyOn(@panel, 'getPackageCardView').andCallThrough() @@ -72,7 +72,7 @@ describe 'InstallPanel', -> expect(@panel.getPackageCardView.argsForCall[1][0].name).toEqual 'not-first' it "prioritizes partial name matches", -> - spyOn(@packageManager, 'search').andCallFake -> + spyOn(@panel.client, 'search').andCallFake -> new Promise (resolve, reject) -> resolve([ {name: 'something else'}, {name: 'partial name match'} ]) spyOn(@panel, 'getPackageCardView').andCallThrough() From 278c168b80f8737f3434a8a34e27a55685380645 Mon Sep 17 00:00:00 2001 From: Indrek Ardel Date: Tue, 12 Dec 2017 01:03:50 +0200 Subject: [PATCH 3/9] :fire: packageManager.search --- lib/package-manager.coffee | 30 ------------------------------ spec/package-manager-spec.coffee | 1 - 2 files changed, 31 deletions(-) diff --git a/lib/package-manager.coffee b/lib/package-manager.coffee index 1a717bbf..a8b4c2f9 100644 --- a/lib/package-manager.coffee +++ b/lib/package-manager.coffee @@ -255,36 +255,6 @@ class PackageManager [version] = version.split('-') if typeof version is 'string' version - search: (query, options = {}) -> - new Promise (resolve, reject) => - args = ['search', query, '--json'] - if options.themes - args.push '--themes' - else if options.packages - args.push '--packages' - errorMessage = "Searching for \u201C#{query}\u201D failed." - - apmProcess = @runCommand args, (code, stdout, stderr) -> - if code is 0 - try - packages = JSON.parse(stdout) ? [] - if options.sortBy - packages = _.sortBy packages, (pkg) -> - return pkg[options.sortBy]*-1 - - resolve(packages) - catch parseError - error = createJsonParseError(errorMessage, parseError, stdout) - reject(error) - else - error = new Error(errorMessage) - error.stdout = stdout - error.stderr = stderr - reject(error) - - handleProcessErrors apmProcess, errorMessage, (error) -> - reject(error) - update: (pack, newVersion, callback) -> {name, theme, apmInstallSource} = pack diff --git a/spec/package-manager-spec.coffee b/spec/package-manager-spec.coffee index 802d6b31..b51bdd3c 100644 --- a/spec/package-manager-spec.coffee +++ b/spec/package-manager-spec.coffee @@ -11,7 +11,6 @@ describe "PackageManager", -> it "handle errors spawning apm", -> noSuchCommandError = if process.platform is 'win32' then ' cannot find the path ' else 'ENOENT' - waitsForPromise shouldReject: true, -> packageManager.search('test') waitsForPromise shouldReject: true, -> packageManager.getInstalled() waitsForPromise shouldReject: true, -> packageManager.getOutdated() waitsForPromise shouldReject: true, -> packageManager.getFeatured() From 46a55c20aa63facd1c22474060f5f6b6fabf5d71 Mon Sep 17 00:00:00 2001 From: Indrek Ardel Date: Thu, 4 Jan 2018 14:26:08 +0200 Subject: [PATCH 4/9] Request sorted results --- lib/atom-io-client.coffee | 30 +++++++++++++++--------------- lib/install-panel.js | 5 ++++- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/lib/atom-io-client.coffee b/lib/atom-io-client.coffee index 6aa27d26..4d2cc2fc 100644 --- a/lib/atom-io-client.coffee +++ b/lib/atom-io-client.coffee @@ -188,32 +188,32 @@ class AtomIoClient getCachePath: -> @cachePath ?= path.join(remote.app.getPath('userData'), 'Cache', 'settings-view') - search: (query, type, callback) -> + search: (query, options) -> qs = {q: query} - if type is 'packages' - qs.filter = 'package' - else if type is 'themes' + if options.themes qs.filter = 'theme' + else if options.packages + qs.filter = 'package' + + if options.sort + qs.sort = options.sort options = { url: "#{@baseURL}packages/search" headers: {'User-Agent': navigator.userAgent} qs: qs + json: true } new Promise (resolve, reject) -> request options, (err, res, body) -> if err - reject err + error = new Error("Searching for \u201C#{query}\u201D failed.") + error.stderr = err.message + reject error else - try - resolve ( - JSON.parse body - .filter (pack) -> pack.releases?.latest? - .map ({readme, metadata, downloads, stargazers_count}) -> - Object.assign metadata, {readme, downloads, stargazers_count} - .sort (a, b) -> b.downloads - a.downloads - ) - catch error - reject error + body = body.filter (pkg) -> pkg.releases?.latest? + .map ({readme, metadata, downloads, stargazers_count}) -> + Object.assign metadata, {readme, downloads, stargazers_count} + resolve body diff --git a/lib/install-panel.js b/lib/install-panel.js index f4ddc5ec..2aa2f726 100644 --- a/lib/install-panel.js +++ b/lib/install-panel.js @@ -206,8 +206,11 @@ export default class InstallPanel { this.refs.searchMessage.textContent = `Searching ${this.searchType} for \u201C${query}\u201D\u2026` this.refs.searchMessage.style.display = '' + const options = {sort: {downloads: 'desc'}} + options[this.searchType] = true + try { - const packages = (await this.client.search(query, this.searchType)) || [] + const packages = (await this.client.search(query, options)) || [] this.refs.resultsContainer.innerHTML = '' this.refs.searchMessage.style.display = 'none' if (packages.length === 0) { From e64b9e3bf105b48f6c1ce2ab3008a9d70e6c3359 Mon Sep 17 00:00:00 2001 From: Indrek Ardel Date: Thu, 4 Jan 2018 14:34:02 +0200 Subject: [PATCH 5/9] Fix lint --- lib/atom-io-client.coffee | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/atom-io-client.coffee b/lib/atom-io-client.coffee index 4d2cc2fc..9aa3f577 100644 --- a/lib/atom-io-client.coffee +++ b/lib/atom-io-client.coffee @@ -213,7 +213,8 @@ class AtomIoClient error.stderr = err.message reject error else - body = body.filter (pkg) -> pkg.releases?.latest? - .map ({readme, metadata, downloads, stargazers_count}) -> - Object.assign metadata, {readme, downloads, stargazers_count} - resolve body + resolve( + body.filter (pkg) -> pkg.releases?.latest? + .map ({readme, metadata, downloads, stargazers_count}) -> + Object.assign metadata, {readme, downloads, stargazers_count} + ) From c8efff1b45d29bb949aa2cd09d6eebeb049b50dd Mon Sep 17 00:00:00 2001 From: Indrek Ardel Date: Sat, 6 Jan 2018 09:15:17 +0200 Subject: [PATCH 6/9] Query packages by relevance, sort by downloads locally --- lib/atom-io-client.coffee | 4 +--- lib/install-panel.js | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/atom-io-client.coffee b/lib/atom-io-client.coffee index 9aa3f577..233fee43 100644 --- a/lib/atom-io-client.coffee +++ b/lib/atom-io-client.coffee @@ -196,9 +196,6 @@ class AtomIoClient else if options.packages qs.filter = 'package' - if options.sort - qs.sort = options.sort - options = { url: "#{@baseURL}packages/search" headers: {'User-Agent': navigator.userAgent} @@ -217,4 +214,5 @@ class AtomIoClient body.filter (pkg) -> pkg.releases?.latest? .map ({readme, metadata, downloads, stargazers_count}) -> Object.assign metadata, {readme, downloads, stargazers_count} + .sort (a, b) -> b.downloads - a.downloads ) diff --git a/lib/install-panel.js b/lib/install-panel.js index 2aa2f726..511da2f1 100644 --- a/lib/install-panel.js +++ b/lib/install-panel.js @@ -206,7 +206,7 @@ export default class InstallPanel { this.refs.searchMessage.textContent = `Searching ${this.searchType} for \u201C${query}\u201D\u2026` this.refs.searchMessage.style.display = '' - const options = {sort: {downloads: 'desc'}} + const options = {} options[this.searchType] = true try { From 6bb842cea332f80d7f89f41a17d0304ec9efec2b Mon Sep 17 00:00:00 2001 From: Indrek Ardel Date: Mon, 8 Jan 2018 10:17:38 +0200 Subject: [PATCH 7/9] Fix highlighted results not working on search results that contain uppercase letters --- lib/install-panel.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/install-panel.js b/lib/install-panel.js index 511da2f1..0a619119 100644 --- a/lib/install-panel.js +++ b/lib/install-panel.js @@ -231,7 +231,7 @@ export default class InstallPanel { } highlightExactMatch (container, query, packages) { - const exactMatch = packages.filter(pkg => pkg.name === query)[0] + const exactMatch = packages.filter(pkg => pkg.name.toLowerCase() === query)[0] if (exactMatch) { this.addPackageCardView(container, this.getPackageCardView(exactMatch)) @@ -240,7 +240,7 @@ export default class InstallPanel { } addCloseMatches (container, query, packages) { - const matches = packages.filter(pkg => pkg.name.indexOf(query) >= 0) + const matches = packages.filter(pkg => pkg.name.toLowerCase().indexOf(query) >= 0) for (let pack of matches) { this.addPackageCardView(container, this.getPackageCardView(pack)) From b1f5fc8accd6af1b4a7244be48577e14a8dc9c40 Mon Sep 17 00:00:00 2001 From: Indrek Ardel Date: Tue, 9 Jan 2018 17:54:32 +0200 Subject: [PATCH 8/9] Make search use gzip --- lib/atom-io-client.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/atom-io-client.coffee b/lib/atom-io-client.coffee index 233fee43..84951540 100644 --- a/lib/atom-io-client.coffee +++ b/lib/atom-io-client.coffee @@ -201,6 +201,7 @@ class AtomIoClient headers: {'User-Agent': navigator.userAgent} qs: qs json: true + gzip: true } new Promise (resolve, reject) -> From 7cf0831544f1de35150019ce9288b5a60ac54d47 Mon Sep 17 00:00:00 2001 From: Indrek Ardel Date: Wed, 10 Jan 2018 02:13:14 +0200 Subject: [PATCH 9/9] Convert regular request to gzip and json, update dependency --- lib/atom-io-client.coffee | 11 +++++------ package.json | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/atom-io-client.coffee b/lib/atom-io-client.coffee index 84951540..85e20ca1 100644 --- a/lib/atom-io-client.coffee +++ b/lib/atom-io-client.coffee @@ -69,17 +69,16 @@ class AtomIoClient options = { url: "#{@baseURL}#{path}" headers: {'User-Agent': navigator.userAgent} + json: true + gzip: true } request options, (err, res, body) => - try - data = JSON.parse(body) - catch error - return callback(error) + return callback(err) if err - delete data.versions + delete body.versions cached = - data: data + data: body createdOn: Date.now() localStorage.setItem(@cacheKeyForPath(path), JSON.stringify(cached)) callback(err, cached.data) diff --git a/package.json b/package.json index 7dee72b0..51818bfc 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "glob": "4.3.1", "hosted-git-info": "^2.1.4", "marked": "^0.3.6", - "request": "^2.40", + "request": "^2.83.0", "roaster": "^1.1.2", "season": "^6.0.2", "semver": "^5.3.0",