4
4
const fs = require ( 'fs' )
5
5
const path = require ( 'path' )
6
6
const argv = require ( 'minimist' ) ( process . argv . slice ( 2 ) )
7
+ // eslint-disable-next-line node/no-restricted-require
7
8
const { prompt } = require ( 'enquirer' )
8
9
const {
9
10
yellow,
10
11
green,
11
12
cyan,
13
+ blue,
12
14
magenta,
13
15
lightRed,
14
- red,
15
- stripColors
16
+ red
16
17
} = require ( 'kolorist' )
17
18
18
19
const cwd = process . cwd ( )
19
20
20
- const TEMPLATES = [
21
- yellow ( 'vanilla' ) ,
22
- yellow ( 'vanilla-ts' ) ,
23
- green ( 'vue' ) ,
24
- green ( 'vue-ts' ) ,
25
- cyan ( 'react' ) ,
26
- cyan ( 'react-ts' ) ,
27
- magenta ( 'preact' ) ,
28
- magenta ( 'preact-ts' ) ,
29
- lightRed ( 'lit-element' ) ,
30
- lightRed ( 'lit-element-ts' ) ,
31
- red ( 'svelte' ) ,
32
- red ( 'svelte-ts' )
21
+ const FRAMEWORKS = [
22
+ {
23
+ name : 'vanilla' ,
24
+ color : yellow ,
25
+ variants : [
26
+ {
27
+ name : 'vanilla' ,
28
+ display : 'JavaScript' ,
29
+ color : yellow
30
+ } ,
31
+ {
32
+ name : 'vanilla-ts' ,
33
+ display : 'TypeScript' ,
34
+ color : blue
35
+ }
36
+ ]
37
+ } ,
38
+ {
39
+ name : 'vue' ,
40
+ color : green ,
41
+ variants : [
42
+ {
43
+ name : 'vue' ,
44
+ display : 'JavaScript' ,
45
+ color : yellow
46
+ } ,
47
+ {
48
+ name : 'vue-ts' ,
49
+ display : 'TypeScript' ,
50
+ color : blue
51
+ }
52
+ ]
53
+ } ,
54
+ {
55
+ name : 'react' ,
56
+ color : cyan ,
57
+ variants : [
58
+ {
59
+ name : 'react' ,
60
+ display : 'JavaScript' ,
61
+ color : yellow
62
+ } ,
63
+ {
64
+ name : 'react-ts' ,
65
+ display : 'TypeScript' ,
66
+ color : blue
67
+ }
68
+ ]
69
+ } ,
70
+ {
71
+ name : 'preact' ,
72
+ color : magenta ,
73
+ variants : [
74
+ {
75
+ name : 'preact' ,
76
+ display : 'JavaScript' ,
77
+ color : yellow
78
+ } ,
79
+ {
80
+ name : 'preact-ts' ,
81
+ display : 'TypeScript' ,
82
+ color : blue
83
+ }
84
+ ]
85
+ } ,
86
+ {
87
+ name : 'lit-element' ,
88
+ color : lightRed ,
89
+ variants : [
90
+ {
91
+ name : 'lit-element' ,
92
+ display : 'JavaScript' ,
93
+ color : yellow
94
+ } ,
95
+ {
96
+ name : 'lit-element-ts' ,
97
+ display : 'TypeScript' ,
98
+ color : blue
99
+ }
100
+ ]
101
+ } ,
102
+ {
103
+ name : 'svelte' ,
104
+ color : red ,
105
+ variants : [
106
+ {
107
+ name : 'svelte' ,
108
+ display : 'JavaScript' ,
109
+ color : yellow
110
+ } ,
111
+ {
112
+ name : 'svelte-ts' ,
113
+ display : 'TypeScript' ,
114
+ color : blue
115
+ }
116
+ ]
117
+ }
33
118
]
34
119
120
+ const TEMPLATES = FRAMEWORKS . map (
121
+ ( f ) => ( f . variants && f . variants . map ( ( v ) => v . name ) ) || [ f . name ]
122
+ ) . reduce ( ( a , b ) => a . concat ( b ) , [ ] )
123
+
35
124
const renameFiles = {
36
125
_gitignore : '.gitignore'
37
126
}
@@ -52,7 +141,6 @@ async function init() {
52
141
}
53
142
const packageName = await getValidPackageName ( targetDir )
54
143
const root = path . join ( cwd , targetDir )
55
- console . log ( `\nScaffolding project in ${ root } ...` )
56
144
57
145
if ( ! fs . existsSync ( root ) ) {
58
146
fs . mkdirSync ( root , { recursive : true } )
@@ -80,29 +168,63 @@ async function init() {
80
168
81
169
// determine template
82
170
let template = argv . t || argv . template
83
- let message = 'Select a template :'
171
+ let message = 'Select a framework :'
84
172
let isValidTemplate = false
85
173
86
174
// --template expects a value
87
175
if ( typeof template === 'string' ) {
88
- const availableTemplates = TEMPLATES . map ( stripColors )
89
- isValidTemplate = availableTemplates . includes ( template )
176
+ isValidTemplate = TEMPLATES . includes ( template )
90
177
message = `${ template } isn't a valid template. Please choose from below:`
91
178
}
92
179
93
180
if ( ! template || ! isValidTemplate ) {
94
181
/**
95
- * @type {{ t : string } }
182
+ * @type {{ framework : string } }
96
183
*/
97
- const { t } = await prompt ( {
184
+ const { framework } = await prompt ( {
98
185
type : 'select' ,
99
- name : 't ' ,
186
+ name : 'framework ' ,
100
187
message,
101
- choices : TEMPLATES
188
+ format ( name ) {
189
+ const framework = FRAMEWORKS . find ( ( v ) => v . name === name )
190
+ return framework
191
+ ? framework . color ( framework . display || framework . name )
192
+ : name
193
+ } ,
194
+ choices : FRAMEWORKS . map ( ( f ) => ( {
195
+ name : f . name ,
196
+ value : f . name ,
197
+ message : f . color ( f . display || f . name )
198
+ } ) )
102
199
} )
103
- template = stripColors ( t )
200
+ const frameworkInfo = FRAMEWORKS . find ( ( f ) => f . name === framework )
201
+
202
+ if ( frameworkInfo . variants ) {
203
+ /**
204
+ * @type {{ name: string } }
205
+ */
206
+ const { name } = await prompt ( {
207
+ type : 'select' ,
208
+ name : 'name' ,
209
+ format ( name ) {
210
+ const variant = frameworkInfo . variants . find ( ( v ) => v . name === name )
211
+ return variant ? variant . color ( variant . display || variant . name ) : name
212
+ } ,
213
+ message : 'Select a variant:' ,
214
+ choices : frameworkInfo . variants . map ( ( v ) => ( {
215
+ name : v . name ,
216
+ value : v . name ,
217
+ message : v . color ( v . display || v . name )
218
+ } ) )
219
+ } )
220
+ template = name
221
+ } else {
222
+ template = frameworkInfo . name
223
+ }
104
224
}
105
225
226
+ console . log ( `\nScaffolding project in ${ root } ...` )
227
+
106
228
const templateDir = path . join ( __dirname , `template-${ template } ` )
107
229
108
230
const write = ( file , content ) => {
0 commit comments