kopia lustrzana https://github.com/badgen/badgen.net
fix: support for external icon. fix #570
rodzic
d4af5e0c7f
commit
12d201a1d7
|
@ -4,6 +4,7 @@ import matchRoute from 'my-way'
|
|||
|
||||
import { serveBadgeNext } from './serve-badge-next'
|
||||
import serveDoc from './serve-doc-next'
|
||||
import fetchIcon from './fetch-icon'
|
||||
import sentry from './sentry'
|
||||
|
||||
import type { NextApiRequest, NextApiResponse } from 'next'
|
||||
|
@ -19,7 +20,7 @@ export interface BadgenServeConfig {
|
|||
help?: string;
|
||||
examples: { [url: string]: string };
|
||||
handlers: { [pattern: string]: BadgenHandler };
|
||||
}
|
||||
}
|
||||
|
||||
export function createBadgenHandler (badgenServerConfig: BadgenServeConfig) {
|
||||
const { handlers, title, help, examples } = badgenServerConfig
|
||||
|
@ -35,6 +36,12 @@ export function createBadgenHandler (badgenServerConfig: BadgenServeConfig) {
|
|||
return serveDoc(badgenServerConfig)(req, res)
|
||||
}
|
||||
|
||||
// Fetch external icon early, before invoking badgen handler
|
||||
let externalIconPromise: Promise<string | undefined> = Promise.resolve(undefined)
|
||||
if (req.query.icon?.toString().startsWith('https://')) {
|
||||
externalIconPromise = fetchIcon(req.query.icon.toString())
|
||||
}
|
||||
|
||||
// Find matched badgen handler
|
||||
let matchedArgs: PathArgs | null = null
|
||||
const matchedScheme = Object.keys(handlers).find(scheme => {
|
||||
|
@ -56,6 +63,14 @@ export function createBadgenHandler (badgenServerConfig: BadgenServeConfig) {
|
|||
return
|
||||
}
|
||||
|
||||
// Apply external icon if available
|
||||
const externalIcon = await externalIconPromise
|
||||
if (externalIcon) {
|
||||
req.query.icon = externalIcon
|
||||
} else if (req.query.icon === '') {
|
||||
req.query.icon = badgenResponse.subject
|
||||
}
|
||||
|
||||
serveBadgeNext(req, res, { params: badgenResponse })
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import got from 'got'
|
||||
|
||||
export default async function (iconUrl) {
|
||||
export default async function (iconUrl: string) {
|
||||
return got(iconUrl).then(res => {
|
||||
const type = res.headers['content-type']
|
||||
if (!type!.startsWith('image')) { return }
|
||||
|
@ -8,5 +8,5 @@ export default async function (iconUrl) {
|
|||
const base64 = Buffer.from(res.body).toString('base64')
|
||||
const encoded = `data:${type};base64,${base64}`
|
||||
return encoded
|
||||
}).catch(err => undefined)
|
||||
}).catch(() => undefined)
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue