11// Node
22import { dirname , join , resolve } from 'node:path'
33import { fileURLToPath } from 'node:url'
4- import { mkdirSync , rmSync , writeFileSync } from 'node:fs'
4+ import { mkdirSync , rmSync , writeFileSync , existsSync } from 'node:fs'
55
66// Types
77import type { ContextState } from './utils/prompts'
88import type { NuxtPresetName } from './utils/presets'
99
1010// Utils
1111import { initPrompts } from './utils/prompts'
12+ import { resolveNonInteractiveContext } from './utils/nonInteractivePrompts'
13+ import { parseCliArgs , cliOptionsToContext , getHelpText , getVersionText } from './utils/cli'
1214import { red } from 'kolorist'
1315import { createBanner } from './utils/banner'
14- import minimist from 'minimist'
1516import { installDependencies , renderTemplate } from './utils'
1617import { renderNuxtTemplate } from './utils/nuxt/renderNuxtTemplate'
1718
18- const validPresets = [ 'base' , 'custom' , 'default' , 'essentials' ]
19-
2019async function run ( ) {
21- const argv = minimist ( process . argv . slice ( 2 ) , {
22- alias : {
23- typescript : [ 'ts' ] ,
24- } ,
25- } )
20+ const args = process . argv . slice ( 2 ) . slice ( )
21+ const banner = createBanner ( )
2622
27- if ( argv . preset && ! validPresets . includes ( argv . preset ) ) {
28- throw new Error ( `'${ argv . preset } ' is not a valid preset. Valid presets are: ${ validPresets . join ( ', ' ) } .` )
23+ if ( args . length === 0 ) {
24+ console . log ( `\n${ banner } \n` )
25+
26+ const initialContext : ContextState = {
27+ canOverwrite : false ,
28+ cwd : process . cwd ( ) ,
29+ projectName : 'vuetify-project' ,
30+ }
31+
32+ const finalContext = await initPrompts ( initialContext )
33+
34+ await createProject ( finalContext )
35+ return
2936 }
3037
31- const banner = createBanner ( )
38+ const cliOptions = parseCliArgs ( args )
39+
40+ if ( cliOptions . help ) {
41+ console . log ( getHelpText ( ) )
42+ process . exit ( 0 )
43+ }
44+
45+ if ( cliOptions . version ) {
46+ console . log ( getVersionText ( ) )
47+ process . exit ( 0 )
48+ }
3249
3350 console . log ( `\n${ banner } \n` )
3451
35- const context : ContextState = {
36- canOverwrite : false ,
37- cwd : process . cwd ( ) ,
38- projectName : 'vuetify-project' ,
39- useRouter : false ,
40- useTypeScript : argv . typescript ,
41- usePreset : argv . preset ,
42- useStore : undefined ,
43- usePackageManager : undefined ,
52+ const cliContext = cliOptionsToContext ( cliOptions , process . cwd ( ) )
53+
54+ const initialContext : ContextState = {
55+ cwd : cliContext . cwd ! ,
56+ projectName : cliContext . projectName ,
57+ canOverwrite : cliContext . canOverwrite ,
58+ useTypeScript : cliContext . useTypeScript ,
59+ usePreset : cliContext . usePreset ,
60+ usePackageManager : cliContext . usePackageManager ,
61+ installDependencies : cliContext . installDependencies ,
62+ useNuxtModule : cliContext . useNuxtModule ,
63+ useNuxtSSR : cliContext . useNuxtSSR ,
64+ useNuxtSSRClientHints : cliContext . useNuxtSSRClientHints ,
4465 }
4566
67+ const finalContext = resolveNonInteractiveContext ( initialContext )
68+
69+ await createProject ( finalContext )
70+ }
71+
72+ async function createProject ( finalContext : any ) {
4673 const {
4774 canOverwrite,
4875 cwd,
@@ -54,16 +81,15 @@ async function run () {
5481 useNuxtModule,
5582 useNuxtSSR,
5683 useNuxtSSRClientHints,
57- } = await initPrompts ( context )
84+ } = finalContext
5885
5986 const projectRoot = join ( cwd , projectName )
6087
61- if ( canOverwrite ) {
62- // Clean dir
88+ if ( canOverwrite && existsSync ( projectRoot ) ) {
6389 rmSync ( projectRoot , { recursive : true } )
6490 }
6591
66- const preset = context . usePreset ?? usePreset
92+ const preset = finalContext . usePreset ?? usePreset
6793
6894 if ( preset . startsWith ( 'nuxt-' ) ) {
6995 const templateRoot = resolve ( dirname ( fileURLToPath ( import . meta. url ) ) , '../template/typescript' )
0 commit comments