import { PackageJsonFile } from './package-json-file.js'; import { Workspace } from './workspace.js'; import { LockfilePackageQuery } from './lockfile-package-version.js'; export declare class Runnable { executable: string; args: string[]; constructor(executable: string, args: string[]); get unsafeDisplayCommand(): string; } export interface AddCommandOptions { packages: string[]; saveDev?: boolean; } export interface PackageManager { get name(): string; get representativeLockfiles(): string[]; get representativeConfigFile(): string | undefined; installCommand(): Runnable; addCommand(options: AddCommandOptions): Runnable; execCommand(args: string[]): Runnable; lookupWorkspace(dir: string): Promise; /** * Resolves the version of a single package as recorded in the package * manager's lockfile, scoped to a workspace importer. Returns `undefined` * when the lockfile can't be read or parsed, the package isn't present, or * the format isn't supported — the caller is expected to fall back to * another source (e.g. reading the installed package). */ resolvePackageVersionFromLockfile(lockfilePath: string, query: LockfilePackageQuery): Promise; detector(): PackageManagerDetector; } export type DetectionMethod = 'userAgent' | 'runtime' | 'lockfile' | 'configFile' | 'executable'; export declare abstract class PackageManagerDetector { abstract get name(): string; /** * Tie-break precedence when more than one detector matches the same detection * method. Higher wins (detectors are sorted descending). Lets a detector rank * itself differently per method — e.g. npm deprioritizes its executable * because npm is almost always on PATH, so its mere presence is no signal. */ abstract priority(method: DetectionMethod): number; abstract detectUserAgent(userAgent: string): boolean; abstract detectRuntime(): boolean; abstract get representativeLockfiles(): string[]; abstract get representativeConfigFile(): string | undefined; detectLockfile(dir: string): Promise; abstract detectConfigFile(dir: string): Promise; abstract detectExecutable(lookup: PathLookup): Promise; abstract installCommand(): Runnable; abstract addCommand(options: AddCommandOptions): Runnable; abstract execCommand(args: string[]): Runnable; abstract lookupWorkspace(dir: string): Promise; /** * Default: lockfile parsing is unsupported, so callers fall back. Package * managers that can parse their lockfile override this. */ resolvePackageVersionFromLockfile(lockfilePath: string, query: LockfilePackageQuery): Promise; detector(): PackageManagerDetector; } export declare class NpmDetector extends PackageManagerDetector implements PackageManager { get name(): string; priority(method: DetectionMethod): number; detectUserAgent(userAgent: string): boolean; detectRuntime(): boolean; get representativeLockfiles(): string[]; get representativeConfigFile(): undefined; detectConfigFile(dir: string): Promise; detectExecutable(lookup: PathLookup): Promise; installCommand(): Runnable; addCommand(options: AddCommandOptions): Runnable; execCommand(args: string[]): Runnable; lookupWorkspace(dir: string): Promise; resolvePackageVersionFromLockfile(lockfilePath: string, query: LockfilePackageQuery): Promise; } export declare class CNpmDetector extends PackageManagerDetector implements PackageManager { get name(): string; priority(): number; detectUserAgent(userAgent: string): boolean; detectRuntime(): boolean; get representativeLockfiles(): string[]; get representativeConfigFile(): undefined; detectConfigFile(dir: string): Promise; detectExecutable(lookup: PathLookup): Promise; installCommand(): Runnable; addCommand(options: AddCommandOptions): Runnable; execCommand(args: string[]): Runnable; lookupWorkspace(dir: string): Promise; resolvePackageVersionFromLockfile(lockfilePath: string, query: LockfilePackageQuery): Promise; } export declare class PNpmDetector extends PackageManagerDetector implements PackageManager { get name(): string; priority(): number; detectUserAgent(userAgent: string): boolean; detectRuntime(): boolean; get representativeLockfiles(): string[]; get representativeConfigFile(): string; detectConfigFile(dir: string): Promise; detectExecutable(lookup: PathLookup): Promise; installCommand(): Runnable; addCommand(options: AddCommandOptions): Runnable; execCommand(args: string[]): Runnable; lookupWorkspace(dir: string): Promise; resolvePackageVersionFromLockfile(lockfilePath: string, query: LockfilePackageQuery): Promise; } export declare class YarnDetector extends PackageManagerDetector implements PackageManager { get name(): string; priority(): number; detectUserAgent(userAgent: string): boolean; detectRuntime(): boolean; get representativeLockfiles(): string[]; get representativeConfigFile(): undefined; detectConfigFile(dir: string): Promise; detectExecutable(lookup: PathLookup): Promise; installCommand(): Runnable; addCommand(options: AddCommandOptions): Runnable; execCommand(args: string[]): Runnable; lookupWorkspace(dir: string): Promise; resolvePackageVersionFromLockfile(lockfilePath: string, query: LockfilePackageQuery): Promise; } export declare class DenoDetector extends PackageManagerDetector implements PackageManager { get name(): string; priority(): number; detectUserAgent(userAgent: string): boolean; detectRuntime(): boolean; get representativeLockfiles(): string[]; get representativeConfigFile(): string; detectConfigFile(dir: string): Promise; detectExecutable(lookup: PathLookup): Promise; installCommand(): Runnable; addCommand(options: AddCommandOptions): Runnable; execCommand(args: string[]): Runnable; lookupWorkspace(dir: string): Promise; } export declare class BunDetector extends PackageManagerDetector implements PackageManager { get name(): string; priority(): number; detectUserAgent(userAgent: string): boolean; detectRuntime(): boolean; get representativeLockfiles(): string[]; get representativeConfigFile(): undefined; detectConfigFile(dir: string): Promise; detectExecutable(lookup: PathLookup): Promise; installCommand(): Runnable; addCommand(options: AddCommandOptions): Runnable; execCommand(args: string[]): Runnable; lookupWorkspace(dir: string): Promise; resolvePackageVersionFromLockfile(lockfilePath: string, query: LockfilePackageQuery): Promise; } /** * Inspiration taken from https://github.com/otiai10/lookpath. */ export declare class PathLookup { static win: boolean; paths: string[]; pathext: string[]; pathextSet: Set; constructor(); detectPresence(executable: string): Promise; lookupPath(executable: string): Promise; } export declare const npmPackageManager: NpmDetector; export declare const knownPackageManagers: PackageManagerDetector[]; export interface DetectPackageManagerOptions { detectors: PackageManagerDetector[]; root?: string; } export declare function detectPackageManager(dir: string, options?: DetectPackageManagerOptions): Promise; export interface NearestLockFile { packageManager: PackageManager; lockfile: string; } export declare class NoLockfileFoundError extends Error { searchPaths: string[]; lockfiles: string[]; constructor(searchPaths: string[], lockfiles: string[], options?: ErrorOptions); } export interface DetectNearestLockfileOptions { detectors?: PackageManagerDetector[]; root?: string; } /** * Searches `dir` and every parent directory (up to and including * `options.root`) for a lockfile of any of the given `options.detectors` * (or all known package manager detectors if not given). The search stops * when a directory containing lockfiles is found. * * @returns All detected lockfiles in the directory. * @throws {NoLockfileFoundError} If no directory containing a lockfile is found. */ export declare function detectNearestLockfiles(dir: string, options?: DetectNearestLockfileOptions): Promise; export interface NearestConfigFile { packageManager: PackageManager; configFile: string; } export declare class NoConfigFileFoundError extends Error { searchPaths: string[]; configFiles: string[]; constructor(searchPaths: string[], configFiles: string[], options?: ErrorOptions); } export interface DetectNearestConfigFileOptions { detectors?: PackageManagerDetector[]; root?: string; } /** * Searches `dir` and every parent directory (up to and including * `options.root`) for a config file of any of the given `options.detectors` * (or all known package manager detectors if not given). The search stops * when a directory containing config files is found. * * @returns All detected config files in the directory. * @throws {NoConfigFileFoundError} If no directory containing a config file is found. */ export declare function detectNearestConfigFiles(dir: string, options?: DetectNearestConfigFileOptions): Promise; export declare class NoPackageJsonFoundError extends Error { searchPaths: string[]; constructor(searchPaths: string[], options?: ErrorOptions); } export interface DetectNearestPackageJsonOptions { root?: string; } export declare function detectNearestPackageJson(dir: string, options?: DetectNearestPackageJsonOptions): Promise; export declare function fauxWorkspaceFromPackageJson(packageManager: PackageManager, packageJsonFile: PackageJsonFile): Promise;