@@ -39,17 +39,17 @@ async function init() {
39
39
let targetDir = argv . _ [ 0 ]
40
40
if ( ! targetDir ) {
41
41
/**
42
- * @type {{ name : string } }
42
+ * @type {{ projectName : string } }
43
43
*/
44
- const { name } = await prompt ( {
44
+ const { projectName } = await prompt ( {
45
45
type : 'input' ,
46
- name : 'name ' ,
46
+ name : 'projectName ' ,
47
47
message : `Project name:` ,
48
48
initial : 'vite-project'
49
49
} )
50
- targetDir = name
50
+ targetDir = projectName
51
51
}
52
-
52
+ const packageName = await getValidPackageName ( targetDir )
53
53
const root = path . join ( cwd , targetDir )
54
54
console . log ( `\nScaffolding project in ${ root } ...` )
55
55
@@ -122,13 +122,7 @@ async function init() {
122
122
123
123
const pkg = require ( path . join ( templateDir , `package.json` ) )
124
124
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
132
126
133
127
write ( 'package.json' , JSON . stringify ( pkg , null , 2 ) )
134
128
@@ -152,6 +146,33 @@ function copy(src, dest) {
152
146
}
153
147
}
154
148
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
+
155
176
function copyDir ( srcDir , destDir ) {
156
177
fs . mkdirSync ( destDir , { recursive : true } )
157
178
for ( const file of fs . readdirSync ( srcDir ) ) {
0 commit comments