Skip to content

Commit 0bfcc90

Browse files
authored
Add a random name generator for project names. (#561)
Currently we only support fixed default names for new projects. This PR changes Vite+ to auto-generate the package name instead. This is similar to what Astro does. The word list is chosen from here and contains about 2700 words: https://github.com/nkzw-tech/safe-word-list ### Example ![CleanShot 2026-02-09 at 15.01.16@2x.png](https://app.graphite.com/user-attachments/assets/f5f7034d-2e28-4de5-b461-ecaa6f2048f8.png)
1 parent dc057af commit 0bfcc90

5 files changed

Lines changed: 54 additions & 16 deletions

File tree

packages/global/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
"devDependencies": {
3232
"@clack/prompts": "catalog:",
3333
"@napi-rs/cli": "catalog:",
34+
"@nkzw/safe-word-list": "catalog:",
3435
"@oxc-node/core": "catalog:",
3536
"@types/cross-spawn": "catalog:",
3637
"@types/semver": "catalog:",

packages/global/src/new/bin.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import {
3030
import type { ExecutionResult } from './command.js';
3131
import { discoverTemplate, inferParentDir } from './discovery.js';
3232
import { cancelAndExit, checkProjectDirExists, promptPackageNameAndTargetDir } from './prompts.js';
33+
import { getRandomProjectName } from './random-name.js';
3334
import {
3435
executeBuiltinTemplate,
3536
executeMonorepoTemplate,
@@ -344,16 +345,16 @@ Use \`vp new --list\` to list all available templates, or run \`vp new --help\`
344345
if (isBuiltinTemplate && !targetDir) {
345346
if (selectedTemplateName === BuiltinTemplate.monorepo) {
346347
const selected = await promptPackageNameAndTargetDir(
347-
'vite-plus-monorepo',
348+
getRandomProjectName({ fallbackName: 'vite-plus-monorepo' }),
348349
options.interactive,
349350
);
350351
packageName = selected.packageName;
351352
targetDir = selected.targetDir;
352353
} else {
353-
let defaultPackageName = `vite-plus-${selectedTemplateName.split(':')[1]}`;
354-
if (workspaceInfoOptional.monorepoScope) {
355-
defaultPackageName = `${workspaceInfoOptional.monorepoScope}/${defaultPackageName}`;
356-
}
354+
const defaultPackageName = getRandomProjectName({
355+
scope: workspaceInfoOptional.monorepoScope,
356+
fallbackName: `vite-plus-${selectedTemplateName.split(':')[1]}`,
357+
});
357358
const selected = await promptPackageNameAndTargetDir(defaultPackageName, options.interactive);
358359
packageName = selected.packageName;
359360
targetDir = selectedParentDir
@@ -447,10 +448,10 @@ Use \`vp new --list\` to list all available templates, or run \`vp new --help\`
447448
if (templateInfo.type === TemplateType.builtin) {
448449
// prompt for package name if not provided
449450
if (!targetDir) {
450-
let defaultPackageName = `vite-plus-${templateInfo.command.split(':')[1]}`;
451-
if (workspaceInfo.monorepoScope) {
452-
defaultPackageName = `${workspaceInfo.monorepoScope}/${defaultPackageName}`;
453-
}
451+
const defaultPackageName = getRandomProjectName({
452+
scope: workspaceInfo.monorepoScope,
453+
fallbackName: `vite-plus-${templateInfo.command.split(':')[1]}`,
454+
});
454455
const selected = await promptPackageNameAndTargetDir(defaultPackageName, options.interactive);
455456
packageName = selected.packageName;
456457
targetDir = templateInfo.parentDir
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { getRandomWord } from '@nkzw/safe-word-list';
2+
3+
const isTest = process.env.VITE_PLUS_CLI_TEST === '1';
4+
5+
export default function getRandomWords(): ReadonlyArray<string> {
6+
const first = getRandomWord();
7+
let second: string;
8+
do {
9+
second = getRandomWord();
10+
} while (second === first);
11+
return [first, second];
12+
}
13+
14+
export function getRandomProjectName(
15+
options: {
16+
scope?: string;
17+
fallbackName?: string;
18+
} = {},
19+
): string {
20+
const { scope, fallbackName } = options;
21+
const projectName = isTest && fallbackName ? fallbackName : getRandomWords().join('-');
22+
return scope ? `${scope}/${projectName}` : projectName;
23+
}

pnpm-lock.yaml

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pnpm-workspace.yaml

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ catalog:
1212
'@clack/prompts': ^0.11.0
1313
'@napi-rs/cli': ^3.4.1
1414
'@napi-rs/wasm-runtime': ^1.0.0
15+
'@nkzw/safe-word-list': ^3.1.0
1516
'@oxc-node/cli': ^0.0.35
1617
'@oxc-node/core': ^0.0.35
1718
'@oxc-project/runtime': =0.112.0
@@ -124,18 +125,19 @@ ignoreScripts: true
124125
minimumReleaseAge: 1440
125126
minimumReleaseAgeExclude:
126127
- '@napi-rs/*'
127-
- '@oxc-project/*'
128-
- '@rolldown/*'
129-
- '@vitest/*'
130-
- '@vitejs/*'
131-
- '@types/*'
132-
- '@oxlint/*'
128+
- '@nkzw/*'
133129
- '@oxc-minify/*'
134130
- '@oxc-parser/*'
131+
- '@oxc-project/*'
135132
- '@oxc-resolver/*'
136133
- '@oxc-transform/*'
137134
- '@oxfmt/*'
138135
- '@oxlint-tsgolint/*'
136+
- '@oxlint/*'
137+
- '@rolldown/*'
138+
- '@types/*'
139+
- '@vitejs/*'
140+
- '@vitest/*'
139141
- oxc-minify
140142
- oxc-parser
141143
- oxc-transform
@@ -146,10 +148,10 @@ minimumReleaseAgeExclude:
146148
- rolldown-plugin-dts
147149
- rolldown-vite
148150
- tsdown
151+
- unrun
149152
- vite
150153
- vitepress
151154
- vitest
152-
- unrun
153155
overrides:
154156
'@rolldown/pluginutils': 'workspace:@rolldown/pluginutils@*'
155157
rolldown: 'workspace:rolldown@*'

0 commit comments

Comments
 (0)