isolate-package
Version:
Isolate monorepo packages to form a self-contained deployable unit
50 lines (40 loc) • 1.48 kB
text/typescript
import type { ProjectManifest, PnpmSettings } from "@pnpm/types";
import path from "path";
import type { PackageManifest } from "~/lib/types";
import { isRushWorkspace, readTypedJson } from "~/lib/utils";
/**
* Adopts the `pnpm` fields from the root package manifest. Currently it takes
* overrides, onlyBuiltDependencies, and ignoredBuiltDependencies, because these
* are typically workspace-level configuration settings.
*/
export async function adoptPnpmFieldsFromRoot(
targetPackageManifest: PackageManifest,
workspaceRootDir: string,
): Promise<PackageManifest> {
if (isRushWorkspace(workspaceRootDir)) {
return targetPackageManifest;
}
const rootPackageManifest = await readTypedJson<ProjectManifest>(
path.join(workspaceRootDir, "package.json"),
);
const { overrides, onlyBuiltDependencies, ignoredBuiltDependencies } =
rootPackageManifest.pnpm || {};
/** If no pnpm fields are present, return the original manifest */
if (!overrides && !onlyBuiltDependencies && !ignoredBuiltDependencies) {
return targetPackageManifest;
}
const pnpmConfig: Partial<PnpmSettings> = {};
if (overrides) {
pnpmConfig.overrides = overrides;
}
if (onlyBuiltDependencies) {
pnpmConfig.onlyBuiltDependencies = onlyBuiltDependencies;
}
if (ignoredBuiltDependencies) {
pnpmConfig.ignoredBuiltDependencies = ignoredBuiltDependencies;
}
return {
...targetPackageManifest,
pnpm: pnpmConfig,
} as PackageManifest;
}