aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/packages/turbo-workspaces/src/convert.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/turbo-workspaces/src/convert.ts')
-rw-r--r--packages/turbo-workspaces/src/convert.ts61
1 files changed, 61 insertions, 0 deletions
diff --git a/packages/turbo-workspaces/src/convert.ts b/packages/turbo-workspaces/src/convert.ts
new file mode 100644
index 0000000..9f481c1
--- /dev/null
+++ b/packages/turbo-workspaces/src/convert.ts
@@ -0,0 +1,61 @@
+import chalk from "chalk";
+import managers from "./managers";
+import { Project, Options, PackageManagerDetails } from "./types";
+import install from "./install";
+import { Logger } from "./logger";
+import { ConvertError } from "./errors";
+
+/*
+ * Convert a project using workspaces from one package manager to another.
+
+ Steps are run in the following order:
+ 1. managerFrom.remove
+ 2. managerTo.create
+ 3. managerTo.convertLock
+ 3. install
+ 4. managerFrom.clean
+
+*/
+export async function convertProject({
+ project,
+ to,
+ logger,
+ options,
+}: {
+ project: Project;
+ to: PackageManagerDetails;
+ logger: Logger;
+ options?: Options;
+}) {
+ logger.header(
+ `Converting project from ${project.packageManager} to ${to.name}.`
+ );
+
+ if (project.packageManager == to.name) {
+ throw new ConvertError("You are already using this package manager", {
+ type: "package_manager-already_in_use",
+ });
+ }
+
+ // remove old workspace data
+ await managers[project.packageManager].remove({
+ project,
+ to,
+ logger,
+ options,
+ });
+
+ // create new workspace data
+ await managers[to.name].create({ project, to, logger, options });
+
+ logger.mainStep("Installing dependencies");
+ if (!options?.skipInstall) {
+ await managers[to.name].convertLock({ project, logger, options });
+ await install({ project, to, logger, options });
+ } else {
+ logger.subStep(chalk.yellow("Skipping install"));
+ }
+
+ logger.mainStep(`Cleaning up ${project.packageManager} workspaces`);
+ await managers[project.packageManager].clean({ project, logger });
+}