oso.ts
1 import { GraphQLClient } from 'graphql-request'; 2 3 const METRICS_TO_DISPLAY: Record<string, string> = { 4 GITHUB_commits_over_all_time: '1zNSDLeL7d1bqMgJ4b/AGBd0lQs4Q4Wy9jIf2ge72kw=', 5 GITHUB_comments_over_all_time: 'd5VBo6xBRMwXq6CEm4KgX+NrdrU45HR1ryhhO9szl60=', 6 GITHUB_opened_pull_requests_over_all_time: '4qXMv/x67zMwqoF6hmivpo74Y++R2lhT4Y9CjZKpt00=', 7 GITHUB_contributors_over_all_time: 'Fx1VYZrsdL9HlxTjJKCyPpntx7ZdGAiW+L1TEnTZgSI=', 8 GITHUB_merged_pull_requests_over_all_time: 'gKlMLwqOAY0NndkTeXiaN4XM8RqhEu9RGvYhZRLPPMM=', 9 GITHUB_stars_over_all_time: 'Z6qQavpdhYhLZHxNqLlgWO8Fm1yU3jc3rdxehtP91Yc=', 10 GITHUB_opened_issues_over_all_time: 'ftrYmCWeazkMzCpce018wYydj/HovL+5q25MGl+4uv0=', 11 GITHUB_closed_issues_over_all_time: 'IBdxUvSrFquEY1PG3bYlD1LREqoRZxIHErDZDEAlM1M=', 12 GITHUB_forks_over_all_time: 'OvHEN0B/pn82eKeV0jD9007tZriincUXAXgGqmYxPpc=', 13 }; 14 15 export async function getRepoMetrics(ownerName: string, repoName: string, f = fetch) { 16 const client = new GraphQLClient('https://www.opensource.observer/api/v1/graphql', { 17 fetch: f, 18 }); 19 20 const artifactIdQuery = ` 21 query GitHubArtifact { 22 oso_artifactsByProjectV1( 23 limit: 1, 24 where: { 25 artifactName: { _ilike: "${repoName}" }, 26 artifactNamespace: { _ilike: "${ownerName}" }, 27 projectSource: { _eq: "OSS_DIRECTORY" } 28 } 29 ) { 30 artifactId 31 } 32 } 33 `; 34 35 const artifactIdResult = await client.request(artifactIdQuery, {}); 36 // eslint-disable-next-line @typescript-eslint/no-explicit-any 37 const artifactId = (artifactIdResult as any).oso_artifactsByProjectV1[0]?.artifactId; 38 39 const keyMetricsQuery = ` 40 query GetKeyMetrics { 41 oso_keyMetricsByArtifactV0(where: { 42 artifactId: { 43 _eq: "${artifactId}" 44 } 45 46 }) { 47 amount 48 metricId 49 } 50 } 51 `; 52 53 const keyMetricsResult = await client.request(keyMetricsQuery, {}); 54 // eslint-disable-next-line @typescript-eslint/no-explicit-any 55 const keyMetrics = (keyMetricsResult as any).oso_keyMetricsByArtifactV0; 56 57 const mappedResult = keyMetrics.reduce( 58 // eslint-disable-next-line @typescript-eslint/no-explicit-any 59 (acc: Record<string, number>, metric: any) => { 60 const metricName = Object.keys(METRICS_TO_DISPLAY).find( 61 (key) => METRICS_TO_DISPLAY[key] === metric.metricId, 62 ); 63 if (metricName) { 64 acc[metricName] = Number(metric.amount); 65 } 66 return acc; 67 }, 68 {}, 69 ); 70 71 return mappedResult; 72 }