aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/packages/turbo-workspaces/src/commands/convert
diff options
context:
space:
mode:
author简律纯 <hsiangnianian@outlook.com>2023-04-28 01:36:44 +0800
committer简律纯 <hsiangnianian@outlook.com>2023-04-28 01:36:44 +0800
commitdd84b9d64fb98746a230cd24233ff50a562c39c9 (patch)
treeb583261ef00b3afe72ec4d6dacb31e57779a6faf /packages/turbo-workspaces/src/commands/convert
parent0b46fcd72ac34382387b2bcf9095233efbcc52f4 (diff)
downloadHydroRoll-dd84b9d64fb98746a230cd24233ff50a562c39c9.tar.gz
HydroRoll-dd84b9d64fb98746a230cd24233ff50a562c39c9.zip
Diffstat (limited to 'packages/turbo-workspaces/src/commands/convert')
-rw-r--r--packages/turbo-workspaces/src/commands/convert/index.ts109
-rw-r--r--packages/turbo-workspaces/src/commands/convert/types.ts6
2 files changed, 115 insertions, 0 deletions
diff --git a/packages/turbo-workspaces/src/commands/convert/index.ts b/packages/turbo-workspaces/src/commands/convert/index.ts
new file mode 100644
index 0000000..6cc82fc
--- /dev/null
+++ b/packages/turbo-workspaces/src/commands/convert/index.ts
@@ -0,0 +1,109 @@
+import { ConvertCommandArgument, ConvertCommandOptions } from "./types";
+import inquirer from "inquirer";
+import { Logger } from "../../logger";
+import chalk from "chalk";
+import { getAvailablePackageManagers } from "@turbo/utils";
+import { directoryInfo } from "../../utils";
+import getWorkspaceDetails from "../../getWorkspaceDetails";
+import { PackageManager } from "../../types";
+import { convertProject } from "../../convert";
+
+function isPackageManagerDisabled({
+ packageManager,
+ currentWorkspaceManger,
+ availablePackageManagers,
+}: {
+ packageManager: PackageManager;
+ currentWorkspaceManger: PackageManager;
+ availablePackageManagers: Record<PackageManager, { available: boolean }>;
+}) {
+ if (currentWorkspaceManger === packageManager) {
+ return "already in use";
+ }
+
+ if (!availablePackageManagers[packageManager].available) {
+ return "not installed";
+ }
+
+ return false;
+}
+
+export default async function convertCommand(
+ directory: ConvertCommandArgument,
+ packageManager: ConvertCommandArgument,
+ options: ConvertCommandOptions
+) {
+ const logger = new Logger(options);
+
+ logger.hero();
+ logger.header("Welcome, let's convert your project.");
+ logger.blankLine();
+
+ const directoryAnswer = await inquirer.prompt<{
+ directoryInput: string;
+ }>({
+ type: "input",
+ name: "directoryInput",
+ message: "Where is the root of your repo?",
+ when: !directory,
+ default: ".",
+ validate: (directory: string) => {
+ const { exists, absolute } = directoryInfo({ directory });
+ if (exists) {
+ return true;
+ } else {
+ return `Directory ${chalk.dim(`(${absolute})`)} does not exist`;
+ }
+ },
+ filter: (directory: string) => directory.trim(),
+ });
+
+ const { directoryInput: selectedDirectory = directory } = directoryAnswer;
+ const { exists, absolute: root } = directoryInfo({
+ directory: selectedDirectory,
+ });
+ if (!exists) {
+ console.error(`Directory ${chalk.dim(`(${root})`)} does not exist`);
+ return process.exit(1);
+ }
+
+ const [project, availablePackageManagers] = await Promise.all([
+ getWorkspaceDetails({ root }),
+ getAvailablePackageManagers(),
+ ]);
+
+ const packageManagerAnswer = await inquirer.prompt<{
+ packageManagerInput?: PackageManager;
+ }>({
+ name: "packageManagerInput",
+ type: "list",
+ message: `Convert from ${project.packageManager} workspaces to:`,
+ when:
+ !packageManager ||
+ !Object.keys(availablePackageManagers).includes(packageManager),
+ choices: ["npm", "pnpm", "yarn"].map((p) => ({
+ name: `${p} workspaces`,
+ value: p,
+ disabled: isPackageManagerDisabled({
+ packageManager: p as PackageManager,
+ currentWorkspaceManger: project.packageManager,
+ availablePackageManagers,
+ }),
+ })),
+ });
+ const {
+ packageManagerInput:
+ selectedPackageManager = packageManager as PackageManager,
+ } = packageManagerAnswer;
+
+ await convertProject({
+ project,
+ to: {
+ name: selectedPackageManager,
+ version: availablePackageManagers[selectedPackageManager]
+ .version as string,
+ },
+ logger,
+ options,
+ });
+}
diff --git a/packages/turbo-workspaces/src/commands/convert/types.ts b/packages/turbo-workspaces/src/commands/convert/types.ts
new file mode 100644
index 0000000..a7b9deb
--- /dev/null
+++ b/packages/turbo-workspaces/src/commands/convert/types.ts
@@ -0,0 +1,6 @@
+export type ConvertCommandArgument = string;
+export type ConvertCommandOptions = {
+ dry: boolean;
+ force: boolean;
+ skipInstall: boolean;
+};