aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/packages/create-turbo/src/commands/create/prompts.ts
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/create-turbo/src/commands/create/prompts.ts
parent0b46fcd72ac34382387b2bcf9095233efbcc52f4 (diff)
downloadHydroRoll-dd84b9d64fb98746a230cd24233ff50a562c39c9.tar.gz
HydroRoll-dd84b9d64fb98746a230cd24233ff50a562c39c9.zip
Diffstat (limited to 'packages/create-turbo/src/commands/create/prompts.ts')
-rw-r--r--packages/create-turbo/src/commands/create/prompts.ts124
1 files changed, 124 insertions, 0 deletions
diff --git a/packages/create-turbo/src/commands/create/prompts.ts b/packages/create-turbo/src/commands/create/prompts.ts
new file mode 100644
index 0000000..a5ed7bf
--- /dev/null
+++ b/packages/create-turbo/src/commands/create/prompts.ts
@@ -0,0 +1,124 @@
+import path from "path";
+import fs from "fs-extra";
+import chalk from "chalk";
+import type { PackageManager } from "@turbo/workspaces";
+import type { CreateCommandArgument } from "./types";
+import { getAvailablePackageManagers } from "@turbo/utils";
+import { isFolderEmpty } from "../../utils/isFolderEmpty";
+import inquirer from "inquirer";
+
+function validateDirectory(directory: string): {
+ valid: boolean;
+ root: string;
+ projectName: string;
+ error?: string;
+} {
+ const root = path.resolve(directory);
+ const projectName = path.basename(root);
+ const exists = fs.existsSync(root);
+
+ const stat = fs.lstatSync(root, { throwIfNoEntry: false });
+ if (stat && !stat.isDirectory()) {
+ return {
+ valid: false,
+ root,
+ projectName,
+ error: `${chalk.dim(
+ projectName
+ )} is not a directory - please try a different location`,
+ };
+ }
+
+ if (exists) {
+ const { isEmpty, conflicts } = isFolderEmpty(root);
+ if (!isEmpty) {
+ return {
+ valid: false,
+ root,
+ projectName,
+ error: `${chalk.dim(projectName)} has ${conflicts.length} conflicting ${
+ conflicts.length === 1 ? "file" : "files"
+ } - please try a different location`,
+ };
+ }
+ }
+
+ return { valid: true, root, projectName };
+}
+
+export async function directory({
+ directory,
+}: {
+ directory: CreateCommandArgument;
+}) {
+ const projectDirectoryAnswer = await inquirer.prompt<{
+ projectDirectory: string;
+ }>({
+ type: "input",
+ name: "projectDirectory",
+ message: "Where would you like to create your turborepo?",
+ when: !directory,
+ default: "./my-turborepo",
+ validate: (directory: string) => {
+ const { valid, error } = validateDirectory(directory);
+ if (!valid && error) {
+ return error;
+ }
+ return true;
+ },
+ filter: (directory: string) => directory.trim(),
+ });
+
+ const { projectDirectory: selectedProjectDirectory = directory as string } =
+ projectDirectoryAnswer;
+
+ return validateDirectory(selectedProjectDirectory);
+}
+
+export async function packageManager({
+ packageManager,
+ skipTransforms,
+}: {
+ packageManager: CreateCommandArgument;
+ skipTransforms?: boolean;
+}) {
+ // if skip transforms is passed, we don't need to ask about the package manager (because that requires a transform)
+ if (skipTransforms) {
+ return undefined;
+ }
+
+ const availablePackageManagers = await getAvailablePackageManagers();
+ const packageManagerAnswer = await inquirer.prompt<{
+ packageManagerInput?: PackageManager;
+ }>({
+ name: "packageManagerInput",
+ type: "list",
+ message: "Which package manager do you want to use?",
+ when:
+ // prompt for package manager if it wasn't provided as an argument, or if it was
+ // provided, but isn't available (always allow npm)
+ !packageManager ||
+ (packageManager as PackageManager) !== "npm" ||
+ !Object.keys(availablePackageManagers).includes(packageManager),
+ choices: ["npm", "pnpm", "yarn"].map((p) => ({
+ name: p,
+ value: p,
+ disabled:
+ // npm should always be available
+ p === "npm" ||
+ availablePackageManagers?.[p as PackageManager]?.available
+ ? false
+ : `not installed`,
+ })),
+ });
+
+ const {
+ packageManagerInput:
+ selectedPackageManager = packageManager as PackageManager,
+ } = packageManagerAnswer;
+
+ return {
+ name: selectedPackageManager,
+ version: availablePackageManagers[selectedPackageManager].version,
+ };
+}