kopia lustrzana https://github.com/badgen/badgen.net
Merge branch 'master' of https://github.com/amio/badgen-service
commit
b622854ead
|
@ -0,0 +1,5 @@
|
||||||
|
Copyright 2018 Amio
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
32
README.md
32
README.md
|
@ -1,11 +1,11 @@
|
||||||
# Badgen Service
|
# Badgen Service
|
||||||
|
|
||||||
![License ISC](https://badgen.net/badge/license/ISC)
|
[![Uptime last week][uptime-src]][uptime-href]
|
||||||
|
[![Response time][response-src]][uptime-href]
|
||||||
|
[![Dependencies][dependencies-src]][dependencies-href]
|
||||||
|
[![License][license-src]][license-href]
|
||||||
[![StandardJS][standard-src]][standard-href]
|
[![StandardJS][standard-src]][standard-href]
|
||||||
[![dependencies][dep-src]][dep-href]
|
[![Deploy to now][deploy-to-now-src]](#deploy-to-now)
|
||||||
[![uptime past week][uptime-src]][uptime-href]
|
|
||||||
[![response time][response-src]][uptime-href]
|
|
||||||
[![deploy to now][deploy-to-now]](#deploy-to-now-cloud)
|
|
||||||
|
|
||||||
Home of [badgen.net](https://badgen.net), fast badge generating service.
|
Home of [badgen.net](https://badgen.net), fast badge generating service.
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ Home of [badgen.net](https://badgen.net), fast badge generating service.
|
||||||
|
|
||||||
- Written in latest, vanilla JavaScript => no build process
|
- Written in latest, vanilla JavaScript => no build process
|
||||||
- Using [badgen](https://github.com/amio/badgen) library to generate svg on the fly => fast & stateless
|
- Using [badgen](https://github.com/amio/badgen) library to generate svg on the fly => fast & stateless
|
||||||
- Hosted on [Now Cloud][now-href], serving behind Now CDN => faster & reliable
|
- Hosted on [Now][now-href], serving behind Now CDN => faster & reliable
|
||||||
- Cache less than 4 minutes => fresh & hot
|
- Cache less than 4 minutes => fresh & hot
|
||||||
- Three endpoints in one server
|
- Three endpoints in one server
|
||||||
- https://badgen.net - classic style badges
|
- https://badgen.net - classic style badges
|
||||||
|
@ -43,9 +43,9 @@ To ensure that your addition is working correctly start the development server w
|
||||||
|
|
||||||
Badgen Server will auto load all svg files in [libs/icons](libs/icons/). Please make sure new icon is optimized using [svgomg](https://jakearchibald.github.io/svgomg/).
|
Badgen Server will auto load all svg files in [libs/icons](libs/icons/). Please make sure new icon is optimized using [svgomg](https://jakearchibald.github.io/svgomg/).
|
||||||
|
|
||||||
### Deploy to Now Cloud
|
### Deploy to Now
|
||||||
|
|
||||||
Badgen generate badges on the fly, which means it's stateless (not rely on any db service). Deploy your own Badgen Service to [Now Cloud](https://zeit.co/now) with one single command:
|
Badgen generate badges on the fly, which means it's stateless (not rely on any db service). Deploy your own Badgen Service to [Now][now-href] with one single command:
|
||||||
```
|
```
|
||||||
now amio/badgen-service -e GH_TOKEN=''
|
now amio/badgen-service -e GH_TOKEN=''
|
||||||
```
|
```
|
||||||
|
@ -57,12 +57,14 @@ now amio/badgen-service -e GH_TOKEN=''
|
||||||
Made with ❤️ by [Amio](https://github.com/amio),
|
Made with ❤️ by [Amio](https://github.com/amio),
|
||||||
built with ⚡️ from [badgen](https://github.com/amio/badgen).
|
built with ⚡️ from [badgen](https://github.com/amio/badgen).
|
||||||
|
|
||||||
[now-href]: https://zeit.co/now
|
|
||||||
[standard-src]: https://badgen.net/badge/code%20style/standard/F2A
|
|
||||||
[standard-href]: https://standardjs.com/
|
|
||||||
[dep-src]: https://badgen.net/david/dep/amio/badgen-service?label=deps
|
|
||||||
[dep-href]: https://david-dm.org/amio/badgen-service
|
|
||||||
[uptime-src]: https://badgen.net/uptime-robot/day/m780731617-a9e038618dc1aee36a44c4af
|
[uptime-src]: https://badgen.net/uptime-robot/day/m780731617-a9e038618dc1aee36a44c4af
|
||||||
[response-src]: https://badgen.net/uptime-robot/response/m780731617-a9e038618dc1aee36a44c4af
|
|
||||||
[uptime-href]: https://stats.uptimerobot.com/z6nqBfYGB
|
[uptime-href]: https://stats.uptimerobot.com/z6nqBfYGB
|
||||||
[deploy-to-now]: https://badgen.net/badge/▲/$%20now%20amio%2Fbadgen-service/222
|
[response-src]: https://badgen.net/uptime-robot/response/m780731617-a9e038618dc1aee36a44c4af
|
||||||
|
[dependencies-src]: https://badgen.net/david/dep/amio/badgen-service?label=deps
|
||||||
|
[dependencies-href]: https://david-dm.org/amio/badgen-service/
|
||||||
|
[license-src]: https://badgen.net/github/license/amio/badgen-service
|
||||||
|
[license-href]: LICENSE.md
|
||||||
|
[standard-src]: https://badgen.net/badge/code%20style/standard/pink
|
||||||
|
[standard-href]: https://standardjs.com/
|
||||||
|
[deploy-to-now-src]: https://badgen.net/badge/▲/$%20now%20amio%2Fbadgen-service/222
|
||||||
|
[now-href]: https://zeit.co/now/
|
||||||
|
|
|
@ -1,6 +1,12 @@
|
||||||
# api.badgen.net
|
# api.badgen.net
|
||||||
|
|
||||||
|
Serve badge data as json.
|
||||||
|
|
||||||
|
- Same url path as badgen.net
|
||||||
|
- Mainly for live badges
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
- https://api.badgen.net/npm/v/micro
|
- https://api.badgen.net/npm/v/micro
|
||||||
- https://api.badgen.net/npm/dependents/got
|
- https://api.badgen.net/npm/dependents/got
|
||||||
|
- https://api.badgen.net/github/dependents-pkg/chalk/chalk
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
# Badgen
|
# Badgen
|
||||||
|
|
||||||
Fast badge generating service.
|
Fast badge generating service.
|
||||||
|
|
||||||
[![classic](https://badgen.net/badge/style/classic/pink)](https://badgen.net)
|
[![classic](https://badgen.net/badge/style/classic/pink)](https://badgen.net)
|
||||||
[![flat](https://flat.badgen.net/badge/style/flat/pink)](https://flat.badgen.net)
|
[![flat](https://flat.badgen.net/badge/style/flat/pink)](https://flat.badgen.net)
|
||||||
|
|
||||||
|
@ -29,24 +30,24 @@ Available color names:
|
||||||
|
|
||||||
Available icons:
|
Available icons:
|
||||||
|
|
||||||
![](/badge//travis?icon=travis)
|
![](/badge//airbnb?icon=airbnb)
|
||||||
![](/badge//circleci?icon=circleci)
|
![](/badge//apple?icon=apple)
|
||||||
![](/badge//appveyor?icon=appveyor)
|
![](/badge//appveyor?icon=appveyor)
|
||||||
![](/badge//dependabot?icon=dependabot)
|
![](/badge//atom?icon=atom)
|
||||||
|
![](/badge//chrome?icon=chrome)
|
||||||
|
![](/badge//circleci?icon=circleci)
|
||||||
![](/badge//codecov?icon=codecov)
|
![](/badge//codecov?icon=codecov)
|
||||||
|
![](/badge//dependabot?icon=dependabot)
|
||||||
![](/badge//docker?icon=docker)
|
![](/badge//docker?icon=docker)
|
||||||
|
![](/badge//firefox?icon=firefox)
|
||||||
![](/badge//github?icon=github)
|
![](/badge//github?icon=github)
|
||||||
![](/badge//gitlab?icon=gitlab)
|
![](/badge//gitlab?icon=gitlab)
|
||||||
![](/badge//slack?icon=slack)
|
|
||||||
![](/badge//gitter?icon=gitter)
|
![](/badge//gitter?icon=gitter)
|
||||||
![](/badge//firefox?icon=firefox)
|
|
||||||
![](/badge//chrome?icon=chrome)
|
|
||||||
![](/badge//twitter?icon=twitter)
|
|
||||||
![](/badge//terminal?icon=terminal)
|
|
||||||
![](/badge//patreon?icon=patreon)
|
![](/badge//patreon?icon=patreon)
|
||||||
![](/badge//airbnb?icon=airbnb)
|
![](/badge//slack?icon=slack)
|
||||||
![](/badge//atom?icon=atom)
|
![](/badge//terminal?icon=terminal)
|
||||||
![](/badge//apple?icon=apple)
|
![](/badge//travis?icon=travis)
|
||||||
|
![](/badge//twitter?icon=twitter)
|
||||||
![](/badge//windows?icon=windows)
|
![](/badge//windows?icon=windows)
|
||||||
|
|
||||||
Available query params:
|
Available query params:
|
||||||
|
@ -64,7 +65,7 @@ Available query params:
|
||||||
|
|
||||||
| Preview | URL |
|
| Preview | URL |
|
||||||
| ------- | --- |
|
| ------- | --- |
|
||||||
|![](/badge/Swift/4.2/orange) | [/badge/Swift/4.0/orange](/badge/Swift/4.2/orange)
|
|![](/badge/Swift/4.2/orange) | [/badge/Swift/4.2/orange](/badge/Swift/4.2/orange)
|
||||||
|![](/badge/license/MIT/blue) | [/badge/license/MIT/blue](/badge/license/MIT/blue)
|
|![](/badge/license/MIT/blue) | [/badge/license/MIT/blue](/badge/license/MIT/blue)
|
||||||
|![](/badge/chat/on%20gitter/cyan) | [/badge/chat/on%20gitter/cyan](/badge/chat/on%20gitter/cyan)
|
|![](/badge/chat/on%20gitter/cyan) | [/badge/chat/on%20gitter/cyan](/badge/chat/on%20gitter/cyan)
|
||||||
|![](/badge/stars/★★★★☆/green) | [/badge/stars/★★★★☆](/badge/stars/★★★★☆/green)
|
|![](/badge/stars/★★★★☆/green) | [/badge/stars/★★★★☆](/badge/stars/★★★★☆/green)
|
||||||
|
@ -82,11 +83,15 @@ Available query params:
|
||||||
['latest release', '/github/release/babel/babel'],
|
['latest release', '/github/release/babel/babel'],
|
||||||
['latest stable release', '/github/release/babel/babel/stable'],
|
['latest stable release', '/github/release/babel/babel/stable'],
|
||||||
['latest tag', '/github/tag/micromatch/micromatch'],
|
['latest tag', '/github/tag/micromatch/micromatch'],
|
||||||
|
['watchers', '/github/watchers/micromatch/micromatch'],
|
||||||
['stars', '/github/stars/micromatch/micromatch'],
|
['stars', '/github/stars/micromatch/micromatch'],
|
||||||
['forks', '/github/forks/micromatch/micromatch'],
|
['forks', '/github/forks/micromatch/micromatch'],
|
||||||
['watchers', '/github/watchers/micromatch/micromatch'],
|
|
||||||
['issues', '/github/issues/micromatch/micromatch'],
|
['issues', '/github/issues/micromatch/micromatch'],
|
||||||
['open issues', '/github/open-issues/micromatch/micromatch']
|
['open issues', '/github/open-issues/micromatch/micromatch'],
|
||||||
|
['closed issues', '/github/closed-issues/micromatch/micromatch'],
|
||||||
|
['license', '/github/license/micromatch/micromatch'],
|
||||||
|
['repository dependents', '/github/dependents-repo/micromatch/micromatch'],
|
||||||
|
['package dependents', '/github/dependents-pkg/micromatch/micromatch']
|
||||||
],
|
],
|
||||||
/* release registries */
|
/* release registries */
|
||||||
npm: [
|
npm: [
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
const millify = require('millify')
|
const millify = require('millify')
|
||||||
const axios = require('../axios.js')
|
const axios = require('../axios.js')
|
||||||
|
const semColor = require('../utils/sem-color.js')
|
||||||
|
|
||||||
// https://atom.io/api/packages/*
|
// https://atom.io/api/packages/*
|
||||||
|
|
||||||
|
@ -33,7 +34,7 @@ async function pkg (topic, args) {
|
||||||
return {
|
return {
|
||||||
subject: `apm`,
|
subject: `apm`,
|
||||||
status: `v${meta.releases.latest}` || 'unknown',
|
status: `v${meta.releases.latest}` || 'unknown',
|
||||||
color: 'green'
|
color: semColor(meta.releases.latest)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case 'license': {
|
case 'license': {
|
||||||
|
|
|
@ -37,7 +37,7 @@ async function coverage (vscType, user, repo, branch) {
|
||||||
|
|
||||||
return {
|
return {
|
||||||
subject: 'coverage',
|
subject: 'coverage',
|
||||||
status: Number(data.commit.totals.c).toFixed(1) + '%',
|
status: Number(Number(data.commit.totals.c).toFixed(1)) + '%',
|
||||||
color: covColor(data.commit.totals.c)
|
color: covColor(data.commit.totals.c)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ module.exports = async function (topic, platform, user, repo, branch) {
|
||||||
|
|
||||||
return {
|
return {
|
||||||
subject: 'coverage',
|
subject: 'coverage',
|
||||||
status: Number(covered_percent).toFixed(1) + '%',
|
status: Number(covered_percent.toFixed(1)) + '%',
|
||||||
color: covColor(covered_percent)
|
color: covColor(covered_percent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,16 +10,14 @@ module.exports = async function (topic, ...args) {
|
||||||
return release(...args)
|
return release(...args)
|
||||||
case 'tag':
|
case 'tag':
|
||||||
return tag(...args)
|
return tag(...args)
|
||||||
case 'stars':
|
|
||||||
return stats('stargazers', ...args)
|
|
||||||
case 'forks':
|
|
||||||
return stats('forks', ...args)
|
|
||||||
case 'watchers':
|
case 'watchers':
|
||||||
return stats('watchers', ...args)
|
case 'stars':
|
||||||
case 'open-issues':
|
case 'forks':
|
||||||
return issues('open', ...args)
|
|
||||||
case 'issues':
|
case 'issues':
|
||||||
return issues('all', ...args)
|
case 'open-issues':
|
||||||
|
case 'closed-issues':
|
||||||
|
case 'license':
|
||||||
|
return stats(topic, ...args)
|
||||||
case 'dependents-repo':
|
case 'dependents-repo':
|
||||||
return dependents('REPOSITORY', ...args)
|
return dependents('REPOSITORY', ...args)
|
||||||
case 'dependents-pkg':
|
case 'dependents-pkg':
|
||||||
|
@ -77,6 +75,103 @@ async function tag (user, repo) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function queryGithub (query) {
|
||||||
|
return axios.post('https://api.github.com/graphql', { query }, {
|
||||||
|
headers: {
|
||||||
|
'Accept': 'application/vnd.github.hawkgirl-preview+json',
|
||||||
|
'Authorization': `bearer ${token}`
|
||||||
|
}
|
||||||
|
}).then(res => res.data)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function stats (topic, user, repo) {
|
||||||
|
let query = ''
|
||||||
|
switch (topic) {
|
||||||
|
case 'watchers':
|
||||||
|
query = `watchers { totalCount }`
|
||||||
|
break
|
||||||
|
case 'stars':
|
||||||
|
query = `stargazers { totalCount }`
|
||||||
|
break
|
||||||
|
case 'forks':
|
||||||
|
query = `forks { totalCount }`
|
||||||
|
break
|
||||||
|
case 'issues':
|
||||||
|
query = `issues { totalCount }`
|
||||||
|
break
|
||||||
|
case 'open-issues':
|
||||||
|
query = `issues(states:[OPEN]) { totalCount }`
|
||||||
|
break
|
||||||
|
case 'closed-issues':
|
||||||
|
query = `issues(states:[CLOSED]) { totalCount }`
|
||||||
|
break
|
||||||
|
case 'license':
|
||||||
|
query = `licenseInfo { spdxId }`
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
const { data, errors } = await queryGithub(`
|
||||||
|
query {
|
||||||
|
repository(owner:"${user}", name:"${repo}") {
|
||||||
|
${query}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
|
||||||
|
if (errors) {
|
||||||
|
console.error(JSON.stringify(errors))
|
||||||
|
return { subject: topic }
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (topic) {
|
||||||
|
case 'watchers':
|
||||||
|
case 'forks':
|
||||||
|
case 'issues':
|
||||||
|
return {
|
||||||
|
subject: topic,
|
||||||
|
status: data.repository[topic].totalCount,
|
||||||
|
color: 'blue'
|
||||||
|
}
|
||||||
|
case 'stars':
|
||||||
|
return {
|
||||||
|
subject: topic,
|
||||||
|
status: data.repository.stargazers.totalCount,
|
||||||
|
color: 'blue'
|
||||||
|
}
|
||||||
|
case 'open-issues':
|
||||||
|
return {
|
||||||
|
subject: 'open issues',
|
||||||
|
status: data.repository.issues.totalCount,
|
||||||
|
color: 'orange'
|
||||||
|
}
|
||||||
|
case 'closed-issues':
|
||||||
|
return {
|
||||||
|
subject: 'closed issues',
|
||||||
|
status: data.repository.issues.totalCount,
|
||||||
|
color: 'blue'
|
||||||
|
}
|
||||||
|
case 'license':
|
||||||
|
return {
|
||||||
|
subject: topic,
|
||||||
|
status: data.repository.licenseInfo.spdxId,
|
||||||
|
color: 'blue'
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return {
|
||||||
|
subject: 'github',
|
||||||
|
status: 'unknown topic',
|
||||||
|
color: 'grey'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseDependents (html, type) {
|
||||||
|
const $ = cheerio.load(html)
|
||||||
|
const depLink = $(`a[href$="?dependent_type=${type}"]`)
|
||||||
|
if (depLink.length !== 1) return -1
|
||||||
|
return depLink.text().replace(/[^0-9,]/g, '')
|
||||||
|
}
|
||||||
|
|
||||||
async function dependents (type, user, repo) {
|
async function dependents (type, user, repo) {
|
||||||
const html = await axios({
|
const html = await axios({
|
||||||
url: `https://github.com/${user}/${repo}/network/dependents`,
|
url: `https://github.com/${user}/${repo}/network/dependents`,
|
||||||
|
@ -91,72 +186,3 @@ async function dependents (type, user, repo) {
|
||||||
color: 'blue'
|
color: 'blue'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseDependents (html, type) {
|
|
||||||
const $ = cheerio.load(html)
|
|
||||||
const depLink = $(`a[href$="?dependent_type=${type}"]`)
|
|
||||||
if (depLink.length !== 1) return -1
|
|
||||||
return depLink.text().replace(/[^0-9,]/g, '')
|
|
||||||
}
|
|
||||||
|
|
||||||
function queryGithub (query) {
|
|
||||||
return axios.post('https://api.github.com/graphql', { query }, {
|
|
||||||
headers: {
|
|
||||||
'Accept': 'application/vnd.github.hawkgirl-preview+json',
|
|
||||||
'Authorization': `bearer ${token}`
|
|
||||||
}
|
|
||||||
}).then(res => res.data)
|
|
||||||
}
|
|
||||||
|
|
||||||
async function issues (filter, user, repo) {
|
|
||||||
const queryFilter = filter === 'open' ? '(states:[OPEN])' : ''
|
|
||||||
const { data, errors } = await queryGithub(`
|
|
||||||
query {
|
|
||||||
repository(owner:"${user}", name:"${repo}") {
|
|
||||||
issues${queryFilter} {
|
|
||||||
totalCount
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`)
|
|
||||||
|
|
||||||
if (errors) {
|
|
||||||
console.error(JSON.stringify(errors))
|
|
||||||
return { subject: 'issues' }
|
|
||||||
} else {
|
|
||||||
return {
|
|
||||||
subject: filter === 'open' ? 'open issues' : 'issues',
|
|
||||||
status: data.repository.issues.totalCount,
|
|
||||||
color: filter === 'open' ? 'orange' : 'blue'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function stats (topic, user, repo) {
|
|
||||||
const { data, errors } = await queryGithub(`
|
|
||||||
query {
|
|
||||||
repository(owner:"${user}", name:"${repo}") {
|
|
||||||
forks {
|
|
||||||
totalCount
|
|
||||||
}
|
|
||||||
stargazers {
|
|
||||||
totalCount
|
|
||||||
}
|
|
||||||
watchers {
|
|
||||||
totalCount
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`)
|
|
||||||
|
|
||||||
if (errors) {
|
|
||||||
console.error(JSON.stringify(errors))
|
|
||||||
return { subject: topic }
|
|
||||||
} else {
|
|
||||||
return {
|
|
||||||
subject: topic.replace('stargazers', 'stars'),
|
|
||||||
status: data.repository[topic].totalCount,
|
|
||||||
color: 'blue'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ module.exports = serveMarked('libs/index.md', {
|
||||||
body { max-width: inherit }
|
body { max-width: inherit }
|
||||||
body > * { width: 960px; margin-left: auto; margin-right: auto; box-sizing: border-box }
|
body > * { width: 960px; margin-left: auto; margin-right: auto; box-sizing: border-box }
|
||||||
h1 + p { letter-spacing: 0.1px }
|
h1 + p { letter-spacing: 0.1px }
|
||||||
|
h1 + p + p { text-align: center }
|
||||||
h1 + p a { display: inline-block; margin-top: 1em; padding: 4px; height: 20px }
|
h1 + p a { display: inline-block; margin-top: 1em; padding: 4px; height: 20px }
|
||||||
img { height: 20px }
|
img { height: 20px }
|
||||||
|
|
||||||
|
@ -59,6 +60,7 @@ module.exports = serveMarked('libs/index.md', {
|
||||||
</p>
|
</p>
|
||||||
</segment>
|
</segment>
|
||||||
<aside>
|
<aside>
|
||||||
|
<a href="https://api.badgen.net">API</a>
|
||||||
<a href="https://github.com/amio/badgen-service">GitHub</a>
|
<a href="https://github.com/amio/badgen-service">GitHub</a>
|
||||||
<a href="https://twitter.com/badgen_net">Twitter</a>
|
<a href="https://twitter.com/badgen_net">Twitter</a>
|
||||||
</aside>
|
</aside>
|
||||||
|
|
Ładowanie…
Reference in New Issue