Skip to content

Commit 3087532

Browse files
jherrmorinokami
andauthored
fix: prompt about overwriting directories (#289)
* feat: prevent overwriting non-empty directories * Change to confirm before exiting * Add force option * sort imports * fix: making sure we don't overwrite directories --------- Co-authored-by: Shinya Fujino <shf0811@gmail.com>
1 parent 2eb95ed commit 3087532

File tree

5 files changed

+42
-3
lines changed

5 files changed

+42
-3
lines changed

.changeset/cold-rings-show.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
'@tanstack/cta-cli': minor
3+
'create-start-app': minor
4+
'create-tanstack': minor
5+
'create-tanstack-app': minor
6+
'create-tsrouter-app': minor
7+
'@tanstack/create-start': minor
8+
'@tanstack/cta-framework-react-cra': minor
9+
'@tanstack/cta-framework-solid': minor
10+
'@tanstack/cta-engine': minor
11+
'@tanstack/cta-ui': minor
12+
'@tanstack/cta-ui-base': minor
13+
---
14+
15+
no will prompt about overriding a directory that has contents

packages/cta-cli/src/cli.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,11 @@ Remove your node_modules directory and package lock file and re-install.`,
388388
'--add-on-config <config>',
389389
'JSON string with add-on configuration options',
390390
)
391+
.option(
392+
'-f, --force',
393+
'force project creation even if the target directory is not empty',
394+
false,
395+
)
391396

392397
program.action(async (projectName: string, options: CliOptions) => {
393398
if (options.listAddOns) {

packages/cta-cli/src/options.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { intro } from '@clack/prompts'
1+
import fs from 'node:fs'
2+
import { cancel, confirm, intro, isCancel } from '@clack/prompts'
23

34
import {
45
finalizeAddOns,
@@ -12,8 +13,8 @@ import {
1213
getProjectName,
1314
promptForAddOnOptions,
1415
selectAddOns,
15-
selectGit,
1616
selectDeployment,
17+
selectGit,
1718
selectPackageManager,
1819
selectRouterType,
1920
selectTailwind,
@@ -46,6 +47,7 @@ export async function promptForCreateOptions(
4647

4748
options.framework = getFrameworkById(cliOptions.framework || 'react-cra')!
4849

50+
// Validate project name
4951
if (cliOptions.projectName) {
5052
// Handle "." as project name - use sanitized current directory name
5153
if (cliOptions.projectName === '.') {
@@ -62,6 +64,23 @@ export async function promptForCreateOptions(
6264
options.projectName = await getProjectName()
6365
}
6466

67+
// Check if target directory is empty
68+
if (
69+
!cliOptions.force &&
70+
fs.existsSync(options.projectName) &&
71+
fs.readdirSync(options.projectName).length > 0
72+
) {
73+
const shouldContinue = await confirm({
74+
message: `Target directory ${options.projectName} is not empty. Do you want to continue?`,
75+
initialValue: true,
76+
})
77+
78+
if (isCancel(shouldContinue) || !shouldContinue) {
79+
cancel('Operation cancelled.')
80+
process.exit(0)
81+
}
82+
}
83+
6584
// Router type selection
6685
if (forcedMode) {
6786
options.mode = forcedMode

packages/cta-cli/src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,5 @@ export interface CliOptions {
2323
devWatch?: string
2424
install?: boolean
2525
addOnConfig?: string
26+
force?: boolean
2627
}

packages/cta-cli/src/ui-prompts.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import { validateProjectName } from './utils.js'
1818
import type { AddOn, PackageManager } from '@tanstack/cta-engine'
1919

2020
import type { Framework } from '@tanstack/cta-engine/dist/types/types.js'
21-
import { InitialData } from '../../cta-ui/src/types'
2221

2322
export async function getProjectName(): Promise<string> {
2423
const value = await text({

0 commit comments

Comments
 (0)