UNPKG

packagist-api-client

Version:

Packgist (PHP Package Repository) API client in JavaScript.

165 lines (149 loc) 3.72 kB
import axios from 'axios'; interface IPackagistPackageSource { type: string; url: string; reference: string; shasum?: string; } interface IPackagistPackageVersionDetails { name: string; description: string; time: string; keywords: [string]; homepage: string; version: string; version_normalzed: string; license: [string]; authors: [ { name: string; email: string; homepage?: string; role?: string; } ]; source: IPackagistPackageSource; dist: IPackagistPackageSource; type: string; uid: number; autoload?: { [key: string]: { [key: string]: string }; }; require?: { [key: string]: string; }; 'require-dev'?: { [key: string]: string; }; suggest?: { [key: string]: string; }; extra?: { [key: string]: string; }; provide?: { [key: string]: string; }; [key: string]: any; } interface IPackagistMetadataResponse { packages?: { [packageName: string]: { [version: string]: IPackagistPackageVersionDetails; }; }; } type VendorPackageInput = string | { vendor: string; package: string }; /** * Checkout "Using the Composer metadata" @ {@link https://packagist.org/apidoc#get-package-data} for more info. * * @param ifModifiedSince If included the endpoint only returns data * if it has changed since this date stamp in time. * */ export async function getPackageMetadata( vp: VendorPackageInput, ifModifiedSince: string = '' ): Promise<{ data: IPackagistMetadataResponse; lastModified: string }> { try { const response = await axios.get(`https://repo.packagist.org/p/${constructVPString(vp)}.json`, { headers: { 'if-modified-since': ifModifiedSince }, }); return { data: response.data, lastModified: response.headers['last-modified'] }; } catch (e) { if (e && e.response && e.response.status === 304) { return { data: {}, lastModified: e.response.headers['last-modified'] }; } throw e; } } interface IPackagistPackageDetails { name: string; description: string; time: string; maintainers: { name: string; avatar_url: string; }; versions: { [version: string]: IPackagistPackageVersionDetails; }; type: string; repository: string; github_starts?: number; github_watchers?: number; github_forks?: number; github_open_issues?: number; language?: string; dependents: number; suggesters: number; downloads: { total: number; monthly: number; daily: number; }; favers: number; } interface IPackagistPackageDetailResponse { package: IPackagistPackageDetails; } /** * Checkout "Using the API" @ {@link https://packagist.org/apidoc#get-package-data} for more info. */ export async function getPackageDetails( vp: VendorPackageInput ): Promise<IPackagistPackageDetailResponse> { try { const response = await axios.get( `https://packagist.org/packages/${constructVPString(vp)}.json` ); return response.data; } catch (e) { throw e; } } function constructVPString(vp: VendorPackageInput): string { if (typeof vp === 'string') { return vp; } else if (typeof vp === 'object') { return `${vp.vendor}/${vp.package}`; } else { throw Error( `Requires string ("[vendor]/[package]") or object({vendor: [vendor], package: [package]})` ); } } interface IPackagistStatistics { totals: { downloads: number; packages: number; version: number; }; } /** * Checkout {@link https://packagist.org/apidoc#get-statistics} for more info. */ export async function getPackagistStats(): Promise<IPackagistStatistics> { const response = await axios.get('https://packagist.org/statistics.json'); return response.data; }