@@ -14,35 +14,47 @@ import {
1414} from './package-manager.js'
1515import { CODE_ROUTER , DEFAULT_FRAMEWORK , FILE_ROUTER } from './constants.js'
1616import { finalizeAddOns , getAllAddOns } from './add-ons.js'
17- import type { Variable } from './add-ons.js'
17+ import type { AddOn , Variable } from './add-ons.js'
1818
1919import type { CliOptions , Options } from './types.js'
2020
2121// If all CLI options are provided, use them directly
22- export function normalizeOptions (
22+ export async function normalizeOptions (
2323 cliOptions : CliOptions ,
24- ) : Required < Options > | undefined {
24+ ) : Promise < Required < Options > | undefined > {
2525 if ( cliOptions . projectName ) {
2626 const typescript =
2727 cliOptions . template === 'typescript' ||
2828 cliOptions . template === 'file-router' ||
2929 cliOptions . framework === 'solid'
3030
31- const tailwind =
31+ let tailwind =
3232 cliOptions . tailwind === undefined
3333 ? cliOptions . framework === 'solid'
3434 : cliOptions . tailwind
3535
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+
3648 return {
3749 framework : cliOptions . framework || 'react' ,
3850 projectName : cliOptions . projectName ,
3951 typescript,
40- tailwind : ! ! tailwind ,
52+ tailwind,
4153 packageManager : cliOptions . packageManager || DEFAULT_PACKAGE_MANAGER ,
4254 mode : cliOptions . template === 'file-router' ? FILE_ROUTER : CODE_ROUTER ,
4355 git : ! ! cliOptions . git ,
44- addOns : ! ! cliOptions . addOns ,
45- chosenAddOns : [ ] ,
56+ addOns,
57+ chosenAddOns,
4658 variableValues : { } ,
4759 }
4860 }
@@ -206,58 +218,66 @@ export async function promptForOptions(
206218 options . packageManager = cliOptions . packageManager
207219 }
208220
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+ } )
223244
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
227250 }
228- selectedAddOns = value
229- }
230251
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+ } )
244265
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
248271 }
249- selectedExamples = value
250- }
251272
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+ }
261281 }
262282
263283 // Collect variables
0 commit comments