A lightweight proxy API for accessing @microsoft/rush-lib with smart loading and version resolution
—
Package manager abstraction and configuration for npm, pnpm, and yarn including installation options and dependency management.
Note: All APIs in this document are re-exported from @microsoft/rush-lib through @rushstack/rush-sdk.
Abstract base class for package manager implementations with unified API across npm, pnpm, and yarn.
/**
* Abstract base class for package manager implementations
*/
abstract class PackageManager {
/** Package manager name (npm, pnpm, yarn) */
readonly name: string;
/** Package manager version */
readonly version: string;
/** Common folder path */
readonly commonFolder: string;
/** Install all dependencies */
abstract installAsync(options: IInstallManagerOptions): Promise<void>;
/** Check if shrinkwrap file exists */
abstract isValidShrinkwrapFile(shrinkwrapFilePath: string): boolean;
/** Get shrinkwrap file path */
abstract getShrinkwrapFilePath(projectFolder: string): string;
/** Parse shrinkwrap file */
abstract parseShrinkwrapFile(shrinkwrapFilePath: string): DependencySpecifier | undefined;
}
interface IInstallManagerOptions {
/** Skip policy checks */
bypassPolicy?: boolean;
/** Allow shrinkwrap updates */
allowShrinkwrapUpdates?: boolean;
/** Maximum install attempts */
maxInstallAttempts?: number;
/** Network concurrency limit */
networkConcurrency?: number;
/** Check store integrity */
checkRuntimeShrinkwrap?: boolean;
}Usage Examples:
import { RushConfiguration } from "@rushstack/rush-sdk";
const config = loadFromDefaultLocation();
const packageManager = config.packageManager;
console.log(`Using ${packageManager.name} version ${packageManager.version}`);
// Install dependencies
await packageManager.installAsync({
allowShrinkwrapUpdates: true,
maxInstallAttempts: 3
});Configuration options specific to npm package manager.
/**
* NPM-specific configuration options
*/
class NpmOptionsConfiguration {
/** Environment variables to set during npm operations */
readonly environmentVariables: ReadonlyMap<string, string>;
/** NPM registry URL */
readonly registry?: string;
/** Additional command line arguments */
readonly additionalArgs: ReadonlyArray<string>;
/** Cache folder path */
readonly cacheFolder?: string;
/** Temporary folder path */
readonly tmpFolder?: string;
}Configuration options specific to pnpm package manager.
/**
* PNPM-specific configuration options
*/
class PnpmOptionsConfiguration {
/** Environment variables to set during pnpm operations */
readonly environmentVariables: ReadonlyMap<string, string>;
/** PNPM store path */
readonly pnpmStorePath?: string;
/** Prevent store pruning */
readonly preventManualShrinkwrapChanges: boolean;
/** Use frozen lockfile */
readonly useFrozenLockfileForInstall: boolean;
/** Additional command line arguments */
readonly additionalArgs: ReadonlyArray<string>;
/** Global folder path */
readonly globalFolder?: string;
/** Cache folder path */
readonly cacheFolder?: string;
/** State folder path */
readonly stateFolder?: string;
}Configuration options specific to yarn package manager.
/**
* Yarn-specific configuration options
*/
class YarnOptionsConfiguration {
/** Environment variables to set during yarn operations */
readonly environmentVariables: ReadonlyMap<string, string>;
/** Ignore optional dependencies */
readonly ignoreOptionalDependencies: boolean;
/** Network timeout in milliseconds */
readonly networkTimeout?: number;
/** Additional command line arguments */
readonly additionalArgs: ReadonlyArray<string>;
/** Cache folder path */
readonly cacheFolder?: string;
}Usage Examples:
import { RushConfiguration } from "@rushstack/rush-sdk";
const config = RushConfiguration.loadFromDefaultLocation();
// Access package manager specific options
if (config.packageManager === 'pnpm') {
const pnpmOptions = config.pnpmOptions;
console.log(`PNPM store path: ${pnpmOptions.pnpmStorePath}`);
console.log(`Frozen lockfile: ${pnpmOptions.useFrozenLockfileForInstall}`);
}
if (config.packageManager === 'npm') {
const npmOptions = config.npmOptions;
console.log(`NPM registry: ${npmOptions.registry}`);
console.log(`Cache folder: ${npmOptions.cacheFolder}`);
}
if (config.packageManager === 'yarn') {
const yarnOptions = config.yarnOptions;
console.log(`Network timeout: ${yarnOptions.networkTimeout}`);
console.log(`Ignore optional deps: ${yarnOptions.ignoreOptionalDependencies}`);
}Utilities for reading and manipulating package.json files with dependency management.
/**
* Utilities for editing package.json files
*/
class PackageJsonEditor {
/** Load package.json from file path */
static load(filePath: string): PackageJsonEditor;
/** File path of the package.json */
readonly filePath: string;
/** Parsed package.json data */
readonly packageJson: IPackageJson;
/** Add or update a dependency */
addOrUpdateDependency(
packageName: string,
newVersion: string,
dependencyType: DependencyType
): void;
/** Remove a dependency */
tryRemoveDependency(packageName: string, dependencyType: DependencyType): boolean;
/** Get dependency version */
tryGetDependency(packageName: string): PackageJsonDependency | undefined;
/** Save changes to disk */
saveIfModified(): boolean;
}
/**
* Represents a package.json dependency
*/
class PackageJsonDependency {
/** Package name */
readonly name: string;
/** Version specifier */
readonly version: string;
/** Dependency type */
readonly dependencyType: DependencyType;
/** Additional metadata */
readonly dependencyMeta: PackageJsonDependencyMeta;
}
class PackageJsonDependencyMeta {
/** Whether dependency is injected by Rush */
readonly injected?: boolean;
}
enum DependencyType {
Regular = "dependencies",
Dev = "devDependencies",
Optional = "optionalDependencies",
Peer = "peerDependencies"
}Usage Examples:
import { PackageJsonEditor, DependencyType } from "@rushstack/rush-sdk";
// Load and edit package.json
const editor = PackageJsonEditor.load("./package.json");
// Add a new dependency
editor.addOrUpdateDependency("lodash", "^4.17.21", DependencyType.Regular);
// Update a dev dependency
editor.addOrUpdateDependency("typescript", "^4.5.0", DependencyType.Dev);
// Check if dependency exists
const dep = editor.tryGetDependency("react");
if (dep) {
console.log(`React version: ${dep.version}`);
}
// Remove a dependency
const removed = editor.tryRemoveDependency("unused-package", DependencyType.Regular);
console.log(`Removed: ${removed}`);
// Save changes
const modified = editor.saveIfModified();
console.log(`Package.json modified: ${modified}`);Advanced dependency resolution and shrinkwrap management.
/**
* Dependency specifier for resolving package versions
*/
class DependencySpecifier {
/** Package name */
readonly packageName: string;
/** Version range */
readonly versionSpecifier: string;
/** Create from string like "package@1.0.0" */
static parse(specifier: string): DependencySpecifier;
/** Check if version satisfies this specifier */
versionIsCompatible(version: string): boolean;
}Install with Tessl CLI
npx tessl i tessl/npm-rushstack--rush-sdk