fix(pub): dart-platform and flutter-platform migrate on api (#517)

* fix(dart): migrate dart and flutter-platform on api

* Update api/pub.ts

Co-authored-by: Dario Vladović <d.vladimyr@gmail.com>

Co-authored-by: Dario Vladović <d.vladimyr@gmail.com>
pull/521/head
Dmitry Krutskikh 2021-04-06 05:59:43 +03:00 zatwierdzone przez GitHub
rodzic e0c87b725e
commit d29ce47f65
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
1 zmienionych plików z 29 dodań i 15 usunięć

Wyświetl plik

@ -5,6 +5,7 @@ import { createBadgenHandler, BadgenError, PathArgs } from '../libs/create-badge
const PUB_API_URL = 'https://pub.dev/api/'
const PUB_REPO_URL = 'https://pub.dev/'
export default createBadgenHandler({
title: 'Dart pub',
examples: {
@ -20,8 +21,8 @@ export default createBadgenHandler({
'/pub/flutter-platform/xml': 'flutter-platform'
},
handlers: {
'/pub/:topic<v|version|sdk-version|likes|points|popularity>/:pkg': apiHandler,
'/pub/:topic<dart-platform|flutter-platform|license>/:pkg': webHandler
'/pub/:topic<v|version|sdk-version|likes|points|popularity|dart-platform|flutter-platform>/:pkg': apiHandler,
'/pub/:topic<license>/:pkg': webHandler
}
})
@ -75,6 +76,24 @@ async function apiHandler ({ topic, pkg }: PathArgs) {
color: 'green'
}
}
case 'dart-platform': {
const { scorecard: pubScores } = await client.get(`packages/${pkg}/metrics`).json<any>()
const runtimes = parseTags(pubScores.derivedTags, 'runtime').join(' | ')
return {
subject: 'dart',
status: runtimes || 'not supported',
color: runtimes ? 'blue' : 'grey'
}
}
case 'flutter-platform': {
const { scorecard: pubScores } = await client.get(`packages/${pkg}/metrics`).json<any>()
const platforms = parseTags(pubScores.derivedTags, 'platform').join(' | ')
return {
subject: 'flutter',
status: platforms || 'not supported',
color: platforms ? 'blue' : 'grey'
}
}
}
}
@ -82,16 +101,6 @@ async function webHandler({ topic, pkg }: PathArgs) {
const html = await fetchPage(pkg)
switch (topic) {
case 'dart-platform':
case 'flutter-platform': {
const [subject] = topic.split('-')
const platforms = parseBadgeGroup(subject, html).join(' | ')
return {
subject,
status: platforms || 'not supported',
color: platforms ? 'blue' : 'grey'
}
}
case 'license': {
const license = html.match(/License<\/h3>\s*<p>([^(]+)\(/i)?.[1].trim()
return {
@ -103,9 +112,14 @@ async function webHandler({ topic, pkg }: PathArgs) {
}
}
function parseBadgeGroup(title: string, html: string) {
const reBadge = new RegExp(`class="tag-badge-sub" title="[^"]*?\\b${title}\\b[^"]*?">([^<]+)<\\/`, 'ig')
return [...html.matchAll(reBadge)].map(match => match[1].trim())
function parseTags(tags, group) {
return Array.from(tags.reduce((acc, tag) => {
if (!tag.startsWith(`${group}:`)) return acc
const [, name] = tag.split(':')
const [type] = name.split('-')
acc.add(type)
return acc
}, new Set()))
}
async function fetchPage(pkg: string) {