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 b5383ea0..04499e6f 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, confirm, intro, isCancel } from '@clack/prompts' import { finalizeAddOns, @@ -42,6 +43,21 @@ export async function promptForCreateOptions( options.framework = getFrameworkById(cliOptions.framework || 'react-cra')! options.projectName = cliOptions.projectName || (await getProjectName()) + if ( + !cliOptions.force && + fs.existsSync(options.projectName) && + fs.readdirSync(options.projectName).length > 0 + ) { + 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 if (forcedMode) { 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 } 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({