kopia lustrzana https://github.com/badgen/badgen.net
				
				
				
			
		
			
				
	
	
		
			116 wiersze
		
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			116 wiersze
		
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
import got from '../libs/got'
 | 
						|
import { millify, version, versionColor } from '../libs/utils'
 | 
						|
import { createBadgenHandler, PathArgs } from '../libs/create-badgen-handler'
 | 
						|
 | 
						|
const CRAN_API_URL = 'https://crandb.r-pkg.org/'
 | 
						|
const CRANLOGS_API_URL = 'https://cranlogs.r-pkg.org/'
 | 
						|
 | 
						|
export default createBadgenHandler({
 | 
						|
  title: 'CRAN',
 | 
						|
  examples: {
 | 
						|
    '/cran/v/dplyr': 'version',
 | 
						|
    '/cran/license/ggplot2': 'license',
 | 
						|
    '/cran/r/data.table': 'r version',
 | 
						|
    '/cran/dependents/R6': 'dependents',
 | 
						|
    '/cran/dt/Rcpp': 'total downloads',
 | 
						|
    '/cran/dd/Rcpp': 'daily downloads',
 | 
						|
    '/cran/dw/Rcpp': 'weekly downloads',
 | 
						|
    '/cran/dm/Rcpp': 'monthly downloads'
 | 
						|
  },
 | 
						|
  handlers: {
 | 
						|
    '/cran/:topic<v|version|license|r|dependents>/:pkg': cranHandler,
 | 
						|
    '/cran/:topic<dd|dw|dm|dt>/:pkg': cranlogsHandler
 | 
						|
  }
 | 
						|
})
 | 
						|
 | 
						|
async function cranHandler ({ topic, pkg }: PathArgs) {
 | 
						|
  const client = got.extend({ prefixUrl: CRAN_API_URL })
 | 
						|
 | 
						|
  switch (topic) {
 | 
						|
    case 'v':
 | 
						|
    case 'version': {
 | 
						|
      const data = await client.get(pkg).json<any>()
 | 
						|
      return {
 | 
						|
        subject: 'cran',
 | 
						|
        status: version(data.Version),
 | 
						|
        color: versionColor(data.Version)
 | 
						|
      }
 | 
						|
    }
 | 
						|
    case 'license': {
 | 
						|
      const data = await client.get(pkg).json<any>()
 | 
						|
      const license = data.License?.replace(/\s*\S\s+file\s+LICEN[CS]E$/i, '')
 | 
						|
      return {
 | 
						|
        subject: 'license',
 | 
						|
        status: license || 'unknown',
 | 
						|
        color: 'blue'
 | 
						|
      }
 | 
						|
    }
 | 
						|
    case 'r': {
 | 
						|
      const data = await client.get(pkg).json<any>()
 | 
						|
      const rVersion = data.Depends?.R?.replace(/([<>=]+)\s+/g, '$1') || '*'
 | 
						|
      return {
 | 
						|
        subject: 'R',
 | 
						|
        status: version(rVersion),
 | 
						|
        color: versionColor(rVersion)
 | 
						|
      }
 | 
						|
    }
 | 
						|
    case 'dependents': {
 | 
						|
      const data = await client.get(`/-/revdeps/${pkg}`).json<any>()
 | 
						|
      const dependents = Object.keys(data[pkg].Depends).length
 | 
						|
      return {
 | 
						|
        subject: 'dependents',
 | 
						|
        status: millify(dependents),
 | 
						|
        color: 'green'
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
async function cranlogsHandler ({ topic, pkg }: PathArgs) {
 | 
						|
  switch (topic) {
 | 
						|
    case 'dt': {
 | 
						|
      const downloads = await fetchDownloads(pkg, 'total')
 | 
						|
      return {
 | 
						|
        subject: 'downloads',
 | 
						|
        status: millify(downloads),
 | 
						|
        color: 'green'
 | 
						|
      }
 | 
						|
    }
 | 
						|
    case 'dd': {
 | 
						|
      const downloads = await fetchDownloads(pkg, 'last-day')
 | 
						|
      return {
 | 
						|
        subject: 'downloads',
 | 
						|
        status: `${millify(downloads)}/day`,
 | 
						|
        color: 'green'
 | 
						|
      }
 | 
						|
    }
 | 
						|
    case 'dw': {
 | 
						|
      const downloads = await fetchDownloads(pkg, 'last-week')
 | 
						|
      return {
 | 
						|
        subject: 'downloads',
 | 
						|
        status: `${millify(downloads)}/week`,
 | 
						|
        color: 'green'
 | 
						|
      }
 | 
						|
    }
 | 
						|
    case 'dm': {
 | 
						|
      const downloads = await fetchDownloads(pkg, 'last-month')
 | 
						|
      return {
 | 
						|
        subject: 'downloads',
 | 
						|
        status: `${millify(downloads)}/month`,
 | 
						|
        color: 'green'
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
async function fetchDownloads (pkg: string, period: string) {
 | 
						|
  const client = got.extend({ prefixUrl: CRANLOGS_API_URL })
 | 
						|
  if (period === 'total') {
 | 
						|
    const [start] = new Date(0).toISOString().split('T')
 | 
						|
    const end = 'last-day'
 | 
						|
    period = [start, end].join(':')
 | 
						|
  }
 | 
						|
  const [stats] = await client.get(`downloads/total/${period}/${pkg}`).json() as any
 | 
						|
  return stats.downloads
 | 
						|
}
 |