isolate-package
Version:
Isolate monorepo packages to form a self-contained deployable unit
48 lines (39 loc) • 1.36 kB
text/typescript
import fs from "fs-extra";
import assert from "node:assert";
import path from "node:path";
import { useLogger } from "~/lib/logger";
import { getMajorVersion } from "~/lib/utils/get-major-version";
import type { PackageManifest } from "../../types";
import { readTypedJsonSync } from "../../utils";
import type { PackageManagerName } from "../names";
import { getLockfileFileName, supportedPackageManagerNames } from "../names";
export function inferFromManifest(workspaceRoot: string) {
const log = useLogger();
const { packageManager: packageManagerString } =
readTypedJsonSync<PackageManifest>(
path.join(workspaceRoot, "package.json"),
);
if (!packageManagerString) {
log.debug("No packageManager field found in root manifest");
return;
}
const [name, version = "*"] = packageManagerString.split("@") as [
PackageManagerName,
string,
];
assert(
supportedPackageManagerNames.includes(name),
`Package manager "${name}" is not currently supported`,
);
const lockfileName = getLockfileFileName(name);
assert(
fs.existsSync(path.join(workspaceRoot, lockfileName)),
`Manifest declares ${name} to be the packageManager, but failed to find ${lockfileName} in workspace root`,
);
return {
name,
version,
majorVersion: getMajorVersion(version),
packageManagerString,
};
}