Files
dependency-review-action/src/scorecard.ts
T

93 lines
2.6 KiB
TypeScript
Raw Normal View History

2024-03-03 05:24:07 +00:00
import {
Change,
DepsDevProject,
DepsDevProjectSchema,
Scorecard
2024-03-03 05:24:07 +00:00
} from './schemas'
2024-03-02 22:37:50 +00:00
import {isSPDXValid, octokitClient} from './utils'
import {PackageURL} from 'packageurl-js'
2024-03-03 00:31:13 +00:00
import * as core from '@actions/core'
2024-03-02 22:37:50 +00:00
2024-03-03 05:24:07 +00:00
export async function getScorecardLevels(
changes: Change[]
): Promise<Scorecard> {
2024-03-03 06:50:11 +00:00
const data: Scorecard = {dependencies: []} as Scorecard
2024-03-03 00:25:40 +00:00
for (const change of changes) {
const ecosystem = change.ecosystem
const packageName = change.name
const version = change.version
2024-03-03 01:34:03 +00:00
try {
2024-03-03 05:24:07 +00:00
const depsDevResponse: DepsDevProject = await getDepsDevData(
ecosystem,
packageName,
version
)
2024-03-03 01:34:03 +00:00
data.dependencies.push({
2024-03-03 05:24:07 +00:00
ecosystem,
packageName,
version,
depsDevData: depsDevResponse
2024-03-03 01:34:03 +00:00
})
} catch (error: any) {
2024-03-03 05:30:49 +00:00
core.debug(`Error querying for depsDevData: ${error.message}`)
data.dependencies.push({
ecosystem,
packageName,
version,
depsDevData: null
})
2024-03-03 01:34:03 +00:00
}
2024-03-03 00:25:40 +00:00
}
2024-03-03 01:34:03 +00:00
return data
2024-03-02 22:37:50 +00:00
}
const depsDevAPIRoot = 'https://api.deps.dev'
2024-03-03 00:25:40 +00:00
async function getDepsDevData(
ecosystem: String,
packageName: String,
2024-03-03 01:05:36 +00:00
version: any
2024-03-03 05:24:07 +00:00
): Promise<DepsDevProject> {
2024-03-03 00:46:24 +00:00
try {
core.debug(`Getting deps.dev data for ${packageName} ${version}`)
2024-03-03 05:30:49 +00:00
const url = `${depsDevAPIRoot}/v3alpha/systems/${ecosystem}/packages/${packageName}/versions/${version}`
2024-03-03 00:46:24 +00:00
const response = await fetch(url)
if (response.ok) {
const data = await response.json()
const projects = data.relatedProjects
for (const project of projects) {
2024-03-03 01:10:08 +00:00
return await getDepsDevProjectData(project.projectKey.id)
2024-03-03 00:46:24 +00:00
}
} else {
2024-03-03 01:34:03 +00:00
throw new Error(
`Failed to fetch data with status code: ${response.status}`
)
2024-03-03 00:46:24 +00:00
}
} catch (error: any) {
2024-03-03 01:34:03 +00:00
core.debug(`Error fetching data: ${error.message}`)
2024-03-03 00:25:40 +00:00
}
2024-03-03 05:24:07 +00:00
return DepsDevProjectSchema.parse({})
2024-03-02 22:37:50 +00:00
}
2024-03-03 05:24:07 +00:00
async function getDepsDevProjectData(
projectKeyId: string
): Promise<DepsDevProject> {
2024-03-03 00:46:24 +00:00
try {
2024-03-03 01:10:08 +00:00
core.debug(`Getting deps.dev project data for ${projectKeyId}`)
2024-03-03 01:21:27 +00:00
const url = `${depsDevAPIRoot}/v3alpha/projects/${encodeURIComponent(projectKeyId)}`
2024-03-03 00:46:24 +00:00
const response = await fetch(url)
if (response.ok) {
const data = await response.json()
2024-03-03 05:59:37 +00:00
//core.debug(`Got deps.dev project data: ${JSON.stringify(data)}`)
2024-03-03 05:43:20 +00:00
return DepsDevProjectSchema.parse(data)
2024-03-03 00:46:24 +00:00
} else {
2024-03-03 01:34:03 +00:00
throw new Error(
`Failed to fetch project data with status code: ${response.status}`
)
2024-03-03 00:46:24 +00:00
}
} catch (error: any) {
2024-03-03 01:34:03 +00:00
core.debug(`Error fetching project data: ${error.message}`)
2024-03-03 00:46:24 +00:00
}
2024-03-03 05:24:07 +00:00
return DepsDevProjectSchema.parse({})
2024-03-03 01:34:03 +00:00
}