ci: add license-check script (#11860)

Add license check script to output all licenses in use. Run with `pnpm
script:license-check`, output will be in `licenses.csv` at root.
This commit is contained in:
Elliot DeNolf
2025-03-25 11:54:00 -04:00
committed by GitHub
parent 61747082ef
commit 7fb4b1324e
6 changed files with 421 additions and 14 deletions

View File

@@ -0,0 +1,96 @@
/**
* Run this script with `pnpm script:license-check` from root
*
* Outputs licenses.csv in the root directory
*/
import type { ExecSyncOptions } from 'child_process'
import { PROJECT_ROOT } from '@tools/constants'
import { getPackageDetails } from '@tools/releaser'
import chalk from 'chalk'
import { exec as execOrig } from 'child_process'
import { stringify } from 'csv-stringify/sync'
import fs from 'fs/promises'
import { fileURLToPath } from 'node:url'
import path from 'path'
import util from 'util'
const filename = fileURLToPath(import.meta.url)
const dirname = path.dirname(filename)
const execOpts: ExecSyncOptions = { stdio: 'inherit', cwd: PROJECT_ROOT }
const exec = util.promisify(execOrig)
main().catch((error) => {
console.error(error)
process.exit(1)
})
async function main() {
const packageDetails = await getPackageDetails()
const packages = packageDetails.map((p) => p.shortName)
header(`\n🔨 Getting all package.json licenses...`)
const results: { component: string; package: string; license: string; repository: string }[] = []
for (const pack of packages) {
info(`Checking ${pack}...`)
const prodResults = await runLicenseCheck(pack, 'production')
const devResults = await runLicenseCheck(pack, 'development')
results.push(...prodResults, ...devResults)
}
const outputPath = path.join(PROJECT_ROOT, 'licenses.csv')
header(`\n💾 Writing to ${outputPath}...`)
const csvString = stringify(results, { header: true })
const buffer = Buffer.from(csvString)
await fs.writeFile(outputPath, buffer)
header(`🎉 Done!`)
}
function header(message: string) {
console.log(chalk.bold.green(`${message}\n`))
}
function info(message: string) {
console.log(chalk.dim(message))
}
async function runLicenseCheck(
pkg: string,
type: 'development' | 'production',
): Promise<{ component: string; package: string; license: string; repository: string }[]> {
const result = await exec(
`node ${path.resolve(dirname, '../node_modules/license-checker/bin/license-checker')} --summary --direct --start --json`,
{
...execOpts,
cwd: path.join(PROJECT_ROOT, 'packages', pkg),
},
)
const a: Record<string, { licenses: string; repository: string }> = JSON.parse(result.stdout)
const results: {
component: string
package: string
license: string
repository: string
distributed: 'No' | 'Yes'
}[] = []
Object.entries(a).forEach(([key, value]) => {
if (key.startsWith('@payloadcms/')) {
return
}
results.push({
component: pkg,
package: key,
license: value.licenses,
repository: value.repository,
distributed: type === 'production' ? 'Yes' : 'No',
})
})
return results
}