aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/packages/turbo-workspaces/src/install.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/turbo-workspaces/src/install.ts')
-rw-r--r--packages/turbo-workspaces/src/install.ts125
1 files changed, 125 insertions, 0 deletions
diff --git a/packages/turbo-workspaces/src/install.ts b/packages/turbo-workspaces/src/install.ts
new file mode 100644
index 0000000..ad5f741
--- /dev/null
+++ b/packages/turbo-workspaces/src/install.ts
@@ -0,0 +1,125 @@
+import execa from "execa";
+import ora from "ora";
+import { satisfies } from "semver";
+import { ConvertError } from "./errors";
+import { Logger } from "./logger";
+import {
+ PackageManager,
+ PackageManagerDetails,
+ PackageManagerInstallDetails,
+ InstallArgs,
+} from "./types";
+
+export const PACKAGE_MANAGERS: Record<
+ PackageManager,
+ Array<PackageManagerInstallDetails>
+> = {
+ npm: [
+ {
+ name: "npm",
+ template: "npm",
+ command: "npm",
+ installArgs: ["install"],
+ version: "latest",
+ executable: "npx",
+ semver: "*",
+ default: true,
+ },
+ ],
+ pnpm: [
+ {
+ name: "pnpm6",
+ template: "pnpm",
+ command: "pnpm",
+ installArgs: ["install"],
+ version: "latest-6",
+ executable: "pnpx",
+ semver: "6.x",
+ },
+ {
+ name: "pnpm",
+ template: "pnpm",
+ command: "pnpm",
+ installArgs: ["install"],
+ version: "latest",
+ executable: "pnpm dlx",
+ semver: ">=7",
+ default: true,
+ },
+ ],
+ yarn: [
+ {
+ name: "yarn",
+ template: "yarn",
+ command: "yarn",
+ installArgs: ["install"],
+ version: "1.x",
+ executable: "npx",
+ semver: "<2",
+ default: true,
+ },
+ {
+ name: "berry",
+ template: "berry",
+ command: "yarn",
+ installArgs: ["install", "--no-immutable"],
+ version: "stable",
+ executable: "yarn dlx",
+ semver: ">=2",
+ },
+ ],
+};
+
+export function getPackageManagerMeta(packageManager: PackageManagerDetails) {
+ const { version, name } = packageManager;
+ if (version) {
+ return PACKAGE_MANAGERS[name].find((manager) =>
+ satisfies(version, manager.semver)
+ );
+ } else {
+ return PACKAGE_MANAGERS[name].find((manager) => {
+ return manager.default;
+ });
+ }
+}
+
+export default async function install(args: InstallArgs) {
+ const { to, logger, options } = args;
+
+ const installLogger = logger ?? new Logger(options);
+ const packageManager = getPackageManagerMeta(to);
+
+ if (!packageManager) {
+ throw new ConvertError("Unsupported package manager version.", {
+ type: "package_manager-unsupported_version",
+ });
+ }
+
+ installLogger.subStep(
+ `running "${packageManager.command} ${packageManager.installArgs}"`
+ );
+ if (!options?.dry) {
+ let spinner;
+ if (installLogger?.interactive) {
+ spinner = ora({
+ text: "installing dependencies...",
+ spinner: {
+ frames: installLogger.installerFrames(),
+ },
+ }).start();
+ }
+
+ try {
+ await execa(packageManager.command, packageManager.installArgs, {
+ cwd: args.project.paths.root,
+ });
+ if (spinner) {
+ spinner.stop();
+ }
+ installLogger.subStep(`dependencies installed`);
+ } catch (err) {
+ installLogger.subStepFailure(`failed to install dependencies`);
+ throw err;
+ }
+ }
+}