@@ -14,35 +14,47 @@ import {
14
14
} from './package-manager.js'
15
15
import { CODE_ROUTER , DEFAULT_FRAMEWORK , FILE_ROUTER } from './constants.js'
16
16
import { finalizeAddOns , getAllAddOns } from './add-ons.js'
17
- import type { Variable } from './add-ons.js'
17
+ import type { AddOn , Variable } from './add-ons.js'
18
18
19
19
import type { CliOptions , Options } from './types.js'
20
20
21
21
// If all CLI options are provided, use them directly
22
- export function normalizeOptions (
22
+ export async function normalizeOptions (
23
23
cliOptions : CliOptions ,
24
- ) : Required < Options > | undefined {
24
+ ) : Promise < Required < Options > | undefined > {
25
25
if ( cliOptions . projectName ) {
26
26
const typescript =
27
27
cliOptions . template === 'typescript' ||
28
28
cliOptions . template === 'file-router' ||
29
29
cliOptions . framework === 'solid'
30
30
31
- const tailwind =
31
+ let tailwind =
32
32
cliOptions . tailwind === undefined
33
33
? cliOptions . framework === 'solid'
34
34
: cliOptions . tailwind
35
35
36
+ let addOns = false
37
+ let chosenAddOns : Array < AddOn > = [ ]
38
+ if ( Array . isArray ( cliOptions . addOns ) ) {
39
+ addOns = true
40
+ chosenAddOns = await finalizeAddOns (
41
+ cliOptions . framework || DEFAULT_FRAMEWORK ,
42
+ cliOptions . template === 'file-router' ? FILE_ROUTER : CODE_ROUTER ,
43
+ cliOptions . addOns ,
44
+ )
45
+ tailwind = true
46
+ }
47
+
36
48
return {
37
49
framework : cliOptions . framework || 'react' ,
38
50
projectName : cliOptions . projectName ,
39
51
typescript,
40
- tailwind : ! ! tailwind ,
52
+ tailwind,
41
53
packageManager : cliOptions . packageManager || DEFAULT_PACKAGE_MANAGER ,
42
54
mode : cliOptions . template === 'file-router' ? FILE_ROUTER : CODE_ROUTER ,
43
55
git : ! ! cliOptions . git ,
44
- addOns : ! ! cliOptions . addOns ,
45
- chosenAddOns : [ ] ,
56
+ addOns,
57
+ chosenAddOns,
46
58
variableValues : { } ,
47
59
}
48
60
}
@@ -206,58 +218,66 @@ export async function promptForOptions(
206
218
options . packageManager = cliOptions . packageManager
207
219
}
208
220
209
- // Select any add-ons
210
- const allAddOns = await getAllAddOns ( options . framework , options . mode )
211
- const addOns = allAddOns . filter ( ( addOn ) => addOn . type === 'add-on' )
212
- let selectedAddOns : Array < string > = [ ]
213
- if ( options . typescript && cliOptions . addOns && addOns . length > 0 ) {
214
- const value = await multiselect ( {
215
- message : 'What add-ons would you like for your project:' ,
216
- options : addOns . map ( ( addOn ) => ( {
217
- value : addOn . id ,
218
- label : addOn . name ,
219
- hint : addOn . description ,
220
- } ) ) ,
221
- required : false ,
222
- } )
221
+ options . chosenAddOns = [ ]
222
+ if ( Array . isArray ( cliOptions . addOns ) ) {
223
+ options . chosenAddOns = await finalizeAddOns (
224
+ options . framework ,
225
+ options . mode ,
226
+ cliOptions . addOns ,
227
+ )
228
+ options . tailwind = true
229
+ } else if ( cliOptions . addOns ) {
230
+ // Select any add-ons
231
+ const allAddOns = await getAllAddOns ( options . framework , options . mode )
232
+ const addOns = allAddOns . filter ( ( addOn ) => addOn . type === 'add-on' )
233
+ let selectedAddOns : Array < string > = [ ]
234
+ if ( options . typescript && addOns . length > 0 ) {
235
+ const value = await multiselect ( {
236
+ message : 'What add-ons would you like for your project:' ,
237
+ options : addOns . map ( ( addOn ) => ( {
238
+ value : addOn . id ,
239
+ label : addOn . name ,
240
+ hint : addOn . description ,
241
+ } ) ) ,
242
+ required : false ,
243
+ } )
223
244
224
- if ( isCancel ( value ) ) {
225
- cancel ( 'Operation cancelled.' )
226
- process . exit ( 0 )
245
+ if ( isCancel ( value ) ) {
246
+ cancel ( 'Operation cancelled.' )
247
+ process . exit ( 0 )
248
+ }
249
+ selectedAddOns = value
227
250
}
228
- selectedAddOns = value
229
- }
230
251
231
- // Select any examples
232
- const examples = allAddOns . filter ( ( addOn ) => addOn . type === 'example' )
233
- let selectedExamples : Array < string > = [ ]
234
- if ( options . typescript && cliOptions . addOns && examples . length > 0 ) {
235
- const value = await multiselect ( {
236
- message : 'Would you like any examples?' ,
237
- options : examples . map ( ( addOn ) => ( {
238
- value : addOn . id ,
239
- label : addOn . name ,
240
- hint : addOn . description ,
241
- } ) ) ,
242
- required : false ,
243
- } )
252
+ // Select any examples
253
+ const examples = allAddOns . filter ( ( addOn ) => addOn . type === 'example' )
254
+ let selectedExamples : Array < string > = [ ]
255
+ if ( options . typescript && examples . length > 0 ) {
256
+ const value = await multiselect ( {
257
+ message : 'Would you like any examples?' ,
258
+ options : examples . map ( ( addOn ) => ( {
259
+ value : addOn . id ,
260
+ label : addOn . name ,
261
+ hint : addOn . description ,
262
+ } ) ) ,
263
+ required : false ,
264
+ } )
244
265
245
- if ( isCancel ( value ) ) {
246
- cancel ( 'Operation cancelled.' )
247
- process . exit ( 0 )
266
+ if ( isCancel ( value ) ) {
267
+ cancel ( 'Operation cancelled.' )
268
+ process . exit ( 0 )
269
+ }
270
+ selectedExamples = value
248
271
}
249
- selectedExamples = value
250
- }
251
272
252
- if ( selectedAddOns . length > 0 || selectedExamples . length > 0 ) {
253
- options . chosenAddOns = await finalizeAddOns (
254
- options . framework ,
255
- options . mode ,
256
- [ ...selectedAddOns , ...selectedExamples ] ,
257
- )
258
- options . tailwind = true
259
- } else {
260
- options . chosenAddOns = [ ]
273
+ if ( selectedAddOns . length > 0 || selectedExamples . length > 0 ) {
274
+ options . chosenAddOns = await finalizeAddOns (
275
+ options . framework ,
276
+ options . mode ,
277
+ [ ...selectedAddOns , ...selectedExamples ] ,
278
+ )
279
+ options . tailwind = true
280
+ }
261
281
}
262
282
263
283
// Collect variables
0 commit comments