0
0
Fork 0
mirror of https://github.com/renovatebot/renovate.git synced 2025-05-12 23:51:55 +00:00
renovatebot_renovate/lib/modules/manager/bun/extract.ts
Maximilian Dewald 56d82cae5a
feat(bun): workspaces (#35010)
Co-authored-by: Rhys Arkins <rhys@arkins.net>
2025-04-17 14:25:53 +00:00

94 lines
2.8 KiB
TypeScript

import is from '@sindresorhus/is';
import { logger } from '../../../logger';
import {
getParentDir,
getSiblingFileName,
readLocalFile,
} from '../../../util/fs';
import { extractPackageJson } from '../npm/extract/common/package-file';
import type { NpmPackage } from '../npm/extract/types';
import type { NpmManagerData } from '../npm/types';
import type { ExtractConfig, PackageFile } from '../types';
import { filesMatchingWorkspaces } from './utils';
function matchesFileName(fileNameWithPath: string, fileName: string): boolean {
return (
fileNameWithPath === fileName || fileNameWithPath.endsWith(`/${fileName}`)
);
}
export async function processPackageFile(
packageFile: string,
): Promise<PackageFile | null> {
const fileContent = await readLocalFile(packageFile, 'utf8');
if (!fileContent) {
logger.warn({ fileName: packageFile }, 'Could not read file content');
return null;
}
let packageJson: NpmPackage;
try {
packageJson = JSON.parse(fileContent);
} catch (err) {
logger.debug({ err }, 'Error parsing package.json');
return null;
}
const result = extractPackageJson(packageJson, packageFile);
if (!result) {
logger.debug({ packageFile }, 'No dependencies found');
return null;
}
return {
...result,
packageFile,
};
}
export async function extractAllPackageFiles(
config: ExtractConfig,
matchedFiles: string[],
): Promise<PackageFile[]> {
const packageFiles: PackageFile<NpmManagerData>[] = [];
const allLockFiles = matchedFiles.filter(
(file) =>
matchesFileName(file, 'bun.lock') || matchesFileName(file, 'bun.lockb'),
);
if (allLockFiles.length === 0) {
logger.debug('No bun lockfiles found');
return packageFiles;
}
const allPackageJson = matchedFiles.filter((file) =>
matchesFileName(file, 'package.json'),
);
for (const lockFile of allLockFiles) {
const packageFile = getSiblingFileName(lockFile, 'package.json');
const res = await processPackageFile(packageFile);
if (res) {
packageFiles.push({ ...res, lockFiles: [lockFile] });
}
// Check if package.json contains workspaces
const workspaces = res?.managerData?.workspaces;
if (!is.array(workspaces, is.string)) {
continue;
}
logger.debug(`Found bun workspaces in ${packageFile}`);
const pwd = getParentDir(packageFile);
const workspacePackageFiles = filesMatchingWorkspaces(
pwd,
allPackageJson,
workspaces,
);
if (workspacePackageFiles.length) {
logger.debug({ workspacePackageFiles }, 'Found bun workspace files');
for (const workspaceFile of workspacePackageFiles) {
const res = await processPackageFile(workspaceFile);
if (res) {
packageFiles.push({ ...res, lockFiles: [lockFile] });
}
}
}
}
return packageFiles;
}