diff --git a/.changeset/tame-chefs-leave.md b/.changeset/tame-chefs-leave.md new file mode 100644 index 0000000..9b86ccb --- /dev/null +++ b/.changeset/tame-chefs-leave.md @@ -0,0 +1,5 @@ +--- +"create-better-t-stack": minor +--- + +refractor: migrate inquirer to @clack/prompts diff --git a/apps/cli/package.json b/apps/cli/package.json index 7e67d85..3dbea54 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -18,7 +18,7 @@ }, "files": ["dist", "templates"], "dependencies": { - "@inquirer/prompts": "^7.3.1", + "@clack/prompts": "^0.10.0", "chalk": "^5.3.0", "commander": "^13.1.0", "execa": "^8.0.1", diff --git a/apps/cli/src/helpers/create-project.ts b/apps/cli/src/helpers/create-project.ts index b06b0df..04ccc61 100644 --- a/apps/cli/src/helpers/create-project.ts +++ b/apps/cli/src/helpers/create-project.ts @@ -1,164 +1,96 @@ import path from "node:path"; -import { confirm, select } from "@inquirer/prompts"; +import { cancel, confirm, isCancel, log, spinner, tasks } from "@clack/prompts"; import chalk from "chalk"; import { $ } from "execa"; import fs from "fs-extra"; -import ora from "ora"; -import { DEFAULT_CONFIG } from "../consts"; -import type { PackageManager, ProjectConfig } from "../types"; -import { getUserPkgManager } from "../utils/get-package-manager"; -import { logger } from "../utils/logger"; +import type { ProjectConfig } from "../types"; import { setupTurso } from "./db-setup"; export async function createProject(options: ProjectConfig) { - const spinner = ora("Creating project directory...").start(); + const s = spinner(); const projectDir = path.resolve(process.cwd(), options.projectName); + let shouldInstallDeps = false; try { - await fs.ensureDir(projectDir); - spinner.succeed(); - console.log(); + await tasks([ + { + title: "Creating project directory", + task: async () => { + await fs.ensureDir(projectDir); + }, + }, + { + title: "Cloning template repository", + task: async () => { + try { + await $`npx degit AmanVarshney01/Better-T-Stack ${projectDir}`; + } catch (error) { + log.error("Failed to clone template repository"); + if (error instanceof Error) { + log.error(error.message); + } + throw error; + } + }, + }, + { + title: "Initializing git repository", + task: async () => { + if (options.git) { + await $`git init ${projectDir}`; + } + }, + }, + ]); - spinner.start("Cloning template repository..."); - await $`npx degit https://github.com/AmanVarshney01/Better-T-Stack.git ${projectDir}`; - spinner.succeed(); - console.log(); - - let shouldInitGit = options.git; - - if (!options.yes && shouldInitGit) { - shouldInitGit = await confirm({ - message: chalk.blue.bold("šŸ”„ Initialize a git repository?"), - default: true, - }).catch((error) => { - spinner.stop(); - console.log(); - throw error; - }); - } - - if (shouldInitGit) { - spinner.start("Initializing git repository..."); - await $`git init ${projectDir}`; - spinner.succeed(); - } - - const detectedPackageManager = getUserPkgManager(); - let packageManager = options.packageManager ?? detectedPackageManager; - - if (!options.yes) { - const useDetectedPackageManager = await confirm({ - message: chalk.blue.bold( - `šŸ“¦ Use detected package manager (${chalk.cyan( - detectedPackageManager, - )})?`, - ), - default: true, - }).catch((error) => { - spinner.stop(); - throw error; - }); - - if (!useDetectedPackageManager) { - console.log(); - packageManager = await select({ - message: chalk.blue.bold("šŸ“¦ Select package manager:"), - choices: [ - { - value: "npm", - name: chalk.yellow("npm"), - description: chalk.dim("Node Package Manager"), - }, - { - value: "yarn", - name: chalk.blue("yarn"), - description: chalk.dim( - "Fast, reliable, and secure dependency management", - ), - }, - { - value: "pnpm", - name: chalk.magenta("pnpm"), - description: chalk.dim( - "Fast, disk space efficient package manager", - ), - }, - { - value: "bun", - name: chalk.cyan("bun"), - description: chalk.dim("All-in-one JavaScript runtime & toolkit"), - }, - ], - }).catch((error) => { - spinner.stop(); - throw error; - }); - } - } - - const installDeps = await confirm({ - message: chalk.blue.bold( - `šŸ“¦ Install dependencies using ${chalk.cyan(packageManager)}?`, - ), - default: true, - }).catch((error) => { - spinner.stop(); - throw error; + const installDepsResponse = await confirm({ + message: `šŸ“¦ Install dependencies using ${options.packageManager}?`, }); - console.log(); + if (isCancel(installDepsResponse)) { + cancel("Operation cancelled"); + process.exit(0); + } - if (installDeps) { - spinner.start(`šŸ“¦ Installing dependencies using ${packageManager}...`); - switch (packageManager ?? DEFAULT_CONFIG.packageManager) { - case "npm": - await $`cd ${projectDir} && npm install`; - break; - case "yarn": - await $`cd ${projectDir} && yarn install`; - break; - case "pnpm": - await $`cd ${projectDir} && pnpm install`; - break; - case "bun": - await $`cd ${projectDir} && bun install`; - break; - default: - throw new Error("Unsupported package manager"); + shouldInstallDeps = installDepsResponse; + + if (shouldInstallDeps) { + s.start(`Installing dependencies using ${options.packageManager}...`); + try { + await $({ + cwd: projectDir, + stdio: "inherit", + })`${options.packageManager} install`; + s.stop("Dependencies installed successfully"); + } catch (error) { + s.stop("Failed to install dependencies"); + if (error instanceof Error) { + log.error(`Installation error: ${error.message}`); + } + throw error; } - spinner.succeed(); - console.log(); } if (options.database === "libsql") { await setupTurso(projectDir); } - logger.success("\n✨ Project created successfully!\n"); - logger.info("Next steps:"); - logger.info(` cd ${options.projectName}`); - if (!installDeps) { - logger.info(` ${packageManager} install`); + log.success("✨ Project created successfully!\n"); + log.info(chalk.dim("Next steps:")); + log.info(` cd ${options.projectName}`); + if (!shouldInstallDeps) { + log.info(` ${options.packageManager} install`); } - logger.info( - ` ${packageManager === "npm" ? "npm run" : packageManager} dev`, + log.info( + ` ${ + options.packageManager === "npm" ? "npm run" : options.packageManager + } dev`, ); } catch (error) { - spinner.stop(); - - if ( - error instanceof Error && - (error.name === "ExitPromptError" || - error.message.includes("User force closed")) - ) { - console.log("\n"); - logger.warn("Operation cancelled"); - process.exit(0); - return; + s.stop("Failed"); + if (error instanceof Error) { + log.error(`Error during project creation: ${error.message}`); + process.exit(1); } - - spinner.fail("Failed to create project"); - logger.error("Error during project creation:", error); - process.exit(1); } } diff --git a/apps/cli/src/helpers/db-setup.ts b/apps/cli/src/helpers/db-setup.ts index f898314..cd1fe7f 100644 --- a/apps/cli/src/helpers/db-setup.ts +++ b/apps/cli/src/helpers/db-setup.ts @@ -1,11 +1,8 @@ import os from "node:os"; import path from "node:path"; -import { confirm, input } from "@inquirer/prompts"; -import chalk from "chalk"; +import * as p from "@clack/prompts"; import { $ } from "execa"; import fs from "fs-extra"; -import ora, { type Ora } from "ora"; -import { logger } from "../utils/logger"; import { isTursoInstalled, isTursoLoggedIn } from "../utils/turso-cli"; interface TursoConfig { @@ -13,21 +10,21 @@ interface TursoConfig { authToken: string; } -async function loginToTurso(spinner: Ora) { +async function loginToTurso() { + const spinner = p.spinner(); try { spinner.start("Logging in to Turso..."); await $`turso auth login`; - spinner.succeed("Logged in to Turso successfully!"); - console.log(); + spinner.stop("Logged in to Turso successfully!"); } catch (error) { - spinner.fail("Failed to log in to Turso"); + spinner.stop("Failed to log in to Turso"); throw error; } } -async function installTursoCLI(isMac: boolean, spinner: Ora) { +async function installTursoCLI(isMac: boolean) { + const spinner = p.spinner(); try { - console.log(); spinner.start("Installing Turso CLI..."); if (isMac) { @@ -38,15 +35,14 @@ async function installTursoCLI(isMac: boolean, spinner: Ora) { await $`bash -c '${installScript}'`; } - spinner.succeed("Turso CLI installed successfully!"); - console.log(); + spinner.stop("Turso CLI installed successfully!"); } catch (error) { if (error instanceof Error && error.message.includes("User force closed")) { spinner.stop(); - logger.warn("\nTurso CLI installation cancelled by user"); + p.log.warn("Turso CLI installation cancelled by user"); throw new Error("Installation cancelled"); } - spinner.fail("Failed to install Turso CLI"); + spinner.stop("Failed to install Turso CLI"); throw error; } } @@ -62,7 +58,6 @@ async function createTursoDatabase(dbName: string): Promise { } const { stdout: dbUrl } = await $`turso db show ${dbName} --url`; - const { stdout: authToken } = await $`turso db tokens create ${dbName}`; return { @@ -83,27 +78,28 @@ TURSO_AUTH_TOKEN=`; } function displayManualSetupInstructions() { - logger.info("\nšŸ“ Manual Turso Setup Instructions:"); - logger.info("1. Visit https://turso.tech and create an account"); - logger.info("2. Create a new database from the dashboard"); - logger.info("3. Get your database URL and authentication token"); - logger.info( + p.log.info("šŸ“ Manual Turso Setup Instructions:"); + p.log.info("1. Visit https://turso.tech and create an account"); + p.log.info("2. Create a new database from the dashboard"); + p.log.info("3. Get your database URL and authentication token"); + p.log.info( "4. Add these credentials to the .env file in packages/server/.env", ); - logger.info("\nThe .env file has been created with placeholder variables:"); - logger.info("TURSO_DATABASE_URL=your_database_url"); - logger.info("TURSO_AUTH_TOKEN=your_auth_token"); + p.log.info("\nThe .env file has been created with placeholder variables:"); + p.log.info("TURSO_DATABASE_URL=your_database_url"); + p.log.info("TURSO_AUTH_TOKEN=your_auth_token"); } export async function setupTurso(projectDir: string) { - const spinner = ora(); + p.intro("Setting up Turso..."); + const platform = os.platform(); const isMac = platform === "darwin"; const canInstallCLI = platform !== "win32"; try { if (!canInstallCLI) { - logger.warn("\nAutomatic Turso setup is not supported on Windows."); + p.log.warn("Automatic Turso setup is not supported on Windows."); await writeEnvFile(projectDir); displayManualSetupInstructions(); return; @@ -112,78 +108,68 @@ export async function setupTurso(projectDir: string) { const isCliInstalled = await isTursoInstalled(); if (!isCliInstalled) { - const shouldInstall = await confirm({ - message: chalk.blue.bold("šŸ”§ Would you like to install Turso CLI?"), - default: true, - }).catch((error) => { - spinner.stop(); - throw error; + const shouldInstall = await p.confirm({ + message: "Would you like to install Turso CLI?", }); + if (p.isCancel(shouldInstall)) { + p.cancel("Operation cancelled"); + process.exit(0); + } + if (!shouldInstall) { await writeEnvFile(projectDir); displayManualSetupInstructions(); return; } - await installTursoCLI(isMac, spinner); + await installTursoCLI(isMac); } const isLoggedIn = await isTursoLoggedIn(); if (!isLoggedIn) { - await loginToTurso(spinner); + await loginToTurso(); } - const defaultDbName = path.basename(projectDir); - - let dbName = await input({ - message: chalk.blue.bold("šŸ’¾ Enter database name:"), - default: defaultDbName, - }).catch((error) => { - spinner.stop(); - throw error; - }); - let success = false; + let dbName = ""; + let suggestedName = path.basename(projectDir); + while (!success) { + const dbNameResponse = await p.text({ + message: "Enter database name:", + defaultValue: suggestedName, + }); + + if (p.isCancel(dbNameResponse)) { + p.cancel("Operation cancelled"); + process.exit(0); + } + + dbName = dbNameResponse as string; + const spinner = p.spinner(); + try { - console.log(); spinner.start(`Creating Turso database "${dbName}"...`); const config = await createTursoDatabase(dbName); await writeEnvFile(projectDir, config); - spinner.succeed("Turso database configured successfully!"); + spinner.stop("Turso database configured successfully!"); success = true; } catch (error) { if (error instanceof Error && error.message === "DATABASE_EXISTS") { - spinner.warn(`Database "${dbName}" already exists`); - dbName = await input({ - message: "Please enter a different database name:", - default: `${dbName}-${Math.floor(Math.random() * 1000)}`, - }).catch((error) => { - spinner.stop(); - throw error; - }); + spinner.stop(`Database "${dbName}" already exists`); + suggestedName = `${dbName}-${Math.floor(Math.random() * 1000)}`; } else { throw error; } } } + + p.outro("Turso setup completed successfully!"); } catch (error) { - spinner.stop(); - - if ( - error instanceof Error && - (error.name === "ExitPromptError" || - error.message.includes("User force closed")) - ) { - logger.warn("\nTurso setup cancelled"); - await writeEnvFile(projectDir); - displayManualSetupInstructions(); - return; - } - - logger.error("Error during Turso setup:", error); + p.log.error(`Error during Turso setup: ${error}`); await writeEnvFile(projectDir); displayManualSetupInstructions(); + p.outro("Setup completed with manual configuration required."); } } diff --git a/apps/cli/src/index.ts b/apps/cli/src/index.ts index fd32b5b..ccf6020 100644 --- a/apps/cli/src/index.ts +++ b/apps/cli/src/index.ts @@ -1,4 +1,15 @@ -import { checkbox, confirm, input, select } from "@inquirer/prompts"; +import { + cancel, + confirm, + group, + intro, + isCancel, + multiselect, + outro, + select, + spinner, + text, +} from "@clack/prompts"; import chalk from "chalk"; import { Command } from "commander"; import { DEFAULT_CONFIG } from "./consts"; @@ -11,6 +22,7 @@ import type { ProjectFeature, } from "./types"; import { generateReproducibleCommand } from "./utils/generate-reproducible-command"; +import { getUserPkgManager } from "./utils/get-package-manager"; import { getVersion } from "./utils/get-version"; import { logger } from "./utils/logger"; @@ -25,88 +37,110 @@ const program = new Command(); async function gatherConfig( flags: Partial, ): Promise { - const config: ProjectConfig = { - projectName: "", - database: "libsql", - auth: true, - features: [], + const result = await group({ + projectName: () => + text({ + message: "šŸ“ Project name", + placeholder: "my-better-t-app", + validate: (value) => { + if (!value) return "Project name is required"; + }, + }), + database: () => + !flags.database + ? select({ + message: "šŸ’¾ Select database", + options: [ + { + value: "libsql", + label: "libSQL", + hint: "✨ (Recommended) - Turso's embedded SQLite database", + }, + { + value: "postgres", + label: "PostgreSQL", + hint: "🐘 Traditional relational database", + }, + ], + }) + : Promise.resolve(flags.database), + auth: () => + flags.auth === undefined + ? confirm({ + message: "šŸ” Add authentication with Better-Auth?", + }) + : Promise.resolve(flags.auth), + features: () => + !flags.features + ? multiselect({ + message: "šŸŽÆ Select additional features", + options: [ + { + value: "docker", + label: "Docker setup", + hint: "🐳 Containerize your application", + }, + { + value: "github-actions", + label: "GitHub Actions", + hint: "⚔ CI/CD workflows", + }, + { + value: "SEO", + label: "Basic SEO setup", + hint: "šŸ” Search engine optimization configuration", + }, + ], + }) + : Promise.resolve(flags.features), + packageManager: async () => { + const detectedPackageManager = getUserPkgManager(); + + const useDetected = await confirm({ + message: `šŸ“¦ Use detected package manager (${detectedPackageManager})?`, + }); + + if (useDetected) return detectedPackageManager; + + return select({ + message: "šŸ“¦ Select package manager", + options: [ + { value: "npm", label: "npm", hint: "Node Package Manager" }, + { + value: "yarn", + label: "yarn", + hint: "Fast, reliable, and secure dependency management", + }, + { + value: "pnpm", + label: "pnpm", + hint: "Fast, disk space efficient package manager", + }, + { + value: "bun", + label: "bun", + hint: "All-in-one JavaScript runtime & toolkit", + }, + ], + }); + }, + }); + + return { + projectName: result.projectName as string, + database: (result.database as ProjectDatabase) ?? "libsql", + auth: (result.auth as boolean) ?? true, + features: (result.features as ProjectFeature[]) ?? [], git: flags.git ?? true, + packageManager: (result.packageManager as PackageManager) ?? "npm", }; - - config.projectName = - flags.projectName ?? - (await input({ - message: chalk.blue.bold("šŸ“ Project name:"), - default: "my-better-t-app", - })); - - console.log(); - - if (flags.database) { - config.database = flags.database; - } else { - config.database = await select({ - message: chalk.blue.bold("šŸ’¾ Select database:"), - choices: [ - { - value: "libsql", - name: chalk.green("libSQL"), - description: chalk.dim( - "✨ (Recommended) - Turso's embedded SQLite database", - ), - }, - { - value: "postgres", - name: chalk.yellow("PostgreSQL"), - description: chalk.dim("🐘 Traditional relational database"), - }, - ], - }); - } - - console.log(); - - config.auth = - flags.auth ?? - (await confirm({ - message: chalk.blue.bold("šŸ” Add authentication with Better-Auth?"), - default: true, - })); - - console.log(); - - if (flags.features) { - config.features = flags.features; - } else { - config.features = await checkbox({ - message: chalk.blue.bold("šŸŽÆ Select additional features:"), - choices: [ - { - value: "docker", - name: chalk.cyan("Docker setup"), - description: chalk.dim("🐳 Containerize your application"), - }, - { - value: "github-actions", - name: chalk.magenta("GitHub Actions"), - description: chalk.dim("⚔ CI/CD workflows"), - }, - { - value: "SEO", - name: chalk.green("Basic SEO setup"), - description: chalk.dim("šŸ” Search engine optimization configuration"), - }, - ], - }); - } - - return config; } async function main() { + const s = spinner(); try { renderTitle(); - logger.info(chalk.bold(" Creating a new Better-T Stack project...\n")); + intro(chalk.bold("Creating a new Better-T Stack project")); program .name("create-better-t-stack") .description("Create a new Better-T Stack project") @@ -161,7 +195,7 @@ async function main() { : await gatherConfig(flagConfig); if (options.yes) { - logger.info(chalk.blue.bold("\nšŸ“¦ Using default configuration:")); + s.start("Using default configuration"); const colorizedConfig = { projectName: chalk.green(config.projectName), database: chalk.yellow(config.database), @@ -195,25 +229,26 @@ async function main() { chalk.dim("└─") + chalk.blue(" Git Init: ") + colorizedConfig.git, ); console.log(); + s.stop("Configuration loaded"); } await createProject(config); - logger.info("\nšŸ“‹ To reproduce this setup, run:"); - logger.success(chalk.cyan(generateReproducibleCommand(config))); - } catch (error) { - if ( - error instanceof Error && - (error.name === "ExitPromptError" || - error.message.includes("User force closed")) - ) { - console.log("\n"); - logger.warn("Operation cancelled"); - process.exit(0); - } + console.log(); + console.log( + chalk.dim("šŸ”„ You can reproduce this setup with the following command:"), + ); + console.log(); + console.log(chalk.dim(" ") + generateReproducibleCommand(config)); + console.log(); - logger.error("An unexpected error occurred:", error); - process.exit(1); + outro("Project created successfully! šŸŽ‰"); + } catch (error) { + s.stop("Failed"); + if (error instanceof Error) { + cancel("An unexpected error occurred"); + process.exit(1); + } } } diff --git a/apps/cli/src/types.ts b/apps/cli/src/types.ts index 86e7283..487d311 100644 --- a/apps/cli/src/types.ts +++ b/apps/cli/src/types.ts @@ -8,7 +8,7 @@ export type ProjectConfig = { git: boolean; database: ProjectDatabase; auth: boolean; - packageManager?: PackageManager; + packageManager: PackageManager; features: ProjectFeature[]; }; diff --git a/bun.lock b/bun.lock index 00ca9d0..598940f 100644 --- a/bun.lock +++ b/bun.lock @@ -14,12 +14,12 @@ }, "apps/cli": { "name": "create-better-t-stack", - "version": "0.3.3", + "version": "0.3.4", "bin": { "create-better-t-stack": "dist/index.js" }, "dependencies": { - "@inquirer/prompts": "^7.3.1", + "@clack/prompts": "^0.10.0", "chalk": "^5.3.0", "commander": "^13.1.0", "execa": "^8.0.1", @@ -118,6 +118,10 @@ "@changesets/write": ["@changesets/write@0.3.2", "", { "dependencies": { "@changesets/types": "^6.0.0", "fs-extra": "^7.0.1", "human-id": "^1.0.2", "prettier": "^2.7.1" } }, "sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw=="], + "@clack/core": ["@clack/core@0.4.1", "", { "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-Pxhij4UXg8KSr7rPek6Zowm+5M22rbd2g1nfojHJkxp5YkFqiZ2+YLEM/XGVIzvGOcM0nqjIFxrpDwWRZYWYjA=="], + + "@clack/prompts": ["@clack/prompts@0.10.0", "", { "dependencies": { "@clack/core": "0.4.1", "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-H3rCl6CwW1NdQt9rE3n373t7o5cthPv7yUoxF2ytZvyvlJv89C5RYMJu83Hed8ODgys5vpBU0GKxIRG83jd8NQ=="], + "@emnapi/runtime": ["@emnapi/runtime@1.3.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw=="], "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.24.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA=="], @@ -232,34 +236,6 @@ "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="], - "@inquirer/checkbox": ["@inquirer/checkbox@4.1.1", "", { "dependencies": { "@inquirer/core": "^10.1.6", "@inquirer/figures": "^1.0.10", "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-os5kFd/52gZTl/W6xqMfhaKVJHQM8V/U1P8jcSaQJ/C4Qhdrf2jEXdA/HaxfQs9iiUA/0yzYhk5d3oRHTxGDDQ=="], - - "@inquirer/confirm": ["@inquirer/confirm@5.1.5", "", { "dependencies": { "@inquirer/core": "^10.1.6", "@inquirer/type": "^3.0.4" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-ZB2Cz8KeMINUvoeDi7IrvghaVkYT2RB0Zb31EaLWOE87u276w4wnApv0SH2qWaJ3r0VSUa3BIuz7qAV2ZvsZlg=="], - - "@inquirer/core": ["@inquirer/core@10.1.6", "", { "dependencies": { "@inquirer/figures": "^1.0.10", "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-Bwh/Zk6URrHwZnSSzAZAKH7YgGYi0xICIBDFOqBQoXNNAzBHw/bgXgLmChfp+GyR3PnChcTbiCTZGC6YJNJkMA=="], - - "@inquirer/editor": ["@inquirer/editor@4.2.6", "", { "dependencies": { "@inquirer/core": "^10.1.6", "@inquirer/type": "^3.0.4", "external-editor": "^3.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-l0smvr8g/KAVdXx4I92sFxZiaTG4kFc06cFZw+qqwTirwdUHMFLnouXBB9OafWhpO3cfEkEz2CdPoCmor3059A=="], - - "@inquirer/expand": ["@inquirer/expand@4.0.8", "", { "dependencies": { "@inquirer/core": "^10.1.6", "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-k0ouAC6L+0Yoj/j0ys2bat0fYcyFVtItDB7h+pDFKaDDSFJey/C/YY1rmIOqkmFVZ5rZySeAQuS8zLcKkKRLmg=="], - - "@inquirer/figures": ["@inquirer/figures@1.0.10", "", {}, "sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw=="], - - "@inquirer/input": ["@inquirer/input@4.1.5", "", { "dependencies": { "@inquirer/core": "^10.1.6", "@inquirer/type": "^3.0.4" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-bB6wR5wBCz5zbIVBPnhp94BHv/G4eKbUEjlpCw676pI2chcvzTx1MuwZSCZ/fgNOdqDlAxkhQ4wagL8BI1D3Zg=="], - - "@inquirer/number": ["@inquirer/number@3.0.8", "", { "dependencies": { "@inquirer/core": "^10.1.6", "@inquirer/type": "^3.0.4" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-CTKs+dT1gw8dILVWATn8Ugik1OHLkkfY82J+Musb57KpmF6EKyskv8zmMiEJPzOnLTZLo05X/QdMd8VH9oulXw=="], - - "@inquirer/password": ["@inquirer/password@4.0.8", "", { "dependencies": { "@inquirer/core": "^10.1.6", "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-MgA+Z7o3K1df2lGY649fyOBowHGfrKRz64dx3+b6c1w+h2W7AwBoOkHhhF/vfhbs5S4vsKNCuDzS3s9r5DpK1g=="], - - "@inquirer/prompts": ["@inquirer/prompts@7.3.1", "", { "dependencies": { "@inquirer/checkbox": "^4.1.1", "@inquirer/confirm": "^5.1.5", "@inquirer/editor": "^4.2.6", "@inquirer/expand": "^4.0.8", "@inquirer/input": "^4.1.5", "@inquirer/number": "^3.0.8", "@inquirer/password": "^4.0.8", "@inquirer/rawlist": "^4.0.8", "@inquirer/search": "^3.0.8", "@inquirer/select": "^4.0.8" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-r1CiKuDV86BDpvj9DRFR+V+nIjsVBOsa2++dqdPqLYAef8kgHYvmQ8ySdP/ZeAIOWa27YGJZRkENdP3dK0H3gg=="], - - "@inquirer/rawlist": ["@inquirer/rawlist@4.0.8", "", { "dependencies": { "@inquirer/core": "^10.1.6", "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-hl7rvYW7Xl4un8uohQRUgO6uc2hpn7PKqfcGkCOWC0AA4waBxAv6MpGOFCEDrUaBCP+pXPVqp4LmnpWmn1E1+g=="], - - "@inquirer/search": ["@inquirer/search@3.0.8", "", { "dependencies": { "@inquirer/core": "^10.1.6", "@inquirer/figures": "^1.0.10", "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-ihSE9D3xQAupNg/aGDZaukqoUSXG2KfstWosVmFCG7jbMQPaj2ivxWtsB+CnYY/T4D6LX1GHKixwJLunNCffww=="], - - "@inquirer/select": ["@inquirer/select@4.0.8", "", { "dependencies": { "@inquirer/core": "^10.1.6", "@inquirer/figures": "^1.0.10", "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-Io2prxFyN2jOCcu4qJbVoilo19caiD3kqkD3WR0q3yDA5HUCo83v4LrRtg55ZwniYACW64z36eV7gyVbOfORjA=="], - - "@inquirer/type": ["@inquirer/type@3.0.4", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA=="], - "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], "@jest/schemas": ["@jest/schemas@29.6.3", "", { "dependencies": { "@sinclair/typebox": "^0.27.8" } }, "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA=="], @@ -548,7 +524,7 @@ "ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="], - "ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="], + "ansi-escapes": ["ansi-escapes@7.0.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw=="], "ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], @@ -656,8 +632,6 @@ "cli-truncate": ["cli-truncate@4.0.0", "", { "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^7.0.0" } }, "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA=="], - "cli-width": ["cli-width@4.1.0", "", {}, "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ=="], - "client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="], "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], @@ -1268,8 +1242,6 @@ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - "mute-stream": ["mute-stream@2.0.0", "", {}, "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA=="], - "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], "nanoid": ["nanoid@3.3.8", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="], @@ -1506,6 +1478,8 @@ "simple-swizzle": ["simple-swizzle@0.2.2", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="], + "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], + "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], "slice-ansi": ["slice-ansi@5.0.0", "", { "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" } }, "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ=="], @@ -1726,8 +1700,6 @@ "yocto-queue": ["yocto-queue@1.1.1", "", {}, "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g=="], - "yoctocolors-cjs": ["yoctocolors-cjs@2.1.2", "", {}, "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA=="], - "zod": ["zod@3.24.2", "", {}, "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ=="], "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], @@ -1746,8 +1718,6 @@ "@changesets/write/fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], - "@inquirer/core/wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], - "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], @@ -1778,8 +1748,6 @@ "@vitest/runner/p-limit": ["p-limit@5.0.0", "", { "dependencies": { "yocto-queue": "^1.0.0" } }, "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ=="], - "ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], - "cli-truncate/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], "enquirer/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -1816,8 +1784,6 @@ "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - "log-update/ansi-escapes": ["ansi-escapes@7.0.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw=="], - "log-update/cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="], "log-update/slice-ansi": ["slice-ansi@7.1.0", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg=="], @@ -1904,10 +1870,6 @@ "@changesets/write/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], - "@inquirer/core/wrap-ansi/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "@inquirer/core/wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], @@ -2008,12 +1970,6 @@ "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "@inquirer/core/wrap-ansi/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "@inquirer/core/wrap-ansi/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], - - "@inquirer/core/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "@manypkg/find-root/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], "log-update/cli-cursor/restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="],