import { LOCKFILE } from 'upm/src/lock.ts'; import { findRoot } from 'upm/src/workspaces.ts'; import type { Lockfile } from 'upm/src/lock.ts'; import fs from 'node:fs'; import path from 'node:path'; export type Manifest = Record & { name?: string; version?: string; scripts?: Record; dependencies?: Record; devDependencies?: Record; optionalDependencies?: Record; peerDependencies?: Record; trustedDependencies?: string[]; }; export const GROUPS = ['dependencies', 'devDependencies', 'optionalDependencies'] as const; export function readJson(file: string): T | undefined { try { return JSON.parse(fs.readFileSync(file, 'utf8')) as T; } catch { return undefined; } } export function writeJson(file: string, value: unknown): void { fs.mkdirSync(path.dirname(file), { recursive: true }); fs.writeFileSync(file, `${JSON.stringify(value, null, 2)}\n`); } export function readManifest(dir: string): Manifest | undefined { return readJson(path.join(dir, 'package.json')); } export function readLock(dir: string): Lockfile | undefined { return readJson(path.join(dir, LOCKFILE)); } export async function findProjectDir(dir: string | undefined, cwd = process.cwd()): Promise { if (dir !== undefined) return path.resolve(cwd, dir); const root = await findRoot(cwd); return root.manifest ? root.dir : undefined; }