diff --git a/packages/create-vite/README.md b/packages/create-vite/README.md index e22c268ab99f9c..7c753d212bd302 100644 --- a/packages/create-vite/README.md +++ b/packages/create-vite/README.md @@ -56,6 +56,8 @@ Currently supported template presets include: - `svelte` - `svelte-ts` +You can use `.` for the project name to scaffold in the current directory. + ## Community Templates create-vite is a tool to quickly start a project from a basic template for popular frameworks. Check out Awesome Vite for [community maintained templates](https://github.com/vitejs/awesome-vite#templates) that include other tools or target different frameworks. You can use a tool like [degit](https://github.com/Rich-Harris/degit) to scaffold your project with one of the templates. diff --git a/packages/create-vite/__tests__/cli.spec.ts b/packages/create-vite/__tests__/cli.spec.ts index d9b6bafdefa306..f9172aeece98d2 100644 --- a/packages/create-vite/__tests__/cli.spec.ts +++ b/packages/create-vite/__tests__/cli.spec.ts @@ -40,6 +40,12 @@ test('prompts for the project name if none supplied', () => { expect(stdout).toContain('Project name:') }) +test('prompts for the framework if none supplied when target dir is current directory', () => { + mkdirpSync(genPath) + const { stdout } = run(['.'], { cwd: genPath }) + expect(stdout).toContain('Select a framework:') +}) + test('prompts for the framework if none supplied', () => { const { stdout } = run([projectName]) expect(stdout).toContain('Select a framework:') @@ -65,7 +71,7 @@ test('asks to overwrite non-empty target directory', () => { test('asks to overwrite non-empty current directory', () => { createNonEmptyDir() - const { stdout } = run(['.'], { cwd: genPath, input: 'test-app\n' }) + const { stdout } = run(['.'], { cwd: genPath }) expect(stdout).toContain(`Current directory is not empty.`) }) diff --git a/packages/create-vite/index.js b/packages/create-vite/index.js index 93ddb3c3f027a1..ec084e8327d603 100755 --- a/packages/create-vite/index.js +++ b/packages/create-vite/index.js @@ -130,12 +130,12 @@ const renameFiles = { } async function init() { - let targetDir = argv._[0] + let targetDir = formatTargetDir(argv._[0]) let template = argv.template || argv.t - const defaultProjectName = !targetDir - ? 'vite-project' - : targetDir.trim().replace(/\/+$/g, '') + const defaultTargetDir = 'vite-project' + const getProjectName = () => + targetDir === '.' ? path.basename(path.resolve()) : targetDir let result = {} @@ -146,10 +146,10 @@ async function init() { type: targetDir ? null : 'text', name: 'projectName', message: reset('Project name:'), - initial: defaultProjectName, - onState: (state) => - (targetDir = - state.value.trim().replace(/\/+$/g, '') || defaultProjectName) + initial: defaultTargetDir, + onState: (state) => { + targetDir = formatTargetDir(state.value) || defaultTargetDir + } }, { type: () => @@ -171,10 +171,10 @@ async function init() { name: 'overwriteChecker' }, { - type: () => (isValidPackageName(targetDir) ? null : 'text'), + type: () => (isValidPackageName(getProjectName()) ? null : 'text'), name: 'packageName', message: reset('Package name:'), - initial: () => toValidPackageName(targetDir), + initial: () => toValidPackageName(getProjectName()), validate: (dir) => isValidPackageName(dir) || 'Invalid package.json name' }, @@ -265,7 +265,7 @@ async function init() { fs.readFileSync(path.join(templateDir, `package.json`), 'utf-8') ) - pkg.name = packageName || targetDir + pkg.name = packageName || getProjectName() write('package.json', JSON.stringify(pkg, null, 2)) @@ -289,6 +289,13 @@ async function init() { console.log() } +/** + * @param {string | undefined} targetDir + */ +function formatTargetDir(targetDir) { + return targetDir?.trim().replace(/\/+$/g, '') +} + function copy(src, dest) { const stat = fs.statSync(src) if (stat.isDirectory()) {