license-kit
Version:
Aggregate license notes of OSS libraries used in your Node.js project, analyze & visualize OSS licenses with AI-turbocharged tooling
61 lines (46 loc) • 1.5 kB
text/typescript
import { createHash } from 'node:crypto';
import fs from 'node:fs';
import path from 'node:path';
import type { CLIVisualizeOptions } from '../types/CLIOptions';
export function getProjectPaths(options: { root: string }) {
const repoRootPath = path.resolve(options.root);
const packageJsonPath = path.join(repoRootPath, 'package.json');
if (!fs.existsSync(packageJsonPath)) {
console.error(`package.json not found at ${packageJsonPath}`);
process.exit(1);
}
return { packageJsonPath, repoRootPath };
}
export function getPackageLockChecksum(options: CLIVisualizeOptions) {
return createHash('sha256')
.update(fs.readFileSync(getLockfilePath(options), 'utf8'))
.digest('hex');
}
export function getLockfilePath(options: CLIVisualizeOptions) {
const { repoRootPath } = getProjectPaths(options);
let pthBase = repoRootPath;
while (pthBase !== path.dirname(pthBase)) {
let pth = path.join(pthBase, 'package-lock.json');
if (fs.existsSync(pth)) {
return pth;
}
pth = path.join(pthBase, 'pnpm-lock.yaml');
if (fs.existsSync(pth)) {
return pth;
}
pth = path.join(pthBase, 'yarn.lock');
if (fs.existsSync(pth)) {
return pth;
}
pth = path.join(pthBase, 'bun.lock');
if (fs.existsSync(pth)) {
return pth;
}
pth = path.join(pthBase, 'bun.lockb');
if (fs.existsSync(pth)) {
return pth;
}
pthBase = path.dirname(pthBase);
}
throw new Error('No lockfile found');
}