@@ -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 - z 0 - 9 - * ~ ] [ a -z 0 -9 -* ._ ~ ] * \/ ) ? [ a - z 0 - 9 - ~ ] [ a - z 0 - 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 - z 0 - 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+
155176function copyDir ( srcDir , destDir ) {
156177 fs . mkdirSync ( destDir , { recursive : true } )
157178 for ( const file of fs . readdirSync ( srcDir ) ) {
0 commit comments