Amio
5 years ago
2 changed files with 87 additions and 0 deletions
@ -0,0 +1,86 @@ |
|||||
|
import millify from 'millify' |
||||
|
import got from '../libs/got' |
||||
|
import { version as v, versionColor } from '../libs/utils' |
||||
|
import { |
||||
|
badgenServe, |
||||
|
BadgenServeMeta as Meta, |
||||
|
BadgenServeHandlers as Handlers, |
||||
|
BadgenServeHandlerArgs as Args |
||||
|
} from '../libs/badgen-serve' |
||||
|
|
||||
|
export const meta: Meta = { |
||||
|
title: 'Visual Studio Marketplace', |
||||
|
examples: { |
||||
|
'/vs-marketplace/v/vscodevim.vim': 'version', |
||||
|
'/vs-marketplace/i/vscodevim.vim': 'installs', |
||||
|
'/vs-marketplace/d/vscodevim.vim': 'downloads', |
||||
|
'/vs-marketplace/rating/vscodevim.vim': 'rating', |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
export const handlers: Handlers = { |
||||
|
'/vs-marketplace/:topic<v|i|d|rating>/:pkg': handler |
||||
|
} |
||||
|
|
||||
|
export default badgenServe(handlers) |
||||
|
|
||||
|
async function handler ({ topic, pkg }: Args) { |
||||
|
const { results } = await queryVSM(pkg) |
||||
|
const extension = results[0].extensions[0] |
||||
|
|
||||
|
if (!extension) { |
||||
|
return { |
||||
|
subject: 'VS Marketplace', |
||||
|
status: 'not found', |
||||
|
color: 'grey' |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
switch (topic) { |
||||
|
case 'v': |
||||
|
const version = extension.versions[0].version |
||||
|
return { |
||||
|
subject: 'VS Marketplace', |
||||
|
status: v(version), |
||||
|
color: versionColor(version) |
||||
|
} |
||||
|
case 'd': |
||||
|
const { install, updateCount } = parseStatistics(extension) |
||||
|
return { |
||||
|
subject: 'downloads', |
||||
|
status: millify(install + updateCount), |
||||
|
color: 'green' |
||||
|
} |
||||
|
case 'i': |
||||
|
return { |
||||
|
subject: 'installs', |
||||
|
status: millify(parseStatistics(extension).install), |
||||
|
color: 'green' |
||||
|
} |
||||
|
case 'rating': |
||||
|
const { averagerating, ratingcount } = parseStatistics(extension) |
||||
|
return { |
||||
|
subject: 'rating', |
||||
|
status: `${averagerating.toFixed(1)}/5 (${ratingcount})`, |
||||
|
color: 'green' |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
const queryVSM = async pkgName => { |
||||
|
const endpoint = 'https://marketplace.visualstudio.com/_apis/public/gallery/extensionquery' |
||||
|
return got.post(endpoint, { |
||||
|
query: { 'api-version': '3.0-preview.1' }, |
||||
|
body: { |
||||
|
filters: [{ criteria: [{ filterType: 7, value: pkgName }] }], |
||||
|
flags: 914 |
||||
|
} |
||||
|
}).then(res => res.body) |
||||
|
} |
||||
|
|
||||
|
const parseStatistics = extension => { |
||||
|
return extension.statistics.reduce((accu, curr) => { |
||||
|
accu[curr.statisticName] = curr.value |
||||
|
return accu |
||||
|
}, {}) |
||||
|
} |
Loading…
Reference in new issue