From 220d04f8b0bc4cc343286dc057c56b9e8bd6e846 Mon Sep 17 00:00:00 2001 From: Shinya Fujino Date: Sat, 1 Nov 2025 01:06:56 +0900 Subject: [PATCH 1/3] feat: prevent overwriting non-empty directories --- packages/cta-cli/src/options.ts | 12 +++++++++++- packages/cta-cli/src/ui-prompts.ts | 1 - 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/cta-cli/src/options.ts b/packages/cta-cli/src/options.ts index b5383ea0..4a1b3630 100644 --- a/packages/cta-cli/src/options.ts +++ b/packages/cta-cli/src/options.ts @@ -1,4 +1,5 @@ -import { intro } from '@clack/prompts' +import fs from 'node:fs' +import { cancel, intro } from '@clack/prompts' import { finalizeAddOns, @@ -42,6 +43,15 @@ export async function promptForCreateOptions( options.framework = getFrameworkById(cliOptions.framework || 'react-cra')! options.projectName = cliOptions.projectName || (await getProjectName()) + if ( + fs.existsSync(options.projectName) && + fs.readdirSync(options.projectName).length > 0 + ) { + cancel( + `The directory ${options.projectName} is not empty. Please choose a different project name.`, + ) + process.exit(1) + } // Router type selection if (forcedMode) { diff --git a/packages/cta-cli/src/ui-prompts.ts b/packages/cta-cli/src/ui-prompts.ts index 35d0305d..e48bf4f7 100644 --- a/packages/cta-cli/src/ui-prompts.ts +++ b/packages/cta-cli/src/ui-prompts.ts @@ -16,7 +16,6 @@ import { import type { AddOn, PackageManager } from '@tanstack/cta-engine' import type { Framework } from '@tanstack/cta-engine/dist/types/types.js' -import { InitialData } from '../../cta-ui/src/types' export async function getProjectName(): Promise { const value = await text({ From df7c0869119eff0fed7208b06ca506af7cfbf531 Mon Sep 17 00:00:00 2001 From: Shinya Fujino Date: Thu, 6 Nov 2025 21:47:53 +0900 Subject: [PATCH 2/3] Change to confirm before exiting --- packages/cta-cli/src/options.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/cta-cli/src/options.ts b/packages/cta-cli/src/options.ts index 4a1b3630..89d68b32 100644 --- a/packages/cta-cli/src/options.ts +++ b/packages/cta-cli/src/options.ts @@ -1,5 +1,5 @@ import fs from 'node:fs' -import { cancel, intro } from '@clack/prompts' +import { cancel, confirm, intro, isCancel } from '@clack/prompts' import { finalizeAddOns, @@ -47,10 +47,15 @@ export async function promptForCreateOptions( fs.existsSync(options.projectName) && fs.readdirSync(options.projectName).length > 0 ) { - cancel( - `The directory ${options.projectName} is not empty. Please choose a different project name.`, - ) - process.exit(1) + const shouldContinue = await confirm({ + message: `Target directory ${options.projectName} is not empty. Do you want to continue?`, + initialValue: true, + }) + + if (isCancel(shouldContinue) || !shouldContinue) { + cancel('Operation cancelled.') + process.exit(0) + } } // Router type selection From 9afcd197541603f0b798c86c98f791d066d6ae58 Mon Sep 17 00:00:00 2001 From: Shinya Fujino Date: Fri, 7 Nov 2025 01:39:24 +0900 Subject: [PATCH 3/3] Add force option --- packages/cta-cli/src/cli.ts | 5 +++++ packages/cta-cli/src/options.ts | 1 + packages/cta-cli/src/types.ts | 1 + 3 files changed, 7 insertions(+) diff --git a/packages/cta-cli/src/cli.ts b/packages/cta-cli/src/cli.ts index f0b38a53..39a91346 100644 --- a/packages/cta-cli/src/cli.ts +++ b/packages/cta-cli/src/cli.ts @@ -373,6 +373,11 @@ Remove your node_modules directory and package lock file and re-install.`, '--add-on-config ', 'JSON string with add-on configuration options', ) + .option( + '-f, --force', + 'force project creation even if the target directory is not empty', + false, + ) program.action(async (projectName: string, options: CliOptions) => { if (options.listAddOns) { diff --git a/packages/cta-cli/src/options.ts b/packages/cta-cli/src/options.ts index 89d68b32..04499e6f 100644 --- a/packages/cta-cli/src/options.ts +++ b/packages/cta-cli/src/options.ts @@ -44,6 +44,7 @@ export async function promptForCreateOptions( options.projectName = cliOptions.projectName || (await getProjectName()) if ( + !cliOptions.force && fs.existsSync(options.projectName) && fs.readdirSync(options.projectName).length > 0 ) { diff --git a/packages/cta-cli/src/types.ts b/packages/cta-cli/src/types.ts index 6117355b..461236b3 100644 --- a/packages/cta-cli/src/types.ts +++ b/packages/cta-cli/src/types.ts @@ -21,4 +21,5 @@ export interface CliOptions { interactive?: boolean ui?: boolean addOnConfig?: string + force?: boolean }