diff --git a/lib/atom-io-client.coffee b/lib/atom-io-client.coffee index f5ce0da1..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) @@ -187,3 +186,33 @@ class AtomIoClient getCachePath: -> @cachePath ?= path.join(remote.app.getPath('userData'), 'Cache', 'settings-view') + + search: (query, options) -> + qs = {q: query} + + if options.themes + qs.filter = 'theme' + else if options.packages + qs.filter = 'package' + + options = { + url: "#{@baseURL}packages/search" + headers: {'User-Agent': navigator.userAgent} + qs: qs + json: true + gzip: true + } + + new Promise (resolve, reject) -> + request options, (err, res, body) -> + if err + error = new Error("Searching for \u201C#{query}\u201D failed.") + error.stderr = err.message + reject error + else + resolve( + 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 ffcfed5c..0a619119 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' @@ -207,12 +206,11 @@ 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' + const options = {} + options[this.searchType] = true try { - let packages = (await this.packageManager.search(query, opts)) || [] + const packages = (await this.client.search(query, options)) || [] this.refs.resultsContainer.innerHTML = '' this.refs.searchMessage.style.display = 'none' if (packages.length === 0) { @@ -233,7 +231,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.toLowerCase() === query)[0] if (exactMatch) { this.addPackageCardView(container, this.getPackageCardView(exactMatch)) @@ -242,7 +240,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.toLowerCase().indexOf(query) >= 0) for (let pack of matches) { this.addPackageCardView(container, this.getPackageCardView(pack)) 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/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", 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() 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()