From a26e7f717ec9a88151783b64633929aa5ccc83a3 Mon Sep 17 00:00:00 2001 From: zuiidea Date: Tue, 14 Apr 2026 22:33:56 +0800 Subject: [PATCH] feat(create): interactive prompts for example, dir, name, pm Made-with: Cursor --- packages/create/src/prompts.ts | 61 ++++++++++++++++++++++++++++++++++ packages/create/src/types.ts | 17 ++++++++++ 2 files changed, 78 insertions(+) create mode 100644 packages/create/src/prompts.ts create mode 100644 packages/create/src/types.ts diff --git a/packages/create/src/prompts.ts b/packages/create/src/prompts.ts new file mode 100644 index 0000000..cca5a83 --- /dev/null +++ b/packages/create/src/prompts.ts @@ -0,0 +1,61 @@ +import { confirm, input, select } from "@inquirer/prompts"; +import type { PackageManagerName } from "./package-manager.js"; +import { CliError } from "./errors.js"; +import { normalizePackageName } from "./utils/normalize-package-name.js"; + +export async function promptExample(examples: string[]): Promise { + return select({ + message: "Which example do you want?", + choices: examples.map((value) => ({ name: value, value })), + }); +} + +export async function promptTargetDir(): Promise { + const raw = await input({ + message: + "Project directory (relative path, or '.' for current directory)?", + default: "my-antd-admin", + }); + const dir = (raw.trim() || "my-antd-admin").replace(/\\/g, "/"); + if (dir === ".") { + const ok = await confirm({ + message: "Scaffold into the current directory?", + default: false, + }); + if (!ok) { + throw new CliError("Aborted.", "INVALID_INPUT"); + } + } + return dir; +} + +export async function promptPackageName(defaultName: string): Promise { + const raw = await input({ + message: "npm package name for package.json?", + default: defaultName, + validate: (value) => { + try { + normalizePackageName(value); + return true; + } catch (e) { + return e instanceof Error ? e.message : String(e); + } + }, + }); + return normalizePackageName(raw); +} + +export async function promptPackageManager( + available: PackageManagerName[] +): Promise { + if (available.length === 0) { + throw new CliError( + "No supported package manager found in PATH (pnpm, npm, yarn, bun).", + "INVALID_INPUT" + ); + } + return select({ + message: "Which package manager do you want to use?", + choices: available.map((value) => ({ name: value, value })), + }); +} diff --git a/packages/create/src/types.ts b/packages/create/src/types.ts new file mode 100644 index 0000000..7df15e3 --- /dev/null +++ b/packages/create/src/types.ts @@ -0,0 +1,17 @@ +import type { PackageManagerName } from "./package-manager.js"; + +export type CreateCliOptions = { + packageManager?: PackageManagerName; + skipInstall: boolean; + skipTransforms: boolean; + example?: string; + examplePath?: string; + git: boolean; +}; + +export type CreateContext = { + example: string; + targetDir: string; + packageName: string; + packageManager: PackageManagerName; +};