Skip to content

Commit 9fa282e

Browse files
authored
feat(create-app): improved package name validation (#2772)
1 parent e2b3628 commit 9fa282e

File tree

1 file changed

+33
-12
lines changed

1 file changed

+33
-12
lines changed

packages/create-app/index.js

+33-12
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,17 @@ async function init() {
3939
let targetDir = argv._[0]
4040
if (!targetDir) {
4141
/**
42-
* @type {{ name: string }}
42+
* @type {{ projectName: string }}
4343
*/
44-
const { name } = await prompt({
44+
const { projectName } = await prompt({
4545
type: 'input',
46-
name: 'name',
46+
name: 'projectName',
4747
message: `Project name:`,
4848
initial: 'vite-project'
4949
})
50-
targetDir = name
50+
targetDir = projectName
5151
}
52-
52+
const packageName = await getValidPackageName(targetDir)
5353
const root = path.join(cwd, targetDir)
5454
console.log(`\nScaffolding project in ${root}...`)
5555

@@ -122,13 +122,7 @@ async function init() {
122122

123123
const pkg = require(path.join(templateDir, `package.json`))
124124

125-
pkg.name = path
126-
.basename(root)
127-
// #2360 ensure packgae.json name is valid
128-
.trim()
129-
.replace(/\s+/g, '-')
130-
.replace(/^[._]/, '')
131-
.replace(/[~)('!*]+/g, '-')
125+
pkg.name = packageName
132126

133127
write('package.json', JSON.stringify(pkg, null, 2))
134128

@@ -152,6 +146,33 @@ function copy(src, dest) {
152146
}
153147
}
154148

149+
async function getValidPackageName(projectName) {
150+
const packageNameRegExp = /^(?:@[a-z0-9-*~][a-z0-9-*._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/
151+
if (packageNameRegExp.test(projectName)) {
152+
return projectName
153+
} else {
154+
const suggestedPackageName = projectName
155+
.trim()
156+
.toLowerCase()
157+
.replace(/\s+/g, '-')
158+
.replace(/^[._]/, '')
159+
.replace(/[^a-z0-9-~]+/g, '-')
160+
161+
/**
162+
* @type {{ inputPackageName: string }}
163+
*/
164+
const { inputPackageName } = await prompt({
165+
type: 'input',
166+
name: 'inputPackageName',
167+
message: `Package name:`,
168+
initial: suggestedPackageName,
169+
validate: (input) =>
170+
packageNameRegExp.test(input) ? true : 'Invalid package.json name'
171+
})
172+
return inputPackageName
173+
}
174+
}
175+
155176
function copyDir(srcDir, destDir) {
156177
fs.mkdirSync(destDir, { recursive: true })
157178
for (const file of fs.readdirSync(srcDir)) {

0 commit comments

Comments
 (0)